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
@@ -2,7 +2,6 @@ require 'sparkle_formation'
|
|
2
2
|
|
3
3
|
# Formation container
|
4
4
|
class SparkleFormation
|
5
|
-
|
6
5
|
include SparkleFormation::Utils::AnimalStrings
|
7
6
|
# @!parse include SparkleFormation::Utils::AnimalStrings
|
8
7
|
extend SparkleFormation::Utils::AnimalStrings
|
@@ -12,7 +11,7 @@ class SparkleFormation
|
|
12
11
|
IGNORE_DIRECTORIES = [
|
13
12
|
'components',
|
14
13
|
'dynamics',
|
15
|
-
'registry'
|
14
|
+
'registry',
|
16
15
|
]
|
17
16
|
|
18
17
|
# @return [String] default stack resource name
|
@@ -21,7 +20,6 @@ class SparkleFormation
|
|
21
20
|
VALID_STACK_RESOURCES = [DEFAULT_STACK_RESOURCE]
|
22
21
|
|
23
22
|
class << self
|
24
|
-
|
25
23
|
include SparkleFormation::Utils::TypeCheckers
|
26
24
|
|
27
25
|
# @return [Hashish] loaded dynamics
|
@@ -39,8 +37,8 @@ class SparkleFormation
|
|
39
37
|
#
|
40
38
|
# @param path [String] path to directory
|
41
39
|
# @return [String] path to directory
|
42
|
-
def sparkle_path=(path=nil)
|
43
|
-
if
|
40
|
+
def sparkle_path=(path = nil)
|
41
|
+
if path
|
44
42
|
custom_paths[:sparkle_path] = path
|
45
43
|
custom_paths[:components_directory] = File.join(path, 'components')
|
46
44
|
custom_paths[:dynamics_directory] = File.join(path, 'dynamics')
|
@@ -48,42 +46,46 @@ class SparkleFormation
|
|
48
46
|
end
|
49
47
|
custom_paths[:sparkle_path]
|
50
48
|
end
|
49
|
+
|
51
50
|
alias_method(:sparkle_path, :sparkle_path=)
|
52
51
|
|
53
52
|
# Get/set path to component files
|
54
53
|
#
|
55
54
|
# @param path [String] path to component files
|
56
55
|
# @return [String] path to component files
|
57
|
-
def components_path=(path=nil)
|
58
|
-
if
|
56
|
+
def components_path=(path = nil)
|
57
|
+
if path
|
59
58
|
custom_paths[:components_directory] = path
|
60
59
|
end
|
61
60
|
custom_paths[:components_directory]
|
62
61
|
end
|
62
|
+
|
63
63
|
alias_method(:components_path, :components_path=)
|
64
64
|
|
65
65
|
# Get/set path to dynamic files
|
66
66
|
#
|
67
67
|
# @param path [String] path to dynamic files
|
68
68
|
# @return [String] path to dynamic files
|
69
|
-
def dynamics_path=(path=nil)
|
70
|
-
if
|
69
|
+
def dynamics_path=(path = nil)
|
70
|
+
if path
|
71
71
|
custom_paths[:dynamics_directory] = path
|
72
72
|
end
|
73
73
|
custom_paths[:dynamics_directory]
|
74
74
|
end
|
75
|
+
|
75
76
|
alias_method(:dynamics_path, :dynamics_path=)
|
76
77
|
|
77
78
|
# Get/set path to registry files
|
78
79
|
#
|
79
80
|
# @param path [String] path to registry files
|
80
81
|
# @return [String] path to registry files
|
81
|
-
def registry_path=(path=nil)
|
82
|
-
if
|
82
|
+
def registry_path=(path = nil)
|
83
|
+
if path
|
83
84
|
custom_paths[:registry_directory] = path
|
84
85
|
end
|
85
86
|
custom_paths[:registry_directory]
|
86
87
|
end
|
88
|
+
|
87
89
|
alias_method(:registry_path, :registry_path=)
|
88
90
|
|
89
91
|
# Compile file
|
@@ -93,16 +95,16 @@ class SparkleFormation
|
|
93
95
|
# to pass through when compiling ({:state => {}})
|
94
96
|
# @return [Hashish, SparkleStruct]
|
95
97
|
def compile(path, *args)
|
96
|
-
opts = args.detect{|i| i.is_a?(Hash) } || {}
|
97
|
-
unless
|
98
|
-
if
|
98
|
+
opts = args.detect { |i| i.is_a?(Hash) } || {}
|
99
|
+
unless path.is_a?(String) && File.file?(path.to_s)
|
100
|
+
if spath = (opts.delete(:sparkle_path) || SparkleFormation.custom_paths[:sparkle_path])
|
99
101
|
container = Sparkle.new(:root => spath)
|
100
102
|
path = container.get(:template, path)[:path]
|
101
103
|
end
|
102
104
|
end
|
103
105
|
formation = instance_eval(IO.read(path), path, 1)
|
104
106
|
formation.template_path = path
|
105
|
-
if
|
107
|
+
if args.delete(:sparkle)
|
106
108
|
formation
|
107
109
|
else
|
108
110
|
formation.compile(opts)._dump
|
@@ -114,8 +116,8 @@ class SparkleFormation
|
|
114
116
|
# @param base [SparkleStruct] context for block
|
115
117
|
# @yield block to execute
|
116
118
|
# @return [SparkleStruct] provided base or new struct
|
117
|
-
def build(base=nil, &block)
|
118
|
-
if
|
119
|
+
def build(base = nil, &block)
|
120
|
+
if base || block.nil?
|
119
121
|
struct = base || SparkleStruct.new
|
120
122
|
struct.instance_exec(&block)
|
121
123
|
struct
|
@@ -171,7 +173,7 @@ class SparkleFormation
|
|
171
173
|
# :item_name => {:description => 'Defines item name', :type => 'String'}
|
172
174
|
# @yield dynamic block
|
173
175
|
# @return [TrueClass]
|
174
|
-
def dynamic(name, args={}, &block)
|
176
|
+
def dynamic(name, args = {}, &block)
|
175
177
|
@dynamics ||= SparkleStruct.hashish.new
|
176
178
|
dynamics[name] = SparkleStruct.hashish[
|
177
179
|
:block, block, :args, SparkleStruct.hashish[args.map(&:to_a)]
|
@@ -184,12 +186,13 @@ class SparkleFormation
|
|
184
186
|
# @param name [String, Symbol] dynamic name
|
185
187
|
# @return [Hashish] metadata information
|
186
188
|
def dynamic_info(name)
|
187
|
-
if
|
189
|
+
if dynamics[name]
|
188
190
|
dynamics[name][:args] ||= SparkleStruct.hashish.new
|
189
191
|
else
|
190
192
|
raise KeyError.new("No dynamic registered with provided name (#{name})")
|
191
193
|
end
|
192
194
|
end
|
195
|
+
|
193
196
|
alias_method :dynamic_information, :dynamic_info
|
194
197
|
|
195
198
|
# Insert a dynamic into a context
|
@@ -200,7 +203,7 @@ class SparkleFormation
|
|
200
203
|
# @return [SparkleStruct]
|
201
204
|
def registry(registry_name, struct, *args)
|
202
205
|
__t_stringish(registry_name)
|
203
|
-
opts = args.detect{|item| item.is_a?(Hash)} || {}
|
206
|
+
opts = args.detect { |item| item.is_a?(Hash) } || {}
|
204
207
|
reg = struct._self.sparkle.get(:registry, registry_name, opts[:provider])
|
205
208
|
struct.instance_exec(*args, ®[:block])
|
206
209
|
end
|
@@ -215,14 +218,14 @@ class SparkleFormation
|
|
215
218
|
__t_stringish(dynamic_name)
|
216
219
|
result = false
|
217
220
|
begin
|
218
|
-
opts = args.detect{|i| i.is_a?(Hash)} || {}
|
221
|
+
opts = args.detect { |i| i.is_a?(Hash) } || {}
|
219
222
|
dyn = struct._self.sparkle.get(:dynamic, dynamic_name, opts[:provider])
|
220
223
|
opts = nil
|
221
224
|
raise dyn if dyn.is_a?(Exception)
|
222
225
|
dyn.monochrome.each do |dynamic_item|
|
223
|
-
if
|
224
|
-
opts = args.detect{|i| i.is_a?(Hash)}
|
225
|
-
if
|
226
|
+
if result
|
227
|
+
opts = args.detect { |i| i.is_a?(Hash) }
|
228
|
+
if opts
|
226
229
|
opts[:previous_layer_result] = result
|
227
230
|
else
|
228
231
|
args.push(:previous_layer_result => result)
|
@@ -230,15 +233,15 @@ class SparkleFormation
|
|
230
233
|
end
|
231
234
|
result = struct.instance_exec(*args, &dynamic_item[:block])
|
232
235
|
end
|
233
|
-
if
|
236
|
+
if block_given?
|
234
237
|
result.instance_exec(&block)
|
235
238
|
end
|
236
239
|
rescue Error::NotFound::Dynamic
|
237
240
|
result = builtin_insert(dynamic_name, struct, *args, &block)
|
238
|
-
unless
|
241
|
+
unless result
|
239
242
|
message = "Failed to locate requested dynamic block for insertion: #{dynamic_name} " \
|
240
|
-
|
241
|
-
if
|
243
|
+
"(valid: #{struct._self.sparkle.dynamics.fetch(struct._self.sparkle.provider, {}).keys.sort.join(', ')})"
|
244
|
+
if struct._self.provider_resources && struct._self.provider_resources.registry.keys.size > 1
|
242
245
|
t_name = struct._self.provider_resources.registry.keys.first
|
243
246
|
valid_t_name = Bogo::Utility.snake(
|
244
247
|
t_name.split(
|
@@ -262,8 +265,8 @@ class SparkleFormation
|
|
262
265
|
# @note if symbol is provided for template, double underscores
|
263
266
|
# will be used for directory separator and dashes will match underscores
|
264
267
|
def nest(template, struct, *args, &block)
|
265
|
-
options = args.detect{|i| i.is_a?(Hash)}
|
266
|
-
if
|
268
|
+
options = args.detect { |i| i.is_a?(Hash) }
|
269
|
+
if options
|
267
270
|
args.delete(options)
|
268
271
|
else
|
269
272
|
options = {}
|
@@ -273,20 +276,20 @@ class SparkleFormation
|
|
273
276
|
end
|
274
277
|
to_nest = struct._self.sparkle.get(:template, template, options[:provider])
|
275
278
|
resource_name = template.to_s.gsub('__', '_')
|
276
|
-
unless
|
279
|
+
unless args.empty?
|
277
280
|
resource_name = [
|
278
281
|
options.delete(:overwrite_name) ? nil : resource_name,
|
279
|
-
args.map{|a| Bogo::Utility.snake(a)}.join('_')
|
282
|
+
args.map { |a| Bogo::Utility.snake(a) }.join('_'),
|
280
283
|
].flatten.compact.join('_').to_sym
|
281
284
|
end
|
282
285
|
resource_name = struct._process_key(resource_name.to_sym)
|
283
286
|
nested_template = compile(to_nest[:path], :sparkle)
|
284
287
|
nested_template.parent = struct._self
|
285
288
|
nested_template.name = resource_name
|
286
|
-
if
|
289
|
+
if options[:parameters]
|
287
290
|
nested_template.compile_state = options[:parameters]
|
288
291
|
end
|
289
|
-
unless
|
292
|
+
unless struct._self.sparkle.empty?
|
290
293
|
nested_template.sparkle.apply(struct._self.sparkle)
|
291
294
|
end
|
292
295
|
nested_resource = struct.dynamic!(
|
@@ -306,15 +309,15 @@ class SparkleFormation
|
|
306
309
|
# @param args [Object] parameters for dynamic
|
307
310
|
# @return [SparkleStruct]
|
308
311
|
def builtin_insert(dynamic_name, struct, *args, &block)
|
309
|
-
if
|
312
|
+
if struct._self.provider_resources && lookup_key = struct._self.provider_resources.registry_key(dynamic_name)
|
310
313
|
_name, _config = *args
|
311
314
|
_config ||= {}
|
312
315
|
__t_hashish(_config)
|
313
|
-
unless
|
316
|
+
unless _name.is_a?(SparkleFormation::FunctionStruct)
|
314
317
|
__t_stringish(_name)
|
315
318
|
resource_name = [
|
316
319
|
_name,
|
317
|
-
_config.fetch(:resource_name_suffix, dynamic_name)
|
320
|
+
_config.fetch(:resource_name_suffix, dynamic_name),
|
318
321
|
].compact.join('_').to_sym
|
319
322
|
else
|
320
323
|
resource_name = _name._root
|
@@ -323,12 +326,12 @@ class SparkleFormation
|
|
323
326
|
new_resource = struct.resources.set!(resource_name)
|
324
327
|
new_resource.type lookup_key
|
325
328
|
properties = new_resource.properties
|
326
|
-
config_keys = _config.keys.zip(_config.keys.map{|k| snake(k).to_s.tr('_', '')})
|
329
|
+
config_keys = _config.keys.zip(_config.keys.map { |k| snake(k).to_s.tr('_', '') })
|
327
330
|
struct._self.provider_resources.resource(dynamic_name, :properties).each do |prop_name|
|
328
|
-
key = (config_keys.detect{|k| k.last == snake(prop_name).to_s.tr('_', '')} || []).first
|
331
|
+
key = (config_keys.detect { |k| k.last == snake(prop_name).to_s.tr('_', '') } || []).first
|
329
332
|
value = _config[key] if key
|
330
|
-
if
|
331
|
-
if
|
333
|
+
if value
|
334
|
+
if value.is_a?(Proc)
|
332
335
|
properties.set!(prop_name, &value)
|
333
336
|
else
|
334
337
|
properties.set!(prop_name, value)
|
@@ -399,26 +402,25 @@ class SparkleFormation
|
|
399
402
|
# @option options [Hash] :parameters parameters for stack generation
|
400
403
|
# @option options [Truthy, Falsey] :disable_aws_builtins do not load builtins
|
401
404
|
# @yield base context
|
402
|
-
def initialize(name, options={}, &base_block)
|
405
|
+
def initialize(name, options = {}, &base_block)
|
403
406
|
@name = name.to_sym
|
404
407
|
@component_paths = []
|
405
|
-
if
|
408
|
+
if options[:sparkle_collection]
|
406
409
|
@sparkle = options[:sparkle_collection]
|
407
|
-
if
|
410
|
+
if options[:sparkle]
|
408
411
|
@sparkle.add_sparkle(options[:sparkle])
|
409
412
|
end
|
410
413
|
else
|
411
414
|
@sparkle = SparkleCollection.new
|
412
|
-
if
|
415
|
+
if options[:sparkle]
|
413
416
|
@sparkle.set_root(options[:sparkle])
|
414
417
|
else
|
415
418
|
@sparkle.set_root(
|
416
419
|
Sparkle.new(
|
417
|
-
Smash.new.tap{|h|
|
420
|
+
Smash.new.tap { |h|
|
418
421
|
s_path = options.fetch(:sparkle_path,
|
419
|
-
|
420
|
-
|
421
|
-
if(s_path)
|
422
|
+
self.class.custom_paths[:sparkle_path])
|
423
|
+
if s_path
|
422
424
|
h[:root] = s_path
|
423
425
|
else
|
424
426
|
h[:root] = :none
|
@@ -429,26 +431,25 @@ class SparkleFormation
|
|
429
431
|
end
|
430
432
|
end
|
431
433
|
self.provider = options.fetch(:provider, @parent ? @parent.provider : :aws)
|
432
|
-
if
|
434
|
+
if provider == :aws || !options[:disable_aws_builtins]
|
433
435
|
require 'sparkle_formation/aws'
|
434
436
|
end
|
435
437
|
@parameters = set_generation_parameters!(
|
436
438
|
options.fetch(:compile_time_parameters,
|
437
|
-
|
438
|
-
)
|
439
|
+
options.fetch(:parameters, {}))
|
439
440
|
)
|
440
441
|
@stack_resource_types = [
|
441
442
|
stack_resource_type,
|
442
|
-
*options.fetch(:stack_resource_types, [])
|
443
|
+
*options.fetch(:stack_resource_types, []),
|
443
444
|
].compact.uniq
|
444
445
|
@blacklisted_templates = [name]
|
445
446
|
@composition = Composition.new(self)
|
446
447
|
@parent = options[:parent]
|
447
448
|
@seed = Smash.new(
|
448
449
|
:inherit => options[:inherit],
|
449
|
-
:layering => options[:layering]
|
450
|
+
:layering => options[:layering],
|
450
451
|
)
|
451
|
-
if
|
452
|
+
if base_block
|
452
453
|
load_block(base_block)
|
453
454
|
end
|
454
455
|
@compiled = nil
|
@@ -462,12 +463,12 @@ class SparkleFormation
|
|
462
463
|
def seed_self
|
463
464
|
memoize(:seed) do
|
464
465
|
options = @seed
|
465
|
-
if
|
466
|
+
if options[:inherit] && options[:layering].to_s == 'merge'
|
466
467
|
raise ArgumentError.new 'Cannot merge and inherit!'
|
467
468
|
end
|
468
|
-
if
|
469
|
+
if options[:inherit]
|
469
470
|
inherit_from(options[:inherit])
|
470
|
-
elsif
|
471
|
+
elsif options[:layering].to_s == 'merge'
|
471
472
|
merge_previous!
|
472
473
|
end
|
473
474
|
true
|
@@ -491,7 +492,7 @@ class SparkleFormation
|
|
491
492
|
# @param template_name [String] name of template to inherit
|
492
493
|
# @return [self]
|
493
494
|
def inherit_from(template_name)
|
494
|
-
if
|
495
|
+
if blacklisted_templates.map(&:to_s).include?(template_name.to_s)
|
495
496
|
raise Error::CircularInheritance.new "Circular inheritance detected between templates `#{template_name}` and `#{name}`" # rubocop:disable Metrics/LineLength
|
496
497
|
end
|
497
498
|
template = self.class.compile(sparkle.get(:template, template_name)[:path], :sparkle)
|
@@ -507,7 +508,7 @@ class SparkleFormation
|
|
507
508
|
# @return [self]
|
508
509
|
def extract_template_data(template)
|
509
510
|
# TODO: Should allow forced override here for cases like: openstack -> rackspace
|
510
|
-
if
|
511
|
+
if provider != template.provider
|
511
512
|
raise TypeError.new "This template `#{name}` cannot inherit template `#{template.name}`! Provider mismatch: `#{provider}` != `#{template.provider}`" # rubocop:disable Metrics/LineLength
|
512
513
|
end
|
513
514
|
template.sparkle.apply(sparkle)
|
@@ -517,15 +518,14 @@ class SparkleFormation
|
|
517
518
|
)
|
518
519
|
@parameters = template.parameters.to_smash.deep_merge(parameters.to_smash)
|
519
520
|
new_composition = Composition.new(self,
|
520
|
-
|
521
|
-
|
522
|
-
)
|
521
|
+
:components => template.composition.composite,
|
522
|
+
:overrides => composition.overrides)
|
523
523
|
composition.components.each do |item|
|
524
|
-
if
|
524
|
+
if item.respond_to?(:key) && item.key == '__base__'
|
525
525
|
item.key = Smash.new(
|
526
526
|
:template => name,
|
527
527
|
:component => :__base__,
|
528
|
-
:object_id => object_id
|
528
|
+
:object_id => object_id,
|
529
529
|
).checksum.to_s
|
530
530
|
end
|
531
531
|
new_composition.add_component(item)
|
@@ -546,10 +546,10 @@ class SparkleFormation
|
|
546
546
|
# @param val [String, Symbol, NilClass, FalseClass] remote provider
|
547
547
|
# @return [Symbol, NilClass]
|
548
548
|
def provider=(val)
|
549
|
-
if
|
549
|
+
if val
|
550
550
|
@provider = Bogo::Utility.snake(val).to_sym
|
551
551
|
provider_klass = Bogo::Utility.camel(@provider.to_s)
|
552
|
-
if
|
552
|
+
if Provider.const_defined?(provider_klass)
|
553
553
|
extend Provider.const_get(provider_klass)
|
554
554
|
end
|
555
555
|
sparkle.provider = val
|
@@ -569,7 +569,7 @@ class SparkleFormation
|
|
569
569
|
|
570
570
|
# @return [SparkleFormation] root stack
|
571
571
|
def root
|
572
|
-
if
|
572
|
+
if parent
|
573
573
|
parent.root
|
574
574
|
else
|
575
575
|
self
|
@@ -578,7 +578,7 @@ class SparkleFormation
|
|
578
578
|
|
579
579
|
# @return [Array<SparkleFormation] path to root
|
580
580
|
def root_path
|
581
|
-
if
|
581
|
+
if parent
|
582
582
|
[*parent.root_path, self].compact
|
583
583
|
else
|
584
584
|
[self]
|
@@ -594,7 +594,7 @@ class SparkleFormation
|
|
594
594
|
ALLOWED_GENERATION_PARAMETERS = [
|
595
595
|
'type', 'default', 'description', 'multiple', 'prompt_when_nested',
|
596
596
|
'allowed_values', 'allowed_pattern', 'max_length', 'min_length',
|
597
|
-
'max_value', 'min_value'
|
597
|
+
'max_value', 'min_value',
|
598
598
|
]
|
599
599
|
# Allowed data types for parameters
|
600
600
|
VALID_GENERATION_PARAMETER_TYPES = ['String', 'Number', 'Complex']
|
@@ -606,10 +606,10 @@ class SparkleFormation
|
|
606
606
|
# @yieldparam [SparkleFormation]
|
607
607
|
# @return [Proc, NilClass]
|
608
608
|
def compile_time_parameter_setter(&block)
|
609
|
-
if
|
609
|
+
if block
|
610
610
|
@compile_time_parameter_setter = block
|
611
611
|
else
|
612
|
-
if
|
612
|
+
if @compile_time_parameter_setter
|
613
613
|
@compile_time_parameter_setter
|
614
614
|
else
|
615
615
|
parent.nil? ? nil : parent.compile_time_parameter_setter
|
@@ -620,7 +620,7 @@ class SparkleFormation
|
|
620
620
|
# Set the compile time parameters for the stack if the setter proc
|
621
621
|
# is available
|
622
622
|
def set_compile_time_parameters!
|
623
|
-
if
|
623
|
+
if compile_time_parameter_setter
|
624
624
|
compile_time_parameter_setter.call(self)
|
625
625
|
end
|
626
626
|
end
|
@@ -633,10 +633,10 @@ class SparkleFormation
|
|
633
633
|
# @raises [ArgumentError]
|
634
634
|
def set_generation_parameters!(params)
|
635
635
|
params.each do |name, value|
|
636
|
-
unless
|
636
|
+
unless value.is_a?(Hash)
|
637
637
|
raise TypeError.new("Expecting `Hash` type. Received `#{value.class}`")
|
638
638
|
end
|
639
|
-
if
|
639
|
+
if key = value.keys.detect { |k| !ALLOWED_GENERATION_PARAMETERS.include?(k.to_s) }
|
640
640
|
raise ArgumentError.new("Invalid generation parameter key provided `#{key}`")
|
641
641
|
end
|
642
642
|
end
|
@@ -651,6 +651,7 @@ class SparkleFormation
|
|
651
651
|
composition.new_component(:__base__, &block)
|
652
652
|
true
|
653
653
|
end
|
654
|
+
|
654
655
|
alias_method :load_block, :block
|
655
656
|
|
656
657
|
# Load components into instance
|
@@ -659,7 +660,7 @@ class SparkleFormation
|
|
659
660
|
# @return [self]
|
660
661
|
def load(*args, &user_block)
|
661
662
|
args.each do |thing|
|
662
|
-
if
|
663
|
+
if thing.is_a?(String)
|
663
664
|
# NOTE: This needs to be deprecated and removed
|
664
665
|
# TODO: deprecate
|
665
666
|
key = File.basename(thing.to_s).sub('.rb', '')
|
@@ -668,7 +669,7 @@ class SparkleFormation
|
|
668
669
|
composition.new_component(thing)
|
669
670
|
end
|
670
671
|
end
|
671
|
-
if
|
672
|
+
if block_given?
|
672
673
|
block(user_block)
|
673
674
|
end
|
674
675
|
self
|
@@ -678,7 +679,7 @@ class SparkleFormation
|
|
678
679
|
#
|
679
680
|
# @param args [Hash] optional arguments to provide state
|
680
681
|
# @yield override block
|
681
|
-
def overrides(args={}, &block)
|
682
|
+
def overrides(args = {}, &block)
|
682
683
|
composition.new_override(args, &block)
|
683
684
|
self
|
684
685
|
end
|
@@ -688,8 +689,8 @@ class SparkleFormation
|
|
688
689
|
# @param args [Hash]
|
689
690
|
# @option args [Hash] :state local state parameters
|
690
691
|
# @return [SparkleStruct]
|
691
|
-
def compile(args={})
|
692
|
-
if
|
692
|
+
def compile(args = {})
|
693
|
+
if args.key?(:state) && args.is_a?(Hash)
|
693
694
|
@compile_state = args[:state].to_smash
|
694
695
|
unmemoize(:compile)
|
695
696
|
end
|
@@ -698,34 +699,34 @@ class SparkleFormation
|
|
698
699
|
seed_self
|
699
700
|
|
700
701
|
set_compile_time_parameters!
|
701
|
-
if
|
702
|
+
if provider && SparkleStruct.const_defined?(camel(provider))
|
702
703
|
struct_class = SparkleStruct.const_get(camel(provider))
|
703
704
|
struct_name = [SparkleStruct.name, camel(provider)].join('::')
|
704
|
-
struct_class.define_singleton_method(:name){ struct_name }
|
705
|
-
struct_class.define_singleton_method(:to_s){ struct_name }
|
705
|
+
struct_class.define_singleton_method(:name) { struct_name }
|
706
|
+
struct_class.define_singleton_method(:to_s) { struct_name }
|
706
707
|
else
|
707
708
|
struct_class = SparkleStruct
|
708
709
|
end
|
709
|
-
if
|
710
|
+
if Resources.const_defined?(camel(provider))
|
710
711
|
@provider_resources = Resources.const_get(camel(provider))
|
711
712
|
provider_resources.load!
|
712
713
|
end
|
713
714
|
compiled = struct_class.new
|
714
715
|
compiled._set_self(self)
|
715
716
|
compiled._struct_class = struct_class
|
716
|
-
if
|
717
|
+
if struct_class.const_defined?(:CAMEL_KEYS)
|
717
718
|
compiled._camel_keys = struct_class.const_get(:CAMEL_KEYS)
|
718
719
|
end
|
719
|
-
if
|
720
|
+
if struct_class.const_defined?(:CAMEL_STYLE)
|
720
721
|
compiled._camel_style = struct_class.const_get(:CAMEL_STYLE)
|
721
722
|
end
|
722
|
-
if
|
723
|
+
if compile_state
|
723
724
|
compiled.set_state!(compile_state)
|
724
725
|
end
|
725
726
|
composition.each do |item|
|
726
727
|
case item
|
727
728
|
when Composition::Component
|
728
|
-
if
|
729
|
+
if item.block
|
729
730
|
self.class.build(compiled, &item.block)
|
730
731
|
else
|
731
732
|
sparkle.get(:component, item.key).monochrome.each do |component_block|
|
@@ -733,13 +734,13 @@ class SparkleFormation
|
|
733
734
|
end
|
734
735
|
end
|
735
736
|
when Composition::Override
|
736
|
-
if
|
737
|
+
if item.args && !item.args.empty?
|
737
738
|
compiled._set_state(item.args)
|
738
739
|
end
|
739
740
|
self.class.build(compiled, &item.block)
|
740
741
|
end
|
741
742
|
end
|
742
|
-
if
|
743
|
+
if compile_state && !compile_state.empty?
|
743
744
|
set_compiled_state(compiled)
|
744
745
|
end
|
745
746
|
compiled
|
@@ -754,11 +755,11 @@ class SparkleFormation
|
|
754
755
|
def set_compiled_state(compiled)
|
755
756
|
storage_compile_state = Smash.new
|
756
757
|
parameters.each do |param_key, param_config|
|
757
|
-
if
|
758
|
+
if param_config.fetch(:type, 'string').to_s.downcase.to_sym != :complex
|
758
759
|
storage_compile_state[param_key] = compile_state[param_key]
|
759
760
|
end
|
760
761
|
end
|
761
|
-
unless
|
762
|
+
unless storage_compile_state.empty?
|
762
763
|
compiled.outputs.compile_state.value MultiJson.dump(storage_compile_state)
|
763
764
|
end
|
764
765
|
compiled
|
@@ -774,15 +775,15 @@ class SparkleFormation
|
|
774
775
|
|
775
776
|
# @return [Array<SparkleFormation>]
|
776
777
|
def nested_stacks(*args)
|
777
|
-
if
|
778
|
+
if compile[:resources]
|
778
779
|
compile.resources.keys!.map do |key|
|
779
|
-
if
|
780
|
-
if
|
780
|
+
if stack_resource_type?(compile.resources[key].type)
|
781
|
+
if !compile.resources[key].properties.stack.nil?
|
781
782
|
result = [compile.resources[key].properties.stack]
|
782
|
-
if
|
783
|
+
if args.include?(:with_resource)
|
783
784
|
result.push(compile[:resources][key])
|
784
785
|
end
|
785
|
-
if
|
786
|
+
if args.include?(:with_name)
|
786
787
|
result.push(key)
|
787
788
|
end
|
788
789
|
result.size == 1 ? result.first : result
|
@@ -795,11 +796,11 @@ class SparkleFormation
|
|
795
796
|
end
|
796
797
|
|
797
798
|
# @return [TrueClass, FalseClass] includes nested stacks
|
798
|
-
def nested?(stack_hash=nil)
|
799
|
-
if
|
799
|
+
def nested?(stack_hash = nil)
|
800
|
+
if stack_hash
|
800
801
|
raise Error::Deprecated.new "Hash parameter no longer valid for this method (`#{self.class}##{__callee__}`)"
|
801
802
|
end
|
802
|
-
unless
|
803
|
+
unless compile.resources.nil?
|
803
804
|
compile.resources._data.any? do |r_name, r_value|
|
804
805
|
stack_resource_type?(r_value.type)
|
805
806
|
end
|
@@ -807,11 +808,11 @@ class SparkleFormation
|
|
807
808
|
end
|
808
809
|
|
809
810
|
# @return [TrueClass, FalseClass] includes _only_ nested stacks
|
810
|
-
def isolated_nests?(stack_hash=nil)
|
811
|
-
if
|
811
|
+
def isolated_nests?(stack_hash = nil)
|
812
|
+
if stack_hash
|
812
813
|
raise Error::Deprecated.new "Hash parameter no longer valid for this method (`#{self.class}##{__callee__}`)"
|
813
814
|
end
|
814
|
-
unless
|
815
|
+
unless compile.resources.nil?
|
815
816
|
compile.resources._data.all? do |r_name, r_value|
|
816
817
|
stack_resource_type?(r_value.type)
|
817
818
|
end
|
@@ -819,11 +820,11 @@ class SparkleFormation
|
|
819
820
|
end
|
820
821
|
|
821
822
|
# @return [TrueClass, FalseClass] policies defined
|
822
|
-
def includes_policies?(stack_hash=nil)
|
823
|
-
if
|
823
|
+
def includes_policies?(stack_hash = nil)
|
824
|
+
if stack_hash
|
824
825
|
raise Error::Deprecated.new "Hash parameter no longer valid for this method (`#{self.class}##{__callee__}`)"
|
825
826
|
end
|
826
|
-
unless
|
827
|
+
unless compile.resources.nil?
|
827
828
|
compile.resources._data.any? do |r_name, r_value|
|
828
829
|
!r_value.policy.nil?
|
829
830
|
end
|
@@ -843,7 +844,7 @@ class SparkleFormation
|
|
843
844
|
# @return [SparkleFormation::SparkleStruct] compiled structure
|
844
845
|
# @note see specific version for expected block parameters
|
845
846
|
def apply_nesting(*args, &block)
|
846
|
-
if
|
847
|
+
if args.include?(:shallow)
|
847
848
|
apply_shallow_nesting(&block)
|
848
849
|
else
|
849
850
|
apply_deep_nesting(&block)
|
@@ -901,7 +902,7 @@ class SparkleFormation
|
|
901
902
|
# @param x_stacks [Array<Array<SparkleFormation, SparkleStruct, String>>]
|
902
903
|
def stack_template_extractor(x_stacks, &block)
|
903
904
|
x_stacks.each do |stack, resource, s_name|
|
904
|
-
unless
|
905
|
+
unless stack.nested_stacks.empty?
|
905
906
|
stack_template_extractor(stack.nested_stacks(:with_resource, :with_name), &block)
|
906
907
|
end
|
907
908
|
resource.properties._delete(:stack)
|
@@ -927,8 +928,8 @@ class SparkleFormation
|
|
927
928
|
|
928
929
|
# @return [Smash<output_name:SparkleFormation>]
|
929
930
|
def collect_outputs(*args)
|
930
|
-
if
|
931
|
-
if
|
931
|
+
if args.include?(:force) || root?
|
932
|
+
if !compile.outputs.nil? && !root?
|
932
933
|
outputs = Smash[
|
933
934
|
compile.outputs.keys!.zip(
|
934
935
|
[self] * compile.outputs.keys!.size
|
@@ -938,7 +939,11 @@ class SparkleFormation
|
|
938
939
|
outputs = Smash.new
|
939
940
|
end
|
940
941
|
nested_stacks.each do |nested_stack|
|
941
|
-
|
942
|
+
if nested_stack.is_a?(self.class) === true
|
943
|
+
n_stack = nested_stack
|
944
|
+
else
|
945
|
+
n_stack = nested_stack._self
|
946
|
+
end
|
942
947
|
outputs = n_stack.collect_outputs(:force).merge(outputs)
|
943
948
|
end
|
944
949
|
outputs
|
@@ -989,5 +994,4 @@ class SparkleFormation
|
|
989
994
|
end
|
990
995
|
MultiJson.dump(compile.dump!, *args)
|
991
996
|
end
|
992
|
-
|
993
997
|
end
|