icehouse-right_aws 1.11.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. data/History.txt +93 -15
  2. data/Manifest.txt +15 -1
  3. data/README.txt +0 -4
  4. data/Rakefile +34 -17
  5. data/lib/acf/right_acf_interface.rb +260 -124
  6. data/lib/acf/right_acf_invalidations.rb +144 -0
  7. data/lib/acf/right_acf_origin_access_identities.rb +230 -0
  8. data/lib/acf/right_acf_streaming_interface.rb +229 -0
  9. data/lib/acw/right_acw_interface.rb +4 -5
  10. data/lib/as/right_as_interface.rb +59 -51
  11. data/lib/awsbase/benchmark_fix.rb +0 -0
  12. data/lib/awsbase/right_awsbase.rb +351 -104
  13. data/lib/awsbase/support.rb +2 -82
  14. data/lib/awsbase/version.rb +9 -0
  15. data/lib/ec2/right_ec2.rb +97 -246
  16. data/lib/ec2/right_ec2_ebs.rb +88 -68
  17. data/lib/ec2/right_ec2_images.rb +90 -50
  18. data/lib/ec2/right_ec2_instances.rb +118 -89
  19. data/lib/ec2/right_ec2_placement_groups.rb +108 -0
  20. data/lib/ec2/right_ec2_reserved_instances.rb +51 -44
  21. data/lib/ec2/right_ec2_security_groups.rb +396 -0
  22. data/lib/ec2/right_ec2_spot_instances.rb +425 -0
  23. data/lib/ec2/right_ec2_tags.rb +139 -0
  24. data/lib/ec2/right_ec2_vpc.rb +152 -140
  25. data/lib/ec2/right_ec2_windows_mobility.rb +84 -0
  26. data/lib/elb/right_elb_interface.rb +205 -39
  27. data/lib/iam/right_iam_access_keys.rb +71 -0
  28. data/lib/iam/right_iam_groups.rb +195 -0
  29. data/lib/iam/right_iam_interface.rb +341 -0
  30. data/lib/iam/right_iam_mfa_devices.rb +67 -0
  31. data/lib/iam/right_iam_users.rb +251 -0
  32. data/lib/rds/right_rds_interface.rb +591 -205
  33. data/lib/right_aws.rb +16 -12
  34. data/lib/route_53/right_route_53_interface.rb +640 -0
  35. data/lib/s3/right_s3.rb +34 -13
  36. data/lib/s3/right_s3_interface.rb +17 -14
  37. data/lib/sdb/active_sdb.rb +215 -38
  38. data/lib/sdb/right_sdb_interface.rb +93 -12
  39. data/lib/sqs/right_sqs.rb +1 -2
  40. data/lib/sqs/right_sqs_gen2.rb +0 -1
  41. data/lib/sqs/right_sqs_gen2_interface.rb +9 -9
  42. data/lib/sqs/right_sqs_interface.rb +6 -7
  43. data/right_aws.gemspec +91 -0
  44. data/test/README.mdown +39 -0
  45. data/test/acf/test_helper.rb +0 -0
  46. data/test/acf/test_right_acf.rb +10 -18
  47. data/test/awsbase/test_helper.rb +0 -0
  48. data/test/awsbase/test_right_awsbase.rb +0 -1
  49. data/test/ec2/test_helper.rb +0 -0
  50. data/test/ec2/test_right_ec2.rb +0 -1
  51. data/test/elb/test_helper.rb +2 -0
  52. data/test/elb/test_right_elb.rb +43 -0
  53. data/test/http_connection.rb +0 -0
  54. data/test/route_53/fixtures/a_record.xml +18 -0
  55. data/test/route_53/fixtures/alias_record.xml +18 -0
  56. data/test/route_53/test_helper.rb +2 -0
  57. data/test/route_53/test_right_route_53.rb +141 -0
  58. data/test/s3/test_helper.rb +0 -0
  59. data/test/s3/test_right_s3.rb +11 -9
  60. data/test/s3/test_right_s3_stubbed.rb +6 -4
  61. data/test/sdb/test_active_sdb.rb +71 -13
  62. data/test/sdb/test_batch_put_attributes.rb +54 -0
  63. data/test/sdb/test_helper.rb +0 -0
  64. data/test/sdb/test_right_sdb.rb +13 -7
  65. data/test/sqs/test_helper.rb +0 -0
  66. data/test/sqs/test_right_sqs.rb +0 -6
  67. data/test/sqs/test_right_sqs_gen2.rb +22 -34
  68. data/test/test_credentials.rb +0 -0
  69. data/test/ts_right_aws.rb +0 -0
  70. metadata +146 -16
  71. data/VERSION +0 -1
@@ -29,7 +29,12 @@ module RightAws
29
29
  # EBS: Volumes
30
30
  #-----------------------------------------------------------------
31
31
 
32
- # Describe all EBS volumes.
32
+ # Describe EBS volumes.
33
+ #
34
+ # Accepts a list of volumes and/or a set of filters as the last parameter.
35
+ #
36
+ # Filters: attachement.attach-time, attachment.delete-on-termination, attachement.device, attachment.instance-id,
37
+ # attachment.status, availability-zone, create-time, size, snapshot-id, status, tag-key, tag-value, tag:key, volume-id
33
38
  #
34
39
  # ec2.describe_volumes #=>
35
40
  # [{:aws_size => 94,
@@ -37,10 +42,10 @@ module RightAws
37
42
  # :aws_attachment_status => "attached",
38
43
  # :zone => "merlot",
39
44
  # :snapshot_id => nil,
40
- # :aws_attached_at => Wed Jun 18 08:19:28 UTC 2008,
45
+ # :aws_attached_at => "2008-06-18T08:19:28.000Z",
41
46
  # :aws_status => "in-use",
42
47
  # :aws_id => "vol-60957009",
43
- # :aws_created_at => Wed Jun 18 08:19:20s UTC 2008,
48
+ # :aws_created_at => "2008-06-18T08:19:20.000Z",
44
49
  # :aws_instance_id => "i-c014c0a9"},
45
50
  # {:aws_size => 1,
46
51
  # :zone => "merlot",
@@ -49,12 +54,12 @@ module RightAws
49
54
  # :aws_id => "vol-58957031",
50
55
  # :aws_created_at => Wed Jun 18 08:19:21 UTC 2008,}, ... ]
51
56
  #
52
- def describe_volumes(list=[])
53
- link = generate_request("DescribeVolumes",
54
- amazonize_list('VolumeId',list.to_a))
55
- request_cache_or_info :describe_volumes, link, QEc2DescribeVolumesParser, @@bench, list.blank?
56
- rescue Exception
57
- on_exception
57
+ # ec2.describe_volumes(:filters => { 'availability-zone' => 'us-east-1a', 'size' => '10' })
58
+ #
59
+ # P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeVolumes.html
60
+ #
61
+ def describe_volumes(*list_and_options)
62
+ describe_resources_with_list_and_options('DescribeVolumes', 'VolumeId', QEc2DescribeVolumesParser, list_and_options)
58
63
  end
59
64
 
60
65
  # Create new EBS volume based on previously created snapshot.
@@ -65,14 +70,14 @@ module RightAws
65
70
  # :aws_status => "creating",
66
71
  # :aws_id => "vol-fc9f7a95",
67
72
  # :zone => "merlot",
68
- # :aws_created_at => Tue Jun 24 18:13:32 UTC 2008,
73
+ # :aws_created_at => "2008-06-24T18:13:32.000Z",
69
74
  # :aws_size => 94}
70
75
  #
71
76
  def create_volume(snapshot_id, size, zone)
72
77
  hash = { "Size" => size.to_s,
73
78
  "AvailabilityZone" => zone.to_s }
74
79
  # Get rig of empty snapshot: e8s guys do not like it
75
- hash["SnapshotId"] = snapshot_id.to_s unless snapshot_id.blank?
80
+ hash["SnapshotId"] = snapshot_id.to_s unless snapshot_id.right_blank?
76
81
  link = generate_request("CreateVolume", hash )
77
82
  request_info(link, QEc2CreateVolumeParser.new(:logger => @logger))
78
83
  rescue Exception
@@ -123,8 +128,8 @@ module RightAws
123
128
  #
124
129
  def detach_volume(volume_id, instance_id=nil, device=nil, force=nil)
125
130
  hash = { "VolumeId" => volume_id.to_s }
126
- hash["InstanceId"] = instance_id.to_s unless instance_id.blank?
127
- hash["Device"] = device.to_s unless device.blank?
131
+ hash["InstanceId"] = instance_id.to_s unless instance_id.right_blank?
132
+ hash["Device"] = device.to_s unless device.right_blank?
128
133
  hash["Force"] = 'true' if force
129
134
  #
130
135
  link = generate_request("DetachVolume", hash)
@@ -138,13 +143,20 @@ module RightAws
138
143
  # EBS: Snapshots
139
144
  #-----------------------------------------------------------------
140
145
 
141
- # Describe all EBS snapshots.
146
+ # Describe EBS snapshots.
142
147
  #
143
- # ec2.describe_snapshots #=>
148
+ # Accepts a list of snapshots and/or options: :restorable_by, :owner and :filters
149
+ #
150
+ # Options: :restorable_by => Array or String, :owner => Array or String, :filters => Hash
151
+ #
152
+ # Filters: description, owner-alias, owner-id, progress, snapshot-id, start-time, status, tag-key,
153
+ # tag-value, tag:key, volume-id, volume-size
154
+ #
155
+ # ec2.describe_snapshots #=>
144
156
  # [ {:aws_volume_id=>"vol-545fac3d",
145
157
  # :aws_description=>"Wikipedia XML Backups (Linux)",
146
158
  # :aws_progress=>"100%",
147
- # :aws_started_at=>Mon Sep 28 23:49:50 UTC 2009,
159
+ # :aws_started_at=>"2009-09-28T23:49:50.000Z",
148
160
  # :aws_owner=>"amazon",
149
161
  # :aws_id=>"snap-8041f2e9",
150
162
  # :aws_volume_size=>500,
@@ -152,25 +164,29 @@ module RightAws
152
164
  # {:aws_volume_id=>"vol-185fac71",
153
165
  # :aws_description=>"Sloan Digital Sky Survey DR6 Subset (Linux)",
154
166
  # :aws_progress=>"100%",
155
- # :aws_started_at=>Mon Sep 28 23:56:10 UTC 2009,
167
+ # :aws_started_at=>"2009-09-28T23:56:10.000Z",
156
168
  # :aws_owner=>"amazon",
157
169
  # :aws_id=>"snap-3740f35e",
158
170
  # :aws_volume_size=>180,
159
171
  # :aws_status=>"completed"}, ...]
160
172
  #
161
- def describe_snapshots(list=[])
162
- link = generate_request("DescribeSnapshots",
163
- amazonize_list('SnapshotId',list.to_a))
164
- request_cache_or_info :describe_snapshots, link, QEc2DescribeSnapshotsParser, @@bench, list.blank?
165
- rescue Exception
166
- on_exception
173
+ # ec2.describe_snapshots("snap-e676e28a", "snap-e176e281")
174
+ #
175
+ # ec2.describe_snapshots(:restorable_by => ['123456781234'],
176
+ # :owner => ['self', 'amazon'],
177
+ # :filters => {'tag:MyTag' => 'MyValue'})
178
+ #
179
+ # P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeSnapshots.html
180
+ #
181
+ def describe_snapshots(*list_and_options)
182
+ describe_resources_with_list_and_options('DescribeSnapshots', 'SnapshotId', QEc2DescribeSnapshotsParser, list_and_options)
167
183
  end
168
184
 
169
185
  # Create a snapshot of specified volume.
170
186
  #
171
187
  # ec2.create_snapshot('vol-898a6fe0', 'KD: WooHoo!!') #=>
172
188
  # {:aws_volume_id=>"vol-e429db8d",
173
- # :aws_started_at=>Thu Oct 01 09:23:38 UTC 2009,
189
+ # :aws_started_at=>"2009-10-01T09:23:38.000Z",
174
190
  # :aws_description=>"KD: WooHoo!!",
175
191
  # :aws_owner=>"648770000000",
176
192
  # :aws_progress=>"",
@@ -194,7 +210,7 @@ module RightAws
194
210
  #
195
211
  # ec2.try_create_snapshot('vol-898a6fe0', 'KD: WooHoo!!') #=>
196
212
  # {:aws_volume_id=>"vol-e429db8d",
197
- # :aws_started_at=>Thu Oct 01 09:23:38 UTC 2009,
213
+ # :aws_started_at=>"2009-10-01T09:23:38.000Z",
198
214
  # :aws_description=>"KD: WooHoo!!",
199
215
  # :aws_owner=>"648770000000",
200
216
  # :aws_progress=>"",
@@ -270,8 +286,8 @@ module RightAws
270
286
  params = {'SnapshotId' => snapshot_id,
271
287
  'Attribute' => attribute,
272
288
  'OperationType' => operation_type}
273
- params.update(amazonize_list('UserId', vars[:user_id].to_a)) if vars[:user_id]
274
- params.update(amazonize_list('UserGroup', vars[:user_group].to_a)) if vars[:user_group]
289
+ params.update(amazonize_list('UserId', Array(vars[:user_id]))) if vars[:user_id]
290
+ params.update(amazonize_list('UserGroup', Array(vars[:user_group]))) if vars[:user_group]
275
291
  link = generate_request("ModifySnapshotAttribute", params)
276
292
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
277
293
  rescue Exception
@@ -300,7 +316,7 @@ module RightAws
300
316
  #
301
317
  def modify_snapshot_attribute_create_volume_permission_add_groups(snapshot_id, *user_group)
302
318
  user_group.flatten!
303
- user_group = ['all'] if user_group.blank?
319
+ user_group = ['all'] if user_group.right_blank?
304
320
  modify_snapshot_attribute(snapshot_id, 'createVolumePermission', 'add', :user_group => user_group )
305
321
  end
306
322
 
@@ -310,7 +326,7 @@ module RightAws
310
326
  #
311
327
  def modify_snapshot_attribute_create_volume_permission_remove_groups(snapshot_id, *user_group)
312
328
  user_group.flatten!
313
- user_group = ['all'] if user_group.blank?
329
+ user_group = ['all'] if user_group.right_blank?
314
330
  modify_snapshot_attribute(snapshot_id, 'createVolumePermission', 'remove', :user_group => user_group )
315
331
  end
316
332
 
@@ -335,9 +351,9 @@ module RightAws
335
351
  case name
336
352
  when 'volumeId' then @result[:aws_id] = @text
337
353
  when 'status' then @result[:aws_status] = @text
338
- when 'createTime' then @result[:aws_created_at] = Time.parse(@text)
354
+ when 'createTime' then @result[:aws_created_at] = @text
339
355
  when 'size' then @result[:aws_size] = @text.to_i ###
340
- when 'snapshotId' then @result[:snapshot_id] = @text.blank? ? nil : @text ###
356
+ when 'snapshotId' then @result[:snapshot_id] = @text.right_blank? ? nil : @text ###
341
357
  when 'availabilityZone' then @result[:zone] = @text ###
342
358
  end
343
359
  end
@@ -353,7 +369,7 @@ module RightAws
353
369
  when 'instanceId' then @result[:aws_instance_id] = @text
354
370
  when 'device' then @result[:aws_device] = @text
355
371
  when 'status' then @result[:aws_attachment_status] = @text
356
- when 'attachTime' then @result[:aws_attached_at] = Time.parse(@text)
372
+ when 'attachTime' then @result[:aws_attached_at] = @text
357
373
  end
358
374
  end
359
375
  def reset
@@ -363,34 +379,30 @@ module RightAws
363
379
 
364
380
  class QEc2DescribeVolumesParser < RightAWSParser #:nodoc:
365
381
  def tagstart(name, attributes)
366
- case name
367
- when 'item'
368
- case @xmlpath
369
- when 'DescribeVolumesResponse/volumeSet' then @volume = {}
370
- end
382
+ case full_tag_name
383
+ when %r{volumeSet/item$} then @item = { :tags => {} }
384
+ when %r{/tagSet/item$} then @aws_tag = {}
371
385
  end
372
386
  end
373
387
  def tagend(name)
374
388
  case name
375
- when 'volumeId'
376
- case @xmlpath
377
- when 'DescribeVolumesResponse/volumeSet/item' then @volume[:aws_id] = @text
378
- end
379
- when 'status'
380
- case @xmlpath
381
- when 'DescribeVolumesResponse/volumeSet/item' then @volume[:aws_status] = @text
382
- when 'DescribeVolumesResponse/volumeSet/item/attachmentSet/item' then @volume[:aws_attachment_status] = @text
383
- end
384
- when 'size' then @volume[:aws_size] = @text.to_i
385
- when 'createTime' then @volume[:aws_created_at] = Time.parse(@text)
386
- when 'instanceId' then @volume[:aws_instance_id] = @text
387
- when 'device' then @volume[:aws_device] = @text
388
- when 'attachTime' then @volume[:aws_attached_at] = Time.parse(@text)
389
- when 'snapshotId' then @volume[:snapshot_id] = @text.blank? ? nil : @text
390
- when 'availabilityZone' then @volume[:zone] = @text
391
- when 'item'
392
- case @xmlpath
393
- when 'DescribeVolumesResponse/volumeSet' then @result << @volume
389
+ when 'size' then @item[:aws_size] = @text.to_i
390
+ when 'createTime' then @item[:aws_created_at] = @text
391
+ when 'instanceId' then @item[:aws_instance_id] = @text
392
+ when 'device' then @item[:aws_device] = @text
393
+ when 'attachTime' then @item[:aws_attached_at] = @text
394
+ when 'snapshotId' then @item[:snapshot_id] = @text.right_blank? ? nil : @text
395
+ when 'availabilityZone' then @item[:zone] = @text
396
+ when 'deleteOnTermination' then @item[:delete_on_termination] = (@text == 'true')
397
+ else
398
+ case full_tag_name
399
+ when %r{/volumeSet/item/volumeId$} then @item[:aws_id] = @text
400
+ when %r{/volumeSet/item/status$} then @item[:aws_status] = @text
401
+ when %r{/attachmentSet/item/status$} then @item[:aws_attachment_status] = @text
402
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
403
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
404
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
405
+ when %r{/volumeSet/item$} then @result << @item
394
406
  end
395
407
  end
396
408
  end
@@ -405,25 +417,33 @@ module RightAws
405
417
 
406
418
  class QEc2DescribeSnapshotsParser < RightAWSParser #:nodoc:
407
419
  def tagstart(name, attributes)
408
- case name
409
- when *@each then @snapshot = {}
420
+ case full_tag_name
421
+ when %r{CreateSnapshotResponse$},
422
+ %r{/snapshotSet/item$} then @item = { :tags => {} }
423
+ when %r{/tagSet/item$} then @aws_tag = {}
410
424
  end
411
425
  end
412
426
  def tagend(name)
413
427
  case name
414
- when 'volumeId' then @snapshot[:aws_volume_id] = @text
415
- when 'snapshotId' then @snapshot[:aws_id] = @text
416
- when 'status' then @snapshot[:aws_status] = @text
417
- when 'startTime' then @snapshot[:aws_started_at] = Time.parse(@text)
418
- when 'progress' then @snapshot[:aws_progress] = @text
419
- when 'description' then @snapshot[:aws_description] = @text
420
- when 'ownerId' then @snapshot[:aws_owner] = @text
421
- when 'volumeSize' then @snapshot[:aws_volume_size] = @text.to_i
422
- when *@each then @result << @snapshot
428
+ when 'volumeId' then @item[:aws_volume_id] = @text
429
+ when 'snapshotId' then @item[:aws_id] = @text
430
+ when 'status' then @item[:aws_status] = @text
431
+ when 'startTime' then @item[:aws_started_at] = @text
432
+ when 'progress' then @item[:aws_progress] = @text
433
+ when 'description' then @item[:aws_description] = @text
434
+ when 'ownerId' then @item[:aws_owner] = @text
435
+ when 'volumeSize' then @item[:aws_volume_size] = @text.to_i
436
+ else
437
+ case full_tag_name
438
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
439
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
440
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
441
+ when %r{CreateSnapshotResponse$},
442
+ %r{/snapshotSet/item$} then @result << @item
443
+ end
423
444
  end
424
445
  end
425
446
  def reset
426
- @each = ['item', 'CreateSnapshotResponse']
427
447
  @result = []
428
448
  end
429
449
  end
@@ -35,32 +35,28 @@ module RightAws
35
35
  # 'Owner' => ['self', ..., 'userN'],
36
36
  # 'ExecutableBy' => ['self', 'all', ..., 'userN']
37
37
  # }
38
- def ec2_describe_images(params={}, image_type=nil, cache_for=nil) #:nodoc:
38
+ def ec2_describe_images(params={}, options={}, cache_for=nil) #:nodoc:
39
39
  request_hash = {}
40
- params.each do |list_by, list|
41
- request_hash.merge! amazonize_list(list_by, list.to_a)
42
- end
43
- request_hash['ImageType'] = image_type if image_type
40
+ params.each { |list_by, list| request_hash.merge! amazonize_list(list_by, Array(list)) }
41
+ request_hash.merge!(amazonize_list(['Filter.?.Name', 'Filter.?.Value.?'], options[:filters])) unless options[:filters].right_blank?
44
42
  link = generate_request("DescribeImages", request_hash)
45
43
  request_cache_or_info cache_for, link, QEc2DescribeImagesParser, @@bench, cache_for
46
44
  rescue Exception
47
45
  on_exception
48
46
  end
49
47
 
50
- # Retrieve a list of images. Returns array of hashes describing the images or an exception:
51
- # +image_type+ = 'machine' || 'kernel' || 'ramdisk'
48
+ # Retrieve a list of images.
49
+ #
50
+ # Accepts a list of images and/or a set of filters as the last parameter.
51
+ #
52
+ # Filters: architecture, block-device-mapping.delete-on-termination block-device-mapping.device-name,
53
+ # block-device-mapping.snapshot-id, block-device-mapping.volume-size, description, image-id, image-type,
54
+ # is-public, kernel-id, manifest-location, name, owner-alias, owner-id, platform, product-code,
55
+ # ramdisk-id, root-device-name, root-device-type, state, state-reason-code, state-reason-message,
56
+ # tag-key, tag-value, tag:key, virtualization-type
52
57
  #
53
58
  # ec2.describe_images #=>
54
- # [{:aws_id=>"ami-b0a1f7a6",
55
- # :aws_image_type=>"machine",
56
- # :root_device_name=>"/dev/sda1",
57
- # :image_class=>"static",
58
- # :aws_owner=>"826693181925",
59
- # :aws_location=>"bucket_for_k_dzreyev/image_bundles/kd__CentOS_1_10_2009_10_21_13_30_43_MSD/image.manifest.xml",
60
- # :aws_state=>"available",
61
- # :aws_is_public=>false,
62
- # :aws_architecture=>"i386"},
63
- # {:description=>"EBS backed Fedora core 8 i386",
59
+ # [{:description=>"EBS backed Fedora core 8 i386",
64
60
  # :aws_architecture=>"i386",
65
61
  # :aws_id=>"ami-c2a3f5d4",
66
62
  # :aws_image_type=>"machine",
@@ -75,43 +71,79 @@ module RightAws
75
71
  # :device_name=>"/dev/sda1"}],
76
72
  # :name=>"EBS backed FC8 i386",
77
73
  # :aws_is_public=>true}, ... ]
78
- #
79
- # If +list+ param is set, then retrieve information about the listed images only:
80
74
  #
81
- # ec2.describe_images(['ami-5aa1f74c'])
75
+ # ec2.describe_images(:filters => { 'image-type' => 'kernel', 'state' => 'available', 'tag:MyTag' => 'MyValue'})
76
+ #
77
+ # ec2.describe_images("ari-fda54b94", "ami-2ee80247", "aki-00896a69",
78
+ # :filters => { 'image-type' => 'kernel', 'state' => 'available' }) #=>
79
+ # [{:root_device_type=>"instance-store",
80
+ # :aws_id=>"aki-00896a69",
81
+ # :aws_image_type=>"kernel",
82
+ # :aws_location=>
83
+ # "karmic-kernel-zul/ubuntu-kernel-2.6.31-300-ec2-i386-20091002-test-04.manifest.xml",
84
+ # :virtualization_type=>"paravirtual",
85
+ # :aws_state=>"available",
86
+ # :aws_owner=>"099720109477",
87
+ # :tags=>{},
88
+ # :aws_is_public=>true,
89
+ # :aws_architecture=>"i386"}]
90
+ #
91
+ # P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeImages.html
82
92
  #
83
- def describe_images(list=[], image_type=nil)
84
- list = list.to_a
85
- cache_for = list.empty? && !image_type ? :describe_images : nil
86
- ec2_describe_images({ 'ImageId' => list }, image_type, cache_for)
93
+ def describe_images(*list_and_options)
94
+ list, options = AwsUtils::split_items_and_params(list_and_options)
95
+ cache_for = (list.right_blank? && options[:filters].right_blank?) ? :describe_images : nil
96
+ ec2_describe_images( {'ImageId'=>list}, options, cache_for)
87
97
  end
88
98
 
89
- # Example:
99
+ # Retrieve a list of images by image owner.
100
+ #
101
+ # Accepts a list of images and/or a set of filters as the last parameter.
102
+ #
103
+ # Filters: architecture, block-device-mapping.delete-on-termination block-device-mapping.device-name,
104
+ # block-device-mapping.snapshot-id, block-device-mapping.volume-size, description, image-id, image-type,
105
+ # is-public, kernel-id, manifest-location, name, owner-alias, owner-id, platform, product-code,
106
+ # ramdisk-id, root-device-name, root-device-type, state, state-reason-code, state-reason-message,
107
+ # tag-key, tag-value, tag:key, virtualization-type
90
108
  #
91
109
  # ec2.describe_images_by_owner('522821470517')
92
- # ec2.describe_images_by_owner('self')
110
+ # ec2.describe_images_by_owner('self', :filters => { 'block-device-mapping.delete-on-termination' => 'false' })
93
111
  #
94
- def describe_images_by_owner(list=['self'], image_type=nil)
95
- list = list.to_a
96
- cache_for = list==['self'] && !image_type ? :describe_images_by_owner : nil
97
- ec2_describe_images({ 'Owner' => list }, image_type, cache_for)
112
+ # P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeImages.html
113
+ #
114
+ def describe_images_by_owner(*list_and_options)
115
+ list, options = AwsUtils::split_items_and_params(list_and_options)
116
+ list = ['self'] if list.right_blank?
117
+ cache_for = (list==['self'] && options[:filters].right_blank?) ? :describe_images_by_owner : nil
118
+ ec2_describe_images( {'Owner'=>list}, options, cache_for)
98
119
  end
99
120
 
100
- # Example:
121
+ # Retrieve a list of images by image executable by.
122
+ #
123
+ # Accepts a list of images and/or a set of filters as the last parameter.
124
+ #
125
+ # Filters: architecture, block-device-mapping.delete-on-termination block-device-mapping.device-name,
126
+ # block-device-mapping.snapshot-id, block-device-mapping.volume-size, description, image-id, image-type,
127
+ # is-public, kernel-id, manifest-location, name, owner-alias, owner-id, platform, product-code,
128
+ # ramdisk-id, root-device-name, root-device-type, state, state-reason-code, state-reason-message,
129
+ # tag-key, tag-value, tag:key, virtualization-type
101
130
  #
102
131
  # ec2.describe_images_by_executable_by('522821470517')
103
132
  # ec2.describe_images_by_executable_by('self')
104
- # ec2.describe_images_by_executable_by('all')
133
+ # ec2.describe_images_by_executable_by('all', :filters => { 'architecture' => 'i386' })
134
+ #
135
+ # P.S. filters: http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/index.html?ApiReference-query-DescribeImages.html
105
136
  #
106
- def describe_images_by_executable_by(list=['self'], image_type=nil)
107
- list = list.to_a
108
- cache_for = list==['self'] && !image_type ? :describe_images_by_executable_by : nil
109
- ec2_describe_images({ 'ExecutableBy' => list }, image_type, cache_for)
137
+ def describe_images_by_executable_by(*list_and_options)
138
+ list, options = AwsUtils::split_items_and_params(list_and_options)
139
+ list = ['self'] if list.right_blank?
140
+ cache_for = (list==['self'] && options[:filters].right_blank?) ? :describe_images_by_executable_by : nil
141
+ ec2_describe_images( {'ExecutableBy'=>list}, options, cache_for)
110
142
  end
111
143
 
112
-
113
144
  # Register new image at Amazon.
114
- # Options: :image_location, :name, :description, :architecture, :kernel_id, :ramdisk_id, :root_device_name, :block_device_mappings.
145
+ # Options: :image_location, :name, :description, :architecture, :kernel_id, :ramdisk_id,
146
+ # :root_device_name, :block_device_mappings, :virtualizationt_type(hvm|paravirtual)
115
147
  #
116
148
  # Returns new image id.
117
149
  #
@@ -148,6 +180,7 @@ module RightAws
148
180
  params['KernelId'] = options[:kernel_id] if options[:kernel_id]
149
181
  params['RamdiskId'] = options[:ramdisk_id] if options[:ramdisk_id]
150
182
  params['RootDeviceName'] = options[:root_device_name] if options[:root_device_name]
183
+ params['VirtualizationType'] = options[:virtualization_type] if options[:virtualization_type]
151
184
  # params['SnapshotId'] = options[:snapshot_id] if options[:snapshot_id]
152
185
  params.merge!(amazonize_block_device_mappings(options[:block_device_mappings]))
153
186
  link = generate_request("RegisterImage", params)
@@ -209,9 +242,9 @@ module RightAws
209
242
  params = {'ImageId' => image_id,
210
243
  'Attribute' => attribute}
211
244
  params['OperationType'] = operation_type if operation_type
212
- params.update(amazonize_list('UserId', vars[:user_id].to_a)) if vars[:user_id]
213
- params.update(amazonize_list('UserGroup', vars[:user_group].to_a)) if vars[:user_group]
214
- params.update(amazonize_list('ProductCode', vars[:product_code])) if vars[:product_code]
245
+ params.update(amazonize_list('UserId', vars[:user_id])) if vars[:user_id]
246
+ params.update(amazonize_list('UserGroup', vars[:user_group])) if vars[:user_group]
247
+ params.update(amazonize_list('ProductCode', vars[:product_code])) if vars[:product_code]
215
248
  link = generate_request("ModifyImageAttribute", params)
216
249
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
217
250
  rescue Exception
@@ -224,7 +257,7 @@ module RightAws
224
257
  #
225
258
  # ec2.modify_image_launch_perm_add_users('ami-e444444d',['000000000777','000000000778']) #=> true
226
259
  def modify_image_launch_perm_add_users(image_id, user_id=[])
227
- modify_image_attribute(image_id, 'launchPermission', 'add', :user_id => user_id.to_a)
260
+ modify_image_attribute(image_id, 'launchPermission', 'add', :user_id => user_id)
228
261
  end
229
262
 
230
263
  # Revokes image launch permissions for users. +user_id+ is a list of users AWS accounts ids. Returns +true+ or an exception.
@@ -232,7 +265,7 @@ module RightAws
232
265
  # ec2.modify_image_launch_perm_remove_users('ami-e444444d',['000000000777','000000000778']) #=> true
233
266
  #
234
267
  def modify_image_launch_perm_remove_users(image_id, user_id=[])
235
- modify_image_attribute(image_id, 'launchPermission', 'remove', :user_id => user_id.to_a)
268
+ modify_image_attribute(image_id, 'launchPermission', 'remove', :user_id => user_id)
236
269
  end
237
270
 
238
271
  # Add image launch permissions for users groups (currently only 'all' is supported, which gives public launch permissions).
@@ -241,7 +274,7 @@ module RightAws
241
274
  # ec2.modify_image_launch_perm_add_groups('ami-e444444d') #=> true
242
275
  #
243
276
  def modify_image_launch_perm_add_groups(image_id, user_group=['all'])
244
- modify_image_attribute(image_id, 'launchPermission', 'add', :user_group => user_group.to_a)
277
+ modify_image_attribute(image_id, 'launchPermission', 'add', :user_group => user_group)
245
278
  end
246
279
 
247
280
  # Remove image launch permissions for users groups (currently only 'all' is supported, which gives public launch permissions).
@@ -249,7 +282,7 @@ module RightAws
249
282
  # ec2.modify_image_launch_perm_remove_groups('ami-e444444d') #=> true
250
283
  #
251
284
  def modify_image_launch_perm_remove_groups(image_id, user_group=['all'])
252
- modify_image_attribute(image_id, 'launchPermission', 'remove', :user_group => user_group.to_a)
285
+ modify_image_attribute(image_id, 'launchPermission', 'remove', :user_group => user_group)
253
286
  end
254
287
 
255
288
  # Add product code to image
@@ -257,7 +290,7 @@ module RightAws
257
290
  # ec2.modify_image_product_code('ami-e444444d','0ABCDEF') #=> true
258
291
  #
259
292
  def modify_image_product_code(image_id, product_code=[])
260
- modify_image_attribute(image_id, 'productCodes', nil, :product_code => product_code.to_a)
293
+ modify_image_attribute(image_id, 'productCodes', nil, :product_code => product_code)
261
294
  end
262
295
 
263
296
  # Create a new image.
@@ -269,8 +302,8 @@ module RightAws
269
302
  #
270
303
  def create_image(instance_aws_id, options={})
271
304
  params = { 'InstanceId' => instance_aws_id }
272
- params['Name'] = options[:name] unless options[:name].blank?
273
- params['Description'] = options[:description] unless options[:description].blank?
305
+ params['Name'] = options[:name] unless options[:name].right_blank?
306
+ params['Description'] = options[:description] unless options[:description].right_blank?
274
307
  params['NoReboot'] = options[:no_reboot].to_s unless options[:no_reboot].nil?
275
308
  link = generate_request("CreateImage", params)
276
309
  request_info(link, QEc2RegisterImageParser.new(:logger => @logger))
@@ -283,10 +316,13 @@ module RightAws
283
316
  class QEc2DescribeImagesParser < RightAWSParser #:nodoc:
284
317
  def tagstart(name, attributes)
285
318
  case full_tag_name
286
- when %r{/imagesSet/item$} then @item = {}
319
+ when %r{/imagesSet/item$}
320
+ @item = { :tags => {} }
287
321
  when %r{/blockDeviceMapping/item$}
288
322
  @item[:block_device_mappings] ||= []
289
323
  @block_device_mapping = {}
324
+ when %r{/tagSet/item$}
325
+ @aws_tag = {}
290
326
  end
291
327
  end
292
328
  def tagend(name)
@@ -308,6 +344,7 @@ module RightAws
308
344
  when 'rootDeviceType' then @item[:root_device_type] = @text
309
345
  when 'rootDeviceName' then @item[:root_device_name] = @text
310
346
  when 'imageClass' then @item[:image_class] = @text
347
+ when 'virtualizationType' then @item[:virtualization_type] = @text
311
348
  else
312
349
  case full_tag_name
313
350
  when %r{/stateReason/code$} then @item[:state_reason_code] = @text.to_i
@@ -321,7 +358,10 @@ module RightAws
321
358
  when 'deleteOnTermination' then @block_device_mapping[:ebs_delete_on_termination] = @text == 'true' ? true : false
322
359
  when 'item' then @item[:block_device_mappings] << @block_device_mapping
323
360
  end
324
- when %r{/imagesSet/item$} then @result << @item
361
+ when %r{/tagSet/item/key$} then @aws_tag[:key] = @text
362
+ when %r{/tagSet/item/value$} then @aws_tag[:value] = @text
363
+ when %r{/tagSet/item$} then @item[:tags][@aws_tag[:key]] = @aws_tag[:value]
364
+ when %r{/imagesSet/item$} then @result << @item
325
365
  end
326
366
  end
327
367
  end