stack_master 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -1
- data/features/apply.feature +3 -4
- data/features/delete.feature +1 -2
- data/features/events.feature +1 -2
- data/features/region_aliases.feature +1 -1
- data/lib/stack_master.rb +2 -0
- data/lib/stack_master/cli.rb +9 -2
- data/lib/stack_master/commands/status.rb +18 -3
- data/lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb +36 -0
- data/lib/stack_master/security_group_finder.rb +0 -1
- data/lib/stack_master/sns_topic_finder.rb +0 -1
- data/lib/stack_master/stack_differ.rb +21 -1
- data/lib/stack_master/version.rb +1 -1
- data/spec/stack_master/commands/status_spec.rb +3 -3
- data/spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb +33 -0
- data/spec/stack_master/stack_differ_spec.rb +12 -2
- data/spec/stack_master/stack_events/presenter_spec.rb +1 -1
- data/stack_master.gemspec +1 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2c8551f813ec21a55926c685bf281cf9aae2f33
|
4
|
+
data.tar.gz: eabcb88f9bc07a017659ebac349e5a476aca605c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b3242170d4615b24c88b85f1bf948bd69c00eacb83bafb6120dd37b247928648e4f9f0890e0ba3516b4e5e10eaa7bfacb5d1806bc7c3771a53bd5d02a7cd187
|
7
|
+
data.tar.gz: 0466d851277d7ec84ff4d1d1ed619f078a08bd0da8de70aad2c5e020537faa99a2a7ab6fa6c5c7229504a9455b5d2db87b140e7438707bfda86d4f21ebda73dd
|
data/README.md
CHANGED
@@ -160,6 +160,15 @@ notification_topic:
|
|
160
160
|
sns_topic: PagerDuty
|
161
161
|
```
|
162
162
|
|
163
|
+
### Latest AMI by Tag
|
164
|
+
|
165
|
+
Looks up the latest AMI ID by a given set of tags.
|
166
|
+
|
167
|
+
```yaml
|
168
|
+
web_ami:
|
169
|
+
latest_ami_by_tags: role=web,application=myapp
|
170
|
+
```
|
171
|
+
|
163
172
|
## Commands
|
164
173
|
|
165
174
|
```bash
|
@@ -172,7 +181,7 @@ stack_master delete [region-or-alias] [stack-name] # Delete a stack
|
|
172
181
|
stack_master events [region-or-alias] [stack-name] # Display events for a stack
|
173
182
|
stack_master outputs [region-or-alias] [stack-name] # Display outputs for a stack
|
174
183
|
stack_master resources [region-or-alias] [stack-name] # Display outputs for a stack
|
175
|
-
stack_master status # Displays the status of each
|
184
|
+
stack_master status # Displays the status of each stack
|
176
185
|
```
|
177
186
|
|
178
187
|
## Applying updates
|
data/features/apply.feature
CHANGED
@@ -80,7 +80,7 @@ Feature: Apply command
|
|
80
80
|
| + "Vpc": { |
|
81
81
|
| Parameters diff: |
|
82
82
|
| KeyName: my-key |
|
83
|
-
|
83
|
+
And the output should match /2020-10-29 00:00:00 \+[0-9]{4} myapp-vpc AWS::CloudFormation::Stack CREATE_COMPLETE/
|
84
84
|
Then the exit status should be 0
|
85
85
|
|
86
86
|
Scenario: Run apply and don't create the stack
|
@@ -94,8 +94,7 @@ Feature: Apply command
|
|
94
94
|
| Parameters diff: |
|
95
95
|
| KeyName: my-key |
|
96
96
|
| aborted |
|
97
|
-
And the output should not
|
98
|
-
| 2020-10-29 00:00:00 +1100 myapp-vpc AWS::CloudFormation::Stack CREATE_COMPLETE |
|
97
|
+
And the output should not match /2020-10-29 00:00:00 \+[0-9]{4} myapp-vpc AWS::CloudFormation::Stack CREATE_COMPLETE/
|
99
98
|
Then the exit status should be 0
|
100
99
|
|
101
100
|
Scenario: Run apply on an existing stack
|
@@ -171,7 +170,7 @@ Feature: Apply command
|
|
171
170
|
| + "TestSg": { |
|
172
171
|
| Parameters diff: |
|
173
172
|
| VpcId: vpc-xxxxxx |
|
174
|
-
|
173
|
+
And the output should match /2020-10-29 00:00:00 \+[0-9]{4} myapp-web AWS::CloudFormation::Stack CREATE_COMPLETE/
|
175
174
|
Then the exit status should be 0
|
176
175
|
|
177
176
|
Scenario: Create a stack with a notification ARN and a stack update policy
|
data/features/delete.feature
CHANGED
@@ -16,8 +16,7 @@ Feature: Delete command
|
|
16
16
|
| stack_id | event_id | stack_name | logical_resource_id | resource_status | resource_type | timestamp |
|
17
17
|
| 1 | 1 | myapp-vpc | myapp-vpc | DELETE_COMPLETE | AWS::CloudFormation::Stack | 2020-10-29 00:00:00 |
|
18
18
|
When I run `stack_master delete us-east-1 myapp-vpc --trace` interactively
|
19
|
-
And the output should
|
20
|
-
| 2020-10-29 00:00:00 +1100 myapp-vpc AWS::CloudFormation::Stack DELETE_COMPLETE |
|
19
|
+
And the output should match /2020-10-29 00:00:00 \+[0-9]{4} myapp-vpc AWS::CloudFormation::Stack DELETE_COMPLETE/
|
21
20
|
Then the exit status should be 0
|
22
21
|
|
23
22
|
Scenario: Run a delete command on a stack that does not exists
|
data/features/events.feature
CHANGED
@@ -34,5 +34,4 @@ Feature: Events command
|
|
34
34
|
| 1 | 1 | myapp-vpc | TestSg | CREATE_COMPLETE | AWS::EC2::SecurityGroup | 2020-10-29 00:00:00 |
|
35
35
|
| 1 | 1 | myapp-vpc | myapp-vpc | CREATE_COMPLETE | AWS::CloudFormation::Stack | 2020-10-29 00:00:00 |
|
36
36
|
When I run `stack_master events us-east-1 myapp-vpc --trace`
|
37
|
-
And the output should
|
38
|
-
| 2020-10-29 00:00:00 +1100 myapp-vpc AWS::CloudFormation::Stack CREATE_COMPLETE |
|
37
|
+
And the output should match /2020-10-29 00:00:00 \+[0-9]{4} myapp-vpc AWS::CloudFormation::Stack CREATE_COMPLETE/
|
@@ -62,5 +62,5 @@ Feature: Region aliases
|
|
62
62
|
| + "Vpc": { |
|
63
63
|
| Parameters diff: |
|
64
64
|
| KeyName: my-key |
|
65
|
-
|
65
|
+
And the output should match /2020-10-29 00:00:00 \+[0-9]{4} myapp-vpc AWS::CloudFormation::Stack CREATE_COMPLETE/
|
66
66
|
Then the exit status should be 0
|
data/lib/stack_master.rb
CHANGED
@@ -9,6 +9,7 @@ require 'active_support/core_ext/string'
|
|
9
9
|
require "erb"
|
10
10
|
require 'sparkle_formation'
|
11
11
|
require 'dotgpg'
|
12
|
+
require 'ruby-progressbar'
|
12
13
|
|
13
14
|
require "stack_master/ctrl_c"
|
14
15
|
require "stack_master/command"
|
@@ -29,6 +30,7 @@ require "stack_master/parameter_resolvers/stack_output"
|
|
29
30
|
require "stack_master/parameter_resolvers/secret"
|
30
31
|
require "stack_master/parameter_resolvers/sns_topic_name"
|
31
32
|
require "stack_master/parameter_resolvers/security_group"
|
33
|
+
require "stack_master/parameter_resolvers/latest_ami_by_tags"
|
32
34
|
require "stack_master/utils"
|
33
35
|
require "stack_master/config"
|
34
36
|
require "stack_master/stack_definition"
|
data/lib/stack_master/cli.rb
CHANGED
@@ -127,8 +127,15 @@ module StackMaster
|
|
127
127
|
say "Invalid arguments. stack_master delete [region] [stack_name]"
|
128
128
|
return
|
129
129
|
end
|
130
|
-
|
131
|
-
|
130
|
+
# Because delete can work without a stack_master.yml
|
131
|
+
if options.config and File.file?(options.config)
|
132
|
+
config = load_config(options.config)
|
133
|
+
region = Utils.underscore_to_hyphen(config.unalias_region(args[0]))
|
134
|
+
else
|
135
|
+
region = args[0]
|
136
|
+
end
|
137
|
+
StackMaster.cloud_formation_driver.set_region(region)
|
138
|
+
StackMaster::Commands::Delete.perform(region, args[1])
|
132
139
|
end
|
133
140
|
end
|
134
141
|
|
@@ -3,17 +3,31 @@ module StackMaster
|
|
3
3
|
class Status
|
4
4
|
include Command
|
5
5
|
|
6
|
-
def initialize(config)
|
6
|
+
def initialize(config, show_progress = true)
|
7
7
|
@config = config
|
8
|
+
@show_progress = show_progress
|
8
9
|
end
|
9
10
|
|
10
11
|
def perform
|
12
|
+
progress if @show_progress
|
13
|
+
status = @config.stacks.map do |stack_definition|
|
14
|
+
status = get_status(stack_definition)
|
15
|
+
progress.increment if @show_progress
|
16
|
+
status
|
17
|
+
end
|
11
18
|
tp.set :io, StackMaster.stdout
|
12
|
-
tp
|
19
|
+
tp status
|
20
|
+
StackMaster.stdout.puts " * No echo parameters can't be diffed"
|
13
21
|
end
|
14
22
|
|
15
23
|
private
|
16
24
|
|
25
|
+
def progress
|
26
|
+
@progress ||= ProgressBar.create(title: "Fetching stack information",
|
27
|
+
total: @config.stacks.size,
|
28
|
+
output: StackMaster.stdout)
|
29
|
+
end
|
30
|
+
|
17
31
|
def sort_params(hash)
|
18
32
|
hash.sort.to_h
|
19
33
|
end
|
@@ -30,6 +44,7 @@ module StackMaster
|
|
30
44
|
differ = StackMaster::StackDiffer.new(proposed_stack, stack)
|
31
45
|
different = differ.body_different? || differ.params_different?
|
32
46
|
stack_status = stack.stack_status
|
47
|
+
noecho = !differ.noecho_keys.empty?
|
33
48
|
else
|
34
49
|
different = true
|
35
50
|
stack_status = nil
|
@@ -39,7 +54,7 @@ module StackMaster
|
|
39
54
|
different = true
|
40
55
|
end
|
41
56
|
|
42
|
-
{ region: region, stack_name: stack_name, stack_status: stack_status, different: different ? "Yes" : "No" }
|
57
|
+
{ region: region, stack_name: stack_name, stack_status: stack_status, different: different ? "Yes" : (noecho ? "No *" : "No") }
|
43
58
|
end
|
44
59
|
|
45
60
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module StackMaster
|
2
|
+
module ParameterResolvers
|
3
|
+
class LatestAmiByTags
|
4
|
+
def initialize(config, stack_definition)
|
5
|
+
@config = config
|
6
|
+
@stack_definition = stack_definition
|
7
|
+
end
|
8
|
+
|
9
|
+
def resolve(value)
|
10
|
+
filters = build_filters(value)
|
11
|
+
find_latest_ami(filters).try(:image_id)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def ec2
|
17
|
+
@ec2 ||= Aws::EC2::Client.new(region: @stack_definition.region)
|
18
|
+
end
|
19
|
+
|
20
|
+
def build_filters(value)
|
21
|
+
value.split(',').map do |tag_with_value|
|
22
|
+
tag, value = tag_with_value.strip.split('=')
|
23
|
+
{ name: "tag:#{tag}", values: [value] }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_latest_ami(filters)
|
28
|
+
images = ec2.describe_images(filters: filters).images
|
29
|
+
sorted_images = images.sort do |a, b|
|
30
|
+
Time.parse(a.creation_date) <=> Time.parse(b.creation_date)
|
31
|
+
end
|
32
|
+
sorted_images.last
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -8,7 +8,6 @@ module StackMaster
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def find(reference)
|
11
|
-
STDERR.puts "Resolving security group reference '#{reference}'"
|
12
11
|
raise ArgumentError, 'Security group references must be non-empty strings' unless reference.is_a?(String) && !reference.empty?
|
13
12
|
|
14
13
|
groups = @resource.security_groups({
|
@@ -7,7 +7,6 @@ module StackMaster
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def find(reference)
|
10
|
-
$stderr.puts "Resolving SNS topic reference '#{reference}'"
|
11
10
|
raise ArgumentError, 'SNS topic references must be non-empty strings' unless reference.is_a?(String) && !reference.empty?
|
12
11
|
|
13
12
|
topic = @resource.topics.detect { |t| topic_name_from_arn(t.arn) == reference }
|
@@ -18,7 +18,14 @@ module StackMaster
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def proposed_parameters
|
21
|
-
|
21
|
+
# **** out any secret parameters in the current stack.
|
22
|
+
params = @proposed_stack.parameters_with_defaults
|
23
|
+
if @current_stack
|
24
|
+
noecho_keys.each do |key|
|
25
|
+
params[key] = "****"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
YAML.dump(sort_params(params))
|
22
29
|
end
|
23
30
|
|
24
31
|
def body_different?
|
@@ -33,6 +40,9 @@ module StackMaster
|
|
33
40
|
if @current_stack
|
34
41
|
text_diff('Stack', current_template, proposed_template, context: 7, include_diff_info: true)
|
35
42
|
text_diff('Parameters', current_parameters, proposed_parameters)
|
43
|
+
unless noecho_keys.empty?
|
44
|
+
StackMaster.stdout.puts " * can not tell if NoEcho parameters are different."
|
45
|
+
end
|
36
46
|
else
|
37
47
|
text_diff('Stack', '', proposed_template)
|
38
48
|
text_diff('Parameters', '', proposed_parameters)
|
@@ -40,6 +50,16 @@ module StackMaster
|
|
40
50
|
end
|
41
51
|
end
|
42
52
|
|
53
|
+
def noecho_keys
|
54
|
+
if @current_stack
|
55
|
+
@current_stack.parameters_with_defaults.select do |key, value|
|
56
|
+
value == "****"
|
57
|
+
end.keys
|
58
|
+
else
|
59
|
+
[]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
43
63
|
private
|
44
64
|
|
45
65
|
def text_diff(thing, current, proposed, diff_opts = {})
|
data/lib/stack_master/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
RSpec.describe StackMaster::Commands::Status do
|
2
|
-
subject(:status) { described_class.new(config) }
|
2
|
+
subject(:status) { described_class.new(config, false) }
|
3
3
|
let(:config) { instance_double(StackMaster::Config, stacks: stacks) }
|
4
4
|
let(:stacks) { [stack_definition_1, stack_definition_2] }
|
5
5
|
let(:stack_definition_1) { double(:stack_definition_1, region: 'us-east-1', stack_name: 'stack1') }
|
@@ -19,7 +19,7 @@ RSpec.describe StackMaster::Commands::Status do
|
|
19
19
|
let(:proposed_stack1) { double(:proposed_stack1, template_body: "{}", parameters_with_defaults: {a: 1}) }
|
20
20
|
let(:proposed_stack2) { double(:proposed_stack2, template_body: "{}", parameters_with_defaults: {a: 1}) }
|
21
21
|
it "returns the status of call stacks" do
|
22
|
-
out = "REGION | STACK_NAME | STACK_STATUS | DIFFERENT\n----------|------------|-----------------|----------\nus-east-1 | stack1 | UPDATE_COMPLETE | No \nus-east-1 | stack2 | CREATE_COMPLETE | Yes \n"
|
22
|
+
out = "REGION | STACK_NAME | STACK_STATUS | DIFFERENT\n----------|------------|-----------------|----------\nus-east-1 | stack1 | UPDATE_COMPLETE | No \nus-east-1 | stack2 | CREATE_COMPLETE | Yes \n * No echo parameters can't be diffed\n"
|
23
23
|
expect { status.perform }.to output(out).to_stdout
|
24
24
|
end
|
25
25
|
end
|
@@ -30,7 +30,7 @@ RSpec.describe StackMaster::Commands::Status do
|
|
30
30
|
let(:proposed_stack1) { double(:proposed_stack1, template_body: "{}", parameters_with_defaults: {a: 1}) }
|
31
31
|
let(:proposed_stack2) { double(:proposed_stack2, template_body: "{}", parameters_with_defaults: {a: 1}) }
|
32
32
|
it "returns the status of call stacks" do
|
33
|
-
out = "REGION | STACK_NAME | STACK_STATUS | DIFFERENT\n----------|------------|-----------------|----------\nus-east-1 | stack1 | UPDATE_COMPLETE | Yes \nus-east-1 | stack2 | CREATE_COMPLETE | No \n"
|
33
|
+
out = "REGION | STACK_NAME | STACK_STATUS | DIFFERENT\n----------|------------|-----------------|----------\nus-east-1 | stack1 | UPDATE_COMPLETE | Yes \nus-east-1 | stack2 | CREATE_COMPLETE | No \n * No echo parameters can't be diffed\n"
|
34
34
|
expect { status.perform }.to output(out).to_stdout
|
35
35
|
end
|
36
36
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
RSpec.describe StackMaster::ParameterResolvers::LatestAmiByTags do
|
2
|
+
let(:config) { double(base_dir: '/base') }
|
3
|
+
let(:stack_definition) { double(stack_name: 'mystack', region: 'us-east-1') }
|
4
|
+
subject(:resolver) { described_class.new(config, stack_definition) }
|
5
|
+
let(:ec2) { Aws::EC2::Client.new }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(Aws::EC2::Client).to receive(:new).and_return(ec2)
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when matches are found' do
|
12
|
+
before do
|
13
|
+
ec2.stub_responses(:describe_images, images: [
|
14
|
+
{ image_id: '1', creation_date: '2015-01-02 00:00:00', tags: [{ key: 'my-tag', value: 'my-value' }] },
|
15
|
+
{ image_id: '2', creation_date: '2015-01-03 00:00:00', tags: [{ key: 'my-tag', value: 'my-value' }] }
|
16
|
+
])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'returns the latest one' do
|
20
|
+
expect(resolver.resolve('my-tag=my-value')).to eq '2'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when no matches are found' do
|
25
|
+
before do
|
26
|
+
ec2.stub_responses(:describe_images, images: [])
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns nil' do
|
30
|
+
expect(resolver.resolve('my-tag=my-value')).to be_nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,17 +1,27 @@
|
|
1
1
|
RSpec.describe StackMaster::StackDiffer do
|
2
2
|
subject(:differ) { described_class.new(proposed_stack, stack) }
|
3
|
+
let(:current_params) { Hash.new }
|
4
|
+
let(:proposed_params) { { 'param1' => 'hello'} }
|
3
5
|
let(:stack) { StackMaster::Stack.new(stack_name: stack_name,
|
4
6
|
region: region,
|
5
7
|
stack_id: 123,
|
6
8
|
template_body: '{}',
|
7
|
-
parameters:
|
9
|
+
parameters: current_params) }
|
8
10
|
let(:proposed_stack) { StackMaster::Stack.new(stack_name: stack_name,
|
9
11
|
region: region,
|
10
|
-
parameters:
|
12
|
+
parameters: proposed_params,
|
11
13
|
template_body: "{\"a\": 1}") }
|
12
14
|
let(:stack_name) { 'myapp-vpc' }
|
13
15
|
let(:region) { 'us-east-1' }
|
14
16
|
|
17
|
+
describe "#proposed_parameters" do
|
18
|
+
let(:current_params) { { 'param1' => 'hello',
|
19
|
+
'param2' => '****'} }
|
20
|
+
it "stars out noecho params" do
|
21
|
+
expect(differ.proposed_parameters).to eq "---\nparam1: hello\nparam2: \"****\"\n"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
15
25
|
describe "#output_diff" do
|
16
26
|
context "entirely new stack" do
|
17
27
|
let(:stack) { nil }
|
@@ -12,7 +12,7 @@ RSpec.describe StackMaster::StackEvents::Presenter do
|
|
12
12
|
subject(:print_event) { described_class.print_event($stdout, event) }
|
13
13
|
|
14
14
|
it "nicely presents event data" do
|
15
|
-
expect { print_event }.to output("\e[0;33;49m2001-01-01 02:02:02
|
15
|
+
expect { print_event }.to output("\e[0;33;49m2001-01-01 02:02:02 #{Time.now.strftime('%z')} MyAwesomeQueue AWS::SQS::Queue CREATE_IN_PROGRESS Resource creation Initiated\e[0m\n").to_stdout
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/stack_master.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "cucumber"
|
26
26
|
spec.add_development_dependency "aruba"
|
27
27
|
spec.add_development_dependency "timecop"
|
28
|
+
spec.add_dependency "ruby-progressbar"
|
28
29
|
spec.add_dependency "commander"
|
29
30
|
spec.add_dependency "virtus"
|
30
31
|
spec.add_dependency "aws-sdk"
|
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
|
+
version: 0.0.2
|
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-11-
|
12
|
+
date: 2015-11-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -109,6 +109,20 @@ dependencies:
|
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: ruby-progressbar
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
112
126
|
- !ruby/object:Gem::Dependency
|
113
127
|
name: commander
|
114
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -302,6 +316,7 @@ files:
|
|
302
316
|
- lib/stack_master/ctrl_c.rb
|
303
317
|
- lib/stack_master/parameter_loader.rb
|
304
318
|
- lib/stack_master/parameter_resolver.rb
|
319
|
+
- lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb
|
305
320
|
- lib/stack_master/parameter_resolvers/secret.rb
|
306
321
|
- lib/stack_master/parameter_resolvers/security_group.rb
|
307
322
|
- lib/stack_master/parameter_resolvers/sns_topic_name.rb
|
@@ -338,6 +353,7 @@ files:
|
|
338
353
|
- spec/stack_master/config_spec.rb
|
339
354
|
- spec/stack_master/parameter_loader_spec.rb
|
340
355
|
- spec/stack_master/parameter_resolver_spec.rb
|
356
|
+
- spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
|
341
357
|
- spec/stack_master/parameter_resolvers/secret_spec.rb
|
342
358
|
- spec/stack_master/parameter_resolvers/security_group_spec.rb
|
343
359
|
- spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb
|
@@ -409,6 +425,7 @@ test_files:
|
|
409
425
|
- spec/stack_master/config_spec.rb
|
410
426
|
- spec/stack_master/parameter_loader_spec.rb
|
411
427
|
- spec/stack_master/parameter_resolver_spec.rb
|
428
|
+
- spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
|
412
429
|
- spec/stack_master/parameter_resolvers/secret_spec.rb
|
413
430
|
- spec/stack_master/parameter_resolvers/security_group_spec.rb
|
414
431
|
- spec/stack_master/parameter_resolvers/sns_topic_name_spec.rb
|