cfndk 0.0.7 → 0.1.2

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