cfn-model 0.1.23 → 0.1.24
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: 99ae976c5f51a3dd20649127f9cf9f121d14b013
|
4
|
+
data.tar.gz: 47484978c5fe38df5cf003472a83013c27d7cba1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5015a2a0e92b54cf8a6aeb4d25787e9f71ea4135dd906913f5c72d4169196a0c8a57bef1e78638f053c556ae8b6f2dba471690b0e2d9169d9ee58a3aaf12b9d
|
7
|
+
data.tar.gz: 8f1f04480fd6e462423fa9bf4b5099b282d0348cf3aa358225e9ea10a4cd993240e875c3638d9b567c9ecf69487f1cf7d70a194a870d7673514ef1fe8e54a243
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'json'
|
3
|
+
require 'cfn-model/parser/transform_registry'
|
3
4
|
require 'cfn-model/validator/cloudformation_validator'
|
4
5
|
require 'cfn-model/validator/reference_validator'
|
5
6
|
require_relative 'parser_registry'
|
@@ -31,7 +32,15 @@ class CfnParser
|
|
31
32
|
# Given raw json/yml CloudFormation template, returns a CfnModel object
|
32
33
|
# or raise ParserErrors if something is amiss with the format
|
33
34
|
def parse(cloudformation_yml, parameter_values_json=nil)
|
34
|
-
|
35
|
+
pre_validate_model cloudformation_yml
|
36
|
+
|
37
|
+
cfn_hash = YAML.load cloudformation_yml
|
38
|
+
|
39
|
+
# Transform raw resources in template as performed by
|
40
|
+
# transforms
|
41
|
+
CfnModel::TransformRegistry.instance.perform_transforms cfn_hash
|
42
|
+
|
43
|
+
validate_references cfn_hash
|
35
44
|
|
36
45
|
cfn_model = CfnModel.new
|
37
46
|
cfn_model.raw_model = cfn_hash
|
@@ -125,14 +134,13 @@ class CfnParser
|
|
125
134
|
if !errors.nil? && !errors.empty?
|
126
135
|
raise ParserError.new('Basic CloudFormation syntax error', errors)
|
127
136
|
end
|
137
|
+
end
|
128
138
|
|
129
|
-
|
130
|
-
|
139
|
+
def validate_references(cfn_hash)
|
131
140
|
unresolved_refs = ReferenceValidator.new.unresolved_references(cfn_hash)
|
132
141
|
unless unresolved_refs.empty?
|
133
142
|
raise ParserError.new("Unresolved logical resource ids: #{unresolved_refs.to_a}")
|
134
143
|
end
|
135
|
-
cfn_hash
|
136
144
|
end
|
137
145
|
|
138
146
|
def assign_fields_based_upon_properties(resource_object, resource)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Dir["#{__dir__}/../transforms/*.rb"].each do |transform|
|
2
|
+
require "cfn-model/transforms/#{File.basename(transform, '.rb')}"
|
3
|
+
end
|
4
|
+
|
5
|
+
class CfnModel
|
6
|
+
# TransformRegistry provides a registry of CloudFormation transforms
|
7
|
+
# available for templates
|
8
|
+
class TransformRegistry
|
9
|
+
attr_reader :registry
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@registry = {
|
13
|
+
'AWS::Serverless-2016-10-31' => CfnModel::Transforms::Serverless
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def perform_transforms(cfn_hash)
|
18
|
+
transform_name = cfn_hash['Transform']
|
19
|
+
return unless transform_name
|
20
|
+
@registry[transform_name].instance.perform_transform cfn_hash
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.instance
|
24
|
+
@instance ||= TransformRegistry.new
|
25
|
+
@instance
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class CfnModel
|
31
|
+
class Transforms
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
class CfnModel
|
2
|
+
class Transforms
|
3
|
+
# Handle transformation of model elements performed by the
|
4
|
+
# Serverless trasnform, see
|
5
|
+
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html
|
6
|
+
class Serverless
|
7
|
+
def perform_transform(cfn_hash)
|
8
|
+
resources = cfn_hash['Resources'].clone
|
9
|
+
resources.each do |resource_name, resource|
|
10
|
+
next unless resource['Type'].eql? 'AWS::Serverless::Function'
|
11
|
+
replace_serverless_function cfn_hash, resource_name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.instance
|
16
|
+
@instance ||= Serverless.new
|
17
|
+
@instance
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
# Bucket is 3rd element of an S3 URI split on '/'
|
23
|
+
def bucket_from_uri(uri)
|
24
|
+
uri.split('/')[2]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Object key is 4th element to end of an S3 URI split on '/'
|
28
|
+
def object_key_from_uri(uri)
|
29
|
+
uri.split('/')[3..-1].join('/')
|
30
|
+
end
|
31
|
+
|
32
|
+
# rubocop:disable Metrics/AbcSize
|
33
|
+
# rubocop:disable Metrics/MethodLength
|
34
|
+
|
35
|
+
def replace_serverless_function(cfn_hash, resource_name)
|
36
|
+
resource = cfn_hash['Resources'][resource_name]
|
37
|
+
|
38
|
+
code_bucket = bucket_from_uri resource['Properties']['CodeUri']
|
39
|
+
code_key = object_key_from_uri resource['Properties']['CodeUri']
|
40
|
+
|
41
|
+
cfn_hash['Resources'][resource_name] = \
|
42
|
+
lambda_function(
|
43
|
+
handler: resource['Properties']['Handler'],
|
44
|
+
code_bucket: code_bucket,
|
45
|
+
code_key: code_key,
|
46
|
+
runtime: resource['Properties']['Runtime']
|
47
|
+
)
|
48
|
+
|
49
|
+
cfn_hash['Resources']['FunctionNameRole'] = function_name_role
|
50
|
+
end
|
51
|
+
# rubocop:enable Metrics/AbcSize
|
52
|
+
# rubocop:enable Metrics/MethodLength
|
53
|
+
|
54
|
+
# rubocop:disable Metrics/MethodLength
|
55
|
+
|
56
|
+
# Return the hash structure of the 'FunctionNameRole'
|
57
|
+
# AWS::IAM::Role resource as created by Serverless transform
|
58
|
+
def function_name_role
|
59
|
+
{
|
60
|
+
'Type' => 'AWS::IAM::Role',
|
61
|
+
'Properties' => {
|
62
|
+
'ManagedPolicyArns' =>
|
63
|
+
['arn:aws:iam::aws:policy/service-role/' \
|
64
|
+
'AWSLambdaBasicExecutionRole'],
|
65
|
+
'AssumeRolePolicyDocument' => {
|
66
|
+
'Version' => '2012-10-17',
|
67
|
+
'Statement' => [{
|
68
|
+
'Action' => ['sts:AssumeRole'], 'Effect' => 'Allow',
|
69
|
+
'Principal' => { 'Service' => ['lambda.amazonaws.com'] }
|
70
|
+
}]
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
end
|
75
|
+
# rubocop:enable Metrics/MethodLength
|
76
|
+
|
77
|
+
# Return the hash structure of a AWS::Lambda::Function as created
|
78
|
+
# by Serverless transform
|
79
|
+
def lambda_function(handler:, code_bucket:, code_key:, runtime:)
|
80
|
+
{ 'Type' => 'AWS::Lambda::Function',
|
81
|
+
'Properties' => {
|
82
|
+
'Handler' => handler,
|
83
|
+
'Code' => { 'S3Bucket' => code_bucket,
|
84
|
+
'S3Key' => code_key },
|
85
|
+
'Role' => { 'Fn::GetAtt' => %w[FunctionNameRole Arn] },
|
86
|
+
'Runtime' => runtime
|
87
|
+
} }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
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.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kascic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rubocop
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: kwalify
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -68,6 +82,7 @@ files:
|
|
68
82
|
- lib/cfn-model/parser/parser_registry.rb
|
69
83
|
- lib/cfn-model/parser/policy_document_parser.rb
|
70
84
|
- lib/cfn-model/parser/security_group_parser.rb
|
85
|
+
- lib/cfn-model/parser/transform_registry.rb
|
71
86
|
- lib/cfn-model/parser/with_policy_document_parser.rb
|
72
87
|
- lib/cfn-model/schema/AWS_CloudFront_Distribution.yml
|
73
88
|
- lib/cfn-model/schema/AWS_EC2_Instance.yml
|
@@ -89,6 +104,7 @@ files:
|
|
89
104
|
- lib/cfn-model/schema/AWS_SNS_TopicPolicy.yml
|
90
105
|
- lib/cfn-model/schema/AWS_SQS_QueuePolicy.yml
|
91
106
|
- lib/cfn-model/schema/schema.yml.erb
|
107
|
+
- lib/cfn-model/transforms/serverless.rb
|
92
108
|
- lib/cfn-model/validator/cloudformation_validator.rb
|
93
109
|
- lib/cfn-model/validator/reference_validator.rb
|
94
110
|
- lib/cfn-model/validator/resource_type_validator.rb
|