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 +4 -4
- data/lib/autostacker24/stacker.rb +45 -39
- data/lib/autostacker24/stacker_tests.rb +21 -0
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61080d80be23cf4281dce0607e034ea71639ba98
|
4
|
+
data.tar.gz: bd143c77bd1bbc32c7d487e87b095a7f67ab3bc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85d3a43d7cf983610b4206d07d7eea0d784cf443d2f76d7e88bd204b33694905275546751863eea7a95be98e72a6bce4b900eec4453114c112ae90c56d8a669a
|
7
|
+
data.tar.gz: d27c6861e9d0e2c74e32f56edd6e74288d71a85cdd2c1bef9786ee756e4b4ca64f1156b5e98ff23725d3d8d48e2c7510d0b08e722a25c3f5fa4644c3731d04a2
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'aws-sdk-core'
|
2
|
-
require '
|
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
|
-
|
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:
|
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:
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
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
|
-
|
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 =>
|
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
|
-
|
107
|
-
|
125
|
+
raise "stack #{stack_name} not found" unless stack
|
126
|
+
transform_output(stack.outputs).freeze
|
108
127
|
end
|
109
128
|
|
110
|
-
def
|
111
|
-
|
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
|
115
|
-
|
116
|
-
|
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
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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.
|
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-
|
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
|