cfndsl 0.4.4 → 0.5.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.rubocop.yml +23 -0
- data/Gemfile +4 -0
- data/Rakefile +19 -17
- data/bin/cfndsl +20 -20
- data/cfndsl.gemspec +16 -15
- data/lib/cfndsl.rb +62 -68
- data/lib/cfndsl/aws/cloud_formation_template.rb +16 -0
- data/lib/cfndsl/aws/types.rb +12 -0
- data/lib/cfndsl/{aws_types.yaml → aws/types.yaml} +0 -0
- data/lib/cfndsl/{Conditions.rb → conditions.rb} +5 -7
- data/lib/cfndsl/creation_policy.rb +21 -0
- data/lib/cfndsl/errors.rb +29 -0
- data/lib/cfndsl/generate_types.rb +154 -0
- data/lib/cfndsl/jsonable.rb +214 -0
- data/lib/cfndsl/mappings.rb +23 -0
- data/lib/cfndsl/metadata.rb +16 -0
- data/lib/cfndsl/module.rb +52 -51
- data/lib/cfndsl/names.rb +5 -5
- data/lib/cfndsl/orchestration_template.rb +173 -0
- data/lib/cfndsl/os/heat_template.rb +16 -0
- data/lib/cfndsl/os/types.rb +12 -0
- data/lib/cfndsl/{os_types.yaml → os/types.yaml} +11 -11
- data/lib/cfndsl/{Outputs.rb → outputs.rb} +3 -4
- data/lib/cfndsl/{Parameters.rb → parameters.rb} +12 -13
- data/lib/cfndsl/plurals.rb +34 -0
- data/lib/cfndsl/properties.rb +21 -0
- data/lib/cfndsl/rake_task.rb +9 -7
- data/lib/cfndsl/ref_check.rb +44 -0
- data/lib/cfndsl/{Resources.rb → resources.rb} +13 -15
- data/lib/cfndsl/types.rb +151 -0
- data/lib/cfndsl/update_policy.rb +25 -0
- data/lib/cfndsl/version.rb +1 -1
- data/sample/autoscale.rb +152 -158
- data/sample/autoscale2.rb +151 -155
- data/sample/circular.rb +30 -33
- data/sample/codedeploy.rb +35 -36
- data/sample/config_service.rb +120 -0
- data/sample/ecs.rb +39 -39
- data/sample/iam_policies.rb +82 -0
- data/sample/lambda.rb +20 -24
- data/sample/s3.rb +11 -11
- data/sample/t1.rb +7 -9
- data/sample/vpc_example.rb +50 -0
- data/sample/vpc_with_vpn_example.rb +97 -0
- data/spec/cfndsl_spec.rb +22 -11
- data/spec/fixtures/heattest.rb +13 -14
- data/spec/fixtures/test.rb +56 -53
- metadata +36 -30
- data/lib/cfndsl/CloudFormationTemplate.rb +0 -267
- data/lib/cfndsl/CreationPolicy.rb +0 -25
- data/lib/cfndsl/Errors.rb +0 -31
- data/lib/cfndsl/JSONable.rb +0 -235
- data/lib/cfndsl/Mappings.rb +0 -25
- data/lib/cfndsl/Metadata.rb +0 -22
- data/lib/cfndsl/Plurals.rb +0 -35
- data/lib/cfndsl/Properties.rb +0 -25
- data/lib/cfndsl/RefCheck.rb +0 -48
- data/lib/cfndsl/Types.rb +0 -309
- data/lib/cfndsl/UpdatePolicy.rb +0 -29
- data/sample/config-service.rb +0 -119
- data/sample/iam-policies.rb +0 -82
- data/sample/vpc-example.rb +0 -51
- data/sample/vpc-with-vpn-example.rb +0 -97
data/lib/cfndsl/module.rb
CHANGED
@@ -1,73 +1,74 @@
|
|
1
|
-
require 'cfndsl/
|
1
|
+
require 'cfndsl/plurals'
|
2
2
|
require 'cfndsl/names'
|
3
|
+
|
4
|
+
# Adds some dsl module helpers
|
3
5
|
class Module
|
4
6
|
private
|
7
|
+
|
8
|
+
# Create setter methods
|
9
|
+
#
|
10
|
+
# Usage:
|
11
|
+
# class Something
|
12
|
+
# dsl_attr_setter :Thing
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Generates a setter method like this one for each symbol in *symbols:
|
16
|
+
#
|
17
|
+
# def Thing(value)
|
18
|
+
# @Thing = value
|
19
|
+
# end
|
20
|
+
#
|
5
21
|
def dsl_attr_setter(*symbols)
|
6
|
-
##
|
7
|
-
# Create setter methods
|
8
|
-
#
|
9
|
-
# Usage:
|
10
|
-
# class Something
|
11
|
-
# dsl_attr_setter :Thing
|
12
|
-
# end
|
13
|
-
#
|
14
|
-
# Generates a setter method like this one for each symbol in *symbols:
|
15
|
-
#
|
16
|
-
# def Thing(value)
|
17
|
-
# @Thing = value
|
18
|
-
# end
|
19
|
-
#
|
20
22
|
symbols.each do |symbol|
|
21
|
-
class_eval do
|
22
|
-
CfnDsl
|
23
|
+
class_eval do
|
24
|
+
CfnDsl.method_names(symbol) do |method|
|
23
25
|
define_method(method) do |value|
|
24
|
-
instance_variable_set(
|
26
|
+
instance_variable_set("@#{symbol}", value)
|
25
27
|
end
|
26
28
|
end
|
27
|
-
end
|
29
|
+
end
|
28
30
|
end
|
29
31
|
end
|
30
|
-
|
32
|
+
|
33
|
+
# Create object declaration methods.
|
34
|
+
#
|
35
|
+
# Usage:
|
36
|
+
# Class Something
|
37
|
+
# dsl_content_object :Stuff
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# Generates methods like this:
|
41
|
+
#
|
42
|
+
# def Stuff(name, *values, &block)
|
43
|
+
# @Stuffs ||= {}
|
44
|
+
# @Stuffs[name] ||= CfnDsl::#{symbol}Definition.new(*values)
|
45
|
+
# @Stuffs[name].instance_eval &block if block_given?
|
46
|
+
# return @Stuffs[name]
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# The effect of this is that you can then create named sub-objects
|
50
|
+
# from the main object. The sub objects get stuffed into a container
|
51
|
+
# on the main object, and the block is then evaluated in the context
|
52
|
+
# of the new object.
|
53
|
+
#
|
31
54
|
def dsl_content_object(*symbols)
|
32
|
-
##
|
33
|
-
# Create object declaration methods.
|
34
|
-
#
|
35
|
-
# Usage:
|
36
|
-
# Class Something
|
37
|
-
# dsl_content_object :Stuff
|
38
|
-
# end
|
39
|
-
#
|
40
|
-
# Generates methods like this:
|
41
|
-
#
|
42
|
-
# def Stuff(name, *values, &block)
|
43
|
-
# @Stuffs ||= {}
|
44
|
-
# @Stuffs[name] ||= CfnDsl::#{symbol}Definition.new(*values)
|
45
|
-
# @Stuffs[name].instance_eval &block if block_given?
|
46
|
-
# return @Stuffs[name]
|
47
|
-
# end
|
48
|
-
#
|
49
|
-
# The effect of this is that you can then create named sub-objects
|
50
|
-
# from the main object. The sub objects get stuffed into a container
|
51
|
-
# on the main object, and the block is then evaluated in the context
|
52
|
-
# of the new object.
|
53
|
-
#
|
54
55
|
symbols.each do |symbol|
|
55
|
-
plural = CfnDsl::Plurals
|
56
|
+
plural = CfnDsl::Plurals.pluralize(symbol) # @@plurals[symbol] || "#{symbol}s"
|
56
57
|
pluralvar = "@#{plural}".to_sym
|
57
|
-
definition_class = CfnDsl.const_get(
|
58
|
+
definition_class = CfnDsl.const_get("#{symbol}Definition")
|
58
59
|
class_eval do
|
59
|
-
CfnDsl
|
60
|
-
define_method(method) do |name
|
60
|
+
CfnDsl.method_names(symbol) do |method|
|
61
|
+
define_method(method) do |name, *values, &block|
|
61
62
|
name = name.to_s
|
62
|
-
hash = instance_variable_get(
|
63
|
-
|
63
|
+
hash = instance_variable_get(pluralvar)
|
64
|
+
unless hash
|
64
65
|
hash = {}
|
65
|
-
instance_variable_set(
|
66
|
+
instance_variable_set(pluralvar, hash)
|
66
67
|
end
|
67
68
|
hash[name] ||= definition_class.new(*values)
|
68
|
-
hash[name].instance_eval
|
69
|
+
hash[name].instance_eval(&block) if block
|
69
70
|
return hash[name]
|
70
|
-
end
|
71
|
+
end
|
71
72
|
end
|
72
73
|
end
|
73
74
|
end
|
data/lib/cfndsl/names.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
+
# Method name helper
|
1
2
|
module CfnDsl
|
2
|
-
##
|
3
3
|
# iterates through the the valid case-insensitive names
|
4
|
-
# for "name"
|
5
|
-
def self.
|
6
|
-
if block
|
4
|
+
# for "name"
|
5
|
+
def self.method_names(name, &block)
|
6
|
+
if block
|
7
7
|
name_str = name.to_s
|
8
8
|
yield name_str.to_sym
|
9
9
|
n = name_str.dup
|
10
10
|
n[0] = n[0].swapcase
|
11
11
|
yield n.to_sym
|
12
12
|
else
|
13
|
-
result = [name.dup,name.dup]
|
13
|
+
result = [name.dup, name.dup]
|
14
14
|
result[1][0] = result[1][0].swapcase
|
15
15
|
return result
|
16
16
|
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'cfndsl/jsonable'
|
2
|
+
require 'cfndsl/names'
|
3
|
+
require 'cfndsl/aws/types'
|
4
|
+
require 'cfndsl/os/types'
|
5
|
+
|
6
|
+
module CfnDsl
|
7
|
+
# Handles the overall template object
|
8
|
+
# rubocop:disable Metrics/ClassLength
|
9
|
+
class OrchestrationTemplate < JSONable
|
10
|
+
dsl_attr_setter :AWSTemplateFormatVersion, :Description
|
11
|
+
dsl_content_object :Condition, :Parameter, :Output, :Resource, :Mapping
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@AWSTemplateFormatVersion = '2010-09-09'
|
15
|
+
end
|
16
|
+
|
17
|
+
GlobalRefs = {
|
18
|
+
'AWS::NotificationARNs' => 1,
|
19
|
+
'AWS::Region' => 1,
|
20
|
+
'AWS::StackId' => 1,
|
21
|
+
'AWS::StackName' => 1,
|
22
|
+
'AWS::AccountId' => 1,
|
23
|
+
'AWS::NoValue' => 1
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
27
|
+
def valid_ref?(ref, origin = nil)
|
28
|
+
ref = ref.to_s
|
29
|
+
origin = origin.to_s if origin
|
30
|
+
|
31
|
+
return true if GlobalRefs.key?(ref)
|
32
|
+
|
33
|
+
return true if @Parameters && @Parameters.key?(ref)
|
34
|
+
|
35
|
+
if @Resources.key?(ref)
|
36
|
+
return !origin || !@_resource_refs || !@_resource_refs[ref] || !@_resource_refs[ref].key?(origin)
|
37
|
+
end
|
38
|
+
|
39
|
+
false
|
40
|
+
end
|
41
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
42
|
+
|
43
|
+
def check_refs
|
44
|
+
invalids = check_resource_refs + check_output_refs
|
45
|
+
|
46
|
+
invalids.empty? ? nil : invalids
|
47
|
+
end
|
48
|
+
|
49
|
+
def check_resource_refs
|
50
|
+
invalids = []
|
51
|
+
|
52
|
+
@_resource_refs = {}
|
53
|
+
if @Resources
|
54
|
+
@Resources.keys.each do |resource|
|
55
|
+
@_resource_refs[resource.to_s] = @Resources[resource].build_references({})
|
56
|
+
end
|
57
|
+
@_resource_refs.keys.each do |origin|
|
58
|
+
@_resource_refs[origin].keys.each do |ref|
|
59
|
+
invalids.push "Invalid Reference: Resource #{origin} refers to #{ref}" unless valid_ref?(ref, origin)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
invalids
|
65
|
+
end
|
66
|
+
|
67
|
+
def check_output_refs
|
68
|
+
invalids = []
|
69
|
+
|
70
|
+
output_refs = {}
|
71
|
+
if @Outputs
|
72
|
+
@Outputs.keys.each do |resource|
|
73
|
+
output_refs[resource.to_s] = @Outputs[resource].build_references({})
|
74
|
+
end
|
75
|
+
output_refs.keys.each do |origin|
|
76
|
+
output_refs[origin].keys.each do |ref|
|
77
|
+
invalids.push "Invalid Reference: Output #{origin} refers to #{ref}" unless valid_ref?(ref)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
invalids
|
83
|
+
end
|
84
|
+
|
85
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
86
|
+
def self.create_types
|
87
|
+
names = {}
|
88
|
+
nametypes = {}
|
89
|
+
template_types['Resources'].each_pair do |name, type|
|
90
|
+
# Subclass ResourceDefintion and generate property methods
|
91
|
+
klass = Class.new(CfnDsl::ResourceDefinition)
|
92
|
+
klassname = name.split('::').join('_')
|
93
|
+
type_module.const_set(klassname, klass)
|
94
|
+
type['Properties'].each_pair do |pname, ptype|
|
95
|
+
if ptype.instance_of?(String)
|
96
|
+
create_klass = type_module.const_get(ptype)
|
97
|
+
|
98
|
+
klass.class_eval do
|
99
|
+
CfnDsl.method_names(pname) do |method|
|
100
|
+
define_method(method) do |*values, &block|
|
101
|
+
values.push create_klass.new if values.empty?
|
102
|
+
|
103
|
+
@Properties ||= {}
|
104
|
+
@Properties[pname] = CfnDsl::PropertyDefinition.new(*values)
|
105
|
+
@Properties[pname].value.instance_eval(&block) if block
|
106
|
+
@Properties[pname].value
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
else
|
111
|
+
# Array version
|
112
|
+
sing_name = CfnDsl::Plurals.singularize(pname)
|
113
|
+
create_klass = type_module.const_get(ptype[0])
|
114
|
+
klass.class_eval do
|
115
|
+
CfnDsl.method_names(pname) do |method|
|
116
|
+
define_method(method) do |*values, &block|
|
117
|
+
values.push [] if values.empty?
|
118
|
+
@Properties ||= {}
|
119
|
+
@Properties[pname] ||= PropertyDefinition.new(*values)
|
120
|
+
@Properties[pname].value.instance_eval(&block) if block
|
121
|
+
@Properties[pname].value
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
CfnDsl.method_names(sing_name) do |method|
|
126
|
+
define_method(method) do |value = nil, &block|
|
127
|
+
@Properties ||= {}
|
128
|
+
@Properties[pname] ||= PropertyDefinition.new([])
|
129
|
+
value = create_klass.new unless value
|
130
|
+
@Properties[pname].value.push value
|
131
|
+
value.instance_eval(&block) if block
|
132
|
+
value
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
parts = name.split('::')
|
139
|
+
until parts.empty?
|
140
|
+
abreve_name = parts.join('_')
|
141
|
+
if names.key?(abreve_name)
|
142
|
+
# this only happens if there is an ambiguity
|
143
|
+
names[abreve_name] = nil
|
144
|
+
else
|
145
|
+
names[abreve_name] = type_module.const_get(klassname)
|
146
|
+
nametypes[abreve_name] = name
|
147
|
+
end
|
148
|
+
parts.shift
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Define property setter methods for each of the unambiguous type names
|
153
|
+
names.each_pair do |typename, type|
|
154
|
+
next unless type
|
155
|
+
|
156
|
+
class_eval do
|
157
|
+
CfnDsl.method_names(typename) do |method|
|
158
|
+
define_method(method) do |name, *values, &block|
|
159
|
+
name = name.to_s
|
160
|
+
@Resources ||= {}
|
161
|
+
resource = @Resources[name] ||= type.new(*values)
|
162
|
+
resource.instance_eval(&block) if block
|
163
|
+
resource.instance_variable_set('@Type', nametypes[typename])
|
164
|
+
resource
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
171
|
+
end
|
172
|
+
# rubocop:enable Metrics/ClassLength
|
173
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'cfndsl/orchestration_template'
|
2
|
+
|
3
|
+
module CfnDsl
|
4
|
+
# Heat Templates
|
5
|
+
class HeatTemplate < OrchestrationTemplate
|
6
|
+
def self.template_types
|
7
|
+
CfnDsl::OS::Types::Types_Internal
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.type_module
|
11
|
+
CfnDsl::OS::Types
|
12
|
+
end
|
13
|
+
|
14
|
+
create_types
|
15
|
+
end
|
16
|
+
end
|
@@ -211,7 +211,7 @@ Resources:
|
|
211
211
|
#property.
|
212
212
|
rolling_updates : RollingUpdateMap
|
213
213
|
# Policy for rolling updates for this scaling group.
|
214
|
-
# Can be updated without replacement.
|
214
|
+
# Can be updated without replacement.
|
215
215
|
# Optional property.
|
216
216
|
"OS::Heat::CWLiteAlarm" :
|
217
217
|
Properties:
|
@@ -246,8 +246,8 @@ Resources:
|
|
246
246
|
LaunchConfigurationName: String
|
247
247
|
LoadBalancerNames: [ String ]
|
248
248
|
Size: Integer
|
249
|
-
Tags: [ EC2Tag ]
|
250
|
-
Attributes:
|
249
|
+
Tags: [ EC2Tag ]
|
250
|
+
Attributes:
|
251
251
|
InstanceList: String
|
252
252
|
|
253
253
|
"OS::Heat::MultipartMime" :
|
@@ -279,7 +279,7 @@ Resources:
|
|
279
279
|
# Required property.
|
280
280
|
|
281
281
|
#Attributes:
|
282
|
-
# refs: String
|
282
|
+
# refs: String
|
283
283
|
# # A list of resource IDs for the resources in the group
|
284
284
|
|
285
285
|
"OS::Heat::ScalingPolicy" :
|
@@ -421,7 +421,7 @@ Resources:
|
|
421
421
|
#ow the server should signal to heat with the deployment output values. CFN_SIGNAL will allow an HTTP POST to a CFN keypair signed URL. HEAT_SIGNAL will allow calls to the Heat API resource-signal using the provided keystone credentials. NO_SIGNAL will result in the resource going to the COMPLETE state without waiting for any signal.
|
422
422
|
#pdates cause replacement.
|
423
423
|
#ptional property, defaults to “CFN_SIGNAL”.
|
424
|
-
#llowed values: CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL
|
424
|
+
#llowed values: CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL
|
425
425
|
Attributes:
|
426
426
|
deploy_status_code: String
|
427
427
|
#eturned status code from the configuration execution
|
@@ -915,7 +915,7 @@ Resources:
|
|
915
915
|
#The unique identifier of the tenant owning the ipsec site connection.
|
916
916
|
vpnservice_id: String
|
917
917
|
#The unique identifier of vpn service associated with the ipsec site connection.
|
918
|
-
|
918
|
+
|
919
919
|
"OS::Neutron::LoadBalancer" :
|
920
920
|
Properties:
|
921
921
|
members : [ String ]
|
@@ -1642,7 +1642,7 @@ Resources:
|
|
1642
1642
|
#The URL of the container.
|
1643
1643
|
|
1644
1644
|
"OS::Trove::Instance" :
|
1645
|
-
Properties:
|
1645
|
+
Properties:
|
1646
1646
|
availability_zone : String
|
1647
1647
|
#Name of the availability zone for DB instance.
|
1648
1648
|
#Updates cause replacement.
|
@@ -1811,12 +1811,12 @@ Resources:
|
|
1811
1811
|
VpcId: String
|
1812
1812
|
Tags: [ EC2Tag ]
|
1813
1813
|
"AWS::EC2::SecurityGroup" :
|
1814
|
-
Properties:
|
1814
|
+
Properties:
|
1815
1815
|
GroupDescription: String
|
1816
1816
|
SecurityGroupIngress: [ EC2SecurityGroupRule ]
|
1817
1817
|
SecurityGroupEgress: [ EC2SecurityGroupRule ]
|
1818
1818
|
VpcId: String
|
1819
|
-
"AWS::EC2::Subnet" :
|
1819
|
+
"AWS::EC2::Subnet" :
|
1820
1820
|
Properties:
|
1821
1821
|
AvailabilityZone: String
|
1822
1822
|
VpcId: String
|
@@ -1909,7 +1909,7 @@ Types:
|
|
1909
1909
|
Integer: Integer
|
1910
1910
|
Number: Number
|
1911
1911
|
List: [ String ]
|
1912
|
-
RollingUpdateMap:
|
1912
|
+
RollingUpdateMap:
|
1913
1913
|
max_batch_size : Number
|
1914
1914
|
# The maximum number of resources to replace at once.
|
1915
1915
|
# Updates cause replacement.
|
@@ -2314,7 +2314,7 @@ Types:
|
|
2314
2314
|
#The name of the index document.
|
2315
2315
|
#Updates cause replacement.
|
2316
2316
|
#Optional property.
|
2317
|
-
#BlockDeviceMapping:
|
2317
|
+
#BlockDeviceMapping:
|
2318
2318
|
# DeviceName: String
|
2319
2319
|
# VirtualName: String
|
2320
2320
|
#Ebs: BlockDeviceTemplate
|