cfn-model 0.1.23 → 0.1.24

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