aws 1.11.8 → 1.11.9

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.
@@ -25,14 +25,14 @@
25
25
  module RightAws
26
26
  require 'digest/md5'
27
27
  require 'pp'
28
-
28
+
29
29
  class AwsUtils #:nodoc:
30
30
  @@digest1 = OpenSSL::Digest::Digest.new("sha1")
31
31
  @@digest256 = nil
32
32
  if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
33
33
  @@digest256 = OpenSSL::Digest::Digest.new("sha256") rescue nil # Some installation may not support sha256
34
34
  end
35
-
35
+
36
36
  def self.sign(aws_secret_access_key, auth_string)
37
37
  Base64.encode64(OpenSSL::HMAC.digest(@@digest1, aws_secret_access_key, auth_string)).strip
38
38
  end
@@ -93,11 +93,11 @@ module RightAws
93
93
  end
94
94
 
95
95
  # From Amazon's SQS Dev Guide, a brief description of how to escape:
96
- # "URL encode the computed signature and other query parameters as specified in
97
- # RFC1738, section 2.2. In addition, because the + character is interpreted as a blank space
98
- # by Sun Java classes that perform URL decoding, make sure to encode the + character
96
+ # "URL encode the computed signature and other query parameters as specified in
97
+ # RFC1738, section 2.2. In addition, because the + character is interpreted as a blank space
98
+ # by Sun Java classes that perform URL decoding, make sure to encode the + character
99
99
  # although it is not required by RFC1738."
100
- # Avoid using CGI::escape to escape URIs.
100
+ # Avoid using CGI::escape to escape URIs.
101
101
  # CGI::escape will escape characters in the protocol, host, and port
102
102
  # sections of the URI. Only target chars in the query
103
103
  # string should be escaped.
@@ -105,19 +105,19 @@ module RightAws
105
105
  e = URI.escape(raw)
106
106
  e.gsub(/\+/, "%2b")
107
107
  end
108
-
108
+
109
109
  def self.allow_only(allowed_keys, params)
110
110
  bogus_args = []
111
111
  params.keys.each {|p| bogus_args.push(p) unless allowed_keys.include?(p) }
112
112
  raise AwsError.new("The following arguments were given but are not legal for the function call #{caller_method}: #{bogus_args.inspect}") if bogus_args.length > 0
113
113
  end
114
-
114
+
115
115
  def self.mandatory_arguments(required_args, params)
116
116
  rargs = required_args.dup
117
117
  params.keys.each {|p| rargs.delete(p)}
118
118
  raise AwsError.new("The following mandatory arguments were not provided to #{caller_method}: #{rargs.inspect}") if rargs.length > 0
119
119
  end
120
-
120
+
121
121
  def self.caller_method
122
122
  caller[1]=~/`(.*?)'/
123
123
  $1
@@ -137,16 +137,16 @@ module RightAws
137
137
 
138
138
  class AwsNoChange < RuntimeError
139
139
  end
140
-
140
+
141
141
  class RightAwsBase
142
142
 
143
143
  # Amazon HTTP Error handling
144
144
 
145
145
  # Text, if found in an error message returned by AWS, indicates that this may be a transient
146
146
  # error. Transient errors are automatically retried with exponential back-off.
147
- AMAZON_PROBLEMS = [ 'internal service error',
148
- 'is currently unavailable',
149
- 'no response from',
147
+ AMAZON_PROBLEMS = [ 'internal service error',
148
+ 'is currently unavailable',
149
+ 'no response from',
150
150
  'Please try again',
151
151
  'InternalError',
152
152
  'ServiceUnavailable', #from SQS docs
@@ -155,24 +155,24 @@ module RightAws
155
155
  'InsufficientInstanceCapacity'
156
156
  ]
157
157
  @@amazon_problems = AMAZON_PROBLEMS
158
- # Returns a list of Amazon service responses which are known to be transient problems.
159
- # We have to re-request if we get any of them, because the problem will probably disappear.
158
+ # Returns a list of Amazon service responses which are known to be transient problems.
159
+ # We have to re-request if we get any of them, because the problem will probably disappear.
160
160
  # By default this method returns the same value as the AMAZON_PROBLEMS const.
161
161
  def self.amazon_problems
162
162
  @@amazon_problems
163
163
  end
164
-
164
+
165
165
  # Sets the list of Amazon side problems. Use in conjunction with the
166
166
  # getter to append problems.
167
167
  def self.amazon_problems=(problems_list)
168
168
  @@amazon_problems = problems_list
169
169
  end
170
-
170
+
171
171
  end
172
172
 
173
173
  module RightAwsBaseInterface
174
174
  DEFAULT_SIGNATURE_VERSION = '2'
175
-
175
+
176
176
  @@caching = false
177
177
  def self.caching
178
178
  @@caching
@@ -246,11 +246,11 @@ module RightAws
246
246
  end
247
247
  end
248
248
 
249
- # Returns +true+ if the describe_xxx responses are being cached
249
+ # Returns +true+ if the describe_xxx responses are being cached
250
250
  def caching?
251
251
  @params.key?(:cache) ? @params[:cache] : @@caching
252
252
  end
253
-
253
+
254
254
  # Check if the aws function response hits the cache or not.
255
255
  # If the cache hits:
256
256
  # - raises an +AwsNoChange+ exception if +do_raise+ == +:raise+.
@@ -266,9 +266,9 @@ module RightAws
266
266
  # check for changes
267
267
  unless @cache[function] && @cache[function][:response_md5] == response_md5
268
268
  # well, the response is new, reset cache data
269
- update_cache(function, {:response_md5 => response_md5,
270
- :timestamp => Time.now,
271
- :hits => 0,
269
+ update_cache(function, {:response_md5 => response_md5,
270
+ :timestamp => Time.now,
271
+ :hits => 0,
272
272
  :parsed => nil})
273
273
  else
274
274
  # aha, cache hits, update the data and throw an exception if needed
@@ -284,16 +284,16 @@ module RightAws
284
284
  end
285
285
  result
286
286
  end
287
-
287
+
288
288
  def update_cache(function, hash)
289
289
  (@cache[function.to_sym] ||= {}).merge!(hash) if caching?
290
290
  end
291
-
291
+
292
292
  def on_exception(options={:raise=>true, :log=>true}) # :nodoc:
293
293
  raise if $!.is_a?(AwsNoChange)
294
294
  AwsError::on_aws_exception(self, options)
295
295
  end
296
-
296
+
297
297
  # Return +true+ if this instance works in multi_thread mode and +false+ otherwise.
298
298
  def multi_thread
299
299
  @params[:multi_thread]
@@ -327,7 +327,7 @@ module RightAws
327
327
  check_result = @error_handler.check(request)
328
328
  if check_result
329
329
  @error_handler = nil
330
- return check_result
330
+ return check_result
331
331
  end
332
332
  request_text_data = "#{request[:server]}:#{request[:port]}#{request[:request].path}"
333
333
  raise AwsError.new(@last_errors, @last_response.code, @last_request_id, request_text_data)
@@ -360,7 +360,7 @@ module RightAws
360
360
  check_result = @error_handler.check(request)
361
361
  if check_result
362
362
  @error_handler = nil
363
- return check_result
363
+ return check_result
364
364
  end
365
365
  request_text_data = "#{request[:server]}:#{request[:port]}#{request[:request].path}"
366
366
  raise AwsError.new(@last_errors, @last_response.code, @last_request_id, request_text_data)
@@ -400,37 +400,41 @@ module RightAws
400
400
  # Attribute inherited by RuntimeError:
401
401
  # message - the text of the error, generally as returned by AWS in its XML response.
402
402
  class AwsError < RuntimeError
403
-
403
+
404
404
  # either an array of errors where each item is itself an array of [code, message]),
405
405
  # or an error string if the error was raised manually, as in <tt>AwsError.new('err_text')</tt>
406
406
  attr_reader :errors
407
-
407
+
408
408
  # Request id (if exists)
409
409
  attr_reader :request_id
410
-
410
+
411
411
  # Response HTTP error code
412
412
  attr_reader :http_code
413
-
414
- def initialize(errors=nil, http_code=nil, request_id=nil)
413
+
414
+ # Raw request text data to AWS
415
+ attr_reader :request_data
416
+
417
+ def initialize(errors=nil, http_code=nil, request_id=nil, request_data=nil)
415
418
  @errors = errors
416
419
  @request_id = request_id
417
420
  @http_code = http_code
421
+ @request_data = request_data
418
422
  msg = @errors.is_a?(Array) ? @errors.map{|code, msg| "#{code}: #{msg}"}.join("; ") : @errors.to_s
419
423
  msg += "\nREQUEST(#{@request_data})" unless @request_data.nil?
420
424
  super(msg)
421
425
  end
422
-
426
+
423
427
  # Does any of the error messages include the regexp +pattern+?
424
428
  # Used to determine whether to retry request.
425
429
  def include?(pattern)
426
430
  if @errors.is_a?(Array)
427
- @errors.each{ |code, msg| return true if code =~ pattern }
431
+ @errors.each{ |code, msg| return true if code =~ pattern }
428
432
  else
429
- return true if @errors_str =~ pattern
433
+ return true if @errors_str =~ pattern
430
434
  end
431
435
  false
432
436
  end
433
-
437
+
434
438
  # Generic handler for AwsErrors. +aws+ is the RightAws::S3, RightAws::EC2, or RightAws::SQS
435
439
  # object that caused the exception (it must provide last_request and last_response). Supported
436
440
  # boolean options are:
@@ -454,7 +458,7 @@ module RightAws
454
458
  raise if options[:raise] # re-raise an exception
455
459
  return nil
456
460
  end
457
-
461
+
458
462
  # True if e is an AWS system error, i.e. something that is for sure not the caller's fault.
459
463
  # Used to force logging.
460
464
  def self.system_error?(e)
@@ -465,9 +469,9 @@ module RightAws
465
469
 
466
470
 
467
471
  class AWSErrorHandler
468
- # 0-100 (%)
469
- DEFAULT_CLOSE_ON_4XX_PROBABILITY = 10
470
-
472
+ # 0-100 (%)
473
+ DEFAULT_CLOSE_ON_4XX_PROBABILITY = 10
474
+
471
475
  @@reiteration_start_delay = 0.2
472
476
  def self.reiteration_start_delay
473
477
  @@reiteration_start_delay
@@ -483,42 +487,42 @@ module RightAws
483
487
  def self.reiteration_time=(reiteration_time)
484
488
  @@reiteration_time = reiteration_time
485
489
  end
486
-
487
- @@close_on_error = true
488
- def self.close_on_error
489
- @@close_on_error
490
- end
491
- def self.close_on_error=(close_on_error)
492
- @@close_on_error = close_on_error
493
- end
494
-
495
- @@close_on_4xx_probability = DEFAULT_CLOSE_ON_4XX_PROBABILITY
496
- def self.close_on_4xx_probability
497
- @@close_on_4xx_probability
498
- end
499
- def self.close_on_4xx_probability=(close_on_4xx_probability)
500
- @@close_on_4xx_probability = close_on_4xx_probability
501
- end
502
-
503
- # params:
504
- # :reiteration_time
505
- # :errors_list
506
- # :close_on_error = true | false
507
- # :close_on_4xx_probability = 1-100
508
- def initialize(aws, parser, params={}) #:nodoc:
490
+
491
+ @@close_on_error = true
492
+ def self.close_on_error
493
+ @@close_on_error
494
+ end
495
+ def self.close_on_error=(close_on_error)
496
+ @@close_on_error = close_on_error
497
+ end
498
+
499
+ @@close_on_4xx_probability = DEFAULT_CLOSE_ON_4XX_PROBABILITY
500
+ def self.close_on_4xx_probability
501
+ @@close_on_4xx_probability
502
+ end
503
+ def self.close_on_4xx_probability=(close_on_4xx_probability)
504
+ @@close_on_4xx_probability = close_on_4xx_probability
505
+ end
506
+
507
+ # params:
508
+ # :reiteration_time
509
+ # :errors_list
510
+ # :close_on_error = true | false
511
+ # :close_on_4xx_probability = 1-100
512
+ def initialize(aws, parser, params={}) #:nodoc:
509
513
  @aws = aws # Link to RightEc2 | RightSqs | RightS3 instance
510
514
  @parser = parser # parser to parse Amazon response
511
515
  @started_at = Time.now
512
- @stop_at = @started_at + (params[:reiteration_time] || @@reiteration_time)
513
- @errors_list = params[:errors_list] || []
516
+ @stop_at = @started_at + (params[:reiteration_time] || @@reiteration_time)
517
+ @errors_list = params[:errors_list] || []
514
518
  @reiteration_delay = @@reiteration_start_delay
515
519
  @retries = 0
516
- # close current HTTP(S) connection on 5xx, errors from list and 4xx errors
517
- @close_on_error = params[:close_on_error].nil? ? @@close_on_error : params[:close_on_error]
518
- @close_on_4xx_probability = params[:close_on_4xx_probability] || @@close_on_4xx_probability
520
+ # close current HTTP(S) connection on 5xx, errors from list and 4xx errors
521
+ @close_on_error = params[:close_on_error].nil? ? @@close_on_error : params[:close_on_error]
522
+ @close_on_4xx_probability = params[:close_on_4xx_probability] || @@close_on_4xx_probability
519
523
  end
520
-
521
- # Returns false if
524
+
525
+ # Returns false if
522
526
  def check(request) #:nodoc:
523
527
  result = false
524
528
  error_found = false
@@ -531,7 +535,7 @@ module RightAws
531
535
  # is this a redirect?
532
536
  # yes!
533
537
  if response.is_a?(Net::HTTPRedirection)
534
- redirect_detected = true
538
+ redirect_detected = true
535
539
  else
536
540
  # no, it's an error ...
537
541
  @aws.logger.warn("##### #{@aws.class.name} returned an error: #{response.code} #{response.message}\n#{response.body} #####")
@@ -575,18 +579,18 @@ module RightAws
575
579
  end
576
580
  # check the time has gone from the first error come
577
581
  if redirect_detected || error_found
578
- # Close the connection to the server and recreate a new one.
579
- # It may have a chance that one server is a semi-down and reconnection
580
- # will help us to connect to the other server
582
+ # Close the connection to the server and recreate a new one.
583
+ # It may have a chance that one server is a semi-down and reconnection
584
+ # will help us to connect to the other server
581
585
  if !redirect_detected && @close_on_error
582
- @aws.connection.finish "#{self.class.name}: error match to pattern '#{error_match}'"
583
- end
584
-
586
+ @aws.connection.finish "#{self.class.name}: error match to pattern '#{error_match}'"
587
+ end
588
+
585
589
  if (Time.now < @stop_at)
586
590
  @retries += 1
587
591
  unless redirect_detected
588
592
  @aws.logger.warn("##### Retry ##{@retries} is being performed. Sleeping for #{@reiteration_delay} sec. Whole time: #{Time.now-@started_at} sec ####")
589
- sleep @reiteration_delay
593
+ sleep @reiteration_delay
590
594
  @reiteration_delay *= 2
591
595
 
592
596
  # Always make sure that the fp is set to point to the beginning(?)
@@ -605,67 +609,67 @@ module RightAws
605
609
  result = @aws.request_info(request, @parser)
606
610
  else
607
611
  @aws.logger.warn("##### Ooops, time is over... ####")
608
- end
609
- # aha, this is unhandled error:
610
- elsif @close_on_error
611
- # Is this a 5xx error ?
612
- if @aws.last_response.code.to_s[/^5\d\d$/]
613
- @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}'"
614
- # Is this a 4xx error ?
615
- elsif @aws.last_response.code.to_s[/^4\d\d$/] && @close_on_4xx_probability > rand(100)
616
- @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}', " +
617
- "probability: #{@close_on_4xx_probability}%"
612
+ end
613
+ # aha, this is unhandled error:
614
+ elsif @close_on_error
615
+ # Is this a 5xx error ?
616
+ if @aws.last_response.code.to_s[/^5\d\d$/]
617
+ @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}'"
618
+ # Is this a 4xx error ?
619
+ elsif @aws.last_response.code.to_s[/^4\d\d$/] && @close_on_4xx_probability > rand(100)
620
+ @aws.connection.finish "#{self.class.name}: code: #{@aws.last_response.code}: '#{@aws.last_response.message}', " +
621
+ "probability: #{@close_on_4xx_probability}%"
618
622
  end
619
623
  end
620
624
  result
621
625
  end
622
-
626
+
623
627
  end
624
628
 
625
629
 
626
630
  #-----------------------------------------------------------------
627
631
 
628
632
  class RightSaxParserCallback #:nodoc:
629
- def self.include_callback
630
- include XML::SaxParser::Callbacks
631
- end
632
- def initialize(right_aws_parser)
633
- @right_aws_parser = right_aws_parser
634
- end
635
- def on_start_element(name, attr_hash)
636
- @right_aws_parser.tag_start(name, attr_hash)
637
- end
638
- def on_characters(chars)
639
- @right_aws_parser.text(chars)
640
- end
641
- def on_end_element(name)
642
- @right_aws_parser.tag_end(name)
643
- end
644
- def on_start_document; end
645
- def on_comment(msg); end
646
- def on_processing_instruction(target, data); end
647
- def on_cdata_block(cdata); end
648
- def on_end_document; end
649
- end
650
-
633
+ def self.include_callback
634
+ include XML::SaxParser::Callbacks
635
+ end
636
+ def initialize(right_aws_parser)
637
+ @right_aws_parser = right_aws_parser
638
+ end
639
+ def on_start_element(name, attr_hash)
640
+ @right_aws_parser.tag_start(name, attr_hash)
641
+ end
642
+ def on_characters(chars)
643
+ @right_aws_parser.text(chars)
644
+ end
645
+ def on_end_element(name)
646
+ @right_aws_parser.tag_end(name)
647
+ end
648
+ def on_start_document; end
649
+ def on_comment(msg); end
650
+ def on_processing_instruction(target, data); end
651
+ def on_cdata_block(cdata); end
652
+ def on_end_document; end
653
+ end
654
+
651
655
  class RightAWSParser #:nodoc:
652
- # default parsing library
653
- DEFAULT_XML_LIBRARY = 'rexml'
654
- # a list of supported parsers
655
- @@supported_xml_libs = [DEFAULT_XML_LIBRARY, 'libxml']
656
-
657
- @@xml_lib = DEFAULT_XML_LIBRARY # xml library name: 'rexml' | 'libxml'
656
+ # default parsing library
657
+ DEFAULT_XML_LIBRARY = 'rexml'
658
+ # a list of supported parsers
659
+ @@supported_xml_libs = [DEFAULT_XML_LIBRARY, 'libxml']
660
+
661
+ @@xml_lib = DEFAULT_XML_LIBRARY # xml library name: 'rexml' | 'libxml'
658
662
  def self.xml_lib
659
663
  @@xml_lib
660
664
  end
661
665
  def self.xml_lib=(new_lib_name)
662
666
  @@xml_lib = new_lib_name
663
667
  end
664
-
668
+
665
669
  attr_accessor :result
666
670
  attr_reader :xmlpath
667
671
  attr_accessor :xml_lib
668
-
672
+
669
673
  def initialize(params={})
670
674
  @xmlpath = ''
671
675
  @result = false
@@ -697,52 +701,52 @@ module RightAws
697
701
  # Get response body
698
702
  xml_text = xml_text.body unless xml_text.is_a?(String)
699
703
  @xml_lib = params[:xml_lib] || @xml_lib
700
- # check that we had no problems with this library otherwise use default
701
- @xml_lib = DEFAULT_XML_LIBRARY unless @@supported_xml_libs.include?(@xml_lib)
704
+ # check that we had no problems with this library otherwise use default
705
+ @xml_lib = DEFAULT_XML_LIBRARY unless @@supported_xml_libs.include?(@xml_lib)
702
706
  # load xml library
703
707
  if @xml_lib=='libxml' && !defined?(XML::SaxParser)
704
708
  begin
705
709
  require 'xml/libxml'
706
- # is it new ? - Setup SaxParserCallback
710
+ # is it new ? - Setup SaxParserCallback
707
711
  if XML::Parser::VERSION >= '0.5.1.0'
708
- RightSaxParserCallback.include_callback
709
- end
712
+ RightSaxParserCallback.include_callback
713
+ end
710
714
  rescue LoadError => e
711
- @@supported_xml_libs.delete(@xml_lib)
712
- @xml_lib = DEFAULT_XML_LIBRARY
715
+ @@supported_xml_libs.delete(@xml_lib)
716
+ @xml_lib = DEFAULT_XML_LIBRARY
713
717
  if @logger
714
718
  @logger.error e.inspect
715
719
  @logger.error e.backtrace
716
- @logger.info "Can not load 'libxml' library. '#{DEFAULT_XML_LIBRARY}' is used for parsing."
720
+ @logger.info "Can not load 'libxml' library. '#{DEFAULT_XML_LIBRARY}' is used for parsing."
717
721
  end
718
722
  end
719
723
  end
720
724
  # Parse the xml text
721
725
  case @xml_lib
722
- when 'libxml'
723
- xml = XML::SaxParser.new
724
- xml.string = xml_text
725
- # check libxml-ruby version
726
+ when 'libxml'
727
+ xml = XML::SaxParser.new
728
+ xml.string = xml_text
729
+ # check libxml-ruby version
726
730
  if XML::Parser::VERSION >= '0.5.1.0'
727
- xml.callbacks = RightSaxParserCallback.new(self)
728
- else
729
- xml.on_start_element{|name, attr_hash| self.tag_start(name, attr_hash)}
730
- xml.on_characters{ |text| self.text(text)}
731
- xml.on_end_element{ |name| self.tag_end(name)}
732
- end
731
+ xml.callbacks = RightSaxParserCallback.new(self)
732
+ else
733
+ xml.on_start_element{|name, attr_hash| self.tag_start(name, attr_hash)}
734
+ xml.on_characters{ |text| self.text(text)}
735
+ xml.on_end_element{ |name| self.tag_end(name)}
736
+ end
733
737
  xml.parse
734
738
  else
735
739
  REXML::Document.parse_stream(xml_text, self)
736
740
  end
737
741
  end
738
- # Parser must have a lots of methods
742
+ # Parser must have a lots of methods
739
743
  # (see /usr/lib/ruby/1.8/rexml/parsers/streamparser.rb)
740
744
  # We dont need most of them in RightAWSParser and method_missing helps us
741
745
  # to skip their definition
742
746
  def method_missing(method, *params)
743
747
  # if the method is one of known - just skip it ...
744
- return if [:comment, :attlistdecl, :notationdecl, :elementdecl,
745
- :entitydecl, :cdata, :xmldecl, :attlistdecl, :instruction,
748
+ return if [:comment, :attlistdecl, :notationdecl, :elementdecl,
749
+ :entitydecl, :cdata, :xmldecl, :attlistdecl, :instruction,
746
750
  :doctype].include?(method)
747
751
  # ... else - call super to raise an exception
748
752
  super(method, params)
@@ -53,7 +53,7 @@ module RightAws #:nodoc:
53
53
  module VERSION #:nodoc:
54
54
  MAJOR = 1
55
55
  MINOR = 11
56
- TINY = 8
56
+ TINY = 9
57
57
 
58
58
  STRING = [MAJOR, MINOR, TINY].join('.')
59
59
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.8
4
+ version: 1.11.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Travis Reeder
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-04 00:00:00 -07:00
12
+ date: 2009-06-06 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.12.2
23
+ version: 2.0.0
24
24
  version:
25
25
  description: |-
26
26
  The RightScale AWS gems have been designed to provide a robust, fast, and secure interface to Amazon EC2, EBS, S3, SQS, SDB, and CloudFront.