right_aws 1.8.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  #-----------------------------------------------------------------