71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class StackSynchronizer
 | |
|   include PutsAndFlush
 | |
|   attr_reader :out, :stack
 | |
| 
 | |
|   def initialize(stack, out)
 | |
|     @stack, @out = stack, out
 | |
|     @printed_events = []
 | |
|   end
 | |
| 
 | |
|   def sync
 | |
|     puts_and_flush "Syncing stack '#{stack.id}'..."
 | |
| 
 | |
|     # 5 tries each 5 seconds, then 200 tries each 10 seconds
 | |
|     sleep_times = [5]*5 + [10]*400
 | |
| 
 | |
|     sleep_times.each do |sleep_time|
 | |
|       sleep sleep_time
 | |
|       stack.sync!
 | |
|       print_new_events
 | |
|       case stack.stack_status
 | |
|       when 'CREATE_IN_PROGRESS', 'ROLLBACK_IN_PROGRESS'
 | |
|       when 'CREATE_COMPLETE'
 | |
|         ::Devops::Db.connector.stack_update(stack)
 | |
|         puts_and_flush "Stack '#{stack.id}' status is now #{stack.stack_status}"
 | |
|         return 0
 | |
|       when 'ROLLBACK_COMPLETE'
 | |
|         puts_and_flush "Stack '#{stack.id}' status is rolled back"
 | |
|         return error_code(:stack_rolled_back)
 | |
|       else
 | |
|         puts_and_flush "Unknown stack status: '#{stack.stack_status}'"
 | |
|         return error_code(:unkown_status)
 | |
|       end
 | |
|     end
 | |
|     puts_and_flush "Stack hasn't been synced in #{sleep_times.inject(&:+)} seconds."
 | |
|     error_code(:timeout)
 | |
|   rescue StandardError => e
 | |
|     DevopsLogger.logger.error e.message
 | |
|     puts_and_flush "Error: #{e.message}\n#{e.backtrace.join("\n")}"
 | |
|     error_code(:error)
 | |
|   end
 | |
| 
 | |
|   def reason_from_error_code(code)
 | |
|     error_codes.key(code)
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def error_code(reason)
 | |
|     error_codes.fetch(reason)
 | |
|   end
 | |
| 
 | |
|   def error_codes
 | |
|     {
 | |
|       stack_rolled_back: 1,
 | |
|       unkown_status: 2,
 | |
|       timeout: 3,
 | |
|       error: 5
 | |
|     }
 | |
|   end
 | |
| 
 | |
| 
 | |
|   def print_new_events
 | |
|     stack.events.each do |event|
 | |
|       unless @printed_events.include?(event["event_id"])
 | |
|         @printed_events << event["event_id"]
 | |
|         out.puts "#{event["timestamp"]} - #{event["status"]}: #{event["reason"]}"
 | |
|       end
 | |
|     end
 | |
|     out.flush
 | |
|   end
 | |
| end | 
