stack_master 1.15.0 → 1.16.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/README.md +21 -1
- data/lib/stack_master/stack.rb +1 -1
- data/lib/stack_master/stack_definition.rb +3 -0
- data/lib/stack_master/template_compiler.rb +12 -7
- data/lib/stack_master/template_compilers/cfndsl.rb +1 -1
- data/lib/stack_master/template_compilers/json.rb +1 -1
- data/lib/stack_master/template_compilers/sparkle_formation.rb +13 -5
- data/lib/stack_master/template_compilers/yaml.rb +1 -1
- data/lib/stack_master/validator.rb +1 -1
- data/lib/stack_master/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f64b125495590bdb3890f184b5ecb67e2b57d13d7e8cc023fb785a543e825e2c
|
4
|
+
data.tar.gz: 0f892956233a734941107967938357400c131d3280e687a5839531aa5dbaa275
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8fdc2f1e629e1620ef5144e5990706ff0e89f390df4cf3880671676bd6ef26091011d87adcdd55e21987311ff6c0cb8724dff58353e352e3e6531c8d915cf73
|
7
|
+
data.tar.gz: 026efc1dec847d78400ea70bf087d52a2601738145790b05d70cc77b6dbd5fde337872c6226fcacf52b5bd4c91f633755ff67147ff48d820ac1ed5626f8ea99f
|
data/README.md
CHANGED
@@ -570,7 +570,7 @@ stacks:
|
|
570
570
|
|
571
571
|
```yaml
|
572
572
|
stacks:
|
573
|
-
us-east-1
|
573
|
+
us-east-1:
|
574
574
|
my-stack:
|
575
575
|
template: my-stack-with-dynamic.rb
|
576
576
|
compiler_options:
|
@@ -588,6 +588,26 @@ end
|
|
588
588
|
|
589
589
|
Note though that if a dynamic with the same name exists in your `templates/dynamics/` directory it will get loaded since it has higher precedence.
|
590
590
|
|
591
|
+
Templates can be also loaded from sparkle packs by defining `sparkle_pack_template`. The name corresponds to the registered symbol rather than specific name. That means for a sparkle pack containing:
|
592
|
+
|
593
|
+
```ruby
|
594
|
+
SparkleFormation.new(:template_name) do
|
595
|
+
...
|
596
|
+
end
|
597
|
+
```
|
598
|
+
|
599
|
+
we can use stack defined as follows:
|
600
|
+
|
601
|
+
```yaml
|
602
|
+
stacks:
|
603
|
+
us-east-1:
|
604
|
+
my-stack:
|
605
|
+
sparkle_pack_template: template_name
|
606
|
+
compiler_options:
|
607
|
+
sparkle_packs:
|
608
|
+
- some-sparkle-pack
|
609
|
+
```
|
610
|
+
|
591
611
|
## Allowed accounts
|
592
612
|
|
593
613
|
The AWS account the command is executing in can be restricted to a specific list of allowed accounts. This is useful in reducing the possibility of applying non-production changes in a production account. Each stack definition can specify the `allowed_accounts` property with an array of AWS account IDs the stack is allowed to work with.
|
data/lib/stack_master/stack.rb
CHANGED
@@ -65,7 +65,7 @@ module StackMaster
|
|
65
65
|
parameter_hash = ParameterLoader.load(stack_definition.parameter_files)
|
66
66
|
template_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:template_parameters])
|
67
67
|
compile_time_parameters = ParameterResolver.resolve(config, stack_definition, parameter_hash[:compile_time_parameters])
|
68
|
-
template_body = TemplateCompiler.compile(config, stack_definition.template_file_path, compile_time_parameters, stack_definition.compiler_options)
|
68
|
+
template_body = TemplateCompiler.compile(config, stack_definition.template_dir, stack_definition.template_file_path, stack_definition.sparkle_pack_template, compile_time_parameters, stack_definition.compiler_options)
|
69
69
|
template_format = TemplateUtils.identify_template_format(template_body)
|
70
70
|
stack_policy_body = if stack_definition.stack_policy_file_path
|
71
71
|
File.read(stack_definition.stack_policy_file_path)
|
@@ -3,6 +3,7 @@ module StackMaster
|
|
3
3
|
attr_accessor :region,
|
4
4
|
:stack_name,
|
5
5
|
:template,
|
6
|
+
:sparkle_pack_template,
|
6
7
|
:tags,
|
7
8
|
:role_arn,
|
8
9
|
:allowed_accounts,
|
@@ -39,6 +40,7 @@ module StackMaster
|
|
39
40
|
@region == other.region &&
|
40
41
|
@stack_name == other.stack_name &&
|
41
42
|
@template == other.template &&
|
43
|
+
@sparkle_pack_template == other.sparkle_pack_template &&
|
42
44
|
@tags == other.tags &&
|
43
45
|
@role_arn == other.role_arn &&
|
44
46
|
@allowed_accounts == other.allowed_accounts &&
|
@@ -55,6 +57,7 @@ module StackMaster
|
|
55
57
|
end
|
56
58
|
|
57
59
|
def template_file_path
|
60
|
+
return unless template
|
58
61
|
File.expand_path(File.join(template_dir, template))
|
59
62
|
end
|
60
63
|
|
@@ -2,12 +2,12 @@ module StackMaster
|
|
2
2
|
class TemplateCompiler
|
3
3
|
TemplateCompilationFailed = Class.new(RuntimeError)
|
4
4
|
|
5
|
-
def self.compile(config, template_file_path, compile_time_parameters, compiler_options = {})
|
6
|
-
compiler =
|
5
|
+
def self.compile(config, template_dir, template_file_path, sparkle_pack_template, compile_time_parameters, compiler_options = {})
|
6
|
+
compiler = template_compiler_for_stack(template_file_path, sparkle_pack_template, config)
|
7
7
|
compiler.require_dependencies
|
8
|
-
compiler.compile(template_file_path, compile_time_parameters, compiler_options)
|
8
|
+
compiler.compile(template_dir, template_file_path, sparkle_pack_template, compile_time_parameters, compiler_options)
|
9
9
|
rescue StandardError => e
|
10
|
-
raise TemplateCompilationFailed.new("Failed to compile #{template_file_path} with error #{e}.\n#{e.backtrace}")
|
10
|
+
raise TemplateCompilationFailed.new("Failed to compile #{template_file_path || sparkle_pack_template} with error #{e}.\n#{e.backtrace}")
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.register(name, klass)
|
@@ -16,11 +16,16 @@ module StackMaster
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# private
|
19
|
-
def self.
|
20
|
-
|
19
|
+
def self.template_compiler_for_stack(template_file_path, sparkle_pack_template, config)
|
20
|
+
ext = if sparkle_pack_template
|
21
|
+
:rb
|
22
|
+
else
|
23
|
+
file_ext(template_file_path)
|
24
|
+
end
|
25
|
+
compiler_name = config.template_compilers.fetch(ext)
|
21
26
|
@compilers.fetch(compiler_name)
|
22
27
|
end
|
23
|
-
private_class_method :
|
28
|
+
private_class_method :template_compiler_for_stack
|
24
29
|
|
25
30
|
def self.file_ext(template_file_path)
|
26
31
|
File.extname(template_file_path).gsub('.', '').to_sym
|
@@ -4,7 +4,7 @@ module StackMaster::TemplateCompilers
|
|
4
4
|
require 'cfndsl'
|
5
5
|
end
|
6
6
|
|
7
|
-
def self.compile(template_file_path, compile_time_parameters, _compiler_options = {})
|
7
|
+
def self.compile(_template_dir, template_file_path, _sparkle_pack_template, compile_time_parameters, _compiler_options = {})
|
8
8
|
CfnDsl.disable_binding
|
9
9
|
CfnDsl::ExternalParameters.defaults.clear # Ensure there's no leakage across invocations
|
10
10
|
CfnDsl::ExternalParameters.defaults(compile_time_parameters.symbolize_keys)
|
@@ -7,7 +7,7 @@ module StackMaster::TemplateCompilers
|
|
7
7
|
require 'json'
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.compile(template_file_path, _compile_time_parameters, _compiler_options = {})
|
10
|
+
def self.compile(_template_dir, template_file_path, _sparkle_pack_template, _compile_time_parameters, _compiler_options = {})
|
11
11
|
template_body = File.read(template_file_path)
|
12
12
|
if template_body.size > MAX_TEMPLATE_SIZE
|
13
13
|
# Parse the json and rewrite compressed
|
@@ -12,8 +12,8 @@ module StackMaster::TemplateCompilers
|
|
12
12
|
require 'stack_master/sparkle_formation/template_file'
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.compile(template_file_path, compile_time_parameters, compiler_options = {})
|
16
|
-
sparkle_template = compile_sparkle_template(template_file_path, compiler_options)
|
15
|
+
def self.compile(template_dir, template_file_path, sparkle_pack_template, compile_time_parameters, compiler_options = {})
|
16
|
+
sparkle_template = compile_sparkle_template(template_dir, template_file_path, sparkle_pack_template, compiler_options)
|
17
17
|
definitions = sparkle_template.parameters
|
18
18
|
validate_definitions(definitions)
|
19
19
|
validate_parameters(definitions, compile_time_parameters)
|
@@ -27,9 +27,12 @@ module StackMaster::TemplateCompilers
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
def self.compile_sparkle_template(template_file_path, compiler_options)
|
31
|
-
sparkle_path = compiler_options['sparkle_path']
|
32
|
-
|
30
|
+
def self.compile_sparkle_template(template_dir, template_file_path, sparkle_pack_template, compiler_options)
|
31
|
+
sparkle_path = if compiler_options['sparkle_path']
|
32
|
+
File.expand_path(compiler_options['sparkle_path'])
|
33
|
+
else
|
34
|
+
template_dir
|
35
|
+
end
|
33
36
|
|
34
37
|
collection = ::SparkleFormation::SparkleCollection.new
|
35
38
|
root_pack = ::SparkleFormation::Sparkle.new(
|
@@ -44,6 +47,11 @@ module StackMaster::TemplateCompilers
|
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
50
|
+
if sparkle_pack_template
|
51
|
+
raise ArgumentError.new("Template #{sparkle_pack_template} not found in any sparkle pack") unless collection.templates['aws'].include? sparkle_pack_template
|
52
|
+
template_file_path = collection.templates['aws'][sparkle_pack_template].top['path']
|
53
|
+
end
|
54
|
+
|
47
55
|
sparkle_template = compile_template_with_sparkle_path(template_file_path, sparkle_path)
|
48
56
|
sparkle_template.sparkle.apply(collection)
|
49
57
|
sparkle_template
|
@@ -5,7 +5,7 @@ module StackMaster::TemplateCompilers
|
|
5
5
|
require 'json'
|
6
6
|
end
|
7
7
|
|
8
|
-
def self.compile(template_file_path, _compile_time_parameters, _compiler_options = {})
|
8
|
+
def self.compile(_template_dir, template_file_path, _sparkle_pack_template, _compile_time_parameters, _compiler_options = {})
|
9
9
|
File.read(template_file_path)
|
10
10
|
end
|
11
11
|
|
@@ -14,7 +14,7 @@ module StackMaster
|
|
14
14
|
compile_time_parameters = ParameterResolver.resolve(@config, @stack_definition, parameter_hash[:compile_time_parameters])
|
15
15
|
|
16
16
|
StackMaster.stdout.print "#{@stack_definition.stack_name}: "
|
17
|
-
template_body = TemplateCompiler.compile(@config, @stack_definition.template_file_path, compile_time_parameters, @stack_definition.compiler_options)
|
17
|
+
template_body = TemplateCompiler.compile(@config, @stack_definition.template_dir, @stack_definition.template_file_path, @stack_definition.sparkle_pack_template, compile_time_parameters, @stack_definition.compiler_options)
|
18
18
|
cf.validate_template(template_body: TemplateUtils.maybe_compressed_template_body(template_body))
|
19
19
|
StackMaster.stdout.puts "valid"
|
20
20
|
true
|
data/lib/stack_master/version.rb
CHANGED
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: 1.
|
4
|
+
version: 1.16.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: 2019-08-
|
12
|
+
date: 2019-08-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -529,7 +529,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
529
529
|
- !ruby/object:Gem::Version
|
530
530
|
version: '0'
|
531
531
|
requirements: []
|
532
|
-
|
532
|
+
rubyforge_project:
|
533
|
+
rubygems_version: 2.7.6.2
|
533
534
|
signing_key:
|
534
535
|
specification_version: 4
|
535
536
|
summary: StackMaster is a sure-footed way of creating, updating and keeping track
|