cfndk 0.1.0 → 0.1.1
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/.circleci/config.yml +23 -14
- data/.gitignore +0 -1
- data/.rspec_parallel +6 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +811 -0
- data/README.md +122 -10
- data/cfndk.gemspec +1 -0
- data/lib/cfndk/change_set_command.rb +97 -0
- data/lib/cfndk/command.rb +15 -181
- data/lib/cfndk/config_file_loadable.rb +13 -0
- data/lib/cfndk/global_config.rb +15 -0
- data/lib/cfndk/key_pair.rb +7 -4
- data/lib/cfndk/key_pair_command.rb +53 -0
- data/lib/cfndk/key_pairs.rb +2 -1
- data/lib/cfndk/logger.rb +1 -1
- data/lib/cfndk/stack.rb +382 -103
- data/lib/cfndk/stack_command.rb +110 -0
- data/lib/cfndk/stacks.rb +40 -14
- data/lib/cfndk/subcommand_help_returnable.rb +16 -0
- data/lib/cfndk/version.rb +1 -1
- data/lib/cfndk.rb +6 -0
- data/skel/cfndk.yml +4 -0
- data/spec/cfndk_change_set_create_spec.rb +436 -0
- data/spec/cfndk_change_set_destroy_spec.rb +160 -0
- data/spec/cfndk_change_set_execute_spec.rb +179 -0
- data/spec/cfndk_change_set_report_spec.rb +107 -0
- data/spec/cfndk_change_set_spec.rb +37 -0
- data/spec/cfndk_create_spec.rb +56 -141
- data/spec/cfndk_destroy_spec.rb +4 -2
- data/spec/cfndk_keypiar_spec.rb +11 -9
- data/spec/cfndk_report_spec.rb +3 -1
- data/spec/cfndk_spec.rb +5 -3
- data/spec/cfndk_stack_create_spec.rb +454 -0
- data/spec/cfndk_stack_destroy_spec.rb +161 -0
- data/spec/cfndk_stack_report_spec.rb +181 -0
- data/spec/cfndk_stack_spec.rb +6 -1146
- data/spec/cfndk_stack_update_spec.rb +467 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/support/aruba.rb +1 -0
- metadata +42 -2
@@ -0,0 +1,454 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'CFnDK', type: :aruba do
|
4
|
+
before(:each) { set_environment_variable('AWS_REGION', ENV['AWS_REGION']) }
|
5
|
+
before(:each) { set_environment_variable('AWS_PROFILE', ENV['AWS_PROFILE']) }
|
6
|
+
before(:each) { set_environment_variable('AWS_ACCESS_KEY_ID', ENV["AWS_ACCESS_KEY_ID#{ENV['TEST_ENV_NUMBER']}"]) }
|
7
|
+
before(:each) { set_environment_variable('AWS_SECRET_ACCESS_KEY', ENV["AWS_SECRET_ACCESS_KEY#{ENV['TEST_ENV_NUMBER']}"]) }
|
8
|
+
describe 'bin/cfndk' do
|
9
|
+
before(:each) { setup_aruba }
|
10
|
+
let(:file) { 'cfndk.yml' }
|
11
|
+
let(:file2) { 'cfndk2.yml' }
|
12
|
+
let(:pem) { 'test.pem' }
|
13
|
+
let(:uuid) { '38437346-c75c-47c5-83b4-d504f85e275b' }
|
14
|
+
|
15
|
+
describe 'stack' do
|
16
|
+
describe 'create', create: true do
|
17
|
+
context 'without cfndk.yml' do
|
18
|
+
before(:each) { run_command('cfndk stack create') }
|
19
|
+
it 'displays file does not exist error and status code = 1' do
|
20
|
+
aggregate_failures do
|
21
|
+
expect(last_command_started).to have_exit_status(1)
|
22
|
+
expect(last_command_started).to have_output(/ERROR RuntimeError: File does not exist./)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with cfndk2.yml' do
|
28
|
+
yaml = <<-"YAML"
|
29
|
+
keypairs:
|
30
|
+
YAML
|
31
|
+
before(:each) { write_file(file2, yaml) }
|
32
|
+
context 'when -c cfndk2.yml and empty stacks' do
|
33
|
+
before(:each) { run_command("cfndk stack create -c=#{file2}") }
|
34
|
+
it 'displays empty stack log' do
|
35
|
+
aggregate_failures do
|
36
|
+
expect(last_command_started).to be_successfully_executed
|
37
|
+
expect(last_command_started).to have_output(/INFO create.../)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when --config-path cfndk2.yml and empty stacks' do
|
43
|
+
before(:each) { run_command("cfndk stack create --config-path=#{file2}") }
|
44
|
+
it 'displays empty stack log' do
|
45
|
+
aggregate_failures do
|
46
|
+
expect(last_command_started).to be_successfully_executed
|
47
|
+
expect(last_command_started).to have_output(/INFO create.../)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with cfndk.yml' do
|
54
|
+
context 'when cfndk.yml is empty' do
|
55
|
+
before(:each) { touch(file) }
|
56
|
+
before(:each) { run_command('cfndk stack create') }
|
57
|
+
it 'displays File is empty error and status code = 1' do
|
58
|
+
aggregate_failures do
|
59
|
+
expect(last_command_started).to have_exit_status(1)
|
60
|
+
expect(last_command_started).to have_output(/ERROR File is empty./)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with stacks:' do
|
66
|
+
context 'without stack' do
|
67
|
+
before(:each) { write_file(file, 'stacks:') }
|
68
|
+
before(:each) { run_command('cfndk stack create') }
|
69
|
+
it do
|
70
|
+
aggregate_failures do
|
71
|
+
expect(last_command_started).to be_successfully_executed
|
72
|
+
expect(last_command_started).to have_output(/INFO create.../)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with a stack' do
|
78
|
+
yaml = <<-"YAML"
|
79
|
+
global:
|
80
|
+
stacks:
|
81
|
+
Test:
|
82
|
+
template_file: vpc.yaml
|
83
|
+
parameter_input: vpc.json
|
84
|
+
timeout_in_minutes: 2
|
85
|
+
YAML
|
86
|
+
before(:each) { write_file(file, yaml) }
|
87
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
88
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
89
|
+
before(:each) { run_command('cfndk stack create') }
|
90
|
+
it do
|
91
|
+
aggregate_failures do
|
92
|
+
expect(last_command_started).to be_successfully_executed
|
93
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test$/)
|
94
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test$/)
|
95
|
+
expect(last_command_started).to have_output(/INFO created stack: Test$/)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
after(:each) { run_command('cfndk destroy -f') }
|
99
|
+
end
|
100
|
+
context 'with a 51200byte template stack' do
|
101
|
+
yaml = <<-"YAML"
|
102
|
+
global:
|
103
|
+
stacks:
|
104
|
+
Test:
|
105
|
+
template_file: vpc.yaml
|
106
|
+
parameter_input: vpc.json
|
107
|
+
timeout_in_minutes: 2
|
108
|
+
YAML
|
109
|
+
before(:each) { write_file(file, yaml) }
|
110
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
111
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
112
|
+
before(:each) { append_to_file('vpc.yaml', ' ' * (51200 - file_size('vpc.yaml').to_i)) }
|
113
|
+
before(:each) { run_command('cfndk stack create') }
|
114
|
+
it 'displays created stack log' do
|
115
|
+
aggregate_failures do
|
116
|
+
expect(last_command_started).to be_successfully_executed
|
117
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test$/)
|
118
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test$/)
|
119
|
+
expect(last_command_started).to have_output(/INFO created stack: Test$/)
|
120
|
+
expect(last_command_started).not_to have_output(%r{INFO Put S3 object: https://s3.amazonaws.com/[0-9]+-ap-northeast-1-cfndk-templates})
|
121
|
+
end
|
122
|
+
end
|
123
|
+
after(:each) { run_command('cfndk destroy -f') }
|
124
|
+
end
|
125
|
+
context 'with a 51201byte template stack', big: true do
|
126
|
+
yaml = <<-"YAML"
|
127
|
+
global:
|
128
|
+
stacks:
|
129
|
+
Test:
|
130
|
+
template_file: vpc.yaml
|
131
|
+
parameter_input: vpc.json
|
132
|
+
timeout_in_minutes: 2
|
133
|
+
YAML
|
134
|
+
before(:each) { write_file(file, yaml) }
|
135
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
136
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
137
|
+
before(:each) { append_to_file('vpc.yaml', ' ' * (51200 + 1 - file_size('vpc.yaml').to_i)) }
|
138
|
+
before(:each) { run_command('cfndk stack create') }
|
139
|
+
it 'displays created stack log' do
|
140
|
+
aggregate_failures do
|
141
|
+
expect(last_command_started).to be_successfully_executed
|
142
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test$/)
|
143
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test$/)
|
144
|
+
expect(last_command_started).to have_output(/INFO created stack: Test$/)
|
145
|
+
expect(last_command_started).to have_output(%r{INFO Put S3 object: https://s3.amazonaws.com/[0-9]+-ap-northeast-1-cfndk-templates})
|
146
|
+
end
|
147
|
+
end
|
148
|
+
after(:each) { run_command('cfndk destroy -f') }
|
149
|
+
end
|
150
|
+
context 'with two stacks' do
|
151
|
+
yaml = <<-"YAML"
|
152
|
+
stacks:
|
153
|
+
Test:
|
154
|
+
template_file: vpc.yaml
|
155
|
+
parameter_input: vpc.json
|
156
|
+
timeout_in_minutes: 2
|
157
|
+
Test2:
|
158
|
+
template_file: sg.yaml
|
159
|
+
parameter_input: sg.json
|
160
|
+
depends:
|
161
|
+
- Test
|
162
|
+
YAML
|
163
|
+
|
164
|
+
before(:each) { write_file(file, yaml) }
|
165
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
166
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
167
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
168
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
169
|
+
before(:each) { run_command('cfndk stack create') }
|
170
|
+
it do
|
171
|
+
aggregate_failures do
|
172
|
+
expect(last_command_started).to be_successfully_executed
|
173
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test$/)
|
174
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test$/)
|
175
|
+
expect(last_command_started).to have_output(/INFO created stack: Test$/)
|
176
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test2$/)
|
177
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test2$/)
|
178
|
+
expect(last_command_started).to have_output(/INFO created stack: Test2$/)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
after(:each) { run_command('cfndk destroy -f') }
|
182
|
+
end
|
183
|
+
context 'when invalid dependency', dependency: true do
|
184
|
+
yaml = <<-"YAML"
|
185
|
+
stacks:
|
186
|
+
Test:
|
187
|
+
template_file: vpc.yaml
|
188
|
+
parameter_input: vpc.json
|
189
|
+
timeout_in_minutes: 2
|
190
|
+
depends:
|
191
|
+
- Test2
|
192
|
+
Test2:
|
193
|
+
template_file: sg.yaml
|
194
|
+
parameter_input: sg.json
|
195
|
+
YAML
|
196
|
+
|
197
|
+
before(:each) { write_file(file, yaml) }
|
198
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
199
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
200
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
201
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
202
|
+
before(:each) { run_command('cfndk stack create') }
|
203
|
+
it do
|
204
|
+
aggregate_failures do
|
205
|
+
expect(last_command_started).to have_exit_status(1)
|
206
|
+
expect(last_command_started).to have_output(/ERROR Aws::Waiters::Errors::FailureStateError: stopped waiting, encountered a failure state$/)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
after(:each) { run_command('cfndk destroy -f') }
|
210
|
+
end
|
211
|
+
context 'when cyclic dependency', dependency: true do
|
212
|
+
yaml = <<-"YAML"
|
213
|
+
stacks:
|
214
|
+
Test:
|
215
|
+
template_file: vpc.yaml
|
216
|
+
parameter_input: vpc.json
|
217
|
+
timeout_in_minutes: 2
|
218
|
+
depends:
|
219
|
+
- Test2
|
220
|
+
Test2:
|
221
|
+
template_file: sg.yaml
|
222
|
+
parameter_input: sg.json
|
223
|
+
depends:
|
224
|
+
- Test
|
225
|
+
YAML
|
226
|
+
|
227
|
+
before(:each) { write_file(file, yaml) }
|
228
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
229
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
230
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
231
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
232
|
+
before(:each) { run_command('cfndk stack create') }
|
233
|
+
it do
|
234
|
+
aggregate_failures do
|
235
|
+
expect(last_command_started).to have_exit_status(1)
|
236
|
+
expect(last_command_started).to have_output(/ERROR RuntimeError: There are cyclic dependency or stack doesn't exist. unprocessed_stack: Test,Test2$/)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
after(:each) { run_command('cfndk destroy -f') }
|
240
|
+
end
|
241
|
+
context 'when requires capabilities without capabilities', capabilities: true do
|
242
|
+
yaml = <<-"YAML"
|
243
|
+
stacks:
|
244
|
+
Test:
|
245
|
+
template_file: iam.yaml
|
246
|
+
parameter_input: iam.json
|
247
|
+
timeout_in_minutes: 2
|
248
|
+
YAML
|
249
|
+
|
250
|
+
before(:each) { write_file(file, yaml) }
|
251
|
+
before(:each) { copy('%/iam.yaml', 'iam.yaml') }
|
252
|
+
before(:each) { copy('%/iam.json', 'iam.json') }
|
253
|
+
before(:each) { run_command('cfndk stack create') }
|
254
|
+
it do
|
255
|
+
aggregate_failures do
|
256
|
+
expect(last_command_started).to have_exit_status(1)
|
257
|
+
expect(last_command_started).to have_output(/ERROR Aws::CloudFormation::Errors::InsufficientCapabilitiesException: Requires capabilities : \[CAPABILITY_NAMED_IAM\]/)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
after(:each) { run_command('cfndk destroy -f') }
|
261
|
+
end
|
262
|
+
context 'when success with capabilities', capabilities: true do
|
263
|
+
yaml = <<-"YAML"
|
264
|
+
stacks:
|
265
|
+
Test:
|
266
|
+
template_file: iam.yaml
|
267
|
+
parameter_input: iam.json
|
268
|
+
capabilities:
|
269
|
+
- CAPABILITY_NAMED_IAM
|
270
|
+
timeout_in_minutes: 3
|
271
|
+
YAML
|
272
|
+
|
273
|
+
before(:each) { write_file(file, yaml) }
|
274
|
+
before(:each) { copy('%/iam.yaml', 'iam.yaml') }
|
275
|
+
before(:each) { copy('%/iam.json', 'iam.json') }
|
276
|
+
before(:each) { run_command('cfndk stack create') }
|
277
|
+
it do
|
278
|
+
aggregate_failures do
|
279
|
+
expect(last_command_started).to be_successfully_executed
|
280
|
+
expect(last_command_started).to have_output(/INFO created stack: Test$/)
|
281
|
+
end
|
282
|
+
end
|
283
|
+
after(:each) { run_command('cfndk destroy -f') }
|
284
|
+
end
|
285
|
+
context 'with UUID', uuid: true do
|
286
|
+
context 'when -u 38437346-c75c-47c5-83b4-d504f85e275b' do
|
287
|
+
yaml = <<-"YAML"
|
288
|
+
stacks:
|
289
|
+
Test:
|
290
|
+
template_file: vpc.yaml
|
291
|
+
parameter_input: vpc.json
|
292
|
+
parameters:
|
293
|
+
VpcName: sample<%= append_uuid%>
|
294
|
+
timeout_in_minutes: 2
|
295
|
+
Test2:
|
296
|
+
template_file: sg.yaml
|
297
|
+
parameter_input: sg.json
|
298
|
+
parameters:
|
299
|
+
VpcName: sample<%= append_uuid%>
|
300
|
+
depends:
|
301
|
+
- Test
|
302
|
+
YAML
|
303
|
+
before(:each) { write_file(file, yaml) }
|
304
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
305
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
306
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
307
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
308
|
+
before(:each) { run_command("cfndk stack create -u=#{uuid}") }
|
309
|
+
it do
|
310
|
+
aggregate_failures do
|
311
|
+
expect(last_command_started).to be_successfully_executed
|
312
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test-#{uuid}$/)
|
313
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test-#{uuid}$/)
|
314
|
+
expect(last_command_started).to have_output(/INFO created stack: Test-#{uuid}$/)
|
315
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test2-#{uuid}$/)
|
316
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test2-#{uuid}$/)
|
317
|
+
expect(last_command_started).to have_output(/INFO created stack: Test2-#{uuid}$/)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
after(:each) { run_command("cfndk destroy -f -u=#{uuid}") }
|
321
|
+
end
|
322
|
+
context 'when env CFNDK_UUID=38437346-c75c-47c5-83b4-d504f85e275b' do
|
323
|
+
before(:each) { set_environment_variable('CFNDK_UUID', uuid) }
|
324
|
+
context 'with two stacks' do
|
325
|
+
yaml = <<-"YAML"
|
326
|
+
stacks:
|
327
|
+
Test:
|
328
|
+
template_file: vpc.yaml
|
329
|
+
parameter_input: vpc.json
|
330
|
+
parameters:
|
331
|
+
VpcName: sample<%= append_uuid%>
|
332
|
+
timeout_in_minutes: 2
|
333
|
+
Test2:
|
334
|
+
template_file: sg.yaml
|
335
|
+
parameter_input: sg.json
|
336
|
+
parameters:
|
337
|
+
VpcName: sample<%= append_uuid%>
|
338
|
+
depends:
|
339
|
+
- Test
|
340
|
+
YAML
|
341
|
+
before(:each) { write_file(file, yaml) }
|
342
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
343
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
344
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
345
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
346
|
+
before(:each) { run_command('cfndk stack create') }
|
347
|
+
it do
|
348
|
+
aggregate_failures do
|
349
|
+
expect(last_command_started).to be_successfully_executed
|
350
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test-#{uuid}$/)
|
351
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test-#{uuid}$/)
|
352
|
+
expect(last_command_started).to have_output(/INFO created stack: Test-#{uuid}$/)
|
353
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test2-#{uuid}$/)
|
354
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test2-#{uuid}$/)
|
355
|
+
expect(last_command_started).to have_output(/INFO created stack: Test2-#{uuid}$/)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
after(:each) { run_command('cfndk destroy -f') }
|
359
|
+
end
|
360
|
+
context 'when --stack-names=Test' do
|
361
|
+
yaml = <<-"YAML"
|
362
|
+
stacks:
|
363
|
+
Test:
|
364
|
+
template_file: vpc.yaml
|
365
|
+
parameter_input: vpc.json
|
366
|
+
parameters:
|
367
|
+
VpcName: sample<%= append_uuid%>
|
368
|
+
timeout_in_minutes: 2
|
369
|
+
Test2:
|
370
|
+
template_file: sg.yaml
|
371
|
+
parameter_input: sg.json
|
372
|
+
parameters:
|
373
|
+
VpcName: sample<%= append_uuid%>
|
374
|
+
depends:
|
375
|
+
- Test
|
376
|
+
YAML
|
377
|
+
before(:each) { write_file(file, yaml) }
|
378
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
379
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
380
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
381
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
382
|
+
before(:each) { run_command('cfndk stack create --stack-names=Test') }
|
383
|
+
it do
|
384
|
+
aggregate_failures do
|
385
|
+
expect(last_command_started).to be_successfully_executed
|
386
|
+
expect(last_command_started).to have_output(/INFO create.../)
|
387
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test-#{uuid}$/)
|
388
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test-#{uuid}$/)
|
389
|
+
expect(last_command_started).to have_output(/INFO created stack: Test-#{uuid}$/)
|
390
|
+
expect(last_command_started).not_to have_output(/INFO validate stack: Test2-#{uuid}$/)
|
391
|
+
expect(last_command_started).not_to have_output(/INFO creating stack: Test2-#{uuid}$/)
|
392
|
+
expect(last_command_started).not_to have_output(/INFO created stack: Test2-#{uuid}$/)
|
393
|
+
end
|
394
|
+
end
|
395
|
+
after(:each) { run_command('cfndk destroy -f') }
|
396
|
+
end
|
397
|
+
context 'when --stack-names=Test Test2' do
|
398
|
+
yaml = <<-"YAML"
|
399
|
+
stacks:
|
400
|
+
Test:
|
401
|
+
template_file: vpc.yaml
|
402
|
+
parameter_input: vpc.json
|
403
|
+
parameters:
|
404
|
+
VpcName: sample<%= append_uuid%>
|
405
|
+
timeout_in_minutes: 2
|
406
|
+
Test2:
|
407
|
+
template_file: sg.yaml
|
408
|
+
parameter_input: sg.json
|
409
|
+
parameters:
|
410
|
+
VpcName: sample<%= append_uuid%>
|
411
|
+
depends:
|
412
|
+
- Test
|
413
|
+
Test3:
|
414
|
+
template_file: iam.yaml
|
415
|
+
parameter_input: iam.json
|
416
|
+
parameters:
|
417
|
+
WebRoleName: WebhRole<%= append_uuid%>
|
418
|
+
capabilities:
|
419
|
+
- CAPABILITY_NAMED_IAM
|
420
|
+
timeout_in_minutes: 3
|
421
|
+
YAML
|
422
|
+
before(:each) { write_file(file, yaml) }
|
423
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
424
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
425
|
+
before(:each) { copy('%/sg.yaml', 'sg.yaml') }
|
426
|
+
before(:each) { copy('%/sg.json', 'sg.json') }
|
427
|
+
before(:each) { copy('%/iam.yaml', 'iam.yaml') }
|
428
|
+
before(:each) { copy('%/iam.json', 'iam.json') }
|
429
|
+
before(:each) { run_command('cfndk stack create --stack-names=Test Test2') }
|
430
|
+
it do
|
431
|
+
aggregate_failures do
|
432
|
+
expect(last_command_started).to be_successfully_executed
|
433
|
+
expect(last_command_started).to have_output(/INFO create.../)
|
434
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test-#{uuid}$/)
|
435
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test-#{uuid}$/)
|
436
|
+
expect(last_command_started).to have_output(/INFO created stack: Test-#{uuid}$/)
|
437
|
+
expect(last_command_started).to have_output(/INFO validate stack: Test2-#{uuid}$/)
|
438
|
+
expect(last_command_started).to have_output(/INFO creating stack: Test2-#{uuid}$/)
|
439
|
+
expect(last_command_started).to have_output(/INFO created stack: Test2-#{uuid}$/)
|
440
|
+
expect(last_command_started).not_to have_output(/INFO validate stack: Test3-#{uuid}$/)
|
441
|
+
expect(last_command_started).not_to have_output(/INFO creating stack: Test3-#{uuid}$/)
|
442
|
+
expect(last_command_started).not_to have_output(/INFO created stack: Test3-#{uuid}$/)
|
443
|
+
end
|
444
|
+
end
|
445
|
+
after(:each) { run_command('cfndk destroy -f') }
|
446
|
+
end
|
447
|
+
end
|
448
|
+
end
|
449
|
+
end
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe 'CFnDK', type: :aruba do
|
4
|
+
before(:each) { set_environment_variable('AWS_REGION', ENV['AWS_REGION']) }
|
5
|
+
before(:each) { set_environment_variable('AWS_PROFILE', ENV['AWS_PROFILE']) }
|
6
|
+
before(:each) { set_environment_variable('AWS_ACCESS_KEY_ID', ENV["AWS_ACCESS_KEY_ID#{ENV['TEST_ENV_NUMBER']}"]) }
|
7
|
+
before(:each) { set_environment_variable('AWS_SECRET_ACCESS_KEY', ENV["AWS_SECRET_ACCESS_KEY#{ENV['TEST_ENV_NUMBER']}"]) }
|
8
|
+
describe 'bin/cfndk' do
|
9
|
+
before(:each) { setup_aruba }
|
10
|
+
let(:file) { 'cfndk.yml' }
|
11
|
+
let(:file2) { 'cfndk2.yml' }
|
12
|
+
let(:pem) { 'test.pem' }
|
13
|
+
let(:uuid) { '38437346-c75c-47c5-83b4-d504f85e275b' }
|
14
|
+
|
15
|
+
describe 'stack' do
|
16
|
+
describe 'destroy', destroy: true do
|
17
|
+
context 'when -f without cfndk.yml' do
|
18
|
+
before(:each) { run_command('cfndk stack destroy -f') }
|
19
|
+
it 'displays file does not exist error and status code = 1' do
|
20
|
+
aggregate_failures do
|
21
|
+
expect(last_command_started).to have_exit_status(1)
|
22
|
+
expect(last_command_started).to have_output(/ERROR RuntimeError: File does not exist./)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with cfndk2.yml' do
|
28
|
+
yaml = <<-"YAML"
|
29
|
+
stacks:
|
30
|
+
YAML
|
31
|
+
before(:each) { write_file(file2, yaml) }
|
32
|
+
context 'when -c cfndk2.yml -f and empty stacks' do
|
33
|
+
before(:each) { run_command("cfndk stack destroy -c=#{file2} -f") }
|
34
|
+
it 'displays empty stack log' do
|
35
|
+
aggregate_failures do
|
36
|
+
expect(last_command_started).to be_successfully_executed
|
37
|
+
expect(last_command_started).to have_output(/INFO destroy.../)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when --config-path cfndk2.yml -f and empty stacks' do
|
43
|
+
before(:each) { run_command("cfndk stack destroy --config-path=#{file2} -f") }
|
44
|
+
it 'displays empty stack log' do
|
45
|
+
aggregate_failures do
|
46
|
+
expect(last_command_started).to be_successfully_executed
|
47
|
+
expect(last_command_started).to have_output(/INFO destroy.../)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with cfndk.yml' do
|
54
|
+
context 'when cfndk.yml is empty' do
|
55
|
+
before(:each) { touch(file) }
|
56
|
+
before(:each) { run_command('cfndk stack destroy -f') }
|
57
|
+
it 'displays File is empty error and status code = 1' do
|
58
|
+
aggregate_failures do
|
59
|
+
expect(last_command_started).to have_exit_status(1)
|
60
|
+
expect(last_command_started).to have_output(/ERROR File is empty./)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'when enter no' do
|
65
|
+
yaml = <<-"YAML"
|
66
|
+
keypairs:
|
67
|
+
Test1:
|
68
|
+
stacks:
|
69
|
+
Test:
|
70
|
+
template_file: vpc.yaml
|
71
|
+
parameter_input: vpc.json
|
72
|
+
parameters:
|
73
|
+
VpcName: sample<%= append_uuid%>
|
74
|
+
timeout_in_minutes: 2
|
75
|
+
YAML
|
76
|
+
before(:each) { write_file(file, yaml) }
|
77
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
78
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
79
|
+
before(:each) { run_command('cfndk stack destroy') }
|
80
|
+
before(:each) { type('no') }
|
81
|
+
it 'displays confirm message and cancel message and status code = 2' do
|
82
|
+
aggregate_failures do
|
83
|
+
expect(last_command_started).to have_exit_status(2)
|
84
|
+
expect(last_command_started).to have_output(/INFO destroy../)
|
85
|
+
expect(last_command_started).to have_output(%r{Are you sure you want to destroy\? \(y/n\)})
|
86
|
+
expect(last_command_started).to have_output(/INFO destroy command was canceled/)
|
87
|
+
expect(last_command_started).not_to have_output(/INFO deleting stack:/)
|
88
|
+
expect(last_command_started).not_to have_output(/INFO deleted stack:/)
|
89
|
+
expect(last_command_started).not_to have_output(/INFO do not delete keypair: Test1$/)
|
90
|
+
expect(last_command_started).not_to have_output(/INFO do not delete stack: Test$/)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
context 'when enter yes' do
|
95
|
+
context 'when keyparis and stacks do not exist' do
|
96
|
+
yaml = <<-"YAML"
|
97
|
+
keypairs:
|
98
|
+
Test1:
|
99
|
+
stacks:
|
100
|
+
Test:
|
101
|
+
template_file: vpc.yaml
|
102
|
+
parameter_input: vpc.json
|
103
|
+
parameters:
|
104
|
+
VpcName: sample<%= append_uuid%>
|
105
|
+
timeout_in_minutes: 2
|
106
|
+
YAML
|
107
|
+
before(:each) { write_file(file, yaml) }
|
108
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
109
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
110
|
+
before(:each) { run_command('cfndk destroy -f') }
|
111
|
+
before(:each) { stop_all_commands }
|
112
|
+
before(:each) { run_command('cfndk stack destroy') }
|
113
|
+
before(:each) { type('yes') }
|
114
|
+
before(:each) { stop_all_commands }
|
115
|
+
it 'displays confirm message and do not delete message' do
|
116
|
+
aggregate_failures do
|
117
|
+
expect(last_command_started).to be_successfully_executed
|
118
|
+
expect(last_command_started).to have_output(/INFO destroy../)
|
119
|
+
expect(last_command_started).to have_output(%r{Are you sure you want to destroy\? \(y/n\)})
|
120
|
+
expect(last_command_started).not_to have_output(/INFO do not delete keypair: Test1$/)
|
121
|
+
expect(last_command_started).to have_output(/INFO do not delete stack: Test$/)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
context 'when keyparis and stacks exist' do
|
126
|
+
yaml = <<-"YAML"
|
127
|
+
keypairs:
|
128
|
+
Test1:
|
129
|
+
stacks:
|
130
|
+
Test:
|
131
|
+
template_file: vpc.yaml
|
132
|
+
parameter_input: vpc.json
|
133
|
+
parameters:
|
134
|
+
VpcName: sample<%= append_uuid%>
|
135
|
+
timeout_in_minutes: 2
|
136
|
+
YAML
|
137
|
+
before(:each) { write_file(file, yaml) }
|
138
|
+
before(:each) { copy('%/vpc.yaml', 'vpc.yaml') }
|
139
|
+
before(:each) { copy('%/vpc.json', 'vpc.json') }
|
140
|
+
before(:each) { run_command('cfndk create') }
|
141
|
+
before(:each) { stop_all_commands }
|
142
|
+
before(:each) { run_command('cfndk stack destroy') }
|
143
|
+
before(:each) { type('yes') }
|
144
|
+
before(:each) { stop_all_commands }
|
145
|
+
it 'displays confirm message and delete message' do
|
146
|
+
aggregate_failures do
|
147
|
+
expect(last_command_started).to be_successfully_executed
|
148
|
+
expect(last_command_started).to have_output(/INFO destroy../)
|
149
|
+
expect(last_command_started).to have_output(%r{Are you sure you want to destroy\? \(y/n\)})
|
150
|
+
expect(last_command_started).not_to have_output(/INFO deleted keypair: Test1$/)
|
151
|
+
expect(last_command_started).to have_output(/INFO deleted stack: Test$/)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
after(:each) { run_command('cfndk destroy -f') }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|