draw_cloud 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 (62) hide show
  1. data/README.md +22 -0
  2. data/lib/draw_cloud.rb +75 -0
  3. data/lib/draw_cloud/as_group.rb +104 -0
  4. data/lib/draw_cloud/as_group.rb~ +54 -0
  5. data/lib/draw_cloud/as_launch_configuration.rb +71 -0
  6. data/lib/draw_cloud/as_launch_configuration.rb~ +50 -0
  7. data/lib/draw_cloud/base.rb +264 -0
  8. data/lib/draw_cloud/base64_func.rb +30 -0
  9. data/lib/draw_cloud/configuration.rb +61 -0
  10. data/lib/draw_cloud/configuration.rb~ +64 -0
  11. data/lib/draw_cloud/ec2_instance.rb +141 -0
  12. data/lib/draw_cloud/ec2_instance.rb~ +78 -0
  13. data/lib/draw_cloud/ec2_instance_template.rb +29 -0
  14. data/lib/draw_cloud/ec2_instance_template.rb~ +36 -0
  15. data/lib/draw_cloud/elastic_ip.rb +97 -0
  16. data/lib/draw_cloud/elastic_ip.rb~ +19 -0
  17. data/lib/draw_cloud/get_att_func.rb +31 -0
  18. data/lib/draw_cloud/get_att_func.rb~ +19 -0
  19. data/lib/draw_cloud/iam_access_key.rb +53 -0
  20. data/lib/draw_cloud/iam_access_key.rb~ +43 -0
  21. data/lib/draw_cloud/iam_policy.rb +71 -0
  22. data/lib/draw_cloud/iam_policy.rb~ +41 -0
  23. data/lib/draw_cloud/iam_user.rb +53 -0
  24. data/lib/draw_cloud/iam_user.rb~ +44 -0
  25. data/lib/draw_cloud/internet_gateway.rb +66 -0
  26. data/lib/draw_cloud/join_func.rb +31 -0
  27. data/lib/draw_cloud/join_func.rb~ +24 -0
  28. data/lib/draw_cloud/locations.rb +25 -0
  29. data/lib/draw_cloud/locations.rb~ +53 -0
  30. data/lib/draw_cloud/map.rb +65 -0
  31. data/lib/draw_cloud/network_acl.rb +91 -0
  32. data/lib/draw_cloud/network_acl.rb~ +36 -0
  33. data/lib/draw_cloud/network_acl_entry.rb +110 -0
  34. data/lib/draw_cloud/network_acl_entry.rb~ +36 -0
  35. data/lib/draw_cloud/network_interface.rb +71 -0
  36. data/lib/draw_cloud/network_interface.rb~ +46 -0
  37. data/lib/draw_cloud/output.rb +38 -0
  38. data/lib/draw_cloud/output.rb~ +39 -0
  39. data/lib/draw_cloud/parameter.rb +58 -0
  40. data/lib/draw_cloud/parameter.rb~ +30 -0
  41. data/lib/draw_cloud/rds_instance.rb +117 -0
  42. data/lib/draw_cloud/rds_security_group.rb +57 -0
  43. data/lib/draw_cloud/route_table.rb +56 -0
  44. data/lib/draw_cloud/route_table_entry.rb +59 -0
  45. data/lib/draw_cloud/route_table_entry.rb~ +33 -0
  46. data/lib/draw_cloud/s3_bucket.rb~ +41 -0
  47. data/lib/draw_cloud/security_group.rb +85 -0
  48. data/lib/draw_cloud/security_group.rb~ +71 -0
  49. data/lib/draw_cloud/service.rb~ +75 -0
  50. data/lib/draw_cloud/simple_ref.rb +30 -0
  51. data/lib/draw_cloud/simple_ref.rb~ +17 -0
  52. data/lib/draw_cloud/sns_topic.rb +58 -0
  53. data/lib/draw_cloud/sns_topic.rb~ +39 -0
  54. data/lib/draw_cloud/subnet.rb +104 -0
  55. data/lib/draw_cloud/subnet.rb~ +56 -0
  56. data/lib/draw_cloud/utilities.rb +65 -0
  57. data/lib/draw_cloud/version.rb +3 -0
  58. data/lib/draw_cloud/vpc.rb +57 -0
  59. data/lib/draw_cloud/vpc.rb~ +55 -0
  60. data/lib/draw_cloud/wait_handle.rb +78 -0
  61. data/lib/draw_cloud/wait_handle.rb~ +10 -0
  62. metadata +195 -0
@@ -0,0 +1,22 @@
1
+ drawcloud
2
+ =========
3
+
4
+ Draw AWS CloudFormation configurations in Ruby
5
+
6
+
7
+ Copyright and License
8
+ =====================
9
+
10
+ Copyright 2013 SweetSpot Diabetes Care, Inc.
11
+
12
+ Licensed under the Apache License, Version 2.0 (the "License"); you
13
+ may not use this work except in compliance with the License. You may
14
+ obtain a copy of the License in the LICENSE file, or at:
15
+
16
+ http://www.apache.org/licenses/LICENSE-2.0
17
+
18
+ Unless required by applicable law or agreed to in writing, software
19
+ distributed under the License is distributed on an "AS IS" BASIS,
20
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
21
+ implied. See the License for the specific language governing
22
+ permissions and limitations under the License.
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright (c) 2012, SweetSpot Diabetes Care, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
6
+ # may not use this work except in compliance with the License. You may
7
+ # obtain a copy of the License in the LICENSE file, or at:
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14
+ # implied. See the License for the specific language governing
15
+ # permissions and limitations under the License.
16
+ #
17
+
18
+ module DrawCloud
19
+ def self.ref(object)
20
+ if object.respond_to? :ref
21
+ object.ref
22
+ elsif object.is_a? Symbol
23
+ resource_style(object)
24
+ elsif object.respond_to? :each_pair
25
+ object.each_with_object({}) {|(k,v),x| x[k] = DrawCloud.ref(v)}
26
+ else
27
+ object
28
+ end
29
+ end
30
+
31
+ def self.resource_style(str)
32
+ str.to_s.camelize
33
+ end
34
+
35
+ def self.resource_name(o)
36
+ if o.respond_to? :resource_name
37
+ o.resource_name
38
+ else
39
+ resource_style(o)
40
+ end
41
+ end
42
+
43
+ require_relative "draw_cloud/utilities"
44
+ require_relative "draw_cloud/locations"
45
+ require_relative "draw_cloud/base"
46
+ require_relative "draw_cloud/simple_ref"
47
+ require_relative "draw_cloud/join_func"
48
+ require_relative "draw_cloud/base64_func"
49
+ require_relative "draw_cloud/get_att_func"
50
+ require_relative "draw_cloud/configuration"
51
+ require_relative "draw_cloud/map"
52
+ require_relative "draw_cloud/parameter"
53
+ require_relative "draw_cloud/output"
54
+ require_relative "draw_cloud/vpc"
55
+ require_relative "draw_cloud/sns_topic"
56
+ require_relative "draw_cloud/security_group"
57
+ require_relative "draw_cloud/iam_policy"
58
+ require_relative "draw_cloud/iam_user"
59
+ require_relative "draw_cloud/iam_access_key"
60
+ require_relative "draw_cloud/subnet"
61
+ require_relative "draw_cloud/network_acl"
62
+ require_relative "draw_cloud/network_acl_entry"
63
+ require_relative "draw_cloud/route_table"
64
+ require_relative "draw_cloud/route_table_entry"
65
+ require_relative "draw_cloud/internet_gateway"
66
+ require_relative "draw_cloud/rds_instance"
67
+ require_relative "draw_cloud/rds_security_group"
68
+ require_relative "draw_cloud/wait_handle"
69
+ require_relative "draw_cloud/ec2_instance"
70
+ require_relative "draw_cloud/ec2_instance_template"
71
+ require_relative "draw_cloud/as_launch_configuration"
72
+ require_relative "draw_cloud/as_group"
73
+ require_relative "draw_cloud/elastic_ip"
74
+ require_relative "draw_cloud/network_interface"
75
+ end
@@ -0,0 +1,104 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright (c) 2012, SweetSpot Diabetes Care, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
6
+ # may not use this work except in compliance with the License. You may
7
+ # obtain a copy of the License in the LICENSE file, or at:
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14
+ # implied. See the License for the specific language governing
15
+ # permissions and limitations under the License.
16
+ #
17
+
18
+ module DrawCloud
19
+ class ASGroup < Base
20
+ NOTIFY_EC2_INSTANCE_LAUNCH = "autoscaling:EC2_INSTANCE_LAUNCH"
21
+ NOTIFY_EC2_INSTANCE_LAUNCH_ERROR = "autoscaling:EC2_INSTANCE_LAUNCH_ERROR"
22
+ NOTIFY_EC2_INSTANCE_TERMINATE = "autoscaling:EC2_INSTANCE_TERMINATE"
23
+ NOTIFY_EC2_INSTANCE_TERMINATE_ERROR = "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
24
+ NOTIFY_EC2_TEST_NOTIFICATION = "autoscaling:TEST_NOTIFICATION"
25
+ ALL_NOTIFICATIONS = [ NOTIFY_EC2_INSTANCE_LAUNCH,
26
+ NOTIFY_EC2_INSTANCE_LAUNCH_ERROR,
27
+ NOTIFY_EC2_INSTANCE_TERMINATE,
28
+ NOTIFY_EC2_INSTANCE_TERMINATE_ERROR,
29
+ NOTIFY_EC2_TEST_NOTIFICATION ]
30
+ ALL_ERRORS = [ NOTIFY_EC2_INSTANCE_LAUNCH_ERROR,
31
+ NOTIFY_EC2_INSTANCE_TERMINATE_ERROR ]
32
+ ALL_ACTIVITY = [ NOTIFY_EC2_INSTANCE_LAUNCH,
33
+ NOTIFY_EC2_INSTANCE_LAUNCH_ERROR,
34
+ NOTIFY_EC2_INSTANCE_TERMINATE,
35
+ NOTIFY_EC2_INSTANCE_TERMINATE_ERROR ]
36
+
37
+ attr_accessor :name, :availability_zones, :cooldown, :launch_configuration_name, :max_size, :min_size, :desired_capacity, :tags, :vpc_zone_identifier, :notification_configuration
38
+ alias :subnets :vpc_zone_identifier
39
+ alias :launch_configuration :launch_configuration_name
40
+ alias :launch_configuration= :launch_configuration_name=
41
+ def initialize(name, options={}, &block)
42
+ @name = name
43
+ @availability_zones = options.fetch(:availability_zones, [])
44
+ @cooldown = options.fetch(:cooldown, nil)
45
+ @launch_configuration_name = options.fetch(:launch_configuration_name, nil)
46
+ @max_size = options.fetch(:max_size, nil)
47
+ @min_size = options.fetch(:min_size, nil)
48
+ @notification_configuration = options.fetch(:notification_configuration, nil)
49
+ @desired_capacity = options.fetch(:desired_capacity, nil)
50
+ @tags = options.fetch(:tags, [])
51
+ @vpc_zone_identifier = options.fetch(:vpc_zone_identifier, nil)
52
+ super(options, &block)
53
+ end
54
+
55
+ def as_group
56
+ self
57
+ end
58
+
59
+ def notify(topic_arn, notification_types)
60
+ self.notification_configuration = {:arn => topic_arn, :types => notification_types}
61
+ end
62
+
63
+ def vpc_zone_identifier=(subnets)
64
+ if subnets.all? {|s| s.respond_to? :availability_zone }
65
+ self.availability_zones = subnets.collect(&:availability_zone)
66
+ end
67
+ @vpc_zone_identifier = subnets
68
+ end
69
+ alias :subnets= :vpc_zone_identifier=
70
+
71
+ def load_into_config(config)
72
+ config.cf_add_resource resource_name, self
73
+ super(config)
74
+ end
75
+
76
+ def resource_name
77
+ resource_style(name) + "AS"
78
+ end
79
+
80
+ def to_h
81
+ h = {
82
+ "Type" => "AWS::AutoScaling::AutoScalingGroup",
83
+ "Properties" => {
84
+ "AvailabilityZones" => availability_zones.collect {|g| DrawCloud.ref(g) },
85
+ "LaunchConfigurationName" => DrawCloud.ref(launch_configuration_name),
86
+ "MaxSize" => max_size,
87
+ "MinSize" => min_size,
88
+ "Tags" => [], # FIXME
89
+ }
90
+ }
91
+ p = h["Properties"]
92
+ p["AvailabilityZones"] = DrawCloud.ref(availability_zones) if cooldown
93
+ p["Cooldown"] = DrawCloud.ref(cooldown) if cooldown
94
+ p["DesiredCapacity"] = DrawCloud.ref(desired_capacity) if desired_capacity
95
+ p["VPCZoneIdentifier"] = vpc_zone_identifier.collect {|z| DrawCloud.ref(z) }
96
+ p["NotificationConfiguration"] = {
97
+ "TopicARN" => DrawCloud.ref(self.notification_configuration[:arn]),
98
+ "NotificationTypes" => self.notification_configuration[:types],
99
+ } if self.notification_configuration
100
+
101
+ add_standard_properties(h)
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright (c) 2012, SweetSpot Diabetes Care, Inc.
4
+ # License:: All rights reserved
5
+ #
6
+
7
+ module DrawCloud
8
+ class ASGroup < Base
9
+ attr_accessor :name, :availability_zones, :cooldown, :launch_configuration_name, :max_size, :min_size, :desired_capacity, :tags, :vpc_zone_identifier
10
+ alias :instance_class :instance_type
11
+ alias :instance_class= :instance_type=
12
+ def initialize(name, options={}, &block)
13
+ @name = name
14
+ @image_id = options.fetch(:image_id, nil)
15
+ @instance_monitoring = options.fetch(:instance_monitoring, nil)
16
+ @instance_type = options.fetch(:instance_type, nil)
17
+ @kernel_id = options.fetch(:kernel_id, nil)
18
+ @key_name = options.fetch(:key_name, nil)
19
+ @ram_disk_id = options.fetch(:ram_disk_id, nil)
20
+ @security_groups = options.fetch(:security_groups, nil)
21
+ @user_data = options.fetch(:user_data, nil)
22
+ @tags = {}
23
+ super(options, &block)
24
+ end
25
+
26
+ def as_launch_configuration
27
+ self
28
+ end
29
+
30
+ def load_into_config(config)
31
+ config.cf_add_resource resource_name, self
32
+ super(config)
33
+ end
34
+
35
+ def to_h
36
+ h = {
37
+ "Type" => "AWS::AutoScaling::LaunchConfiguration",
38
+ "Properties" => {
39
+ "ImageId" => DrawCloud.ref(image_id),
40
+ "InstanceType" => DrawCloud.ref(instance_type),
41
+ }
42
+ }
43
+ p = h["Properties"]
44
+ p["InstanceMonitoring"] = DrawCloud.ref(instance_monitoring) if instance_monitoring
45
+ p["KernelId"] = DrawCloud.ref(kernel_id) if kernel_id
46
+ p["KeyName"] = DrawCloud.ref(key_name) if key_name
47
+ p["RamDiskId"] = DrawCloud.ref(ram_disk_id) if ram_disk_id
48
+ p["SecurityGroups"] = security_groups if security_groups
49
+ p["UserData"] = user_data if user_data
50
+ h["Metadata"] = DrawCloud.ref(metadata) unless metadata.nil? || metadata.empty?
51
+ add_standard_properties(h)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright (c) 2012, SweetSpot Diabetes Care, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
6
+ # may not use this work except in compliance with the License. You may
7
+ # obtain a copy of the License in the LICENSE file, or at:
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14
+ # implied. See the License for the specific language governing
15
+ # permissions and limitations under the License.
16
+
17
+ #
18
+
19
+ module DrawCloud
20
+ class ASLaunchConfiguration < Base
21
+ attr_accessor :name, :image_id, :instance_monitoring, :instance_type, :kernel_id, :key_name, :ram_disk_id, :security_groups, :user_data, :metadata, :tags
22
+ alias :instance_class :instance_type
23
+ alias :instance_class= :instance_type=
24
+ alias :monitoring :instance_monitoring
25
+ alias :monitoring= :instance_monitoring=
26
+ def initialize(name, options={}, &block)
27
+ @name = name
28
+ @image_id = options.fetch(:image_id, nil)
29
+ @instance_monitoring = options.fetch(:instance_monitoring, nil)
30
+ @instance_type = options.fetch(:instance_type, nil)
31
+ @kernel_id = options.fetch(:kernel_id, nil)
32
+ @key_name = options.fetch(:key_name, nil)
33
+ @ram_disk_id = options.fetch(:ram_disk_id, nil)
34
+ @security_groups = options.fetch(:security_groups, nil)
35
+ @user_data = options.fetch(:user_data, nil)
36
+ super(options, &block)
37
+ end
38
+
39
+ def as_launch_configuration
40
+ self
41
+ end
42
+
43
+ def load_into_config(config)
44
+ config.cf_add_resource resource_name, self
45
+ super(config)
46
+ end
47
+
48
+ def resource_name
49
+ resource_style(name) + "LaunchConfig"
50
+ end
51
+
52
+ def to_h
53
+ h = {
54
+ "Type" => "AWS::AutoScaling::LaunchConfiguration",
55
+ "Properties" => {
56
+ "ImageId" => DrawCloud.ref(image_id),
57
+ "InstanceType" => DrawCloud.ref(instance_type),
58
+ }
59
+ }
60
+ p = h["Properties"]
61
+ p["InstanceMonitoring"] = DrawCloud.ref(instance_monitoring) if instance_monitoring
62
+ p["KernelId"] = DrawCloud.ref(kernel_id) if kernel_id
63
+ p["KeyName"] = DrawCloud.ref(key_name) if key_name
64
+ p["RamDiskId"] = DrawCloud.ref(ram_disk_id) if ram_disk_id
65
+ p["SecurityGroups"] = security_groups.collect {|s| DrawCloud.ref(s)} if security_groups
66
+ p["UserData"] = DrawCloud.ref(user_data) if user_data
67
+ h["Metadata"] = DrawCloud.ref(metadata) unless metadata.nil? || metadata.empty?
68
+ add_standard_properties(h)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright (c) 2012, SweetSpot Diabetes Care, Inc.
4
+ # License:: All rights reserved
5
+ #
6
+
7
+ module DrawCloud
8
+ class ASLaunchConfiguration < Base
9
+ attr_accessor :name, :image_id, :instance_monitoring, :instance_type, :kernel_id, :key_name, :ram_disk_id, :security_groups, :user_data
10
+ def initialize(name, cidr, options={}, &block)
11
+ @name = name
12
+ @cidr = cidr
13
+ @availability_zone = options.fetch(:availability_zone, nil)
14
+ @route_table = options.fetch(:route_table, nil)
15
+ @network_acl = options.fetch(:network_acl, nil)
16
+ super(options, &block)
17
+ end
18
+
19
+ def subnet
20
+ self
21
+ end
22
+
23
+ def load_into_config(config)
24
+ config.cf_add_resource resource_name, self
25
+ if route_table
26
+ route_table.load_into_config(config)
27
+ assoc = SubnetRouteTableAssociation.new(self, route_table)
28
+ config.cf_add_resource assoc.resource_name, assoc
29
+ end
30
+ if network_acl
31
+ network_acl.load_into_config(config)
32
+ assoc = SubnetNetworkAclAssociation.new(self, network_acl)
33
+ config.cf_add_resource assoc.resource_name, assoc
34
+ end
35
+ super(config)
36
+ end
37
+
38
+ def to_h
39
+ h = {
40
+ "Type" => "AWS::EC2::Subnet",
41
+ "Properties" => {
42
+ "CidrBlock" => cidr,
43
+ }
44
+ }
45
+ h["Properties"]["VpcId"] = DrawCloud.ref(vpc) if vpc
46
+ h["Properties"]["AvailabilityZone"] = DrawCloud.ref(@availability_zone) if @availability_zone
47
+ add_standard_properties(h)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,264 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright:: Copyright (c) 2012, SweetSpot Diabetes Care, Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
6
+ # may not use this work except in compliance with the License. You may
7
+ # obtain a copy of the License in the LICENSE file, or at:
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14
+ # implied. See the License for the specific language governing
15
+ # permissions and limitations under the License.
16
+
17
+ #
18
+
19
+ require "json"
20
+ require "active_support/inflector"
21
+ require "deep_merge"
22
+
23
+ module DrawCloud
24
+ class Base
25
+ include Utilities
26
+ include Locations
27
+
28
+ attr_accessor( :mappings,
29
+ :parameters,
30
+ :resources,
31
+ :outputs,
32
+
33
+ :subnets,
34
+ :route_tables,
35
+ :network_acls,
36
+ :security_groups,
37
+ :iam_users,
38
+ :iam_policies,
39
+ :iam_access_keys,
40
+ :gateways,
41
+ :rdses,
42
+ :elastic_ips,
43
+ :network_interfaces,
44
+ :wait_handles,
45
+ :ec2_instances,
46
+ :as_launch_configurations,
47
+ :as_groups,
48
+ :vpcs,
49
+ :sns_topics,
50
+
51
+ :depends_on,
52
+ :deletion_policy,
53
+ :metadata,
54
+
55
+ :parent )
56
+
57
+ def initialize(options={}, &block)
58
+ @mappings = {}
59
+ @parameters = {}
60
+ @resources = {}
61
+ @outputs = {}
62
+
63
+ @subnets = []
64
+ @route_tables = []
65
+ @network_acls = []
66
+ @security_groups = []
67
+ @iam_users = []
68
+ @iam_policies = []
69
+ @iam_access_keys = []
70
+ @gateways = []
71
+ @rdses = []
72
+ @ec2_instances = []
73
+ @as_launch_configurations = []
74
+ @as_groups = []
75
+ @elastic_ips = []
76
+ @network_interfaces = []
77
+ @wait_handles = []
78
+ @vpcs = []
79
+ @sns_topics = []
80
+
81
+ @parent = options.fetch(:parent, nil)
82
+
83
+ self.instance_exec(self, &block) if block
84
+ end
85
+
86
+ def load_into_config(config)
87
+ [@mappings, @parameters, @resources, @outputs].each do |i|
88
+ i.each {|k,v| v.load_into_config(config)}
89
+ end
90
+
91
+ [@gateways, @subnets, @route_tables, @network_acls, @security_groups, @iam_users, @iam_policies, @iam_access_keys,
92
+ @rdses, @ec2_instances, @as_launch_configurations, @as_groups, @elastic_ips, @network_interfaces, @wait_handles, @vpcs, @sns_topics].each do |a|
93
+ a.each {|g| g.load_into_config(config) }
94
+ end
95
+ end
96
+
97
+ def resource_name
98
+ resource_style(name)
99
+ end
100
+
101
+ def add_standard_properties(hash)
102
+ hash["DependsOn"] = DrawCloud.resource_name(depends_on) if depends_on
103
+ hash["DeletionPolicy"] = DrawCloud.resource_style(deletion_policy) if deletion_policy
104
+ hash["Metadata"] = DrawCloud.ref(metadata) unless metadata.nil?
105
+ hash
106
+ end
107
+
108
+ def ref
109
+ {"Ref" => resource_name}
110
+ end
111
+
112
+ def [](attribute)
113
+ fngetatt(self, attribute)
114
+ end
115
+
116
+ ## Definers
117
+
118
+ def create_mapping(name, map_by_function, values={})
119
+ m = Map.new(name, map_by_function, {:parent => self}, values)
120
+ mappings[m.resource_name] = m
121
+ m
122
+ end
123
+
124
+ def create_output(name, options={}, &block)
125
+ o = Output.new(name, options.merge(:parent => self), &block)
126
+ outputs[o.resource_name] = o
127
+ o
128
+ end
129
+
130
+ def create_parameter(name, type, options={}, &block)
131
+ p = Parameter.new(name, type, options.merge(:parent => self), &block)
132
+ parameters[p.resource_name] = p
133
+ p
134
+ end
135
+
136
+ def create_service(name, options={}, &block)
137
+ # NOOP
138
+ end
139
+
140
+ def create_vpc(name, cidr, options={}, &block)
141
+ v = Vpc.new(name, cidr, options.merge(:parent => self), &block)
142
+ vpcs << v
143
+ v
144
+ end
145
+
146
+ def create_sns_topic(name, options={}, &block)
147
+ s = SNSTopic.new(name, options.merge(:parent => self), &block)
148
+ sns_topics << s
149
+ s
150
+ end
151
+
152
+ def create_subnet(name, cidr, options={}, &block)
153
+ # collisioncheck
154
+ s = Subnet.new(name, cidr, options.merge(:parent => self), &block)
155
+ subnets << s
156
+ s
157
+ end
158
+
159
+ def create_route_table(name, options={}, &block)
160
+ r = RouteTable.new(name, options.merge(:parent => self), &block)
161
+ route_tables << r
162
+ r
163
+ end
164
+
165
+ def create_network_acl(name, options={}, &block)
166
+ a = NetworkAcl.new(name, options.merge(:parent => self), &block)
167
+ network_acls << a
168
+ a
169
+ end
170
+
171
+ def create_security_group(name, description=nil, options={}, &block)
172
+ g = SecurityGroup.new(name, description, options.merge(:parent => self), &block)
173
+ security_groups << g
174
+ g
175
+ end
176
+
177
+ def create_iam_user(name, options={}, &block)
178
+ u = IAMUser.new(name, options.merge(:parent => self), &block)
179
+ iam_users << u
180
+ u
181
+ end
182
+
183
+ def create_iam_policy(name, options={}, &block)
184
+ p = IAMPolicy.new(name, options.merge(:parent => self), &block)
185
+ iam_policies << p
186
+ p
187
+ end
188
+
189
+ def create_iam_access_key(name, options={}, &block)
190
+ a = IAMAccessKey.new(name, options.merge(:parent => self), &block)
191
+ iam_access_keys << a
192
+ a
193
+ end
194
+
195
+ def create_rds(name, options={}, &block)
196
+ r = RDSInstance.new(name, options.merge(:parent => self), &block)
197
+ rdses << r
198
+ r
199
+ end
200
+
201
+ def create_ec2_instance_template(name, options={}, &block)
202
+ EC2InstanceTemplate.new(name, options.merge(:parent => self), &block)
203
+ end
204
+
205
+ def create_ec2_instance(name, options={}, &block)
206
+ e = EC2Instance.new(name, options.merge(:parent => self), &block)
207
+ ec2_instances << e
208
+ e
209
+ end
210
+
211
+ def create_as_launch_configuration(name, options={}, &block)
212
+ lc = ASLaunchConfiguration.new(name, options.merge(:parent => self), &block)
213
+ as_launch_configurations << lc
214
+ lc
215
+ end
216
+
217
+ def create_as_group(name, options={}, &block)
218
+ asg = ASGroup.new(name, options.merge(:parent => self), &block)
219
+ as_groups << asg
220
+ asg
221
+ end
222
+
223
+ def create_wait_handle(name, timeout=nil, options={}, &block)
224
+ h = WaitHandle.new(name, timeout, options.merge(:parent => self), &block)
225
+ wait_handles << h
226
+ h
227
+ end
228
+
229
+ def create_elastic_ip(name, options={}, &block)
230
+ eip = ElasticIp.new(name, options.merge(:parent => self), &block)
231
+ elastic_ips << eip
232
+ eip
233
+ end
234
+
235
+ def create_network_interface(name, options={}, &block)
236
+ eni = NetworkInterface.new(name, options.merge(:parent => self), &block)
237
+ network_interfaces << eni
238
+ eni
239
+ end
240
+
241
+ ## Accessors (list below so grep works)
242
+ # def elastic_ip
243
+ # def internet_gateway
244
+ # def network_acl
245
+ # def rds
246
+ # def route_table
247
+ # def security_group
248
+ # def subnet
249
+ # def vpc
250
+ [:elastic_ip, :network_interface, :ec2_instance, :as_launch_configuration, :as_group,
251
+ :internet_gateway, :network_acl, :rds, :route_table, :security_group,
252
+ :subnet, :vpc, :iam_user, :iam_policy, :iam_access_key].each do |accessor|
253
+ self.class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
254
+ def #{accessor}()
255
+ if parent
256
+ parent.#{accessor}
257
+ else
258
+ nil
259
+ end
260
+ end
261
+ RUBY_EVAL
262
+ end
263
+ end
264
+ end