knife-cloudformation 0.1.22 → 0.2.0
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 +7 -0
- data/CHANGELOG.md +6 -0
- data/README.md +56 -2
- data/knife-cloudformation.gemspec +4 -7
- data/lib/chef/knife/cloudformation_create.rb +105 -245
- data/lib/chef/knife/cloudformation_describe.rb +50 -26
- data/lib/chef/knife/cloudformation_destroy.rb +17 -18
- data/lib/chef/knife/cloudformation_events.rb +48 -14
- data/lib/chef/knife/cloudformation_export.rb +117 -34
- data/lib/chef/knife/cloudformation_import.rb +124 -18
- data/lib/chef/knife/cloudformation_inspect.rb +159 -71
- data/lib/chef/knife/cloudformation_list.rb +20 -24
- data/lib/chef/knife/cloudformation_promote.rb +40 -0
- data/lib/chef/knife/cloudformation_update.rb +132 -15
- data/lib/chef/knife/cloudformation_validate.rb +35 -0
- data/lib/knife-cloudformation.rb +28 -0
- data/lib/knife-cloudformation/cache.rb +213 -35
- data/lib/knife-cloudformation/knife.rb +9 -0
- data/lib/knife-cloudformation/knife/base.rb +179 -0
- data/lib/knife-cloudformation/knife/stack.rb +94 -0
- data/lib/knife-cloudformation/knife/template.rb +174 -0
- data/lib/knife-cloudformation/monkey_patch.rb +8 -0
- data/lib/knife-cloudformation/monkey_patch/stack.rb +195 -0
- data/lib/knife-cloudformation/provider.rb +225 -0
- data/lib/knife-cloudformation/utils.rb +18 -98
- data/lib/knife-cloudformation/utils/animal_strings.rb +28 -0
- data/lib/knife-cloudformation/utils/debug.rb +31 -0
- data/lib/knife-cloudformation/utils/json.rb +64 -0
- data/lib/knife-cloudformation/utils/object_storage.rb +28 -0
- data/lib/knife-cloudformation/utils/output.rb +79 -0
- data/lib/knife-cloudformation/utils/path_selector.rb +99 -0
- data/lib/knife-cloudformation/utils/ssher.rb +29 -0
- data/lib/knife-cloudformation/utils/stack_exporter.rb +271 -0
- data/lib/knife-cloudformation/utils/stack_parameter_scrubber.rb +35 -0
- data/lib/knife-cloudformation/utils/stack_parameter_validator.rb +124 -0
- data/lib/knife-cloudformation/version.rb +2 -4
- metadata +47 -94
- data/Gemfile +0 -3
- data/Gemfile.lock +0 -90
- data/knife-cloudformation-0.1.20.gem +0 -0
- data/lib/knife-cloudformation/aws_commons.rb +0 -267
- data/lib/knife-cloudformation/aws_commons/stack.rb +0 -435
- data/lib/knife-cloudformation/aws_commons/stack_parameter_validator.rb +0 -79
- data/lib/knife-cloudformation/cloudformation_base.rb +0 -168
- data/lib/knife-cloudformation/export.rb +0 -174
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5038817ca4a6fbe9658bbd9652b66281b02db80e
|
4
|
+
data.tar.gz: 4b4da29974e40d7077c56919fb83c7c66de27e6d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e67e6e3bcd675159997cf4627f429a8c492b49d1e9a6ef22bf6820abd51ec74850de2b2997b675cd7de130bb01a6db5ff150578a088172f9b3fe3b16e4ccc423
|
7
|
+
data.tar.gz: 146d85f4a0db3e29a20335a9383d7bc5cea11d42c39a5a87c92dcad2d9b9959cc16dfeccb842438c0f691981b642f74d6d5def6582d3e09d24c7bcffdb4a3417
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## v0.2.0
|
2
|
+
* This release should be considered "breaking"
|
3
|
+
* Underlying cloud API has been changed from fog to miasma
|
4
|
+
* The `inspect` command has been fully reworked to support `--attribute`
|
5
|
+
* Lots and lots of other changes. See commit log.
|
6
|
+
|
1
7
|
## v0.1.22
|
2
8
|
* Prevent full stack list loading in knife commands
|
3
9
|
* Default logger to INFO level and allow DEBUG level via `ENV['DEBUG']`
|
data/README.md
CHANGED
@@ -1,3 +1,57 @@
|
|
1
|
-
|
1
|
+
# Knife CloudFormation
|
2
2
|
|
3
|
-
|
3
|
+
A plugin for the knife command provided by Chef to
|
4
|
+
interact with AWS CloudFormation.
|
5
|
+
|
6
|
+
## Compatibility
|
7
|
+
|
8
|
+
This plugin now provides support for other cloud
|
9
|
+
orchestration APIs as well:
|
10
|
+
|
11
|
+
* OpenStack
|
12
|
+
* Rackspace
|
13
|
+
|
14
|
+
## Configuration
|
15
|
+
|
16
|
+
The easiest way to configure the plugin is via the
|
17
|
+
`knife.rb` file. Credentials are the only configuration
|
18
|
+
requirement, and the `Hash` provided is proxied to
|
19
|
+
Miasma:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# .chef/knife.rb
|
23
|
+
|
24
|
+
knife[:cloudformation][:credentials] = {
|
25
|
+
:aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'],
|
26
|
+
:aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'],
|
27
|
+
:aws_region => ENV['AWS_REGION']
|
28
|
+
}
|
29
|
+
```
|
30
|
+
|
31
|
+
If are using Rackspace:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# .chef/knife.rb
|
35
|
+
|
36
|
+
knife[:cloudformation][:credentials] = {
|
37
|
+
:rackspace_username => ENV['RACKSPACE_USERNAME'],
|
38
|
+
:rackspace_api_key => ENV['RACKSPACE_API_KEY'],
|
39
|
+
:rackspace_region => ENV['RACKSPACE_REGION']
|
40
|
+
}
|
41
|
+
```
|
42
|
+
|
43
|
+
## Commands
|
44
|
+
|
45
|
+
* `knife cloudformation list`
|
46
|
+
* `knife cloudformation create`
|
47
|
+
* `knife cloudformation update`
|
48
|
+
* `knife cloudformation destroy`
|
49
|
+
* `knife cloudformation events`
|
50
|
+
* `knife cloudformation describe`
|
51
|
+
* `knife cloudformation inspect`
|
52
|
+
* `knife cloudformation validate`
|
53
|
+
|
54
|
+
# Info
|
55
|
+
|
56
|
+
* Repository: https://github.com/heavywater/knife-cloudformation
|
57
|
+
* IRC: Freenode @ #heavywater
|
@@ -10,11 +10,8 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.description = 'Knife tooling for Cloud Formation'
|
11
11
|
s.require_path = 'lib'
|
12
12
|
s.add_dependency 'chef'
|
13
|
-
s.add_dependency '
|
14
|
-
s.add_dependency '
|
15
|
-
s.add_dependency '
|
16
|
-
s.
|
17
|
-
s.add_dependency 'redis-objects'
|
18
|
-
s.add_dependency 'attribute_struct', '~> 0.1.8'
|
19
|
-
s.files = Dir['**/*']
|
13
|
+
s.add_dependency 'miasma'
|
14
|
+
s.add_dependency 'net-ssh'
|
15
|
+
s.add_dependency 'sparkle_formation', '~> 0.2.0'
|
16
|
+
s.files = Dir['lib/**/*'] + %w(knife-cloudformation.gemspec README.md CHANGELOG.md)
|
20
17
|
end
|
@@ -1,152 +1,78 @@
|
|
1
1
|
require 'sparkle_formation'
|
2
2
|
require 'pathname'
|
3
|
-
require 'knife-cloudformation
|
3
|
+
require 'knife-cloudformation'
|
4
4
|
|
5
5
|
class Chef
|
6
6
|
class Knife
|
7
|
+
# Cloudformation create command
|
7
8
|
class CloudformationCreate < Knife
|
8
9
|
|
9
|
-
include KnifeCloudformation::
|
10
|
+
include KnifeCloudformation::Knife::Base
|
11
|
+
include KnifeCloudformation::Knife::Template
|
12
|
+
include KnifeCloudformation::Knife::Stack
|
10
13
|
|
11
14
|
banner 'knife cloudformation create NAME'
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
:proc => lambda {|val| Chef::Config[:knife][:cloudformation][:processing] = val }
|
63
|
-
)
|
64
|
-
option(:polling,
|
65
|
-
:long => '--[no-]poll',
|
66
|
-
:description => 'Enable stack event polling.',
|
67
|
-
:boolean => true,
|
68
|
-
:default => true,
|
69
|
-
:proc => lambda {|val| Chef::Config[:knife][:cloudformation][:poll] = val }
|
70
|
-
)
|
71
|
-
option(:notifications,
|
72
|
-
:long => '--notification ARN',
|
73
|
-
:description => 'Add notification ARN. Can be used multiple times.',
|
74
|
-
:proc => lambda {|val|
|
75
|
-
Chef::Config[:knife][:cloudformation][:options][:notification_ARNs] ||= []
|
76
|
-
Chef::Config[:knife][:cloudformation][:options][:notification_ARNs].push(val).uniq!
|
77
|
-
}
|
78
|
-
)
|
79
|
-
option(:file,
|
80
|
-
:short => '-f PATH',
|
81
|
-
:long => '--file PATH',
|
82
|
-
:description => 'Path to Cloud Formation to process',
|
83
|
-
:proc => lambda {|val|
|
84
|
-
Chef::Config[:knife][:cloudformation][:file] = val
|
85
|
-
}
|
86
|
-
)
|
87
|
-
option(:interactive_parameters,
|
88
|
-
:long => '--[no-]parameter-prompts',
|
89
|
-
:boolean => true,
|
90
|
-
:default => true,
|
91
|
-
:description => 'Do not prompt for input on dynamic parameters',
|
92
|
-
:default => true
|
93
|
-
)
|
94
|
-
option(:print_only,
|
95
|
-
:long => '--print-only',
|
96
|
-
:description => 'Print template and exit'
|
97
|
-
)
|
98
|
-
option(:base_directory,
|
99
|
-
:long => '--cloudformation-directory PATH',
|
100
|
-
:description => 'Path to cloudformation directory',
|
101
|
-
:proc => lambda {|val| Chef::Config[:knife][:cloudformation][:base_directory] = val}
|
102
|
-
)
|
103
|
-
option(:no_base_directory,
|
104
|
-
:long => '--no-cloudformation-directory',
|
105
|
-
:description => 'Unset any value used for cloudformation path',
|
106
|
-
:proc => lambda {|*val| Chef::Config[:knife][:cloudformation][:base_directory] = nil}
|
107
|
-
)
|
108
|
-
|
109
|
-
%w(rollback polling interactive_parameters).each do |key|
|
110
|
-
if(Chef::Config[:knife][:cloudformation][key].nil?)
|
111
|
-
Chef::Config[:knife][:cloudformation][key] = true
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
include Options
|
120
|
-
|
121
|
-
def run
|
122
|
-
@action_type = self.class.name.split('::').last.sub('Cloudformation', '').upcase
|
16
|
+
option(:timeout,
|
17
|
+
:short => '-t MIN',
|
18
|
+
:long => '--timeout MIN',
|
19
|
+
:description => 'Set timeout for stack creation',
|
20
|
+
:proc => lambda {|val|
|
21
|
+
Chef::Config[:knife][:cloudformation][:options][:timeout_in_minutes] = val
|
22
|
+
}
|
23
|
+
)
|
24
|
+
option(:rollback,
|
25
|
+
:short => '-R',
|
26
|
+
:long => '--[no]-rollback',
|
27
|
+
:description => 'Rollback on stack creation failure',
|
28
|
+
:boolean => true,
|
29
|
+
:default => true,
|
30
|
+
:proc => lambda {|val| Chef::Config[:knife][:cloudformation][:options][:disable_rollback] = !val }
|
31
|
+
)
|
32
|
+
option(:capability,
|
33
|
+
:short => '-C CAPABILITY',
|
34
|
+
:long => '--capability CAPABILITY',
|
35
|
+
:description => 'Specify allowed capabilities. Can be used multiple times.',
|
36
|
+
:proc => lambda {|val|
|
37
|
+
Chef::Config[:knife][:cloudformation][:options][:capabilities] ||= []
|
38
|
+
Chef::Config[:knife][:cloudformation][:options][:capabilities].push(val).uniq!
|
39
|
+
}
|
40
|
+
)
|
41
|
+
option(:notifications,
|
42
|
+
:long => '--notification ARN',
|
43
|
+
:description => 'Add notification ARN. Can be used multiple times.',
|
44
|
+
:proc => lambda {|val|
|
45
|
+
Chef::Config[:knife][:cloudformation][:options][:notification_ARNs] ||= []
|
46
|
+
Chef::Config[:knife][:cloudformation][:options][:notification_ARNs].push(val).uniq!
|
47
|
+
}
|
48
|
+
)
|
49
|
+
option(:print_only,
|
50
|
+
:long => '--print-only',
|
51
|
+
:description => 'Print template and exit'
|
52
|
+
)
|
53
|
+
option(:apply_stacks,
|
54
|
+
:long => '--apply-stack NAME_OR_ID',
|
55
|
+
:description => 'Autofill parameters using existing stack outputs. Can be used multiple times',
|
56
|
+
:proc => lambda {|val|
|
57
|
+
Chef::Config[:knife][:cloudformation][:create] ||= Mash.new
|
58
|
+
Chef::Config[:knife][:cloudformation][:create][:apply_stacks] ||= []
|
59
|
+
Chef::Config[:knife][:cloudformation][:create][:apply_stacks].push(val).uniq!
|
60
|
+
}
|
61
|
+
)
|
62
|
+
|
63
|
+
# Run the stack creation command
|
64
|
+
def _run
|
123
65
|
name = name_args.first
|
124
66
|
unless(name)
|
125
67
|
ui.fatal "Formation name must be specified!"
|
126
68
|
exit 1
|
127
69
|
end
|
128
|
-
|
129
|
-
unless(Chef::Config[:knife][:cloudformation][:template])
|
130
|
-
set_paths_and_discover_file!
|
131
|
-
unless(File.exists?(Chef::Config[:knife][:cloudformation][:file].to_s))
|
132
|
-
ui.fatal "Invalid formation file path provided: #{Chef::Config[:knife][:cloudformation][:file]}"
|
133
|
-
exit 1
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
70
|
if(Chef::Config[:knife][:cloudformation][:template])
|
138
71
|
file = Chef::Config[:knife][:cloudformation][:template]
|
139
|
-
elsif(Chef::Config[:knife][:cloudformation][:processing])
|
140
|
-
file = SparkleFormation.compile(Chef::Config[:knife][:cloudformation][:file])
|
141
72
|
else
|
142
|
-
file =
|
73
|
+
file = load_template_file
|
143
74
|
end
|
144
|
-
|
145
|
-
ui.warn 'Print only requested'
|
146
|
-
ui.info _format_json(file)
|
147
|
-
exit 1
|
148
|
-
end
|
149
|
-
ui.info "#{ui.color('Cloud Formation: ', :bold)} #{ui.color(action_type, :green)}"
|
75
|
+
ui.info "#{ui.color('Cloud Formation:', :bold)} #{ui.color('create', :green)}"
|
150
76
|
stack_info = "#{ui.color('Name:', :bold)} #{name}"
|
151
77
|
if(Chef::Config[:knife][:cloudformation][:path])
|
152
78
|
stack_info << " #{ui.color('Path:', :bold)} #{Chef::Config[:knife][:cloudformation][:file]}"
|
@@ -154,20 +80,46 @@ class Chef
|
|
154
80
|
stack_info << " #{ui.color('(not pre-processed)', :yellow)}"
|
155
81
|
end
|
156
82
|
end
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
83
|
+
|
84
|
+
unless(config[:print_only])
|
85
|
+
ui.info " -> #{stack_info}"
|
86
|
+
end
|
87
|
+
|
88
|
+
stack = provider.stacks.build(
|
89
|
+
Chef::Config[:knife][:cloudformation][:options].dup.merge(
|
90
|
+
:name => name,
|
91
|
+
:template => file
|
92
|
+
)
|
93
|
+
)
|
94
|
+
|
95
|
+
apply_stacks!(stack)
|
96
|
+
stack.template = KnifeCloudformation::Utils::StackParameterScrubber.scrub!(stack.template)
|
97
|
+
|
98
|
+
if(config[:print_only])
|
99
|
+
ui.info _format_json(translate_template(stack.template))
|
100
|
+
exit 0
|
101
|
+
end
|
102
|
+
|
103
|
+
populate_parameters!(stack.template)
|
104
|
+
stack.parameters = Chef::Config[:knife][:cloudformation][:options][:parameters]
|
105
|
+
|
106
|
+
stack.template = translate_template(stack.template)
|
107
|
+
stack.save
|
108
|
+
|
109
|
+
if(Chef::Config[:knife][:cloudformation][:poll])
|
110
|
+
provider.fetch_stacks
|
111
|
+
poll_stack(stack.name)
|
112
|
+
stack = provider.stacks.get(name)
|
113
|
+
|
114
|
+
if(stack.reload.success?)
|
115
|
+
ui.info "Stack create complete: #{ui.color('SUCCESS', :green)}"
|
116
|
+
provider.fetch_stacks
|
165
117
|
knife_output = Chef::Knife::CloudformationDescribe.new
|
166
118
|
knife_output.name_args.push(name)
|
167
119
|
knife_output.config[:outputs] = true
|
168
120
|
knife_output.run
|
169
121
|
else
|
170
|
-
ui.fatal "
|
122
|
+
ui.fatal "Create of new stack #{ui.color(name, :bold)}: #{ui.color('FAILED', :red, :bold)}"
|
171
123
|
ui.info ""
|
172
124
|
knife_inspect = Chef::Knife::CloudformationInspect.new
|
173
125
|
knife_inspect.name_args.push(name)
|
@@ -181,115 +133,23 @@ class Chef
|
|
181
133
|
end
|
182
134
|
end
|
183
135
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if(validation == true)
|
196
|
-
Chef::Config[:knife][:cloudformation][:options][:parameters][k] = answer
|
197
|
-
valid = true
|
198
|
-
else
|
199
|
-
validation.each do |validation_error|
|
200
|
-
ui.error validation_error.last
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
private
|
210
|
-
|
211
|
-
def set_paths_and_discover_file!
|
212
|
-
if(Chef::Config[:knife][:cloudformation][:base_directory])
|
213
|
-
SparkleFormation.components_path = File.join(
|
214
|
-
Chef::Config[:knife][:cloudformation][:base_directory], 'components'
|
215
|
-
)
|
216
|
-
SparkleFormation.dynamics_path = File.join(
|
217
|
-
Chef::Config[:knife][:cloudformation][:base_directory], 'dynamics'
|
218
|
-
)
|
219
|
-
end
|
220
|
-
unless(Chef::Config[:knife][:cloudformation][:file])
|
221
|
-
Chef::Config[:knife][:cloudformation][:file] = prompt_for_file(
|
222
|
-
Chef::Config[:knife][:cloudformation][:base_directory] || File.join(Dir.pwd, 'cloudformation')
|
223
|
-
)
|
224
|
-
else
|
225
|
-
unless(Pathname(Chef::Config[:knife][:cloudformation][:file]).absolute?)
|
226
|
-
Chef::Config[:knife][:cloudformation][:file] = File.join(
|
227
|
-
Chef::Config[:knife][:cloudformation][:base_directory] || File.join(Dir.pwd, 'cloudformation'),
|
228
|
-
Chef::Config[:knife][:cloudformation][:file]
|
229
|
-
)
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
|
-
def prompt_for_file(dir)
|
235
|
-
directory = Dir.new(dir)
|
236
|
-
directories = directory.map do |d|
|
237
|
-
if(!d.start_with?('.') && !%w(dynamics components).include?(d) && File.directory?(path = File.join(dir, d)))
|
238
|
-
path
|
239
|
-
end
|
240
|
-
end.compact.sort
|
241
|
-
files = directory.map do |f|
|
242
|
-
if(!f.start_with?('.') && File.file?(path = File.join(dir, f)))
|
243
|
-
path
|
244
|
-
end
|
245
|
-
end.compact.sort
|
246
|
-
if(directories.empty? && files.empty?)
|
247
|
-
ui.fatal 'No formation paths discoverable!'
|
248
|
-
else
|
249
|
-
output = ['Please select the formation to create']
|
250
|
-
output << '(or directory to list):' unless directories.empty?
|
251
|
-
ui.info output.join(' ')
|
252
|
-
output.clear
|
253
|
-
idx = 1
|
254
|
-
valid = {}
|
255
|
-
unless(directories.empty?)
|
256
|
-
output << ui.color('Directories:', :bold)
|
257
|
-
directories.each do |path|
|
258
|
-
valid[idx] = {:path => path, :type => :directory}
|
259
|
-
output << [idx, "#{File.basename(path).sub('.rb', '').split(/[-_]/).map(&:capitalize).join(' ')}"]
|
260
|
-
idx += 1
|
261
|
-
end
|
262
|
-
end
|
263
|
-
unless(files.empty?)
|
264
|
-
output << ui.color('Templates:', :bold)
|
265
|
-
files.each do |path|
|
266
|
-
valid[idx] = {:path => path, :type => :file}
|
267
|
-
output << [idx, "#{File.basename(path).sub('.rb', '').split(/[-_]/).map(&:capitalize).join(' ')}"]
|
268
|
-
idx += 1
|
269
|
-
end
|
270
|
-
end
|
271
|
-
max = idx.to_s.length
|
272
|
-
output.map! do |o|
|
273
|
-
if(o.is_a?(Array))
|
274
|
-
" #{o.first}.#{' ' * (max - o.first.to_s.length)} #{o.last}"
|
275
|
-
else
|
276
|
-
o
|
277
|
-
end
|
278
|
-
end
|
279
|
-
ui.info "#{output.join("\n")}\n"
|
280
|
-
response = ask_question('Enter selection: ').to_i
|
281
|
-
unless(valid[response])
|
282
|
-
ui.fatal 'How about using a real value'
|
283
|
-
exit 1
|
136
|
+
# Apply any defined remote stacks
|
137
|
+
#
|
138
|
+
# @param stack [Miasma::Models::Orchestration::Stack]
|
139
|
+
# @return [Miasma::Models::Orchestration::Stack]
|
140
|
+
def apply_stacks!(stack)
|
141
|
+
remote_stacks = Chef::Config[:knife][:cloudformation].
|
142
|
+
fetch(:create, {}).fetch(:apply_stacks, [])
|
143
|
+
remote_stacks.each do |stack_name|
|
144
|
+
remote_stack = provider.stacks.get(stack_name)
|
145
|
+
if(remote_stack)
|
146
|
+
stack.apply_stack(remote_stack)
|
284
147
|
else
|
285
|
-
|
286
|
-
|
287
|
-
prompt_for_file(entry[:path])
|
288
|
-
else
|
289
|
-
Chef::Config[:knife][:cloudformation][:file] = entry[:path]
|
290
|
-
end
|
148
|
+
ui.error "Failed to apply requested stack. Unable to locate. (#{stack_name})"
|
149
|
+
exit 1
|
291
150
|
end
|
292
151
|
end
|
152
|
+
stack
|
293
153
|
end
|
294
154
|
|
295
155
|
end
|