autostacker24 1.0.22 → 1.0.23

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cdb4509f5f4de852d4a73842ca71a47c1760a611
4
- data.tar.gz: a1ddf79a2755d3d4317a8061f32dfce803485dfb
3
+ metadata.gz: 61080d80be23cf4281dce0607e034ea71639ba98
4
+ data.tar.gz: bd143c77bd1bbc32c7d487e87b095a7f67ab3bc2
5
5
  SHA512:
6
- metadata.gz: 083b9eda935b77896c93e73bc2623ac5397a2f5b1f50fc1d28aa9f9aa59d714fd3f3281d51e3334cb9f154608dcc7d996eb855e7b28f386db8a07ca6e505707b
7
- data.tar.gz: dffd875d8a1e7703df826b15cc901d7c1a52da97b4a189bf5dc143cf71f91eb62ee373f4af55d09b265052a2daad5ae32815c5884a40faa2e7d8b64aee84db4d
6
+ metadata.gz: 85d3a43d7cf983610b4206d07d7eea0d784cf443d2f76d7e88bd204b33694905275546751863eea7a95be98e72a6bce4b900eec4453114c112ae90c56d8a669a
7
+ data.tar.gz: d27c6861e9d0e2c74e32f56edd6e74288d71a85cdd2c1bef9786ee756e4b4ca64f1156b5e98ff23725d3d8d48e2c7510d0b08e722a25c3f5fa4644c3731d04a2
@@ -1,5 +1,5 @@
1
1
  require 'aws-sdk-core'
2
- require 'json'
2
+ require 'set'
3
3
 
4
4
  module Stacker
5
5
 
@@ -26,21 +26,21 @@ module Stacker
26
26
  end
27
27
 
28
28
  def create_stack(stack_name, template, parameters, parent_stack_name = nil)
29
- merge_output_parameters(parent_stack_name, template, parameters) if parent_stack_name
29
+ merge_and_validate(template, parameters, parent_stack_name)
30
30
  cloud_formation.create_stack(stack_name: stack_name,
31
31
  template_body: template_body(template),
32
32
  on_failure: 'DELETE',
33
- parameters: transform_parameters(parameters),
33
+ parameters: transform_input(parameters),
34
34
  capabilities: ['CAPABILITY_IAM'])
35
35
  wait_for_stack(stack_name, :create)
36
36
  end
37
37
 
38
38
  def update_stack(stack_name, template, parameters, parent_stack_name = nil)
39
- merge_output_parameters(parent_stack_name, template, parameters) if parent_stack_name
40
39
  begin
40
+ merge_and_validate(template, parameters, parent_stack_name)
41
41
  cloud_formation.update_stack(stack_name: stack_name,
42
42
  template_body: template_body(template),
43
- parameters: transform_parameters(parameters),
43
+ parameters: transform_input(parameters),
44
44
  capabilities: ['CAPABILITY_IAM'])
45
45
  rescue Aws::CloudFormation::Errors::ValidationError => error
46
46
  raise error unless error.message =~ /No updates are to be performed/i # may be flaky, do more research in API
@@ -50,13 +50,27 @@ module Stacker
50
50
  end
51
51
  end
52
52
 
53
- def merge_output_parameters(stack_name, template, parameters)
54
- expected_parameters = JSON(template_body(template))['Parameters']
55
- get_stack_outputs(stack_name).each do |k, v|
56
- parameters[k.to_sym] = v if expected_parameters.has_key?(k.to_s)
53
+ # if stack_name is given assign read the output parameters and copy them to the given template parameters
54
+ # if a aparameter is already defined, it will not be overwritten
55
+ # finally, if mandatory parameters are missing, an error will be raised
56
+ def merge_and_validate(template, parameters, stack_name)
57
+ valid = validate_template(template).parameters
58
+ if stack_name
59
+ present = valid.map{|p| p.parameter_key.to_sym}
60
+ get_stack_output(stack_name).each do |key, value|
61
+ parameters[key] ||= value if present.include?(key)
62
+ end
57
63
  end
64
+ mandatory = valid.select{|p| p.default_value.nil?}.map{|p| p.parameter_key.to_sym}
65
+ diff = mandatory.to_set - parameters.keys.to_set
66
+ raise "Missing one ore more mandatory parameters: #{diff.to_a.join(', ')}" if diff.length > 0
58
67
  parameters
59
68
  end
69
+ private :merge_and_validate
70
+
71
+ def validate_template(template)
72
+ cloud_formation.validate_template(template_body: template_body(template))
73
+ end
60
74
 
61
75
  def delete_stack(stack_name)
62
76
  cloud_formation.delete_stack(stack_name: stack_name)
@@ -75,11 +89,11 @@ module Stacker
75
89
  when :delete then /DELETE_COMPLETE$/
76
90
  end
77
91
  return true if status =~ expected_status
78
- fail "#{stack_name} failed, current status #{status}" if status =~ finished
92
+ raise "#{operation} #{stack_name} failed, current status #{status}" if status =~ finished
79
93
  puts "waiting for #{stack_name}, current status #{status}"
80
94
  sleep(7)
81
95
  end
82
- fail "waiting for stack timeout after #{timeout_in_minutes} minutes"
96
+ raise "waiting for stack timeout after #{timeout_in_minutes} minutes"
83
97
  end
84
98
 
85
99
  def find_stack(stack_name)
@@ -98,22 +112,27 @@ module Stacker
98
112
  end
99
113
 
100
114
  def estimate_template_cost(template, parameters)
101
- cloud_formation.estimate_template_cost(:template_body => template_body(template), :parameters => transform_parameters(parameters))
115
+ cloud_formation.estimate_template_cost(:template_body => template_body(template), :parameters => transform_input(parameters))
102
116
  end
103
117
 
104
118
  def get_stack_outputs(stack_name)
119
+ puts 'get_stack_outputs is obsolete, please use get_stack_output'
120
+ get_stack_output(stack_name)
121
+ end
122
+
123
+ def get_stack_output(stack_name)
105
124
  stack = find_stack(stack_name)
106
- fail "stack #{stack_name} not found" unless stack
107
- transform_outputs(stack.outputs).freeze
125
+ raise "stack #{stack_name} not found" unless stack
126
+ transform_output(stack.outputs).freeze
108
127
  end
109
128
 
110
- def transform_outputs(outputs)
111
- outputs.inject({}) { |m, o| m.merge(o.output_key.to_sym => o.output_value) }
129
+ def transform_output(output)
130
+ output.inject({}) { |m, o| m.merge(o.output_key.to_sym => o.output_value) }
112
131
  end
113
132
 
114
- def transform_parameters(parameters)
115
- parameters.each{|k,v| fail "#{k} must not be nil" if v.nil? }
116
- parameters.inject([]) { |m, kv| m << {parameter_key: kv[0].to_s, parameter_value: kv[1].to_s} }
133
+ def transform_input(input)
134
+ input.each{|k,v| raise "#{k} must not be nil" if v.nil? }
135
+ input.inject([]) { |m, kv| m << {parameter_key: kv[0].to_s, parameter_value: kv[1].to_s} }
117
136
  end
118
137
 
119
138
  def get_stack_resources(stack_name)
@@ -122,14 +141,13 @@ module Stacker
122
141
  end
123
142
 
124
143
  def cloud_formation # lazy CloudFormation client
125
- @lazy_cloud_formation ||= Aws::CloudFormation::Client.new(cloud_formation_parameters)
126
- end
127
-
128
- def cloud_formation_parameters
129
- params = {}
130
- params[:credentials] = @credentials if @credentials
131
- params[:region] = @region if @region
132
- params
144
+ unless @lazy_cloud_formation
145
+ params = {}
146
+ params[:credentials] = @credentials if @credentials
147
+ params[:region] = @region if @region
148
+ @lazy_cloud_formation = Aws::CloudFormation::Client.new(params)
149
+ end
150
+ @lazy_cloud_formation
133
151
  end
134
152
 
135
153
  def template_body(template)
@@ -140,15 +158,3 @@ module Stacker
140
158
  extend self
141
159
 
142
160
  end
143
-
144
- if $0 ==__FILE__ # placeholder for interactive testing
145
- template = <<-EOL
146
- bla bla //comment
147
- bla "//no comment"
148
- bla // still a "comment"
149
- bla "some string" // comment
150
- EOL
151
-
152
- puts Stacker.template_body(template)
153
-
154
- end
@@ -0,0 +1,21 @@
1
+ require 'openssl'
2
+ require_relative 'stacker.rb'
3
+
4
+ def template_body
5
+ template = <<-EOL
6
+ bla bla //comment
7
+ bla "//no comment"
8
+ bla // still a "comment"
9
+ bla "some string" // comment
10
+ EOL
11
+
12
+ puts Stacker.template_body(template)
13
+ end
14
+
15
+ if $0 ==__FILE__ # placeholder for interactive testing
16
+
17
+ OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE # Windows Hack
18
+
19
+ template_body
20
+
21
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autostacker24
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.22
4
+ version: 1.0.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Mueller
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-23 00:00:00.000000000 Z
12
+ date: 2015-01-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-core
@@ -25,20 +25,6 @@ dependencies:
25
25
  - - ~>
26
26
  - !ruby/object:Gem::Version
27
27
  version: '2'
28
- - !ruby/object:Gem::Dependency
29
- name: json
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - '>='
33
- - !ruby/object:Gem::Version
34
- version: '0'
35
- type: :runtime
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - '>='
40
- - !ruby/object:Gem::Version
41
- version: '0'
42
28
  description: n/a
43
29
  email:
44
30
  - jmueller@autoscout24.com
@@ -49,6 +35,7 @@ extra_rdoc_files: []
49
35
  files:
50
36
  - lib/autostacker24.rb
51
37
  - lib/autostacker24/stacker.rb
38
+ - lib/autostacker24/stacker_tests.rb
52
39
  homepage: https://github.com/AutoScout24/autostacker24
53
40
  licenses:
54
41
  - MIT