class StackMaster::StackEvents::Streamer

Constants

StackFailed

Public Class Methods

new(stack_name, region, from: Time.now, break_on_finish_state: true, sleep_between_fetches: 1, io: nil, &block) click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 10
def initialize(stack_name, region, from: Time.now, break_on_finish_state: true, sleep_between_fetches: 1, io: nil, &block)
  @stack_name = stack_name
  @region = region
  @block = block
  @seen_events = Set.new
  @from = from
  @break_on_finish_state = break_on_finish_state
  @sleep_between_fetches = sleep_between_fetches
  @io = io
end
stream(stack_name, region, **args, &block) click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 6
def self.stream(stack_name, region, **args, &block)
  new(stack_name, region, **args, &block).stream
end

Public Instance Methods

stream() click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 21
def stream
  catch(:halt) do
    loop do
      events = Fetcher.fetch(@stack_name, @region, from: @from)
      unseen_events(events).each do |event|
        @block.call(event) if @block
        Presenter.print_event(@io, event) if @io
        if @break_on_finish_state && finish_state?(event)
          exit_with_error(event) if failure_state?(event)
          throw :halt
        end
      end
      sleep @sleep_between_fetches
    end
  end
rescue Interrupt
end

Private Instance Methods

exit_with_error(event) click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 63
def exit_with_error(event)
  raise StackFailed, "#{event.logical_resource_id} did not succeed (last state was #{event.resource_status})"
end
failure_state?(event) click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 57
def failure_state?(event)
  StackStates.failure_state?(event.resource_status) &&
    event.resource_type == 'AWS::CloudFormation::Stack' &&
    event.logical_resource_id == @stack_name
end
finish_state?(event) click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 51
def finish_state?(event)
  StackStates.finish_state?(event.resource_status) &&
    event.resource_type == 'AWS::CloudFormation::Stack' &&
    event.logical_resource_id == @stack_name
end
unseen_events(events) click to toggle source
# File lib/stack_master/stack_events/streamer.rb, line 41
def unseen_events(events)
  [].tap do |unseen_events|
    events.each do |event|
      next if @seen_events.include?(event.event_id)
      @seen_events << event.event_id
      unseen_events << event
    end
  end
end