revans_right_aws 2.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 (52) hide show
  1. data/.gemtest +0 -0
  2. data/History.txt +284 -0
  3. data/Manifest.txt +50 -0
  4. data/README.txt +167 -0
  5. data/Rakefile +110 -0
  6. data/lib/acf/right_acf_interface.rb +485 -0
  7. data/lib/acf/right_acf_origin_access_identities.rb +230 -0
  8. data/lib/acf/right_acf_streaming_interface.rb +236 -0
  9. data/lib/acw/right_acw_interface.rb +249 -0
  10. data/lib/as/right_as_interface.rb +699 -0
  11. data/lib/awsbase/benchmark_fix.rb +39 -0
  12. data/lib/awsbase/right_awsbase.rb +978 -0
  13. data/lib/awsbase/support.rb +115 -0
  14. data/lib/ec2/right_ec2.rb +395 -0
  15. data/lib/ec2/right_ec2_ebs.rb +452 -0
  16. data/lib/ec2/right_ec2_images.rb +373 -0
  17. data/lib/ec2/right_ec2_instances.rb +755 -0
  18. data/lib/ec2/right_ec2_monitoring.rb +70 -0
  19. data/lib/ec2/right_ec2_reserved_instances.rb +170 -0
  20. data/lib/ec2/right_ec2_security_groups.rb +277 -0
  21. data/lib/ec2/right_ec2_spot_instances.rb +399 -0
  22. data/lib/ec2/right_ec2_vpc.rb +571 -0
  23. data/lib/elb/right_elb_interface.rb +496 -0
  24. data/lib/rds/right_rds_interface.rb +998 -0
  25. data/lib/right_aws.rb +83 -0
  26. data/lib/s3/right_s3.rb +1126 -0
  27. data/lib/s3/right_s3_interface.rb +1199 -0
  28. data/lib/sdb/active_sdb.rb +1122 -0
  29. data/lib/sdb/right_sdb_interface.rb +721 -0
  30. data/lib/sqs/right_sqs.rb +388 -0
  31. data/lib/sqs/right_sqs_gen2.rb +343 -0
  32. data/lib/sqs/right_sqs_gen2_interface.rb +524 -0
  33. data/lib/sqs/right_sqs_interface.rb +594 -0
  34. data/test/acf/test_helper.rb +2 -0
  35. data/test/acf/test_right_acf.rb +138 -0
  36. data/test/ec2/test_helper.rb +2 -0
  37. data/test/ec2/test_right_ec2.rb +108 -0
  38. data/test/http_connection.rb +87 -0
  39. data/test/rds/test_helper.rb +2 -0
  40. data/test/rds/test_right_rds.rb +120 -0
  41. data/test/s3/test_helper.rb +2 -0
  42. data/test/s3/test_right_s3.rb +421 -0
  43. data/test/s3/test_right_s3_stubbed.rb +97 -0
  44. data/test/sdb/test_active_sdb.rb +357 -0
  45. data/test/sdb/test_helper.rb +3 -0
  46. data/test/sdb/test_right_sdb.rb +253 -0
  47. data/test/sqs/test_helper.rb +2 -0
  48. data/test/sqs/test_right_sqs.rb +291 -0
  49. data/test/sqs/test_right_sqs_gen2.rb +264 -0
  50. data/test/test_credentials.rb +37 -0
  51. data/test/ts_right_aws.rb +14 -0
  52. metadata +169 -0
@@ -0,0 +1,115 @@
1
+ # If ActiveSupport is loaded, then great - use it. But we don't
2
+ # want a dependency on it, so if it's not present, define the few
3
+ # extensions that we want to use...
4
+ unless defined?(ActiveSupport::CoreExtensions) || defined?(ActiveSupport::Inflector)
5
+ # These are ActiveSupport-;like extensions to do a few handy things in the gems
6
+ # Derived from ActiveSupport, so the AS copyright notice applies:
7
+ #
8
+ #
9
+ #
10
+ # Copyright (c) 2005 David Heinemeier Hansson
11
+ #
12
+ # Permission is hereby granted, free of charge, to any person obtaining
13
+ # a copy of this software and associated documentation files (the
14
+ # "Software"), to deal in the Software without restriction, including
15
+ # without limitation the rights to use, copy, modify, merge, publish,
16
+ # distribute, sublicense, and/or sell copies of the Software, and to
17
+ # permit persons to whom the Software is furnished to do so, subject to
18
+ # the following conditions:
19
+ #
20
+ # The above copyright notice and this permission notice shall be
21
+ # included in all copies or substantial portions of the Software.
22
+ #
23
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
+ #++
31
+ #
32
+ #
33
+ class String #:nodoc:
34
+
35
+ # Constantize tries to find a declared constant with the name specified
36
+ # in the string. It raises a NameError when the name is not in CamelCase
37
+ # or is not initialized.
38
+ #
39
+ # Examples
40
+ # "Module".constantize #=> Module
41
+ # "Class".constantize #=> Class
42
+ def constantize()
43
+ unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ self
44
+ raise NameError, "#{self.inspect} is not a valid constant name!"
45
+ end
46
+
47
+ Object.module_eval("::#{$1}", __FILE__, __LINE__)
48
+ end
49
+
50
+ def camelize()
51
+ self.dup.split(/_/).map{ |word| word.capitalize }.join('')
52
+ end
53
+
54
+ end
55
+
56
+
57
+ class Object #:nodoc:
58
+ # "", " ", nil, [], and {} are blank
59
+ def blank?
60
+ if respond_to?(:empty?) && respond_to?(:strip)
61
+ empty? or strip.empty?
62
+ elsif respond_to?(:empty?)
63
+ empty?
64
+ else
65
+ !self
66
+ end
67
+ end
68
+ end
69
+
70
+ class NilClass #:nodoc:
71
+ def blank?
72
+ true
73
+ end
74
+ end
75
+
76
+ class FalseClass #:nodoc:
77
+ def blank?
78
+ true
79
+ end
80
+ end
81
+
82
+ class TrueClass #:nodoc:
83
+ def blank?
84
+ false
85
+ end
86
+ end
87
+
88
+ class Array #:nodoc:
89
+ alias_method :blank?, :empty?
90
+ end
91
+
92
+ class Hash #:nodoc:
93
+ alias_method :blank?, :empty?
94
+
95
+ # Return a new hash with all keys converted to symbols.
96
+ def symbolize_keys
97
+ inject({}) do |options, (key, value)|
98
+ options[key.to_sym] = value
99
+ options
100
+ end
101
+ end
102
+ end
103
+
104
+ class String #:nodoc:
105
+ def blank?
106
+ empty? || strip.empty?
107
+ end
108
+ end
109
+
110
+ class Numeric #:nodoc:
111
+ def blank?
112
+ false
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,395 @@
1
+ #
2
+ # Copyright (c) 2007-2009 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
+ # = RightAWS::EC2 -- RightScale Amazon EC2 interface
27
+ # The RightAws::EC2 class provides a complete interface to Amazon's
28
+ # Elastic Compute Cloud service, as well as the associated EBS (Elastic Block
29
+ # Store).
30
+ # For explanations of the semantics
31
+ # of each call, please refer to Amazon's documentation at
32
+ # http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=87
33
+ #
34
+ # Examples:
35
+ #
36
+ # Create an EC2 interface handle:
37
+ #
38
+ # @ec2 = RightAws::Ec2.new(aws_access_key_id,
39
+ # aws_secret_access_key)
40
+ # Create a new SSH key pair:
41
+ # @key = 'right_ec2_awesome_test_key'
42
+ # new_key = @ec2.create_key_pair(@key)
43
+ # keys = @ec2.describe_key_pairs
44
+ #
45
+ # Create a security group:
46
+ # @group = 'right_ec2_awesome_test_security_group'
47
+ # @ec2.create_security_group(@group,'My awesome test group')
48
+ # group = @ec2.describe_security_groups([@group])[0]
49
+ #
50
+ # Configure a security group:
51
+ # @ec2.authorize_security_group_named_ingress(@group, account_number, 'default')
52
+ # @ec2.authorize_security_group_IP_ingress(@group, 80,80,'udp','192.168.1.0/8')
53
+ #
54
+ # Describe the available images:
55
+ # images = @ec2.describe_images
56
+ #
57
+ # Launch an instance:
58
+ # ec2.run_instances('ami-9a9e7bf3', 1, 1, ['default'], @key, 'SomeImportantUserData', 'public')
59
+ #
60
+ #
61
+ # Describe running instances:
62
+ # @ec2.describe_instances
63
+ #
64
+ # Error handling: all operations raise an RightAws::AwsError in case
65
+ # of problems. Note that transient errors are automatically retried.
66
+
67
+ class Ec2 < RightAwsBase
68
+ include RightAwsBaseInterface
69
+
70
+ # Amazon EC2 API version being used
71
+ API_VERSION = "2009-11-30"
72
+ DEFAULT_HOST = "ec2.amazonaws.com"
73
+ DEFAULT_PATH = '/'
74
+ DEFAULT_PROTOCOL = 'https'
75
+ DEFAULT_PORT = 443
76
+
77
+ # Default addressing type (public=NAT, direct=no-NAT) used when launching instances.
78
+ DEFAULT_ADDRESSING_TYPE = 'public'
79
+ DNS_ADDRESSING_SET = ['public','direct']
80
+
81
+ # Amazon EC2 Instance Types : http://www.amazon.com/b?ie=UTF8&node=370375011
82
+ # Default EC2 instance type (platform)
83
+ DEFAULT_INSTANCE_TYPE = 'm1.small'
84
+ INSTANCE_TYPES = ['m1.small','c1.medium','m1.large','m1.xlarge','c1.xlarge', 'm2.xlarge', 'm2.2xlarge', 'm2.4xlarge']
85
+
86
+ @@bench = AwsBenchmarkingBlock.new
87
+ def self.bench_xml
88
+ @@bench.xml
89
+ end
90
+ def self.bench_ec2
91
+ @@bench.service
92
+ end
93
+
94
+ # Current API version (sometimes we have to check it outside the GEM).
95
+ @@api = ENV['EC2_API_VERSION'] || API_VERSION
96
+ def self.api
97
+ @@api
98
+ end
99
+
100
+ # Create a new handle to an EC2 account. All handles share the same per process or per thread
101
+ # HTTP connection to Amazon EC2. Each handle is for a specific account. The params have the
102
+ # following options:
103
+ # * <tt>:endpoint_url</tt> a fully qualified url to Amazon API endpoint (this overwrites: :server, :port, :service, :protocol and :region). Example: 'https://eu-west-1.ec2.amazonaws.com/'
104
+ # * <tt>:server</tt>: EC2 service host, default: DEFAULT_HOST
105
+ # * <tt>:region</tt>: EC2 region (North America by default)
106
+ # * <tt>:port</tt>: EC2 service port, default: DEFAULT_PORT
107
+ # * <tt>:protocol</tt>: 'http' or 'https', default: DEFAULT_PROTOCOL
108
+ # * <tt>:multi_thread</tt>: true=HTTP connection per thread, false=per process
109
+ # * <tt>:logger</tt>: for log messages, default: RAILS_DEFAULT_LOGGER else STDOUT
110
+ # * <tt>:signature_version</tt>: The signature version : '0','1' or '2'(default)
111
+ # * <tt>:cache</tt>: true/false: caching for: ec2_describe_images, describe_instances,
112
+ # describe_images_by_owner, describe_images_by_executable_by, describe_availability_zones,
113
+ # describe_security_groups, describe_key_pairs, describe_addresses,
114
+ # describe_volumes, describe_snapshots methods, default: false.
115
+ #
116
+ def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
117
+ init({ :name => 'EC2',
118
+ :default_host => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).host : DEFAULT_HOST,
119
+ :default_port => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).port : DEFAULT_PORT,
120
+ :default_service => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).path : DEFAULT_PATH,
121
+ :default_protocol => ENV['EC2_URL'] ? URI.parse(ENV['EC2_URL']).scheme : DEFAULT_PROTOCOL,
122
+ :default_api_version => @@api },
123
+ aws_access_key_id || ENV['AWS_ACCESS_KEY_ID'] ,
124
+ aws_secret_access_key|| ENV['AWS_SECRET_ACCESS_KEY'],
125
+ params)
126
+ # Eucalyptus supports some yummy features but Amazon does not
127
+ if @params[:eucalyptus]
128
+ @params[:port_based_group_ingress] = true unless @params.has_key?(:port_based_group_ingress)
129
+ end
130
+ end
131
+
132
+ def generate_request(action, params={}) #:nodoc:
133
+ generate_request_impl(:get, action, params )
134
+ end
135
+
136
+ # Sends request to Amazon and parses the response
137
+ # Raises AwsError if any banana happened
138
+ def request_info(request, parser) #:nodoc:
139
+ request_info_impl(:ec2_connection, @@bench, request, parser)
140
+ end
141
+
142
+ #-----------------------------------------------------------------
143
+ # Keys
144
+ #-----------------------------------------------------------------
145
+
146
+ # Retrieve a list of SSH keys. Returns an array of keys or an exception. Each key is
147
+ # represented as a two-element hash.
148
+ #
149
+ # ec2.describe_key_pairs #=>
150
+ # [{:aws_fingerprint=> "01:02:03:f4:25:e6:97:e8:9b:02:1a:26:32:4e:58:6b:7a:8c:9f:03", :aws_key_name=>"key-1"},
151
+ # {:aws_fingerprint=> "1e:29:30:47:58:6d:7b:8c:9f:08:11:20:3c:44:52:69:74:80:97:08", :aws_key_name=>"key-2"},
152
+ # ..., {...} ]
153
+ #
154
+ def describe_key_pairs(*key_pairs)
155
+ key_pairs = key_pairs.flatten
156
+ link = generate_request("DescribeKeyPairs", amazonize_list('KeyName', key_pairs))
157
+ request_cache_or_info :describe_key_pairs, link, QEc2DescribeKeyPairParser, @@bench, key_pairs.blank?
158
+ rescue Exception
159
+ on_exception
160
+ end
161
+
162
+ # Create new SSH key. Returns a hash of the key's data or an exception.
163
+ #
164
+ # ec2.create_key_pair('my_awesome_key') #=>
165
+ # {:aws_key_name => "my_awesome_key",
166
+ # :aws_fingerprint => "01:02:03:f4:25:e6:97:e8:9b:02:1a:26:32:4e:58:6b:7a:8c:9f:03",
167
+ # :aws_material => "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAK...Q8MDrCbuQ=\n-----END RSA PRIVATE KEY-----"}
168
+ #
169
+ def create_key_pair(name)
170
+ link = generate_request("CreateKeyPair",
171
+ 'KeyName' => name.to_s)
172
+ request_info(link, QEc2CreateKeyPairParser.new(:logger => @logger))
173
+ rescue Exception
174
+ on_exception
175
+ end
176
+
177
+ # Delete a key pair. Returns +true+ or an exception.
178
+ #
179
+ # ec2.delete_key_pair('my_awesome_key') #=> true
180
+ #
181
+ def delete_key_pair(name)
182
+ link = generate_request("DeleteKeyPair",
183
+ 'KeyName' => name.to_s)
184
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
185
+ rescue Exception
186
+ on_exception
187
+ end
188
+
189
+ #-----------------------------------------------------------------
190
+ # Elastic IPs
191
+ #-----------------------------------------------------------------
192
+
193
+ # Acquire a new elastic IP address for use with your account.
194
+ # Returns allocated IP address or an exception.
195
+ #
196
+ # ec2.allocate_address #=> '75.101.154.140'
197
+ #
198
+ def allocate_address
199
+ link = generate_request("AllocateAddress")
200
+ request_info(link, QEc2AllocateAddressParser.new(:logger => @logger))
201
+ rescue Exception
202
+ on_exception
203
+ end
204
+
205
+ # Associate an elastic IP address with an instance.
206
+ # Returns +true+ or an exception.
207
+ #
208
+ # ec2.associate_address('i-d630cbbf', '75.101.154.140') #=> true
209
+ #
210
+ def associate_address(instance_id, public_ip)
211
+ link = generate_request("AssociateAddress",
212
+ "InstanceId" => instance_id.to_s,
213
+ "PublicIp" => public_ip.to_s)
214
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
215
+ rescue Exception
216
+ on_exception
217
+ end
218
+
219
+ # List elastic IP addresses assigned to your account.
220
+ # Returns an array of 2 keys (:instance_id and :public_ip) hashes:
221
+ #
222
+ # ec2.describe_addresses #=> [{:instance_id=>"i-d630cbbf", :public_ip=>"75.101.154.140"},
223
+ # {:instance_id=>nil, :public_ip=>"75.101.154.141"}]
224
+ #
225
+ # ec2.describe_addresses('75.101.154.140') #=> [{:instance_id=>"i-d630cbbf", :public_ip=>"75.101.154.140"}]
226
+ #
227
+ def describe_addresses(*addresses)
228
+ addresses = addresses.flatten
229
+ link = generate_request("DescribeAddresses", amazonize_list('PublicIp', addresses))
230
+ request_cache_or_info :describe_addresses, link, QEc2DescribeAddressesParser, @@bench, addresses.blank?
231
+ rescue Exception
232
+ on_exception
233
+ end
234
+
235
+ # Disassociate the specified elastic IP address from the instance to which it is assigned.
236
+ # Returns +true+ or an exception.
237
+ #
238
+ # ec2.disassociate_address('75.101.154.140') #=> true
239
+ #
240
+ def disassociate_address(public_ip)
241
+ link = generate_request("DisassociateAddress",
242
+ "PublicIp" => public_ip.to_s)
243
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
244
+ rescue Exception
245
+ on_exception
246
+ end
247
+
248
+ # Release an elastic IP address associated with your account.
249
+ # Returns +true+ or an exception.
250
+ #
251
+ # ec2.release_address('75.101.154.140') #=> true
252
+ #
253
+ def release_address(public_ip)
254
+ link = generate_request("ReleaseAddress",
255
+ "PublicIp" => public_ip.to_s)
256
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
257
+ rescue Exception
258
+ on_exception
259
+ end
260
+
261
+ #-----------------------------------------------------------------
262
+ # Availability zones
263
+ #-----------------------------------------------------------------
264
+
265
+ # Describes availability zones that are currently available to the account and their states.
266
+ # Returns an array of 2 keys (:zone_name and :zone_state) hashes:
267
+ #
268
+ # ec2.describe_availability_zones #=> [{:region_name=>"us-east-1",
269
+ # :zone_name=>"us-east-1a",
270
+ # :zone_state=>"available"}, ... ]
271
+ #
272
+ # ec2.describe_availability_zones('us-east-1c') #=> [{:region_name=>"us-east-1",
273
+ # :zone_state=>"available",
274
+ # :zone_name=>"us-east-1c"}]
275
+ #
276
+ def describe_availability_zones(*availability_zones)
277
+ availability_zones = availability_zones.flatten
278
+ link = generate_request("DescribeAvailabilityZones", amazonize_list('ZoneName', availability_zones))
279
+ request_cache_or_info :describe_availability_zones, link, QEc2DescribeAvailabilityZonesParser, @@bench, availability_zones.blank?
280
+ rescue Exception
281
+ on_exception
282
+ end
283
+
284
+ #-----------------------------------------------------------------
285
+ # Regions
286
+ #-----------------------------------------------------------------
287
+
288
+ # Describe regions.
289
+ #
290
+ # ec2.describe_regions #=> ["eu-west-1", "us-east-1"]
291
+ #
292
+ def describe_regions(*regions)
293
+ regions = regions.flatten
294
+ link = generate_request("DescribeRegions", amazonize_list('RegionName', regions))
295
+ request_cache_or_info :describe_regions, link, QEc2DescribeRegionsParser, @@bench, regions.blank?
296
+ rescue Exception
297
+ on_exception
298
+ end
299
+
300
+ #-----------------------------------------------------------------
301
+ # PARSERS: Key Pair
302
+ #-----------------------------------------------------------------
303
+
304
+ class QEc2DescribeKeyPairParser < RightAWSParser #:nodoc:
305
+ def tagstart(name, attributes)
306
+ @item = {} if name == 'item'
307
+ end
308
+ def tagend(name)
309
+ case name
310
+ when 'keyName' then @item[:aws_key_name] = @text
311
+ when 'keyFingerprint' then @item[:aws_fingerprint] = @text
312
+ when 'item' then @result << @item
313
+ end
314
+ end
315
+ def reset
316
+ @result = [];
317
+ end
318
+ end
319
+
320
+ class QEc2CreateKeyPairParser < RightAWSParser #:nodoc:
321
+ def tagstart(name, attributes)
322
+ @result = {} if name == 'CreateKeyPairResponse'
323
+ end
324
+ def tagend(name)
325
+ case name
326
+ when 'keyName' then @result[:aws_key_name] = @text
327
+ when 'keyFingerprint' then @result[:aws_fingerprint] = @text
328
+ when 'keyMaterial' then @result[:aws_material] = @text
329
+ end
330
+ end
331
+ end
332
+
333
+ #-----------------------------------------------------------------
334
+ # PARSERS: Elastic IPs
335
+ #-----------------------------------------------------------------
336
+
337
+ class QEc2AllocateAddressParser < RightAWSParser #:nodoc:
338
+ def tagend(name)
339
+ @result = @text if name == 'publicIp'
340
+ end
341
+ end
342
+
343
+ class QEc2DescribeAddressesParser < RightAWSParser #:nodoc:
344
+ def tagstart(name, attributes)
345
+ @address = {} if name == 'item'
346
+ end
347
+ def tagend(name)
348
+ case name
349
+ when 'instanceId' then @address[:instance_id] = @text.blank? ? nil : @text
350
+ when 'publicIp' then @address[:public_ip] = @text
351
+ when 'item' then @result << @address
352
+ end
353
+ end
354
+ def reset
355
+ @result = []
356
+ end
357
+ end
358
+
359
+ #-----------------------------------------------------------------
360
+ # PARSERS: AvailabilityZones
361
+ #-----------------------------------------------------------------
362
+
363
+ class QEc2DescribeAvailabilityZonesParser < RightAWSParser #:nodoc:
364
+ def tagstart(name, attributes)
365
+ @zone = {} if name == 'item'
366
+ end
367
+ def tagend(name)
368
+ case name
369
+ when 'regionName' then @zone[:region_name] = @text
370
+ when 'zoneName' then @zone[:zone_name] = @text
371
+ when 'zoneState' then @zone[:zone_state] = @text
372
+ when 'item' then @result << @zone
373
+ end
374
+ end
375
+ def reset
376
+ @result = []
377
+ end
378
+ end
379
+
380
+ #-----------------------------------------------------------------
381
+ # PARSERS: Regions
382
+ #-----------------------------------------------------------------
383
+
384
+ class QEc2DescribeRegionsParser < RightAWSParser #:nodoc:
385
+ def tagend(name)
386
+ @result << @text if name == 'regionName'
387
+ end
388
+ def reset
389
+ @result = []
390
+ end
391
+ end
392
+
393
+ end
394
+
395
+ end