stack_master 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/features/apply.feature +9 -2
- data/lib/stack_master.rb +20 -1
- data/lib/stack_master/aws_driver/cloud_formation.rb +15 -35
- data/lib/stack_master/change_set.rb +104 -0
- data/lib/stack_master/cli.rb +3 -0
- data/lib/stack_master/command.rb +29 -3
- data/lib/stack_master/commands/apply.rb +54 -38
- data/lib/stack_master/commands/validate.rb +1 -1
- data/lib/stack_master/config.rb +10 -1
- data/lib/stack_master/paged_response_accumulator.rb +29 -0
- data/lib/stack_master/parameter_loader.rb +3 -0
- data/lib/stack_master/stack.rb +7 -1
- data/lib/stack_master/stack_events/fetcher.rb +1 -8
- data/lib/stack_master/template_compiler.rb +18 -14
- data/lib/stack_master/template_compilers/json.rb +18 -0
- data/lib/stack_master/template_compilers/sparkle_formation.rb +10 -0
- data/lib/stack_master/test_driver/cloud_formation.rb +33 -0
- data/lib/stack_master/validator.rb +5 -4
- data/lib/stack_master/version.rb +1 -1
- data/spec/stack_master/change_set_spec.rb +62 -0
- data/spec/stack_master/command_spec.rb +21 -1
- data/spec/stack_master/commands/apply_spec.rb +53 -9
- data/spec/stack_master/commands/validate_spec.rb +1 -1
- data/spec/stack_master/paged_response_accumulator_spec.rb +39 -0
- data/spec/stack_master/stack_events/fetcher_spec.rb +8 -33
- data/spec/stack_master/stack_spec.rb +19 -1
- data/spec/stack_master/template_compiler_spec.rb +12 -39
- data/spec/stack_master/template_compilers/json_spec.rb +29 -0
- data/spec/stack_master/template_compilers/sparkle_formation_spec.rb +22 -0
- data/spec/stack_master/test_driver/cloud_formation_spec.rb +39 -12
- data/spec/stack_master/validator_spec.rb +2 -1
- data/spec/stack_master_spec.rb +81 -0
- metadata +17 -3
@@ -18,7 +18,7 @@ RSpec.describe StackMaster::Commands::Validate do
|
|
18
18
|
describe "#perform" do
|
19
19
|
context "can find stack" do
|
20
20
|
it "calls the validator to validate the stack definition" do
|
21
|
-
expect(StackMaster::Validator).to receive(:valid?).with(stack_definition)
|
21
|
+
expect(StackMaster::Validator).to receive(:valid?).with(stack_definition, config)
|
22
22
|
validate.perform
|
23
23
|
end
|
24
24
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
RSpec.describe StackMaster::PagedResponseAccumulator do
|
2
|
+
let(:cf) { Aws::CloudFormation::Client.new }
|
3
|
+
subject(:accumulator) { described_class.new(cf, :describe_stack_events, { stack_name: 'blah' }, :stack_events) }
|
4
|
+
|
5
|
+
context 'with one page' do
|
6
|
+
let(:page_one_events) { [
|
7
|
+
{ event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
|
8
|
+
{ event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
|
9
|
+
] }
|
10
|
+
|
11
|
+
before do
|
12
|
+
cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: nil })
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'returns the first page' do
|
16
|
+
events = accumulator.call
|
17
|
+
expect(events.stack_events.count).to eq 2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with two pages' do
|
22
|
+
let(:page_one_events) { [
|
23
|
+
{ event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
|
24
|
+
{ event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
|
25
|
+
] }
|
26
|
+
let(:page_two_events) { [
|
27
|
+
{ event_id: '3', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
|
28
|
+
] }
|
29
|
+
|
30
|
+
before do
|
31
|
+
cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: 'blah' }, { stack_events: page_two_events } )
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns all the stack events combined' do
|
35
|
+
events = accumulator.call
|
36
|
+
expect(events.stack_events.count).to eq 3
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,46 +1,25 @@
|
|
1
1
|
RSpec.describe StackMaster::StackEvents::Fetcher do
|
2
2
|
let(:cf) { Aws::CloudFormation::Client.new }
|
3
|
+
let(:stack_name) { 'blah' }
|
3
4
|
|
4
5
|
before do
|
5
6
|
allow(Aws::CloudFormation::Client).to receive(:new).and_return(cf)
|
6
7
|
allow(StackMaster::StackEvents::Streamer).to receive(:stream)
|
8
|
+
allow(StackMaster::PagedResponseAccumulator).to receive(:call).with(StackMaster.cloud_formation_driver, :describe_stack_events, { stack_name: stack_name }, :stack_events).and_return(OpenStruct.new(stack_events: events))
|
7
9
|
end
|
8
10
|
|
9
11
|
context 'with 2 stack events' do
|
10
12
|
let(:events) { [
|
11
|
-
|
12
|
-
|
13
|
+
OpenStruct.new(event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now),
|
14
|
+
OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now)
|
13
15
|
] }
|
14
16
|
|
15
|
-
before do
|
16
|
-
cf.stub_responses(:describe_stack_events, stack_events: events)
|
17
|
-
end
|
18
|
-
|
19
17
|
it 'returns stack events' do
|
20
|
-
events = StackMaster::StackEvents::Fetcher.fetch(
|
18
|
+
events = StackMaster::StackEvents::Fetcher.fetch(stack_name, 'us-east-1')
|
21
19
|
expect(events.count).to eq 2
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
25
|
-
context 'when more than one page is present' do
|
26
|
-
let(:page_one_events) { [
|
27
|
-
{ event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: Time.now},
|
28
|
-
{ event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
|
29
|
-
] }
|
30
|
-
let(:page_two_events) { [
|
31
|
-
{ event_id: '3', stack_id: '1', stack_name: 'blah', timestamp: Time.now}
|
32
|
-
] }
|
33
|
-
|
34
|
-
before do
|
35
|
-
cf.stub_responses(:describe_stack_events, { stack_events: page_one_events, next_token: 'blah' }, { stack_events: page_two_events } )
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'returns all the stack events combined' do
|
39
|
-
events = StackMaster::StackEvents::Fetcher.fetch('blah', 'us-east-1')
|
40
|
-
expect(events.count).to eq 3
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
23
|
context 'filtering with a from timestamp' do
|
45
24
|
let(:two_pm) { Time.parse('2015-10-27 14:00') }
|
46
25
|
let(:three_pm) { Time.parse('2015-10-27 15:00') }
|
@@ -48,17 +27,13 @@ RSpec.describe StackMaster::StackEvents::Fetcher do
|
|
48
27
|
|
49
28
|
let(:events) {
|
50
29
|
[
|
51
|
-
|
52
|
-
|
30
|
+
OpenStruct.new(event_id: '1', stack_id: '1', stack_name: 'blah', timestamp: two_pm),
|
31
|
+
OpenStruct.new(event_id: '2', stack_id: '1', stack_name: 'blah', timestamp: four_pm),
|
53
32
|
]
|
54
33
|
}
|
55
34
|
|
56
|
-
before do
|
57
|
-
cf.stub_responses(:describe_stack_events, stack_events: events)
|
58
|
-
end
|
59
|
-
|
60
35
|
it 'only returns events after the timestamp' do
|
61
|
-
events = StackMaster::StackEvents::Fetcher.fetch(
|
36
|
+
events = StackMaster::StackEvents::Fetcher.fetch(stack_name, 'us-east-1', from: three_pm)
|
62
37
|
expect(events.map(&:event_id)).to eq ['2']
|
63
38
|
end
|
64
39
|
end
|
@@ -82,7 +82,7 @@ RSpec.describe StackMaster::Stack do
|
|
82
82
|
before do
|
83
83
|
allow(StackMaster::ParameterLoader).to receive(:load).and_return(parameter_hash)
|
84
84
|
allow(StackMaster::ParameterResolver).to receive(:resolve).and_return(resolved_parameters)
|
85
|
-
allow(StackMaster::TemplateCompiler).to receive(:compile).with(stack_definition.template_file_path).and_return(template_body)
|
85
|
+
allow(StackMaster::TemplateCompiler).to receive(:compile).with(config, stack_definition.template_file_path).and_return(template_body)
|
86
86
|
allow(File).to receive(:read).with(stack_definition.stack_policy_file_path).and_return(stack_policy_body)
|
87
87
|
end
|
88
88
|
|
@@ -154,4 +154,22 @@ RSpec.describe StackMaster::Stack do
|
|
154
154
|
expect(little_stack.too_big?).to be_falsey
|
155
155
|
end
|
156
156
|
end
|
157
|
+
|
158
|
+
describe '#missing_parameters?' do
|
159
|
+
subject { stack.missing_parameters? }
|
160
|
+
|
161
|
+
let(:stack) { StackMaster::Stack.new(parameters: parameters, template_body: '{}') }
|
162
|
+
|
163
|
+
context 'when a parameter has a nil value' do
|
164
|
+
let(:parameters) { { 'my_param' => nil } }
|
165
|
+
|
166
|
+
it { should eq true }
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'when no parameers have a nil value' do
|
170
|
+
let(:parameters) { { 'my_param' => '1' } }
|
171
|
+
|
172
|
+
it { should eq false }
|
173
|
+
end
|
174
|
+
end
|
157
175
|
end
|
@@ -1,47 +1,20 @@
|
|
1
1
|
RSpec.describe StackMaster::TemplateCompiler do
|
2
|
-
describe
|
3
|
-
|
4
|
-
|
5
|
-
end
|
6
|
-
|
7
|
-
context 'json template' do
|
8
|
-
let(:template_file_path) { '/base_dir/templates/template.json' }
|
9
|
-
|
10
|
-
context "small json template" do
|
11
|
-
before do
|
12
|
-
allow(File).to receive(:read).with(template_file_path).and_return('{ }')
|
13
|
-
end
|
14
|
-
|
15
|
-
it "reads from the template file path" do
|
16
|
-
expect(compile).to eq('{ }')
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'extra big json template' do
|
21
|
-
before do
|
22
|
-
allow(File).to receive(:read).with(template_file_path).and_return("{ #{' ' * 60000} }")
|
23
|
-
end
|
2
|
+
describe '.compile' do
|
3
|
+
let(:config) { double(template_compilers: { fab: :test_template_compiler }) }
|
4
|
+
let(:template_file_path) { '/base_dir/templates/template.fab' }
|
24
5
|
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|
6
|
+
class TestTemplateCompiler
|
7
|
+
def self.compile(template_file_path); end
|
29
8
|
end
|
30
9
|
|
31
|
-
context '
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
allow(SparkleFormation).to receive(:compile).with(template_file_path).and_return({})
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'compiles with sparkleformation' do
|
39
|
-
expect(compile).to eq("{\n}")
|
40
|
-
end
|
10
|
+
context 'when a template compiler is registered for the given file type' do
|
11
|
+
before {
|
12
|
+
StackMaster::TemplateCompiler.register(:test_template_compiler, TestTemplateCompiler)
|
13
|
+
}
|
41
14
|
|
42
|
-
it '
|
43
|
-
compile
|
44
|
-
|
15
|
+
it 'compiles the template using the relevant template compiler' do
|
16
|
+
expect(TestTemplateCompiler).to receive(:compile).with(template_file_path)
|
17
|
+
StackMaster::TemplateCompiler.compile(config, template_file_path)
|
45
18
|
end
|
46
19
|
end
|
47
20
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
RSpec.describe StackMaster::TemplateCompilers::Json do
|
2
|
+
describe '.compile' do
|
3
|
+
def compile
|
4
|
+
described_class.compile(template_file_path)
|
5
|
+
end
|
6
|
+
|
7
|
+
let(:template_file_path) { '/base_dir/templates/template.json' }
|
8
|
+
|
9
|
+
context "small json template" do
|
10
|
+
before do
|
11
|
+
allow(File).to receive(:read).with(template_file_path).and_return('{ }')
|
12
|
+
end
|
13
|
+
|
14
|
+
it "reads from the template file path" do
|
15
|
+
expect(compile).to eq('{ }')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'extra big json template' do
|
20
|
+
before do
|
21
|
+
allow(File).to receive(:read).with(template_file_path).and_return("{ #{' ' * 60000} }")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "reads from the template file path" do
|
25
|
+
expect(compile).to eq('{}')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
RSpec.describe StackMaster::TemplateCompilers::SparkleFormation do
|
2
|
+
describe '.compile' do
|
3
|
+
def compile
|
4
|
+
described_class.compile(template_file_path)
|
5
|
+
end
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(SparkleFormation).to receive(:compile).with(template_file_path).and_return({})
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:template_file_path) { '/base_dir/templates/template.rb' }
|
12
|
+
|
13
|
+
it 'compiles with sparkleformation' do
|
14
|
+
expect(compile).to eq("{\n}")
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'sets the appropriate sparkle_path' do
|
18
|
+
compile
|
19
|
+
expect(SparkleFormation.sparkle_path).to eq File.dirname(template_file_path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -3,22 +3,49 @@ require 'stack_master/test_driver/cloud_formation'
|
|
3
3
|
RSpec.describe StackMaster::TestDriver::CloudFormation do
|
4
4
|
subject(:test_cf_driver) { described_class.new }
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
context 'stacks' do
|
7
|
+
it 'creates and describes stacks' do
|
8
|
+
test_cf_driver.create_stack(stack_id: "1", stack_name: 'stack-1')
|
9
|
+
test_cf_driver.create_stack(stack_id: "2", stack_name: 'stack-2')
|
10
|
+
expect(test_cf_driver.describe_stacks.stacks.map(&:stack_id)).to eq(["1", "2"])
|
10
11
|
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'adds and gets stack events' do
|
15
|
+
test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE")
|
16
|
+
test_cf_driver.add_stack_event(stack_name: 'stack-1', resource_status: "UPDATE_COMPLETE")
|
17
|
+
test_cf_driver.add_stack_event(stack_name: 'stack-2')
|
18
|
+
expect(test_cf_driver.describe_stack_events(stack_name: 'stack-1').stack_events.map(&:stack_name)).to eq ['stack-1', 'stack-1']
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'sets and gets templates' do
|
22
|
+
test_cf_driver.set_template('stack-1', 'blah')
|
23
|
+
expect(test_cf_driver.get_template(stack_name: 'stack-1').template_body).to eq 'blah'
|
24
|
+
end
|
11
25
|
end
|
12
26
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
27
|
+
context 'change sets' do
|
28
|
+
it 'creates and describes change sets' do
|
29
|
+
change_set_id = test_cf_driver.create_change_set(
|
30
|
+
stack_name: 'stack-1',
|
31
|
+
change_set_name: 'change-set-1',
|
32
|
+
template_body: '{}',
|
33
|
+
parameters: [{ paramater_key: 'param_1', parameter_value: 'value_1'}]
|
34
|
+
).id
|
35
|
+
change_set = test_cf_driver.describe_change_set(change_set_name: change_set_id)
|
36
|
+
expect(change_set.change_set_id).to eq change_set_id
|
37
|
+
expect(change_set.change_set_name).to eq 'change-set-1'
|
38
|
+
change_set = test_cf_driver.describe_change_set(change_set_name: 'change-set-1')
|
39
|
+
expect(change_set.change_set_id).to eq change_set_id
|
40
|
+
expect(change_set.change_set_name).to eq 'change-set-1'
|
41
|
+
end
|
18
42
|
end
|
19
43
|
|
20
|
-
it '
|
21
|
-
test_cf_driver.
|
22
|
-
|
44
|
+
it 'deletes change sets' do
|
45
|
+
change_set_id = test_cf_driver.create_change_set(stack_name: '1', change_set_name: '2').id
|
46
|
+
test_cf_driver.delete_change_set(change_set_name: change_set_id)
|
47
|
+
expect {
|
48
|
+
test_cf_driver.describe_change_set(change_set_name: change_set_id)
|
49
|
+
}.to raise_error(KeyError)
|
23
50
|
end
|
24
51
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
RSpec.describe StackMaster::Validator do
|
2
2
|
|
3
|
-
subject(:validator) { described_class.new(stack_definition) }
|
3
|
+
subject(:validator) { described_class.new(stack_definition, config) }
|
4
|
+
let(:config) { StackMaster::Config.new({'stacks' => {}}, '/base_dir') }
|
4
5
|
let(:stack_definition) do
|
5
6
|
StackMaster::StackDefinition.new(
|
6
7
|
region: 'us-east-1',
|
@@ -0,0 +1,81 @@
|
|
1
|
+
RSpec.describe StackMaster do
|
2
|
+
describe '.debug' do
|
3
|
+
let(:message) { "Doing some stuff" }
|
4
|
+
|
5
|
+
context 'when debugging' do
|
6
|
+
before { allow(StackMaster).to receive(:debug?).and_return(true) }
|
7
|
+
|
8
|
+
it 'outputs the message to STDERR' do
|
9
|
+
expect { StackMaster.debug(message) }.to output(/\[DEBUG\] #{message}/).to_stderr
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'when not debugging' do
|
14
|
+
before { allow(StackMaster).to receive(:debug?).and_return(false) }
|
15
|
+
|
16
|
+
it "doesn't output the message to STDERR" do
|
17
|
+
expect { StackMaster.debug(message) }.to output("").to_stderr
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.debug?' do
|
23
|
+
subject { StackMaster.debug? }
|
24
|
+
|
25
|
+
context "when debug! isn't called" do
|
26
|
+
it { should eq false }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when debug! is called' do
|
30
|
+
before { StackMaster.debug! }
|
31
|
+
|
32
|
+
it { should eq true }
|
33
|
+
|
34
|
+
after { StackMaster.instance_variable_set('@debug', false) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '.interactive?' do
|
39
|
+
subject { StackMaster.interactive? }
|
40
|
+
|
41
|
+
context "when non_interactive! isn't called" do
|
42
|
+
it { should eq true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when non_interactive! is called' do
|
46
|
+
before { StackMaster.non_interactive! }
|
47
|
+
|
48
|
+
it { should eq false }
|
49
|
+
|
50
|
+
after { StackMaster.instance_variable_set('@non_interactive', false) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.non_interactive?' do
|
55
|
+
subject { StackMaster.non_interactive? }
|
56
|
+
|
57
|
+
context "when non_interactive! isn't called" do
|
58
|
+
it { should eq false }
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when non_interactive! is called' do
|
62
|
+
before { StackMaster.non_interactive! }
|
63
|
+
|
64
|
+
it { should eq true }
|
65
|
+
|
66
|
+
after { StackMaster.instance_variable_set('@non_interactive', false) }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '.non_interactive_answer' do
|
71
|
+
it 'defaults to y' do
|
72
|
+
expect(StackMaster.non_interactive_answer).to eq 'y'
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'can be overridden' do
|
76
|
+
StackMaster.non_interactive_answer = 'n'
|
77
|
+
expect(StackMaster.non_interactive_answer).to eq 'n'
|
78
|
+
StackMaster.instance_variable_set('@non_interactive_answer', 'y')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
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.
|
4
|
+
version: 0.3.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: 2016-03-
|
12
|
+
date: 2016-03-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -302,6 +302,7 @@ files:
|
|
302
302
|
- features/validate.feature
|
303
303
|
- lib/stack_master.rb
|
304
304
|
- lib/stack_master/aws_driver/cloud_formation.rb
|
305
|
+
- lib/stack_master/change_set.rb
|
305
306
|
- lib/stack_master/cli.rb
|
306
307
|
- lib/stack_master/command.rb
|
307
308
|
- lib/stack_master/commands/apply.rb
|
@@ -317,6 +318,7 @@ files:
|
|
317
318
|
- lib/stack_master/commands/validate.rb
|
318
319
|
- lib/stack_master/config.rb
|
319
320
|
- lib/stack_master/ctrl_c.rb
|
321
|
+
- lib/stack_master/paged_response_accumulator.rb
|
320
322
|
- lib/stack_master/parameter_loader.rb
|
321
323
|
- lib/stack_master/parameter_resolver.rb
|
322
324
|
- lib/stack_master/parameter_resolvers/latest_ami_by_tags.rb
|
@@ -337,6 +339,8 @@ files:
|
|
337
339
|
- lib/stack_master/stack_states.rb
|
338
340
|
- lib/stack_master/stack_status.rb
|
339
341
|
- lib/stack_master/template_compiler.rb
|
342
|
+
- lib/stack_master/template_compilers/json.rb
|
343
|
+
- lib/stack_master/template_compilers/sparkle_formation.rb
|
340
344
|
- lib/stack_master/test_driver/cloud_formation.rb
|
341
345
|
- lib/stack_master/testing.rb
|
342
346
|
- lib/stack_master/utils.rb
|
@@ -350,6 +354,7 @@ files:
|
|
350
354
|
- spec/fixtures/stack_master.yml
|
351
355
|
- spec/fixtures/templates/myapp_vpc.json
|
352
356
|
- spec/spec_helper.rb
|
357
|
+
- spec/stack_master/change_set_spec.rb
|
353
358
|
- spec/stack_master/command_spec.rb
|
354
359
|
- spec/stack_master/commands/apply_spec.rb
|
355
360
|
- spec/stack_master/commands/delete_spec.rb
|
@@ -357,6 +362,7 @@ files:
|
|
357
362
|
- spec/stack_master/commands/status_spec.rb
|
358
363
|
- spec/stack_master/commands/validate_spec.rb
|
359
364
|
- spec/stack_master/config_spec.rb
|
365
|
+
- spec/stack_master/paged_response_accumulator_spec.rb
|
360
366
|
- spec/stack_master/parameter_loader_spec.rb
|
361
367
|
- spec/stack_master/parameter_resolver_spec.rb
|
362
368
|
- spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
|
@@ -376,9 +382,12 @@ files:
|
|
376
382
|
- spec/stack_master/stack_events/streamer_spec.rb
|
377
383
|
- spec/stack_master/stack_spec.rb
|
378
384
|
- spec/stack_master/template_compiler_spec.rb
|
385
|
+
- spec/stack_master/template_compilers/json_spec.rb
|
386
|
+
- spec/stack_master/template_compilers/sparkle_formation_spec.rb
|
379
387
|
- spec/stack_master/test_driver/cloud_formation_spec.rb
|
380
388
|
- spec/stack_master/utils_spec.rb
|
381
389
|
- spec/stack_master/validator_spec.rb
|
390
|
+
- spec/stack_master_spec.rb
|
382
391
|
- stack_master.gemspec
|
383
392
|
- stacktemplates/parameter_region.yml
|
384
393
|
- stacktemplates/parameter_stack_name.yml
|
@@ -404,7 +413,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
404
413
|
version: '0'
|
405
414
|
requirements: []
|
406
415
|
rubyforge_project:
|
407
|
-
rubygems_version: 2.
|
416
|
+
rubygems_version: 2.5.1
|
408
417
|
signing_key:
|
409
418
|
specification_version: 4
|
410
419
|
summary: StackMaster is a sure-footed way of creating, updating and keeping track
|
@@ -427,6 +436,7 @@ test_files:
|
|
427
436
|
- spec/fixtures/stack_master.yml
|
428
437
|
- spec/fixtures/templates/myapp_vpc.json
|
429
438
|
- spec/spec_helper.rb
|
439
|
+
- spec/stack_master/change_set_spec.rb
|
430
440
|
- spec/stack_master/command_spec.rb
|
431
441
|
- spec/stack_master/commands/apply_spec.rb
|
432
442
|
- spec/stack_master/commands/delete_spec.rb
|
@@ -434,6 +444,7 @@ test_files:
|
|
434
444
|
- spec/stack_master/commands/status_spec.rb
|
435
445
|
- spec/stack_master/commands/validate_spec.rb
|
436
446
|
- spec/stack_master/config_spec.rb
|
447
|
+
- spec/stack_master/paged_response_accumulator_spec.rb
|
437
448
|
- spec/stack_master/parameter_loader_spec.rb
|
438
449
|
- spec/stack_master/parameter_resolver_spec.rb
|
439
450
|
- spec/stack_master/parameter_resolvers/latest_ami_by_tag_spec.rb
|
@@ -453,6 +464,9 @@ test_files:
|
|
453
464
|
- spec/stack_master/stack_events/streamer_spec.rb
|
454
465
|
- spec/stack_master/stack_spec.rb
|
455
466
|
- spec/stack_master/template_compiler_spec.rb
|
467
|
+
- spec/stack_master/template_compilers/json_spec.rb
|
468
|
+
- spec/stack_master/template_compilers/sparkle_formation_spec.rb
|
456
469
|
- spec/stack_master/test_driver/cloud_formation_spec.rb
|
457
470
|
- spec/stack_master/utils_spec.rb
|
458
471
|
- spec/stack_master/validator_spec.rb
|
472
|
+
- spec/stack_master_spec.rb
|