autostacker24 1.0.22 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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