lib/bora/cfn/stack.rb in bora-1.4.1 vs lib/bora/cfn/stack.rb in bora-1.5.0

- old
+ new

@@ -1,9 +1,10 @@ require 'set' require 'open-uri' require 'aws-sdk' require 'bora/cfn/stack_status' +require 'bora/cfn/change_set' require 'bora/cfn/event' require 'bora/cfn/output' require 'bora/cfn/parameter' class Bora @@ -17,15 +18,15 @@ @region = region @processed_events = Set.new end def create(options, &block) - call_cfn_action(:create, options, &block) + call_cfn_action(:create_stack, options, &block) end def update(options, &block) - call_cfn_action(:update, options, &block) + call_cfn_action(:update_stack, options, &block) end def create_or_update(options, &block) exists? ? update(options, &block) : create(options, &block) end @@ -34,11 +35,11 @@ delete(&block) if exists? create(options, &block) if !exists? end def delete(&block) - call_cfn_action(:delete, &block) + call_cfn_action(:delete_stack, &block) end def events return if !exists? events = cloudformation.describe_stack_events({stack_name: underlying_stack.stack_id}).stack_events @@ -70,37 +71,63 @@ def exists? status.exists? end + def create_change_set(change_set_name, options) + change_set_options = { + stack_name: @stack_name, + change_set_name: change_set_name + } + cloudformation.create_change_set(change_set_options.merge(options)) + begin + change_set = ChangeSet.new(cloudformation.describe_change_set(change_set_options)) + sleep 5 unless change_set.status_complete? + end until change_set.status_complete? + change_set + end + def list_change_sets + cfn_change_sets = cloudformation.list_change_sets(stack_name: @stack_name) + cfn_change_sets.summaries.map { |cs| ChangeSet.new(cs, true) } + end + + def describe_change_set(change_set_name) + ChangeSet.new(cloudformation.describe_change_set(stack_name: @stack_name, change_set_name: change_set_name)) + end + + def delete_change_set(change_set_name) + cloudformation.delete_change_set(stack_name: @stack_name, change_set_name: change_set_name) + end + + def execute_change_set(change_set_name, &block) + call_cfn_action(:execute_change_set, {change_set_name: change_set_name}, &block) + end + + # ============================================================================================= private def cloudformation @cfn ||= begin @region ? Aws::CloudFormation::Client.new(region: @region) : Aws::CloudFormation::Client.new end end - def method_missing(sym, *args, &block) - underlying_stack ? underlying_stack.send(sym, *args, &block) : nil - end - def call_cfn_action(action, options = {}, &block) underlying_stack(refresh: true) - return true if action == :delete && !exists? + return true if action == :delete_stack && !exists? @previous_event_time = last_event_time begin action_options = {stack_name: @stack_name}.merge(options) - cloudformation.method("#{action.to_s.downcase}_stack").call(action_options) + cloudformation.method(action.to_s.downcase).call(action_options) wait_for_completion(&block) rescue Aws::CloudFormation::Errors::ValidationError => e raise e unless e.message.include?(NO_UPDATE_MESSAGE) return nil end - (action == :delete && !underlying_stack) || status.success? + (action == :delete_stack && !underlying_stack) || status.success? end def wait_for_completion begin events = unprocessed_events @@ -138,9 +165,11 @@ def last_event_time return Time.at(0) if !underlying_stack events = cloudformation.describe_stack_events({stack_name: @stack_name}).stack_events events.length > 0 ? events[0].timestamp : Time.at(0) end + end + end end