right_aws 2.1.0 → 3.0.0

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.
@@ -81,7 +81,7 @@ module RightAws
81
81
  request_hash['EndTime'] = AwsUtils::utc_iso8601(options[:end_time]) unless options[:end_time].right_blank?
82
82
  request_hash['ProductDescription'] = options[:product_description] unless options[:product_description].right_blank?
83
83
  request_hash.merge!(amazonize_list('InstanceType', Array(options[:instance_types]))) unless options[:instance_types].right_blank?
84
- link = generate_request("DescribeSpotPriceHistory", request_hash)
84
+ link = generate_request("DescribeSpotPriceHistory", request_hash, :api_version => '2011-05-15')
85
85
  request_info(link, QEc2DescribeSpotPriceHistoryParser.new)
86
86
  rescue Exception
87
87
  on_exception
@@ -98,39 +98,32 @@ module RightAws
98
98
  # spot-instance-request-id, spot-price, state, tag-key, tag-value, tag:key, type, valid-from, valid-until
99
99
  #
100
100
  # ec2.describe_spot_instance_requests #=>
101
- # [{:type=>"one-time",
102
- # :create_time=>"2010-03-10T10:30:32.000Z",
103
- # :instance_type=>"c1.medium",
104
- # :state=>"cancelled",
105
- # :groups=>["default"],
106
- # :product_description=>"Linux/UNIX",
107
- # :spot_instance_request_id=>"sir-bfa06804",
101
+ # [{:product_description=>"Linux/UNIX",
102
+ # :type=>"one-time",
103
+ # :availability_zone=>"us-east-1b",
104
+ # :monitoring_enabled=>false,
105
+ # :tags=>{},
108
106
  # :image_id=>"ami-08f41161",
107
+ # :groups=>[{:group_id=>"sg-a0b85dc9", :group_name=>"default"}],
109
108
  # :spot_price=>0.01,
110
- # :monitoring_enabled=>false},
111
- # {:type=>"one-time",
112
- # :create_time=>"2010-03-10T10:33:29.000Z",
109
+ # :create_time=>"2010-03-24T10:41:28.000Z",
113
110
  # :instance_type=>"c1.medium",
114
111
  # :state=>"open",
115
- # :groups=>["default", "33"],
116
- # :product_description=>"Linux/UNIX",
117
- # :spot_instance_request_id=>"sir-b1713a03",
112
+ # :spot_instance_request_id=>"sir-9652a604",
113
+ # :key_name=>"rightscale_test"},
114
+ # {:product_description=>"Linux/UNIX",
115
+ # :type=>"one-time",
116
+ # :availability_zone=>"us-east-1b",
117
+ # :monitoring_enabled=>false,
118
+ # :tags=>{},
118
119
  # :image_id=>"ami-08f41161",
120
+ # :groups=>[{:group_id=>"sg-a0b85dc9", :group_name=>"default"}],
119
121
  # :spot_price=>0.01,
120
- # :monitoring_enabled=>false,
121
- # :key_name=>"tim"},
122
- # {:type=>"one-time",
123
- # :instance_id=>"i-c516ceae",
124
- # :create_time=>"2010-03-10T10:43:48.000Z",
122
+ # :create_time=>"2010-03-24T11:40:27.000Z",
125
123
  # :instance_type=>"c1.medium",
126
- # :state=>"active",
127
- # :groups=>["default", "33"],
128
- # :product_description=>"Linux/UNIX",
129
- # :spot_instance_request_id=>"sir-5eb6c604",
130
- # :image_id=>"ami-08f41161",
131
- # :spot_price=>0.2,
132
- # :monitoring_enabled=>false,
133
- # :key_name=>"tim"}]
124
+ # :state=>"open",
125
+ # :spot_instance_request_id=>"sir-fa912802",
126
+ # :key_name=>"rightscale_test"}, ... ]
134
127
  #
135
128
  # ec2.describe_spot_instance_requests(:filters => {'type'=>"one-time", 'state'=>"open"})
136
129
  #
@@ -153,7 +146,7 @@ module RightAws
153
146
  # :spot_price => 0.01,
154
147
  # :key_name => 'tim',
155
148
  # :instance_count => 2,
156
- # :groups => ['33','default'],
149
+ # :group_ids => ["sg-a0b85dc9"],
157
150
  # :instance_type => 'c1.medium') #=>
158
151
  #
159
152
  # [{:product_description=>"Linux/UNIX",
@@ -163,7 +156,7 @@ module RightAws
163
156
  # :image_id=>"ami-08f41161",
164
157
  # :state=>"open",
165
158
  # :spot_price=>0.01,
166
- # :groups=>["default", "33"],
159
+ # :groups=>[{:group_id=>"sg-a0b85dc9", :group_name=>"default"}],
167
160
  # :key_name=>"tim",
168
161
  # :create_time=>"2010-03-10T10:33:09.000Z",
169
162
  # :instance_type=>"c1.medium"},
@@ -174,7 +167,7 @@ module RightAws
174
167
  # :image_id=>"ami-08f41161",
175
168
  # :state=>"open",
176
169
  # :spot_price=>0.01,
177
- # :groups=>["default", "33"],
170
+ # :groups=>[{:group_id=>"sg-a0b85dc9", :group_name=>"default"}],
178
171
  # :key_name=>"tim",
179
172
  # :create_time=>"2010-03-10T10:33:09.000Z",
180
173
  # :instance_type=>"c1.medium"}]
@@ -187,7 +180,7 @@ module RightAws
187
180
  # :valid_until => 1.hour.since,
188
181
  # :instance_count => 1,
189
182
  # :key_name => 'tim',
190
- # :groups => ['33','default'],
183
+ # :group_names => ['default'],
191
184
  # :availability_zone => 'us-east-1a',
192
185
  # :monitoring_enabled => true,
193
186
  # :launch_group => 'lg1',
@@ -198,55 +191,50 @@ module RightAws
198
191
  # :ebs_volume_size => 3,
199
192
  # :virtual_name => 'ephemeral2'
200
193
  # } ] ) #=>
201
- #
202
- # [{:monitoring_enabled=>true,
203
- # :type=>"one-time",
194
+ # [{:type=>"one-time",
204
195
  # :image_id=>"ami-08f41161",
205
- # :launch_group=>"lg1",
206
- # :state=>"open",
207
- # :valid_until=>"2010-02-05T19:13:44.000Z",
208
- # :create_time=>"2010-02-05T18:13:46.000Z",
209
196
  # :availability_zone_group=>"azg1",
210
- # :spot_price=>0.01,
197
+ # :key_name=>"default",
198
+ # :spot_instance_request_id=>"sir-66c79a12",
211
199
  # :block_device_mappings=>
212
- # [{:ebs_delete_on_termination=>true,
213
- # :ebs_volume_size=>3,
200
+ # [{:ebs_volume_size=>3,
214
201
  # :virtual_name=>"ephemeral2",
215
202
  # :device_name=>"/dev/sdk",
216
- # :ebs_snapshot_id=>"snap-145cbc7d"}],
217
- # :instance_type=>"m1.small",
218
- # :groups=>["default", "33"],
203
+ # :ebs_snapshot_id=>"snap-145cbc7d",
204
+ # :ebs_delete_on_termination=>true}],
205
+ # :spot_price=>0.01,
219
206
  # :product_description=>"Linux/UNIX",
220
- # :key_name=>"tim",
221
- # :valid_from=>"2010-02-05T18:23:44.000Z",
207
+ # :state=>"open",
208
+ # :instance_type=>"m1.small",
222
209
  # :availability_zone=>"us-east-1a",
223
- # :spot_instance_request_id=>"sir-32da8a03"}]
210
+ # :groups=>[{:group_id=>"sg-a0b85dc9", :group_name=>"default"}],
211
+ # :valid_from=>"2011-07-01T14:26:33.000Z",
212
+ # :tags=>{},
213
+ # :monitoring_enabled=>true,
214
+ # :valid_until=>"2011-07-01T14:28:03.000Z",
215
+ # :create_time=>"2011-07-01T14:26:24.000Z",
216
+ # :launch_group=>"lg1"}]
224
217
  #
225
218
  def request_spot_instances(options)
226
- options = options.dup
227
- request_hash = { 'SpotPrice' => options[:spot_price],
228
- 'LaunchSpecification.ImageId' => options[:image_id],
229
- 'LaunchSpecification.InstanceType' => options[:instance_type]}
230
- request_hash['ValidFrom'] = AwsUtils::utc_iso8601(options[:valid_from]) unless options[:valid_from].right_blank?
231
- request_hash['ValidUntil'] = AwsUtils::utc_iso8601(options[:valid_until]) unless options[:valid_until].right_blank?
232
- request_hash['InstanceCount'] = options[:instance_count] unless options[:instance_count].right_blank?
233
- request_hash['Type'] = options[:type] unless options[:type].right_blank?
234
- request_hash['LaunchGroup'] = options[:launch_group] unless options[:launch_group].right_blank?
235
- request_hash['AvailabilityZoneGroup'] = options[:availability_zone_group] unless options[:availability_zone_group].right_blank?
236
- request_hash['LaunchSpecification.KeyName'] = options[:key_name] unless options[:key_name].right_blank?
237
- request_hash['LaunchSpecification.AddressingType'] = options[:addressing_type] unless options[:addressing_type].right_blank?
238
- request_hash['LaunchSpecification.KernelId'] = options[:kernel_id] unless options[:kernel_id].right_blank?
239
- request_hash['LaunchSpecification.RamdiskId'] = options[:ramdisk_id] unless options[:ramdisk_id].right_blank?
240
- request_hash['LaunchSpecification.SubnetId'] = options[:subnet_id] unless options[:subnet_id].right_blank?
241
- request_hash['LaunchSpecification.Placement.AvailabilityZone'] = options[:availability_zone] unless options[:availability_zone].right_blank?
242
- request_hash['LaunchSpecification.Monitoring.Enabled'] = options[:monitoring_enabled] unless options[:monitoring_enabled].right_blank?
243
- request_hash.merge!(amazonize_list('LaunchSpecification.SecurityGroup', options[:groups])) unless options[:groups].right_blank?
244
- request_hash.merge!(amazonize_block_device_mappings(options[:block_device_mappings], 'LaunchSpecification.BlockDeviceMapping'))
245
- unless options[:user_data].right_blank?
246
- # See RightAws::Ec2#run_instances
247
- options[:user_data].strip!
248
- request_hash['LaunchSpecification.UserData'] = Base64.encode64(options[:user_data]).delete("\n") unless options[:user_data].right_blank?
249
- end
219
+ options[:user_data] = options[:user_data].to_s
220
+ request_hash = map_api_keys_and_values( options,
221
+ :spot_price, :availability_zone_group, :launch_group, :type, :instance_count,
222
+ :image_id => 'LaunchSpecification.ImageId',
223
+ :instance_type => 'LaunchSpecification.InstanceType',
224
+ :key_name => 'LaunchSpecification.KeyName',
225
+ :addressing_type => 'LaunchSpecification.AddressingType',
226
+ :kernel_id => 'LaunchSpecification.KernelId',
227
+ :ramdisk_id => 'LaunchSpecification.RamdiskId',
228
+ :subnet_id => 'LaunchSpecification.SubnetId',
229
+ :availability_zone => 'LaunchSpecification.Placement.AvailabilityZone',
230
+ :monitoring_enabled => 'LaunchSpecification.Monitoring.Enabled',
231
+ :valid_from => { :value => Proc.new { !options[:valid_from].right_blank? && AwsUtils::utc_iso8601(options[:valid_from]) }},
232
+ :valid_until => { :value => Proc.new { !options[:valid_until].right_blank? && AwsUtils::utc_iso8601(options[:valid_until]) }},
233
+ :user_data => { :name => 'LaunchSpecification.UserData',
234
+ :value => Proc.new { !options[:user_data].empty? && Base64.encode64(options[:user_data]).delete("\n") }},
235
+ :group_names => { :amazonize_list => 'LaunchSpecification.SecurityGroup'},
236
+ :group_ids => { :amazonize_list => 'LaunchSpecification.SecurityGroupId'},
237
+ :block_device_mappings => { :amazonize_bdm => 'LaunchSpecification.BlockDeviceMapping'})
250
238
  link = generate_request("RequestSpotInstances", request_hash)
251
239
  request_info(link, QEc2DescribeSpotInstanceParser.new(:logger => @logger))
252
240
  end
@@ -316,6 +304,7 @@ module RightAws
316
304
  when 'productDescription' then @item[:product_description] = @text
317
305
  when 'spotPrice' then @item[:spot_price] = @text.to_f
318
306
  when 'timestamp' then @item[:timestamp] = @text
307
+ when 'availabilityZone' then @item[:availability_zone] = @text
319
308
  when 'item' then @result << @item
320
309
  end
321
310
  end
@@ -329,6 +318,10 @@ module RightAws
329
318
  case full_tag_name
330
319
  when %r{spotInstanceRequestSet/item$}
331
320
  @item = { :tags => {} }
321
+ when %r{groupSet$}
322
+ @item[:groups] = []
323
+ when %r{groupSet/item$}
324
+ @group = {}
332
325
  when %r{/blockDeviceMapping/item$}
333
326
  @item[:block_device_mappings] ||= []
334
327
  @block_device_mapping = {}
@@ -361,9 +354,14 @@ module RightAws
361
354
  when 'instanceId' then @item[:instance_id] = @text
362
355
  when 'createTime' then @item[:create_time] = @text
363
356
  when 'productDescription' then @item[:product_description] = @text
364
- when 'groupId' then (@item[:groups] ||= []) << @text
365
357
  else
366
358
  case full_tag_name
359
+ when %r{/groupSet/item} # no trailing $
360
+ case name
361
+ when 'groupId' then @group[:group_id] = @text
362
+ when 'groupName' then @group[:group_name] = @text
363
+ when 'item' then @item[:groups] << @group
364
+ end
367
365
  when %r{monitoring/enabled$}
368
366
  @item[:monitoring_enabled] = @text == 'true'
369
367
  when %r{/blockDeviceMapping/item} # no trailing $
@@ -410,9 +408,8 @@ module RightAws
410
408
  when 'bucket' then @result[:bucket] = @text
411
409
  when 'prefix' then @result[:prefix] = @text
412
410
  when 'state' then @result[:state] = @text
413
- when 'fault' then @result[:fault] = @text
414
- when 'code' then @result[:code] = @text
415
- when 'message' then @result[:message] = @text
411
+ when 'code' then @result[:fault_code] = @text
412
+ when 'message' then @result[:fault_message] = @text
416
413
  end
417
414
  end
418
415
  def reset
@@ -38,9 +38,11 @@ module RightAws
38
38
  # Filters: cidr, dchp-options-id, state, tag-key, tag-value, tag:key, vpc-id
39
39
  #
40
40
  # ec2.describe_vpcs #=>
41
- # [{:vpc_id=>"vpc-890ce2e0",
41
+ # [{:instance_tenancy=>"default",
42
+ # :vpc_id=>"vpc-e16cf988",
43
+ # :tags=>{},
42
44
  # :dhcp_options_id=>"default",
43
- # :cidr_block=>"10.0.0.0/23",
45
+ # :cidr_block=>"192.168.0.0/24",
44
46
  # :state=>"available"}]
45
47
  #
46
48
  # ec2.describe_vpcs("vpc-890ce2e0")
@@ -63,8 +65,10 @@ module RightAws
63
65
  # :cidr_block=>"10.0.0.0/23",
64
66
  # :state=>"pending"}
65
67
  #
66
- def create_vpc(cidr_block)
67
- link = generate_request("CreateVpc",'CidrBlock' => cidr_block )
68
+ def create_vpc(cidr_block, options = {})
69
+ request_hash = {'CidrBlock' => cidr_block}
70
+ request_hash['instanceTenancy'] = options[:instance_tenancy] unless options[:instance_tenancy].right_blank?
71
+ link = generate_request("CreateVpc", request_hash )
68
72
  request_info(link, QEc2DescribeVpcsParser.new(:logger => @logger)).first
69
73
  rescue Exception
70
74
  on_exception
@@ -395,6 +399,7 @@ module RightAws
395
399
  on_exception
396
400
  end
397
401
 
402
+
398
403
  #-----------------
399
404
  # Parsers
400
405
  #-----------------
@@ -408,10 +413,11 @@ module RightAws
408
413
  end
409
414
  def tagend(name)
410
415
  case name
411
- when 'vpcId' then @item[:vpc_id] = @text
412
- when 'state' then @item[:state] = @text
413
- when 'dhcpOptionsId' then @item[:dhcp_options_id] = @text
414
- when 'cidrBlock' then @item[:cidr_block] = @text
416
+ when 'vpcId' then @item[:vpc_id] = @text
417
+ when 'state' then @item[:state] = @text
418
+ when 'dhcpOptionsId' then @item[:dhcp_options_id] = @text
419
+ when 'cidrBlock' then @item[:cidr_block] = @text
420
+ when 'instanceTenancy' then @item[:instance_tenancy] = @text
415
421
  else
416
422
  case full_tag_name
417
423
  when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
@@ -579,5 +585,6 @@ module RightAws
579
585
  end
580
586
  end
581
587
 
588
+
582
589
  end
583
590
  end
@@ -0,0 +1,381 @@
1
+ #
2
+ # Copyright (c) 2011 RightScale Inc
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #
23
+
24
+ module RightAws
25
+
26
+ class Ec2
27
+
28
+ # VPC v2: Limits
29
+ #
30
+ # http://docs.amazonwebservices.com/AmazonVPC/latest/UserGuide/index.html?VPC_Appendix_Limits.html
31
+
32
+ #----------------------
33
+ # InternetGateways
34
+ #----------------------
35
+
36
+ # Create internet gateway
37
+ #
38
+ # ec2.create_internet_gateway #=>
39
+ # { :internet_gateway_id=>"igw-6585c10c", :tags=>{}}
40
+ #
41
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-CreateInternetGateway.html
42
+ #
43
+ def create_internet_gateway
44
+ link = generate_request("CreateInternetGateway")
45
+ request_info(link, QEc2DescribeInternetGatewaysParser.new(:logger => @logger)).first
46
+ rescue Exception
47
+ on_exception
48
+ end
49
+
50
+ # Describe internet gateways.
51
+ #
52
+ # ec2.describe_internet_gateways #=>
53
+ # [{:state=>"available",
54
+ # :internet_gateway_id=>"igw-6585c10c",
55
+ # :vpc_id=>"vpc-df80a6b6",
56
+ # :tags=>{}},
57
+ # {:internet_gateway_id=>"igw-883503e1",
58
+ # :tags=>{}}]
59
+ #
60
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-CreateInternetGateway.html
61
+ #
62
+ def describe_internet_gateways(*list_and_options)
63
+ describe_resources_with_list_and_options('DescribeInternetGateways', 'InternetGatewayId', QEc2DescribeInternetGatewaysParser, list_and_options)
64
+ rescue Exception
65
+ on_exception
66
+ end
67
+
68
+ # Delete internet gateway.
69
+ #
70
+ # ec2.delete_internet_gateway("igw-6585c10c") #=> true
71
+ #
72
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteInternetGateway.html
73
+ #
74
+ def delete_internet_gateway(internet_gateway_id)
75
+ link = generate_request("DeleteInternetGateway", 'InternetGatewayId' => internet_gateway_id )
76
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
77
+ rescue Exception
78
+ on_exception
79
+ end
80
+
81
+ # Attaches an Internet gateway to a VPC, enabling connectivity between the Internet and the VPC.
82
+ #
83
+ # ec2.attach_internet_gateway("igw-6585c10c", "vpc-df80a6b6") #=> true
84
+ #
85
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-AttachInternetGateway.html
86
+ #
87
+ def attach_internet_gateway(internet_gateway_id, vpc_id)
88
+ request_hash = { 'InternetGatewayId' => internet_gateway_id,
89
+ 'VpcId' => vpc_id }
90
+ link = generate_request("AttachInternetGateway", request_hash)
91
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
92
+ rescue Exception
93
+ on_exception
94
+ end
95
+
96
+ # Detaches an Internet gateway from a VPC, disabling connectivity between the Internet and the VPC.
97
+ # The VPC must not contain any running instances with Elastic IP addresses.
98
+ #
99
+ # ec2.detach_internet_gateway("igw-6585c10c", "vpc-df80a6b6") #=> true
100
+ #
101
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DetachInternetGateway.html
102
+ #
103
+ def detach_internet_gateway(internet_gateway_id, vpc_id)
104
+ request_hash = { 'InternetGatewayId' => internet_gateway_id,
105
+ 'VpcId' => vpc_id }
106
+ link = generate_request("DetachInternetGateway", request_hash)
107
+ request_info(link, RightHttp2xxParser::new(:logger => @logger))
108
+ rescue Exception
109
+ on_exception
110
+ end
111
+
112
+ #----------------------
113
+ # RouteTables
114
+ #----------------------
115
+
116
+ # Describe route tables.
117
+ #
118
+ # # List all tables
119
+ # ec2.describe_route_tables #=>
120
+ # [{:route_table_id=>"rtb-be3006d7",
121
+ # :route_set=>
122
+ # [{:state=>"active",
123
+ # :destination_cidr_block=>"10.0.3.0/24",
124
+ # :gateway_id=>"local"}],
125
+ # :vpc_id=>"vpc-df80a6b6",
126
+ # :association_set=>[],
127
+ # :tags=>{}},
128
+ # {:route_table_id=>"rtb-e36cf98a",
129
+ # :route_set=>
130
+ # [{:state=>"active",
131
+ # :destination_cidr_block=>"192.168.0.0/24",
132
+ # :gateway_id=>"local"}],
133
+ # :vpc_id=>"vpc-e16cf988",
134
+ # :association_set=>
135
+ # [{:route_table_id=>"rtb-e36cf98a",
136
+ # :main=>true,
137
+ # :route_table_association_id=>"rtbassoc-e26cf98b"}],
138
+ # :tags=>{}}, ... ]
139
+ #
140
+ # # Filter tables by VpcId
141
+ # ec2.describe_route_tables(:filters => {'vpc-id' => "vpc-df80a6b6"})
142
+ #
143
+ # # Custom route table
144
+ # ec2.describe_route_tables("rtb-be3006d7") #=>
145
+ # [{:vpc_id=>"vpc-df80a6b6",
146
+ # :route_set=>
147
+ # [{:state=>"active",
148
+ # :destination_cidr_block=>"0.0.0.1/32",
149
+ # :gateway_id=>"igw-6585c10c"},
150
+ # {:state=>"active",
151
+ # :destination_cidr_block=>"10.0.3.0/24",
152
+ # :gateway_id=>"local"}],
153
+ # :route_table_id=>"rtb-be3006d7",
154
+ # :tags=>{},
155
+ # :association_set=>
156
+ # [{:route_table_association_id=>"rtbassoc-a02610c9",
157
+ # :subnet_id=>"subnet-b95f76d0",
158
+ # :route_table_id=>"rtb-be3006d7"}]}]
159
+ #
160
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeRouteTables.html
161
+ #
162
+ def describe_route_tables(*list_and_options)
163
+ describe_resources_with_list_and_options('DescribeRouteTables', 'RouteTableId', QEc2DescribeRouteTablesParser, list_and_options)
164
+ rescue Exception
165
+ on_exception
166
+ end
167
+
168
+ # Creates a new route table within a VPC. After you create a new route table, you can add routes and associate the table with a subne
169
+ #
170
+ # ec2.create_route_table("vpc-df80a6b6") #=>
171
+ # {:route_table_id=>"rtb-4331072a",
172
+ # :route_set=>
173
+ # [{:state=>"active",
174
+ # :destination_cidr_block=>"10.0.3.0/24",
175
+ # :gateway_id=>"local"}],
176
+ # :vpc_id=>"vpc-df80a6b6",
177
+ # :association_set=>[],
178
+ # :tags=>{}}
179
+ #
180
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-CreateRouteTable.html
181
+ #
182
+ def create_route_table(vpc_id)
183
+ link = generate_request("CreateRouteTable", 'VpcId' => vpc_id )
184
+ request_info(link, QEc2DescribeRouteTablesParser::new(:logger => @logger)).first
185
+ rescue Exception
186
+ on_exception
187
+ end
188
+
189
+ # Deletes a route table from a VPC.
190
+ # The route table must not be associated with a subnet. You can't delete the main route table.
191
+ #
192
+ # ec2.delete_route_table("rtb-4331072a") #=> true
193
+ #
194
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DeleteRouteTable.html
195
+ def delete_route_table(route_table_id)
196
+ link = generate_request("DeleteRouteTable", 'RouteTableId' => route_table_id )
197
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
198
+ rescue Exception
199
+ on_exception
200
+ end
201
+
202
+ # Associates a subnet with a route table. The subnet and route table must be in the same VPC.
203
+ # This association causes traffic originating from the subnet to be routed according to the routes in
204
+ # the route table. The action returns an association ID, which you need if you want to disassociate
205
+ # the route table from the subnet later. A route table can be associated with multiple subnets.
206
+ #
207
+ # ec2.associate_route_table("rtb-be3006d7", "subnet-b95f76d0") #=> true
208
+ #
209
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-AssociateRouteTable.html
210
+ #
211
+ def associate_route_table(route_table_id, subnet_id)
212
+ request_hash = { 'RouteTableId' => route_table_id,
213
+ 'SubnetId' => subnet_id }
214
+ link = generate_request("AssociateRouteTable", request_hash)
215
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
216
+ rescue Exception
217
+ on_exception
218
+ end
219
+
220
+ # Disassociates a subnet from a route table.
221
+ #
222
+ # ec2.disassociate_route_table(route_table_association_id) #=> true
223
+ #
224
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DisassociateRouteTable.html
225
+ #
226
+ def disassociate_route_table(route_table_association_id)
227
+ link = generate_request("DisassociateRouteTable", 'AssociationId' => route_table_association_id )
228
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
229
+ rescue Exception
230
+ on_exception
231
+ end
232
+
233
+ # Changes the route table associated with a given subnet in a VPC. After you execute this action, the subnet
234
+ # uses the routes in the new route table it's associated with.
235
+ # You can also use this action to change which table is the main route table in the VPC. You just specify
236
+ # the main route table's association ID and the route table that you want to be the new main route table.
237
+ #
238
+ # ec2.replace_route_table_association("rtb-be3006d7", "rtbassoc-a02610c9") #=> true
239
+ #
240
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ReplaceRouteTableAssociation.html
241
+ #
242
+ def replace_route_table_association(route_table_id, route_table_association_id)
243
+ request_hash = { 'RouteTableId' => route_table_id,
244
+ 'AssociationId' => route_table_association_id }
245
+ link = generate_request("ReplaceRouteTableAssociation", request_hash)
246
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
247
+ rescue Exception
248
+ on_exception
249
+ end
250
+
251
+ #---------------------
252
+ # Routes
253
+ #---------------------
254
+
255
+ # Creates a new route in a route table within a VPC. The route's target can be either a gateway attached to
256
+ # the VPC or a NAT instance in the VPC.
257
+ # Options: :gateway_id, :instance_id
258
+ #
259
+ # ec2.create_route("rtb-be3006d7", "0.0.0.1/32", :gateway_id => 'igw-6585c10c') #=> true
260
+ #
261
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-CreateRoute.html
262
+ #
263
+ def create_route(route_table_id, destination_cidr_block, options = {})
264
+ request_hash = { 'RouteTableId' => route_table_id,
265
+ 'DestinationCidrBlock' => destination_cidr_block }
266
+ request_hash['GatewayId'] = options[:gateway_id] unless options[:gateway_id].right_blank?
267
+ request_hash['InstanceId'] = options[:instance_id] unless options[:instance_id].right_blank?
268
+ link = generate_request("CreateRoute", request_hash)
269
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
270
+ rescue Exception
271
+ on_exception
272
+ end
273
+
274
+ # Deletes a route from a route table in a VPC.
275
+ #
276
+ # ec2.delete_route("rtb-be3006d7", "0.0.0.1/32") #=> true
277
+ #
278
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DeleteRoute.html
279
+ #
280
+ def delete_route(route_table_id, destination_cidr_block)
281
+ link = generate_request("DeleteRoute", 'RouteTableId' => route_table_id,
282
+ 'DestinationCidrBlock' => destination_cidr_block )
283
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
284
+ rescue Exception
285
+ on_exception
286
+ end
287
+
288
+ # Replaces an existing route within a route table in a VPC
289
+ # Options: :gateway_id, :instance_id
290
+ #
291
+ # ec2.replace_route("rtb-be3006d7", "0.0.0.2/32", :gateway_id => 'igw-6585c10c') #=> true
292
+ #
293
+ # P.S. http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-ReplaceRoute.html
294
+ #
295
+ def replace_route(route_table_id, destination_cidr_block, options = {})
296
+ request_hash = { 'RouteTableId' => route_table_id,
297
+ 'DestinationCidrBlock' => destination_cidr_block }
298
+ request_hash['GatewayId'] = options[:gateway_id] unless options[:gateway_id].right_blank?
299
+ request_hash['InstanceId'] = options[:instance_id] unless options[:instance_id].right_blank?
300
+ link = generate_request("ReplaceRoute", request_hash)
301
+ request_info(link, RightHttp2xxParser.new(:logger => @logger))
302
+ rescue Exception
303
+ on_exception
304
+ end
305
+
306
+ #---------------------
307
+ # InternetGateways
308
+ #---------------------
309
+
310
+ class QEc2DescribeInternetGatewaysParser < RightAWSParser #:nodoc:
311
+ def tagstart(name, attributes)
312
+ case full_tag_name
313
+ when %r{/(internetGatewaySet/item|internetGateway)$} then @item = { :tags => {} }
314
+ when %r{/tagSet/item$} then @aws_tag = {}
315
+ end
316
+ end
317
+ def tagend(name)
318
+ case full_tag_name
319
+ # item
320
+ when %r{/(internetGatewaySet/item|internetGateway)$} then @result << @item
321
+ when %r{/internetGatewayId$} then @item[:internet_gateway_id] = @text
322
+ when %r{/vpcId$} then @item[:vpc_id] = @text
323
+ when %r{/state$} then @item[:state] = @text
324
+ # tags
325
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
326
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
327
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
328
+ end
329
+ end
330
+ def reset
331
+ @result = []
332
+ end
333
+ end
334
+
335
+ #---------------------
336
+ # Routes
337
+ #---------------------
338
+
339
+ class QEc2DescribeRouteTablesParser < RightAWSParser #:nodoc:
340
+ def tagstart(name, attributes)
341
+ case full_tag_name
342
+ when %r{/(routeTableSet/item|routeTable)$}
343
+ @item = { :route_set => [],
344
+ :association_set => [],
345
+ :tags => {}}
346
+ when %r{/routeSet/item$} then @route_set = {}
347
+ when %r{/associationSet/item$} then @association_set = {}
348
+ end
349
+ end
350
+ def tagend(name)
351
+ case full_tag_name
352
+ # item
353
+ when %r{/(routeTableSet/item|routeTable)/routeTableId$} then @item[:route_table_id] = @text
354
+ when %r{/(routeTableSet/item|routeTable)/vpcId$} then @item[:vpc_id] = @text
355
+ when %r{/(routeTableSet/item|routeTable)$} then @result << @item
356
+ # route set
357
+ when %r{/routeSet/item/destinationCidrBlock$} then @route_set[:destination_cidr_block] = @text
358
+ when %r{/routeSet/item/gatewayId$} then @route_set[:gateway_id] = @text
359
+ when %r{/routeSet/item/instanceId$} then @route_set[:instance_id] = @text
360
+ when %r{/routeSet/item/state$} then @route_set[:state] = @text
361
+ when %r{/routeSet/item$} then @item[:route_set] << @route_set
362
+ # association set
363
+ when %r{/associationSet/item/routeTableId$} then @association_set[:route_table_id] = @text
364
+ when %r{/associationSet/item/routeTableAssociationId$} then @association_set[:route_table_association_id] = @text
365
+ when %r{/associationSet/item/subnetId$} then @association_set[:subnet_id] = @text
366
+ when %r{/associationSet/item/main} then @association_set[:main] = @text == 'true'
367
+ when %r{/associationSet/item$} then @item[:association_set] << @association_set
368
+ # tags
369
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
370
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
371
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
372
+ end
373
+ end
374
+ def reset
375
+ @result = []
376
+ end
377
+ end
378
+
379
+ end
380
+
381
+ end