Class: Stack

Inherits:
Object
  • Object
show all
Defined in:
lib/cloudformer/stack.rb

Constant Summary collapse

SUCESS_STATES =
["CREATE_COMPLETE", "UPDATE_COMPLETE"]
FAILURE_STATES =
["CREATE_FAILED", "DELETE_FAILED", "UPDATE_ROLLBACK_FAILED", "ROLLBACK_FAILED", "ROLLBACK_COMPLETE","ROLLBACK_FAILED","UPDATE_ROLLBACK_COMPLETE","UPDATE_ROLLBACK_FAILED"]
END_STATES =
SUCESS_STATES + FAILURE_STATES

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stack_name) ⇒ Stack

WAITING_STATES = [“CREATE_IN_PROGRESS”,“DELETE_IN_PROGRESS”,“ROLLBACK_IN_PROGRESS”,“UPDATE_COMPLETE_CLEANUP_IN_PROGRESS”,“UPDATE_IN_PROGRESS”,“UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS”,“UPDATE_ROLLBACK_IN_PROGRESS”]



11
12
13
14
15
16
# File 'lib/cloudformer/stack.rb', line 11

def initialize(stack_name)
  @name = stack_name
  @cf = AWS::CloudFormation.new
  @stack = @cf.stacks[name]
  @ec2 = AWS::EC2.new
end

Instance Attribute Details

#deployedObject

Returns the value of attribute deployed.



4
5
6
# File 'lib/cloudformer/stack.rb', line 4

def deployed
  @deployed
end

#nameObject

Returns the value of attribute name.



4
5
6
# File 'lib/cloudformer/stack.rb', line 4

def name
  @name
end

#stackObject

Returns the value of attribute stack.



4
5
6
# File 'lib/cloudformer/stack.rb', line 4

def stack
  @stack
end

Instance Method Details

#apply(template_file, parameters, disable_rollback = false, capabilities = [], notify = []) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/cloudformer/stack.rb', line 22

def apply(template_file, parameters, disable_rollback=false, capabilities=[], notify=[])
  if ( template_file =~ /^https:\/\/s3\S+\.amazonaws\.com\/(.*)/ )
    template = template_file
  else
    template = File.read(template_file)
  end
  validation = validate(template)
  unless validation["valid"]
    puts "Unable to update - #{validation["response"][:code]} - #{validation["response"][:message]}"
    return false
  end
  pending_operations = false
  begin
    if deployed
      pending_operations = update(template, parameters, capabilities)
    else
      pending_operations = create(template, parameters, disable_rollback, capabilities, notify)
    end
  rescue ::AWS::CloudFormation::Errors::ValidationError => e
    puts e.message
    return false
  end
  wait_until_end if pending_operations
  return deploy_succeded?
end

#deleteObject



62
63
64
65
66
67
68
69
# File 'lib/cloudformer/stack.rb', line 62

def delete
  with_highlight do
    puts "Attempting to delete stack - #{name}"
    stack.delete
    wait_until_end
    return deploy_succeded?
  end
end

#deploy_succeded?Boolean

Returns:

  • (Boolean)


48
49
50
51
52
# File 'lib/cloudformer/stack.rb', line 48

def deploy_succeded?
  return true unless FAILURE_STATES.include?(stack.status)
  puts "Unable to deploy template. Check log for more information."
  false
end

#events(options = {}) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
# File 'lib/cloudformer/stack.rb', line 81

def events(options = {})
  with_highlight do
    if !deployed
      puts "Stack not up."
      return
    end
    stack.events.sort_by {|a| a.timestamp}.each do |event|
      puts "#{event.timestamp} - #{event.physical_resource_id.to_s} - #{event.logical_resource_id} - #{event.resource_type} - #{event.resource_status} - #{event.resource_status_reason.to_s}"
    end
  end
end

#outputsObject



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/cloudformer/stack.rb', line 93

def outputs
  with_highlight do
  if !deployed
    puts "Stack not up."
    return 1
  end
    stack.outputs.each do |output|
      puts "#{output.key} - #{output.description} - #{output.value}"
    end
  end
  return 0
end

#start_instancesObject



58
59
60
# File 'lib/cloudformer/stack.rb', line 58

def start_instances
  update_instances("start")
end

#statusObject



71
72
73
74
75
76
77
78
79
# File 'lib/cloudformer/stack.rb', line 71

def status
  with_highlight do
    if deployed
      puts "#{stack.name} - #{stack.status} - #{stack.status_reason}"
    else
      puts "#{name} - Not Deployed"
    end
  end
end

#stop_instancesObject



54
55
56
# File 'lib/cloudformer/stack.rb', line 54

def stop_instances
 update_instances("stop")
end