stack_master 1.5.0 → 1.6.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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/lib/stack_master/commands/terminal_helper.rb +14 -1
  4. data/lib/stack_master/parameter_resolvers/secret.rb +7 -2
  5. data/lib/stack_master/version.rb +1 -1
  6. metadata +21 -216
  7. data/.gitignore +0 -18
  8. data/.rspec +0 -2
  9. data/.travis.yml +0 -12
  10. data/CODE_OF_CONDUCT.md +0 -73
  11. data/Gemfile +0 -4
  12. data/LICENSE.txt +0 -22
  13. data/Rakefile +0 -27
  14. data/apply_demo.gif +0 -0
  15. data/example/simple/Gemfile +0 -3
  16. data/example/simple/parameters/myapp_vpc.yml +0 -1
  17. data/example/simple/parameters/myapp_web.yml +0 -2
  18. data/example/simple/stack_master.yml +0 -13
  19. data/example/simple/templates/myapp_vpc.rb +0 -39
  20. data/example/simple/templates/myapp_web.rb +0 -16
  21. data/features/apply.feature +0 -392
  22. data/features/apply_with_compile_time_parameters.feature +0 -93
  23. data/features/apply_with_env_parameters.feature +0 -49
  24. data/features/apply_with_parameter_store_parameters.feature +0 -47
  25. data/features/apply_with_s3.feature +0 -106
  26. data/features/delete.feature +0 -29
  27. data/features/diff.feature +0 -179
  28. data/features/events.feature +0 -33
  29. data/features/init.feature +0 -6
  30. data/features/outputs.feature +0 -45
  31. data/features/region_aliases.feature +0 -62
  32. data/features/resources.feature +0 -42
  33. data/features/stack_defaults.feature +0 -82
  34. data/features/status.feature +0 -118
  35. data/features/step_definitions/parameter_store_steps.rb +0 -14
  36. data/features/step_definitions/stack_steps.rb +0 -71
  37. data/features/support/env.rb +0 -16
  38. data/features/validate.feature +0 -46
  39. data/logo.png +0 -0
  40. data/script/buildkite/bundle.sh +0 -5
  41. data/script/buildkite/clean.sh +0 -3
  42. data/script/buildkite_rspec.sh +0 -27
  43. data/spec/fixtures/parameters/myapp_vpc.yml +0 -1
  44. data/spec/fixtures/parameters/myapp_vpc_with_secrets.yml +0 -3
  45. data/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/my_sparkle_pack.rb +0 -1
  46. data/spec/fixtures/sparkle_pack_integration/my_sparkle_pack/lib/sparkleformation/dynamics/my_dynamic.rb +0 -5
  47. data/spec/fixtures/sparkle_pack_integration/templates/dynamics/local_dynamic.rb +0 -5
  48. data/spec/fixtures/sparkle_pack_integration/templates/template_with_dynamic.rb +0 -3
  49. data/spec/fixtures/sparkle_pack_integration/templates/template_with_dynamic_from_pack.rb +0 -3
  50. data/spec/fixtures/stack_master.yml +0 -49
  51. data/spec/fixtures/templates/json/valid_myapp_vpc.json +0 -53
  52. data/spec/fixtures/templates/myapp_vpc.json +0 -1
  53. data/spec/fixtures/templates/rb/cfndsl/sample.json +0 -28
  54. data/spec/fixtures/templates/rb/cfndsl/sample.rb +0 -16
  55. data/spec/fixtures/templates/yml/valid_myapp_vpc.yml +0 -35
  56. data/spec/fixtures/test/.gitkeep +0 -0
  57. data/spec/spec_helper.rb +0 -102
  58. data/spec/stack_master/aws_driver/s3_spec.rb +0 -130
  59. data/spec/stack_master/change_set_spec.rb +0 -70
  60. data/spec/stack_master/command_spec.rb +0 -66
  61. data/spec/stack_master/commands/apply_spec.rb +0 -259
  62. data/spec/stack_master/commands/delete_spec.rb +0 -40
  63. data/spec/stack_master/commands/init_spec.rb +0 -17
  64. data/spec/stack_master/commands/status_spec.rb +0 -44
  65. data/spec/stack_master/commands/validate_spec.rb +0 -27
  66. data/spec/stack_master/config_spec.rb +0 -153
  67. data/spec/stack_master/paged_response_accumulator_spec.rb +0 -39
  68. data/spec/stack_master/parameter_loader_spec.rb +0 -110
  69. data/spec/stack_master/parameter_resolver_spec.rb +0 -148
  70. data/spec/stack_master/parameter_resolvers/ami_finder_spec.rb +0 -68
  71. data/spec/stack_master/parameter_resolvers/env_spec.rb +0 -35
  72. data/spec/stack_master/parameter_resolvers/latest_ami_by_tags_spec.rb +0 -33
  73. data/spec/stack_master/parameter_resolvers/latest_ami_spec.rb +0 -46
  74. data/spec/stack_master/parameter_resolvers/parameter_store_spec.rb +0 -50
  75. data/spec/stack_master/parameter_resolvers/secret_spec.rb +0 -66
  76. data/spec/stack_master/parameter_resolvers/security_group_spec.rb +0 -19
  77. data/spec/stack_master/parameter_resolvers/security_groups_spec.rb +0 -32
  78. data/spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb +0 -43
  79. data/spec/stack_master/parameter_resolvers/stack_output_spec.rb +0 -127
  80. data/spec/stack_master/prompter_spec.rb +0 -23
  81. data/spec/stack_master/resolver_array_spec.rb +0 -42
  82. data/spec/stack_master/security_group_finder_spec.rb +0 -49
  83. data/spec/stack_master/sns_topic_finder_spec.rb +0 -25
  84. data/spec/stack_master/sparkle_formation/compile_time/allowed_pattern_validator_spec.rb +0 -47
  85. data/spec/stack_master/sparkle_formation/compile_time/allowed_values_validator_spec.rb +0 -47
  86. data/spec/stack_master/sparkle_formation/compile_time/definitions_validator_spec.rb +0 -36
  87. data/spec/stack_master/sparkle_formation/compile_time/empty_validator_spec.rb +0 -47
  88. data/spec/stack_master/sparkle_formation/compile_time/max_length_validator_spec.rb +0 -37
  89. data/spec/stack_master/sparkle_formation/compile_time/max_size_validator_spec.rb +0 -27
  90. data/spec/stack_master/sparkle_formation/compile_time/min_length_validator_spec.rb +0 -36
  91. data/spec/stack_master/sparkle_formation/compile_time/min_size_validator_spec.rb +0 -28
  92. data/spec/stack_master/sparkle_formation/compile_time/number_validator_spec.rb +0 -41
  93. data/spec/stack_master/sparkle_formation/compile_time/parameters_validator_spec.rb +0 -65
  94. data/spec/stack_master/sparkle_formation/compile_time/state_builder_spec.rb +0 -28
  95. data/spec/stack_master/sparkle_formation/compile_time/string_validator_spec.rb +0 -35
  96. data/spec/stack_master/sparkle_formation/compile_time/value_build_spec.rb +0 -52
  97. data/spec/stack_master/sparkle_formation/compile_time/value_validator_factory_spec.rb +0 -40
  98. data/spec/stack_master/sparkle_formation/template_file_spec.rb +0 -147
  99. data/spec/stack_master/stack_definition_spec.rb +0 -70
  100. data/spec/stack_master/stack_differ_spec.rb +0 -46
  101. data/spec/stack_master/stack_events/fetcher_spec.rb +0 -40
  102. data/spec/stack_master/stack_events/presenter_spec.rb +0 -18
  103. data/spec/stack_master/stack_events/streamer_spec.rb +0 -47
  104. data/spec/stack_master/stack_spec.rb +0 -184
  105. data/spec/stack_master/template_compiler_spec.rb +0 -39
  106. data/spec/stack_master/template_compilers/cfndsl_spec.rb +0 -22
  107. data/spec/stack_master/template_compilers/json_spec.rb +0 -32
  108. data/spec/stack_master/template_compilers/sparkle_formation_spec.rb +0 -116
  109. data/spec/stack_master/template_compilers/yaml_spec.rb +0 -20
  110. data/spec/stack_master/template_utils_spec.rb +0 -21
  111. data/spec/stack_master/test_driver/cloud_formation_spec.rb +0 -64
  112. data/spec/stack_master/test_driver/s3_spec.rb +0 -17
  113. data/spec/stack_master/utils_spec.rb +0 -30
  114. data/spec/stack_master/validator_spec.rb +0 -56
  115. data/spec/stack_master_spec.rb +0 -81
  116. data/spec/support/gemfiles/Gemfile.activesupport-4.0.0 +0 -5
  117. data/spec/support/validator_spec.rb +0 -23
  118. data/stack_master.gemspec +0 -46
  119. data/stacktemplates/parameter_region.yml +0 -3
  120. data/stacktemplates/parameter_stack_name.yml +0 -3
  121. data/stacktemplates/stack.json.erb +0 -20
  122. data/stacktemplates/stack_master.yml.erb +0 -6
@@ -1,70 +0,0 @@
1
- RSpec.describe StackMaster::ChangeSet do
2
- let(:cf) { instance_double(Aws::CloudFormation::Client) }
3
- let(:region) { 'us-east-1' }
4
- let(:stack_name) { 'myapp-vpc' }
5
- let(:change_set_name) { 'changeset-123' }
6
-
7
- describe '.generate_change_set_name' do
8
- context 'valid name' do
9
- it 'creates a valid name' do
10
- expect(StackMaster::ChangeSet.generate_change_set_name('foobar')).to match(/^foobar-StackMaster[-a-zA-Z0-9]*$/)
11
- end
12
- end
13
- end
14
-
15
- describe '.create' do
16
- before do
17
- allow(StackMaster::ChangeSet).to receive(:generate_change_set_name).and_return(change_set_name)
18
- allow(StackMaster).to receive(:cloud_formation_driver).and_return(cf)
19
- allow(cf).to receive(:create_change_set).and_return(double(id: 'id-1'))
20
- end
21
-
22
- context 'successful response' do
23
- before do
24
- allow(cf).to receive(:describe_change_set).with(change_set_name: 'id-1', next_token: nil).and_return(double(next_token: nil, changes: [], :changes= => nil, :next_token= => nil, status: 'CREATE_COMPLETE'))
25
- end
26
-
27
- it 'calls the create change set API with the addition of a name' do
28
- change_set = StackMaster::ChangeSet.create(stack_name: '123')
29
- expect(cf).to have_received(:create_change_set).with(
30
- stack_name: '123',
31
- change_set_name: change_set_name
32
- )
33
- expect(change_set.failed?).to eq false
34
- end
35
- end
36
-
37
- context 'unsuccessful response' do
38
- before do
39
- allow(cf).to receive(:describe_change_set).with(change_set_name: 'id-1', next_token: nil).and_return(double(next_token: nil, changes: [], :changes= => nil, :next_token= => nil, status: 'FAILED', status_reason: 'No changes'))
40
- end
41
-
42
- it 'is marked as failed' do
43
- change_set = StackMaster::ChangeSet.create(stack_name: '123')
44
- expect(change_set.failed?).to eq true
45
- end
46
- end
47
- end
48
-
49
- describe '#display' do
50
- context 'a successful response' do
51
- let(:target) { OpenStruct.new(name: 'GroupDescription', attribute: 'Properties', requires_recreation: 'Always') }
52
- let(:changes) { [
53
- OpenStruct.new(resource_change: OpenStruct.new(replacement: 'True', action: 'Modify', resource_type: 'EC2::Instance', logical_resource_id: '123', details: [OpenStruct.new(target: target, change_source: 'DirectModification', evaluation: 'Static', causing_entity: 'blah')]))
54
- ] }
55
- let(:cf_response) { double(next_token: nil, changes: changes, :changes= => nil, :next_token= => nil, status: 'FAILED', status_reason: 'No changes') }
56
- let(:io) { StringIO.new }
57
- subject(:change_set) { StackMaster::ChangeSet.new(cf_response) }
58
- let(:message) { io.string }
59
- before { change_set.display(io) }
60
-
61
- it 'outputs key data' do
62
- expect(message).to include 'Replace EC2::Instance 123'
63
- end
64
-
65
- it 'outputs detail data' do
66
- expect(message).to include 'Properties.GroupDescription. Always requires recreation. Triggered by: DirectModification.blah'
67
- end
68
- end
69
- end
70
- end
@@ -1,66 +0,0 @@
1
- RSpec.describe StackMaster::Command do
2
- let(:command_class) {
3
- Class.new do
4
- include StackMaster::Command
5
-
6
- def initialize(callable = nil, halt = nil)
7
- @callable = callable
8
- @halt = halt
9
- end
10
-
11
- attr_reader :finished
12
-
13
- def perform
14
- instance_eval(&@callable) if @callable
15
- halt! if @halt
16
- @finished = true
17
- false
18
- end
19
- end
20
- }
21
-
22
- context 'when failed is not called' do
23
- it 'is successful' do
24
- expect(command_class.perform.success?).to eq true
25
- end
26
- end
27
-
28
- context 'when failed is called' do
29
- it 'is not successful' do
30
- expect(command_class.perform(proc { failed }).success?).to eq false
31
- end
32
- end
33
-
34
- describe '#halt!' do
35
- it 'exits the command' do
36
- expect(command_class.perform(nil, true).finished).to_not eq true
37
- end
38
- end
39
-
40
- context 'when a CF error occurs' do
41
- it 'outputs the message' do
42
- error_proc = proc {
43
- raise Aws::CloudFormation::Errors::ServiceError.new('a', 'the message')
44
- }
45
- expect { command_class.perform(error_proc) }.to output(/the message/).to_stderr
46
- end
47
- end
48
-
49
- context 'when a template compilation error occurs' do
50
- it 'outputs the message' do
51
- error_proc = proc {
52
- raise StackMaster::TemplateCompiler::TemplateCompilationFailed.new('the message')
53
- }
54
- expect { command_class.perform(error_proc) }.to output(/the message/).to_stderr
55
- end
56
-
57
- it 'outputs the exception\'s cause' do
58
- exception_with_cause = StackMaster::TemplateCompiler::TemplateCompilationFailed.new('the message')
59
- allow(exception_with_cause).to receive(:cause).and_return(RuntimeError.new('the cause message'))
60
- error_proc = proc {
61
- raise exception_with_cause
62
- }
63
- expect { command_class.perform(error_proc) }.to output(/Caused by: RuntimeError the cause message/).to_stderr
64
- end
65
- end
66
- end
@@ -1,259 +0,0 @@
1
- RSpec.describe StackMaster::Commands::Apply do
2
- let(:cf) { instance_double(Aws::CloudFormation::Client) }
3
- let(:s3) { instance_double(Aws::S3::Client) }
4
- let(:region) { 'us-east-1' }
5
- let(:stack_name) { 'myapp-vpc' }
6
- let(:config) { double(find_stack: stack_definition) }
7
- let(:role_arn) { 'test_service_role_arn' }
8
- let(:notification_arn) { 'test_arn' }
9
- let(:stack_definition) { StackMaster::StackDefinition.new(base_dir: '/base_dir', region: region, stack_name: stack_name) }
10
- let(:template_body) { '{}' }
11
- let(:template_format) { :json }
12
- let(:parameters) { { 'param_1' => 'hello' } }
13
- let(:proposed_stack) { StackMaster::Stack.new(template_body: template_body, template_format: template_format, tags: { 'environment' => 'production' } , parameters: parameters, role_arn: role_arn, notification_arns: [notification_arn], stack_policy_body: stack_policy_body ) }
14
- let(:stack_policy_body) { '{}' }
15
- let(:change_set) { double(display: true, failed?: false, id: '1') }
16
-
17
- before do
18
- allow(StackMaster::Stack).to receive(:find).with(region, stack_name).and_return(stack)
19
- allow(StackMaster::Stack).to receive(:generate).with(stack_definition, config).and_return(proposed_stack)
20
- allow(config).to receive(:stack_defaults).and_return({})
21
- allow(Aws::CloudFormation::Client).to receive(:new).and_return(cf)
22
- allow(Aws::S3::Client).to receive(:new).and_return(s3)
23
- allow(cf).to receive(:create_stack)
24
- allow(StackMaster::StackDiffer).to receive(:new).with(proposed_stack, stack).and_return double.as_null_object
25
- allow(StackMaster::StackEvents::Streamer).to receive(:stream)
26
- allow(StackMaster).to receive(:interactive?).and_return(false)
27
- allow(cf).to receive(:create_change_set).and_return(OpenStruct.new(id: '1'))
28
- allow(StackMaster::ChangeSet).to receive(:create).and_return(change_set)
29
- allow(cf).to receive(:execute_change_set).and_return(OpenStruct.new(id: '1'))
30
- allow(cf).to receive(:set_stack_policy)
31
- end
32
-
33
- def apply
34
- StackMaster::Commands::Apply.perform(config, stack_definition)
35
- end
36
-
37
- context 'the stack exist' do
38
- let(:stack) { StackMaster::Stack.new(stack_id: '1') }
39
-
40
- it 'creates a change set' do
41
- apply
42
- expect(StackMaster::ChangeSet).to have_received(:create).with(
43
- stack_name: stack_name,
44
- template_body: proposed_stack.template_body,
45
- parameters: [
46
- { parameter_key: 'param_1', parameter_value: 'hello' }
47
- ],
48
- tags: [
49
- { key: 'environment', value: 'production' }
50
- ],
51
- capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
52
- role_arn: role_arn,
53
- notification_arns: [notification_arn]
54
- )
55
- end
56
-
57
- it 'streams events' do
58
- Timecop.freeze(Time.local(1990)) do
59
- apply
60
- expect(StackMaster::StackEvents::Streamer).to have_received(:stream).with(stack_name, region, io: STDOUT, from: Time.now)
61
- end
62
- end
63
-
64
- it 'attaches a stack policy to the stack' do
65
- apply
66
- expect(cf).to have_received(:set_stack_policy).with(
67
- stack_name: stack_name,
68
- stack_policy_body: stack_policy_body
69
- )
70
- end
71
-
72
- context 'stack policy is not changed' do
73
- let(:stack) { StackMaster::Stack.new(stack_id: '1', stack_policy_body: stack_policy_body) }
74
-
75
- it 'does not set a stack policy' do
76
- apply
77
- expect(cf).to_not have_received(:set_stack_policy)
78
- end
79
- end
80
-
81
- context 'when using s3' do
82
- before do
83
- stack_definition.s3 = {
84
- 'bucket' => 'my-bucket',
85
- 'prefix' => 'my-prefix',
86
- 'region' => 'us-east-1',
87
- }
88
- stack_definition.template = 'my-template.rb'
89
- allow(s3).to receive(:list_objects).and_return([])
90
- allow(s3).to receive(:put_object)
91
- end
92
-
93
- it 'uploads to the correct URL' do
94
- apply
95
- expect(s3).to have_received(:put_object).with(
96
- bucket: 'my-bucket',
97
- key: 'my-prefix/my-template.json',
98
- body: template_body,
99
- metadata: { md5: Digest::MD5.hexdigest(template_body).to_s }
100
- )
101
- end
102
-
103
- it 'uploads to S3 before creating a changeset' do
104
- expect(s3).to receive(:put_object).ordered
105
- expect(StackMaster::ChangeSet).to receive(:create).ordered
106
- apply
107
- end
108
- end
109
-
110
- context 'the changeset failed to create' do
111
- before do
112
- allow(StackMaster::ChangeSet).to receive(:delete)
113
- allow(change_set).to receive(:failed?).and_return(true)
114
- allow(change_set).to receive(:status_reason).and_return('reason')
115
- end
116
-
117
- it 'outputs the status reason' do
118
- expect { apply }.to output(/reason/).to_stdout
119
- end
120
- end
121
-
122
- context 'user decides to not apply the change set' do
123
- before do
124
- allow(StackMaster).to receive(:non_interactive_answer).and_return('n')
125
- allow(StackMaster::ChangeSet).to receive(:delete)
126
- allow(StackMaster::ChangeSet).to receive(:execute)
127
- apply
128
- end
129
-
130
- it 'deletes the change set' do
131
- expect(StackMaster::ChangeSet).to have_received(:delete).with(change_set.id)
132
- end
133
-
134
- it "doesn't execute the change set" do
135
- expect(StackMaster::ChangeSet).to_not have_received(:execute).with(change_set.id)
136
- end
137
- end
138
- end
139
-
140
- context 'the stack does not exist' do
141
- let(:stack) { nil }
142
-
143
- it 'creates a change set for a new stack' do
144
- apply
145
- expect(StackMaster::ChangeSet).to have_received(:create).with(
146
- stack_name: stack_name,
147
- template_body: proposed_stack.template_body,
148
- parameters: [
149
- { parameter_key: 'param_1', parameter_value: 'hello' }
150
- ],
151
- tags: [
152
- { key: 'environment', value: 'production' }
153
- ],
154
- capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
155
- role_arn: role_arn,
156
- notification_arns: [notification_arn],
157
- change_set_type: 'CREATE'
158
- )
159
- end
160
-
161
- context 'on_failure option is set' do
162
- it 'calls the create stack API method' do
163
- options = Commander::Command::Options.new
164
- options.on_failure = 'ROLLBACK'
165
- StackMaster::Commands::Apply.perform(config, stack_definition, options)
166
- apply
167
- expect(cf).to have_received(:create_stack).with(
168
- stack_name: stack_name,
169
- template_body: proposed_stack.template_body,
170
- parameters: [
171
- { parameter_key: 'param_1', parameter_value: 'hello' }
172
- ],
173
- tags: [
174
- { key: 'environment', value: 'production' }
175
- ],
176
- capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM'],
177
- role_arn: role_arn,
178
- notification_arns: [notification_arn],
179
- on_failure: 'ROLLBACK'
180
- )
181
- end
182
- end
183
-
184
- it 'attaches a stack policy to the created stack' do
185
- apply
186
- expect(cf).to have_received(:set_stack_policy).with(
187
- stack_name: stack_name,
188
- stack_policy_body: stack_policy_body
189
- )
190
- end
191
-
192
- context 'the stack is too large' do
193
- let(:big_string) { 'x' * 60000 }
194
- let(:template_body) do
195
- "{\"a\":\"#{big_string}\"}"
196
- end
197
-
198
- it 'exits with a message' do
199
- expect { apply }.to output(/The \(space compressed\) stack is larger than the limit set by AWS/).to_stderr
200
- end
201
- end
202
-
203
- it 'streams events' do
204
- Timecop.freeze(Time.local(1990)) do
205
- apply
206
- expect(StackMaster::StackEvents::Streamer).to have_received(:stream).with(stack_name, region, io: STDOUT, from: Time.now)
207
- end
208
- end
209
-
210
- context 'user decides to not create a stack' do
211
- before do
212
- allow(StackMaster).to receive(:non_interactive_answer).and_return('n')
213
- allow(cf).to receive(:delete_stack)
214
- allow(StackMaster::ChangeSet).to receive(:execute)
215
- apply
216
- end
217
-
218
- it 'deletes the stack' do
219
- expect(cf).to have_received(:delete_stack).with(stack_name: stack_name)
220
- end
221
-
222
- it "doesn't execute the change set" do
223
- expect(StackMaster::ChangeSet).to_not have_received(:execute).with(change_set.id)
224
- end
225
- end
226
-
227
- context 'user uses ctrl+c' do
228
- before do
229
- allow(StackMaster).to receive(:non_interactive_answer).and_return('n')
230
- allow(cf).to receive(:delete_stack)
231
- allow(StackMaster::ChangeSet).to receive(:create).and_raise(StackMaster::CtrlC)
232
- end
233
-
234
- it "deletes the stack" do
235
- expect(cf).to receive(:delete_stack).with(stack_name: stack_name)
236
- expect { apply }.to raise_error
237
- end
238
- end
239
- end
240
-
241
- context 'one or more parameters are empty' do
242
- let(:stack) { StackMaster::Stack.new(stack_id: '1', parameters: parameters) }
243
- let(:parameters) { { 'param_1' => nil } }
244
-
245
- it "doesn't allow apply" do
246
- expect { apply }.to_not output(/Continue and apply the stack/).to_stdout
247
- end
248
-
249
- it 'outputs a description of the problem' do
250
- expect { apply }.to output(/Empty\/blank parameters detected/).to_stderr
251
- end
252
-
253
- it 'outputs where param files are loaded from' do
254
- stack_definition.parameter_files.each do |parameter_file|
255
- expect { apply }.to output(/#{parameter_file}/).to_stderr
256
- end
257
- end
258
- end
259
- end
@@ -1,40 +0,0 @@
1
- RSpec.describe StackMaster::Commands::Delete do
2
-
3
- subject(:delete) { described_class.new(stack_name, region) }
4
- let(:cf) { Aws::CloudFormation::Client.new }
5
- let(:region) { 'us-east-1' }
6
- let(:stack_name) { 'mystack' }
7
-
8
- before do
9
- StackMaster.cloud_formation_driver.set_region(region)
10
- allow(Aws::CloudFormation::Client).to receive(:new).with(region: region, retry_limit: 10).and_return(cf)
11
- allow(delete).to receive(:ask?).and_return('y')
12
- allow(StackMaster::StackEvents::Streamer).to receive(:stream)
13
- end
14
-
15
- describe "#perform" do
16
- context "The stack exists" do
17
- before do
18
- cf.stub_responses(:describe_stacks, stacks: [{ stack_id: "ABC", stack_name: stack_name, creation_time: Time.now, stack_status: 'UPDATE_COMPLETE', parameters: []}])
19
-
20
- end
21
- it "deletes the stack and tails the events" do
22
- expect(cf).to receive(:delete_stack).with({:stack_name => region})
23
- expect(StackMaster::StackEvents::Streamer).to receive(:stream)
24
- delete.perform
25
- end
26
- end
27
-
28
- context "The stack does not exist" do
29
- before do
30
- cf.stub_responses(:describe_stacks, Aws::CloudFormation::Errors::ValidationError.new("x", "y"))
31
- end
32
- it "raises an error" do
33
- expect(StackMaster::StackEvents::Streamer).to_not receive(:stream)
34
- expect(cf).to_not receive(:delete_stack)
35
- delete.perform
36
- end
37
- end
38
- end
39
-
40
- end
@@ -1,17 +0,0 @@
1
- RSpec.describe StackMaster::Commands::Init do
2
-
3
- subject(:init_command) { described_class.new(false, region, stack_name) }
4
- let(:region) { "us-east-1" }
5
- let(:stack_name) { "test-stack" }
6
-
7
- describe "#perform" do
8
- it "creates all the expected files" do
9
- expect(IO).to receive(:write).with("stack_master.yml", "stacks:\n us-east-1:\n test-stack:\n template: test-stack.json\n tags:\n environment: production\n")
10
- expect(IO).to receive(:write).with("parameters/test_stack.yml", "# Add parameters here:\n# param1: value1\n# param2: value2\n")
11
- expect(IO).to receive(:write).with("parameters/us-east-1/test_stack.yml", "# Add parameters here:\n# param1: value1\n# param2: value2\n")
12
- expect(IO).to receive(:write).with("templates/test-stack.json", "{\n \"AWSTemplateFormatVersion\" : \"2010-09-09\",\n \"Description\" : \"Cloudformation stack for test-stack\",\n\n \"Parameters\" : {\n \"InstanceType\" : {\n \"Description\" : \"EC2 instance type\",\n \"Type\" : \"String\"\n }\n },\n\n \"Mappings\" : {\n },\n\n \"Resources\" : {\n },\n\n \"Outputs\" : {\n }\n}\n")
13
- init_command.perform()
14
- end
15
- end
16
-
17
- end