cfn-model 0.1.27 → 0.1.28

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
  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