right_aws 1.8.1 → 1.9.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.
@@ -120,7 +120,7 @@ module RightAws
120
120
  def self.caching=(caching)
121
121
  @@caching = caching
122
122
  end
123
-
123
+
124
124
  # Current aws_access_key_id
125
125
  attr_reader :aws_access_key_id
126
126
  # Last HTTP request object
@@ -175,10 +175,13 @@ module RightAws
175
175
  def cache_hits?(function, response, do_raise=:raise)
176
176
  result = false
177
177
  if caching?
178
- function = function.to_sym
178
+ function = function.to_sym
179
+ # get rid of requestId (this bad boy was added for API 2008-08-08+ and it is uniq for every response)
180
+ response = response.sub(%r{<requestId>.+?</requestId>}, '')
179
181
  response_md5 = MD5.md5(response).to_s
180
- # well, the response is new, reset cache data
182
+ # check for changes
181
183
  unless @cache[function] && @cache[function][:response_md5] == response_md5
184
+ # well, the response is new, reset cache data
182
185
  update_cache(function, {:response_md5 => response_md5,
183
186
  :timestamp => Time.now,
184
187
  :hits => 0,
@@ -282,6 +285,27 @@ module RightAws
282
285
  raise
283
286
  end
284
287
 
288
+ def request_cache_or_info(method, link, parser_class, benchblock, use_cache=true) #:nodoc:
289
+ # We do not want to break the logic of parsing hence will use a dummy parser to process all the standard
290
+ # steps (errors checking etc). The dummy parser does nothig - just returns back the params it received.
291
+ # If the caching is enabled and hit then throw AwsNoChange.
292
+ # P.S. caching works for the whole images list only! (when the list param is blank)
293
+ # check cache
294
+ response, params = request_info(link, RightDummyParser.new)
295
+ cache_hits?(method.to_sym, response.body) if use_cache
296
+ parser = parser_class.new(:logger => @logger)
297
+ benchblock.xml.add!{ parser.parse(response, params) }
298
+ result = block_given? ? yield(parser) : parser.result
299
+ # update parsed data
300
+ update_cache(method.to_sym, :parsed => result) if use_cache
301
+ result
302
+ end
303
+
304
+ # Returns Amazons request ID for the latest request
305
+ def last_request_id
306
+ @last_response && @last_response.body.to_s[%r{<requestId>(.+?)</requestId>}] && $1
307
+ end
308
+
285
309
  end
286
310
 
287
311
 
@@ -674,5 +698,20 @@ module RightAws
674
698
  end
675
699
  end
676
700
 
701
+ # Dummy parser - does nothing
702
+ # Returns the original params back
703
+ class RightDummyParser # :nodoc:
704
+ attr_accessor :result
705
+ def parse(response, params={})
706
+ @result = [response, params]
707
+ end
708
+ end
709
+
710
+ class RightHttp2xxParser < RightAWSParser # :nodoc:
711
+ def parse(response)
712
+ @result = response.is_a?(Net::HTTPSuccess)
713
+ end
714
+ end
715
+
677
716
  end
678
717
 
@@ -68,7 +68,7 @@ module RightAws
68
68
  include RightAwsBaseInterface
69
69
 
70
70
  # Amazon EC2 API version being used
71
- API_VERSION = "2008-05-05"
71
+ API_VERSION = "2008-08-08"
72
72
  DEFAULT_HOST = "ec2.amazonaws.com"
73
73
  DEFAULT_PATH = '/'
74
74
  DEFAULT_PROTOCOL = 'https'
@@ -106,6 +106,10 @@ module RightAws
106
106
  # * <tt>:multi_thread</tt>: true=HTTP connection per thread, false=per process
107
107
  # * <tt>:logger</tt>: for log messages, default: RAILS_DEFAULT_LOGGER else STDOUT
108
108
  # * <tt>:signature_version</tt>: The signature version : '0' or '1'(default)
109
+ # * <tt>:cache</tt>: true/false: caching for: ec2_describe_images, describe_instances,
110
+ # describe_images_by_owner, describe_images_by_executable_by, describe_availability_zones,
111
+ # describe_security_groups, describe_key_pairs, describe_addresses,
112
+ # describe_volumes, describe_snapshots methods, default: false.
109
113
  #
110
114
  def initialize(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
111
115
  init({ :name => 'EC2',
@@ -126,7 +130,7 @@ module RightAws
126
130
  "Timestamp" => Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
127
131
  "SignatureVersion" => signature_version }
128
132
  service_hash.update(params)
129
- # prepare string to sight
133
+ # prepare string to sign
130
134
  string_to_sign = case signature_version
131
135
  when '0' then service_hash["Action"] + service_hash["Timestamp"]
132
136
  when '1' then service_hash.sort{|a,b| (a[0].to_s.downcase)<=>(b[0].to_s.downcase)}.to_s
@@ -149,22 +153,6 @@ module RightAws
149
153
  request_info_impl(thread[:ec2_connection], @@bench, request, parser)
150
154
  end
151
155
 
152
- def request_cache_or_info(method, link, parser_class, use_cache=true) #:nodoc:
153
- # We do not want to break the logic of parsing hence will use a dummy parser to process all the standart
154
- # steps (errors checking etc). The dummy parser does nothig - just returns back the params it received.
155
- # If the caching is enabled and hit then throw AwsNoChange.
156
- # P.S. caching works for the whole images list only! (when the list param is blank) response, params = request_info(link, QEc2DummyParser.new)
157
- # check cache
158
- response, params = request_info(link, QEc2DummyParser.new)
159
- cache_hits?(method.to_sym, response.body) if use_cache
160
- parser = parser_class.new(:logger => @logger)
161
- @@bench.xml.add!{ parser.parse(response, params) }
162
- result = block_given? ? yield(parser) : parser.result
163
- # update parsed data
164
- update_cache(method.to_sym, :parsed => result) if use_cache
165
- result
166
- end
167
-
168
156
  def hash_params(prefix, list) #:nodoc:
169
157
  groups = {}
170
158
  list.each_index{|i| groups.update("#{prefix}.#{i+1}"=>list[i])} if list
@@ -175,11 +163,19 @@ module RightAws
175
163
  # Images
176
164
  #-----------------------------------------------------------------
177
165
 
178
- def ec2_describe_images(list, list_by='ImageId', image_type=nil) #:nodoc:
179
- request_hash = hash_params(list_by, list.to_a)
166
+ # params:
167
+ # { 'ImageId' => ['id1', ..., 'idN'],
168
+ # 'Owner' => ['self', ..., 'userN'],
169
+ # 'ExecutableBy' => ['self', 'all', ..., 'userN']
170
+ # }
171
+ def ec2_describe_images(params={}, image_type=nil, cache_for=nil) #:nodoc:
172
+ request_hash = {}
173
+ params.each do |list_by, list|
174
+ request_hash.merge! hash_params(list_by, list.to_a)
175
+ end
180
176
  request_hash['ImageType'] = image_type if image_type
181
177
  link = generate_request("DescribeImages", request_hash)
182
- request_cache_or_info :describe_images, link, QEc2DescribeImagesParser, (list.blank? && list_by == 'ImageId' && image_type.blank?)
178
+ request_cache_or_info cache_for, link, QEc2DescribeImagesParser, @@bench, cache_for
183
179
  rescue Exception
184
180
  on_exception
185
181
  end
@@ -210,7 +206,9 @@ module RightAws
210
206
  # :aws_image_type => "machine"}]
211
207
  #
212
208
  def describe_images(list=[], image_type=nil)
213
- ec2_describe_images(list, 'ImageId', image_type)
209
+ list = list.to_a
210
+ cache_for = list.empty? && !image_type ? :describe_images : nil
211
+ ec2_describe_images({ 'ImageId' => list }, image_type, cache_for)
214
212
  end
215
213
 
216
214
  #
@@ -219,8 +217,10 @@ module RightAws
219
217
  # ec2.describe_images_by_owner('522821470517')
220
218
  # ec2.describe_images_by_owner('self')
221
219
  #
222
- def describe_images_by_owner(list, image_type=nil)
223
- ec2_describe_images(list, 'Owner', image_type)
220
+ def describe_images_by_owner(list=['self'], image_type=nil)
221
+ list = list.to_a
222
+ cache_for = list==['self'] && !image_type ? :describe_images_by_owner : nil
223
+ ec2_describe_images({ 'Owner' => list }, image_type, cache_for)
224
224
  end
225
225
 
226
226
  #
@@ -228,9 +228,12 @@ module RightAws
228
228
  #
229
229
  # ec2.describe_images_by_executable_by('522821470517')
230
230
  # ec2.describe_images_by_executable_by('self')
231
+ # ec2.describe_images_by_executable_by('all')
231
232
  #
232
- def describe_images_by_executable_by(list, image_type=nil)
233
- ec2_describe_images(list, 'ExecutableBy', image_type)
233
+ def describe_images_by_executable_by(list=['self'], image_type=nil)
234
+ list = list.to_a
235
+ cache_for = list==['self'] && !image_type ? :describe_images_by_executable_by : nil
236
+ ec2_describe_images({ 'ExecutableBy' => list }, image_type, cache_for)
234
237
  end
235
238
 
236
239
 
@@ -398,7 +401,7 @@ module RightAws
398
401
  #
399
402
  def describe_instances(list=[])
400
403
  link = generate_request("DescribeInstances", hash_params('InstanceId',list.to_a))
401
- request_cache_or_info(:describe_instances, link, QEc2DescribeInstancesParser, list.blank?) do |parser|
404
+ request_cache_or_info(:describe_instances, link, QEc2DescribeInstancesParser, @@bench, list.blank?) do |parser|
402
405
  get_desc_instances(parser.result)
403
406
  end
404
407
  rescue Exception
@@ -412,7 +415,7 @@ module RightAws
412
415
  #
413
416
  def confirm_product_instance(instance, product_code)
414
417
  link = generate_request("ConfirmProductInstance", { 'ProductCode' => product_code,
415
- 'InstanceId' => instance })
418
+ 'InstanceId' => instance })
416
419
  request_info(link, QEc2ConfirmProductInstanceParser.new(:logger => @logger))
417
420
  end
418
421
 
@@ -573,7 +576,127 @@ module RightAws
573
576
  rescue Exception
574
577
  on_exception
575
578
  end
579
+
580
+ #-----------------------------------------------------------------
581
+ # Instances: Windows addons
582
+ #-----------------------------------------------------------------
583
+
584
+ # Get initial Windows Server setup password from an instance console output.
585
+ #
586
+ # my_awesome_key = ec2.create_key_pair('my_awesome_key') #=>
587
+ # {:aws_key_name => "my_awesome_key",
588
+ # :aws_fingerprint => "01:02:03:f4:25:e6:97:e8:9b:02:1a:26:32:4e:58:6b:7a:8c:9f:03",
589
+ # :aws_material => "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAK...Q8MDrCbuQ=\n-----END RSA PRIVATE KEY-----"}
590
+ #
591
+ # my_awesome_instance = ec2.run_instances('ami-a000000a',1,1,['my_awesome_group'],'my_awesome_key', 'WindowsInstance!!!') #=>
592
+ # [{:aws_image_id => "ami-a000000a",
593
+ # :aws_instance_id => "i-12345678",
594
+ # ...
595
+ # :aws_availability_zone => "us-east-1b"
596
+ # }]
597
+ #
598
+ # # wait until instance enters 'operational' state and get it's initial password
599
+ #
600
+ # puts ec2.get_initial_password(my_awesome_instance[:aws_instance_id], my_awesome_key[:aws_material]) #=> "MhjWcgZuY6"
601
+ #
602
+ def get_initial_password(instance_id, private_key)
603
+ console_output = get_console_output(instance_id)
604
+ crypted_password = console_output[:aws_output][%r{<Password>(.+)</Password>}m] && $1
605
+ unless crypted_password
606
+ raise AwsError.new("Initial password was not found in console output for #{instance_id}")
607
+ else
608
+ OpenSSL::PKey::RSA.new(private_key).private_decrypt(Base64.decode64(crypted_password))
609
+ end
610
+ rescue Exception
611
+ on_exception
612
+ end
613
+
614
+ # Bundle a Windows image.
615
+ # Internally, it queues the bundling task and shuts down the instance.
616
+ # It then takes a snapshot of the Windows volume bundles it, and uploads it to
617
+ # S3. After bundling completes, Rightaws::Ec2#register_image may be used to
618
+ # register the new Windows AMI for subsequent launches.
619
+ #
620
+ # ec2.bundle_instance('i-e3e24e8a', 'my-awesome-bucket', 'my-win-image-1') #=>
621
+ # [{:aws_update_time => "2008-10-16T13:58:25.000Z",
622
+ # :s3_bucket => "kd-win-1",
623
+ # :s3_prefix => "win2pr",
624
+ # :aws_state => "pending",
625
+ # :aws_id => "bun-26a7424f",
626
+ # :aws_instance_id => "i-878a25ee",
627
+ # :aws_start_time => "2008-10-16T13:58:02.000Z"}]
628
+ #
629
+ def bundle_instance(instance_id, s3_bucket, s3_prefix,
630
+ s3_owner_aws_access_key_id=nil, s3_owner_aws_secret_access_key=nil,
631
+ s3_expires = S3Interface::DEFAULT_EXPIRES_AFTER,
632
+ s3_upload_policy='ec2-bundle-read')
633
+ # S3 access and signatures
634
+ s3_owner_aws_access_key_id ||= @aws_access_key_id
635
+ s3_owner_aws_secret_access_key ||= @aws_secret_access_key
636
+ s3_expires = Time.now.utc + s3_expires if s3_expires.is_a?(Fixnum) && (s3_expires < S3Interface::ONE_YEAR_IN_SECONDS)
637
+ # policy
638
+ policy = { 'expiration' => s3_expires.strftime('%Y-%m-%dT%H:%M:%SZ'),
639
+ 'conditions' => [ { 'bucket' => s3_bucket },
640
+ { 'acl' => s3_upload_policy },
641
+ [ 'starts-with', '$key', s3_prefix ] ] }.to_json
642
+ policy64 = Base64.encode64(policy).gsub("\n","")
643
+ signed_policy64 = AwsUtils.sign(s3_owner_aws_secret_access_key, policy64)
644
+ # fill request params
645
+ params = { 'InstanceId' => instance_id,
646
+ 'Storage.S3.AWSAccessKeyId' => s3_owner_aws_access_key_id,
647
+ 'Storage.S3.UploadPolicy' => policy64,
648
+ 'Storage.S3.UploadPolicySignature' => signed_policy64,
649
+ 'Storage.S3.Bucket' => s3_bucket,
650
+ 'Storage.S3.Prefix' => s3_prefix,
651
+ }
652
+ link = generate_request("BundleInstance", params)
653
+ request_info(link, QEc2BundleInstanceParser.new)
654
+ rescue Exception
655
+ on_exception
656
+ end
576
657
 
658
+ # Describe the status of the Windows AMI bundlings.
659
+ # If +list+ is omitted the returns the whole list of tasks.
660
+ #
661
+ # ec2.describe_bundle_tasks(['bun-4fa74226']) #=>
662
+ # [{:s3_bucket => "my-awesome-bucket"
663
+ # :aws_id => "bun-0fa70206",
664
+ # :s3_prefix => "win1pr",
665
+ # :aws_start_time => "2008-10-14T16:27:57.000Z",
666
+ # :aws_update_time => "2008-10-14T16:37:10.000Z",
667
+ # :aws_error_code => "Client.S3Error",
668
+ # :aws_error_message =>
669
+ # "AccessDenied(403)- Invalid according to Policy: Policy Condition failed: [\"eq\", \"$acl\", \"aws-exec-read\"]",
670
+ # :aws_state => "failed",
671
+ # :aws_instance_id => "i-e3e24e8a"}]
672
+ #
673
+ def describe_bundle_tasks(list=[])
674
+ link = generate_request("DescribeBundleTasks", hash_params('BundleId', list.to_a))
675
+ request_info(link, QEc2DescribeBundleTasksParser.new)
676
+ rescue Exception
677
+ on_exception
678
+ end
679
+
680
+ # Cancel an in‐progress or pending bundle task by id.
681
+ #
682
+ # ec2.cancel_bundle_task('bun-73a7421a') #=>
683
+ # [{:s3_bucket => "my-awesome-bucket"
684
+ # :aws_id => "bun-0fa70206",
685
+ # :s3_prefix => "win02",
686
+ # :aws_start_time => "2008-10-14T13:00:29.000Z",
687
+ # :aws_error_message => "User has requested bundling operation cancellation",
688
+ # :aws_state => "failed",
689
+ # :aws_update_time => "2008-10-14T13:01:31.000Z",
690
+ # :aws_error_code => "Client.Cancelled",
691
+ # :aws_instance_id => "i-e3e24e8a"}
692
+ #
693
+ def cancel_bundle_task(bundle_id)
694
+ link = generate_request("CancelBundleTask", { 'BundleId' => bundle_id })
695
+ request_info(link, QEc2BundleInstanceParser.new)
696
+ rescue Exception
697
+ on_exception
698
+ end
699
+
577
700
  #-----------------------------------------------------------------
578
701
  # Security groups
579
702
  #-----------------------------------------------------------------
@@ -595,7 +718,7 @@ module RightAws
595
718
  #
596
719
  def describe_security_groups(list=[])
597
720
  link = generate_request("DescribeSecurityGroups", hash_params('GroupName',list.to_a))
598
- request_cache_or_info( :describe_security_groups, link, QEc2DescribeSecurityGroupsParser, list.blank?) do |parser|
721
+ request_cache_or_info( :describe_security_groups, link, QEc2DescribeSecurityGroupsParser, @@bench, list.blank?) do |parser|
599
722
  result = []
600
723
  parser.result.each do |item|
601
724
  perms = []
@@ -640,7 +763,7 @@ module RightAws
640
763
  # EC2 doesn't like an empty description...
641
764
  description = " " if description.blank?
642
765
  link = generate_request("CreateSecurityGroup",
643
- 'GroupName' => name.to_s,
766
+ 'GroupName' => name.to_s,
644
767
  'GroupDescription' => description.to_s)
645
768
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
646
769
  rescue Exception
@@ -666,8 +789,8 @@ module RightAws
666
789
  #
667
790
  def authorize_security_group_named_ingress(name, owner, group)
668
791
  link = generate_request("AuthorizeSecurityGroupIngress",
669
- 'GroupName' => name.to_s,
670
- 'SourceSecurityGroupName' => group.to_s,
792
+ 'GroupName' => name.to_s,
793
+ 'SourceSecurityGroupName' => group.to_s,
671
794
  'SourceSecurityGroupOwnerId' => owner.to_s.gsub(/-/,''))
672
795
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
673
796
  rescue Exception
@@ -680,8 +803,8 @@ module RightAws
680
803
  #
681
804
  def revoke_security_group_named_ingress(name, owner, group)
682
805
  link = generate_request("RevokeSecurityGroupIngress",
683
- 'GroupName' => name.to_s,
684
- 'SourceSecurityGroupName' => group.to_s,
806
+ 'GroupName' => name.to_s,
807
+ 'SourceSecurityGroupName' => group.to_s,
685
808
  'SourceSecurityGroupOwnerId' => owner.to_s.gsub(/-/,''))
686
809
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
687
810
  rescue Exception
@@ -695,10 +818,10 @@ module RightAws
695
818
  #
696
819
  def authorize_security_group_IP_ingress(name, from_port, to_port, protocol='tcp', cidr_ip='0.0.0.0/0')
697
820
  link = generate_request("AuthorizeSecurityGroupIngress",
698
- 'GroupName' => name.to_s,
699
- 'IpProtocol' => protocol.to_s,
700
- 'FromPort' => from_port.to_s,
701
- 'ToPort' => to_port.to_s,
821
+ 'GroupName' => name.to_s,
822
+ 'IpProtocol' => protocol.to_s,
823
+ 'FromPort' => from_port.to_s,
824
+ 'ToPort' => to_port.to_s,
702
825
  'CidrIp' => cidr_ip.to_s)
703
826
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
704
827
  rescue Exception
@@ -711,10 +834,10 @@ module RightAws
711
834
  #
712
835
  def revoke_security_group_IP_ingress(name, from_port, to_port, protocol='tcp', cidr_ip='0.0.0.0/0')
713
836
  link = generate_request("RevokeSecurityGroupIngress",
714
- 'GroupName' => name.to_s,
715
- 'IpProtocol' => protocol.to_s,
716
- 'FromPort' => from_port.to_s,
717
- 'ToPort' => to_port.to_s,
837
+ 'GroupName' => name.to_s,
838
+ 'IpProtocol' => protocol.to_s,
839
+ 'FromPort' => from_port.to_s,
840
+ 'ToPort' => to_port.to_s,
718
841
  'CidrIp' => cidr_ip.to_s)
719
842
  request_info(link, RightBoolResponseParser.new(:logger => @logger))
720
843
  rescue Exception
@@ -735,7 +858,7 @@ module RightAws
735
858
  #
736
859
  def describe_key_pairs(list=[])
737
860
  link = generate_request("DescribeKeyPairs", hash_params('KeyName',list.to_a))
738
- request_cache_or_info :describe_key_pairs, link, QEc2DescribeKeyPairParser, list.blank?
861
+ request_cache_or_info :describe_key_pairs, link, QEc2DescribeKeyPairParser, @@bench, list.blank?
739
862
  rescue Exception
740
863
  on_exception
741
864
  end
@@ -754,7 +877,7 @@ module RightAws
754
877
  rescue Exception
755
878
  on_exception
756
879
  end
757
-
880
+
758
881
  # Delete a key pair. Returns +true+ or an exception.
759
882
  #
760
883
  # ec2.delete_key_pair('my_awesome_key') #=> true
@@ -808,7 +931,7 @@ module RightAws
808
931
  def describe_addresses(list=[])
809
932
  link = generate_request("DescribeAddresses",
810
933
  hash_params('PublicIp',list.to_a))
811
- request_cache_or_info :describe_addresses, link, QEc2DescribeAddressesParser, list.blank?
934
+ request_cache_or_info :describe_addresses, link, QEc2DescribeAddressesParser, @@bench, list.blank?
812
935
  rescue Exception
813
936
  on_exception
814
937
  end
@@ -855,7 +978,7 @@ module RightAws
855
978
  def describe_availability_zones(list=[])
856
979
  link = generate_request("DescribeAvailabilityZones",
857
980
  hash_params('ZoneName',list.to_a))
858
- request_cache_or_info :describe_availability_zones, link, QEc2DescribeAvailabilityZonesParser, list.blank?
981
+ request_cache_or_info :describe_availability_zones, link, QEc2DescribeAvailabilityZonesParser, @@bench, list.blank?
859
982
  rescue Exception
860
983
  on_exception
861
984
  end
@@ -887,7 +1010,7 @@ module RightAws
887
1010
  def describe_volumes(list=[])
888
1011
  link = generate_request("DescribeVolumes",
889
1012
  hash_params('VolumeId',list.to_a))
890
- request_cache_or_info :describe_volumes, link, QEc2DescribeVolumesParser, list.blank?
1013
+ request_cache_or_info :describe_volumes, link, QEc2DescribeVolumesParser, @@bench, list.blank?
891
1014
  rescue Exception
892
1015
  on_exception
893
1016
  end
@@ -989,7 +1112,7 @@ module RightAws
989
1112
  def describe_snapshots(list=[])
990
1113
  link = generate_request("DescribeSnapshots",
991
1114
  hash_params('SnapshotId',list.to_a))
992
- request_cache_or_info :describe_snapshots, link, QEc2DescribeSnapshotsParser, list.blank?
1115
+ request_cache_or_info :describe_snapshots, link, QEc2DescribeSnapshotsParser, @@bench, list.blank?
993
1116
  rescue Exception
994
1117
  on_exception
995
1118
  end
@@ -1255,6 +1378,7 @@ module RightAws
1255
1378
  when 'launchTime' then @instance[:aws_launch_time] = @text
1256
1379
  when 'kernelId' then @instance[:aws_kernel_id] = @text
1257
1380
  when 'ramdiskId' then @instance[:aws_ramdisk_id] = @text
1381
+ when 'platform' then @instance[:aws_platform] = @text
1258
1382
  when 'availabilityZone' then @instance[:aws_availability_zone] = @text
1259
1383
  when 'item'
1260
1384
  if @xmlpath == 'DescribeInstancesResponse/reservationSet/item/instancesSet' || # DescribeInstances property
@@ -1319,18 +1443,54 @@ module RightAws
1319
1443
  end
1320
1444
 
1321
1445
  #-----------------------------------------------------------------
1322
- # PARSERS: Fake
1446
+ # Instances: Wondows related part
1323
1447
  #-----------------------------------------------------------------
1324
-
1325
- # Dummy parser - does nothing
1326
- # Returns the original params back
1327
- class QEc2DummyParser # :nodoc:
1328
- attr_accessor :result
1329
- def parse(response, params={})
1330
- @result = [response, params]
1448
+ class QEc2DescribeBundleTasksParser < RightAWSParser #:nodoc:
1449
+ def tagstart(name, attributes)
1450
+ @bundle = {} if name == 'item'
1451
+ end
1452
+ def tagend(name)
1453
+ case name
1454
+ # when 'requestId' then @bundle[:request_id] = @text
1455
+ when 'instanceId' then @bundle[:aws_instance_id] = @text
1456
+ when 'bundleId' then @bundle[:aws_id] = @text
1457
+ when 'bucket' then @bundle[:s3_bucket] = @text
1458
+ when 'prefix' then @bundle[:s3_prefix] = @text
1459
+ when 'startTime' then @bundle[:aws_start_time] = @text
1460
+ when 'updateTime' then @bundle[:aws_update_time] = @text
1461
+ when 'state' then @bundle[:aws_state] = @text
1462
+ when 'progress' then @bundle[:aws_progress] = @text
1463
+ when 'code' then @bundle[:aws_error_code] = @text
1464
+ when 'message' then @bundle[:aws_error_message] = @text
1465
+ when 'item' then @result << @bundle
1466
+ end
1467
+ end
1468
+ def reset
1469
+ @result = []
1331
1470
  end
1332
1471
  end
1333
-
1472
+
1473
+ class QEc2BundleInstanceParser < RightAWSParser #:nodoc:
1474
+ def tagend(name)
1475
+ case name
1476
+ # when 'requestId' then @result[:request_id] = @text
1477
+ when 'instanceId' then @result[:aws_instance_id] = @text
1478
+ when 'bundleId' then @result[:aws_id] = @text
1479
+ when 'bucket' then @result[:s3_bucket] = @text
1480
+ when 'prefix' then @result[:s3_prefix] = @text
1481
+ when 'startTime' then @result[:aws_start_time] = @text
1482
+ when 'updateTime' then @result[:aws_update_time] = @text
1483
+ when 'state' then @result[:aws_state] = @text
1484
+ when 'progress' then @result[:aws_progress] = @text
1485
+ when 'code' then @result[:aws_error_code] = @text
1486
+ when 'message' then @result[:aws_error_message] = @text
1487
+ end
1488
+ end
1489
+ def reset
1490
+ @result = {}
1491
+ end
1492
+ end
1493
+
1334
1494
  #-----------------------------------------------------------------
1335
1495
  # PARSERS: Elastic IPs
1336
1496
  #-----------------------------------------------------------------