Class: CfnVpn::Deployer

Inherits:
Object
  • Object
show all
Defined in:
lib/cfnvpn/deployer.rb

Instance Method Summary collapse

Constructor Details

#initialize(region, name) ⇒ Deployer

Returns a new instance of Deployer.



10
11
12
13
14
# File 'lib/cfnvpn/deployer.rb', line 10

def initialize(region,name)
  @name = name
  @stack_name = "#{@name}-cfnvpn"
  @client = Aws::CloudFormation::Client.new(region: region)
end

Instance Method Details

#create_change_set(template_body: nil, parameters: {}) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/cfnvpn/deployer.rb', line 32

def create_change_set(template_body: nil, parameters: {})
  change_set_name = "#{@stack_name}-#{CfnVpn::CHANGE_SET_VERSION}-#{Time.now.utc.strftime("%Y%m%d%H%M%S")}"
  change_set_type = get_change_set_type()

  if !template_body.nil?
    params = get_parameters_from_template(template_body)
  else
    params = get_parameters_from_stack()
  end
  
  params.each do |param|
    if !parameters[param[:parameter_key]].nil?
      param[:parameter_value] = parameters[param[:parameter_key]]
      param[:use_previous_value] = false
    end
  end

  changeset_args = {
    stack_name: @stack_name,
    parameters: params,
    tags: [
      {
        key: "cfnvpn:version",
        value: CfnVpn::VERSION,
      },
      {
        key: "cfnvpn:name",
        value: @name,
      }
    ],
    change_set_name: change_set_name,
    change_set_type: change_set_type,
    capabilities: ['CAPABILITY_IAM']
  }

  if !template_body.nil?
    changeset_args[:template_body] = template_body
  else
    changeset_args[:use_previous_template] = true
  end

  CfnVpn::Log.logger.debug "Creating changeset"
  change_set = @client.create_change_set(changeset_args)
  return change_set, change_set_type
end

#does_cf_stack_existObject

TODO: check for REVIEW_IN_PROGRESS



17
18
19
20
21
22
23
24
25
26
# File 'lib/cfnvpn/deployer.rb', line 17

def does_cf_stack_exist()
  begin
    resp = @client.describe_stacks({
      stack_name: @stack_name,
    })
  rescue Aws::CloudFormation::Errors::ValidationError
    return false
  end
  return resp.size > 0
end

#execute_change_set(change_set_id) ⇒ Object



95
96
97
98
99
100
# File 'lib/cfnvpn/deployer.rb', line 95

def execute_change_set(change_set_id)
  CfnVpn::Log.logger.debug "Executing the changeset"
  stack = @client.execute_change_set({
    change_set_name: change_set_id
  })
end

#get_change_set(change_set_id) ⇒ Object



89
90
91
92
93
# File 'lib/cfnvpn/deployer.rb', line 89

def get_change_set(change_set_id)
  @client.describe_change_set({
    change_set_name: change_set_id,
  })
end

#get_change_set_typeObject



28
29
30
# File 'lib/cfnvpn/deployer.rb', line 28

def get_change_set_type()
  return does_cf_stack_exist() ? 'UPDATE' : 'CREATE'
end

#get_outputs_from_stackObject



133
134
135
136
137
138
139
# File 'lib/cfnvpn/deployer.rb', line 133

def get_outputs_from_stack()
  resp = @client.describe_stacks({
    stack_name: @stack_name,
  })
  stack = resp.stacks.first
  return Hash[stack.outputs.collect {|output| [output.output_key.underscore.to_sym, output.output_value]}]
end

#get_parameter_value(parameter) ⇒ Object



118
119
120
121
122
123
# File 'lib/cfnvpn/deployer.rb', line 118

def get_parameter_value(parameter)
  resp = @client.describe_stacks({ stack_name: @stack_name })
  stack = resp.stacks.first
  parameter = stack.parameters.detect {|p| p.parameter_key == parameter}
  return parameter ? parameter.parameter_value : nil
end

#get_parameters_from_stackObject



108
109
110
111
# File 'lib/cfnvpn/deployer.rb', line 108

def get_parameters_from_stack()
  resp = @client.get_template_summary({ stack_name: @stack_name })
  return resp.parameters.collect { |p| { parameter_key: p.parameter_key, use_previous_value: true }  }
end

#get_parameters_from_stack_hashObject



125
126
127
128
129
130
131
# File 'lib/cfnvpn/deployer.rb', line 125

def get_parameters_from_stack_hash()
  resp = @client.describe_stacks({
    stack_name: @stack_name,
  })
  stack = resp.stacks.first
  return Hash[stack.parameters.collect {|parameter| [parameter.parameter_key.to_sym, parameter.parameter_value]}]
end

#get_parameters_from_template(template_body) ⇒ Object



113
114
115
116
# File 'lib/cfnvpn/deployer.rb', line 113

def get_parameters_from_template(template_body)
  resp = @client.get_template_summary({ template_body: template_body })
  return resp.parameters.collect { |p| { parameter_key: p.parameter_key, parameter_value: p.default_value }  }
end

#wait_for_changeset(change_set_id) ⇒ Object



78
79
80
81
82
83
84
85
86
87
# File 'lib/cfnvpn/deployer.rb', line 78

def wait_for_changeset(change_set_id)
  CfnVpn::Log.logger.debug "Waiting for changeset to be created"
  begin
    @client.wait_until :change_set_create_complete, change_set_name: change_set_id
  rescue Aws::Waiters::Errors::FailureStateError => e
    change_set = get_change_set(change_set_id)
    CfnVpn::Log.logger.error("change set status: #{change_set.status} reason: #{change_set.status_reason}")
    exit 1
  end
end

#wait_for_execute(change_set_type) ⇒ Object



102
103
104
105
106
# File 'lib/cfnvpn/deployer.rb', line 102

def wait_for_execute(change_set_type)
  waiter = change_set_type == 'CREATE' ? :stack_create_complete : :stack_update_complete
  CfnVpn::Log.logger.info "Waiting for changeset to #{change_set_type}"
  resp = @client.wait_until waiter, stack_name: @stack_name
end