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: edcac88b6f93ad1e0729a170e85518462a57656f
4
- data.tar.gz: ac9c68a9634fae326f2d2dae42556d1280a0a20c
3
+ metadata.gz: 99ae976c5f51a3dd20649127f9cf9f121d14b013
4
+ data.tar.gz: 47484978c5fe38df5cf003472a83013c27d7cba1
5
5
  SHA512:
6
- metadata.gz: e14b30d51f4b1038e1d26abb12d1b4694cdce1039fdbba5e8d0f173b7aaea673435722c6371b67da619b6a016629b7f7062b46f36c1b7acd7f9135aca43dc9c8
7
- data.tar.gz: fc64546206181cb40fdd697647d2fa2c5643a34209a7666e0a2602bda10b897841634fcf74059995c7636c9e1ebe960a4a7c1a0e8a73fafb53402c0e1c467165
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
- cfn_hash = pre_validate_model cloudformation_yml
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
- cfn_hash = YAML.load cloudformation_yml
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)
@@ -1,3 +1,4 @@
1
+ # Parser for EC2 instances
1
2
  class Ec2InstanceParser
2
3
  def parse(cfn_model:, resource:)
3
4
  ec2_instance = 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.23
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-03-30 00:00:00.000000000 Z
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