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