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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 488aee5673dda0c608a8e06188e3523533e2b538986f2f87554ee52deae1328b
4
- data.tar.gz: d855010ad2a9ae2df2e2034309e8cf042870ea85c73d87385ac919e64e7eb8ec
3
+ metadata.gz: 8b793b08c7374b3d4b6278501a083db2e33e2a43c7d57127d5c536c3a0502743
4
+ data.tar.gz: 74b42b3c781f10adb4d177d0498cb0e79ad8ce8c45db20561e9e10db21bb130c
5
5
  SHA512:
6
- metadata.gz: 8f303ead37c4819bd0b510948e611bc7aded4aedd0194df4dd68df2cae1b03010fbaf68f1ccc5af0f033ed8d70b70e829d39e42b4cfd7b6597ee4495cf2d2311
7
- data.tar.gz: fde8609245bab2d49c1c87f0f8229f4d1bd2b488599ed7a06ec63e530a89ddcd918b91ac52b41c60c8c716c69ddaea7a8d5ab089b5f42ffee2db55fd1a97b273
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
- unless parameter_values_json.nil?
64
- parameter_values = JSON.load parameter_values_json
65
- unless parameter_values.is_a?(Hash) && parameter_values.has_key?('Parameters')
66
- raise JSON::ParserError.new('JSON parameters must be a dictionary with key "Parameters"')
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.27
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-03-22 00:00:00.000000000 Z
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