cfn-model 0.1.27 → 0.1.28
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/lib/cfn-model/parser/cfn_parser.rb +13 -24
- data/lib/cfn-model/parser/parameter_substitution.rb +63 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b793b08c7374b3d4b6278501a083db2e33e2a43c7d57127d5c536c3a0502743
|
4
|
+
data.tar.gz: 74b42b3c781f10adb4d177d0498cb0e79ad8ce8c45db20561e9e10db21bb130c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 39cebcc2c3d32eff01af5c361f32ef4f4f877aa2d4533131099e3cb0707e22582e8612b3ac85a4e8a96f28b3a469f325bf5df02530ee5f7bb9a3ae8d7ce9ab27
|
7
|
+
data.tar.gz: 67c0fbbf7cb12f52d00556daeedf6982ec5cf5397fab89b4903dc501b47981b865b9941337ed9d2f2fef39d09ec49f9af9545f99311019216639f29c47dbd981
|
@@ -4,6 +4,7 @@ require 'cfn-model/parser/transform_registry'
|
|
4
4
|
require 'cfn-model/validator/cloudformation_validator'
|
5
5
|
require 'cfn-model/validator/reference_validator'
|
6
6
|
require_relative 'parser_registry'
|
7
|
+
require_relative 'parameter_substitution'
|
7
8
|
require_relative 'parser_error'
|
8
9
|
Dir["#{__dir__}/../model/*.rb"].each { |model| require "cfn-model/model/#{File.basename(model, '.rb')}" }
|
9
10
|
|
@@ -32,6 +33,14 @@ class CfnParser
|
|
32
33
|
# Given raw json/yml CloudFormation template, returns a CfnModel object
|
33
34
|
# or raise ParserErrors if something is amiss with the format
|
34
35
|
def parse(cloudformation_yml, parameter_values_json=nil)
|
36
|
+
cfn_model = parse_without_parameters(cloudformation_yml)
|
37
|
+
|
38
|
+
apply_parameter_values(cfn_model, parameter_values_json)
|
39
|
+
|
40
|
+
cfn_model
|
41
|
+
end
|
42
|
+
|
43
|
+
def parse_without_parameters(cloudformation_yml)
|
35
44
|
pre_validate_model cloudformation_yml
|
36
45
|
|
37
46
|
cfn_hash = YAML.load cloudformation_yml
|
@@ -52,36 +61,16 @@ class CfnParser
|
|
52
61
|
# pass 2: tie together separate resources only where necessary to make life easier for rule logic
|
53
62
|
post_process_resource_model_elements cfn_model
|
54
63
|
|
55
|
-
apply_parameter_values(cfn_model, parameter_values_json)
|
56
|
-
|
57
64
|
cfn_model
|
58
65
|
end
|
59
66
|
|
60
67
|
private
|
61
68
|
|
62
69
|
def apply_parameter_values(cfn_model, parameter_values_json)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
end
|
68
|
-
parameter_values['Parameters'].each do |parameter_name, parameter_value|
|
69
|
-
if cfn_model.parameters.has_key?(parameter_name)
|
70
|
-
cfn_model.parameters[parameter_name].synthesized_value = parameter_value.to_s
|
71
|
-
end
|
72
|
-
# not going to complain if there are extra parameters in JSON.... if doing a scan
|
73
|
-
# you only have one file for all the templates
|
74
|
-
end
|
75
|
-
|
76
|
-
# any leftovers get default value
|
77
|
-
# if external values were specified, we take that as a cue to consider defaults
|
78
|
-
# if no external values, we will ignore default values
|
79
|
-
cfn_model.parameters.each do |_, parameter|
|
80
|
-
if parameter.synthesized_value.nil? && !parameter.default.nil?
|
81
|
-
parameter.synthesized_value = parameter.default.to_s
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
70
|
+
ParameterSubstitution.new.apply_parameter_values(
|
71
|
+
cfn_model,
|
72
|
+
parameter_values_json
|
73
|
+
)
|
85
74
|
end
|
86
75
|
|
87
76
|
def post_process_resource_model_elements(cfn_model)
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class ParameterSubstitution
|
4
|
+
PARAMETER_KEY = 'ParameterKey'
|
5
|
+
PARAMETER_VALUE = 'ParameterValue'
|
6
|
+
PARAMETERS = 'Parameters'
|
7
|
+
|
8
|
+
def apply_parameter_values(cfn_model, parameter_values_json)
|
9
|
+
unless parameter_values_json.nil?
|
10
|
+
parameter_values = JSON.load parameter_values_json
|
11
|
+
if is_aws_format?(parameter_values)
|
12
|
+
parameter_values = convert_aws_to_legacy_format(parameter_values)
|
13
|
+
elsif !is_legacy_format?(parameter_values)
|
14
|
+
format_error = "JSON parameters must be a dictionary with key \"#{PARAMETERS}\" "\
|
15
|
+
"or an array of ParameterKey/ParameterValue dictionaries"
|
16
|
+
raise JSON::ParserError.new(format_error)
|
17
|
+
end
|
18
|
+
apply_parameter_values_impl cfn_model, parameter_values
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def convert_aws_to_legacy_format(parameter_values)
|
25
|
+
legacy_format = {
|
26
|
+
PARAMETERS => {}
|
27
|
+
}
|
28
|
+
parameter_values.reduce(legacy_format) do |result, parameter_value|
|
29
|
+
result[PARAMETERS][parameter_value[PARAMETER_KEY]] = parameter_value[PARAMETER_VALUE]
|
30
|
+
result
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def apply_parameter_values_impl(cfn_model, parameter_values)
|
35
|
+
parameter_values[PARAMETERS].each do |parameter_name, parameter_value|
|
36
|
+
if cfn_model.parameters.has_key?(parameter_name)
|
37
|
+
cfn_model.parameters[parameter_name].synthesized_value = parameter_value.to_s
|
38
|
+
end
|
39
|
+
# not going to complain if there are extra parameters in JSON.... if doing a scan
|
40
|
+
# you only have one file for all the templates
|
41
|
+
end
|
42
|
+
|
43
|
+
# any leftovers get default value
|
44
|
+
# if external values were specified, we take that as a cue to consider defaults
|
45
|
+
# if no external values, we will ignore default values
|
46
|
+
cfn_model.parameters.each do |_, parameter|
|
47
|
+
if parameter.synthesized_value.nil? && !parameter.default.nil?
|
48
|
+
parameter.synthesized_value = parameter.default.to_s
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def is_aws_format?(parameter_values)
|
54
|
+
return false unless parameter_values.is_a?(Array)
|
55
|
+
!parameter_values.find do |parameter_value|
|
56
|
+
!parameter_value['ParameterKey'] || !parameter_value['ParameterValue']
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def is_legacy_format?(parameter_values)
|
61
|
+
parameter_values.is_a?(Hash) && parameter_values.has_key?(PARAMETERS)
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfn-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.28
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kascic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- lib/cfn-model/parser/iam_user_parser.rb
|
79
79
|
- lib/cfn-model/parser/load_balancer_parser.rb
|
80
80
|
- lib/cfn-model/parser/load_balancer_v2_parser.rb
|
81
|
+
- lib/cfn-model/parser/parameter_substitution.rb
|
81
82
|
- lib/cfn-model/parser/parser_error.rb
|
82
83
|
- lib/cfn-model/parser/parser_registry.rb
|
83
84
|
- lib/cfn-model/parser/policy_document_parser.rb
|