sparkle_formation 1.1.14 → 1.2.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/CHANGELOG.md +33 -22
- data/lib/sparkle_formation/aws.rb +2 -101
- data/lib/sparkle_formation/error.rb +2 -0
- data/lib/sparkle_formation/resources/aws.rb +40 -0
- data/lib/sparkle_formation/resources/aws_resources.json +5801 -0
- data/lib/sparkle_formation/resources.rb +114 -0
- data/lib/sparkle_formation/sparkle.rb +40 -45
- data/lib/sparkle_formation/sparkle_attribute/aws.rb +314 -0
- data/lib/sparkle_formation/sparkle_attribute.rb +44 -295
- data/lib/sparkle_formation/sparkle_formation.rb +68 -22
- data/lib/sparkle_formation/sparkle_struct.rb +9 -1
- data/lib/sparkle_formation/translation/heat.rb +7 -6
- data/lib/sparkle_formation/translation/rackspace.rb +9 -7
- data/lib/sparkle_formation/translation.rb +8 -7
- data/lib/sparkle_formation/utils.rb +42 -2
- data/lib/sparkle_formation/version.rb +2 -1
- data/lib/sparkle_formation.rb +2 -0
- data/sparkle_formation.gemspec +2 -1
- metadata +22 -5
- data/lib/sparkle_formation/aws/cfn_resources.rb +0 -4609
@@ -5,276 +5,29 @@ class SparkleFormation
|
|
5
5
|
# Provides template helper methods
|
6
6
|
module SparkleAttribute
|
7
7
|
|
8
|
-
|
9
|
-
#
|
10
|
-
# @param args [Object]
|
11
|
-
# @return [Hash]
|
12
|
-
def _cf_join(*args)
|
13
|
-
options = args.detect{|i| i.is_a?(Hash) && i[:options]} || {:options => {}}
|
14
|
-
args.delete(options)
|
15
|
-
unless(args.size == 1)
|
16
|
-
args = [args]
|
17
|
-
end
|
18
|
-
{'Fn::Join' => [options[:options][:delimiter] || '', *args]}
|
19
|
-
end
|
20
|
-
alias_method :join!, :_cf_join
|
21
|
-
|
22
|
-
# Ref generator
|
23
|
-
#
|
24
|
-
# @param thing [String, Symbol] reference name
|
25
|
-
# @return [Hash]
|
26
|
-
# @note Symbol value will force key processing
|
27
|
-
def _cf_ref(thing)
|
28
|
-
thing = _process_key(thing, :force) if thing.is_a?(Symbol)
|
29
|
-
{'Ref' => thing}
|
30
|
-
end
|
31
|
-
alias_method :_ref, :_cf_ref
|
32
|
-
alias_method :ref!, :_cf_ref
|
8
|
+
autoload :Aws, 'sparkle_formation/sparkle_attribute/aws'
|
33
9
|
|
34
|
-
#
|
10
|
+
# Return current resource name
|
35
11
|
#
|
36
|
-
# @
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
12
|
+
# @return [String]
|
13
|
+
def _resource_name
|
14
|
+
result = nil
|
15
|
+
if(_parent)
|
16
|
+
if(_parent._parent == _root)
|
17
|
+
result = _parent._data.detect do |r_name, r_value|
|
18
|
+
r_value == self
|
19
|
+
end
|
20
|
+
result = result.first if result
|
44
21
|
else
|
45
|
-
|
22
|
+
result = _parent._resource_name
|
46
23
|
end
|
47
24
|
end
|
48
|
-
|
49
|
-
|
50
|
-
key = ref!(key)
|
51
|
-
end
|
52
|
-
{'Fn::FindInMap' => [thing, key, *suffix]}
|
53
|
-
end
|
54
|
-
alias_method :_cf_find_in_map, :_cf_map
|
55
|
-
alias_method :find_in_map!, :_cf_map
|
56
|
-
alias_method :map!, :_cf_map
|
57
|
-
|
58
|
-
# Fn::GetAtt generator
|
59
|
-
#
|
60
|
-
# @param [Object] pass through arguments
|
61
|
-
# @return [Hash]
|
62
|
-
def _cf_attr(*args)
|
63
|
-
args = args.map do |thing|
|
64
|
-
if(thing.is_a?(Symbol))
|
65
|
-
_process_key(thing, :force)
|
66
|
-
else
|
67
|
-
thing
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
{'Fn::GetAtt' => args}
|
72
|
-
end
|
73
|
-
alias_method :_cf_get_att, :_cf_attr
|
74
|
-
alias_method :get_att!, :_cf_attr
|
75
|
-
alias_method :attr!, :_cf_attr
|
76
|
-
|
77
|
-
# Fn::Base64 generator
|
78
|
-
#
|
79
|
-
# @param arg [Object] pass through
|
80
|
-
# @return [Hash]
|
81
|
-
def _cf_base64(arg)
|
82
|
-
{'Fn::Base64' => arg}
|
83
|
-
end
|
84
|
-
alias_method :base64!, :_cf_base64
|
85
|
-
|
86
|
-
# Fn::GetAZs generator
|
87
|
-
#
|
88
|
-
# @param region [String, Symbol] String will pass through. Symbol will be converted to ref
|
89
|
-
# @return [Hash]
|
90
|
-
def _cf_get_azs(region=nil)
|
91
|
-
region = case region
|
92
|
-
when Symbol
|
93
|
-
_cf_ref(region)
|
94
|
-
when NilClass
|
95
|
-
''
|
96
|
-
else
|
97
|
-
region
|
98
|
-
end
|
99
|
-
{'Fn::GetAZs' => region}
|
100
|
-
end
|
101
|
-
alias_method :get_azs!, :_cf_get_azs
|
102
|
-
alias_method :azs!, :_cf_get_azs
|
103
|
-
|
104
|
-
# Fn::Select generator
|
105
|
-
#
|
106
|
-
# @param index [String, Symbol, Integer] Symbol will be converted to ref
|
107
|
-
# @param item [Object, Symbol] Symbol will be converted to ref
|
108
|
-
# @return [Hash]
|
109
|
-
def _cf_select(index, item)
|
110
|
-
index = index.is_a?(Symbol) ? _cf_ref(index) : index
|
111
|
-
item = _cf_ref(item) if item.is_a?(Symbol)
|
112
|
-
{'Fn::Select' => [index, item]}
|
113
|
-
end
|
114
|
-
alias_method :select!, :_cf_select
|
115
|
-
|
116
|
-
# Condition generator
|
117
|
-
#
|
118
|
-
# @param name [String, Symbol] symbol will be processed
|
119
|
-
# @return [Hash]
|
120
|
-
def _condition(name)
|
121
|
-
{'Condition' => name.is_a?(Symbol) ? _process_key(name) : name}
|
122
|
-
end
|
123
|
-
alias_method :condition!, :_condition
|
124
|
-
|
125
|
-
# Condition setter
|
126
|
-
#
|
127
|
-
# @param name [String, Symbol] condition name
|
128
|
-
# @return [SparkleStruct]
|
129
|
-
# @note this is used to set a {"Condition" => "Name"} into the
|
130
|
-
# current context, generally the top level of a resource
|
131
|
-
def _on_condition(name)
|
132
|
-
_set(*_condition(name).to_a.flatten)
|
133
|
-
end
|
134
|
-
alias_method :on_condition!, :_on_condition
|
135
|
-
|
136
|
-
# Fn::If generator
|
137
|
-
#
|
138
|
-
# @param cond [String, Symbol] symbol will be case processed
|
139
|
-
# @param true_value [Object]
|
140
|
-
# @param false_value [Object]
|
141
|
-
# @return [Hash]
|
142
|
-
def _if(cond, true_value, false_value)
|
143
|
-
cond = cond.is_a?(Symbol) ? _process_key(cond) : cond
|
144
|
-
{'Fn::If' => _array(cond, true_value, false_value)}
|
145
|
-
end
|
146
|
-
alias_method :if!, :_if
|
147
|
-
|
148
|
-
# Fn::And generator
|
149
|
-
#
|
150
|
-
# @param args [Object]
|
151
|
-
# @return [Hash]
|
152
|
-
# @note symbols will be processed and set as condition. strings
|
153
|
-
# will be set as condition directly. procs will be evaluated
|
154
|
-
def _and(*args)
|
155
|
-
{
|
156
|
-
'Fn::And' => _array(
|
157
|
-
*args.map{|v|
|
158
|
-
if(v.is_a?(Symbol) || v.is_a?(String))
|
159
|
-
_condition(v)
|
160
|
-
else
|
161
|
-
v
|
162
|
-
end
|
163
|
-
}
|
164
|
-
)
|
165
|
-
}
|
166
|
-
end
|
167
|
-
alias_method :and!, :_and
|
168
|
-
|
169
|
-
# Fn::Equals generator
|
170
|
-
#
|
171
|
-
# @param v1 [Object]
|
172
|
-
# @param v2 [Object]
|
173
|
-
# @return [Hash]
|
174
|
-
def _equals(v1, v2)
|
175
|
-
{'Fn::Equals' => _array(v1, v2)}
|
176
|
-
end
|
177
|
-
alias_method :equals!, :_equals
|
178
|
-
|
179
|
-
# Fn::Not generator
|
180
|
-
#
|
181
|
-
# @param arg [Object]
|
182
|
-
# @return [Hash]
|
183
|
-
def _not(arg)
|
184
|
-
if(arg.is_a?(String) || arg.is_a?(Symbol))
|
185
|
-
arg = _condition(arg)
|
186
|
-
else
|
187
|
-
arg = _array(arg).first
|
25
|
+
unless(result)
|
26
|
+
::Kernel.raise NameError.new 'Failed to determine current resource name! (Check call location)'
|
188
27
|
end
|
189
|
-
|
190
|
-
end
|
191
|
-
alias_method :not!, :_not
|
192
|
-
|
193
|
-
# Fn::Or generator
|
194
|
-
#
|
195
|
-
# @param v1 [Object]
|
196
|
-
# @param v2 [Object]
|
197
|
-
# @return [Hash]
|
198
|
-
def _or(*args)
|
199
|
-
{
|
200
|
-
'Fn::Or' => _array(
|
201
|
-
*args.map{|v|
|
202
|
-
if(v.is_a?(Symbol) || v.is_a?(String))
|
203
|
-
_condition(v)
|
204
|
-
else
|
205
|
-
v
|
206
|
-
end
|
207
|
-
}
|
208
|
-
)
|
209
|
-
}
|
210
|
-
end
|
211
|
-
alias_method :or!, :_or
|
212
|
-
|
213
|
-
# No value generator
|
214
|
-
#
|
215
|
-
# @return [String]
|
216
|
-
def _no_value
|
217
|
-
_ref('AWS::NoValue')
|
218
|
-
end
|
219
|
-
alias_method :no_value!, :_no_value
|
220
|
-
|
221
|
-
# Region generator
|
222
|
-
#
|
223
|
-
# @return [Hash]
|
224
|
-
def _region
|
225
|
-
_ref('AWS::Region')
|
226
|
-
end
|
227
|
-
alias_method :region!, :_region
|
228
|
-
|
229
|
-
# Notification ARNs generator
|
230
|
-
#
|
231
|
-
# @return [Hash]
|
232
|
-
def _notification_arns
|
233
|
-
_ref('AWS::NotificationARNs')
|
234
|
-
end
|
235
|
-
alias_method :notification_arns!, :_notification_arns
|
236
|
-
|
237
|
-
# Account ID generator
|
238
|
-
#
|
239
|
-
# @return [Hash]
|
240
|
-
def _account_id
|
241
|
-
_ref('AWS::AccountId')
|
242
|
-
end
|
243
|
-
alias_method :account_id!, :_account_id
|
244
|
-
|
245
|
-
# Stack ID generator
|
246
|
-
#
|
247
|
-
# @return [Hash]
|
248
|
-
def _stack_id
|
249
|
-
_ref('AWS::StackId')
|
28
|
+
result
|
250
29
|
end
|
251
|
-
alias_method :
|
252
|
-
|
253
|
-
# Stack name generator
|
254
|
-
#
|
255
|
-
# @return [Hash]
|
256
|
-
def _stack_name
|
257
|
-
_ref('AWS::StackName')
|
258
|
-
end
|
259
|
-
alias_method :stack_name!, :_stack_name
|
260
|
-
|
261
|
-
# Resource dependency generator
|
262
|
-
#
|
263
|
-
# @param [Symbol, String, Array<Symbol, String>] resource names
|
264
|
-
# @return [Array<String>]
|
265
|
-
def _depends_on(*args)
|
266
|
-
_set('DependsOn', [args].flatten.compact.map{|s| _process_key(s)})
|
267
|
-
end
|
268
|
-
alias_method :depends_on!, :_depends_on
|
269
|
-
|
270
|
-
# Reference output value from nested stack
|
271
|
-
#
|
272
|
-
# @param stack_name [String, Symbol] logical resource name of stack
|
273
|
-
# @apram output_name [String, Symbol] stack output name
|
274
|
-
def _stack_output(stack_name, output_name)
|
275
|
-
_cf_attr(_process_key(stack_name), "Outputs.#{_process_key(output_name)}")
|
276
|
-
end
|
277
|
-
alias_method :stack_output!, :_stack_output
|
30
|
+
alias_method :resource_name!, :_resource_name
|
278
31
|
|
279
32
|
# Execute system command
|
280
33
|
#
|
@@ -300,39 +53,13 @@ class SparkleFormation
|
|
300
53
|
end
|
301
54
|
alias_method :raise!, :_raise
|
302
55
|
|
303
|
-
#
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
resource && resource[:properties].include?('Tags')
|
309
|
-
else
|
310
|
-
if(self._parent)
|
311
|
-
self._parent.taggable?
|
312
|
-
end
|
313
|
-
end
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
# @return [TrueClass, FalseClass]
|
318
|
-
def rhel?
|
319
|
-
!!@platform[:rhel]
|
320
|
-
end
|
321
|
-
|
322
|
-
# @return [TrueClass, FalseClass]
|
323
|
-
def debian?
|
324
|
-
!!@platform[:debian]
|
325
|
-
end
|
326
|
-
|
327
|
-
# Set the destination platform
|
328
|
-
#
|
329
|
-
# @param plat [String, Symbol] one of :rhel or :debian
|
330
|
-
# @return [TrueClass]
|
331
|
-
def _platform=(plat)
|
332
|
-
@platform || __hashish
|
333
|
-
@platform.clear
|
334
|
-
@platform[plat.to_sym] = true
|
56
|
+
# Lookup a method definition on self
|
57
|
+
# usually used as `puts! method!(:foo).source_location`
|
58
|
+
# @return [Method]
|
59
|
+
def _method(*args)
|
60
|
+
::Kernel.instance_method(:method).bind(self).call(*args)
|
335
61
|
end
|
62
|
+
alias_method :method!, :_method
|
336
63
|
|
337
64
|
# Dynamic insertion helper method
|
338
65
|
#
|
@@ -361,5 +88,27 @@ class SparkleFormation
|
|
361
88
|
SparkleFormation.nest(template, self, *args, &block)
|
362
89
|
end
|
363
90
|
|
91
|
+
# TODO: Deprecate or re-imagine
|
92
|
+
|
93
|
+
# @return [TrueClass, FalseClass]
|
94
|
+
def rhel?
|
95
|
+
!!@platform[:rhel]
|
96
|
+
end
|
97
|
+
|
98
|
+
# @return [TrueClass, FalseClass]
|
99
|
+
def debian?
|
100
|
+
!!@platform[:debian]
|
101
|
+
end
|
102
|
+
|
103
|
+
# Set the destination platform
|
104
|
+
#
|
105
|
+
# @param plat [String, Symbol] one of :rhel or :debian
|
106
|
+
# @return [TrueClass]
|
107
|
+
def _platform=(plat)
|
108
|
+
@platform || __hashish
|
109
|
+
@platform.clear
|
110
|
+
@platform[plat.to_sym] = true
|
111
|
+
end
|
112
|
+
|
364
113
|
end
|
365
114
|
end
|
@@ -22,6 +22,8 @@ class SparkleFormation
|
|
22
22
|
|
23
23
|
class << self
|
24
24
|
|
25
|
+
include SparkleFormation::Utils::TypeCheckers
|
26
|
+
|
25
27
|
# @return [Hashish] loaded dynamics
|
26
28
|
def dynamics
|
27
29
|
@dynamics ||= SparkleStruct.hashish.new
|
@@ -96,7 +98,7 @@ class SparkleFormation
|
|
96
98
|
container = Sparkle.new(:root => spath)
|
97
99
|
path = container.get(:template, path)[:path]
|
98
100
|
end
|
99
|
-
formation =
|
101
|
+
formation = instance_eval(IO.read(path), path, 1)
|
100
102
|
if(args.delete(:sparkle))
|
101
103
|
formation
|
102
104
|
else
|
@@ -124,7 +126,7 @@ class SparkleFormation
|
|
124
126
|
# @param path [String] path to component
|
125
127
|
# @return [SparkleStruct] resulting struct
|
126
128
|
def load_component(path)
|
127
|
-
|
129
|
+
instance_eval(IO.read(path), path, 1)
|
128
130
|
@_struct
|
129
131
|
end
|
130
132
|
|
@@ -137,7 +139,7 @@ class SparkleFormation
|
|
137
139
|
Dir.glob(File.join(directory, '*.rb')).each do |dyn|
|
138
140
|
dyn = File.expand_path(dyn)
|
139
141
|
next if @loaded_dynamics.include?(dyn)
|
140
|
-
|
142
|
+
instance_eval(IO.read(dyn), dyn, 1)
|
141
143
|
@loaded_dynamics << dyn
|
142
144
|
end
|
143
145
|
@loaded_dynamics.uniq!
|
@@ -194,7 +196,7 @@ class SparkleFormation
|
|
194
196
|
# @param args [Object] parameters for dynamic
|
195
197
|
# @return [SparkleStruct]
|
196
198
|
def registry(registry_name, struct, *args)
|
197
|
-
|
199
|
+
__t_stringish(registry_name)
|
198
200
|
reg = struct._self.sparkle.get(:registry, registry_name)
|
199
201
|
struct.instance_exec(*args, ®[:block])
|
200
202
|
end
|
@@ -206,6 +208,7 @@ class SparkleFormation
|
|
206
208
|
# @param args [Object] parameters for dynamic
|
207
209
|
# @return [SparkleStruct]
|
208
210
|
def insert(dynamic_name, struct, *args, &block)
|
211
|
+
__t_stringish(dynamic_name)
|
209
212
|
result = false
|
210
213
|
begin
|
211
214
|
dyn = struct._self.sparkle.get(:dynamic, dynamic_name)
|
@@ -219,7 +222,13 @@ class SparkleFormation
|
|
219
222
|
result = builtin_insert(dynamic_name, struct, *args, &block)
|
220
223
|
end
|
221
224
|
unless(result)
|
222
|
-
|
225
|
+
message = "Failed to locate requested dynamic block for insertion: #{dynamic_name} " \
|
226
|
+
"(valid: #{struct._self.sparkle.dynamics.keys.sort.join(', ')})"
|
227
|
+
if(struct._self.provider_resources.registry.keys.size > 1)
|
228
|
+
t_name = struct._self.provider_resources.registry.keys.first
|
229
|
+
message << "\nBuiltin dynamics pattern `#{t_name}` -> `:#{Bogo::Utility.snake(t_name.gsub('::', '_'))}`"
|
230
|
+
end
|
231
|
+
raise message
|
223
232
|
end
|
224
233
|
result
|
225
234
|
end
|
@@ -239,6 +248,9 @@ class SparkleFormation
|
|
239
248
|
else
|
240
249
|
options = {}
|
241
250
|
end
|
251
|
+
[template, *args].compact.each do |item|
|
252
|
+
__t_stringish(item)
|
253
|
+
end
|
242
254
|
to_nest = struct._self.sparkle.get(:template, template)
|
243
255
|
resource_name = template.to_s.gsub('__', '_')
|
244
256
|
unless(args.empty?)
|
@@ -247,7 +259,7 @@ class SparkleFormation
|
|
247
259
|
args.map{|a| Bogo::Utility.snake(a)}.join('_')
|
248
260
|
].flatten.compact.join('_').to_sym
|
249
261
|
end
|
250
|
-
nested_template =
|
262
|
+
nested_template = compile(to_nest[:path], :sparkle)
|
251
263
|
nested_template.parent = struct._self
|
252
264
|
nested_template.name = Bogo::Utility.camel(resource_name)
|
253
265
|
if(options[:parameters])
|
@@ -270,17 +282,17 @@ class SparkleFormation
|
|
270
282
|
# @param args [Object] parameters for dynamic
|
271
283
|
# @return [SparkleStruct]
|
272
284
|
def builtin_insert(dynamic_name, struct, *args, &block)
|
273
|
-
if(
|
285
|
+
if(struct._self.provider_resources && lookup_key = struct._self.provider_resources.registry_key(dynamic_name))
|
274
286
|
_name, _config = *args
|
275
287
|
_config ||= {}
|
276
|
-
|
288
|
+
__t_stringish(_name)
|
289
|
+
__t_hashish(_config)
|
277
290
|
resource_name = "#{_name}_#{_config.delete(:resource_name_suffix) || dynamic_name}".to_sym
|
278
|
-
struct.resources.set!(resource_name)
|
279
|
-
new_resource = struct.resources[resource_name]
|
291
|
+
new_resource = struct.resources.set!(resource_name)
|
280
292
|
new_resource.type lookup_key
|
281
293
|
properties = new_resource.properties
|
282
294
|
config_keys = _config.keys.zip(_config.keys.map{|k| snake(k).to_s.tr('_', '')})
|
283
|
-
|
295
|
+
struct._self.provider_resources.resource(dynamic_name, :properties).each do |prop_name|
|
284
296
|
key = (config_keys.detect{|k| k.last == snake(prop_name).to_s.tr('_', '')} || []).first
|
285
297
|
value = _config[key] if key
|
286
298
|
if(value)
|
@@ -336,6 +348,10 @@ class SparkleFormation
|
|
336
348
|
attr_reader :stack_resource_types
|
337
349
|
# @return [Hash] state hash for compile time parameters
|
338
350
|
attr_accessor :compile_state
|
351
|
+
# @return [Symbol] target provider
|
352
|
+
attr_reader :provider
|
353
|
+
# @return [Class] Provider resources
|
354
|
+
attr_reader :provider_resources
|
339
355
|
|
340
356
|
# Create new instance
|
341
357
|
#
|
@@ -366,7 +382,6 @@ class SparkleFormation
|
|
366
382
|
)
|
367
383
|
unless(options[:disable_aws_builtins])
|
368
384
|
require 'sparkle_formation/aws'
|
369
|
-
SfnAws.load!
|
370
385
|
end
|
371
386
|
@parameters = set_generation_parameters!(
|
372
387
|
options.fetch(:compile_time_parameters,
|
@@ -381,12 +396,27 @@ class SparkleFormation
|
|
381
396
|
@load_order = []
|
382
397
|
@overrides = []
|
383
398
|
@parent = options[:parent]
|
399
|
+
@provider = options.fetch(:provider, @parent ? @parent.provider : :aws)
|
384
400
|
if(block)
|
385
401
|
load_block(block)
|
386
402
|
end
|
387
403
|
@compiled = nil
|
388
404
|
end
|
389
405
|
|
406
|
+
# Set remote API target for template to allow loading of
|
407
|
+
# provider specific helpers and data if available. Setting
|
408
|
+
# to a false-y value will disable helpers loading
|
409
|
+
#
|
410
|
+
# @param val [String, Symbol, NilClass, FalseClass] remote provider
|
411
|
+
# @return [Symbol, NilClass]
|
412
|
+
def provider=(val)
|
413
|
+
if(val)
|
414
|
+
@provider = Bogo::Utility.snake(val).to_sym
|
415
|
+
else
|
416
|
+
@provider = nil
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
390
420
|
# Check if type is a registered stack type
|
391
421
|
#
|
392
422
|
# @param type [String]
|
@@ -508,14 +538,26 @@ class SparkleFormation
|
|
508
538
|
# @option args [Hash] :state local state parameters
|
509
539
|
# @return [SparkleStruct]
|
510
540
|
def compile(args={})
|
511
|
-
if(args.
|
541
|
+
if(args.key?(:state))
|
512
542
|
@compile_state = args[:state]
|
513
543
|
unmemoize(:compile)
|
514
544
|
end
|
515
545
|
memoize(:compile) do
|
516
546
|
set_compile_time_parameters!
|
517
|
-
|
547
|
+
if(provider && SparkleAttribute.const_defined?(camel(provider)))
|
548
|
+
const = SparkleAttribute.const_get(camel(provider))
|
549
|
+
struct_class = Class.new(SparkleStruct)
|
550
|
+
struct_class.include(const)
|
551
|
+
else
|
552
|
+
struct_class = SparkleStruct
|
553
|
+
end
|
554
|
+
if(Resources.const_defined?(camel(provider)))
|
555
|
+
@provider_resources = Resources.const_get(camel(provider))
|
556
|
+
provider_resources.load!
|
557
|
+
end
|
558
|
+
compiled = struct_class.new
|
518
559
|
compiled._set_self(self)
|
560
|
+
compiled._struct_class = struct_class
|
519
561
|
if(compile_state)
|
520
562
|
compiled.set_state!(compile_state)
|
521
563
|
end
|
@@ -562,7 +604,7 @@ class SparkleFormation
|
|
562
604
|
# @return [TrueClass, FalseClass] includes nested stacks
|
563
605
|
def nested?(stack_hash=nil)
|
564
606
|
stack_hash = compile.dump! unless stack_hash
|
565
|
-
!!stack_hash.fetch('Resources', {}).detect do |
|
607
|
+
!!stack_hash.fetch('Resources', {}).detect do |_r_name, resource|
|
566
608
|
stack_resource_type?(resource['Type'])
|
567
609
|
end
|
568
610
|
end
|
@@ -570,7 +612,7 @@ class SparkleFormation
|
|
570
612
|
# @return [TrueClass, FalseClass] includes _only_ nested stacks
|
571
613
|
def isolated_nests?(stack_hash=nil)
|
572
614
|
stack_hash = compile.dump! unless stack_hash
|
573
|
-
stack_hash.fetch('Resources', {}).all? do |
|
615
|
+
stack_hash.fetch('Resources', {}).all? do |_name, resource|
|
574
616
|
stack_resource_type?(resource['Type'])
|
575
617
|
end
|
576
618
|
end
|
@@ -578,8 +620,8 @@ class SparkleFormation
|
|
578
620
|
# @return [TrueClass, FalseClass] policies defined
|
579
621
|
def includes_policies?(stack_hash=nil)
|
580
622
|
stack_hash = compile.dump! unless stack_hash
|
581
|
-
stack_hash.fetch('Resources', {}).any? do |
|
582
|
-
resource.
|
623
|
+
stack_hash.fetch('Resources', {}).any? do |_name, resource|
|
624
|
+
resource.key?('Policy')
|
583
625
|
end
|
584
626
|
end
|
585
627
|
|
@@ -678,7 +720,11 @@ class SparkleFormation
|
|
678
720
|
drip_path = root_path - outputs[output_name].root_path
|
679
721
|
bubble_path.each_slice(2) do |base_sparkle, ref_sparkle|
|
680
722
|
next unless ref_sparkle
|
681
|
-
base_sparkle.compile.outputs.set!(output_name).set!(
|
723
|
+
base_sparkle.compile.outputs.set!(output_name).set!(
|
724
|
+
:value, base_sparkle.compile.attr!(
|
725
|
+
ref_sparkle.name, "Outputs.#{output_name}"
|
726
|
+
)
|
727
|
+
)
|
682
728
|
end
|
683
729
|
if(bubble_path.empty?)
|
684
730
|
if(drip_path.size == 1)
|
@@ -699,7 +745,7 @@ class SparkleFormation
|
|
699
745
|
drip_path.each_slice(2) do |base_sparkle, ref_sparkle|
|
700
746
|
next unless ref_sparkle
|
701
747
|
base_sparkle.compile.resources[ref_sparkle.name].properties.parameters.set!(output_name, result)
|
702
|
-
ref_sparkle.compile.parameters.set!(output_name){ type 'String' } # TODO <<<<------ type check and prop
|
748
|
+
ref_sparkle.compile.parameters.set!(output_name){ type 'String' } # TODO: <<<<------ type check and prop
|
703
749
|
result = compile.ref!(output_name)
|
704
750
|
end
|
705
751
|
end
|
@@ -741,7 +787,7 @@ class SparkleFormation
|
|
741
787
|
def apply_shallow_nesting(*args, &block)
|
742
788
|
parameters = compile[:parameters] ? compile[:parameters]._dump : {}
|
743
789
|
output_map = {}
|
744
|
-
nested_stacks(:with_resource, :with_name).each do |
|
790
|
+
nested_stacks(:with_resource, :with_name).each do |_stack, stack_resource, stack_name|
|
745
791
|
remap_nested_parameters(compile, parameters, stack_name, stack_resource, output_map)
|
746
792
|
end
|
747
793
|
extract_templates(&block)
|
@@ -835,7 +881,7 @@ class SparkleFormation
|
|
835
881
|
|
836
882
|
# @return [Hash] dumped hash
|
837
883
|
def dump
|
838
|
-
MultiJson.load(
|
884
|
+
MultiJson.load(to_json)
|
839
885
|
end
|
840
886
|
|
841
887
|
# @return [String] dumped hash JSON
|