sparkle_formation 3.0.26 → 3.0.28
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +6 -0
- data/lib/sparkle_formation/composition.rb +17 -17
- data/lib/sparkle_formation/error.rb +2 -5
- data/lib/sparkle_formation/function_struct.rb +27 -31
- data/lib/sparkle_formation/provider/aws.rb +32 -31
- data/lib/sparkle_formation/provider/azure.rb +18 -19
- data/lib/sparkle_formation/provider/google.rb +20 -22
- data/lib/sparkle_formation/provider/heat.rb +17 -17
- data/lib/sparkle_formation/provider/terraform.rb +14 -15
- data/lib/sparkle_formation/provider.rb +0 -2
- data/lib/sparkle_formation/resources/aws.rb +129 -149
- data/lib/sparkle_formation/resources/aws_resources.json +9208 -5542
- data/lib/sparkle_formation/resources/azure.rb +2 -5
- data/lib/sparkle_formation/resources/azure_resources.json +12367 -2901
- data/lib/sparkle_formation/resources/google.rb +1 -4
- data/lib/sparkle_formation/resources/heat.rb +0 -4
- data/lib/sparkle_formation/resources/heat_resources.json +2616 -2062
- data/lib/sparkle_formation/resources/rackspace.rb +0 -4
- data/lib/sparkle_formation/resources/terraform.rb +2 -6
- data/lib/sparkle_formation/resources.rb +20 -24
- data/lib/sparkle_formation/sparkle.rb +56 -66
- data/lib/sparkle_formation/sparkle_attribute/aws.rb +61 -34
- data/lib/sparkle_formation/sparkle_attribute/azure.rb +12 -8
- data/lib/sparkle_formation/sparkle_attribute/google.rb +18 -15
- data/lib/sparkle_formation/sparkle_attribute/heat.rb +22 -7
- data/lib/sparkle_formation/sparkle_attribute/rackspace.rb +0 -2
- data/lib/sparkle_formation/sparkle_attribute/terraform.rb +11 -5
- data/lib/sparkle_formation/sparkle_attribute.rb +13 -7
- data/lib/sparkle_formation/sparkle_collection/rainbow.rb +5 -7
- data/lib/sparkle_formation/sparkle_collection.rb +13 -15
- data/lib/sparkle_formation/sparkle_formation.rb +116 -112
- data/lib/sparkle_formation/sparkle_struct.rb +30 -24
- data/lib/sparkle_formation/translation/heat.rb +57 -58
- data/lib/sparkle_formation/translation/rackspace.rb +48 -49
- data/lib/sparkle_formation/translation.rb +34 -37
- data/lib/sparkle_formation/utils.rb +6 -13
- data/lib/sparkle_formation/version.rb +1 -1
- data/sparkle_formation.gemspec +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 19b9bff2dd1817a3ea403221d40cdcd9b6f8b8f999670f3a1baa37a36cd0ab9c
|
4
|
+
data.tar.gz: 5c0627a7fcc3cb91c68a7576276d8c6431632111cd1b7a0a4135fe68fea1d346
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 382e8fbc12ed460abedd332e734902dff596a2a86b52606a4950c6c7bd64cf8ea591ad3e4a6baa23c12ef65171f62cdafa6d89901710bc04ad7fd6181dd57421
|
7
|
+
data.tar.gz: 3cac5a75ec2fe95ad0a67284a0db2bc7cd1b7679a0a117ce6c10f6c41998ed4e247883bfc441519501f6be71b4810e4022c488c229d1ed85d840cf21f81bc235
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# v3.0.28
|
2
|
+
* Fix sub! when no hash is provided (#236)
|
3
|
+
* Only run template extraction when required
|
4
|
+
* Use explicit type checks when searching for nested stacks
|
5
|
+
* Fix output bubbling to use proper nil checking
|
6
|
+
|
1
7
|
# v3.0.26
|
2
8
|
* Allow Fn::Sub helper to accept no arguments
|
3
9
|
* Fix Ruby 2.4 deprecation warnings
|
@@ -24,10 +24,10 @@ class SparkleFormation
|
|
24
24
|
# @option args [Array<Component>] :components seed components for composition
|
25
25
|
# @option args [Array<Override>] :overrides seed overrides for composition
|
26
26
|
# @return [self]
|
27
|
-
def initialize(origin, args={})
|
28
|
-
unless
|
27
|
+
def initialize(origin, args = {})
|
28
|
+
unless origin.is_a?(SparkleFormation)
|
29
29
|
raise TypeError.new 'Composition requires `SparkleFormation` instance as origin. ' \
|
30
|
-
|
30
|
+
"Received origin type `#{origin.class}`."
|
31
31
|
end
|
32
32
|
@origin = origin
|
33
33
|
@components_list = []
|
@@ -62,11 +62,11 @@ class SparkleFormation
|
|
62
62
|
# @param item [Component, Override]
|
63
63
|
# @param location [Symbol] :prepend or :append (defaults to :append)
|
64
64
|
# @return [self]
|
65
|
-
def add_component(item, location
|
66
|
-
unless
|
65
|
+
def add_component(item, location = :append)
|
66
|
+
unless item.is_a?(Component) || item.is_a?(Override)
|
67
67
|
raise TypeError.new("Expecting `Component` or `Override` but received `#{item.class}`")
|
68
68
|
end
|
69
|
-
if
|
69
|
+
if item.respond_to?(:key) && component_keys.include?(item.key)
|
70
70
|
# do nothing
|
71
71
|
else
|
72
72
|
case location
|
@@ -76,7 +76,7 @@ class SparkleFormation
|
|
76
76
|
components_list.unshift(item)
|
77
77
|
else
|
78
78
|
raise ArgumentError.new 'Unknown addition location provided. Valid: `:append, :prepend`. ' \
|
79
|
-
|
79
|
+
"Received: `#{location.inspect}`"
|
80
80
|
end
|
81
81
|
end
|
82
82
|
self
|
@@ -87,8 +87,8 @@ class SparkleFormation
|
|
87
87
|
# @param item [Override]
|
88
88
|
# @param location [Symbol] :prepend or :append (defaults to :append)
|
89
89
|
# @return [self]
|
90
|
-
def add_override(item, location
|
91
|
-
unless
|
90
|
+
def add_override(item, location = :append)
|
91
|
+
unless item.is_a?(Override)
|
92
92
|
raise TypeError.new("Expecting `Override` but received `#{item.class}`")
|
93
93
|
end
|
94
94
|
case location
|
@@ -98,7 +98,7 @@ class SparkleFormation
|
|
98
98
|
overrides_list.unshift(item)
|
99
99
|
else
|
100
100
|
raise ArgumentError.new 'Unknown addition location provided. Valid: ' \
|
101
|
-
|
101
|
+
"`:append, :prepend`. Received: `#{location.inspect}`"
|
102
102
|
end
|
103
103
|
self
|
104
104
|
end
|
@@ -109,7 +109,7 @@ class SparkleFormation
|
|
109
109
|
# @param location [Symbol] :prepend or :append (defaults to :append)
|
110
110
|
# @yield component block (optional)
|
111
111
|
# @return [self]
|
112
|
-
def new_component(key, location
|
112
|
+
def new_component(key, location = :append, &block)
|
113
113
|
comp = Component.new(origin, key, block)
|
114
114
|
add_component(comp, location)
|
115
115
|
self
|
@@ -121,8 +121,8 @@ class SparkleFormation
|
|
121
121
|
# @param location [Symbol] :prepend or :append (defaults to :append)
|
122
122
|
# @yield override block
|
123
123
|
# @return [self]
|
124
|
-
def new_override(args={}, location
|
125
|
-
if
|
124
|
+
def new_override(args = {}, location = :append, &block)
|
125
|
+
if args.is_a?(Symbol)
|
126
126
|
location = args
|
127
127
|
args = {}
|
128
128
|
end
|
@@ -137,7 +137,7 @@ class SparkleFormation
|
|
137
137
|
# @yieldparam [Component, Override]
|
138
138
|
# @return [self]
|
139
139
|
def each
|
140
|
-
if
|
140
|
+
if block_given?
|
141
141
|
composite.each do |item|
|
142
142
|
yield item
|
143
143
|
end
|
@@ -162,14 +162,14 @@ class SparkleFormation
|
|
162
162
|
# @return [Array]
|
163
163
|
def seed_value(items, type)
|
164
164
|
type = [type].flatten.compact
|
165
|
-
if
|
165
|
+
if items
|
166
166
|
items.each do |item|
|
167
167
|
valid_item = type.any? do |klass|
|
168
168
|
item.is_a?(klass)
|
169
169
|
end
|
170
|
-
unless
|
170
|
+
unless valid_item
|
171
171
|
raise TypeError.new "Invalid type encountered within collection `#{item.class}`. " \
|
172
|
-
|
172
|
+
"Expected `#{type.map(&:to_s).join('`, `')}`."
|
173
173
|
end
|
174
174
|
end
|
175
175
|
items.dup
|
@@ -16,7 +16,7 @@ class SparkleFormation
|
|
16
16
|
attr_reader :name
|
17
17
|
|
18
18
|
def initialize(*args)
|
19
|
-
opts = args.detect{|o| o.is_a?(Hash)}
|
19
|
+
opts = args.detect { |o| o.is_a?(Hash) }
|
20
20
|
args.delete(opts) if opts
|
21
21
|
super(args)
|
22
22
|
@name = opts[:name] if opts
|
@@ -24,7 +24,7 @@ class SparkleFormation
|
|
24
24
|
|
25
25
|
# @return [String] customized message including name
|
26
26
|
def to_s
|
27
|
-
if
|
27
|
+
if name
|
28
28
|
"Failed to locate item named: `#{name}`"
|
29
29
|
else
|
30
30
|
'Failed to locate item'
|
@@ -39,12 +39,9 @@ class SparkleFormation
|
|
39
39
|
|
40
40
|
# Template internals
|
41
41
|
class Resource < NotFound; end
|
42
|
-
|
43
42
|
end
|
44
43
|
|
45
44
|
# Deprecation error
|
46
45
|
class Deprecated < Error; end
|
47
|
-
|
48
46
|
end
|
49
|
-
|
50
47
|
end
|
@@ -16,12 +16,12 @@ class SparkleFormation
|
|
16
16
|
# @param f_name [String] name of function
|
17
17
|
# @param args [Array<Object>] argument list
|
18
18
|
# @return [self]
|
19
|
-
def initialize(f_name=nil, *args)
|
19
|
+
def initialize(f_name = nil, *args)
|
20
20
|
super()
|
21
21
|
@_fn_name = f_name.to_s
|
22
22
|
@_fn_args = args
|
23
23
|
@_fn_args.map! do |l_arg|
|
24
|
-
if
|
24
|
+
if l_arg.is_a?(_klass)
|
25
25
|
l_arg = l_arg._root
|
26
26
|
l_arg._parent(self)
|
27
27
|
end
|
@@ -33,13 +33,13 @@ class SparkleFormation
|
|
33
33
|
def _clone(*_)
|
34
34
|
new_inst = _klass_new(_fn_name, *_fn_args)
|
35
35
|
new_inst._data.replace(__hashish[
|
36
|
-
@table.map{ |_key, _value|
|
37
|
-
if
|
36
|
+
@table.map { |_key, _value|
|
37
|
+
if _key.is_a?(::AttributeStruct)
|
38
38
|
_key = _key._clone
|
39
39
|
else
|
40
40
|
_key = _do_dup(_key)
|
41
41
|
end
|
42
|
-
if
|
42
|
+
if _value.is_a?(::AttributeStruct)
|
43
43
|
_value = _value._clone
|
44
44
|
else
|
45
45
|
_value = _do_dup(_value)
|
@@ -57,7 +57,7 @@ class SparkleFormation
|
|
57
57
|
|
58
58
|
# @return [TrueClass, FalseClass]
|
59
59
|
def eql?(_other)
|
60
|
-
if
|
60
|
+
if _other.respond_to?(:_dump) && _other.respond_to?(:_parent)
|
61
61
|
::MultiJson.dump(_dump).hash ==
|
62
62
|
::MultiJson.dump(_other._dump).hash &&
|
63
63
|
_parent == _other._parent
|
@@ -88,7 +88,7 @@ class SparkleFormation
|
|
88
88
|
# @param args [Object<Array>] argument list
|
89
89
|
# @return [Object]
|
90
90
|
def method_missing(name, *args)
|
91
|
-
if
|
91
|
+
if args.empty?
|
92
92
|
super
|
93
93
|
else
|
94
94
|
@table['_function_'] = _klass_new(name, *args)
|
@@ -100,7 +100,7 @@ class SparkleFormation
|
|
100
100
|
# @param val [Integer, String]
|
101
101
|
# @return [FunctionStruct]
|
102
102
|
def [](val)
|
103
|
-
if
|
103
|
+
if val.is_a?(::String) && __single_quote_strings
|
104
104
|
_set("['#{val}']")
|
105
105
|
else
|
106
106
|
_set("[#{val.inspect}]")
|
@@ -111,39 +111,39 @@ class SparkleFormation
|
|
111
111
|
#
|
112
112
|
# @return [String]
|
113
113
|
def _dump
|
114
|
-
unless
|
114
|
+
unless @table.empty?
|
115
115
|
key, value = @table.first
|
116
116
|
suffix = _eval_join(
|
117
117
|
*[
|
118
|
-
|
119
|
-
|
120
|
-
|
118
|
+
key == '_function_' ? nil : key,
|
119
|
+
!value.nil? ? value._dump : nil,
|
120
|
+
].compact
|
121
121
|
)
|
122
122
|
end
|
123
|
-
if
|
123
|
+
if _fn_name
|
124
124
|
args = _fn_args.map do |arg|
|
125
|
-
if
|
125
|
+
if arg.respond_to?(:_dump)
|
126
126
|
arg._dump
|
127
|
-
elsif
|
127
|
+
elsif arg.is_a?(::Symbol)
|
128
128
|
quote = __single_quote_strings ? "'" : '"'
|
129
129
|
"#{quote}#{::Bogo::Utility.camel(arg.to_s, false)}#{quote}"
|
130
|
-
elsif
|
130
|
+
elsif arg.is_a?(::String) && __single_quote_strings
|
131
131
|
"'#{arg}'"
|
132
132
|
else
|
133
133
|
arg.inspect
|
134
134
|
end
|
135
135
|
end.join(', ')
|
136
|
-
unless
|
136
|
+
unless _fn_name.to_s.empty?
|
137
137
|
function_name = args.empty? ? "#{_fn_name}#{__empty_argument_list}" : "#{_fn_name}(#{args})"
|
138
138
|
end
|
139
139
|
internal = _eval_join(
|
140
140
|
*[
|
141
|
-
|
142
|
-
|
143
|
-
|
141
|
+
function_name,
|
142
|
+
suffix,
|
143
|
+
].compact
|
144
144
|
)
|
145
|
-
if
|
146
|
-
if
|
145
|
+
if root? || (!__single_anchor? && function_name)
|
146
|
+
if !root? && __quote_nested_funcs?
|
147
147
|
quote = __single_quote_strings ? "'" : '"'
|
148
148
|
end
|
149
149
|
"#{quote}#{__anchor_start}#{internal}#{__anchor_stop}#{quote}"
|
@@ -154,6 +154,7 @@ class SparkleFormation
|
|
154
154
|
suffix
|
155
155
|
end
|
156
156
|
end
|
157
|
+
|
157
158
|
alias_method :_sparkle_dump, :_dump
|
158
159
|
|
159
160
|
# Join arguments into a string for remote evaluation
|
@@ -162,9 +163,9 @@ class SparkleFormation
|
|
162
163
|
# @return [String]
|
163
164
|
def _eval_join(*args)
|
164
165
|
args = args.compact
|
165
|
-
args.delete_if
|
166
|
+
args.delete_if &:empty?
|
166
167
|
args.slice(1, args.size).to_a.inject(args.first) do |memo, item|
|
167
|
-
if
|
168
|
+
if item.start_with?('[')
|
168
169
|
memo += item
|
169
170
|
else
|
170
171
|
memo += ".#{item}"
|
@@ -215,7 +216,6 @@ class SparkleFormation
|
|
215
216
|
def __single_quote_strings
|
216
217
|
true
|
217
218
|
end
|
218
|
-
|
219
219
|
end
|
220
220
|
|
221
221
|
# Function struct specialized for Azure variables to check nested
|
@@ -236,14 +236,14 @@ class SparkleFormation
|
|
236
236
|
# the function if found.
|
237
237
|
def _dump
|
238
238
|
# Remap nested function keys if possible
|
239
|
-
if
|
239
|
+
if _fn_context && _fn_context.root!.data![_fn_name] && _fn_context.root!.data![_fn_name].data![_fn_args.first]
|
240
240
|
__valid_keys = _fn_context.root!.data![_fn_name].data![_fn_args.first].keys!
|
241
241
|
__current_key = @table.keys.first
|
242
242
|
__match_key = __current_key.to_s.downcase.gsub('_', '')
|
243
243
|
__key_remap = __valid_keys.detect do |__nested_key|
|
244
244
|
__nested_key.to_s.downcase.gsub('_', '') == __match_key
|
245
245
|
end
|
246
|
-
if
|
246
|
+
if __key_remap
|
247
247
|
@table[__key_remap] = @table.delete(@table.keys.first)
|
248
248
|
end
|
249
249
|
end
|
@@ -283,7 +283,6 @@ class SparkleFormation
|
|
283
283
|
def _klass
|
284
284
|
::SparkleFormation::JinjaExpressionStruct
|
285
285
|
end
|
286
|
-
|
287
286
|
end
|
288
287
|
|
289
288
|
# FunctionStruct for jinja statements
|
@@ -313,7 +312,6 @@ class SparkleFormation
|
|
313
312
|
def _klass
|
314
313
|
::SparkleFormation::JinjaStatementStruct
|
315
314
|
end
|
316
|
-
|
317
315
|
end
|
318
316
|
|
319
317
|
# FunctionStruct for customized google functions
|
@@ -343,7 +341,6 @@ class SparkleFormation
|
|
343
341
|
def _klass
|
344
342
|
::SparkleFormation::GoogleStruct
|
345
343
|
end
|
346
|
-
|
347
344
|
end
|
348
345
|
|
349
346
|
# FunctionStruct for customized terraform functions
|
@@ -382,6 +379,5 @@ class SparkleFormation
|
|
382
379
|
def _klass
|
383
380
|
::SparkleFormation::TerraformStruct
|
384
381
|
end
|
385
|
-
|
386
382
|
end
|
387
383
|
end
|
@@ -17,13 +17,13 @@ class SparkleFormation
|
|
17
17
|
statements = []
|
18
18
|
compile.resources.keys!.each do |r_name|
|
19
19
|
r_object = compile.resources[r_name]
|
20
|
-
if
|
20
|
+
if r_object['Policy']
|
21
21
|
r_object['Policy'].keys!.each do |effect|
|
22
22
|
statements.push(
|
23
23
|
'Effect' => effect.to_s.capitalize,
|
24
|
-
'Action' => [r_object['Policy'][effect]].flatten.compact.map{|i| "Update:#{i}"},
|
24
|
+
'Action' => [r_object['Policy'][effect]].flatten.compact.map { |i| "Update:#{i}" },
|
25
25
|
'Resource' => "LogicalResourceId/#{r_name}",
|
26
|
-
'Principal' => '*'
|
26
|
+
'Principal' => '*',
|
27
27
|
)
|
28
28
|
end
|
29
29
|
r_object.delete!('Policy')
|
@@ -33,7 +33,7 @@ class SparkleFormation
|
|
33
33
|
'Effect' => 'Allow',
|
34
34
|
'Action' => 'Update:*',
|
35
35
|
'Resource' => '*',
|
36
|
-
'Principal' => '*'
|
36
|
+
'Principal' => '*',
|
37
37
|
)
|
38
38
|
Smash.new('Statement' => statements)
|
39
39
|
end
|
@@ -51,15 +51,15 @@ class SparkleFormation
|
|
51
51
|
def apply_deep_nesting(*args, &block)
|
52
52
|
outputs = collect_outputs
|
53
53
|
nested_stacks(:with_resource).each do |stack, resource|
|
54
|
-
unless
|
54
|
+
unless stack.nested_stacks.empty?
|
55
55
|
stack.apply_deep_nesting(*args)
|
56
56
|
end
|
57
|
-
unless
|
57
|
+
unless stack.root?
|
58
58
|
stack.compile.parameters.keys!.each do |parameter_name|
|
59
59
|
next if stack.compile.parameters.set!(parameter_name).stack_unique == true
|
60
|
-
if
|
60
|
+
if !stack.parent.compile.parameters.data![parameter_name].nil?
|
61
61
|
resource.properties.parameters.set!(parameter_name, resource.ref!(parameter_name))
|
62
|
-
elsif
|
62
|
+
elsif output_name = output_matched?(parameter_name, outputs.keys)
|
63
63
|
next if outputs[output_name] == stack
|
64
64
|
stack_output = stack.make_output_available(output_name, outputs)
|
65
65
|
resource.properties.parameters.set!(parameter_name, stack_output)
|
@@ -67,7 +67,7 @@ class SparkleFormation
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
70
|
-
if
|
70
|
+
if block_given?
|
71
71
|
extract_templates(&block)
|
72
72
|
end
|
73
73
|
compile
|
@@ -88,18 +88,20 @@ class SparkleFormation
|
|
88
88
|
nested_stacks(:with_resource, :with_name).each do |_stack, stack_resource, stack_name|
|
89
89
|
remap_nested_parameters(compile, parameters, stack_name, stack_resource, output_map)
|
90
90
|
end
|
91
|
-
|
91
|
+
if block_given?
|
92
|
+
extract_templates(&block)
|
93
|
+
end
|
92
94
|
compile.parameters parameters
|
93
|
-
if
|
95
|
+
if args.include?(:bubble_outputs)
|
94
96
|
outputs_hash = Hash[
|
95
|
-
output_map do |name, value|
|
97
|
+
output_map.map do |name, value|
|
96
98
|
[name, {'Value' => {'Fn::GetAtt' => value}}]
|
97
99
|
end
|
98
100
|
]
|
99
|
-
|
101
|
+
unless compile.outputs.nil?
|
100
102
|
compile._merge(compile._klass_new(outputs_hash))
|
101
103
|
else
|
102
|
-
compile.outputs
|
104
|
+
compile.outputs outputs_hash
|
103
105
|
end
|
104
106
|
end
|
105
107
|
compile
|
@@ -122,26 +124,26 @@ class SparkleFormation
|
|
122
124
|
)
|
123
125
|
)
|
124
126
|
end
|
125
|
-
if
|
126
|
-
if
|
127
|
+
if bubble_path.empty?
|
128
|
+
if drip_path.size == 1
|
127
129
|
parent = drip_path.first.parent
|
128
|
-
if
|
130
|
+
if parent && parent.compile.parameters.data![output_name]
|
129
131
|
return compile.ref!(output_name)
|
130
132
|
end
|
131
133
|
end
|
132
134
|
raise ArgumentError.new "Failed to detect available bubbling path for output `#{output_name}`. " <<
|
133
|
-
|
134
|
-
|
135
|
-
|
135
|
+
'This may be due to a circular dependency! ' <<
|
136
|
+
"(Output Path: #{outputs[output_name].root_path.map(&:name).join(' > ')} " <<
|
137
|
+
"Requester Path: #{root_path.map(&:name).join(' > ')})"
|
136
138
|
end
|
137
139
|
result = compile.attr!(bubble_path.first.name, "Outputs.#{output_name}")
|
138
|
-
if
|
140
|
+
if drip_path.size > 1
|
139
141
|
parent = drip_path.first.parent
|
140
142
|
drip_path.unshift(parent) if parent
|
141
143
|
drip_path.each_slice(2) do |base_sparkle, ref_sparkle|
|
142
144
|
next unless ref_sparkle
|
143
145
|
base_sparkle.compile.resources[ref_sparkle.name].properties.parameters.set!(output_name, result)
|
144
|
-
ref_sparkle.compile.parameters.set!(output_name){ type 'String' } # TODO: <<<<------ type check and prop
|
146
|
+
ref_sparkle.compile.parameters.set!(output_name) { type 'String' } # TODO: <<<<------ type check and prop
|
145
147
|
result = compile.ref!(output_name)
|
146
148
|
end
|
147
149
|
end
|
@@ -164,26 +166,26 @@ class SparkleFormation
|
|
164
166
|
# be added to container stack and it will not use outputs
|
165
167
|
def remap_nested_parameters(template, parameters, stack_name, stack_resource, output_map)
|
166
168
|
stack_parameters = stack_resource.properties.stack.compile.parameters
|
167
|
-
unless
|
169
|
+
unless stack_parameters.nil?
|
168
170
|
stack_parameters._dump.each do |pname, pval|
|
169
|
-
if
|
171
|
+
if pval['StackUnique']
|
170
172
|
check_name = [stack_name, pname].join
|
171
173
|
else
|
172
174
|
check_name = pname
|
173
175
|
end
|
174
|
-
if
|
175
|
-
if
|
176
|
+
if parameters.keys.include?(check_name)
|
177
|
+
if list_type?(parameters[check_name]['Type'])
|
176
178
|
new_val = {'Fn::Join' => [',', {'Ref' => check_name}]}
|
177
179
|
else
|
178
180
|
new_val = {'Ref' => check_name}
|
179
181
|
end
|
180
182
|
template.resources.set!(stack_name).properties.parameters.set!(pname, new_val)
|
181
|
-
elsif
|
183
|
+
elsif output_map[check_name]
|
182
184
|
template.resources.set!(stack_name).properties.parameters.set!(
|
183
|
-
pname, 'Fn::GetAtt' => output_map[check_name]
|
185
|
+
pname, 'Fn::GetAtt' => output_map[check_name],
|
184
186
|
)
|
185
187
|
else
|
186
|
-
if
|
188
|
+
if list_type?(pval['Type'])
|
187
189
|
new_val = {'Fn::Join' => [',', {'Ref' => check_name}]}
|
188
190
|
else
|
189
191
|
new_val = {'Ref' => check_name}
|
@@ -193,7 +195,7 @@ class SparkleFormation
|
|
193
195
|
end
|
194
196
|
end
|
195
197
|
end
|
196
|
-
unless
|
198
|
+
unless stack_resource.properties.stack.compile.outputs.nil?
|
197
199
|
stack_resource.properties.stack.compile.outputs.keys!.each do |oname|
|
198
200
|
output_map[oname] = [stack_name, "Outputs.#{oname}"]
|
199
201
|
end
|
@@ -208,7 +210,6 @@ class SparkleFormation
|
|
208
210
|
def list_type?(type)
|
209
211
|
type == 'CommaDelimitedList' || type.start_with?('List<')
|
210
212
|
end
|
211
|
-
|
212
213
|
end
|
213
214
|
end
|
214
215
|
end
|
@@ -41,15 +41,15 @@ class SparkleFormation
|
|
41
41
|
def apply_deep_nesting(*args, &block)
|
42
42
|
outputs = collect_outputs
|
43
43
|
nested_stacks(:with_resource).each do |stack, resource|
|
44
|
-
unless
|
44
|
+
unless stack.nested_stacks.empty?
|
45
45
|
stack.apply_deep_nesting(*args)
|
46
46
|
end
|
47
|
-
unless
|
47
|
+
unless stack.root?
|
48
48
|
stack.compile.parameters.keys!.each do |parameter_name|
|
49
49
|
next if stack.compile.parameters.set!(parameter_name).stack_unique == true
|
50
|
-
if
|
50
|
+
if !stack.parent.compile.parameters.data![parameter_name].nil?
|
51
51
|
resource.properties.parameters.set!(parameter_name, resource.ref!(parameter_name))
|
52
|
-
elsif
|
52
|
+
elsif output_name = output_matched?(parameter_name, outputs.keys)
|
53
53
|
next if outputs[output_name] == stack
|
54
54
|
stack_output = stack.make_output_available(output_name, outputs)
|
55
55
|
resource.properties.parameters.set!(parameter_name, stack_output)
|
@@ -57,7 +57,7 @@ class SparkleFormation
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
60
|
-
if
|
60
|
+
if block_given?
|
61
61
|
extract_templates(&block)
|
62
62
|
end
|
63
63
|
compile
|
@@ -79,7 +79,7 @@ class SparkleFormation
|
|
79
79
|
remap_nested_parameters(compile, parameters, stack_name, stack_resource, output_map)
|
80
80
|
end
|
81
81
|
extract_templates(&block)
|
82
|
-
if
|
82
|
+
if args.include?(:bubble_outputs)
|
83
83
|
output_map.each do |o_name, o_val|
|
84
84
|
compile.outputs._set(o_name).value compile._stack_output(*o_val)
|
85
85
|
end
|
@@ -104,20 +104,20 @@ class SparkleFormation
|
|
104
104
|
)
|
105
105
|
)
|
106
106
|
end
|
107
|
-
if
|
108
|
-
if
|
107
|
+
if bubble_path.empty?
|
108
|
+
if drip_path.size == 1
|
109
109
|
parent = drip_path.first.parent
|
110
|
-
if
|
110
|
+
if parent && !parent.compile.parameters._set(output_name).nil?
|
111
111
|
return compile.parameter!(output_name)
|
112
112
|
end
|
113
113
|
end
|
114
114
|
raise ArgumentError.new "Failed to detect available bubbling path for output `#{output_name}`. " <<
|
115
|
-
|
116
|
-
|
117
|
-
|
115
|
+
'This may be due to a circular dependency! ' <<
|
116
|
+
"(Output Path: #{outputs[output_name].root_path.map(&:name).join(' > ')} " <<
|
117
|
+
"Requester Path: #{root_path.map(&:name).join(' > ')})"
|
118
118
|
end
|
119
119
|
result = compile._stack_output(bubble_path.first.name, output_name)
|
120
|
-
if
|
120
|
+
if drip_path.size > 1
|
121
121
|
parent = drip_path.first.parent
|
122
122
|
drip_path.unshift(parent) if parent
|
123
123
|
drip_path.each_slice(2) do |base_sparkle, ref_sparkle|
|
@@ -147,19 +147,19 @@ class SparkleFormation
|
|
147
147
|
def remap_nested_parameters(template, parameters, stack_name, stack_resource, output_map)
|
148
148
|
nested_template = stack_resource.properties.stack.compile
|
149
149
|
stack_parameters = nested_template.parameters
|
150
|
-
unless
|
150
|
+
unless stack_parameters.nil?
|
151
151
|
stack_parameters._keys.each do |pname|
|
152
152
|
pval = stack_parameters[pname]
|
153
|
-
unless
|
153
|
+
unless pval.stack_unique.nil?
|
154
154
|
check_name = [stack_name, pname].join
|
155
155
|
else
|
156
156
|
check_name = pname
|
157
157
|
end
|
158
|
-
if
|
158
|
+
if !parameters._set(check_name).nil?
|
159
159
|
template.resources._set(stack_name).properties.parameters._set(pname).value(
|
160
160
|
template._parameter(check_name)
|
161
161
|
)
|
162
|
-
elsif
|
162
|
+
elsif output_map[check_name]
|
163
163
|
template.resources._set(stack_name).properties.parameters._set(pname).value(
|
164
164
|
template._stack_output(*output_map[check_name])
|
165
165
|
)
|
@@ -171,14 +171,13 @@ class SparkleFormation
|
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
174
|
-
unless
|
174
|
+
unless nested_template.outputs.nil?
|
175
175
|
nested_template.outputs.keys!.each do |oname|
|
176
176
|
output_map[oname] = [stack_name, oname]
|
177
177
|
end
|
178
178
|
end
|
179
179
|
true
|
180
180
|
end
|
181
|
-
|
182
181
|
end
|
183
182
|
end
|
184
183
|
end
|