awsum 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. data/.autotest +1 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +15 -0
  5. data/Gemfile.lock +44 -0
  6. data/LICENSE +19 -0
  7. data/README.rdoc +42 -0
  8. data/Rakefile +75 -0
  9. data/awsum.gemspec +199 -0
  10. data/lib/awsum.rb +20 -0
  11. data/lib/awsum/ec2.rb +741 -0
  12. data/lib/awsum/ec2/address.rb +67 -0
  13. data/lib/awsum/ec2/availability_zone.rb +16 -0
  14. data/lib/awsum/ec2/image.rb +62 -0
  15. data/lib/awsum/ec2/instance.rb +57 -0
  16. data/lib/awsum/ec2/keypair.rb +16 -0
  17. data/lib/awsum/ec2/parsers/address_parser.rb +61 -0
  18. data/lib/awsum/ec2/parsers/availability_zone_parser.rb +57 -0
  19. data/lib/awsum/ec2/parsers/image_parser.rb +74 -0
  20. data/lib/awsum/ec2/parsers/instance_parser.rb +90 -0
  21. data/lib/awsum/ec2/parsers/keypair_parser.rb +64 -0
  22. data/lib/awsum/ec2/parsers/purchase_reserved_instances_offering_parser.rb +34 -0
  23. data/lib/awsum/ec2/parsers/region_parser.rb +56 -0
  24. data/lib/awsum/ec2/parsers/register_image_parser.rb +34 -0
  25. data/lib/awsum/ec2/parsers/reserved_instance_parser.rb +64 -0
  26. data/lib/awsum/ec2/parsers/reserved_instances_offering_parser.rb +63 -0
  27. data/lib/awsum/ec2/parsers/security_group_parser.rb +106 -0
  28. data/lib/awsum/ec2/parsers/snapshot_parser.rb +64 -0
  29. data/lib/awsum/ec2/parsers/volume_parser.rb +77 -0
  30. data/lib/awsum/ec2/region.rb +54 -0
  31. data/lib/awsum/ec2/reserved_instance.rb +24 -0
  32. data/lib/awsum/ec2/reserved_instances_offering.rb +20 -0
  33. data/lib/awsum/ec2/security_group.rb +74 -0
  34. data/lib/awsum/ec2/snapshot.rb +23 -0
  35. data/lib/awsum/ec2/volume.rb +65 -0
  36. data/lib/awsum/error.rb +53 -0
  37. data/lib/awsum/net_fix.rb +100 -0
  38. data/lib/awsum/parser.rb +18 -0
  39. data/lib/awsum/requestable.rb +216 -0
  40. data/lib/awsum/s3.rb +220 -0
  41. data/lib/awsum/s3/bucket.rb +28 -0
  42. data/lib/awsum/s3/headers.rb +24 -0
  43. data/lib/awsum/s3/object.rb +138 -0
  44. data/lib/awsum/s3/parsers/bucket_parser.rb +43 -0
  45. data/lib/awsum/support.rb +94 -0
  46. data/spec/fixtures/ec2/addresses.xml +10 -0
  47. data/spec/fixtures/ec2/allocate_address.xml +5 -0
  48. data/spec/fixtures/ec2/associate_address.xml +5 -0
  49. data/spec/fixtures/ec2/attach_volume.xml +9 -0
  50. data/spec/fixtures/ec2/authorize_ip_access.xml +5 -0
  51. data/spec/fixtures/ec2/authorize_owner_group_access.xml +5 -0
  52. data/spec/fixtures/ec2/authorize_owner_group_access_error.xml +2 -0
  53. data/spec/fixtures/ec2/availability_zones.xml +16 -0
  54. data/spec/fixtures/ec2/available_volume.xml +14 -0
  55. data/spec/fixtures/ec2/create_key_pair.xml +29 -0
  56. data/spec/fixtures/ec2/create_security_group.xml +5 -0
  57. data/spec/fixtures/ec2/create_snapshot.xml +9 -0
  58. data/spec/fixtures/ec2/create_volume.xml +10 -0
  59. data/spec/fixtures/ec2/delete_key_pair.xml +5 -0
  60. data/spec/fixtures/ec2/delete_security_group.xml +5 -0
  61. data/spec/fixtures/ec2/delete_snapshot.xml +5 -0
  62. data/spec/fixtures/ec2/delete_volume.xml +5 -0
  63. data/spec/fixtures/ec2/deregister_image.xml +5 -0
  64. data/spec/fixtures/ec2/detach_volume.xml +9 -0
  65. data/spec/fixtures/ec2/disassociate_address.xml +5 -0
  66. data/spec/fixtures/ec2/image.xml +15 -0
  67. data/spec/fixtures/ec2/images.xml +77 -0
  68. data/spec/fixtures/ec2/instance.xml +36 -0
  69. data/spec/fixtures/ec2/instances.xml +88 -0
  70. data/spec/fixtures/ec2/internal_error.xml +2 -0
  71. data/spec/fixtures/ec2/invalid_amiid_error.xml +2 -0
  72. data/spec/fixtures/ec2/invalid_request_error.xml +2 -0
  73. data/spec/fixtures/ec2/key_pairs.xml +10 -0
  74. data/spec/fixtures/ec2/purchase_reserved_instances_offering.xml +5 -0
  75. data/spec/fixtures/ec2/purchase_reserved_instances_offerings.xml +6 -0
  76. data/spec/fixtures/ec2/regions.xml +14 -0
  77. data/spec/fixtures/ec2/register_image.xml +5 -0
  78. data/spec/fixtures/ec2/release_address.xml +5 -0
  79. data/spec/fixtures/ec2/reserved_instances.xml +18 -0
  80. data/spec/fixtures/ec2/reserved_instances_offering.xml +15 -0
  81. data/spec/fixtures/ec2/reserved_instances_offerings.xml +276 -0
  82. data/spec/fixtures/ec2/revoke_ip_access.xml +5 -0
  83. data/spec/fixtures/ec2/revoke_owner_group_access.xml +5 -0
  84. data/spec/fixtures/ec2/run_instances.xml +30 -0
  85. data/spec/fixtures/ec2/security_groups.xml +159 -0
  86. data/spec/fixtures/ec2/snapshots.xml +13 -0
  87. data/spec/fixtures/ec2/terminate_instances.xml +17 -0
  88. data/spec/fixtures/ec2/unassociated_address.xml +10 -0
  89. data/spec/fixtures/ec2/volumes.xml +23 -0
  90. data/spec/fixtures/errors/invalid_parameter_value.xml +2 -0
  91. data/spec/fixtures/s3/buckets.xml +2 -0
  92. data/spec/fixtures/s3/copy_failure.xml +23 -0
  93. data/spec/fixtures/s3/invalid_request_signature.xml +5 -0
  94. data/spec/fixtures/s3/keys.xml +2 -0
  95. data/spec/lib/awsum/ec2/address_spec.rb +149 -0
  96. data/spec/lib/awsum/ec2/availability_zones_spec.rb +21 -0
  97. data/spec/lib/awsum/ec2/image_spec.rb +92 -0
  98. data/spec/lib/awsum/ec2/instance_spec.rb +125 -0
  99. data/spec/lib/awsum/ec2/keypair_spec.rb +55 -0
  100. data/spec/lib/awsum/ec2/parsers/address_parser_spec.rb +51 -0
  101. data/spec/lib/awsum/ec2/parsers/availability_zone_parser_spec.rb +28 -0
  102. data/spec/lib/awsum/ec2/parsers/image_parser_spec.rb +66 -0
  103. data/spec/lib/awsum/ec2/parsers/instance_parser_spec.rb +75 -0
  104. data/spec/lib/awsum/ec2/parsers/keypair_parser_spec.rb +74 -0
  105. data/spec/lib/awsum/ec2/parsers/purchase_reserved_instances_offering_parser_spec.rb +14 -0
  106. data/spec/lib/awsum/ec2/parsers/region_parser_spec.rb +27 -0
  107. data/spec/lib/awsum/ec2/parsers/register_image_parser_spec.rb +15 -0
  108. data/spec/lib/awsum/ec2/parsers/reserved_instance_parser_spec.rb +35 -0
  109. data/spec/lib/awsum/ec2/parsers/reserved_instances_offering_parser_spec.rb +32 -0
  110. data/spec/lib/awsum/ec2/parsers/security_group_parser_spec.rb +78 -0
  111. data/spec/lib/awsum/ec2/parsers/snapshot_parser_spec.rb +30 -0
  112. data/spec/lib/awsum/ec2/parsers/volume_parser_spec.rb +35 -0
  113. data/spec/lib/awsum/ec2/region_spec.rb +73 -0
  114. data/spec/lib/awsum/ec2/reserved_instance_spec.rb +61 -0
  115. data/spec/lib/awsum/ec2/reserved_instances_offering_spec.rb +33 -0
  116. data/spec/lib/awsum/ec2/security_group_spec.rb +179 -0
  117. data/spec/lib/awsum/ec2/snapshots_spec.rb +69 -0
  118. data/spec/lib/awsum/ec2/volume_spec.rb +107 -0
  119. data/spec/lib/awsum/ec2_spec.rb +6 -0
  120. data/spec/lib/awsum/error_spec.rb +31 -0
  121. data/spec/lib/awsum/requestable_spec.rb +126 -0
  122. data/spec/lib/awsum/s3/bucket_spec.rb +95 -0
  123. data/spec/lib/awsum/s3/object_spec.rb +128 -0
  124. data/spec/lib/awsum/s3/parsers/bucket_parser_spec.rb +41 -0
  125. data/spec/lib/awsum/s3/parsers/object_parser_spec.rb +41 -0
  126. data/spec/spec_helper.rb +16 -0
  127. metadata +240 -0
@@ -0,0 +1,67 @@
1
+ require 'awsum/ec2/parsers/address_parser'
2
+
3
+ module Awsum
4
+ class Ec2
5
+ class Address
6
+ attr_reader :public_ip, :instance_id
7
+
8
+ def initialize(ec2, public_ip, instance_id) #:nodoc:
9
+ @ec2 = ec2
10
+ @public_ip = public_ip
11
+ @instance_id = instance_id
12
+ end
13
+
14
+ # Get the Instance associated with this address.
15
+ #
16
+ # Returns nil if no instance is associated.
17
+ def instance
18
+ @ec2.instance(@instance_id) if @instance_id
19
+ end
20
+
21
+ # Will associate this address with an instance
22
+ #
23
+ # Raises an error if the address is already associated with an instance
24
+ def associate(instance_id)
25
+ if @instance_id.nil?
26
+ @ec2.associate_address instance_id, @public_ip
27
+ else
28
+ raise 'Cannot associate with an already associated instance' #FIXME: Write a better Awsum error here'
29
+ end
30
+ end
31
+
32
+ # Will associate this address with an instance (even if it is already associated with another instance)
33
+ def associate!(instance_id)
34
+ @ec2.associate_address instance_id, @public_ip
35
+ end
36
+
37
+ # Will disassociate this address from it's instance
38
+ #
39
+ # Raises an error if the address is not associated with an instance
40
+ def disassociate
41
+ if @instance_id.nil?
42
+ raise 'Not associated' #FIXME: Write a better Awsum error here'
43
+ else
44
+ result = @ec2.disassociate_address @public_ip
45
+ @instance_id = nil
46
+ result
47
+ end
48
+ end
49
+
50
+ # Will release this address
51
+ #
52
+ # Raises an error if the address is associated with an instance
53
+ def release
54
+ if @instance_id.nil?
55
+ @ec2.release_address @public_ip
56
+ else
57
+ raise 'Associated with an instance' #FIXME: Write a better Awsum error here'
58
+ end
59
+ end
60
+
61
+ # Will release this address regardless of whether it is associated with an instance or not.
62
+ def release!
63
+ @ec2.release_address! @public_ip
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,16 @@
1
+ require 'awsum/ec2/parsers/availability_zone_parser'
2
+
3
+ module Awsum
4
+ class Ec2
5
+ class AvailabilityZone
6
+ attr_reader :name, :state, :region_name
7
+
8
+ def initialize(ec2, name, state, region_name) #:nodoc:
9
+ @ec2 = ec2
10
+ @name = name
11
+ @state = state
12
+ @region_name = region_name
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,62 @@
1
+ require 'awsum/ec2/parsers/image_parser.rb'
2
+ require 'awsum/ec2/parsers/register_image_parser.rb'
3
+
4
+ module Awsum
5
+ class Ec2
6
+ class Image
7
+ attr_reader :id, :location, :state, :owner, :public, :architecture, :type, :kernel_id, :ramdisk_id, :platform, :product_codes
8
+
9
+ def initialize(ec2, id, location, state, owner, public, architecture, type, kernel_id, ram_disk_id, platform, product_codes) #:nodoc:
10
+ @ec2 = ec2
11
+ @id = id
12
+ @location = location
13
+ @state = state
14
+ @owner = owner
15
+ @public = public
16
+ @architecture = architecture
17
+ @type = type
18
+ @kernel_id = kernel_id
19
+ @ramdisk_id = ram_disk_id
20
+ @platform = platform
21
+ @product_codes = product_codes
22
+ end
23
+
24
+ def public?
25
+ @public
26
+ end
27
+
28
+ # Deregister this Image
29
+ def deregister
30
+ @ec2.deregister_image @id
31
+ end
32
+
33
+ # Reregister this image
34
+ #
35
+ # Will both deregister and then register the Image again
36
+ def reregister
37
+ @ec2.deregister_image @id
38
+ new_id = @ec2.register_image @location
39
+ @id = new_id
40
+ self
41
+ end
42
+
43
+ # launches instances of this image
44
+ #
45
+ # ===Options:
46
+ # * <tt>:min</tt> - The minimum number of instances to launch. Default: 1
47
+ # * <tt>:max</tt> - The maximum number of instances to launch. Default: 1
48
+ # * <tt>:key_name</tt> - The name of the key pair with which to launch instances
49
+ # * <tt>:security_groups</tt> - The names of security groups to associate launched instances with
50
+ # * <tt>:user_data</tt> - User data made available to instances (Note: Must be 16K or less, will be base64 encoded by Awsum)
51
+ # * <tt>:instance_type</tt> - The size of the instances to launch, can be one of [m1.small, m1.large, m1.xlarge, c1.medium, c1.xlarge], default is m1.small
52
+ # * <tt>:availability_zone</tt> - The name of the availability zone to launch this instance in
53
+ # * <tt>:kernel_id</tt> - The ID of the kernel with which to launch instances
54
+ # * <tt>:ramdisk_id</tt> - The ID of the RAM disk with which to launch instances
55
+ # * <tt>:block_device_map</tt> - A 'hash' of mappings. E.g. {'instancestore0' => 'sdb'}
56
+ def run(options = {})
57
+ @ec2.run_instances(id, options)
58
+ end
59
+ alias_method :launch, :run
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,57 @@
1
+ require 'awsum/ec2/parsers/instance_parser.rb'
2
+
3
+ module Awsum
4
+ class Ec2
5
+ class Instance
6
+ attr_reader :id, :image_id, :type, :state, :dns_name, :private_dns_name, :key_name, :kernel_id, :launch_time, :availability_zone, :product_codes, :ramdisk_id, :reason, :launch_index
7
+
8
+ def initialize(ec2, id, image_id, type, state, dns_name, private_dns_name, key_name, kernel_id, launch_time, availability_zone, product_codes, ramdisk_id, reason, launch_index) #:nodoc:
9
+ @ec2 = ec2
10
+ @id = id
11
+ @image_id = image_id
12
+ @type = type
13
+ @state = state
14
+ @dns_name = dns_name
15
+ @private_dns_name = private_dns_name
16
+ @key_name = key_name
17
+ @kernel_id = kernel_id
18
+ @launch_time = launch_time
19
+ @availability_zone = availability_zone
20
+ @product_codes = product_codes
21
+ @ramdisk_id = ramdisk_id
22
+ @reason = reason
23
+ @launch_index = launch_index
24
+ end
25
+
26
+ # Terminates this instance
27
+ def terminate
28
+ @ec2.terminate_instances(id)
29
+ end
30
+
31
+ # Lists all the Volume(s) attached to this Instance
32
+ def volumes
33
+ volumes = @ec2.volumes
34
+ volumes.delete_if {|v| v.instance_id != id}
35
+ end
36
+
37
+ # Will create and attach a Volume to this Instance
38
+ # You must specify a size or a snapshot_id
39
+ def create_volume(size = nil, snapshot_id = nil, device = '/dev/sdh')
40
+ raise ArgumentError.new('You must specify a size if not creating a volume from a snapshot') if size.blank? && snapshot_id.blank?
41
+ raise ArgumentError.new('You must specify a device to attach the volume to') unless device
42
+
43
+ volume = @ec2.create_volume availability_zone, :size => size, :snapshot_id => snapshot_id
44
+ while volume.status != 'available'
45
+ volume.reload
46
+ end
47
+ attach volume, device
48
+ volume
49
+ end
50
+
51
+ # Will attach a Volume to this Instance
52
+ def attach(volume, device = '/dev/sdh')
53
+ @ec2.attach_volume volume.id, id, device
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,16 @@
1
+ require 'awsum/ec2/parsers/keypair_parser'
2
+
3
+ module Awsum
4
+ class Ec2
5
+ class KeyPair
6
+ attr_reader :name, :fingerprint, :material
7
+
8
+ def initialize(ec2, name, fingerprint, material)
9
+ @ec2 = ec2
10
+ @name = name
11
+ @fingerprint = fingerprint
12
+ @material = material
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,61 @@
1
+ module Awsum
2
+ class Ec2
3
+ class AddressParser < Awsum::Parser #:nodoc:
4
+ def initialize(ec2)
5
+ @ec2 = ec2
6
+ @addresses = []
7
+ @text = nil
8
+ @stack = []
9
+ end
10
+
11
+ def tag_start(tag, attributes)
12
+ #Quick hack so we can use the same parser for AllocateAddress which doesn't use the item tag to wrap the address information
13
+ if tag == 'AllocateAddressResponse'
14
+ @stack << 'addressesSet'
15
+ end
16
+
17
+ case tag
18
+ when 'addressesSet'
19
+ @stack << 'addressesSet'
20
+ when 'item', 'AllocateAddressResponse'
21
+ case @stack[-1]
22
+ when 'addressesSet'
23
+ @current = {}
24
+ end
25
+ end
26
+ @text = ''
27
+ end
28
+
29
+ def text(text)
30
+ @text << text unless @text.nil?
31
+ end
32
+
33
+ def tag_end(tag)
34
+ case tag
35
+ when 'DescribeAddressesResponse'
36
+ #no-op
37
+ when 'addressesSet'
38
+ @stack.pop
39
+ when 'item', 'AllocateAddressResponse'
40
+ case @stack[-1]
41
+ when 'addressesSet'
42
+ @addresses << Address.new(
43
+ @ec2,
44
+ @current['publicIp'],
45
+ @current['instanceId']
46
+ )
47
+ end
48
+ else
49
+ unless @text.nil? || @current.nil?
50
+ text = @text.strip
51
+ @current[tag] = (text == '' ? nil : text)
52
+ end
53
+ end
54
+ end
55
+
56
+ def result
57
+ @addresses
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,57 @@
1
+ module Awsum
2
+ class Ec2
3
+ class AvailabilityZoneParser < Awsum::Parser #:nodoc:
4
+ def initialize(ec2)
5
+ @ec2 = ec2
6
+ @availability_zones = []
7
+ @text = nil
8
+ @stack = []
9
+ end
10
+
11
+ def tag_start(tag, attributes)
12
+ case tag
13
+ when 'availabilityZoneInfo'
14
+ @stack << 'availabilityZoneInfo'
15
+ when 'item'
16
+ case @stack[-1]
17
+ when 'availabilityZoneInfo'
18
+ @current = {}
19
+ end
20
+ end
21
+ @text = ''
22
+ end
23
+
24
+ def text(text)
25
+ @text << text unless @text.nil?
26
+ end
27
+
28
+ def tag_end(tag)
29
+ case tag
30
+ when 'DescribeAvailabilityZonesResponse', 'requestId'
31
+ #no-op
32
+ when 'availabilityZoneInfo'
33
+ @stack.pop
34
+ when 'item'
35
+ case @stack[-1]
36
+ when 'availabilityZoneInfo'
37
+ @availability_zones << AvailabilityZone.new(
38
+ @ec2,
39
+ @current['zoneName'],
40
+ @current['zoneState'],
41
+ @current['regionName']
42
+ )
43
+ end
44
+ else
45
+ unless @text.nil? || @current.nil?
46
+ text = @text.strip
47
+ @current[tag] = (text == '' ? nil : text)
48
+ end
49
+ end
50
+ end
51
+
52
+ def result
53
+ @availability_zones
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,74 @@
1
+ module Awsum
2
+ class Ec2
3
+ class ImageParser < Awsum::Parser #:nodoc:
4
+ def initialize(ec2)
5
+ @ec2 = ec2
6
+ @images = []
7
+ @text = nil
8
+ @stack = []
9
+ end
10
+
11
+ def tag_start(tag, attributes)
12
+ case tag
13
+ when 'imagesSet'
14
+ @stack << 'imagesSet'
15
+ when 'item'
16
+ case @stack[-1]
17
+ when 'imagesSet'
18
+ @current = {}
19
+ @text = ''
20
+ when 'productCodes'
21
+ @product_codes = []
22
+ @text = ''
23
+ end
24
+ when 'productCodes'
25
+ @stack << 'productCodes'
26
+ end
27
+ end
28
+
29
+ def text(text)
30
+ @text << text unless @text.nil?
31
+ end
32
+
33
+ def tag_end(tag)
34
+ case tag
35
+ when 'DescribeImagesResponse', 'requestId'
36
+ #no-op
37
+ when 'imagesSet', 'productCodes'
38
+ @stack.pop
39
+ when 'item'
40
+ case @stack[-1]
41
+ when 'imagesSet'
42
+ @images << Image.new(
43
+ @ec2,
44
+ @current['imageId'],
45
+ @current['imageLocation'],
46
+ @current['imageState'],
47
+ @current['imageOwnerId'],
48
+ @current['isPublic'] == 'true',
49
+ @current['architecture'],
50
+ @current['imageType'],
51
+ @current['kernelId'],
52
+ @current['ramdiskId'],
53
+ @current['platform'],
54
+ @product_codes || []
55
+ )
56
+ @text = ''
57
+ end
58
+ when 'productCode'
59
+ @product_codes << @text.strip
60
+ else
61
+ unless @text.nil?
62
+ text = @text.strip
63
+ @current[tag] = (text == '' ? nil : text)
64
+ @text = ''
65
+ end
66
+ end
67
+ end
68
+
69
+ def result
70
+ @images
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,90 @@
1
+ module Awsum
2
+ class Ec2
3
+ class InstanceParser < Awsum::Parser #:nodoc:
4
+ def initialize(ec2)
5
+ @ec2 = ec2
6
+ @instances = []
7
+ @text = nil
8
+ @stack = []
9
+ @placement = nil
10
+ @state = nil
11
+ end
12
+
13
+ def tag_start(tag, attributes)
14
+ case tag
15
+ when 'reservationSet'
16
+ @stack << 'reservationSet'
17
+ when 'instancesSet'
18
+ @stack << 'instancesSet'
19
+ when 'productCodes'
20
+ @stack << 'productCodes'
21
+ when 'instanceState'
22
+ @stack << 'instanceState'
23
+ when 'placement'
24
+ @stack << 'placement'
25
+ when 'item'
26
+ case @stack[-1]
27
+ when 'reservationSet'
28
+ when 'instancesSet'
29
+ @current = {}
30
+ @state = {}
31
+ when 'productCodes'
32
+ @product_codes = []
33
+ end
34
+ end
35
+ @text = ''
36
+ end
37
+
38
+ def text(text)
39
+ @text << text unless @text.nil?
40
+ end
41
+
42
+ def tag_end(tag)
43
+ case tag
44
+ when 'DescribeInstancesResponse', 'requestId', 'reservationId'
45
+ #no-op
46
+ when 'reservationSet', 'instancesSet', 'productCodes', 'instanceState', 'placement'
47
+ @stack.pop
48
+ when 'item'
49
+ case @stack[-1]
50
+ when 'instancesSet'
51
+ @instances << Instance.new(
52
+ @ec2,
53
+ @current['instanceId'],
54
+ @current['imageId'],
55
+ @current['instanceType'],
56
+ @state,
57
+ @current['dnsName'],
58
+ @current['privateDnsName'],
59
+ @current['keyName'],
60
+ @current['kernalId'],
61
+ Time.parse(@current['launchTime']),
62
+ @placement,
63
+ @product_codes || [],
64
+ @current['ramdisk_id'],
65
+ @current['reason'],
66
+ @current['amiLaunchIndex'].to_i
67
+ )
68
+ end
69
+ when 'productCode'
70
+ @product_codes << @text.strip
71
+ when 'availabilityZone'
72
+ @placement = @text.strip
73
+ when 'code'
74
+ @state[:code] = @text.strip.to_i if @stack[-1] == 'instanceState'
75
+ when 'name'
76
+ @state[:name] = @text.strip if @stack[-1] == 'instanceState'
77
+ else
78
+ unless @text.nil? || @current.nil?
79
+ text = @text.strip
80
+ @current[tag] = (text == '' ? nil : text)
81
+ end
82
+ end
83
+ end
84
+
85
+ def result
86
+ @instances
87
+ end
88
+ end
89
+ end
90
+ end