Class: Lono::Cfn::Preview

Inherits:
Base
  • Object
show all
Defined in:
lib/lono/cfn/preview.rb

Instance Method Summary collapse

Methods inherited from Base

#append_suffix, #build_scripts, #capabilities, #check_files, #check_for_errors, #command_with_iam, #convention_path, #exit_unless_updatable!, #generate_all, #generate_params, #generate_templates, #get_source_path, #initialize, #prompt_for_iam, #quit, #random_suffix, #remove_suffix, #s3_folder, #set_template_body!, #show_parameters, #stack_name_suffix, #stack_status, #starting_message, #status, #switch_current, #upload_files, #upload_scripts, #upload_templates

Methods included from Util

#are_you_sure?

Methods included from AwsService

#cfn, #stack_exists?, #testing_update?

Constructor Details

This class inherits a constructor from Lono::Cfn::Base

Instance Method Details

#change_set_nameObject

generates a change set name



99
100
101
# File 'lib/lono/cfn/preview.rb', line 99

def change_set_name
  @change_set_name ||= "changeset-#{Time.now.strftime("%Y%d%m%H%M%S")}"
end

#create_change_set(params) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/lono/cfn/preview.rb', line 18

def create_change_set(params)
  unless stack_exists?(@stack_name)
    puts "WARN: Cannot create a change set for the stack because the #{@stack_name} does not exists.".colorize(:yellow)
    return false
  end
  exit_unless_updatable!(stack_status(@stack_name))

  params = {
    change_set_name: change_set_name,
    stack_name: @stack_name,
    parameters: params,
    capabilities: capabilities, # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
  }
  set_template_body!(params)
  show_parameters(params, "cfn.create_change_set")
  begin
    cfn.create_change_set(params)
  rescue Aws::CloudFormation::Errors::ValidationError => e
    handle_error(e)
  end
  true
end

#delete_change_setObject



84
85
86
87
88
89
# File 'lib/lono/cfn/preview.rb', line 84

def delete_change_set
  cfn.delete_change_set(
    change_set_name: change_set_name,
    stack_name: @stack_name
  )
end

#display_change_setObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/lono/cfn/preview.rb', line 56

def display_change_set
  print "Generating CloudFormation Change Set for preview.."
  change_set = describe_change_set
  until change_set_finished?(change_set) do
    change_set = describe_change_set
    sleep 1
    print '.'
  end
  puts

  case change_set.status
  when "CREATE_COMPLETE"
    puts "CloudFormation preview for '#{@stack_name}' stack update. Changes:"
    changes = change_set.changes.sort_by do |change|
      change["resource_change"]["action"]
    end
    changes.each do |change|
      display_change(change)
    end
  when "FAILED"
    puts "Fail to create a CloudFormation preview for '#{@stack_name}' stack update. Reason:".colorize(:red)
    puts change_set.status_reason
    quit(1)
  else
    raise "hell: never come here"
  end
end

#execute_change_setObject



91
92
93
94
95
96
# File 'lib/lono/cfn/preview.rb', line 91

def execute_change_set
  cfn.execute_change_set(
    change_set_name: change_set_name,
    stack_name: @stack_name
  )
end

#handle_error(e) ⇒ Object

Example errors: “Template error: variable names in Fn::Sub syntax must contain only alphanumeric characters, underscores, periods, and colons”



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/lono/cfn/preview.rb', line 43

def handle_error(e)
  raise if ENV['FULL_BACKTRACE']

  if e.message =~ /^Parameters: / || e.message =~ /^Template error: /
    puts "Error creating CloudFormation preview because invalid CloudFormation parameters. Full error message:".colorize(:red)
    puts e.message
    puts "For full backtrace run command again with FULL_BACKTRACE=1"
    quit(1)
  else
    raise
  end
end

#preview_change_set(params) ⇒ Object



13
14
15
16
# File 'lib/lono/cfn/preview.rb', line 13

def preview_change_set(params)
  success = create_change_set(params)
  display_change_set if success
end

#runObject

Override run from Base superclass, the run method is different enough with Preview



3
4
5
6
7
8
9
10
11
# File 'lib/lono/cfn/preview.rb', line 3

def run
  if @options[:noop]
    puts "NOOP CloudFormation preview for #{@stack_name} update"
  else
    params = generate_all
    success = preview_change_set(params)
    delete_change_set if success && !@options[:keep] # Clean up and delete the change set
  end
end