sparkle_formation 3.0.10 → 3.0.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 941277da18060a1b6e4e560d6857e9a1ca17c551
4
- data.tar.gz: 4c7d9ff4d75abc560d999a07dbe730b85e535b3e
3
+ metadata.gz: c2b28c5665d40741d8d5b93f3c2e3386cf5045f5
4
+ data.tar.gz: fe9953246e87f0330981402c8f24017e0ce772d2
5
5
  SHA512:
6
- metadata.gz: 0fe3d50ad9892bb61ea89a4b266266c65ef2d98ec6cd797d26b3feb284a6adf48bef6203d2e90680d51006fa24030c320a979e981b06816049b5c0259d0c5325
7
- data.tar.gz: 9a30aeb77cde80d7257b0b1fe5d0c301ccc59fd5a25cb0690f72e28102fe1f6d076c57da22407c5ca987775c7a2e8ecfa3c9a7bf5e6b7a5b5385d635d7ee89bb
6
+ metadata.gz: 221fa63f32b1b58ff7b06315ef97b7ca9f92f804dc1162a38ef8676a4f1baf9cc7932a2869df3d56cb59b9aed5b58e65ca674c1cad3ebef08145da421ac8d214
7
+ data.tar.gz: 86458dcb43d3e07c087d271bcdc0434ba1ae5c76604294e16569357bd59b993528ad5a6a80d9ad24ef80a497103c1877119194b68c0dfeec19cc02e9bce19bb2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # v3.0.12
2
+ * Prevent parameter mappings applying to root template
3
+ * Add #import_value! helper for AWS templates (#193)
4
+ * Add #split! helper for AWS templates
5
+ * Add provider support for Terraform (#201)
6
+
1
7
  # v3.0.10
2
8
  * Extract pack name using previously extract path (#180)
3
9
 
data/LICENSE CHANGED
@@ -186,7 +186,7 @@ APPENDIX: How to apply the Apache License to your work.
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2015 Chris Roberts
189
+ Copyright 2017 Chris Roberts
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@ anchors:
12
12
  - title: "Usage"
13
13
  url: "#usage"
14
14
  - title: "Distribution"
15
- url: "#distribution
15
+ url: "#distribution"
16
16
  ---
17
17
 
18
18
  ## SparklePacks
@@ -83,7 +83,8 @@ class SparkleFormation
83
83
  if(arg.respond_to?(:_dump))
84
84
  arg._dump
85
85
  elsif(arg.is_a?(::Symbol))
86
- "'#{::Bogo::Utility.camel(arg.to_s, false)}'"
86
+ quote = __single_quote_strings ? "'" : '"'
87
+ "#{quote}#{::Bogo::Utility.camel(arg.to_s, false)}#{quote}"
87
88
  elsif(arg.is_a?(::String) && __single_quote_strings)
88
89
  "'#{arg}'"
89
90
  else
@@ -99,7 +100,14 @@ class SparkleFormation
99
100
  suffix
100
101
  ].compact
101
102
  )
102
- root? ? "#{__anchor_start}#{internal}#{__anchor_stop}" : internal
103
+ if(root? || (!__single_anchor? && function_name))
104
+ if(!root? && __quote_nested_funcs?)
105
+ quote = __single_quote_strings ? "'" : '"'
106
+ end
107
+ "#{quote}#{__anchor_start}#{internal}#{__anchor_stop}#{quote}"
108
+ else
109
+ internal
110
+ end
103
111
  else
104
112
  suffix
105
113
  end
@@ -121,6 +129,15 @@ class SparkleFormation
121
129
  end
122
130
  end
123
131
 
132
+ def __quote_nested_funcs?
133
+ false
134
+ end
135
+
136
+ # @return [TrueClass] wrap in single anchor
137
+ def __single_anchor?
138
+ true
139
+ end
140
+
124
141
  # @return [Class]
125
142
  def _klass
126
143
  ::SparkleFormation::FunctionStruct
@@ -161,8 +178,6 @@ class SparkleFormation
161
178
  # FunctionStruct for jinja expressions
162
179
  class JinjaExpressionStruct < FunctionStruct
163
180
 
164
- SINGLE_QUOTE_STRINGS = false
165
-
166
181
  # @return [String] start character(s) used to anchor function call
167
182
  def __anchor_start
168
183
  '{{ '
@@ -193,8 +208,6 @@ class SparkleFormation
193
208
  # FunctionStruct for jinja statements
194
209
  class JinjaStatementStruct < FunctionStruct
195
210
 
196
- SINGLE_QUOTE_STRINGS = false
197
-
198
211
  # @return [String] start character(s) used to anchor function call
199
212
  def __anchor_start
200
213
  '{% '
@@ -251,4 +264,45 @@ class SparkleFormation
251
264
  end
252
265
 
253
266
  end
267
+
268
+ # FunctionStruct for customized terraform functions
269
+ class TerraformStruct < FunctionStruct
270
+
271
+ SINGLE_ANCHOR = true
272
+
273
+ # @return [String] start character(s) used to anchor function call
274
+ def __anchor_start
275
+ '${'
276
+ end
277
+
278
+ # @return [String] stop character(s) used to anchor function call
279
+ def __anchor_stop
280
+ '}'
281
+ end
282
+
283
+ # @return [String] value to use when argument list is empty
284
+ def __empty_argument_list
285
+ ''
286
+ end
287
+
288
+ # @return [FalseClass] disable single quote string generation
289
+ def __single_quote_strings
290
+ false
291
+ end
292
+
293
+ # @return [FalseClass] wrap every structure in anchors
294
+ def __single_anchor?
295
+ true
296
+ end
297
+
298
+ def __quote_nested_funcs?
299
+ false
300
+ end
301
+
302
+ # @return [Class]
303
+ def _klass
304
+ ::SparkleFormation::TerraformStruct
305
+ end
306
+
307
+ end
254
308
  end
@@ -54,11 +54,16 @@ class SparkleFormation
54
54
  unless(stack.nested_stacks.empty?)
55
55
  stack.apply_deep_nesting(*args)
56
56
  end
57
- stack.compile.parameters.keys!.each do |parameter_name|
58
- if(output_name = output_matched?(parameter_name, outputs.keys))
59
- next if outputs[output_name] == stack
60
- stack_output = stack.make_output_available(output_name, outputs)
61
- resource.properties.parameters.set!(parameter_name, stack_output)
57
+ unless(stack.root?)
58
+ stack.compile.parameters.keys!.each do |parameter_name|
59
+ next if stack.compile.parameters.set!(parameter_name).stack_unique == true
60
+ if(!stack.parent.compile.parameters.set!(parameter_name).nil?)
61
+ resource.properties.parameters.set!(parameter_name, resource.ref!(parameter_name))
62
+ elsif(output_name = output_matched?(parameter_name, outputs.keys))
63
+ next if outputs[output_name] == stack
64
+ stack_output = stack.make_output_available(output_name, outputs)
65
+ resource.properties.parameters.set!(parameter_name, stack_output)
66
+ end
62
67
  end
63
68
  end
64
69
  end
@@ -155,7 +160,7 @@ class SparkleFormation
155
160
  # @param stack_resource [Hash] duplicate of stack resource contents
156
161
  # @param output_map [Hash] mapping of output names to required stack output access
157
162
  # @return [TrueClass]
158
- # @note if parameter has includes `StackUnique` a new parameter will
163
+ # @note if parameter includes `StackUnique` a new parameter will
159
164
  # be added to container stack and it will not use outputs
160
165
  def remap_nested_parameters(template, parameters, stack_name, stack_resource, output_map)
161
166
  stack_parameters = stack_resource.properties.stack.compile.parameters
@@ -0,0 +1,146 @@
1
+ require 'sparkle_formation'
2
+
3
+ class SparkleFormation
4
+ module Provider
5
+ # Terraform specific implementation
6
+ module Terraform
7
+
8
+ # Customized dump to break out templates into consumable structures for
9
+ # passing to the deployment manager API
10
+ #
11
+ # @return [Hash]
12
+ def terraform_dump
13
+ result = non_terraform_dump.to_smash
14
+ Smash.new(
15
+ :parameters => :variable,
16
+ :resources => :resource,
17
+ :outputs => :output
18
+ ).each do |original, updated|
19
+ if(val = result.delete(original))
20
+ result[updated] = val
21
+ end
22
+ end
23
+ if(resources = result.delete(:resource))
24
+ result[:resource] = Smash.new
25
+ resources.each do |r_name, r_info|
26
+ result.set(:resource, r_info[:type], r_name, r_info[:properties])
27
+ end
28
+ end
29
+ result
30
+ end
31
+
32
+ # Properly remap dumping methods
33
+ def self.included(klass)
34
+ klass.class_eval do
35
+ alias_method :non_terraform_dump, :dump
36
+ alias_method :dump, :terraform_dump
37
+ end
38
+ end
39
+
40
+ # Properly remap dumping methods
41
+ def self.extended(klass)
42
+ klass.instance_eval do
43
+ alias :non_terraform_dump :dump
44
+ alias :dump :terraform_dump
45
+ end
46
+ end
47
+
48
+ # @return [String] Type string for terraform stack resource
49
+ # @note Nested templates aren't defined as a specific type thus no "real"
50
+ # type exists. So we'll create a custom one!
51
+ def stack_resource_type
52
+ 'module'
53
+ end
54
+
55
+ # Generate policy for stack
56
+ #
57
+ # @return [Hash]
58
+ def generate_policy
59
+ {}
60
+ end
61
+
62
+ # Apply deeply nested stacks. This is the new nesting approach and
63
+ # does not bubble parameters up to the root stack. Parameters are
64
+ # isolated to the stack resource itself and output mapping is
65
+ # automatically applied.
66
+ #
67
+ # @yieldparam stack [SparkleFormation] stack instance
68
+ # @yieldparam resource [AttributeStruct] the stack resource
69
+ # @yieldparam s_name [String] stack resource name
70
+ # @yieldreturn [Hash] key/values to be merged into resource properties
71
+ # @return [SparkleFormation::SparkleStruct] compiled structure
72
+ def apply_deep_nesting(*args, &block)
73
+ outputs = collect_outputs
74
+ nested_stacks(:with_resource).each do |stack, resource|
75
+ unless(stack.nested_stacks.empty?)
76
+ stack.apply_deep_nesting(*args)
77
+ end
78
+ stack.compile.parameters.keys!.each do |parameter_name|
79
+ if(output_name = output_matched?(parameter_name, outputs.keys))
80
+ next if outputs[output_name] == stack
81
+ stack_output = stack.make_output_available(output_name, outputs, self)
82
+ # NOTE: Only set value if not already explicitly set
83
+ if(resource.properties.parameters._set(parameter_name).nil?)
84
+ resource.properties.parameters._set(parameter_name, stack_output)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ if(block_given?)
90
+ extract_templates(&block)
91
+ end
92
+ self
93
+ end
94
+
95
+ # Forcibly disable shallow nesting
96
+ def apply_shallow_nesting(*args, &block)
97
+ raise NotImplementedError.new 'Shallow nesting is not supported for this provider!'
98
+ end
99
+
100
+ # Extract output to make available for stack parameter usage at the
101
+ # current depth
102
+ #
103
+ # @param output_name [String] name of output
104
+ # @param outputs [Hash] listing of outputs
105
+ # @param source_stack [SparkleFormation] requesting stack
106
+ # @reutrn [Hash] reference to output value (used for setting parameter)
107
+ def make_output_available(output_name, outputs, source_stack)
108
+ bubble_path = outputs[output_name].root_path - root_path
109
+ drip_path = root_path - outputs[output_name].root_path
110
+ bubble_path.each_slice(2) do |base_sparkle, ref_sparkle|
111
+ next unless ref_sparkle
112
+ base_sparkle.compile.outputs._set(output_name)._set(
113
+ :value, base_sparkle.compile._stack_output(
114
+ ref_sparkle.name, output_name
115
+ )
116
+ )
117
+ end
118
+ if(bubble_path.empty?)
119
+ if(drip_path.size == 1)
120
+ parent = drip_path.first.parent
121
+ if(parent && !parent.compile.parameters._set(output_name).nil?)
122
+ return compile.parameter!(output_name)
123
+ end
124
+ end
125
+ raise ArgumentError.new "Failed to detect available bubbling path for output `#{output_name}`. " <<
126
+ 'This may be due to a circular dependency! ' <<
127
+ "(Output Path: #{outputs[output_name].root_path.map(&:name).join(' > ')} " <<
128
+ "Requester Path: #{root_path.map(&:name).join(' > ')})"
129
+ end
130
+ result = source_stack.compile._stack_output(bubble_path.first.name, output_name)
131
+ if(drip_path.size > 1)
132
+ parent = drip_path.first.parent
133
+ drip_path.unshift(parent) if parent
134
+ drip_path.each_slice(2) do |base_sparkle, ref_sparkle|
135
+ next unless ref_sparkle
136
+ base_sparkle.compile.resources[ref_sparkle.name].properties.parameters.value._set(output_name, result)
137
+ ref_sparkle.compile.parameters._set(output_name).type 'string' # TODO: <<<<------ type check and prop
138
+ result = compile._parameter(output_name)
139
+ end
140
+ end
141
+ result
142
+ end
143
+
144
+ end
145
+ end
146
+ end
@@ -8,6 +8,7 @@ class SparkleFormation
8
8
  autoload :Azure, 'sparkle_formation/provider/azure'
9
9
  autoload :Google, 'sparkle_formation/provider/google'
10
10
  autoload :Heat, 'sparkle_formation/provider/heat'
11
+ autoload :Terraform, 'sparkle_formation/provider/terraform'
11
12
 
12
13
  end
13
14
  end