cfn-model 0.4.28 → 0.4.29
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c60ef54532b89cab5abaf2c3bf9381a7e9e0529f1ee9d1a516941e4ec9e9393
|
4
|
+
data.tar.gz: e77b5257bf99294ddc85ec54763e475be9a5b9ad4e4895e88cb552a7ea302a99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1713962ad868efd3d92c97e5eff4a9e6300113afa35cf94f7ac5cd00cc7824c98ba8a9206616cd130a0e939d00e9ec44cbb422af2a0449674712c606b17383be
|
7
|
+
data.tar.gz: e9ba5783d5b37bec3edf86ec7f194c6bbf60bbcb310a87d14ce6e0b03b2b135f8abd565666b8a5ca8403659ca46b17cfb154643d71910ce7e8b04be8bc510e58
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require_relative 'references'
|
4
4
|
|
5
5
|
class CfnModel
|
6
|
-
attr_reader :resources, :parameters, :line_numbers, :conditions, :globals
|
6
|
+
attr_reader :resources, :parameters, :line_numbers, :conditions, :globals, :mappings
|
7
7
|
|
8
8
|
##
|
9
9
|
# if you really want it, here it is - the raw Hash from YAML.load. you'll have to mess with structural nits of
|
@@ -16,6 +16,7 @@ class CfnModel
|
|
16
16
|
@resources = {}
|
17
17
|
@conditions = {}
|
18
18
|
@globals = {}
|
19
|
+
@mappings = {}
|
19
20
|
@raw_model = nil
|
20
21
|
@line_numbers = {}
|
21
22
|
end
|
@@ -38,6 +39,9 @@ class CfnModel
|
|
38
39
|
@resources.each do |k, v|
|
39
40
|
new_cfn_model.resources[k] = v
|
40
41
|
end
|
42
|
+
@mappings.each do |k, v|
|
43
|
+
new_cfn_model.mappings[k] = v
|
44
|
+
end
|
41
45
|
new_cfn_model.raw_model = @raw_model.dup unless @raw_model.nil?
|
42
46
|
new_cfn_model
|
43
47
|
end
|
@@ -10,24 +10,34 @@ require 'cfn-model/parser/parser_error'
|
|
10
10
|
# clear
|
11
11
|
module References
|
12
12
|
def self.resolve_value(cfn_model, value)
|
13
|
+
|
13
14
|
if value.is_a? Hash
|
14
15
|
if value.has_key?('Ref')
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
resolve_reference(cfn_model, value)
|
17
|
+
elsif value.has_key?('Fn::FindInMap')
|
18
|
+
resolve_map(cfn_model, value)
|
19
|
+
else
|
20
|
+
value
|
21
|
+
end
|
22
|
+
else
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# For a !Ref to another resource.... just returns the !REf
|
29
|
+
# For a !Ref to a Parameter, then try to synthesize the value
|
30
|
+
def self.resolve_reference(cfn_model, value)
|
31
|
+
ref_id = value['Ref']
|
32
|
+
if ref_id.is_a? String
|
33
|
+
if cfn_model.parameters.has_key?(ref_id)
|
34
|
+
return value if cfn_model.parameters[ref_id].synthesized_value.nil?
|
35
|
+
return cfn_model.parameters[ref_id].synthesized_value
|
26
36
|
else
|
27
37
|
return value
|
28
38
|
end
|
29
39
|
else
|
30
|
-
|
40
|
+
value
|
31
41
|
end
|
32
42
|
end
|
33
43
|
|
@@ -57,6 +67,33 @@ module References
|
|
57
67
|
resolve_resource_id group_id, 'GroupId'
|
58
68
|
end
|
59
69
|
|
70
|
+
##
|
71
|
+
# Try to compute the FindInMap against a real Mapping
|
72
|
+
#
|
73
|
+
# If anything doesn't match up - either a syntax error,
|
74
|
+
# a missing Mapping, or some other kind Cfn evaluation
|
75
|
+
# we don't understand, just return the call to FindInMap
|
76
|
+
def self.resolve_map(cfn_model, find_in_map)
|
77
|
+
map_name = find_in_map['Fn::FindInMap'][0]
|
78
|
+
top_level_key = find_in_map['Fn::FindInMap'][1]
|
79
|
+
second_level_key = find_in_map['Fn::FindInMap'][2]
|
80
|
+
|
81
|
+
map = cfn_model.mappings[map_name]
|
82
|
+
|
83
|
+
return find_in_map if map.nil?
|
84
|
+
|
85
|
+
top_level_resolved = resolve_value(cfn_model, top_level_key)
|
86
|
+
|
87
|
+
return find_in_map if !map.has_key?(top_level_resolved)
|
88
|
+
|
89
|
+
top_level = map[top_level_resolved]
|
90
|
+
second_level = top_level[resolve_value(cfn_model, second_level_key)]
|
91
|
+
|
92
|
+
return find_in_map if second_level.nil?
|
93
|
+
|
94
|
+
second_level
|
95
|
+
end
|
96
|
+
|
60
97
|
private
|
61
98
|
|
62
99
|
def self.logical_resource_id_from_get_att(attribute_spec, attr_to_retrieve=nil)
|
@@ -76,6 +76,8 @@ class CfnParser
|
|
76
76
|
|
77
77
|
process_conditions cfn_hash, cfn_model, condition_values_json
|
78
78
|
|
79
|
+
process_mappings cfn_hash, cfn_model
|
80
|
+
|
79
81
|
# pass 1: wire properties into ModelElement objects
|
80
82
|
if with_line_numbers
|
81
83
|
transform_hash_into_model_elements_with_numbers cfn_hash, cfn_model
|
@@ -93,6 +95,14 @@ class CfnParser
|
|
93
95
|
|
94
96
|
private
|
95
97
|
|
98
|
+
def process_mappings(cfn_hash, cfn_model)
|
99
|
+
if cfn_hash.key?('Mappings')
|
100
|
+
cfn_hash['Mappings'].each do |mapping_key, mapping_value|
|
101
|
+
cfn_model.mappings[mapping_key] = mapping_value
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
96
106
|
def process_conditions(cfn_hash, cfn_model, condition_values_json)
|
97
107
|
if cfn_hash.key?('Conditions')
|
98
108
|
if condition_values_json.nil?
|
@@ -33,6 +33,32 @@ class ParameterSubstitution
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
def apply_pseudo_parameter_values(cfn_model, parameter_values)
|
37
|
+
# leave out 'AWS::NoValue'? not sure - we explicitly check it in some places...
|
38
|
+
# might make sense to substitute here?
|
39
|
+
pseudo_function_defaults = {
|
40
|
+
'AWS::URLSuffix' => 'amazonaws.com',
|
41
|
+
'AWS::Partition' => 'aws',
|
42
|
+
'AWS::NotificationARNs' => '',
|
43
|
+
'AWS::AccountId' => '111111111111',
|
44
|
+
'AWS::Region' => 'us-east-1',
|
45
|
+
'AWS::StackId' => 'arn:aws:cloudformation:us-east-1:111111111111:stack/stackname/51af3dc0-da77-11e4-872e-1234567db123',
|
46
|
+
'AWS::StackName' => 'stackname'
|
47
|
+
}
|
48
|
+
pseudo_function_defaults.each do |function_name, default_value|
|
49
|
+
parameter = Parameter.new
|
50
|
+
parameter.id = function_name
|
51
|
+
parameter.type = 'String'
|
52
|
+
cfn_model.parameters[function_name] = parameter
|
53
|
+
|
54
|
+
if parameter_values[PARAMETERS].has_key?(function_name)
|
55
|
+
parameter.synthesized_value = parameter_values[PARAMETERS][function_name]
|
56
|
+
else
|
57
|
+
parameter.synthesized_value = default_value
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
36
62
|
def apply_parameter_values_impl(cfn_model, parameter_values)
|
37
63
|
parameter_values[PARAMETERS].each do |parameter_name, parameter_value|
|
38
64
|
if cfn_model.parameters.has_key?(parameter_name)
|
@@ -50,6 +76,7 @@ class ParameterSubstitution
|
|
50
76
|
parameter.synthesized_value = parameter.default.to_s
|
51
77
|
end
|
52
78
|
end
|
79
|
+
apply_pseudo_parameter_values(cfn_model, parameter_values)
|
53
80
|
end
|
54
81
|
|
55
82
|
def is_aws_format?(parameter_values)
|
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.4.
|
4
|
+
version: 0.4.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kascic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|