Class: Lono::Cfn::Preview

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

Instance Attribute Summary

Attributes inherited from Base

#randomize_stack_name

Instance Method Summary collapse

Methods inherited from Base

#build_scripts, #capabilities, #check_files, #check_for_errors, #command_with_iam, #convention_path, #derandomize, #exit_unless_updatable!, #generate_all, #generate_params, #generate_templates, #get_source_path, #initialize, #prompt_for_iam, #quit, #randomize, #randomize_stack_name?, #s3_folder, #show_parameters, #stack_status, #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



97
98
99
# File 'lib/lono/cfn/preview.rb', line 97

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
40
# 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))

  template_body = IO.read(@template_path)
  params = {
    change_set_name: change_set_name,
    stack_name: @stack_name,
    template_body: template_body,
    parameters: params,
    capabilities: capabilities, # ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"]
  }
  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



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

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

#display_change_setObject



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

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:"
    change_set.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



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

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”



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

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