class CuffSert::UpdateStackAction

Public Instance Methods

as_observable() click to toggle source
# File lib/cuffsert/actions.rb, line 88
def as_observable
  cfargs = CuffSert.as_update_change_set(@meta, @stack)
  upload_uri, maybe_upload = upload_template_if_oversized(cfargs)
  cfargs[:template_url] = upload_uri if upload_uri
  maybe_upload
    .concat(prepare_update(cfargs))
    .flat_map(&method(:on_event))
end
validate!() click to toggle source
# File lib/cuffsert/actions.rb, line 80
def validate!
  if @meta.stack_uri.nil?
    if @meta.parameters.empty? && @meta.tags.empty?
      raise "Stack update without template needs at least one parameter (-p) or tag (-t)."
    end
  end
end

Private Instance Methods

on_changeset(change_set) click to toggle source
# File lib/cuffsert/actions.rb, line 132
def on_changeset(change_set)
  if change_set[:status] == 'FAILED'
    if change_set[:status_reason].include?('didn\'t contain changes')
      next_action = NoChanges.new.as_observable
    else
      message = "Update failed: #{change_set[:status_reason]}"
      next_action = Abort.new(message).as_observable
    end
    @cfclient.abort_update(change_set[:change_set_id])
      .concat(next_action)
  elsif @confirmation.call(@meta, :update, change_set)
    @cfclient.update_stack(change_set[:stack_id], change_set[:change_set_id])
      .concat(Done.new.as_observable)
  else
    @cfclient.abort_update(change_set[:change_set_id])
      .concat(Abort.new('User abort!').as_observable)
  end
end
on_event(event) click to toggle source
# File lib/cuffsert/actions.rb, line 118
def on_event(event)
  Rx::Observable.concat(
    Rx::Observable.just(event),
    Rx::Observable.defer do
      case event
      when CuffSert::ChangeSet
        on_changeset(event.message)
      else
        Rx::Observable.empty
      end
    end
  )
end
prepare_update(cfargs) click to toggle source
# File lib/cuffsert/actions.rb, line 99
def prepare_update(cfargs)
  @cfclient.get_template(@meta)
  .map do |current_template|
    pending_template = if cfargs[:template_body]
      YAML.load(cfargs[:template_body])
    elsif @meta.stack_uri && @meta.stack_uri.scheme == 'file'
      CuffSert.load_template(@meta.stack_uri)
    else
      current_template
    end
    CuffSert::Templates.new([current_template, pending_template])
  end.merge(
    @cfclient.prepare_update(cfargs)
    .map do |change_set|
      CuffSert::ChangeSet.new(change_set)
    end
  )
end