cloudformation-ruby-dsl 1.3.2 → 1.4.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fc27537e778d1d9bf9b8886047e87f578e93f3a
|
4
|
+
data.tar.gz: ba288ca3b0e250854b5f7c45485d963a4cd27a37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7179312a3f4a3462c7de36b9e0ec77f42d1c2bca68e8d52e0cfe9cb3a19d9c97abcf3d04aaa92a3e844aa0a5dc27d67757e0777d5d6e9ac6cd55d6c597ff09ab
|
7
|
+
data.tar.gz: b6f097b17b653d267a0f07a946fbeab1996b82604bf9386b749c3bc88337f82de741adc3fe02bc697c0f260f1f2ffef975c1e7d26319351e55268218ed331e5e
|
data/examples/simple_template.rb
CHANGED
@@ -91,9 +91,10 @@ def parse_args
|
|
91
91
|
when '--stack-name'
|
92
92
|
args[:stack_name] = value
|
93
93
|
when '--parameters'
|
94
|
-
args[:parameters] = Hash[value.split(
|
94
|
+
args[:parameters] = Hash[value.split(/;/).map { |pair| parts = pair.split(/=/, 2); [ parts[0], Parameter.new(parts[1]) ] }] #/# fix for syntax highlighting
|
95
95
|
when '--interactive'
|
96
96
|
args[:interactive] = true
|
97
|
+
default and previous values of a parameter. Updated excise_parameter_attributes! to support multiple parameters.
|
97
98
|
when '--region'
|
98
99
|
args[:region] = value
|
99
100
|
when '--profile'
|
@@ -155,9 +156,9 @@ def cfn(template)
|
|
155
156
|
|
156
157
|
action = validate_action( ARGV[0] )
|
157
158
|
|
158
|
-
# Find parameters where extension
|
159
|
+
# Find parameters where extension attributes are true then remove them from the
|
159
160
|
# cfn template since we can't pass it to CloudFormation.
|
160
|
-
|
161
|
+
excised_parameters = template.excise_parameter_attributes!([:Immutable, :UsePreviousValue])
|
161
162
|
|
162
163
|
# Tag CloudFormation stacks based on :Tags defined in the template.
|
163
164
|
# Remove them from the template as well, so that the template is valid.
|
@@ -231,15 +232,15 @@ def cfn(template)
|
|
231
232
|
# there is only ever one stack, since stack names are unique
|
232
233
|
old_attributes = cfn_client.describe_stacks({stack_name: stack_name}).stacks[0]
|
233
234
|
old_tags = old_attributes.tags
|
234
|
-
old_parameters = old_attributes.parameters
|
235
|
+
old_parameters = Hash[old_attributes.parameters.map { |p| [p.parameter_key, p.parameter_value]}]
|
235
236
|
|
236
237
|
# Sort the tag strings alphabetically to make them easily comparable
|
237
238
|
old_tags_string = old_tags.map { |tag| %Q(TAG "#{tag.key}=#{tag.value}"\n) }.sort.join
|
238
239
|
tags_string = cfn_tags.map { |k, v| %Q(TAG "#{k.to_s}=#{v}"\n) }.sort.join
|
239
240
|
|
240
241
|
# Sort the parameter strings alphabetically to make them easily comparable
|
241
|
-
old_parameters_string = old_parameters.sort
|
242
|
-
parameters_string = template.parameters.sort.map { |key, value| "PARAMETER \"#{key}=#{value}\"\n" }.join
|
242
|
+
old_parameters_string = old_parameters.sort.map { |key, value| %Q(PARAMETER "#{key}=#{value}"\n) }.join
|
243
|
+
parameters_string = template.parameters.sort.map { |key, value| "PARAMETER \"#{key}=#{!(value.empty? && value.use_previous_value) ? value : old_parameters[key]}\"\n" }.join
|
243
244
|
|
244
245
|
# set default diff options
|
245
246
|
Diffy::Diff.default_options.merge!(
|
@@ -294,6 +295,9 @@ def cfn(template)
|
|
294
295
|
when 'create'
|
295
296
|
begin
|
296
297
|
|
298
|
+
# Apply any default parameter values
|
299
|
+
apply_parameter_defaults(template.parameters)
|
300
|
+
|
297
301
|
# default options (not overridable)
|
298
302
|
create_stack_opts = {
|
299
303
|
stack_name: stack_name,
|
@@ -435,16 +439,30 @@ def cfn(template)
|
|
435
439
|
end
|
436
440
|
|
437
441
|
# If updating a stack and some parameters or tags are marked as immutable, set the variable to true.
|
438
|
-
immutables_exist = nil
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
442
|
+
immutables_exist = nil
|
443
|
+
|
444
|
+
old_parameters = Hash[old_stack.parameters.map { |p| [p.parameter_key, p.parameter_value]}]
|
445
|
+
new_parameters = template.parameters
|
446
|
+
excised_parameters.each do |extension_attribute, parameters|
|
447
|
+
if !parameters.empty?
|
448
|
+
parameters.sort.each do |param|
|
449
|
+
if old_parameters[param] != new_parameters[param] && old_parameters.key?(param)
|
450
|
+
case extension_attribute
|
451
|
+
when :Immutable
|
452
|
+
if !excised_parameters[:UsePreviousValue].include?(param)
|
453
|
+
$stderr.puts "Error: unable to update immutable parameter " +
|
454
|
+
"'#{param}=#{old_parameters[param]}' to '#{param}=#{new_parameters[param]}'."
|
455
|
+
immutables_exist = true
|
456
|
+
end
|
457
|
+
when :UsePreviousValue
|
458
|
+
if !immutables_exist && new_parameters[param].empty?
|
459
|
+
$stderr.puts "Using previous parameter " +
|
460
|
+
"'#{param}=#{old_parameters[param]}'."
|
461
|
+
new_parameters[param] = Parameter.new(old_parameters[param])
|
462
|
+
new_parameters[param].use_previous_value = true
|
463
|
+
end
|
464
|
+
end
|
465
|
+
end
|
448
466
|
end
|
449
467
|
end
|
450
468
|
end
|
@@ -466,6 +484,9 @@ def cfn(template)
|
|
466
484
|
exit(false)
|
467
485
|
end
|
468
486
|
|
487
|
+
# Apply any default parameter values
|
488
|
+
apply_parameter_defaults(template.parameters)
|
489
|
+
|
469
490
|
# Compare the sorted arrays of parameters for an exact match and print difference.
|
470
491
|
old_parameters = old_stack.parameters.map { |p| [p.parameter_key, p.parameter_value]}.sort
|
471
492
|
new_parameters = template.parameters.sort
|
@@ -493,7 +514,7 @@ def cfn(template)
|
|
493
514
|
update_stack_opts = {
|
494
515
|
stack_name: stack_name,
|
495
516
|
template_body: template_string,
|
496
|
-
parameters: template.parameters.map { |k,v| {parameter_key: k, parameter_value: v}}.to_a,
|
517
|
+
parameters: template.parameters.map { |k,v| (v.use_previous_value && old_parameters[0].include?(k)) ? {parameter_key: k, use_previous_value: v.use_previous_value.to_s} : {parameter_key: k, parameter_value: v}}.to_a,
|
497
518
|
tags: cfn_tags.map { |k,v| {"key" => k.to_s, "value" => v.to_s} }.to_a,
|
498
519
|
capabilities: ["CAPABILITY_NAMED_IAM"],
|
499
520
|
}
|
@@ -569,6 +590,17 @@ def parse_arg_array_as_hash(options)
|
|
569
590
|
result
|
570
591
|
end
|
571
592
|
|
593
|
+
# Apply the default value for any parameter not assigned by the user
|
594
|
+
def apply_parameter_defaults(parameters)
|
595
|
+
parameters.each do |k, v|
|
596
|
+
if v.empty?
|
597
|
+
parameters[k] = Parameter.new(v.default)
|
598
|
+
$stderr.puts "Using default parameter value " +
|
599
|
+
"'#{k}=#{parameters[k]}'."
|
600
|
+
end
|
601
|
+
end
|
602
|
+
end
|
603
|
+
|
572
604
|
##################################### Additional dsl logic
|
573
605
|
# Core interpreter for the DSL
|
574
606
|
class TemplateDSL < JsonObjectDSL
|
@@ -52,6 +52,14 @@ def default_region
|
|
52
52
|
ENV['EC2_REGION'] || ENV['AWS_DEFAULT_REGION'] || 'us-east-1'
|
53
53
|
end
|
54
54
|
|
55
|
+
class Parameter < String
|
56
|
+
attr_accessor :default, :use_previous_value
|
57
|
+
|
58
|
+
def initialize string
|
59
|
+
super string.to_s
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
55
63
|
# Core interpreter for the DSL
|
56
64
|
class TemplateDSL < JsonObjectDSL
|
57
65
|
attr_reader :parameters,
|
@@ -81,16 +89,21 @@ class TemplateDSL < JsonObjectDSL
|
|
81
89
|
if @interactive
|
82
90
|
@parameters[name] ||= _get_parameter_from_cli(name, options)
|
83
91
|
else
|
84
|
-
@parameters[name] ||=
|
92
|
+
@parameters[name] ||= Parameter.new('')
|
93
|
+
@parameters[name].default = options[:Default]
|
94
|
+
@parameters[name].use_previous_value = options[:UsePreviousValue]
|
85
95
|
end
|
86
96
|
end
|
87
97
|
|
88
98
|
# Find parameters where the specified attribute is true then remove the attribute from the cfn template.
|
89
|
-
def
|
90
|
-
marked_parameters =
|
99
|
+
def excise_parameter_attributes!(attributes)
|
100
|
+
marked_parameters = {}
|
91
101
|
@dict.fetch(:Parameters, {}).each do |param, options|
|
92
|
-
|
93
|
-
marked_parameters
|
102
|
+
attributes.each do |attribute|
|
103
|
+
marked_parameters[attribute] ||= []
|
104
|
+
if options.delete(attribute.to_sym) or options.delete(attribute.to_s)
|
105
|
+
marked_parameters[attribute] << param
|
106
|
+
end
|
94
107
|
end
|
95
108
|
end
|
96
109
|
marked_parameters
|