class Ufo::Stack::Status
Attributes
events[R]
hide_time_took[W]
Public Class Methods
new(stack_name)
click to toggle source
# File lib/ufo/stack/status.rb, line 33 def initialize(stack_name) @stack_name = stack_name reset end
Public Instance Methods
completed()
click to toggle source
# File lib/ufo/stack/status.rb, line 73 def completed last_event_status =~ /(_COMPLETE|_FAILED)$/ && @events[0]["resource_type"] == "AWS::CloudFormation::Stack" end
event_time(timestamp)
click to toggle source
stackoverflow.com/questions/18000432/rails-12-hour-am-pm-range-for-a-day
# File lib/ufo/stack/status.rb, line 119 def event_time(timestamp) Time.parse(timestamp.to_s).localtime.strftime("%I:%M:%S%p") end
find_index(name)
click to toggle source
# File lib/ufo/stack/status.rb, line 135 def find_index(name) send("#{name}_index") end
find_update_failed_event()
click to toggle source
# File lib/ufo/stack/status.rb, line 161 def find_update_failed_event i = @events.find_index do |event| event["resource_type"] == "AWS::CloudFormation::Stack" && event["resource_status_reason"] == "User Initiated" end @events[0..i].reverse.find do |e| e["resource_status"] == "UPDATE_FAILED" end end
last_event_status()
click to toggle source
# File lib/ufo/stack/status.rb, line 78 def last_event_status @events[0]["resource_status"] end
last_shown_index()
click to toggle source
# File lib/ufo/stack/status.rb, line 146 def last_shown_index @events.find_index do |event| event["event_id"] == @last_shown_event_id end end
messages_map()
click to toggle source
# File lib/ufo/stack/status.rb, line 188 def messages_map { /CloudFormation cannot update a stack when a custom-named resource requires replacing/ => "A workaround is to run ufo again with STATIC_NAME=0 and to switch to dynamic names for resources. Then run ufo again with STATIC_NAME=1 to get back to statically name resources. Note, there are caveats with the workaround.", /cannot be associated with more than one load balancer/ => "There's was an issue updating the stack. Target groups can only be associated with one load balancer at a time. The workaround for this is to use UFO_FORCE_TARGET_GROUP=1 and run the command again. This will force the recreation of the target group resource.", /SetSubnets is not supported for load balancers of type/ => "Changing subnets for Network Load Balancers is currently not supported. You can try workarouding this with UFO_FORCE_ELB=1 and run the command again. This will force the recreation of the elb resource." } end
print_event(e)
click to toggle source
# File lib/ufo/stack/status.rb, line 106 def print_event(e) message = [ event_time(e["timestamp"]), e["resource_status"], e["resource_type"], e["logical_resource_id"], e["resource_status_reason"] ].join(" ") message = message.color(:red) if e["resource_status"] =~ /_FAILED/ puts message end
print_events(i)
click to toggle source
# File lib/ufo/stack/status.rb, line 98 def print_events(i) @events[0..i].reverse.each do |e| print_event(e) end @last_shown_event_id = @events[0]["event_id"] # puts "@last_shown_event_id #{@last_shown_event_id.inspect}" end
refresh_events()
click to toggle source
refreshes the loaded events in memory
# File lib/ufo/stack/status.rb, line 124 def refresh_events resp = cloudformation.describe_stack_events(stack_name: @stack_name) @events = resp["stack_events"] rescue Aws::CloudFormation::Errors::ValidationError => e if e.message =~ /Stack .* does not exis/ @stack_deletion_completed = true else raise end end
reset()
click to toggle source
# File lib/ufo/stack/status.rb, line 38 def reset @events = [] # constantly replaced with recent events @last_shown_event_id = nil @stack_deletion_completed = nil end
rollback_error_message()
click to toggle source
# File lib/ufo/stack/status.rb, line 172 def rollback_error_message return unless update_rollback? event = find_update_failed_event return unless event reason = event["resource_status_reason"] messages_map.each do |pattern, message| if reason =~ pattern return message end end reason # default message is original reason if not found in messages map end
show_events(final=false)
click to toggle source
Only shows new events
# File lib/ufo/stack/status.rb, line 83 def show_events(final=false) if @last_shown_event_id.nil? i = find_index(:start) print_events(i) else i = find_index(:last_shown) # puts "last_shown index #{i}" print_events(i-1) unless i == 0 end return if final sleep 5 unless ENV['TEST'] refresh_events end
start_index()
click to toggle source
# File lib/ufo/stack/status.rb, line 139 def start_index @events.find_index do |event| event["resource_type"] == "AWS::CloudFormation::Stack" && event["resource_status_reason"] == "User Initiated" end end
success?()
click to toggle source
# File lib/ufo/stack/status.rb, line 152 def success? resource_status = @events[0]["resource_status"] %w[CREATE_COMPLETE UPDATE_COMPLETE].include?(resource_status) end
update_rollback?()
click to toggle source
# File lib/ufo/stack/status.rb, line 157 def update_rollback? @events[0]["resource_status"] == "UPDATE_ROLLBACK_COMPLETE" end
wait()
click to toggle source
check for /(_COMPLETE|_FAILED)$/ status
# File lib/ufo/stack/status.rb, line 45 def wait start_time = Time.now refresh_events until completed || @stack_deletion_completed show_events end show_events(true) # show the final event if @stack_deletion_completed puts "Stack #{@stack_name} deleted." return end if last_event_status =~ /_FAILED/ puts "Stack failed: #{last_event_status}".color(:red) puts "Stack reason #{@events[0]["resource_status_reason"]}".color(:red) elsif last_event_status =~ /_ROLLBACK_/ puts "Stack rolled back: #{last_event_status}".color(:red) else # success puts "Stack success status: #{last_event_status}".color(:green) end return if @hide_time_took took = Time.now - start_time puts "Time took for stack deployment: #{pretty_time(took).color(:green)}." end