right_aws 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/History.txt +22 -1
  2. data/Manifest.txt +11 -1
  3. data/README.txt +0 -4
  4. data/Rakefile +19 -25
  5. data/lib/acf/right_acf_interface.rb +199 -135
  6. data/lib/acf/right_acf_invalidations.rb +144 -0
  7. data/lib/acf/right_acf_origin_access_identities.rb +4 -4
  8. data/lib/acf/right_acf_streaming_interface.rb +19 -26
  9. data/lib/acw/right_acw_interface.rb +1 -2
  10. data/lib/as/right_as_interface.rb +6 -7
  11. data/lib/awsbase/right_awsbase.rb +287 -91
  12. data/lib/awsbase/support.rb +2 -82
  13. data/lib/awsbase/version.rb +9 -0
  14. data/lib/ec2/right_ec2.rb +101 -38
  15. data/lib/ec2/right_ec2_ebs.rb +71 -58
  16. data/lib/ec2/right_ec2_images.rb +82 -42
  17. data/lib/ec2/right_ec2_instances.rb +74 -44
  18. data/lib/ec2/right_ec2_placement_groups.rb +108 -0
  19. data/lib/ec2/right_ec2_reserved_instances.rb +50 -46
  20. data/lib/ec2/right_ec2_security_groups.rb +148 -32
  21. data/lib/ec2/right_ec2_spot_instances.rb +53 -27
  22. data/lib/ec2/right_ec2_tags.rb +139 -0
  23. data/lib/ec2/right_ec2_vpc.rb +151 -139
  24. data/lib/ec2/right_ec2_windows_mobility.rb +84 -0
  25. data/lib/elb/right_elb_interface.rb +93 -18
  26. data/lib/iam/right_iam_access_keys.rb +71 -0
  27. data/lib/iam/right_iam_groups.rb +195 -0
  28. data/lib/iam/right_iam_interface.rb +341 -0
  29. data/lib/iam/right_iam_mfa_devices.rb +67 -0
  30. data/lib/iam/right_iam_users.rb +251 -0
  31. data/lib/rds/right_rds_interface.rb +513 -202
  32. data/lib/right_aws.rb +12 -12
  33. data/lib/route_53/right_route_53_interface.rb +630 -0
  34. data/lib/s3/right_s3.rb +9 -12
  35. data/lib/s3/right_s3_interface.rb +10 -11
  36. data/lib/sdb/active_sdb.rb +18 -33
  37. data/lib/sdb/right_sdb_interface.rb +36 -4
  38. data/lib/sqs/right_sqs.rb +1 -2
  39. data/lib/sqs/right_sqs_gen2.rb +0 -1
  40. data/lib/sqs/right_sqs_gen2_interface.rb +4 -5
  41. data/lib/sqs/right_sqs_interface.rb +6 -7
  42. data/right_aws.gemspec +91 -0
  43. data/test/awsbase/test_helper.rb +2 -0
  44. data/test/awsbase/test_right_awsbase.rb +12 -0
  45. data/test/s3/test_right_s3.rb +1 -1
  46. data/test/sdb/test_active_sdb.rb +1 -1
  47. data/test/sdb/test_batch_put_attributes.rb +54 -0
  48. data/test/sqs/test_right_sqs.rb +0 -6
  49. data/test/sqs/test_right_sqs_gen2.rb +1 -1
  50. metadata +109 -58
@@ -0,0 +1,139 @@
1
+ #
2
+ # Copyright (c) 2007-2010 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
+ class Ec2
26
+
27
+ #-----------------------------------------------------------------
28
+ # Tags
29
+ #-----------------------------------------------------------------
30
+
31
+ # Describe tags.
32
+ #
33
+ # Accepts set of filters.
34
+ #
35
+ # Filters: key, resource-id, resource-type, value
36
+ #
37
+ # ec2.describe_tags #=> [{:resource_id => "i-12345678",
38
+ # :value => "foo",
39
+ # :resource_type => "instance",
40
+ # :key => "myKey"}]
41
+ #
42
+ # ec2.describe_tags(:filters => { 'resource-id' => "i-12345678"})
43
+ #
44
+ # P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference_query_DescribeTags.html
45
+ def describe_tags(options={})
46
+ request_hash = {}
47
+ request_hash.merge!(amazonize_list(['Filter.?.Name', 'Filter.?.Value.?'], options[:filters])) unless options[:filters].right_blank?
48
+ cache_for = (options[:filters].right_blank?) ? :describe_tags : nil
49
+ link = generate_request("DescribeTags", request_hash)
50
+ request_cache_or_info cache_for, link, QEc2DescribeTagsParser, @@bench, cache_for
51
+ rescue Exception
52
+ on_exception
53
+ end
54
+
55
+ # Create tags.
56
+ # Options:
57
+ # :default => 'something' : a default value for keys without (or with nil) values.
58
+ #
59
+ # Add a single tag with no value to a resource:
60
+ # ec2.create_tags("i-12345678", "myKey") => true
61
+ #
62
+ # Add multiple tags with no values (actually Amazon sets the values to '')
63
+ # ec2.create_tags("i-12345678", ["myKey1", "myKey2", "myKey3"]) => true
64
+ #
65
+ # Add multiple tags with 'true'
66
+ # ec2.create_tags("i-12345678", ["myKey1", "myKey2", "myKey3"], :default => true ) => true
67
+ #
68
+ # Add multiple keys and values to a resource:
69
+ # ec2.create_tags("i-12345678", {"myKey1" => "foo", "myKey2" => "bar", "myKeyWithoutVal" => nil }) #=> true
70
+ #
71
+ # Add a key and value to multiple resources:
72
+ # ec2.create_tags(["i-12345678","i-86fb3eec","i-86fb3eed"], {"myKey" => "foo"}) #=> true
73
+ #
74
+ def create_tags(resources, tags, options={})
75
+ default = options[:default].nil? ? '' : options[:default]
76
+ params = amazonize_list("ResourceId", resources)
77
+ params.merge! amazonize_list(['Tag.?.Key', 'Tag.?.Value'], tags, :default => default)
78
+ link = generate_request("CreateTags", params)
79
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
80
+ rescue Exception
81
+ on_exception
82
+ end
83
+
84
+ # Delete tags.
85
+ # Options:
86
+ # :default => 'something' : a default value for keys without (or with nil) values.
87
+ #
88
+ # Delete a tag from a resource regardless of value:
89
+ # ec2.delete_tags("i-12345678", "myKey") => true
90
+ #
91
+ # Delete multiple tags (regardless of their values)
92
+ # ec2.delete_tags("i-12345678", ["myKey1", "myKey2", "myKey3"]) => true
93
+ #
94
+ # Add multiple tags with value 'true'
95
+ # ec2.delete_tags("i-12345678", ["myKey1", "myKey2", "myKey3"], :default => true) => true
96
+ #
97
+ # Delete multiple keys and values to a resource:
98
+ # ec2.delete_tags("i-12345678", [{"myKey1" => "foo", "myKey2" => "bar","myKeyForAnyVal" => nil }]) #=> true
99
+ #
100
+ # Delete a key and value on multiple resources:
101
+ # ec2.delete_tags(["i-12345678", "i-a1234567", "i-b1234567"], {"myKey" => "foo"}) #=> true
102
+ #
103
+ def delete_tags(resources, tags, options={})
104
+ default = options[:default].nil? ? :skip_nils : options[:default]
105
+ params = amazonize_list("ResourceId", resources)
106
+ params.merge! amazonize_list(['Tag.?.Key', 'Tag.?.Value'], tags, :default => default)
107
+ link = generate_request("DeleteTags", params)
108
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
109
+ rescue Exception
110
+ on_exception
111
+ end
112
+
113
+ #-----------------------------------------------------------------
114
+ # PARSERS: Tags
115
+ #-----------------------------------------------------------------
116
+
117
+ class QEc2DescribeTagsParser < RightAWSParser #:nodoc:
118
+ def tagstart(name, attributes)
119
+ @resource_tag = {} if name == 'item'
120
+ end
121
+
122
+ def tagend(name)
123
+ case name
124
+ when 'resourceId' then @resource_tag[:resource_id] = @text
125
+ when 'resourceType' then @resource_tag[:resource_type] = @text
126
+ when 'key' then @resource_tag[:key] = @text
127
+ when 'value' then @resource_tag[:value] = @text
128
+ when 'item' then @result << @resource_tag
129
+ end
130
+ end
131
+
132
+ def reset
133
+ @result = []
134
+ end
135
+ end
136
+
137
+ end
138
+
139
+ end
@@ -25,23 +25,17 @@ module RightAws
25
25
 
26
26
  class Ec2
27
27
 
28
- private
29
-
30
- def vpc__split_list_and_filters(*params) # :nodoc:
31
- params = params.flatten
32
- filters = params.last.is_a?(Hash) ? params.pop : {}
33
- # Make values to be arrays.
34
- filters.each{|key, values| filters[key] = Array(values) }
35
- [params, filters]
36
- end
37
-
38
28
  public
39
29
 
40
30
  #-----------------
41
31
  # VPC
42
32
  #-----------------
43
33
 
44
- # Describe VPCs
34
+ # Describe VPCs.
35
+ #
36
+ # Accepts a list of vpcs and/or a set of filters as the last parameter.
37
+ #
38
+ # Filters: cidr, dchp-options-id, state, tag-key, tag-value, tag:key, vpc-id
45
39
  #
46
40
  # ec2.describe_vpcs #=>
47
41
  # [{:vpc_id=>"vpc-890ce2e0",
@@ -51,16 +45,14 @@ module RightAws
51
45
  #
52
46
  # ec2.describe_vpcs("vpc-890ce2e0")
53
47
  #
54
- def describe_vpcs(*list_and_filters)
55
- list, filters = vpc__split_list_and_filters(list_and_filters)
56
- cache_for = (list.empty? && filters.empty?) ? :describe_vpcs : nil
57
- request_hash = {}
58
- request_hash.merge!(amazonize_list('VpcId', list))
59
- request_hash.merge!(amazonize_list(['Filter.?.Key','Filter.?.Value.?'], filters))
60
- link = generate_request("DescribeVpcs", request_hash)
61
- request_cache_or_info cache_for, link, QEc2DescribeVpcsParser, @@bench, cache_for
62
- rescue Exception
63
- on_exception
48
+ # ec2.describe_vpcs( :filters => {'tag:MyTag' => 'MyValue'} )
49
+ #
50
+ # ec2.describe_vpcs( :filters => {'cidr' => "192.168.1.0/24"} )
51
+ #
52
+ # P.S. filters: http://docs.amazonwebservices.com/AmazonVPC/latest/APIReference/index.html?ApiReference-query-DescribeVpcs.html
53
+ #
54
+ def describe_vpcs(*list_and_options)
55
+ describe_resources_with_list_and_options('DescribeVpcs', 'VpcId', QEc2DescribeVpcsParser, list_and_options)
64
56
  end
65
57
 
66
58
  # Create VPC.
@@ -95,6 +87,10 @@ module RightAws
95
87
 
96
88
  # Describe Subnet.
97
89
  #
90
+ # Accepts a list of subnets and/or a set of filters as the last parameter.
91
+ #
92
+ # Filters: availability-zone, available-ip-address-count, cidr, state, subnet-id, tag-key, tag-value, tag:key, vpc-id
93
+ #
98
94
  # ec2.describe_subnets #=>
99
95
  # [{:available_ip_address_count=>"251",
100
96
  # :vpc_id=>"vpc-890ce2e0",
@@ -103,16 +99,12 @@ module RightAws
103
99
  # :cidr_block=>"10.0.1.0/24",
104
100
  # :state=>"available"}]
105
101
  #
106
- def describe_subnets(*list_and_filters)
107
- list, filters = vpc__split_list_and_filters(list_and_filters)
108
- cache_for = (list.empty? && filters.empty?) ? :describe_subnets : nil
109
- request_hash = {}
110
- request_hash.merge!(amazonize_list('SubnetId', list))
111
- request_hash.merge!(amazonize_list(['Filter.?.Key','Filter.?.Value.?'], filters))
112
- link = generate_request("DescribeSubnets", request_hash)
113
- request_cache_or_info cache_for, link, QEc2DescribeSubnetsParser, @@bench, cache_for
114
- rescue Exception
115
- on_exception
102
+ # ec2.describe_subnets(:filters => {'cidr' => "192.168.1.128/25"})
103
+ #
104
+ # P.S. filters: http://docs.amazonwebservices.com/AmazonVPC/latest/APIReference/index.html?ApiReference-query-DescribeSubnets.html
105
+ #
106
+ def describe_subnets(*list_and_options)
107
+ describe_resources_with_list_and_options('DescribeSubnets', 'SubnetId', QEc2DescribeSubnetsParser, list_and_options)
116
108
  end
117
109
 
118
110
  # Create Subnet.
@@ -128,7 +120,7 @@ module RightAws
128
120
  def create_subnet(vpc_id, cidr_block, availability_zone = nil)
129
121
  request_hash = { 'VpcId' => vpc_id,
130
122
  'CidrBlock' => cidr_block }
131
- request_hash['AvailabilityZone'] = availability_zone unless availability_zone.blank?
123
+ request_hash['AvailabilityZone'] = availability_zone unless availability_zone.right_blank?
132
124
  link = generate_request("CreateSubnet", request_hash)
133
125
  request_info(link, QEc2DescribeSubnetsParser.new(:logger => @logger)).first
134
126
  rescue Exception
@@ -151,20 +143,22 @@ module RightAws
151
143
  #-----------------
152
144
 
153
145
  # Describe DHCP options.
146
+ #
147
+ # Accepts a list of DHCP options and/or a set of filters as the last parameter.
148
+ #
149
+ # Filters: dchp-options-id, key, value, tag-key, tag-value, tag:key
154
150
  #
155
- # ec2.describe_dhcp_options #=>
151
+ # ec2.describe_dhcp_options #=>
156
152
  # [{:dhcp_options_id=>"dopt-cb0de3a2",
157
153
  # :dhcp_configuration_set=>
158
154
  # {"netbios-node-type"=>["1"], "domain-name"=>["my.awesomesite.ru"]}}]
159
155
  #
160
- def describe_dhcp_options(*list)
161
- list = list.flatten
162
- cache_for = list.empty? ? :describe_dhcp_options : nil
163
- request_hash = amazonize_list('DhcpOptionsId', list)
164
- link = generate_request("DescribeDhcpOptions", request_hash)
165
- request_cache_or_info cache_for, link, QEc2DescribeDhcpOptionsParser, @@bench, cache_for
166
- rescue Exception
167
- on_exception
156
+ # ec2.describe_dhcp_options(:filters => {'tag:MyTag' => 'MyValue'})
157
+ #
158
+ # P.S. filters: http://docs.amazonwebservices.com/AmazonVPC/latest/APIReference/index.html?ApiReference-query-DescribeDhcpOptions.html
159
+ #
160
+ def describe_dhcp_options(*list_and_options)
161
+ describe_resources_with_list_and_options('DescribeDhcpOptions', 'DhcpOptionsId', QEc2DescribeDhcpOptionsParser, list_and_options)
168
162
  end
169
163
 
170
164
  # Create DHCP options.
@@ -218,24 +212,23 @@ module RightAws
218
212
 
219
213
  # Describe customer gateways.
220
214
  #
221
- # ec2.describe_customer_gateways
215
+ # Accepts a list of gateways and/or a set of filters as the last parameter.
222
216
  #
217
+ # Filters: bgp-asn, customer-gateway-id, state, type, tag-key, tag-value, tag:key
218
+ #
219
+ # ec2.describe_customer_gateways #=>
223
220
  # [{:type=>"ipsec.1",
224
221
  # :ip_address=>"12.1.2.3",
225
222
  # :bgp_asn=>"65534",
226
223
  # :state=>"available",
227
224
  # :customer_gateway_id=>"cgw-d5a643bc"}]
228
225
  #
229
- def describe_customer_gateways(*list_and_filters)
230
- list, filters = vpc__split_list_and_filters(list_and_filters)
231
- cache_for = (list.empty? && filters.empty?) ? :describe_customer_gateways : nil
232
- request_hash = {}
233
- request_hash.merge!(amazonize_list('CustomerGatewayId', list))
234
- request_hash.merge!(amazonize_list(['Filter.?.Key','Filter.?.Value.?'], filters))
235
- link = generate_request("DescribeCustomerGateways", request_hash)
236
- request_cache_or_info cache_for, link, QEc2DescribeCustomerGatewaysParser, @@bench, cache_for
237
- rescue Exception
238
- on_exception
226
+ # ec2.describe_customer_gateways(:filters => {'tag:MyTag' => 'MyValue'})
227
+ #
228
+ # P.S. filters: http://docs.amazonwebservices.com/AmazonVPC/latest/APIReference/index.html?ApiReference-query-DescribeCustomerGateways.html
229
+ #
230
+ def describe_customer_gateways(*list_and_options)
231
+ describe_resources_with_list_and_options('DescribeCustomerGateways', 'CustomerGatewayId', QEc2DescribeCustomerGatewaysParser, list_and_options)
239
232
  end
240
233
 
241
234
  # Create customer gateway.
@@ -273,22 +266,22 @@ module RightAws
273
266
 
274
267
  # Describe VPN gateways.
275
268
  #
269
+ # Accepts a list of VPN gateways and/or a set of filters as the last parameter.
270
+ #
271
+ # Filters: attachment.state, attachment.vpc-id, availability-zone, state, tag-key, tag-value, tag:key, type, vpn-gateway-id
272
+ #
276
273
  # ec2.describe_vpn_gateways #=>
277
274
  # [{:type=>"ipsec.1",
278
275
  # :availability_zone=>"us-east-1a",
279
276
  # :attachments=>[{:vpc_id=>"vpc-890ce2e0", :state=>"attached"}],
280
277
  # :vpn_gateway_id=>"vgw-dfa144b6"}]
281
278
  #
282
- def describe_vpn_gateways(*list_and_filters)
283
- list, filters = vpc__split_list_and_filters(list_and_filters)
284
- cache_for = (list.empty? && filters.empty?) ? :describe_vpn_gateways : nil
285
- request_hash = {}
286
- request_hash.merge!(amazonize_list('VpnGatewayId', list))
287
- request_hash.merge!(amazonize_list(['Filter.?.Key','Filter.?.Value.?'], filters))
288
- link = generate_request("DescribeVpnGateways", request_hash)
289
- request_cache_or_info cache_for, link, QEc2DescribeVpnGatewaysParser, @@bench, cache_for
290
- rescue Exception
291
- on_exception
279
+ # ec2.describe_vpn_gateways(:filters => {'tag:MyTag' => 'MyValue'})
280
+ #
281
+ # P.S. filters: http://docs.amazonwebservices.com/AmazonVPC/latest/APIReference/index.html?ApiReference-query-DescribeVpnGateways.html
282
+ #
283
+ def describe_vpn_gateways(*list_and_options)
284
+ describe_resources_with_list_and_options('DescribeVpnGateways', 'VpnGatewayId', QEc2DescribeVpnGatewaysParser, list_and_options)
292
285
  end
293
286
 
294
287
  # Create VPN gateway.
@@ -301,7 +294,7 @@ module RightAws
301
294
  #
302
295
  def create_vpn_gateway(type, availability_zone=nil)
303
296
  request_hash = { 'Type' => type }
304
- request_hash['AvailabilityZone'] = availability_zone unless availability_zone.blank?
297
+ request_hash['AvailabilityZone'] = availability_zone unless availability_zone.right_blank?
305
298
  link = generate_request("CreateVpnGateway", request_hash )
306
299
  request_info(link, QEc2DescribeVpnGatewaysParser.new(:logger => @logger)).first
307
300
  rescue Exception
@@ -350,6 +343,11 @@ module RightAws
350
343
 
351
344
  # Describe VPN connections.
352
345
  #
346
+ # Accepts a list of VPN gateways and/or a set of filters as the last parameter.
347
+ #
348
+ # Filters: customer-gateway-configuration, customer-gateway-id, state, tag-key, tag-value, tag:key,
349
+ # type, vpn-connection-id, vpn-gateway-id
350
+ #
353
351
  # ec2.describe_vpn_connections #=>
354
352
  # [{:type=>"ipsec.1",
355
353
  # :vpn_connection_id=>"vpn-a9a643c0",
@@ -359,16 +357,12 @@ module RightAws
359
357
  # :vpn_gateway_id=>"vgw-dfa144b6",
360
358
  # :customer_gateway_id=>"cgw-81a643e8"}]
361
359
  #
362
- def describe_vpn_connections(*list_and_filters)
363
- list, filters = vpc__split_list_and_filters(list_and_filters)
364
- cache_for = (list.empty? && filters.empty?) ? :describe_vpn_connections : nil
365
- request_hash = {}
366
- request_hash.merge!(amazonize_list('VpnConnectionId', list))
367
- request_hash.merge!(amazonize_list(['Filter.?.Key','Filter.?.Value.?'], filters))
368
- link = generate_request("DescribeVpnConnections", request_hash)
369
- request_cache_or_info cache_for, link, QEc2DescribeVpnConnectionsParser, @@bench, cache_for
370
- rescue Exception
371
- on_exception
360
+ # ec2.describe_vpn_gateways(:filters => {'tag:MyTag' => 'MyValue'})
361
+ #
362
+ # P.S. filters: http://docs.amazonwebservices.com/AmazonVPC/latest/APIReference/index.html?ApiReference-query-DescribeVpnConnections.html
363
+ #
364
+ def describe_vpn_connections(*list_and_options)
365
+ describe_resources_with_list_and_options('DescribeVpnConnections', 'VpnConnectionId', QEc2DescribeVpnConnectionsParser, list_and_options)
372
366
  end
373
367
 
374
368
  # Create VPN connection.
@@ -407,17 +401,24 @@ module RightAws
407
401
 
408
402
  class QEc2DescribeVpcsParser < RightAWSParser #:nodoc:
409
403
  def tagstart(name, attributes)
410
- case name
411
- when 'item', 'vpc' then @item = {}
404
+ case full_tag_name
405
+ when %r{/(vpcSet/item|vpc)$} then @item = { :tags => {} }
406
+ when %r{/tagSet/item$} then @aws_tag = {}
412
407
  end
413
408
  end
414
409
  def tagend(name)
415
410
  case name
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 'item', 'vpc' then @result << @item
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
415
+ else
416
+ case full_tag_name
417
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
418
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
419
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
420
+ when %r{(vpcSet/item|vpc)$} then @result << @item
421
+ end
421
422
  end
422
423
  end
423
424
  def reset
@@ -427,19 +428,26 @@ module RightAws
427
428
 
428
429
  class QEc2DescribeSubnetsParser < RightAWSParser #:nodoc:
429
430
  def tagstart(name, attributes)
430
- case name
431
- when 'item', 'subnet' then @item = {}
431
+ case full_tag_name
432
+ when %r{/(subnetSet/item|subnet)$} then @item = { :tags => {} }
433
+ when %r{/tagSet/item$} then @aws_tag = {}
432
434
  end
433
435
  end
434
436
  def tagend(name)
435
437
  case name
436
- when 'subnetId' then @item[:subnet_id] = @text
437
- when 'state' then @item[:state] = @text
438
- when 'vpcId' then @item[:vpc_id] = @text
439
- when 'cidrBlock' then @item[:cidr_block] = @text
440
- when 'availabilityZone' then @item[:availability_zone] = @text
441
- when 'availableIpAddressCount' then @item[:available_ip_address_count] = @text
442
- when 'item', 'subnet' then @result << @item
438
+ when 'subnetId' then @item[:subnet_id] = @text
439
+ when 'state' then @item[:state] = @text
440
+ when 'vpcId' then @item[:vpc_id] = @text
441
+ when 'cidrBlock' then @item[:cidr_block] = @text
442
+ when 'availabilityZone' then @item[:availability_zone] = @text
443
+ when 'availableIpAddressCount' then @item[:available_ip_address_count] = @text
444
+ else
445
+ case full_tag_name
446
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
447
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
448
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
449
+ when %r{/(subnetSet/item|subnet)$} then @result << @item
450
+ end
443
451
  end
444
452
  end
445
453
  def reset
@@ -450,43 +458,47 @@ module RightAws
450
458
  class QEc2DescribeDhcpOptionsParser < RightAWSParser #:nodoc:
451
459
  def tagstart(name, attributes)
452
460
  case full_tag_name
453
- when @p1, @p2
454
- @item = { :dhcp_configuration_set => {} }
461
+ when %r{/(dhcpOptionsSet/item|dhcpOptions)$} then @item = { :tags => {}, :dhcp_configuration_set => {} }
462
+ when %r{/tagSet/item$} then @aws_tag = {}
455
463
  end
456
464
  end
457
465
  def tagend(name)
458
- case name
459
- when 'dhcpOptionsId' then @item[:dhcp_options_id] = @text
460
- when 'key' then @conf_item_key = @text
461
- when 'value' then (@item[:dhcp_configuration_set][@conf_item_key] ||= []) << @text
462
- end
463
466
  case full_tag_name
464
- when @p1, @p2
465
- @result << @item
467
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
468
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
469
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
470
+ when %r{/dhcpOptionsId$} then @item[:dhcp_options_id] = @text
471
+ when %r{/dhcpConfigurationSet/item/key$} then @conf_item_key = @text
472
+ when %r{/dhcpConfigurationSet/item/valueSet/item/value$} then (@item[:dhcp_configuration_set][@conf_item_key] ||= []) << @text
473
+ when %r{/(dhcpOptionsSet/item|dhcpOptions)$} then @result << @item
466
474
  end
467
475
  end
468
476
  def reset
469
- @p1 = 'DescribeDhcpOptionsResponse/dhcpOptionsSet/item'
470
- @p2 = 'CreateDhcpOptionsResponse/dhcpOptions'
471
477
  @result = []
472
478
  end
473
479
  end
474
480
 
475
481
  class QEc2DescribeCustomerGatewaysParser < RightAWSParser #:nodoc:
476
482
  def tagstart(name, attributes)
477
- case name
478
- when 'item', 'customerGateway'
479
- @item = {}
483
+ case full_tag_name
484
+ when %r{/(customerGatewaySet/item|customerGateway)$} then @item = { :tags => {} }
485
+ when %r{/tagSet/item$} then @aws_tag = {}
480
486
  end
481
487
  end
482
488
  def tagend(name)
483
489
  case name
484
490
  when 'customerGatewayId' then @item[:customer_gateway_id] = @text
485
- when 'state' then @item[:state] = @text
486
- when 'type' then @item[:type] = @text
487
- when 'ipAddress' then @item[:ip_address] = @text
488
- when 'bgpAsn' then @item[:bgp_asn] = @text
489
- when 'item', 'customerGateway' then @result << @item
491
+ when 'state' then @item[:state] = @text
492
+ when 'type' then @item[:type] = @text
493
+ when 'ipAddress' then @item[:ip_address] = @text
494
+ when 'bgpAsn' then @item[:bgp_asn] = @text
495
+ else
496
+ case full_tag_name
497
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
498
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
499
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
500
+ when %r{/(customerGatewaySet/item|customerGateway)$} then @result << @item
501
+ end
490
502
  end
491
503
  end
492
504
  def reset
@@ -497,37 +509,30 @@ module RightAws
497
509
  class QEc2DescribeVpnGatewaysParser < RightAWSParser #:nodoc:
498
510
  def tagstart(name, attributes)
499
511
  case full_tag_name
500
- when @p1, @p2
501
- @item = { :attachments => [] }
502
- when "#{@p1}/attachments/item",
503
- "#{@p2}/attachments/item"
504
- @attachment = {}
512
+ when %r{/(vpnGatewaySet/item|vpnGateway)$} then @item = { :tags => {}, :attachments => [] }
513
+ when %r{/attachments/item$} then @attachment = {}
514
+ when %r{/tagSet/item$} then @aws_tag = {}
505
515
  end
506
516
  end
507
517
  def tagend(name)
508
518
  case name
509
- when 'vpnGatewayId' then @item[:vpn_gateway_id] = @text
519
+ when 'vpnGatewayId' then @item[:vpn_gateway_id] = @text
510
520
  when 'availabilityZone' then @item[:availability_zone] = @text
511
- when 'type' then @item[:type] = @text
512
- when 'vpcId' then @attachment[:vpc_id] = @text
513
- end
514
- case full_tag_name
515
- when "#{@p1}/state",
516
- "#{@p2}/state"
517
- @item[:state] = @text
518
- when "#{@p1}/attachments/item/state",
519
- "#{@p2}/attachments/item/state"
520
- @attachment[:state] = @text
521
- when "#{@p1}/attachments/item",
522
- "#{@p2}/attachments/item"
523
- @item[:attachments] << @attachment unless @attachment.blank?
524
- when @p1, @p2
525
- @result << @item
521
+ when 'type' then @item[:type] = @text
522
+ when 'vpcId' then @attachment[:vpc_id] = @text
523
+ else
524
+ case full_tag_name
525
+ when %r{/vpnGatewaySet/item/state$} then @item[:state] = @text
526
+ when %r{/attachments/item/state$} then @attachment[:state] = @text
527
+ when %r{/attachments/item$} then @item[:attachments] << @attachment unless @attachment.right_blank?
528
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
529
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
530
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
531
+ when %r{/(vpnGatewaySet/item|vpnGateway)$} then @result << @item
532
+ end
526
533
  end
527
534
  end
528
535
  def reset
529
- @p1 = 'DescribeVpnGatewaysResponse/vpnGatewaySet/item'
530
- @p2 = 'CreateVpnGatewayResponse/vpnGateway'
531
536
  @result = []
532
537
  end
533
538
  end
@@ -547,19 +552,26 @@ module RightAws
547
552
 
548
553
  class QEc2DescribeVpnConnectionsParser < RightAWSParser #:nodoc:
549
554
  def tagstart(name, attributes)
550
- case name
551
- when 'item', 'vpnConnection' then @item = {}
555
+ case full_tag_name
556
+ when %r{/(vpnConnectionSet/item|vpnConnection)$} then @item = { :tags => {} }
557
+ when %r{/tagSet/item$} then @aws_tag = {}
552
558
  end
553
559
  end
554
560
  def tagend(name)
555
561
  case name
556
- when 'vpnConnectionId' then @item[:vpn_connection_id] = @text
557
- when 'state' then @item[:state] = @text
558
- when 'type' then @item[:type] = @text
559
- when 'vpnGatewayId' then @item[:vpn_gateway_id] = @text
560
- when 'customerGatewayId' then @item[:customer_gateway_id] = @text
562
+ when 'vpnConnectionId' then @item[:vpn_connection_id] = @text
563
+ when 'state' then @item[:state] = @text
564
+ when 'type' then @item[:type] = @text
565
+ when 'vpnGatewayId' then @item[:vpn_gateway_id] = @text
566
+ when 'customerGatewayId' then @item[:customer_gateway_id] = @text
561
567
  when 'customerGatewayConfiguration' then @item[:customer_gateway_configuration] = @text
562
- when 'item','vpnConnection' then @result << @item
568
+ else
569
+ case full_tag_name
570
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
571
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
572
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
573
+ when %r{/(vpnConnectionSet/item|vpnConnection)$} then @result << @item
574
+ end
563
575
  end
564
576
  end
565
577
  def reset