sparkle_formation 3.0.30 → 3.0.32

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/lib/sparkle_formation.rb +23 -23
  4. data/lib/sparkle_formation/aws.rb +1 -1
  5. data/lib/sparkle_formation/composition.rb +7 -7
  6. data/lib/sparkle_formation/error.rb +2 -2
  7. data/lib/sparkle_formation/function_struct.rb +22 -22
  8. data/lib/sparkle_formation/provider.rb +7 -7
  9. data/lib/sparkle_formation/provider/aws.rb +28 -28
  10. data/lib/sparkle_formation/provider/azure.rb +7 -7
  11. data/lib/sparkle_formation/provider/google.rb +16 -16
  12. data/lib/sparkle_formation/provider/heat.rb +6 -6
  13. data/lib/sparkle_formation/provider/terraform.rb +7 -7
  14. data/lib/sparkle_formation/resources.rb +18 -18
  15. data/lib/sparkle_formation/resources/aws.rb +216 -126
  16. data/lib/sparkle_formation/resources/aws_resources.json +3463 -1601
  17. data/lib/sparkle_formation/resources/azure.rb +6 -6
  18. data/lib/sparkle_formation/resources/google.rb +7 -7
  19. data/lib/sparkle_formation/resources/heat.rb +2 -2
  20. data/lib/sparkle_formation/resources/rackspace.rb +2 -2
  21. data/lib/sparkle_formation/resources/terraform.rb +6 -6
  22. data/lib/sparkle_formation/sparkle.rb +32 -32
  23. data/lib/sparkle_formation/sparkle_attribute.rb +10 -10
  24. data/lib/sparkle_formation/sparkle_attribute/aws.rb +30 -30
  25. data/lib/sparkle_formation/sparkle_attribute/azure.rb +39 -39
  26. data/lib/sparkle_formation/sparkle_attribute/google.rb +19 -19
  27. data/lib/sparkle_formation/sparkle_attribute/heat.rb +16 -16
  28. data/lib/sparkle_formation/sparkle_attribute/rackspace.rb +1 -1
  29. data/lib/sparkle_formation/sparkle_attribute/terraform.rb +41 -41
  30. data/lib/sparkle_formation/sparkle_collection.rb +4 -4
  31. data/lib/sparkle_formation/sparkle_collection/rainbow.rb +3 -3
  32. data/lib/sparkle_formation/sparkle_formation.rb +31 -31
  33. data/lib/sparkle_formation/sparkle_struct.rb +5 -5
  34. data/lib/sparkle_formation/translation.rb +32 -32
  35. data/lib/sparkle_formation/translation/heat.rb +126 -126
  36. data/lib/sparkle_formation/translation/rackspace.rb +118 -118
  37. data/lib/sparkle_formation/utils.rb +5 -5
  38. data/lib/sparkle_formation/version.rb +1 -1
  39. data/sparkle_formation.gemspec +1 -1
  40. metadata +7 -7
@@ -1,11 +1,11 @@
1
- require 'sparkle_formation'
1
+ require "sparkle_formation"
2
2
 
3
3
  class SparkleFormation
4
4
  # Provides a collection of sparkles
5
5
  # @todo add unmemoize behavior on collection modification to prevent
6
6
  # leak on long running processes with long lasting collections
7
7
  class SparkleCollection < Sparkle
8
- autoload :Rainbow, 'sparkle_formation/sparkle_collection/rainbow'
8
+ autoload :Rainbow, "sparkle_formation/sparkle_collection/rainbow"
9
9
 
10
10
  # @return [Symbol] provider
11
11
  attr_accessor :provider
@@ -16,7 +16,7 @@ class SparkleFormation
16
16
  # @option args [Symbol, String] :provider name of default provider
17
17
  # @return [self]
18
18
  def initialize(args = {})
19
- @provider = Bogo::Utility.snake(args.to_smash.fetch(:provider, 'aws')).to_sym
19
+ @provider = Bogo::Utility.snake(args.to_smash.fetch(:provider, "aws")).to_sym
20
20
  @root = nil
21
21
  @sparkles = []
22
22
  end
@@ -164,7 +164,7 @@ class SparkleFormation
164
164
  target_provider = provider
165
165
  end
166
166
  result = send(type_name).get(target_provider, name)
167
- if result.nil? && type_name == 'templates'
167
+ if result.nil? && type_name == "templates"
168
168
  t_direct = sparkles.map do |pack|
169
169
  begin
170
170
  pack.get(:template, name, target_provider)
@@ -1,5 +1,5 @@
1
- require 'sparkle_formation'
2
- require 'forwardable'
1
+ require "sparkle_formation"
2
+ require "forwardable"
3
3
 
4
4
  class SparkleFormation
5
5
  class SparkleCollection
@@ -73,7 +73,7 @@ class SparkleFormation
73
73
  def monochrome
74
74
  Array.new.tap do |result|
75
75
  spectrum.each do |item|
76
- unless item.get(:args, :layering).to_s == 'merge'
76
+ unless item.get(:args, :layering).to_s == "merge"
77
77
  result.clear
78
78
  end
79
79
  result << item
@@ -1,4 +1,4 @@
1
- require 'sparkle_formation'
1
+ require "sparkle_formation"
2
2
 
3
3
  # Formation container
4
4
  class SparkleFormation
@@ -9,13 +9,13 @@ class SparkleFormation
9
9
 
10
10
  # @return [Array<String>] directory names to ignore
11
11
  IGNORE_DIRECTORIES = [
12
- 'components',
13
- 'dynamics',
14
- 'registry',
12
+ "components",
13
+ "dynamics",
14
+ "registry",
15
15
  ]
16
16
 
17
17
  # @return [String] default stack resource name
18
- DEFAULT_STACK_RESOURCE = 'AWS::CloudFormation::Stack'
18
+ DEFAULT_STACK_RESOURCE = "AWS::CloudFormation::Stack"
19
19
  # @return [Array<String>] collection of valid stack resource types
20
20
  VALID_STACK_RESOURCES = [DEFAULT_STACK_RESOURCE]
21
21
 
@@ -40,9 +40,9 @@ class SparkleFormation
40
40
  def sparkle_path=(path = nil)
41
41
  if path
42
42
  custom_paths[:sparkle_path] = path
43
- custom_paths[:components_directory] = File.join(path, 'components')
44
- custom_paths[:dynamics_directory] = File.join(path, 'dynamics')
45
- custom_paths[:registry_directory] = File.join(path, 'registry')
43
+ custom_paths[:components_directory] = File.join(path, "components")
44
+ custom_paths[:dynamics_directory] = File.join(path, "dynamics")
45
+ custom_paths[:registry_directory] = File.join(path, "registry")
46
46
  end
47
47
  custom_paths[:sparkle_path]
48
48
  end
@@ -141,7 +141,7 @@ class SparkleFormation
141
141
  # @return [TrueClass]
142
142
  def load_dynamics!(directory)
143
143
  @loaded_dynamics ||= []
144
- Dir.glob(File.join(directory, '*.rb')).each do |dyn|
144
+ Dir.glob(File.join(directory, "*.rb")).each do |dyn|
145
145
  dyn = File.expand_path(dyn)
146
146
  next if @loaded_dynamics.include?(dyn)
147
147
  instance_eval(IO.read(dyn), dyn, 1)
@@ -156,7 +156,7 @@ class SparkleFormation
156
156
  # @param directory [String]
157
157
  # @return [TrueClass]
158
158
  def load_registry!(directory)
159
- Dir.glob(File.join(directory, '*.rb')).each do |reg|
159
+ Dir.glob(File.join(directory, "*.rb")).each do |reg|
160
160
  reg = File.expand_path(reg)
161
161
  require reg
162
162
  end
@@ -240,13 +240,13 @@ class SparkleFormation
240
240
  result = builtin_insert(dynamic_name, struct, *args, &block)
241
241
  unless result
242
242
  message = "Failed to locate requested dynamic block for insertion: #{dynamic_name} " \
243
- "(valid: #{struct._self.sparkle.dynamics.fetch(struct._self.sparkle.provider, {}).keys.sort.join(', ')})"
243
+ "(valid: #{struct._self.sparkle.dynamics.fetch(struct._self.sparkle.provider, {}).keys.sort.join(", ")})"
244
244
  if struct._self.provider_resources && struct._self.provider_resources.registry.keys.size > 1
245
245
  t_name = struct._self.provider_resources.registry.keys.first
246
246
  valid_t_name = Bogo::Utility.snake(
247
247
  t_name.split(
248
248
  struct._self.provider_resources.resource_type_splitter
249
- ).join('_')
249
+ ).join("_")
250
250
  )
251
251
  message << "\nBuiltin dynamics pattern `#{t_name}` -> `:#{Bogo::Utility.snake(valid_t_name)}`"
252
252
  end
@@ -275,12 +275,12 @@ class SparkleFormation
275
275
  __t_stringish(item)
276
276
  end
277
277
  to_nest = struct._self.sparkle.get(:template, template, options[:provider])
278
- resource_name = template.to_s.gsub('__', '_')
278
+ resource_name = template.to_s.gsub("__", "_")
279
279
  unless args.empty?
280
280
  resource_name = [
281
281
  options.delete(:overwrite_name) ? nil : resource_name,
282
- args.map { |a| Bogo::Utility.snake(a) }.join('_'),
283
- ].flatten.compact.join('_').to_sym
282
+ args.map { |a| Bogo::Utility.snake(a) }.join("_"),
283
+ ].flatten.compact.join("_").to_sym
284
284
  end
285
285
  resource_name = struct._process_key(resource_name.to_sym)
286
286
  nested_template = compile(to_nest[:path], :sparkle)
@@ -318,7 +318,7 @@ class SparkleFormation
318
318
  resource_name = [
319
319
  _name,
320
320
  _config.fetch(:resource_name_suffix, dynamic_name),
321
- ].compact.join('_').to_sym
321
+ ].compact.join("_").to_sym
322
322
  else
323
323
  resource_name = _name._root
324
324
  end
@@ -326,9 +326,9 @@ class SparkleFormation
326
326
  new_resource = struct.resources.set!(resource_name)
327
327
  new_resource.type lookup_key
328
328
  properties = new_resource.properties
329
- 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("_", "") })
330
330
  struct._self.provider_resources.resource(dynamic_name, :properties).each do |prop_name|
331
- 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
332
332
  value = _config[key] if key
333
333
  if value
334
334
  if value.is_a?(Proc)
@@ -432,7 +432,7 @@ class SparkleFormation
432
432
  end
433
433
  self.provider = options.fetch(:provider, @parent ? @parent.provider : :aws)
434
434
  if provider == :aws || !options[:disable_aws_builtins]
435
- require 'sparkle_formation/aws'
435
+ require "sparkle_formation/aws"
436
436
  end
437
437
  @parameters = set_generation_parameters!(
438
438
  options.fetch(:compile_time_parameters,
@@ -463,12 +463,12 @@ class SparkleFormation
463
463
  def seed_self
464
464
  memoize(:seed) do
465
465
  options = @seed
466
- if options[:inherit] && options[:layering].to_s == 'merge'
467
- raise ArgumentError.new 'Cannot merge and inherit!'
466
+ if options[:inherit] && options[:layering].to_s == "merge"
467
+ raise ArgumentError.new "Cannot merge and inherit!"
468
468
  end
469
469
  if options[:inherit]
470
470
  inherit_from(options[:inherit])
471
- elsif options[:layering].to_s == 'merge'
471
+ elsif options[:layering].to_s == "merge"
472
472
  merge_previous!
473
473
  end
474
474
  true
@@ -521,7 +521,7 @@ class SparkleFormation
521
521
  :components => template.composition.composite,
522
522
  :overrides => composition.overrides)
523
523
  composition.components.each do |item|
524
- if item.respond_to?(:key) && item.key == '__base__'
524
+ if item.respond_to?(:key) && item.key == "__base__"
525
525
  item.key = Smash.new(
526
526
  :template => name,
527
527
  :component => :__base__,
@@ -592,12 +592,12 @@ class SparkleFormation
592
592
 
593
593
  # Attributes allowed for generation parameter definitions
594
594
  ALLOWED_GENERATION_PARAMETERS = [
595
- 'type', 'default', 'description', 'multiple', 'prompt_when_nested',
596
- 'allowed_values', 'allowed_pattern', 'max_length', 'min_length',
597
- 'max_value', 'min_value',
595
+ "type", "default", "description", "multiple", "prompt_when_nested",
596
+ "allowed_values", "allowed_pattern", "max_length", "min_length",
597
+ "max_value", "min_value",
598
598
  ]
599
599
  # Allowed data types for parameters
600
- VALID_GENERATION_PARAMETER_TYPES = ['String', 'Number', 'Complex']
600
+ VALID_GENERATION_PARAMETER_TYPES = ["String", "Number", "Complex"]
601
601
 
602
602
  # Get or set the compile time parameter setting block. If a get
603
603
  # request the ancestor path will be searched to root
@@ -663,7 +663,7 @@ class SparkleFormation
663
663
  if thing.is_a?(String)
664
664
  # NOTE: This needs to be deprecated and removed
665
665
  # TODO: deprecate
666
- key = File.basename(thing.to_s).sub('.rb', '')
666
+ key = File.basename(thing.to_s).sub(".rb", "")
667
667
  composition.new_component(key, &self.class.load_component(thing))
668
668
  else
669
669
  composition.new_component(thing)
@@ -701,7 +701,7 @@ class SparkleFormation
701
701
  set_compile_time_parameters!
702
702
  if provider && SparkleStruct.const_defined?(camel(provider))
703
703
  struct_class = SparkleStruct.const_get(camel(provider))
704
- struct_name = [SparkleStruct.name, camel(provider)].join('::')
704
+ struct_name = [SparkleStruct.name, camel(provider)].join("::")
705
705
  struct_class.define_singleton_method(:name) { struct_name }
706
706
  struct_class.define_singleton_method(:to_s) { struct_name }
707
707
  else
@@ -755,7 +755,7 @@ class SparkleFormation
755
755
  def set_compiled_state(compiled)
756
756
  storage_compile_state = Smash.new
757
757
  parameters.each do |param_key, param_config|
758
- if param_config.fetch(:type, 'string').to_s.downcase.to_sym != :complex
758
+ if param_config.fetch(:type, "string").to_s.downcase.to_sym != :complex
759
759
  storage_compile_state[param_key] = compile_state[param_key]
760
760
  end
761
761
  end
@@ -873,7 +873,7 @@ class SparkleFormation
873
873
  # @note will auto downcase name prior to comparison
874
874
  def output_matched?(p_name, output_names)
875
875
  output_names.detect do |o_name|
876
- Bogo::Utility.snake(o_name).tr('_', '') == Bogo::Utility.snake(p_name).tr('_', '')
876
+ Bogo::Utility.snake(o_name).tr("_", "") == Bogo::Utility.snake(p_name).tr("_", "")
877
877
  end
878
878
  end
879
879
 
@@ -1,5 +1,5 @@
1
- require 'sparkle_formation'
2
- require 'attribute_struct/monkey_camels'
1
+ require "sparkle_formation"
2
+ require "attribute_struct/monkey_camels"
3
3
 
4
4
  class SparkleFormation
5
5
 
@@ -74,7 +74,7 @@ class SparkleFormation
74
74
  def _self(*_)
75
75
  unless @self
76
76
  if _parent.nil?
77
- ::Kernel.raise ::ArgumentError.new 'Creator did not provide return reference!'
77
+ ::Kernel.raise ::ArgumentError.new "Creator did not provide return reference!"
78
78
  else
79
79
  _parent._self
80
80
  end
@@ -114,13 +114,13 @@ class SparkleFormation
114
114
  # FunctionStruct
115
115
  def method_missing(sym, *args, &block)
116
116
  if sym.is_a?(::String) || sym.is_a?(::Symbol)
117
- if sym.to_s.start_with?('_') || sym.to_s.end_with?('!')
117
+ if sym.to_s.start_with?("_") || sym.to_s.end_with?("!")
118
118
  ::Kernel.raise ::NoMethodError.new "Undefined method `#{sym}` for #{_klass.name}"
119
119
  end
120
120
  end
121
121
  super(*[sym, *args], &block)
122
122
  if sym.is_a?(::String) || sym.is_a?(::Symbol)
123
- if (s = sym.to_s).end_with?('=')
123
+ if (s = sym.to_s).end_with?("=")
124
124
  s.slice!(-1, s.length)
125
125
  sym = s
126
126
  end
@@ -1,12 +1,12 @@
1
- require 'sparkle_formation'
2
- require 'multi_json'
3
- require 'logger'
1
+ require "sparkle_formation"
2
+ require "multi_json"
3
+ require "logger"
4
4
 
5
5
  class SparkleFormation
6
6
  # Translator
7
7
  class Translation
8
- autoload :Heat, 'sparkle_formation/translation/heat'
9
- autoload :Rackspace, 'sparkle_formation/translation/rackspace'
8
+ autoload :Heat, "sparkle_formation/translation/heat"
9
+ autoload :Rackspace, "sparkle_formation/translation/rackspace"
10
10
 
11
11
  include SparkleFormation::Utils::AnimalStrings
12
12
  include SparkleFormation::SparkleAttribute
@@ -41,25 +41,25 @@ class SparkleFormation
41
41
  # @return [Hash] parameters for template
42
42
  def parameters
43
43
  Hash[
44
- @original.fetch('Parameters', {}).map do |k, v|
45
- [k, v.fetch('Default', '')]
44
+ @original.fetch("Parameters", {}).map do |k, v|
45
+ [k, v.fetch("Default", "")]
46
46
  end
47
47
  ].merge(@parameters)
48
48
  end
49
49
 
50
50
  # @return [Hash] mappings for template
51
51
  def mappings
52
- @original.fetch('Mappings', {})
52
+ @original.fetch("Mappings", {})
53
53
  end
54
54
 
55
55
  # @return [Hash] resources for template
56
56
  def resources
57
- @original.fetch('Resources', {})
57
+ @original.fetch("Resources", {})
58
58
  end
59
59
 
60
60
  # @return [Hash] outputs for template
61
61
  def outputs
62
- @original.fetch('Outputs', {})
62
+ @original.fetch("Outputs", {})
63
63
  end
64
64
 
65
65
  # @return [Hash] resource mapping
@@ -96,18 +96,18 @@ class SparkleFormation
96
96
  # @return [Hash, NilClass] new resource Hash or nil
97
97
  def resource_translation(resource_name, resource_args)
98
98
  new_resource = {}
99
- lookup = map[:resources][resource_args['Type']]
99
+ lookup = map[:resources][resource_args["Type"]]
100
100
  if lookup.nil?
101
- logger.warn "Failed to locate resource type: #{resource_args['Type']}"
101
+ logger.warn "Failed to locate resource type: #{resource_args["Type"]}"
102
102
  nil
103
103
  elsif lookup == :delete
104
104
  logger.warn "Deleting resource #{resource_name} due to configuration"
105
105
  nil
106
106
  else
107
- new_resource['Type'] = lookup[:name]
108
- if resource_args['Properties']
109
- new_resource['Properties'] = format_properties(
110
- :original_properties => resource_args['Properties'],
107
+ new_resource["Type"] = lookup[:name]
108
+ if resource_args["Properties"]
109
+ new_resource["Properties"] = format_properties(
110
+ :original_properties => resource_args["Properties"],
111
111
  :property_map => lookup[:properties],
112
112
  :new_resource => new_resource,
113
113
  :original_resource => resource_args,
@@ -130,7 +130,7 @@ class SparkleFormation
130
130
  # @option args [Hash] :original_resource
131
131
  # @return [Hash]
132
132
  def format_properties(args)
133
- args[:new_resource]['Properties'] = {}.tap do |new_properties|
133
+ args[:new_resource]["Properties"] = {}.tap do |new_properties|
134
134
  args[:original_properties].each do |property_name, property_value|
135
135
  new_key = args[:property_map][property_name]
136
136
  if new_key
@@ -147,7 +147,7 @@ class SparkleFormation
147
147
  end
148
148
  else
149
149
  logger.warn "Failed to locate property conversion for `#{property_name}` on " \
150
- "resource type `#{args[:new_resource]['Type']}`. Passing directly."
150
+ "resource type `#{args[:new_resource]["Type"]}`. Passing directly."
151
151
  new_properties[default_key_format(property_name)] = property_value
152
152
  end
153
153
  end
@@ -159,8 +159,8 @@ class SparkleFormation
159
159
  # @param value [Hash] resources hash
160
160
  # @return [Hash]
161
161
  def translate_resources(value)
162
- translated['Resources'] = {}
163
- translated['Resources'].tap do |modified_resources|
162
+ translated["Resources"] = {}
163
+ translated["Resources"].tap do |modified_resources|
164
164
  value.each do |resource_name, resource_args|
165
165
  new_resource = resource_translation(resource_name, resource_args)
166
166
  if new_resource
@@ -185,7 +185,7 @@ class SparkleFormation
185
185
  def dereference(obj)
186
186
  result = obj
187
187
  if obj.is_a?(Hash)
188
- name = obj['Ref'] || obj['get_param']
188
+ name = obj["Ref"] || obj["get_param"]
189
189
  if name
190
190
  p_val = parameters[name.to_s]
191
191
  if p_val
@@ -203,7 +203,7 @@ class SparkleFormation
203
203
  def resource_name(obj)
204
204
  case obj
205
205
  when Hash
206
- obj['Ref'] || obj['get_resource']
206
+ obj["Ref"] || obj["get_resource"]
207
207
  else
208
208
  obj.to_s
209
209
  end
@@ -258,13 +258,13 @@ class SparkleFormation
258
258
  def apply_rename(hash, names = [])
259
259
  k, v = hash.first
260
260
  if hash.size == 1
261
- if k.start_with?('Fn::')
261
+ if k.start_with?("Fn::")
262
262
  {self.class.const_get(:FN_MAPPING).fetch(k, k) => attr_mapping(*v)}
263
- elsif k == 'Ref'
263
+ elsif k == "Ref"
264
264
  if resources.key?(v)
265
- {'get_resource' => v}
265
+ {"get_resource" => v}
266
266
  else
267
- {'get_param' => self.class.const_get(:REF_MAPPING).fetch(v, v)}
267
+ {"get_param" => self.class.const_get(:REF_MAPPING).fetch(v, v)}
268
268
  end
269
269
  else
270
270
  hash
@@ -283,7 +283,7 @@ class SparkleFormation
283
283
  result = [resource_name, value]
284
284
  if r = resources[resource_name]
285
285
  attr_map = self.class.const_get(:FN_ATT_MAPPING)
286
- if attr_map[r['Type']] && replacement = attr_map[r['Type']][value]
286
+ if attr_map[r["Type"]] && replacement = attr_map[r["Type"]][value]
287
287
  result = [resource_name, *[replacement].flatten.compact]
288
288
  end
289
289
  end
@@ -299,11 +299,11 @@ class SparkleFormation
299
299
  # replacements using the REF_MAPPING constant
300
300
  def apply_function(hash, funcs = [])
301
301
  k, v = hash.first
302
- if hash.size == 1 && (k.start_with?('Fn') || k == 'Ref') && (funcs.empty? || funcs.include?(k))
302
+ if hash.size == 1 && (k.start_with?("Fn") || k == "Ref") && (funcs.empty? || funcs.include?(k))
303
303
  case k
304
- when 'Fn::Join'
304
+ when "Fn::Join"
305
305
  v.last.join(v.first)
306
- when 'Fn::FindInMap'
306
+ when "Fn::FindInMap"
307
307
  map_holder = mappings[v[0]]
308
308
  if map_holder
309
309
  map_item = map_holder[dereference(v[1])]
@@ -315,8 +315,8 @@ class SparkleFormation
315
315
  else
316
316
  raise "Failed to find mapping! (#{v[0]})"
317
317
  end
318
- when 'Ref'
319
- {'Ref' => self.class.const_get(:REF_MAPPING).fetch(v, v)}
318
+ when "Ref"
319
+ {"Ref" => self.class.const_get(:REF_MAPPING).fetch(v, v)}
320
320
  else
321
321
  hash
322
322
  end
@@ -17,14 +17,14 @@ class SparkleFormation
17
17
  translated[snake(k).to_s] = v
18
18
  end
19
19
  # params
20
- cache.fetch('Parameters', {}).each do |k, v|
21
- translated['parameters'][k] = Hash[
20
+ cache.fetch("Parameters", {}).each do |k, v|
21
+ translated["parameters"][k] = Hash[
22
22
  v.map do |key, value|
23
- if key == 'Type'
23
+ if key == "Type"
24
24
  [snake(key).to_s, value.downcase]
25
- elsif key == 'AllowedValues'
25
+ elsif key == "AllowedValues"
26
26
  # @todo fix this up to properly build constraints
27
- ['constraints', [{'allowed_values' => value}]]
27
+ ["constraints", [{"allowed_values" => value}]]
28
28
  else
29
29
  [snake(key).to_s, value]
30
30
  end
@@ -32,34 +32,34 @@ class SparkleFormation
32
32
  ]
33
33
  end
34
34
  # resources
35
- cache.fetch('Resources', {}).each do |r_name, r_value|
36
- translated['resources'][r_name] = Hash[
35
+ cache.fetch("Resources", {}).each do |r_name, r_value|
36
+ translated["resources"][r_name] = Hash[
37
37
  r_value.map do |k, v|
38
38
  [snake(k).to_s, v]
39
39
  end
40
40
  ]
41
41
  end
42
42
  # outputs
43
- cache.fetch('Outputs', {}).each do |o_name, o_value|
44
- translated['outputs'][o_name] = Hash[
43
+ cache.fetch("Outputs", {}).each do |o_name, o_value|
44
+ translated["outputs"][o_name] = Hash[
45
45
  o_value.map do |k, v|
46
46
  [snake(k).to_s, v]
47
47
  end
48
48
  ]
49
49
  end
50
- translated.delete('awstemplate_format_version')
51
- translated['heat_template_version'] = '2013-05-23'
50
+ translated.delete("awstemplate_format_version")
51
+ translated["heat_template_version"] = "2013-05-23"
52
52
  # no HOT support for mappings, so remove and clean pseudo
53
53
  # params in refs
54
- if translated['resources']
55
- translated['resources'] = dereference_processor(translated['resources'], ['Fn::FindInMap', 'Ref'])
56
- translated['resources'] = rename_processor(translated['resources'])
54
+ if translated["resources"]
55
+ translated["resources"] = dereference_processor(translated["resources"], ["Fn::FindInMap", "Ref"])
56
+ translated["resources"] = rename_processor(translated["resources"])
57
57
  end
58
- if translated['outputs']
59
- translated['outputs'] = dereference_processor(translated['outputs'], ['Fn::FindInMap', 'Ref'])
60
- translated['outputs'] = rename_processor(translated['outputs'])
58
+ if translated["outputs"]
59
+ translated["outputs"] = dereference_processor(translated["outputs"], ["Fn::FindInMap", "Ref"])
60
+ translated["outputs"] = rename_processor(translated["outputs"])
61
61
  end
62
- translated.delete('mappings')
62
+ translated.delete("mappings")
63
63
  complete_launch_config_lb_setups
64
64
  true
65
65
  end
@@ -76,9 +76,9 @@ class SparkleFormation
76
76
  # @return [Object]
77
77
  # rubocop:disable Metrics/MethodLength
78
78
  def neutron_loadbalancer_finalizer(resource_name, new_resource, old_resource)
79
- listeners = new_resource['Properties'].delete('listeners') || []
80
- healthcheck = new_resource['Properties'].delete('health_check')
81
- subnet = (new_resource['Properties'].delete('subnets') || []).first
79
+ listeners = new_resource["Properties"].delete("listeners") || []
80
+ healthcheck = new_resource["Properties"].delete("health_check")
81
+ subnet = (new_resource["Properties"].delete("subnets") || []).first
82
82
 
83
83
  # if health check is provided, create resource and apply to
84
84
  # all pools generated
@@ -86,83 +86,83 @@ class SparkleFormation
86
86
  healthcheck_name = "#{resource_name}HealthCheck"
87
87
  check = {
88
88
  healthcheck_name => {
89
- 'Type' => 'OS::Neutron::HealthMonitor',
90
- 'Properties' => {}.tap { |properties|
91
- {'Timeout' => 'timeout', 'Interval' => 'delay', 'HealthyThreshold' => 'max_retries'}.each do |aws, hot|
89
+ "Type" => "OS::Neutron::HealthMonitor",
90
+ "Properties" => {}.tap { |properties|
91
+ {"Timeout" => "timeout", "Interval" => "delay", "HealthyThreshold" => "max_retries"}.each do |aws, hot|
92
92
  if healthcheck[aws]
93
93
  properties[hot] = healthcheck[aws]
94
94
  end
95
95
  end
96
- type, port, path = healthcheck['Target'].split(%r{(:|/.*)}).find_all { |x| x != ':' }
97
- properties['type'] = type
96
+ type, port, path = healthcheck["Target"].split(%r{(:|/.*)}).find_all { |x| x != ":" }
97
+ properties["type"] = type
98
98
  if path
99
- properties['url_path'] = path
99
+ properties["url_path"] = path
100
100
  end
101
101
  },
102
102
  },
103
103
  }
104
- translated['Resources'].merge!(check)
104
+ translated["Resources"].merge!(check)
105
105
  end
106
106
 
107
107
  base_listener = listeners.shift
108
108
  base_pool_name = "#{resource_name}Pool"
109
109
  base_pool = {
110
110
  base_pool_name => {
111
- 'Type' => 'OS::Neutron::Pool',
112
- 'Properties' => {
113
- 'lb_method' => 'ROUND_ROBIN',
114
- 'monitors' => [
115
- {'get_resource' => healthcheck_name},
111
+ "Type" => "OS::Neutron::Pool",
112
+ "Properties" => {
113
+ "lb_method" => "ROUND_ROBIN",
114
+ "monitors" => [
115
+ {"get_resource" => healthcheck_name},
116
116
  ],
117
- 'protocol' => base_listener['Protocol'],
118
- 'vip' => {
119
- 'protocol_port' => base_listener['LoadBalancerPort'],
117
+ "protocol" => base_listener["Protocol"],
118
+ "vip" => {
119
+ "protocol_port" => base_listener["LoadBalancerPort"],
120
120
  },
121
- 'subnet' => subnet,
121
+ "subnet" => subnet,
122
122
  },
123
123
  },
124
124
  }
125
125
  if healthcheck
126
- base_pool[base_pool_name]['Properties'].merge(
127
- 'monitors' => [
128
- {'get_resource' => healthcheck_name},
126
+ base_pool[base_pool_name]["Properties"].merge(
127
+ "monitors" => [
128
+ {"get_resource" => healthcheck_name},
129
129
  ],
130
130
  )
131
131
  end
132
132
 
133
- translated['Resources'].merge!(base_pool)
134
- new_resource['Properties']['pool_id'] = {'get_resource' => base_pool_name}
135
- new_resource['Properties']['protocol_port'] = base_listener['InstancePort']
133
+ translated["Resources"].merge!(base_pool)
134
+ new_resource["Properties"]["pool_id"] = {"get_resource" => base_pool_name}
135
+ new_resource["Properties"]["protocol_port"] = base_listener["InstancePort"]
136
136
 
137
137
  listeners.each_with_index do |listener, count|
138
138
  pool_name = "#{resource_name}PoolVip#{count}"
139
139
  pool = {
140
140
  pool_name => {
141
- 'Type' => 'OS::Neutron::Pool',
142
- 'Properties' => {
143
- 'lb_method' => 'ROUND_ROBIN',
144
- 'protocol' => listener['Protocol'],
145
- 'subnet' => subnet,
146
- 'vip' => {
147
- 'protocol_port' => listener['LoadBalancerPort'],
141
+ "Type" => "OS::Neutron::Pool",
142
+ "Properties" => {
143
+ "lb_method" => "ROUND_ROBIN",
144
+ "protocol" => listener["Protocol"],
145
+ "subnet" => subnet,
146
+ "vip" => {
147
+ "protocol_port" => listener["LoadBalancerPort"],
148
148
  },
149
149
  },
150
150
  },
151
151
  }
152
152
  if healthcheck
153
- pool[pool_name]['Properties'].merge(
154
- 'monitors' => [
155
- {'get_resource' => healthcheck_name},
153
+ pool[pool_name]["Properties"].merge(
154
+ "monitors" => [
155
+ {"get_resource" => healthcheck_name},
156
156
  ],
157
157
  )
158
158
  end
159
159
 
160
160
  lb_name = "#{resource_name}Vip#{count}"
161
161
  lb = {lb_name => MultiJson.load(MultiJson.dump(new_resource))}
162
- lb[lb_name]['Properties']['pool_id'] = {'get_resource' => pool_name}
163
- lb[lb_name]['Properties']['protocol_port'] = listener['InstancePort']
164
- translated['Resources'].merge!(pool)
165
- translated['Resources'].merge!(lb)
162
+ lb[lb_name]["Properties"]["pool_id"] = {"get_resource" => pool_name}
163
+ lb[lb_name]["Properties"]["protocol_port"] = listener["InstancePort"]
164
+ translated["Resources"].merge!(pool)
165
+ translated["Resources"].merge!(lb)
166
166
  end
167
167
  end
168
168
 
@@ -171,18 +171,18 @@ class SparkleFormation
171
171
  # multiple listeners (ports) have been defined resulting in
172
172
  # multiple isolated LB resources
173
173
  def complete_launch_config_lb_setups
174
- translated['resources'].find_all do |resource_name, resource|
175
- resource['type'] == 'OS::Heat::AutoScalingGroup'
174
+ translated["resources"].find_all do |resource_name, resource|
175
+ resource["type"] == "OS::Heat::AutoScalingGroup"
176
176
  end.each do |name, value|
177
- if lbs = value['properties'].delete('load_balancers')
177
+ if lbs = value["properties"].delete("load_balancers")
178
178
  lbs.each do |lb_ref|
179
179
  lb_name = resource_name(lb_ref)
180
- lb_resource = translated['resources'][lb_name]
181
- vip_resources = translated['resources'].find_all do |k, v|
182
- k.match(/#{lb_name}Vip\d+/) && v['type'] == 'OS::Neutron::LoadBalancer'
180
+ lb_resource = translated["resources"][lb_name]
181
+ vip_resources = translated["resources"].find_all do |k, v|
182
+ k.match(/#{lb_name}Vip\d+/) && v["type"] == "OS::Neutron::LoadBalancer"
183
183
  end
184
- value['properties']['load_balancers'] = vip_resources.map do |vip_name|
185
- {'get_resource' => vip_name}
184
+ value["properties"]["load_balancers"] = vip_resources.map do |vip_name|
185
+ {"get_resource" => vip_name}
186
186
  end
187
187
  end
188
188
  end
@@ -200,7 +200,7 @@ class SparkleFormation
200
200
  # @return [Array<String, Object>] name and new value
201
201
  # @todo implement
202
202
  def nova_server_block_device_mapping(value, args = {})
203
- ['block_device_mapping', value]
203
+ ["block_device_mapping", value]
204
204
  end
205
205
 
206
206
  # Custom mapping for server user data
@@ -212,8 +212,8 @@ class SparkleFormation
212
212
  # @option args [Hash] :original_resource
213
213
  # @return [Array<String, Object>] name and new value
214
214
  def nova_server_user_data(value, args = {})
215
- args[:new_properties][:user_data_format] = 'RAW'
216
- args[:new_properties][:config_drive] = 'true'
215
+ args[:new_properties][:user_data_format] = "RAW"
216
+ args[:new_properties][:config_drive] = "true"
217
217
  [:user_data, Hash[value.values.first]]
218
218
  end
219
219
 
@@ -225,25 +225,25 @@ class SparkleFormation
225
225
  # @param old_resource [Hash]
226
226
  # @return [Object]
227
227
  def nova_server_finalizer(resource_name, new_resource, old_resource)
228
- if old_resource['Metadata']
229
- new_resource['Metadata'] = old_resource['Metadata']
230
- proceed = new_resource['Metadata'] &&
231
- new_resource['Metadata']['AWS::CloudFormation::Init'] &&
232
- config = new_resource['Metadata']['AWS::CloudFormation::Init']['config']
228
+ if old_resource["Metadata"]
229
+ new_resource["Metadata"] = old_resource["Metadata"]
230
+ proceed = new_resource["Metadata"] &&
231
+ new_resource["Metadata"]["AWS::CloudFormation::Init"] &&
232
+ config = new_resource["Metadata"]["AWS::CloudFormation::Init"]["config"]
233
233
  if proceed
234
234
  # NOTE: This is a stupid hack since HOT gives the URL to
235
235
  # wget directly and if special characters exist, it fails
236
- if files = config['files']
236
+ if files = config["files"]
237
237
  files.each do |key, args|
238
- if args['source']
239
- if args['source'].is_a?(String)
240
- args['source'].replace("\"#{args['source']}\"")
238
+ if args["source"]
239
+ if args["source"].is_a?(String)
240
+ args["source"].replace("\"#{args["source"]}\"")
241
241
  else
242
- args['source'] = {
243
- 'Fn::Join' => [
244
- '', [
242
+ args["source"] = {
243
+ "Fn::Join" => [
244
+ "", [
245
245
  "\"",
246
- args['source'],
246
+ args["source"],
247
247
  "\"",
248
248
  ],
249
249
  ],
@@ -265,13 +265,13 @@ class SparkleFormation
265
265
  # @param old_resource [Hash]
266
266
  # @return [TrueClass]
267
267
  def neutron_subnet_finalizer(resource_name, new_resource, old_resource)
268
- azs = new_resource['Properties'].delete('availability_zone')
268
+ azs = new_resource["Properties"].delete("availability_zone")
269
269
  if azs
270
270
  network_name = "NetworkFor#{resource_name}"
271
- translated['Resources'][network_name] = {
272
- 'type' => 'OS::Neutron::Network',
271
+ translated["Resources"][network_name] = {
272
+ "type" => "OS::Neutron::Network",
273
273
  }
274
- new_resource['Properties']['network'] = {'get_resource' => network_name}
274
+ new_resource["Properties"]["network"] = {"get_resource" => network_name}
275
275
  end
276
276
  true
277
277
  end
@@ -283,7 +283,7 @@ class SparkleFormation
283
283
  # @param old_resource [Hash]
284
284
  # @return [TrueClass]
285
285
  def neutron_net_finalizer(resource_name, new_resource, old_resource)
286
- new_resource['Properties'].clear
286
+ new_resource["Properties"].clear
287
287
  true
288
288
  end
289
289
 
@@ -312,7 +312,7 @@ class SparkleFormation
312
312
  # @return [Array<String, Object>] name and new value
313
313
  # @todo implement
314
314
  def autoscaling_group_launchconfig(value, args = {})
315
- ['resource', value]
315
+ ["resource", value]
316
316
  end
317
317
 
318
318
  # Default keys to snake cased format (underscore)
@@ -326,71 +326,71 @@ class SparkleFormation
326
326
  # Heat translation mapping
327
327
  MAP = {
328
328
  :resources => {
329
- 'AWS::EC2::Instance' => {
330
- :name => 'OS::Nova::Server',
329
+ "AWS::EC2::Instance" => {
330
+ :name => "OS::Nova::Server",
331
331
  :finalizer => :nova_server_finalizer,
332
332
  :properties => {
333
- 'AvailabilityZone' => 'availability_zone',
334
- 'BlockDeviceMappings' => :nova_server_block_device_mapping,
335
- 'ImageId' => 'image',
336
- 'InstanceType' => 'flavor',
337
- 'KeyName' => 'key_name',
338
- 'NetworkInterfaces' => 'networks',
339
- 'SecurityGroups' => 'security_groups',
340
- 'SecurityGroupIds' => 'security_groups',
341
- 'Tags' => 'metadata',
342
- 'UserData' => :nova_server_user_data,
333
+ "AvailabilityZone" => "availability_zone",
334
+ "BlockDeviceMappings" => :nova_server_block_device_mapping,
335
+ "ImageId" => "image",
336
+ "InstanceType" => "flavor",
337
+ "KeyName" => "key_name",
338
+ "NetworkInterfaces" => "networks",
339
+ "SecurityGroups" => "security_groups",
340
+ "SecurityGroupIds" => "security_groups",
341
+ "Tags" => "metadata",
342
+ "UserData" => :nova_server_user_data,
343
343
  },
344
344
  },
345
- 'AWS::AutoScaling::AutoScalingGroup' => {
346
- :name => 'OS::Heat::AutoScalingGroup',
345
+ "AWS::AutoScaling::AutoScalingGroup" => {
346
+ :name => "OS::Heat::AutoScalingGroup",
347
347
  :properties => {
348
- 'Cooldown' => 'cooldown',
349
- 'DesiredCapacity' => 'desired_capacity',
350
- 'MaxSize' => 'max_size',
351
- 'MinSize' => 'min_size',
352
- 'LaunchConfigurationName' => :autoscaling_group_launchconfig,
348
+ "Cooldown" => "cooldown",
349
+ "DesiredCapacity" => "desired_capacity",
350
+ "MaxSize" => "max_size",
351
+ "MinSize" => "min_size",
352
+ "LaunchConfigurationName" => :autoscaling_group_launchconfig,
353
353
  },
354
354
  },
355
- 'AWS::AutoScaling::LaunchConfiguration' => :delete,
356
- 'AWS::ElasticLoadBalancing::LoadBalancer' => {
357
- :name => 'OS::Neutron::LoadBalancer',
355
+ "AWS::AutoScaling::LaunchConfiguration" => :delete,
356
+ "AWS::ElasticLoadBalancing::LoadBalancer" => {
357
+ :name => "OS::Neutron::LoadBalancer",
358
358
  :finalizer => :neutron_loadbalancer_finalizer,
359
359
  :properties => {
360
- 'Instances' => 'members',
361
- 'Listeners' => 'listeners',
362
- 'HealthCheck' => 'health_check',
363
- 'Subnets' => 'subnets',
360
+ "Instances" => "members",
361
+ "Listeners" => "listeners",
362
+ "HealthCheck" => "health_check",
363
+ "Subnets" => "subnets",
364
364
  },
365
365
  },
366
- 'AWS::EC2::VPC' => {
367
- :name => 'OS::Neutron::Net',
366
+ "AWS::EC2::VPC" => {
367
+ :name => "OS::Neutron::Net",
368
368
  :finalizer => :neutron_net_finalizer,
369
369
  :properties => {
370
- 'CidrBlock' => 'cidr',
370
+ "CidrBlock" => "cidr",
371
371
  },
372
372
  },
373
- 'AWS::EC2::Subnet' => {
374
- :name => 'OS::Neutron::Subnet',
373
+ "AWS::EC2::Subnet" => {
374
+ :name => "OS::Neutron::Subnet",
375
375
  :finalizer => :neutron_subnet_finalizer,
376
376
  :properties => {
377
- 'CidrBlock' => 'cidr',
378
- 'VpcId' => 'network',
379
- 'AvailabilityZone' => 'availability_zone',
377
+ "CidrBlock" => "cidr",
378
+ "VpcId" => "network",
379
+ "AvailabilityZone" => "availability_zone",
380
380
  },
381
381
  },
382
382
  },
383
383
  }
384
384
 
385
385
  REF_MAPPING = {
386
- 'AWS::StackName' => 'OS::stack_name',
387
- 'AWS::StackId' => 'OS::stack_id',
388
- 'AWS::Region' => 'OS::stack_id', # @todo i see it set in source, but no function. wat
386
+ "AWS::StackName" => "OS::stack_name",
387
+ "AWS::StackId" => "OS::stack_id",
388
+ "AWS::Region" => "OS::stack_id", # @todo i see it set in source, but no function. wat
389
389
  }
390
390
 
391
391
  FN_MAPPING = {
392
- 'Fn::GetAtt' => 'get_attr',
393
- 'Fn::Join' => 'list_join',
392
+ "Fn::GetAtt" => "get_attr",
393
+ "Fn::Join" => "list_join",
394
394
  }
395
395
  end
396
396
  end