sparkle_formation 3.0.26 → 3.0.28
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 +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
|