convection 0.0.1

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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rubocop.yml +16 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +23 -0
  6. data/README.md +224 -0
  7. data/Rakefile +2 -0
  8. data/Thorfile +5 -0
  9. data/convection.gemspec +27 -0
  10. data/example/iam_role.rb +63 -0
  11. data/example/s3.rb +13 -0
  12. data/example/vpc.rb +85 -0
  13. data/lib/convection.rb +18 -0
  14. data/lib/convection/control/stack.rb +165 -0
  15. data/lib/convection/dsl/helpers.rb +15 -0
  16. data/lib/convection/dsl/intrinsic_functions.rb +79 -0
  17. data/lib/convection/model/mixin/cidr_block.rb +17 -0
  18. data/lib/convection/model/mixin/conditional.rb +21 -0
  19. data/lib/convection/model/mixin/taggable.rb +48 -0
  20. data/lib/convection/model/template.rb +127 -0
  21. data/lib/convection/model/template/mapping.rb +42 -0
  22. data/lib/convection/model/template/output.rb +37 -0
  23. data/lib/convection/model/template/parameter.rb +44 -0
  24. data/lib/convection/model/template/resource.rb +64 -0
  25. data/lib/convection/model/template/resource/aws_ec2_instance.rb +69 -0
  26. data/lib/convection/model/template/resource/aws_ec2_internet_gateway.rb +55 -0
  27. data/lib/convection/model/template/resource/aws_ec2_route.rb +55 -0
  28. data/lib/convection/model/template/resource/aws_ec2_route_table.rb +60 -0
  29. data/lib/convection/model/template/resource/aws_ec2_security_group.rb +104 -0
  30. data/lib/convection/model/template/resource/aws_ec2_subnet.rb +66 -0
  31. data/lib/convection/model/template/resource/aws_ec2_subnet_route_table_association.rb +39 -0
  32. data/lib/convection/model/template/resource/aws_ec2_vpc.rb +116 -0
  33. data/lib/convection/model/template/resource/aws_ec2_vpc_gateway_attachment.rb +43 -0
  34. data/lib/convection/model/template/resource/aws_iam_policy.rb +45 -0
  35. data/lib/convection/model/template/resource/aws_iam_role.rb +45 -0
  36. data/lib/convection/model/template/resource/aws_s3_bucket.rb +67 -0
  37. data/lib/convection/model/template/resource/aws_s3_bucket_policy.rb +40 -0
  38. data/lib/convection/version.rb +6 -0
  39. metadata +375 -0
@@ -0,0 +1,42 @@
1
+ require_relative '../../dsl/intrinsic_functions'
2
+
3
+ module Convection
4
+ module Model
5
+ ##
6
+ # Hash with auto-generating sparse keys
7
+ ##
8
+ class Smash < Hash
9
+ def initialize(*args)
10
+ super do |hash, key|
11
+ hash[key] = Smash.new
12
+ end
13
+ end
14
+ end
15
+
16
+ class Template
17
+ ##
18
+ # Mapping
19
+ ##
20
+ class Mapping
21
+ include DSL::IntrinsicFunctions
22
+
23
+ attr_reader :items
24
+
25
+ def initialize(name, template)
26
+ @name = name
27
+ @template = template
28
+
29
+ @items = Smash.new
30
+ end
31
+
32
+ def item(key_1, key_2, value)
33
+ items[key_1][key_2] = value
34
+ end
35
+
36
+ def render
37
+ items
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../../dsl/intrinsic_functions'
2
+ require_relative '../mixin/conditional'
3
+
4
+ module Convection
5
+ module Model
6
+ class Template
7
+ ##
8
+ # Resource
9
+ ##
10
+ class Output
11
+ extend DSL::Helpers
12
+ include DSL::IntrinsicFunctions
13
+ include Model::Mixin::Conditional
14
+
15
+ attribute :value
16
+ attribute :description
17
+
18
+ def initialize(name, template)
19
+ @name = name
20
+ @template = template
21
+
22
+ @type = ''
23
+ @properties = {}
24
+ end
25
+
26
+ def render
27
+ {
28
+ 'Value' => value,
29
+ 'Description' => description
30
+ }.tap do |resource|
31
+ render_condition(resource)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,44 @@
1
+ require_relative '../../dsl/intrinsic_functions'
2
+
3
+ module Convection
4
+ module Model
5
+ class Template
6
+ ##
7
+ # Template Parameter
8
+ ##
9
+ class Parameter
10
+ extend DSL::Helpers
11
+ include DSL::IntrinsicFunctions
12
+
13
+ attribute :type
14
+ attribute :default
15
+ attribute :description
16
+ attr_reader :allowed_values
17
+
18
+ def initialize(name, template)
19
+ @name = name
20
+ @template = template
21
+
22
+ @type = 'String'
23
+ @default = ''
24
+ @allowed_values = []
25
+ @description = ''
26
+ end
27
+
28
+ def allow(value)
29
+ allowed_values << value
30
+ end
31
+
32
+ def render
33
+ {
34
+ 'Type' => type,
35
+ 'Default' => default,
36
+ 'Description' => description
37
+ }.tap do |resource|
38
+ resource['AllowedValues'] = allowed_values unless allowed_values.empty?
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,64 @@
1
+ require_relative '../../dsl/intrinsic_functions'
2
+ require_relative '../mixin/cidr_block'
3
+ require_relative '../mixin/conditional'
4
+ require_relative '../mixin/taggable'
5
+
6
+ module Convection
7
+ module Model
8
+ class Template
9
+ ##
10
+ # Resource
11
+ ##
12
+ class Resource
13
+ extend DSL::Helpers
14
+ include DSL::IntrinsicFunctions
15
+ include Model::Mixin::Conditional
16
+
17
+ attribute :type
18
+ attr_reader :name
19
+ attr_reader :properties
20
+
21
+ def initialize(name, template)
22
+ @name = name
23
+ @template = template
24
+
25
+ @type = ''
26
+ @properties = {}
27
+ end
28
+
29
+ def property(key, value)
30
+ properties[key] = value.is_a?(Model::Template::Resource) ? value.reference : value
31
+ end
32
+
33
+ def reference
34
+ {
35
+ 'Ref' => name
36
+ }
37
+ end
38
+
39
+ def render
40
+ {
41
+ 'Type' => type,
42
+ 'Properties' => properties
43
+ }.tap do |resource|
44
+ render_condition(resource)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ require_relative 'resource/aws_ec2_instance'
53
+ require_relative 'resource/aws_ec2_internet_gateway'
54
+ require_relative 'resource/aws_ec2_route'
55
+ require_relative 'resource/aws_ec2_route_table'
56
+ require_relative 'resource/aws_ec2_security_group'
57
+ require_relative 'resource/aws_ec2_subnet'
58
+ require_relative 'resource/aws_ec2_subnet_route_table_association'
59
+ require_relative 'resource/aws_ec2_vpc'
60
+ require_relative 'resource/aws_ec2_vpc_gateway_attachment'
61
+ require_relative 'resource/aws_s3_bucket'
62
+ require_relative 'resource/aws_s3_bucket_policy'
63
+ require_relative 'resource/aws_iam_role'
64
+ require_relative 'resource/aws_iam_policy'
@@ -0,0 +1,69 @@
1
+ require_relative '../resource'
2
+
3
+ module Convection
4
+ module Model
5
+ class Template
6
+ class Resource
7
+ ##
8
+ # AWS::EC2::Instance
9
+ ##
10
+ class EC2Instance < Resource
11
+ include Model::Mixin::Taggable
12
+
13
+ def initialize(*args)
14
+ super
15
+
16
+ type 'AWS::EC2::Instance'
17
+ @properties['SecurityGroupIds'] = []
18
+ end
19
+
20
+ def availability_zone(value)
21
+ property('AvailabilityZone', value)
22
+ end
23
+
24
+ def image_id(value)
25
+ property('ImageId', value)
26
+ end
27
+
28
+ def instance_type(value)
29
+ property('InstanceType', value)
30
+ end
31
+
32
+ def key_name(value)
33
+ property('KeyName', value)
34
+ end
35
+
36
+ def security_group(value)
37
+ @properties['SecurityGroupIds'] << value
38
+ end
39
+
40
+ def subnet(value)
41
+ property('SubnetId', value)
42
+ end
43
+
44
+ def user_data(value)
45
+ property('UserData', value)
46
+ end
47
+
48
+ def render(*args)
49
+ super.tap do |resource|
50
+ render_tags(resource)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ module DSL
59
+ ## Add DSL method to template namespace
60
+ module Template
61
+ def ec2_instance(name, &block)
62
+ r = Model::Template::Resource::EC2Instance.new(name, self)
63
+
64
+ r.instance_exec(&block) if block
65
+ resources[name] = r
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../resource'
2
+
3
+ module Convection
4
+ module DSL
5
+ ## Add DSL method to template namespace
6
+ module Template
7
+ def ec2_internet_gateway(name, &block)
8
+ r = Model::Template::Resource::EC2InternetGateway.new(name, self)
9
+
10
+ r.instance_exec(&block) if block
11
+ resources[name] = r
12
+ end
13
+
14
+ module Resource
15
+ ##
16
+ # Add DSL for VPCGatewayAttachment
17
+ module EC2InternetGateway
18
+ def attach_to_vpc(vpc, &block)
19
+ a = Model::Template::Resource::EC2VPCGatewayAttachment.new("#{ name }VPCAttachment#{ vpc.name }", self)
20
+ a.vpc_id(vpc)
21
+ a.internet_gateway(self)
22
+
23
+ a.instance_exec(&block) if block
24
+ @template.resources[a.name] = a
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ module Model
32
+ class Template
33
+ class Resource
34
+ ##
35
+ # AWS::EC2::InternetGateway
36
+ ##
37
+ class EC2InternetGateway < Resource
38
+ include Model::Mixin::Taggable
39
+ include DSL::Template::Resource::EC2InternetGateway
40
+
41
+ def initialize(*args)
42
+ super
43
+ type 'AWS::EC2::InternetGateway'
44
+ end
45
+
46
+ def render(*args)
47
+ super.tap do |resource|
48
+ render_tags(resource)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../resource'
2
+
3
+ module Convection
4
+ module Model
5
+ class Template
6
+ class Resource
7
+ ##
8
+ # AWS::EC2::Route
9
+ ##
10
+ class EC2Route < Resource
11
+ def initialize(*args)
12
+ super
13
+ type 'AWS::EC2::Route'
14
+ end
15
+
16
+ def route_table_id(value)
17
+ property('RouteTableId', value)
18
+ end
19
+
20
+ def destination(value)
21
+ property('DestinationCidrBlock', value)
22
+ end
23
+
24
+ def gateway(value)
25
+ property('GatewayId', value)
26
+ end
27
+
28
+ def instance(value)
29
+ property('InstanceId', value)
30
+ end
31
+
32
+ def interface(value)
33
+ property('NetworkInterfaceId', value)
34
+ end
35
+
36
+ def peer(value)
37
+ property('VpcPeeringConnectionId', value)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ module DSL
45
+ ## Add DSL method to template namespace
46
+ module Template
47
+ def ec2_route(name, &block)
48
+ r = Model::Template::Resource::EC2Route.new(name, self)
49
+
50
+ r.instance_exec(&block) if block
51
+ resources[name] = r
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../resource'
2
+
3
+ module Convection
4
+
5
+ module DSL
6
+ ## Add DSL method to template namespace
7
+ module Template
8
+ def ec2_route_table(name, &block)
9
+ r = Model::Template::Resource::EC2RouteTable.new(name, self)
10
+
11
+ r.instance_exec(&block) if block
12
+ resources[name] = r
13
+ end
14
+
15
+ module Resource
16
+ ##
17
+ # DSL For routes
18
+ ##
19
+ module EC2RouteTable
20
+ def route(name, &block)
21
+ r = Model::Template::Resource::EC2Route.new("#{ self.name }Route#{ name }", @template)
22
+ r.route_table_id(reference)
23
+
24
+ r.instance_exec(&block) if block
25
+ @template.resources[r.name] = r
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ module Model
33
+ class Template
34
+ class Resource
35
+ ##
36
+ # AWS::EC2::RouteTable
37
+ ##
38
+ class EC2RouteTable < Resource
39
+ include DSL::Template::Resource::EC2RouteTable
40
+ include Model::Mixin::Taggable
41
+
42
+ def initialize(*args)
43
+ super
44
+ type 'AWS::EC2::RouteTable'
45
+ end
46
+
47
+ def vpc_id(value)
48
+ property('VpcId', value)
49
+ end
50
+
51
+ def render(*args)
52
+ super.tap do |resource|
53
+ render_tags(resource)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,104 @@
1
+ require_relative '../resource'
2
+
3
+ module Convection
4
+ module DSL
5
+ ## Add DSL method to template namespace
6
+ module Template
7
+ def ec2_security_group(name, &block)
8
+ r = Model::Template::Resource::EC2SecurityGroup.new(name, self)
9
+
10
+ r.instance_exec(&block) if block
11
+ resources[name] = r
12
+ end
13
+
14
+ module Resource
15
+ ##
16
+ # DSL For EC2SecurityGroup rules
17
+ ##
18
+ module EC2SecurityGroup
19
+ def ingress_rule(&block)
20
+ r = Model::Template::Resource::EC2SecurityGroup::Rule.new("#{ name }IngressGroupRule", @template)
21
+ r.instance_exec(&block) if block
22
+
23
+ security_group_ingress << r
24
+ end
25
+
26
+ def egress_rule(&block)
27
+ r = Model::Template::Resource::EC2SecurityGroup::Rule.new("#{ name }EgressGroupRule", @template)
28
+ r.instance_exec(&block) if block
29
+
30
+ security_group_egress << r
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ module Model
38
+ class Template
39
+ class Resource
40
+ ##
41
+ # AWS::EC2::SecurityGroup
42
+ ##
43
+ class EC2SecurityGroup < Resource
44
+ include DSL::Template::Resource::EC2SecurityGroup
45
+ include Model::Mixin::Taggable
46
+
47
+ attr_reader :security_group_ingress
48
+ attr_reader :security_group_egress
49
+
50
+ ##
51
+ # Ingress/Egress Rule
52
+ #
53
+ class Rule < Resource
54
+ attribute :from
55
+ attribute :to
56
+ attribute :protocol
57
+
58
+ attribute :cidr_ip
59
+ attribute :destination_group
60
+ attribute :source_group
61
+ attribute :source_group_owner
62
+
63
+ def render
64
+ {
65
+ 'IpProtocol' => protocol,
66
+ 'FromPort' => from,
67
+ 'ToPort' => to
68
+ }.tap do |rule|
69
+ rule['CidrIp'] = cidr_ip unless cidr_ip.nil?
70
+ rule['DestinationSecurityGroupId'] = destination_group unless destination_group.nil?
71
+ rule['SourceSecurityGroupId'] = source_group unless source_group.nil?
72
+ rule['SourceSecurityGroupOwnerId'] = source_group_owner unless source_group.nil?
73
+ end
74
+ end
75
+ end
76
+
77
+ def initialize(*args)
78
+ super
79
+
80
+ type 'AWS::EC2::SecurityGroup'
81
+ @security_group_ingress = []
82
+ @security_group_egress = []
83
+ end
84
+
85
+ def description(value)
86
+ property('GroupDescription', value)
87
+ end
88
+
89
+ def vpc_id(value)
90
+ property('VpcId', value)
91
+ end
92
+
93
+ def render(*args)
94
+ super.tap do |resource|
95
+ resource['Properties']['SecurityGroupIngress'] = security_group_ingress.map(&:render)
96
+ resource['Properties']['SecurityGroupEgress'] = security_group_egress.map(&:render)
97
+ render_tags(resource)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end