stack_master 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +52 -7
  3. data/Rakefile +2 -0
  4. data/bin/stack_master +2 -1
  5. data/features/apply.feature +63 -26
  6. data/features/delete.feature +5 -18
  7. data/features/diff.feature +6 -18
  8. data/features/events.feature +1 -5
  9. data/features/outputs.feature +1 -5
  10. data/features/region_aliases.feature +0 -4
  11. data/features/resources.feature +1 -4
  12. data/features/stack_defaults.feature +1 -7
  13. data/features/status.feature +2 -8
  14. data/features/step_definitions/stack_steps.rb +16 -0
  15. data/features/support/env.rb +1 -0
  16. data/features/validate.feature +46 -0
  17. data/lib/stack_master.rb +21 -0
  18. data/lib/stack_master/aws_driver/cloud_formation.rb +20 -1
  19. data/lib/stack_master/cli.rb +54 -27
  20. data/lib/stack_master/command.rb +9 -1
  21. data/lib/stack_master/commands/apply.rb +2 -0
  22. data/lib/stack_master/commands/list_stacks.rb +2 -0
  23. data/lib/stack_master/commands/outputs.rb +2 -1
  24. data/lib/stack_master/commands/status.rb +2 -0
  25. data/lib/stack_master/commands/terminal_helper.rb +15 -0
  26. data/lib/stack_master/commands/validate.rb +1 -1
  27. data/lib/stack_master/config.rb +9 -5
  28. data/lib/stack_master/parameter_resolver.rb +11 -5
  29. data/lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb +3 -1
  30. data/lib/stack_master/parameter_resolvers/secret.rb +3 -1
  31. data/lib/stack_master/parameter_resolvers/security_group.rb +4 -2
  32. data/lib/stack_master/parameter_resolvers/sns_topic_name.rb +3 -1
  33. data/lib/stack_master/parameter_resolvers/stack_output.rb +3 -1
  34. data/lib/stack_master/prompter.rb +10 -3
  35. data/lib/stack_master/resolver_array.rb +35 -0
  36. data/lib/stack_master/testing.rb +1 -0
  37. data/lib/stack_master/validator.rb +8 -4
  38. data/lib/stack_master/version.rb +1 -1
  39. data/spec/fixtures/stack_master.yml +4 -1
  40. data/spec/stack_master/command_spec.rb +28 -0
  41. data/spec/stack_master/commands/apply_spec.rb +12 -2
  42. data/spec/stack_master/commands/status_spec.rb +25 -2
  43. data/spec/stack_master/commands/validate_spec.rb +1 -1
  44. data/spec/stack_master/config_spec.rb +42 -8
  45. data/spec/stack_master/parameter_resolver_spec.rb +6 -2
  46. data/spec/stack_master/parameter_resolvers/security_group_spec.rb +5 -3
  47. data/spec/stack_master/parameter_resolvers/security_groups_spec.rb +32 -0
  48. data/spec/stack_master/prompter_spec.rb +23 -0
  49. data/spec/stack_master/resolver_array_spec.rb +42 -0
  50. data/spec/stack_master/validator_spec.rb +2 -2
  51. metadata +15 -3
@@ -30,16 +30,20 @@ RSpec.describe StackMaster::ParameterResolver do
30
30
  expect(resolve(param1: 'value1')).to eq(param1: 'value1')
31
31
  end
32
32
 
33
+ it 'returns integers as strings' do
34
+ expect(resolve(param1: 2)).to eq(param1: '2')
35
+ end
36
+
33
37
  it 'it throws an error when the hash contains more than one key' do
34
38
  expect {
35
39
  resolve(param: { nested1: 'value1', nested2: 'value2' })
36
40
  }.to raise_error(StackMaster::ParameterResolver::InvalidParameter)
37
41
  end
38
42
 
39
- it 'throws an error when given an array' do
43
+ it "doesn't throw an error when given an array" do
40
44
  expect {
41
45
  resolve(param: [1, 2])
42
- }.to raise_error(StackMaster::ParameterResolver::InvalidParameter)
46
+ }.to_not raise_error
43
47
  end
44
48
 
45
49
  context 'when given a proper resolve hash' do
@@ -7,11 +7,13 @@ RSpec.describe StackMaster::ParameterResolvers::SecurityGroup do
7
7
 
8
8
  before do
9
9
  allow(StackMaster::SecurityGroupFinder).to receive(:new).with('us-east-1').and_return finder
10
- allow(finder).to receive(:find).with(sg_name).and_return sg_id
10
+ expect(finder).to receive(:find).once.with(sg_name).and_return sg_id
11
11
  end
12
12
 
13
- it "resolves the security group" do
14
- expect(resolver.resolve(sg_name)).to eq sg_id
13
+ context 'when given a single SG name' do
14
+ it "resolves the security group" do
15
+ expect(resolver.resolve(sg_name)).to eq sg_id
16
+ end
15
17
  end
16
18
  end
17
19
  end
@@ -0,0 +1,32 @@
1
+ RSpec.describe StackMaster::ParameterResolvers::SecurityGroups do
2
+ describe "#resolve" do
3
+ subject(:resolver) { described_class.new(nil, double(region: 'us-east-1')) }
4
+ let(:finder) { instance_double(StackMaster::SecurityGroupFinder) }
5
+ let(:sg_id) { 'sg-id' }
6
+ let(:sg_name) { 'sg-name' }
7
+
8
+ before do
9
+ allow(StackMaster::SecurityGroupFinder).to receive(:new).with('us-east-1').and_return finder
10
+ expect(finder).to receive(:find).once.with(sg_name).and_return sg_id
11
+ end
12
+
13
+ context 'when given a single SG name' do
14
+ it "resolves the security group" do
15
+ expect(resolver.resolve(sg_name)).to eq [sg_id]
16
+ end
17
+ end
18
+
19
+ context 'when given a an array of SG names' do
20
+ let(:sg_id2) { 'sg-id2' }
21
+ let(:sg_name2) { 'sg-name2' }
22
+
23
+ before do
24
+ expect(finder).to receive(:find).once.with(sg_name2).and_return sg_id2
25
+ end
26
+
27
+ it "resolves the security groups" do
28
+ expect(resolver.resolve([sg_name, sg_name2])).to eq [sg_id, sg_id2]
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ RSpec.describe StackMaster::Prompter do
2
+ include StackMaster::Prompter
3
+
4
+ context 'when STDIN is not a TTY' do
5
+ before do
6
+ allow(StackMaster.stdin).to receive(:tty?).and_return(false)
7
+ end
8
+
9
+ it 'defaults to no and outputs info about -y' do
10
+ expect { ask?('blah') }.to output(/To force yes use -y/).to_stdout
11
+ end
12
+ end
13
+
14
+ context 'when STDOUT is not a TTY' do
15
+ before do
16
+ allow(StackMaster.stdout).to receive(:tty?).and_return(false)
17
+ end
18
+
19
+ it 'defaults to no and outputs info about -y' do
20
+ expect { ask?('blah') }.to output(/To force yes use -y/).to_stdout
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,42 @@
1
+ require 'stack_master/resolver_array'
2
+
3
+ RSpec.shared_examples_for 'a resolver' do
4
+ it 'should create a TestResolvers class' do
5
+ expect(array_resolver_class).to be_a Class
6
+ end
7
+
8
+ it 'should have TestResolver as a resolver class' do
9
+ expect(array_resolver_instance).to respond_to :resolver_class
10
+ expect(array_resolver_instance.resolver_class).to be TestResolver
11
+ end
12
+ end
13
+
14
+ RSpec.describe 'StackMaster::ParameterResolvers::Resolver' do
15
+ let(:array_resolver_instance) { array_resolver_class.new(nil, nil) }
16
+
17
+ describe '.array_resolver' do
18
+ context 'when using a default name' do
19
+ before do
20
+ class TestResolver < StackMaster::ParameterResolvers::Resolver
21
+ array_resolver
22
+ end
23
+ end
24
+
25
+ let(:array_resolver_class) { StackMaster::ParameterResolvers::TestResolvers }
26
+
27
+ it_behaves_like 'a resolver'
28
+ end
29
+
30
+ context 'when using a specific name' do
31
+ before do
32
+ class TestResolver < StackMaster::ParameterResolvers::Resolver
33
+ array_resolver class_name: 'SpecificResolver'
34
+ end
35
+ end
36
+
37
+ let(:array_resolver_class) { StackMaster::ParameterResolvers::SpecificResolver }
38
+
39
+ it_behaves_like 'a resolver'
40
+ end
41
+ end
42
+ end
@@ -21,7 +21,7 @@ RSpec.describe StackMaster::Validator do
21
21
  cf.stub_responses(:validate_template, nil)
22
22
  end
23
23
  it "tells the user everything will be fine" do
24
- expect { validator.perform }.to output(/Valid/).to_stdout
24
+ expect { validator.perform }.to output(/myapp_vpc: valid/).to_stdout
25
25
  end
26
26
  end
27
27
 
@@ -30,7 +30,7 @@ RSpec.describe StackMaster::Validator do
30
30
  cf.stub_responses(:validate_template, Aws::CloudFormation::Errors::ValidationError.new('a', 'Problem'))
31
31
  end
32
32
  it "informs the user of their stupdity" do
33
- expect { validator.perform }.to output(/Validation Failed/).to_stderr
33
+ expect { validator.perform }.to output(/myapp_vpc: invalid/).to_stdout
34
34
  end
35
35
  end
36
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stack_master
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Hodgkiss
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-12-15 00:00:00.000000000 Z
12
+ date: 2016-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -299,6 +299,7 @@ files:
299
299
  - features/status.feature
300
300
  - features/step_definitions/stack_steps.rb
301
301
  - features/support/env.rb
302
+ - features/validate.feature
302
303
  - lib/stack_master.rb
303
304
  - lib/stack_master/aws_driver/cloud_formation.rb
304
305
  - lib/stack_master/cli.rb
@@ -312,6 +313,7 @@ files:
312
313
  - lib/stack_master/commands/outputs.rb
313
314
  - lib/stack_master/commands/resources.rb
314
315
  - lib/stack_master/commands/status.rb
316
+ - lib/stack_master/commands/terminal_helper.rb
315
317
  - lib/stack_master/commands/validate.rb
316
318
  - lib/stack_master/config.rb
317
319
  - lib/stack_master/ctrl_c.rb
@@ -323,6 +325,7 @@ files:
323
325
  - lib/stack_master/parameter_resolvers/sns_topic_name.rb
324
326
  - lib/stack_master/parameter_resolvers/stack_output.rb
325
327
  - lib/stack_master/prompter.rb
328
+ - lib/stack_master/resolver_array.rb
326
329
  - lib/stack_master/security_group_finder.rb
327
330
  - lib/stack_master/sns_topic_finder.rb
328
331
  - lib/stack_master/stack.rb
@@ -346,6 +349,7 @@ files:
346
349
  - spec/fixtures/stack_master.yml
347
350
  - spec/fixtures/templates/myapp_vpc.json
348
351
  - spec/spec_helper.rb
352
+ - spec/stack_master/command_spec.rb
349
353
  - spec/stack_master/commands/apply_spec.rb
350
354
  - spec/stack_master/commands/delete_spec.rb
351
355
  - spec/stack_master/commands/init_spec.rb
@@ -357,8 +361,11 @@ files:
357
361
  - spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
358
362
  - spec/stack_master/parameter_resolvers/secret_spec.rb
359
363
  - spec/stack_master/parameter_resolvers/security_group_spec.rb
364
+ - spec/stack_master/parameter_resolvers/security_groups_spec.rb
360
365
  - spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb
361
366
  - spec/stack_master/parameter_resolvers/stack_output_spec.rb
367
+ - spec/stack_master/prompter_spec.rb
368
+ - spec/stack_master/resolver_array_spec.rb
362
369
  - spec/stack_master/security_group_finder_spec.rb
363
370
  - spec/stack_master/sns_topic_finder_spec.rb
364
371
  - spec/stack_master/stack_definition_spec.rb
@@ -396,7 +403,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
396
403
  version: '0'
397
404
  requirements: []
398
405
  rubyforge_project:
399
- rubygems_version: 2.2.3
406
+ rubygems_version: 2.4.5.1
400
407
  signing_key:
401
408
  specification_version: 4
402
409
  summary: StackMaster is a sure-footed way of creating, updating and keeping track
@@ -414,10 +421,12 @@ test_files:
414
421
  - features/status.feature
415
422
  - features/step_definitions/stack_steps.rb
416
423
  - features/support/env.rb
424
+ - features/validate.feature
417
425
  - spec/fixtures/parameters/myapp_vpc.yml
418
426
  - spec/fixtures/stack_master.yml
419
427
  - spec/fixtures/templates/myapp_vpc.json
420
428
  - spec/spec_helper.rb
429
+ - spec/stack_master/command_spec.rb
421
430
  - spec/stack_master/commands/apply_spec.rb
422
431
  - spec/stack_master/commands/delete_spec.rb
423
432
  - spec/stack_master/commands/init_spec.rb
@@ -429,8 +438,11 @@ test_files:
429
438
  - spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
430
439
  - spec/stack_master/parameter_resolvers/secret_spec.rb
431
440
  - spec/stack_master/parameter_resolvers/security_group_spec.rb
441
+ - spec/stack_master/parameter_resolvers/security_groups_spec.rb
432
442
  - spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb
433
443
  - spec/stack_master/parameter_resolvers/stack_output_spec.rb
444
+ - spec/stack_master/prompter_spec.rb
445
+ - spec/stack_master/resolver_array_spec.rb
434
446
  - spec/stack_master/security_group_finder_spec.rb
435
447
  - spec/stack_master/sns_topic_finder_spec.rb
436
448
  - spec/stack_master/stack_definition_spec.rb