class StackMaster::ChangeSet

Constants

END_STATES

Public Class Methods

cf() click to toggle source
# File lib/stack_master/change_set.rb, line 36
def self.cf
  StackMaster.cloud_formation_driver
end
create(create_options) click to toggle source
# File lib/stack_master/change_set.rb, line 13
def self.create(create_options)
  cf = StackMaster.cloud_formation_driver
  change_set_name = generate_change_set_name(create_options.fetch(:stack_name))
  change_set_id = cf.create_change_set(create_options.merge(change_set_name: change_set_name)).id
  find(change_set_id)
end
delete(id) click to toggle source
# File lib/stack_master/change_set.rb, line 27
def self.delete(id)
  cf.delete_change_set(change_set_name: id)
end
execute(id, stack_name) click to toggle source
# File lib/stack_master/change_set.rb, line 31
def self.execute(id, stack_name)
  cf.execute_change_set(change_set_name: id,
                        stack_name: stack_name)
end
find(id) click to toggle source
# File lib/stack_master/change_set.rb, line 20
def self.find(id)
  begin
    response = PagedResponseAccumulator.call(cf, :describe_change_set, { change_set_name: id }, :changes)
  end while !END_STATES.include?(response.status)
  new(response)
end
generate_change_set_name(stack_name) click to toggle source
# File lib/stack_master/change_set.rb, line 9
def self.generate_change_set_name(stack_name)
  stack_name + '-StackMaster' + Time.now.strftime('%Y-%m-%d-%H%M-%s')
end
new(describe_change_set_response) click to toggle source
# File lib/stack_master/change_set.rb, line 40
def initialize(describe_change_set_response)
  @response = describe_change_set_response
end

Public Instance Methods

display(io) click to toggle source
# File lib/stack_master/change_set.rb, line 44
    def display(io)
      io.puts <<-EOL

========================================
Proposed change set:
EOL
      @response.changes.each do |change|
        display_resource_change(io, change.resource_change)
      end
io.puts "========================================"
    end
failed?() click to toggle source
# File lib/stack_master/change_set.rb, line 56
def failed?
  @response.status == 'FAILED'
end
id() click to toggle source
# File lib/stack_master/change_set.rb, line 64
def id
  @response.change_set_id
end
status_reason() click to toggle source
# File lib/stack_master/change_set.rb, line 60
def status_reason
  @response.status_reason
end

Private Instance Methods

action_color(action_name) click to toggle source
# File lib/stack_master/change_set.rb, line 98
def action_color(action_name)
  case action_name
  when 'Add'
    :green
  when 'Modify'
    :yellow
  when 'Remove', 'Replace'
    :red
  end
end
display_resource_change(io, resource_change) click to toggle source
# File lib/stack_master/change_set.rb, line 70
def display_resource_change(io, resource_change)
  action_name = if resource_change.replacement == 'True'
                  'Replace'
                else
                  resource_change.action
                end
  message = "#{action_name} #{resource_change.resource_type} #{resource_change.logical_resource_id}"
  color = action_color(action_name)
  io.puts Rainbow(message).color(color)
  resource_change.details.each do |detail|
    display_resource_change_detail(io, action_name, color, detail)
  end
end
display_resource_change_detail(io, action_name, color, detail) click to toggle source
# File lib/stack_master/change_set.rb, line 84
def display_resource_change_detail(io, action_name, color, detail)
  target_name = [detail.target.attribute, detail.target.name].compact.join('.')
  detail_messages = [target_name]
  if action_name == 'Replace'
    detail_messages << "#{detail.target.requires_recreation} requires recreation"
  end
  triggered_by = [detail.change_source, detail.causing_entity].compact.join('.')
  if detail.evaluation != 'Static'
    triggered_by << "(#{detail.evaluation})"
  end
  detail_messages << "Triggered by: #{triggered_by}"
  io.puts Rainbow("- #{detail_messages.join('. ')}. ").color(color)
end