right_aws 1.6.2 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -71,6 +71,7 @@ Initial release.
71
71
 
72
72
  * r1983, konstantin, 2007-10-25 22:33:00 +0400
73
73
  * Fixed ActiveSupport requirement bug (thanks to Toby)
74
+ * Fixed HttpConnection logging to stdout bug (thanks to Toby)
74
75
 
75
76
  == 1.4.4
76
77
 
@@ -131,6 +132,7 @@ r2922 | todd | 2008-03-03 15:26:42 -0800 (Mon, 03 Mar 2008) | 2 lines
131
132
  couple of documentation tweaks in prep for 1.6.0
132
133
 
133
134
  == 1.6.1 2008-03-14
135
+
134
136
  ------------------------------------------------------------------------
135
137
  r2963 | todd | 2008-03-06 19:10:23 -0800 (Thu, 06 Mar 2008) | 3 lines
136
138
 
@@ -138,21 +140,53 @@ r2963 | todd | 2008-03-06 19:10:23 -0800 (Thu, 06 Mar 2008) | 3 lines
138
140
  in
139
141
  certain rare conditions
140
142
 
141
- == 1.6.2 2008-03-19
143
+ == 1.7.0
144
+
145
+ r3051 | konstantin | 2008-03-14 21:26:12 +0300 (Fri, 14 Mar 2008) | 1 line
146
+ #897, ActiveSdb alpha release
147
+
148
+ <<<<<<< .mine
149
+ #897, ActiveSdb alpha release
150
+
142
151
  ------------------------------------------------------------------------
143
- r3128 | todd | 2008-03-19 11:54:53 -0700 (Wed, 19 Mar 2008) | 2 lines
152
+ r3204 | todd | 2008-03-26 17:50:45 -0700 (Wed, 26 Mar 2008) | 4 lines
144
153
 
145
- Create 1.6.2 release branch
154
+ Do not autoload right_sdb with the rest of the modules; it requires uuidtools.
155
+ We want the user to explicly request ActiveSdb, at least as long as it is
156
+ alpha/beta.
146
157
 
147
158
  ------------------------------------------------------------------------
148
- r3130 | todd | 2008-03-19 12:01:12 -0700 (Wed, 19 Mar 2008) | 3 lines
159
+ r3220 | konstantin | 2008-03-26 23:03:51 -0700 (Wed, 26 Mar 2008) | 1 line
149
160
 
150
- Apply Change 3124 to release_1_6_2 : further fixes to
151
- incrementally_list_bucket
161
+ mark ActiveSdb release as alpha,(port to 1.7.0)
162
+ ------------------------------------------------------------------------
163
+ r3229 | konstantin | 2008-03-27 03:43:17 -0700 (Thu, 27 Mar 2008) | 1 line
164
+
165
+ aws pcode fix (release 2.5)
166
+ ------------------------------------------------------------------------
167
+ r3243 | todd | 2008-03-27 12:10:49 -0700 (Thu, 27 Mar 2008) | 1 line
152
168
 
169
+ (#991) Bring SqsGen2::Queue.pop fix into 1.7.0. Also bring removal of
170
+ uuidtools dependency.
153
171
  ------------------------------------------------------------------------
154
- r3134 | todd | 2008-03-19 14:10:25 -0700 (Wed, 19 Mar 2008) | 2 lines
172
+ r3249 | todd | 2008-03-27 17:59:14 -0700 (Thu, 27 Mar 2008) | 1 line
155
173
 
156
- Merge 3133 (max-keys fix in incrementally_list_bucket) from trunk to 1.6.2
174
+ (#991) Print an informational message if the require of uuidtools fails for
175
+ ActiveSdb. Update RDoc to show how to include ActiveSdb class. Update README
176
+ to point to ActiveSdb RDoc.
177
+ ------------------------------------------------------------------------
178
+ r3250 | todd | 2008-03-27 18:03:09 -0700 (Thu, 27 Mar 2008) | 2 lines
179
+
180
+ (#991) Change manifest entry from right_sdb to active_sdb
181
+
182
+ ------------------------------------------------------------------------
183
+ r3251 | todd | 2008-03-27 18:03:33 -0700 (Thu, 27 Mar 2008) | 1 line
184
+
185
+ (#991) Rename file from right_sdb to active_sdb.
186
+ ------------------------------------------------------------------------
187
+ r3286 | konstantin | 2008-03-31 06:45:19 -0700 (Mon, 31 Mar 2008) | 4 lines
157
188
 
189
+ right_aws 1.7.0
190
+ 1. remove code duplication on the methods being cached
191
+ 2. add describe_availability_zones to cached methods
158
192
 
@@ -2,29 +2,30 @@ History.txt
2
2
  Manifest.txt
3
3
  README.txt
4
4
  Rakefile
5
- lib/right_aws.rb
6
5
  lib/awsbase/benchmark_fix.rb
7
- lib/awsbase/support.rb
8
6
  lib/awsbase/right_awsbase.rb
7
+ lib/awsbase/support.rb
9
8
  lib/ec2/right_ec2.rb
9
+ lib/right_aws.rb
10
10
  lib/s3/right_s3.rb
11
11
  lib/s3/right_s3_interface.rb
12
+ lib/sdb/active_sdb.rb
12
13
  lib/sdb/right_sdb_interface.rb
13
14
  lib/sqs/right_sqs.rb
14
- lib/sqs/right_sqs_interface.rb
15
15
  lib/sqs/right_sqs_gen2.rb
16
16
  lib/sqs/right_sqs_gen2_interface.rb
17
+ lib/sqs/right_sqs_interface.rb
17
18
  test/ec2/test_helper.rb
18
19
  test/ec2/test_right_ec2.rb
20
+ test/http_connection.rb
19
21
  test/s3/test_helper.rb
20
22
  test/s3/test_right_s3.rb
21
23
  test/s3/test_right_s3_stubbed.rb
22
- test/sdb/test_right_sdb.rb
24
+ test/sdb/test_active_sdb.rb
23
25
  test/sdb/test_helper.rb
26
+ test/sdb/test_right_sdb.rb
24
27
  test/sqs/test_helper.rb
25
28
  test/sqs/test_right_sqs.rb
26
29
  test/sqs/test_right_sqs_gen2.rb
27
- test/ts_right_aws.rb
28
30
  test/test_credentials.rb
29
- test/http_connection.rb
30
-
31
+ test/ts_right_aws.rb
data/README.txt CHANGED
@@ -11,7 +11,7 @@ The RightScale AWS gems have been designed to provide a robust, fast, and secure
11
11
  - RightAws::S3 and RightAws::S3Interface -- interface to Amazon S3 (Simple Storage Service)
12
12
  - RightAws::Sqs and RightAws::SqsInterface -- interface to first-generation Amazon SQS (Simple Queue Service) (API version 2007-05-01)
13
13
  - RightAws::SqsGen2 and RightAws::SqsGen2Interface -- interface to second-generation Amazon SQS (Simple Queue Service) (API version 2008-01-01)
14
- - RightAws::SdbInterface -- interface to Amazon SDB (SimpleDB)
14
+ - RightAws::SdbInterface and RightAws::ActiveSdb -- interface to Amazon SDB (SimpleDB)
15
15
 
16
16
  == FEATURES:
17
17
 
@@ -71,13 +71,13 @@ multithreaded mode.
71
71
  http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=48
72
72
  * For first generation SQS read RightAws::Sqs and consult the Amazon SQS API documentation at
73
73
  http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=31
74
- * For second generation SQS read RightAws::SqsGen2, RightAws::SqsGen2Interface and consult the Amazon SQS API documentation at
74
+ * For second generation SQS read RightAws::SqsGen2, RightAws::SqsGen2Interface, and consult the Amazon SQS API documentation at
75
75
  http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1214&categoryID=31
76
76
 
77
77
  Amazon's Migration Guide for moving from first to second generation SQS is
78
78
  avalable at:
79
79
  http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1148
80
- * For SDB read RightAws::Sdb and consult the Amazon SDB API documentation at
80
+ * For SDB read RightAws::SdbInterface, RightAws::ActiveSdb, and consult the Amazon SDB API documentation at
81
81
  http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=141
82
82
 
83
83
  == KNOWN ISSUES:
data/Rakefile CHANGED
@@ -86,4 +86,11 @@ task :testsdb do
86
86
  require 'test/sdb/test_right_sdb.rb'
87
87
  end
88
88
 
89
+ desc "Test active SDB interface"
90
+ task :testactivesdb do
91
+ require 'test/test_credentials'
92
+ TestCredentials.get_credentials
93
+ require 'test/sdb/test_active_sdb.rb'
94
+ end
95
+
89
96
  # vim: syntax=Ruby
@@ -68,7 +68,7 @@ module RightAws
68
68
 
69
69
  SIGNATURE_VERSION = "1"
70
70
  # Amazon EC2 API version being used
71
- API_VERSION = "2007-08-29"
71
+ API_VERSION = "2008-02-01"
72
72
  DEFAULT_HOST = "ec2.amazonaws.com"
73
73
  DEFAULT_PROTOCOL = 'https'
74
74
  DEFAULT_PORT = 443
@@ -142,52 +142,52 @@ module RightAws
142
142
  request_info_impl(thread[:ec2_connection], @@bench, request, parser)
143
143
  end
144
144
 
145
-
145
+ def request_cache_or_info(method, link, parser_class, use_cache=true) #:nodoc:
146
+ # We do not want to break the logic of parsing hence will use a dummy parser to process all the standart
147
+ # steps (errors checking etc). The dummy parser does nothig - just returns back the params it received.
148
+ # If the caching is enabled and hit then throw AwsNoChange.
149
+ # P.S. caching works for the whole images list only! (when the list param is blank) response, params = request_info(link, QEc2DummyParser.new)
150
+ # check cache
151
+ response, params = request_info(link, QEc2DummyParser.new)
152
+ cache_hits?(method.to_sym, response.body) if use_cache
153
+ parser = parser_class.new(:logger => @logger)
154
+ @@bench.xml.add!{ parser.parse(response, params) }
155
+ result = block_given? ? yield(parser) : parser.result
156
+ # update parsed data
157
+ update_cache(method.to_sym, :parsed => result) if use_cache
158
+ result
159
+ end
160
+
146
161
  def hash_params(prefix, list) #:nodoc:
147
162
  groups = {}
148
163
  list.each_index{|i| groups.update("#{prefix}.#{i+1}"=>list[i])} if list
149
164
  return groups
150
165
  end
151
166
 
152
-
153
167
  #-----------------------------------------------------------------
154
168
  #-----------------------------------------------------------------
155
169
  #-----------------------------------------------------------------
156
170
 
157
- def ec2_describe_images(type, list) #:nodoc:
158
- link = generate_request("DescribeImages", hash_params(type,list.to_a))
159
- # We do not want to break the logic of parsing hence will use a dummy parser to process all the standart
160
- # steps (errors checking etc). The dummy parser does nothig - just returns back the params it received.
161
- # If the caching is enabled and hit then throw AwsNoChange.
162
- # P.S. caching works for the whole images list only! (when the list param is blank)
163
- response, params = request_info(link, QEc2DummyParser.new)
164
- # if cache is ON and hits then throws AwsNoChange
165
- cache_hits?(:describe_images, response.body) if list.blank?
166
- parser = QEc2DescribeImagesParser.new(:logger => @logger)
167
- @@bench.xml.add!{ parser.parse(response, params) }
168
- result = parser.result.collect do |image|
169
- { :aws_id => image.imageId,
170
- :aws_location => image.imageLocation,
171
- :aws_owner => image.imageOwnerId,
172
- :aws_state => image.imageState.downcase,
173
- :aws_is_public => image.isPublic,
174
- :aws_product_codes => image.productCodes }
175
- end
176
- # put parsed data into cache if the caching is ON
177
- update_cache(:describe_images, :parsed => result) if list.blank?
178
- result
171
+ def ec2_describe_images(list, list_by='ImageId', image_type=nil) #:nodoc:
172
+ request_hash = hash_params(list_by, list.to_a)
173
+ request_hash['ImageType'] = image_type if image_type
174
+ link = generate_request("DescribeImages", request_hash)
175
+ request_cache_or_info :describe_images, link, QEc2DescribeImagesParser, (list.blank? && list_by == 'ImageId' && image_type.blank?)
179
176
  rescue Exception
180
177
  on_exception
181
178
  end
182
179
 
183
180
  # Retrieve a list of images. Returns array of hashes describing the images or an exception:
184
- #
181
+ # +image_type+ = 'machine' || 'kernel' || 'ramdisk'
182
+ #
185
183
  # ec2.describe_images #=>
186
184
  # [{:aws_owner => "522821470517",
187
185
  # :aws_id => "ami-e4b6538d",
188
186
  # :aws_state => "available",
189
187
  # :aws_location => "marcins_cool_public_images/ubuntu-6.10.manifest.xml",
190
- # :aws_is_public => true},
188
+ # :aws_is_public => true,
189
+ # :aws_architecture => "i386",
190
+ # :aws_image_type => "machine"},
191
191
  # {...},
192
192
  # {...} ]
193
193
  #
@@ -198,30 +198,32 @@ module RightAws
198
198
  # :aws_id => "ami-e4b6538d",
199
199
  # :aws_state => "available",
200
200
  # :aws_location => "marcins_cool_public_images/ubuntu-6.10.manifest.xml",
201
- # :aws_is_public => true}]
201
+ # :aws_is_public => true,
202
+ # :aws_architecture => "i386",
203
+ # :aws_image_type => "machine"}]
202
204
  #
203
- def describe_images(list=[])
204
- ec2_describe_images('ImageId', list)
205
+ def describe_images(list=[], image_type=nil)
206
+ ec2_describe_images(list, 'ImageId', image_type)
205
207
  end
206
208
 
207
209
  #
208
210
  # Example:
209
211
  #
210
- # ec2.describe_images_by_owner('522821470517')
211
- # ec2.describe_images_by_owner('self')
212
+ # ec2.describe_images_by_owner('522821470517')
213
+ # ec2.describe_images_by_owner('self')
212
214
  #
213
- def describe_images_by_owner(list)
214
- ec2_describe_images('Owner', list)
215
+ def describe_images_by_owner(list, image_type=nil)
216
+ ec2_describe_images(list, 'Owner', image_type)
215
217
  end
216
218
 
217
219
  #
218
220
  # Example:
219
221
  #
220
- # ec2.describe_images_by_executable_by('522821470517')
221
- # ec2.describe_images_by_executable_by('self')
222
+ # ec2.describe_images_by_executable_by('522821470517')
223
+ # ec2.describe_images_by_executable_by('self')
222
224
  #
223
- def describe_images_by_executable_by(list)
224
- ec2_describe_images('ExecutableBy', list)
225
+ def describe_images_by_executable_by(list, image_type=nil)
226
+ ec2_describe_images(list, 'ExecutableBy', image_type)
225
227
  end
226
228
 
227
229
 
@@ -251,7 +253,7 @@ module RightAws
251
253
  end
252
254
 
253
255
 
254
- # Describe image attributes. Currently 'launchPermission' and 'productCodes' are supported.
256
+ # Describe image attributes. Currently 'launchPermission', 'productCodes', 'kernel', 'ramdisk' and 'blockDeviceMapping' are supported.
255
257
  #
256
258
  # ec2.describe_image_attribute('ami-e444444d') #=> {:groups=>["all"], :users=>["000000000777"]}
257
259
  #
@@ -259,15 +261,7 @@ module RightAws
259
261
  link = generate_request("DescribeImageAttribute",
260
262
  'ImageId' => image_id,
261
263
  'Attribute' => attribute)
262
- image_attr = request_info(link, QEc2DescribeImageAttributeParser.new(:logger => @logger))
263
- result = {}
264
- if image_attr.launchPermission
265
- result = { :users => image_attr.launchPermission.userIds,
266
- :groups => image_attr.launchPermission.groups }
267
- elsif image_attr.productCodes
268
- result = { :aws_product_codes => image_attr.productCodes}
269
- end
270
- result
264
+ request_info(link, QEc2DescribeImageAttributeParser.new(:logger => @logger))
271
265
  rescue Exception
272
266
  on_exception
273
267
  end
@@ -331,47 +325,37 @@ module RightAws
331
325
  #
332
326
  # ec2.modify_image_launch_perm_add_groups('ami-e444444d') #=> true
333
327
  #
334
- def modify_image_launch_perm_add_groups(image_id, userGroup=['all'])
335
- modify_image_attribute(image_id, 'launchPermission', 'add', :user_group => userGroup.to_a)
328
+ def modify_image_launch_perm_add_groups(image_id, user_group=['all'])
329
+ modify_image_attribute(image_id, 'launchPermission', 'add', :user_group => user_group.to_a)
336
330
  end
337
331
 
338
332
  # Remove image launch permissions for users groups (currently only 'all' is supported, which gives public launch permissions).
339
333
  #
340
334
  # ec2.modify_image_launch_perm_remove_groups('ami-e444444d') #=> true
341
335
  #
342
- def modify_image_launch_perm_remove_groups(image_id, userGroup=['all'])
343
- modify_image_attribute(image_id, 'launchPermission', 'remove', :user_group => userGroup.to_a)
336
+ def modify_image_launch_perm_remove_groups(image_id, user_group=['all'])
337
+ modify_image_attribute(image_id, 'launchPermission', 'remove', :user_group => user_group.to_a)
344
338
  end
345
339
 
346
340
  # Add product code to image
347
341
  #
348
342
  # ec2.modify_image_product_code('ami-e444444d','0ABCDEF') #=> true
349
343
  #
350
- def modify_image_product_code(image_id, productCode=[])
351
- modify_image_attribute(image_id, 'productCodes', nil, :product_code => productCode.to_a)
344
+ def modify_image_product_code(image_id, product_code=[])
345
+ modify_image_attribute(image_id, 'productCodes', nil, :product_code => product_code.to_a)
352
346
  end
353
347
 
354
348
  def get_desc_instances(instances) # :nodoc:
355
349
  result = []
356
- instances.each do |item|
357
- item.instancesSet.each do |instance|
350
+ instances.each do |reservation|
351
+ reservation[:instances_set].each do |instance|
358
352
  # Parse and remove timestamp from the reason string. The timestamp is of
359
353
  # the request, not when EC2 took action, thus confusing & useless...
360
- reason = instance.reason.sub(/\(\d[^)]*GMT\) */, '')
361
- result << {:aws_owner => item.ownerId,
362
- :aws_reservation_id => item.reservationId,
363
- :aws_groups => item.groupSet,
364
- :aws_state_code => instance.instanceState.code,
365
- :dns_name => instance.dnsName,
366
- :private_dns_name => instance.privateDnsName,
367
- :aws_instance_id => instance.instanceId,
368
- :aws_state => instance.instanceState.name,
369
- :ssh_key_name => instance.keyName,
370
- :aws_image_id => instance.imageId,
371
- :aws_reason => reason,
372
- :aws_product_codes => instance.productCodes,
373
- :aws_instance_type => instance.instanceType,
374
- :aws_launch_time => instance.launchTime}
354
+ instance[:aws_reason] = instance[:aws_reason].sub(/\(\d[^)]*GMT\) */, '')
355
+ instance[:aws_owner] = reservation[:aws_owner]
356
+ instance[:aws_reservation_id] = reservation[:aws_reservation_id]
357
+ instance[:aws_groups] = reservation[:aws_groups]
358
+ result << instance
375
359
  end
376
360
  end
377
361
  result
@@ -396,19 +380,16 @@ module RightAws
396
380
  # :private_dns_name => "domU-12-34-67-89-01-C9.usma2.compute.amazonaws.com",
397
381
  # :aws_instance_type => "m1.small",
398
382
  # :aws_launch_time => "2008-1-1T00:00:00.000Z"},
383
+ # :aws_availability_zone => "us-east-1b",
384
+ # :aws_kernel_id => "aki-ba3adfd3",
385
+ # :aws_ramdisk_id => "ari-badbad00",
399
386
  # ..., {...}]
400
387
  #
401
388
  def describe_instances(list=[])
402
389
  link = generate_request("DescribeInstances", hash_params('InstanceId',list.to_a))
403
- response, params = request_info(link, QEc2DummyParser.new)
404
- # check cache
405
- cache_hits?(:describe_instances, response.body) if list.blank?
406
- parser = QEc2DescribeInstancesParser.new(:logger => @logger)
407
- @@bench.xml.add!{ parser.parse(response, params) }
408
- result = get_desc_instances(parser.result)
409
- # update parsed data
410
- update_cache(:describe_instances, :parsed => result) if list.blank?
411
- result
390
+ request_cache_or_info(:describe_instances, link, QEc2DescribeInstancesParser, list.blank?) do |parser|
391
+ get_desc_instances(parser.result)
392
+ end
412
393
  rescue Exception
413
394
  on_exception
414
395
  end
@@ -439,34 +420,52 @@ module RightAws
439
420
  # :aws_groups => ["my_awesome_group"],
440
421
  # :private_dns_name => "",
441
422
  # :aws_instance_type => "m1.small",
442
- # :aws_launch_time => "2008-1-1T00:00:00.000Z"}]
423
+ # :aws_launch_time => "2008-1-1T00:00:00.000Z"
424
+ # :aws_ramdisk_id => "ari-8605e0ef"
425
+ # :aws_kernel_id => "aki-9905e0f0",
426
+ # :ami_launch_index => "0",
427
+ # :aws_availability_zone => "us-east-1b"
428
+ # }]
443
429
  #
444
430
  def run_instances(image_id, min_count, max_count, group_ids, key_name, user_data='',
445
- addressing_type = DEFAULT_ADDRESSING_TYPE,
446
- instance_type = DEFAULT_INSTANCE_TYPE)
431
+ addressing_type = nil, instance_type = nil,
432
+ kernel_id = nil, ramdisk_id = nil, availability_zone = nil,
433
+ block_device_mappings = nil)
447
434
  launch_instances(image_id, { :min_count => min_count,
448
435
  :max_count => max_count,
449
436
  :user_data => user_data,
450
437
  :group_ids => group_ids,
451
438
  :key_name => key_name,
452
439
  :instance_type => instance_type,
453
- :addressing_type => addressing_type })
440
+ :addressing_type => addressing_type,
441
+ :kernel_id => kernel_id,
442
+ :ramdisk_id => ramdisk_id,
443
+ :availability_zone => availability_zone,
444
+ :block_device_mappings => block_device_mappings
445
+ })
454
446
  end
455
447
 
456
448
 
457
449
  # Launch new EC2 instances. Returns a list of launched instances or an exception.
450
+ #
451
+ # +lparams+ keys (default values in parenthesis):
452
+ # :min_count fixnum, (1)
453
+ # :max_count fixnum, (1)
454
+ # :group_ids array or string ([] == 'default')
455
+ # :instance_type string (DEFAULT_INSTACE_TYPE)
456
+ # :addressing_type string (DEFAULT_ADDRESSING_TYPE
457
+ # :key_name string
458
+ # :kernel_id string
459
+ # :ramdisk_id string
460
+ # :availability_zone string
461
+ # :block_device_mappings string
462
+ # :user_data string
458
463
  #
459
- # lparams and their default values:
460
- # :min_count - 1
461
- # :max_count - 1
462
- # :user_data - ''
463
- # :group_ids - [] # == 'default'
464
- # :key_name - nil
465
- # :instance_type - DEFAULT_INSTACE_TYPE
466
- # :addressing_type - DEFAULT_ADDRESSING_TYPE
467
- #
468
- # ec2.launch_instances('ami-e444444d', 'my_awesome_group', :user_data => "Woohoo!!!", \
469
- # :addressing_type => "public", :key_name => "my_awesome_key") #=>
464
+ # ec2.launch_instances('ami-e444444d', :group_ids => 'my_awesome_group',
465
+ # :user_data => "Woohoo!!!",
466
+ # :addressing_type => "public",
467
+ # :key_name => "my_awesome_key",
468
+ # :availability_zone => "us-east-1c") #=>
470
469
  # [{:aws_image_id => "ami-e444444d",
471
470
  # :aws_reason => "",
472
471
  # :aws_state_code => "0",
@@ -476,33 +475,32 @@ module RightAws
476
475
  # :aws_state => "pending",
477
476
  # :dns_name => "",
478
477
  # :ssh_key_name => "my_awesome_key",
479
- # :aws_groups => ["default"],
478
+ # :aws_groups => ["my_awesome_group"],
480
479
  # :private_dns_name => "",
481
480
  # :aws_instance_type => "m1.small",
482
- # :aws_launch_time => "2008-1-1T00:00:00.000Z"}]
481
+ # :aws_launch_time => "2008-1-1T00:00:00.000Z",
482
+ # :aws_ramdisk_id => "ari-8605e0ef"
483
+ # :aws_kernel_id => "aki-9905e0f0",
484
+ # :ami_launch_index => "0",
485
+ # :aws_availability_zone => "us-east-1c"
486
+ # }]
483
487
  #
484
488
  def launch_instances(image_id, lparams={})
485
- defaults = {
486
- :min_count => 1,
487
- :max_count => 1,
488
- :user_data => '',
489
- :group_ids => [],
490
- :key_name => nil,
491
- :instance_type => DEFAULT_INSTANCE_TYPE,
492
- :addressing_type => DEFAULT_ADDRESSING_TYPE
493
- }
494
- lparams = defaults.merge(lparams)
495
-
496
489
  @logger.info("Launching instance of image #{image_id} for #{@aws_access_key_id}, " +
497
- "key: #{lparams[:key_name]}, groups: #{(lparams[:group_ids]||[]).to_a.join(',')}")
498
- # careful: keyName and securityGroups may be nil
490
+ "key: #{lparams[:key_name]}, groups: #{(lparams[:group_ids]).to_a.join(',')}")
491
+ # careful: keyName and securityGroups may be nil
499
492
  params = hash_params('SecurityGroup', lparams[:group_ids].to_a)
500
493
  params.update( {'ImageId' => image_id,
501
- 'MinCount' => lparams[:min_count].to_s,
502
- 'MaxCount' => lparams[:max_count].to_s,
503
- 'AddressingType' => lparams[:addressing_type] })
504
- params['InstanceType'] = lparams[:instance_type]
505
- params['KeyName'] = lparams[:key_name] unless lparams[:key_name].blank?
494
+ 'MinCount' => (lparams[:min_count] || 1).to_s,
495
+ 'MaxCount' => (lparams[:max_count] || 1).to_s,
496
+ 'AddressingType' => lparams[:addressing_type] || DEFAULT_ADDRESSING_TYPE,
497
+ 'InstanceType' => lparams[:instance_type] || DEFAULT_INSTANCE_TYPE })
498
+ # optional params
499
+ params['KeyName'] = lparams[:key_name] unless lparams[:key_name].blank?
500
+ params['KernelId'] = lparams[:kernel_id] unless lparams[:kernel_id].blank?
501
+ params['RamdiskId'] = lparams[:ramdisk_id] unless lparams[:ramdisk_id].blank?
502
+ params['Placement.AvailabilityZone'] = lparams[:availability_zone] unless lparams[:availability_zone].blank?
503
+ params['BlockDeviceMappings'] = lparams[:block_device_mappings] unless lparams[:block_device_mappings].blank?
506
504
  unless lparams[:user_data].blank?
507
505
  lparams[:user_data].strip!
508
506
  # Do not use CGI::escape(encode64(...)) as it is done in Amazons EC2 library.
@@ -513,7 +511,7 @@ module RightAws
513
511
  end
514
512
  link = generate_request("RunInstances", params)
515
513
  #debugger
516
- instances = request_info(link, QEc2RunInstancesParser.new(:logger => @logger))
514
+ instances = request_info(link, QEc2DescribeInstancesParser.new(:logger => @logger))
517
515
  get_desc_instances(instances)
518
516
  rescue Exception
519
517
  on_exception
@@ -534,16 +532,8 @@ module RightAws
534
532
  # :aws_prev_state_code => 16}]
535
533
  #
536
534
  def terminate_instances(list=[])
537
- link = generate_request("TerminateInstances", hash_params('InstanceId',list.to_a))
538
- instances = request_info(link, QEc2TerminateInstancesParser.new(:logger => @logger))
539
- instances.collect! do |instance|
540
- { :aws_instance_id => instance.instanceId,
541
- :aws_shutdown_state => instance.shutdownState.name,
542
- :aws_shutdown_state_code => instance.shutdownState.code.to_i,
543
- :aws_prev_state => instance.previousState.name,
544
- :aws_prev_state_code => instance.previousState.code.to_i }
545
- end
546
- instances
535
+ link = generate_request("TerminateInstances", hash_params('InstanceId',list.to_a))
536
+ request_info(link, QEc2TerminateInstancesParser.new(:logger => @logger))
547
537
  rescue Exception
548
538
  on_exception
549
539
  end
@@ -556,12 +546,8 @@ module RightAws
556
546
  # :timestamp => Wed May 23 21:36:07 UTC 2007, # Time instance
557
547
  # :aws_output => "Linux version 2.6.16-xenU (builder@patchbat.amazonsa) (gcc version 4.0.1 20050727 ..."
558
548
  def get_console_output(instance_id)
559
- link = generate_request("GetConsoleOutput", { 'InstanceId.1' => instance_id })
560
- result = request_info(link, QEc2GetConsoleOutputParser.new(:logger => @logger))
561
- { :aws_instance_id => result.instanceId,
562
- :aws_timestamp => result.timestamp,
563
- :timestamp => (Time.parse(result.timestamp)).utc,
564
- :aws_output => result.output }
549
+ link = generate_request("GetConsoleOutput", { 'InstanceId.1' => instance_id })
550
+ request_info(link, QEc2GetConsoleOutputParser.new(:logger => @logger))
565
551
  rescue Exception
566
552
  on_exception
567
553
  end
@@ -593,45 +579,40 @@ module RightAws
593
579
  # ..., {...}]
594
580
  #
595
581
  def describe_security_groups(list=[])
596
- link = generate_request("DescribeSecurityGroups", hash_params('GroupName',list.to_a))
597
- response, params = request_info(link, QEc2DummyParser.new)
598
- # check cache
599
- cache_hits?(:describe_security_groups, response.body) if list.blank?
600
- parser = QEc2DescribeSecurityGroupsParser.new(:logger => @logger)
601
- @@bench.xml.add!{ parser.parse(response, params) }
602
-
603
- result = []
604
- parser.result.each do |item|
605
- perms = []
606
- item.ipPermissions.each do |perm|
607
- perm.groups.each do |ngroup|
608
- perms << {:group => ngroup.groupName,
609
- :owner => ngroup.userId}
582
+ link = generate_request("DescribeSecurityGroups", hash_params('GroupName',list.to_a))
583
+ request_cache_or_info( :describe_security_groups, link, QEc2DescribeSecurityGroupsParser, list.blank?) do |parser|
584
+ result = []
585
+ parser.result.each do |item|
586
+ perms = []
587
+ item.ipPermissions.each do |perm|
588
+ perm.groups.each do |ngroup|
589
+ perms << {:group => ngroup.groupName,
590
+ :owner => ngroup.userId}
591
+ end
592
+ perm.ipRanges.each do |cidr_ip|
593
+ perms << {:from_port => perm.fromPort,
594
+ :to_port => perm.toPort,
595
+ :protocol => perm.ipProtocol,
596
+ :cidr_ips => cidr_ip}
597
+ end
610
598
  end
611
- perm.ipRanges.each do |cidr_ip|
612
- perms << {:from_port => perm.fromPort,
613
- :to_port => perm.toPort,
614
- :protocol => perm.ipProtocol,
615
- :cidr_ips => cidr_ip}
599
+
600
+ # delete duplication
601
+ perms.each_index do |i|
602
+ (0...i).each do |j|
603
+ if perms[i] == perms[j] then perms[i] = nil; break; end
604
+ end
616
605
  end
617
- end
606
+ perms.compact!
607
+
608
+ result << {:aws_owner => item.ownerId,
609
+ :aws_group_name => item.groupName,
610
+ :aws_description => item.groupDescription,
611
+ :aws_perms => perms}
618
612
 
619
- # delete duplication
620
- perms.each_index do |i|
621
- (0...i).each do |j|
622
- if perms[i] == perms[j] then perms[i] = nil; break; end
623
- end
624
613
  end
625
- perms.compact!
626
-
627
- result << {:aws_owner => item.ownerId,
628
- :aws_group_name => item.groupName,
629
- :aws_description => item.groupDescription,
630
- :aws_perms => perms}
614
+ result
631
615
  end
632
- # update parsed data
633
- update_cache(:describe_security_groups, :parsed => result) if list.blank?
634
- result
635
616
  rescue Exception
636
617
  on_exception
637
618
  end
@@ -735,18 +716,7 @@ module RightAws
735
716
  #
736
717
  def describe_key_pairs(list=[])
737
718
  link = generate_request("DescribeKeyPairs", hash_params('KeyName',list.to_a))
738
- response, params = request_info(link, QEc2DummyParser.new)
739
- # check cache
740
- cache_hits?(:describe_key_pairs, response.body) if list.blank?
741
- parser = QEc2DescribeKeyPairParser.new(:logger => @logger)
742
- @@bench.xml.add!{ parser.parse(response, params) }
743
- result = parser.result.collect do |key|
744
- { :aws_key_name => key.keyName,
745
- :aws_fingerprint => key.keyFingerprint }
746
- end
747
- # update parsed data
748
- update_cache(:describe_key_pairs, :parsed => result) if list.blank?
749
- result
719
+ request_cache_or_info :describe_key_pairs, link, QEc2DescribeKeyPairParser, list.blank?
750
720
  rescue Exception
751
721
  on_exception
752
722
  end
@@ -761,10 +731,7 @@ module RightAws
761
731
  def create_key_pair(name)
762
732
  link = generate_request("CreateKeyPair",
763
733
  'KeyName' => name.to_s)
764
- key = request_info(link, QEc2CreateKeyPairParser.new(:logger => @logger))
765
- { :aws_key_name => key.keyName,
766
- :aws_fingerprint => key.keyFingerprint,
767
- :aws_material => key.keyMaterial}
734
+ request_info(link, QEc2CreateKeyPairParser.new(:logger => @logger))
768
735
  rescue Exception
769
736
  on_exception
770
737
  end
@@ -781,6 +748,99 @@ module RightAws
781
748
  on_exception
782
749
  end
783
750
 
751
+ #-----------------------------------------------------------------
752
+ # Elastic IPs
753
+ #-----------------------------------------------------------------
754
+
755
+ # Acquire a new elastic IP address for use with your account.
756
+ # Returns allocated IP address or an exception.
757
+ #
758
+ # ec2.allocate_address #=> '75.101.154.140'
759
+ #
760
+ def allocate_address
761
+ link = generate_request("AllocateAddress")
762
+ request_info(link, QEc2AllocateAddressParser.new(:logger => @logger))
763
+ rescue Exception
764
+ on_exception
765
+ end
766
+
767
+ # Associate an elastic IP address with an instance.
768
+ # Returns +true+ or an exception.
769
+ #
770
+ # ec2.associate_address('i-d630cbbf', '75.101.154.140') #=> true
771
+ #
772
+ def associate_address(instance_id, public_ip)
773
+ link = generate_request("AssociateAddress",
774
+ "InstanceId" => instance_id.to_s,
775
+ "PublicIp" => public_ip.to_s)
776
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
777
+ rescue Exception
778
+ on_exception
779
+ end
780
+
781
+ # List elastic IP addresses assigned to your account.
782
+ # Returns an array of 2 keys (:instance_id and :public_ip) hashes:
783
+ #
784
+ # ec2.describe_addresses #=> [{:instance_id=>"i-d630cbbf", :public_ip=>"75.101.154.140"},
785
+ # {:instance_id=>nil, :public_ip=>"75.101.154.141"}]
786
+ #
787
+ # ec2.describe_addresses('75.101.154.140') #=> [{:instance_id=>"i-d630cbbf", :public_ip=>"75.101.154.140"}]
788
+ #
789
+ def describe_addresses(list=[])
790
+ link = generate_request("DescribeAddresses",
791
+ hash_params('PublicIp',list.to_a))
792
+ request_cache_or_info :describe_addresses, link, QEc2DescribeAddressesParser, list.blank?
793
+ rescue Exception
794
+ on_exception
795
+ end
796
+
797
+ # Disassociate the specified elastic IP address from the instance to which it is assigned.
798
+ # Returns +true+ or an exception.
799
+ #
800
+ # ec2.disassociate_address('75.101.154.140') #=> true
801
+ #
802
+ def disassociate_address(public_ip)
803
+ link = generate_request("DisassociateAddress",
804
+ "PublicIp" => public_ip.to_s)
805
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
806
+ rescue Exception
807
+ on_exception
808
+ end
809
+
810
+ # Release an elastic IP address associated with your account.
811
+ # Returns +true+ or an exception.
812
+ #
813
+ # ec2.release_address('75.101.154.140') #=> true
814
+ #
815
+ def release_address(public_ip)
816
+ link = generate_request("ReleaseAddress",
817
+ "PublicIp" => public_ip.to_s)
818
+ request_info(link, RightBoolResponseParser.new(:logger => @logger))
819
+ rescue Exception
820
+ on_exception
821
+ end
822
+
823
+ #-----------------------------------------------------------------
824
+ # Availability zones
825
+ #-----------------------------------------------------------------
826
+
827
+ # Describes availability zones that are currently available to the account and their states.
828
+ # Returns an array of 2 keys (:zone_name and :zone_state) hashes:
829
+ #
830
+ # ec2.describe_availability_zones #=> [{:zone_state=>"available", :zone_name=>"us-east-1a"},
831
+ # {:zone_state=>"available", :zone_name=>"us-east-1b"},
832
+ # {:zone_state=>"available", :zone_name=>"us-east-1c"}]
833
+ #
834
+ # ec2.describe_availability_zones('us-east-1c') #=> [{:zone_state=>"available", :zone_name=>"us-east-1c"}]
835
+ #
836
+ def describe_availability_zones(list=[])
837
+ link = generate_request("DescribeAvailabilityZones",
838
+ hash_params('ZoneName',list.to_a))
839
+ request_cache_or_info :describe_availability_zones, link, QEc2DescribeAvailabilityZonesParser, list.blank?
840
+ rescue Exception
841
+ on_exception
842
+ end
843
+
784
844
  #- Internal stuff from here on down...
785
845
 
786
846
 
@@ -798,24 +858,15 @@ module RightAws
798
858
  # PARSERS: Key Pair
799
859
  #-----------------------------------------------------------------
800
860
 
801
- class QEc2DescribeKeyPairType #:nodoc:
802
- attr_accessor :keyName
803
- attr_accessor :keyFingerprint
804
- end
805
-
806
- class QEc2CreateKeyPairType < QEc2DescribeKeyPairType #:nodoc:
807
- attr_accessor :keyMaterial
808
- end
809
-
810
861
  class QEc2DescribeKeyPairParser < RightAWSParser #:nodoc:
811
862
  def tagstart(name, attributes)
812
- @item = QEc2DescribeKeyPairType.new if name == 'item'
863
+ @item = {} if name == 'item'
813
864
  end
814
865
  def tagend(name)
815
866
  case name
816
- when 'keyName' ; @item.keyName = @text
817
- when 'keyFingerprint'; @item.keyFingerprint = @text
818
- when 'item' ; @result << @item
867
+ when 'keyName' : @item[:aws_key_name] = @text
868
+ when 'keyFingerprint': @item[:aws_fingerprint] = @text
869
+ when 'item' : @result << @item
819
870
  end
820
871
  end
821
872
  def reset
@@ -825,13 +876,13 @@ module RightAws
825
876
 
826
877
  class QEc2CreateKeyPairParser < RightAWSParser #:nodoc:
827
878
  def tagstart(name, attributes)
828
- @result = QEc2CreateKeyPairType.new if !@result
879
+ @result = {} if name == 'CreateKeyPairResponse'
829
880
  end
830
881
  def tagend(name)
831
882
  case name
832
- when 'keyName' ; @result.keyName = @text
833
- when 'keyFingerprint' ; @result.keyFingerprint = @text
834
- when 'keyMaterial' ; @result.keyMaterial = @text
883
+ when 'keyName' : @result[:aws_key_name] = @text
884
+ when 'keyFingerprint': @result[:aws_fingerprint] = @text
885
+ when 'keyMaterial' : @result[:aws_material] = @text
835
886
  end
836
887
  end
837
888
  end
@@ -910,30 +961,25 @@ module RightAws
910
961
  #-----------------------------------------------------------------
911
962
  # PARSERS: Images
912
963
  #-----------------------------------------------------------------
913
-
914
- class QEc2DescribeImagesResponseItemType #:nodoc:
915
- attr_accessor :imageId
916
- attr_accessor :imageState
917
- attr_accessor :imageLocation
918
- attr_accessor :imageOwnerId
919
- attr_accessor :isPublic
920
- attr_accessor :productCodes
921
- end
922
-
964
+
923
965
  class QEc2DescribeImagesParser < RightAWSParser #:nodoc:
924
966
  def tagstart(name, attributes)
925
967
  if name == 'item' && @xmlpath[%r{.*/imagesSet$}]
926
- @image = QEc2DescribeImagesResponseItemType.new
968
+ @image = {}
927
969
  end
928
970
  end
929
971
  def tagend(name)
930
972
  case name
931
- when 'imageId' ; @image.imageId = @text
932
- when 'imageLocation' ; @image.imageLocation = @text
933
- when 'imageState' ; @image.imageState = @text
934
- when 'imageOwnerId' ; @image.imageOwnerId = @text
935
- when 'isPublic' ; @image.isPublic = @text == 'true' ? true : false
936
- when 'productCode' ; (@image.productCodes ||= []) << @text
973
+ when 'imageId' ; @image[:aws_id] = @text
974
+ when 'imageLocation' ; @image[:aws_location] = @text
975
+ when 'imageState' ; @image[:aws_state] = @text
976
+ when 'imageOwnerId' ; @image[:aws_owner] = @text
977
+ when 'isPublic' ; @image[:aws_is_public]= @text == 'true' ? true : false
978
+ when 'productCode' ;(@image[:aws_product_codes] ||= []) << @text
979
+ when 'architecture' ; @image[:aws_architecture] = @text
980
+ when 'imageType' ; @image[:aws_image_type] = @text
981
+ when 'kernelId' ; @image[:aws_kernel_id] = @text
982
+ when 'ramdiskId' ; @image[:aws_ramdisk_id] = @text
937
983
  when 'item' ; @result << @image if @xmlpath[%r{.*/imagesSet$}]
938
984
  end
939
985
  end
@@ -952,24 +998,14 @@ module RightAws
952
998
  # PARSERS: Image Attribute
953
999
  #-----------------------------------------------------------------
954
1000
 
955
- class QEc2LaunchPermissionItemType #:nodoc:
956
- attr_accessor :groups
957
- attr_accessor :userIds
958
- end
959
-
960
- class QEc2DescribeImageAttributeType #:nodoc:
961
- attr_accessor :imageId
962
- attr_accessor :launchPermission
963
- attr_accessor :productCodes
964
- end
965
-
966
1001
  class QEc2DescribeImageAttributeParser < RightAWSParser #:nodoc:
967
1002
  def tagstart(name, attributes)
968
1003
  case name
969
1004
  when 'launchPermission'
970
- @result.launchPermission = QEc2LaunchPermissionItemType.new
971
- @result.launchPermission.groups = []
972
- @result.launchPermission.userIds = []
1005
+ @result[:groups] = []
1006
+ @result[:users] = []
1007
+ when 'productCodes'
1008
+ @result[:aws_product_codes] = []
973
1009
  end
974
1010
  end
975
1011
  def tagend(name)
@@ -977,17 +1013,17 @@ module RightAws
977
1013
  # But nobody know what will they xml later as attribute. That is why we
978
1014
  # check for 'group' and 'userId' inside of 'launchPermission/item'
979
1015
  case name
980
- when 'imageId' ; @result.imageId = @text
981
- when 'group'
982
- @result.launchPermission.groups << @text if @xmlpath == 'DescribeImageAttributeResponse/launchPermission/item'
983
- when 'userId'
984
- @result.launchPermission.userIds << @text if @xmlpath == 'DescribeImageAttributeResponse/launchPermission/item'
985
- when 'productCode'
986
- (@result.productCodes ||= []) << @text
1016
+ when 'imageId' : @result[:aws_id] = @text
1017
+ when 'group' : @result[:groups] << @text if @xmlpath == 'DescribeImageAttributeResponse/launchPermission/item'
1018
+ when 'userId' : @result[:users] << @text if @xmlpath == 'DescribeImageAttributeResponse/launchPermission/item'
1019
+ when 'productCode' : @result[:aws_product_codes] << @text
1020
+ when 'kernel' : @result[:aws_kernel] = @text
1021
+ when 'ramdisk' : @result[:aws_ramdisk] = @text
1022
+ when 'blockDeviceMapping' : @result[:block_device_mapping] = @text
987
1023
  end
988
1024
  end
989
1025
  def reset
990
- @result = QEc2DescribeImageAttributeType.new
1026
+ @result = {}
991
1027
  end
992
1028
  end
993
1029
 
@@ -995,75 +1031,60 @@ module RightAws
995
1031
  # PARSERS: Instances
996
1032
  #-----------------------------------------------------------------
997
1033
 
998
- class QEc2InstanceStateType #:nodoc:
999
- attr_accessor :code
1000
- attr_accessor :name
1001
- end
1002
-
1003
- class QEc2RunningInstancesItemType #:nodoc:
1004
- attr_accessor :instanceId
1005
- attr_accessor :imageId
1006
- attr_accessor :instanceState
1007
- attr_accessor :dnsName
1008
- attr_accessor :privateDnsName
1009
- attr_accessor :reason
1010
- attr_accessor :keyName
1011
- attr_accessor :amiLaunchIndex
1012
- attr_accessor :productCodes
1013
- attr_accessor :instanceType
1014
- attr_accessor :launchTime
1015
- end
1016
-
1017
- class QEc2DescribeInstancesType #:nodoc:
1018
- attr_accessor :reservationId
1019
- attr_accessor :ownerId
1020
- attr_accessor :groupSet
1021
- attr_accessor :instancesSet
1022
- end
1023
-
1024
1034
  class QEc2DescribeInstancesParser < RightAWSParser #:nodoc:
1025
1035
  def tagstart(name, attributes)
1026
- case name
1027
- when 'item'
1028
- if @xmlpath=='DescribeInstancesResponse/reservationSet'
1029
- @reservation = QEc2DescribeInstancesType.new
1030
- @reservation.groupSet = []
1031
- @reservation.instancesSet = []
1032
- elsif @xmlpath=='DescribeInstancesResponse/reservationSet/item/instancesSet'
1033
- @instance = QEc2RunningInstancesItemType.new
1034
- # the optional params (sometimes are missing and we dont want them to be nil)
1035
- @instance.reason = ''
1036
- @instance.dnsName = ''
1037
- @instance.privateDnsName = ''
1038
- @instance.amiLaunchIndex = ''
1039
- @instance.keyName = ''
1040
- @instance.instanceState = QEc2InstanceStateType.new
1041
- end
1042
- end
1036
+ # DescribeInstances property
1037
+ if (name == 'item' && @xmlpath == 'DescribeInstancesResponse/reservationSet') ||
1038
+ # RunInstances property
1039
+ (name == 'RunInstancesResponse')
1040
+ @reservation = { :aws_groups => [],
1041
+ :instances_set => [] }
1042
+
1043
+ elsif (name == 'item') &&
1044
+ # DescribeInstances property
1045
+ ( @xmlpath=='DescribeInstancesResponse/reservationSet/item/instancesSet' ||
1046
+ # RunInstances property
1047
+ @xmlpath=='RunInstancesResponse/instancesSet' )
1048
+ # the optional params (sometimes are missing and we dont want them to be nil)
1049
+ @instance = { :aws_reason => '',
1050
+ :dns_name => '',
1051
+ :private_dns_name => '',
1052
+ :ami_launch_index => '',
1053
+ :ssh_key_name => '',
1054
+ :aws_state => '',
1055
+ :aws_product_codes => [] }
1056
+ end
1043
1057
  end
1044
1058
  def tagend(name)
1045
1059
  case name
1046
- when 'reservationId' ; @reservation.reservationId = @text
1047
- when 'ownerId' ; @reservation.ownerId = @text
1048
- when 'groupId' ; @reservation.groupSet << @text
1049
- when 'instanceId' ; @instance.instanceId = @text
1050
- when 'imageId' ; @instance.imageId = @text
1051
- when 'dnsName' ; @instance.dnsName = @text
1052
- when 'privateDnsName'; @instance.privateDnsName = @text
1053
- when 'reason' ; @instance.reason = @text
1054
- when 'keyName' ; @instance.keyName = @text
1055
- when 'amiLaunchIndex'; @instance.amiLaunchIndex = @text
1056
- when 'code' ; @instance.instanceState.code = @text
1057
- when 'name' ; @instance.instanceState.name = @text
1060
+ # reservation
1061
+ when 'reservationId' : @reservation[:aws_reservation_id] = @text
1062
+ when 'ownerId' : @reservation[:aws_owner] = @text
1063
+ when 'groupId' : @reservation[:aws_groups] << @text
1064
+ # instance
1065
+ when 'instanceId' : @instance[:aws_instance_id] = @text
1066
+ when 'imageId' : @instance[:aws_image_id] = @text
1067
+ when 'dnsName' : @instance[:dns_name] = @text
1068
+ when 'privateDnsName' : @instance[:private_dns_name] = @text
1069
+ when 'reason' : @instance[:aws_reason] = @text
1070
+ when 'keyName' : @instance[:ssh_key_name] = @text
1071
+ when 'amiLaunchIndex' : @instance[:ami_launch_index] = @text
1072
+ when 'code' : @instance[:aws_state_code] = @text
1073
+ when 'name' : @instance[:aws_state] = @text
1074
+ when 'productCode' : @instance[:aws_product_codes] << @text
1075
+ when 'instanceType' : @instance[:aws_instance_type] = @text
1076
+ when 'launchTime' : @instance[:aws_launch_time] = @text
1077
+ when 'kernelId' : @instance[:aws_kernel_id] = @text
1078
+ when 'ramdiskId' : @instance[:aws_ramdisk_id] = @text
1079
+ when 'availabilityZone': @instance[:aws_availability_zone] = @text
1058
1080
  when 'item'
1059
- if @xmlpath=='DescribeInstancesResponse/reservationSet/item/instancesSet'
1060
- @reservation.instancesSet << @instance
1061
- elsif @xmlpath=='DescribeInstancesResponse/reservationSet'
1081
+ if @xmlpath == 'DescribeInstancesResponse/reservationSet/item/instancesSet' || # DescribeInstances property
1082
+ @xmlpath == 'RunInstancesResponse/instancesSet' # RunInstances property
1083
+ @reservation[:instances_set] << @instance
1084
+ elsif @xmlpath=='DescribeInstancesResponse/reservationSet' # DescribeInstances property
1062
1085
  @result << @reservation
1063
1086
  end
1064
- when 'productCode' ; (@instance.productCodes ||= []) << @text
1065
- when 'instanceType' ; @instance.instanceType = @text
1066
- when 'launchTime' ; @instance.launchTime = @text
1087
+ when 'RunInstancesResponse': @result << @reservation # RunInstances property
1067
1088
  end
1068
1089
  end
1069
1090
  def reset
@@ -1075,84 +1096,24 @@ module RightAws
1075
1096
  def tagend(name)
1076
1097
  @result = @text if name == 'ownerId'
1077
1098
  end
1078
- def reset
1079
- @result = nil
1080
- end
1081
- end
1082
-
1083
- class QEc2RunInstancesParser < RightAWSParser #:nodoc:
1084
- def tagstart(name, attributes)
1085
- case name
1086
- when 'RunInstancesResponse'
1087
- @reservation = QEc2DescribeInstancesType.new
1088
- @reservation.groupSet = []
1089
- @reservation.instancesSet = []
1090
- when 'item'
1091
- if @xmlpath == 'RunInstancesResponse/instancesSet'
1092
- @instance = QEc2RunningInstancesItemType.new
1093
- # the optional params (sometimes are missing and we dont want them to be nil)
1094
- @instance.reason = ''
1095
- @instance.dnsName = ''
1096
- @instance.privateDnsName = ''
1097
- @instance.amiLaunchIndex = ''
1098
- @instance.keyName = ''
1099
- @instance.instanceState = QEc2InstanceStateType.new
1100
- end
1101
- end
1102
- end
1103
- def tagend(name)
1104
- case name
1105
- when 'reservationId' ; @reservation.reservationId = @text
1106
- when 'ownerId' ; @reservation.ownerId = @text
1107
- when 'groupId' ; @reservation.groupSet << @text
1108
- when 'instanceId' ; @instance.instanceId = @text
1109
- when 'imageId' ; @instance.imageId = @text
1110
- when 'dnsName' ; @instance.dnsName = @text
1111
- when 'privateDnsName'; @instance.privateDnsName = @text
1112
- when 'reason' ; @instance.reason = @text
1113
- when 'keyName' ; @instance.keyName = @text
1114
- when 'amiLaunchIndex'; @instance.amiLaunchIndex = @text
1115
- when 'code' ; @instance.instanceState.code = @text
1116
- when 'name' ; @instance.instanceState.name = @text
1117
- when 'item'
1118
- @reservation.instancesSet << @instance if @xmlpath == 'RunInstancesResponse/instancesSet'
1119
- when 'RunInstancesResponse'; @result << @reservation
1120
- when 'productCode' ; (@instance.productCodes ||= []) << @text
1121
- when 'instanceType' ; @instance.instanceType = @text
1122
- when 'launchTime' ; @instance.launchTime = @text
1123
- end
1124
- end
1125
- def reset
1126
- @result = []
1127
- end
1128
- end
1129
-
1130
- class QEc2TerminateInstancesResponseInfoType #:nodoc:
1131
- attr_accessor :instanceId
1132
- attr_accessor :shutdownState
1133
- attr_accessor :previousState
1134
1099
  end
1135
1100
 
1136
1101
  class QEc2TerminateInstancesParser < RightAWSParser #:nodoc:
1137
1102
  def tagstart(name, attributes)
1138
- if name == 'item'
1139
- @instance = QEc2TerminateInstancesResponseInfoType.new
1140
- @instance.shutdownState = QEc2InstanceStateType.new
1141
- @instance.previousState = QEc2InstanceStateType.new
1142
- end
1103
+ @instance = {} if name == 'item'
1143
1104
  end
1144
1105
  def tagend(name)
1145
1106
  case name
1146
- when 'instanceId' ; @instance.instanceId = @text
1147
- when 'item' ; @result << @instance
1107
+ when 'instanceId' : @instance[:aws_instance_id] = @text
1148
1108
  when 'code'
1149
1109
  if @xmlpath == 'TerminateInstancesResponse/instancesSet/item/shutdownState'
1150
- @instance.shutdownState.code = @text
1151
- else @instance.previousState.code = @text end
1110
+ @instance[:aws_shutdown_state_code] = @text.to_i
1111
+ else @instance[:aws_prev_state_code] = @text.to_i end
1152
1112
  when 'name'
1153
1113
  if @xmlpath == 'TerminateInstancesResponse/instancesSet/item/shutdownState'
1154
- @instance.shutdownState.name = @text
1155
- else @instance.previousState.name = @text end
1114
+ @instance[:aws_shutdown_state] = @text
1115
+ else @instance[:aws_prev_state] = @text end
1116
+ when 'item' : @result << @instance
1156
1117
  end
1157
1118
  end
1158
1119
  def reset
@@ -1164,22 +1125,18 @@ module RightAws
1164
1125
  # PARSERS: Console
1165
1126
  #-----------------------------------------------------------------
1166
1127
 
1167
- class QEc2GetConsoleOutputResponseType #:nodoc:
1168
- attr_accessor :instanceId
1169
- attr_accessor :timestamp
1170
- attr_accessor :output
1171
- end
1172
1128
 
1173
1129
  class QEc2GetConsoleOutputParser < RightAWSParser #:nodoc:
1174
1130
  def tagend(name)
1175
1131
  case name
1176
- when 'instanceId' ; @result.instanceId = @text
1177
- when 'timestamp' ; @result.timestamp = @text
1178
- when 'output' ; @result.output = Base64.decode64 @text
1132
+ when 'instanceId' : @result[:aws_instance_id] = @text
1133
+ when 'timestamp' : @result[:aws_timestamp] = @text
1134
+ @result[:timestamp] = (Time.parse(@text)).utc
1135
+ when 'output' : @result[:aws_output] = Base64.decode64(@text)
1179
1136
  end
1180
1137
  end
1181
1138
  def reset
1182
- @result = QEc2GetConsoleOutputResponseType.new
1139
+ @result = {}
1183
1140
  end
1184
1141
  end
1185
1142
 
@@ -1197,5 +1154,51 @@ module RightAws
1197
1154
  @result = [response, params]
1198
1155
  end
1199
1156
  end
1157
+
1158
+ #-----------------------------------------------------------------
1159
+ # PARSERS: Elastic IPs
1160
+ #-----------------------------------------------------------------
1200
1161
 
1162
+ class QEc2AllocateAddressParser < RightAWSParser #:nodoc:
1163
+ def tagend(name)
1164
+ @result = @text if name == 'publicIp'
1165
+ end
1166
+ end
1167
+
1168
+ class QEc2DescribeAddressesParser < RightAWSParser #:nodoc:
1169
+ def tagstart(name, attributes)
1170
+ @address = {} if name == 'item'
1171
+ end
1172
+ def tagend(name)
1173
+ case name
1174
+ when 'instanceId' ; @address[:instance_id] = @text.blank? ? nil : @text
1175
+ when 'publicIp' ; @address[:public_ip] = @text
1176
+ when 'item' ; @result << @address
1177
+ end
1178
+ end
1179
+ def reset
1180
+ @result = []
1181
+ end
1182
+ end
1183
+
1184
+ #-----------------------------------------------------------------
1185
+ # PARSERS: AvailabilityZones
1186
+ #-----------------------------------------------------------------
1187
+
1188
+ class QEc2DescribeAvailabilityZonesParser < RightAWSParser #:nodoc:
1189
+ def tagstart(name, attributes)
1190
+ @zone = {} if name == 'item'
1191
+ end
1192
+ def tagend(name)
1193
+ case name
1194
+ when 'zoneName' ; @zone[:zone_name] = @text
1195
+ when 'zoneState' ; @zone[:zone_state] = @text
1196
+ when 'item' ; @result << @zone
1197
+ end
1198
+ end
1199
+ def reset
1200
+ @result = []
1201
+ end
1202
+ end
1203
+
1201
1204
  end