aws-sdk 1.6.3 → 1.6.4

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 (73) hide show
  1. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +1 -0
  2. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +1 -0
  3. data/lib/aws/api_config/CloudFront-2012-05-05.yml +2137 -0
  4. data/lib/aws/api_config/CloudWatch-2010-08-01.yml +9 -0
  5. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +616 -0
  6. data/lib/aws/api_config/EC2-2012-07-20.yml +1 -0
  7. data/lib/aws/api_config/ELB-2012-06-01.yml +1 -0
  8. data/lib/aws/api_config/EMR-2009-03-31.yml +1 -0
  9. data/lib/aws/api_config/IAM-2010-05-08.yml +1 -0
  10. data/lib/aws/api_config/Route53-2012-02-29.yml +350 -349
  11. data/lib/aws/api_config/SNS-2010-03-31.yml +1 -0
  12. data/lib/aws/api_config/SQS-2011-10-01.yml +1 -0
  13. data/lib/aws/api_config/STS-2011-06-15.yml +1 -0
  14. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +1 -0
  15. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +62 -0
  16. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +1637 -0
  17. data/lib/aws/auto_scaling/client.rb +2 -37
  18. data/lib/aws/cloud_formation/client.rb +2 -17
  19. data/lib/aws/cloud_watch/client.rb +2 -15
  20. data/lib/aws/core.rb +24 -4
  21. data/lib/aws/core/client.rb +115 -46
  22. data/lib/aws/core/configuration.rb +6 -0
  23. data/lib/aws/core/credential_providers.rb +1 -0
  24. data/lib/aws/core/http/curb_handler.rb +3 -3
  25. data/lib/aws/core/http/httparty_handler.rb +15 -15
  26. data/lib/aws/core/json_client.rb +19 -77
  27. data/lib/aws/core/json_error_parser.rb +25 -0
  28. data/lib/aws/core/json_request_builder.rb +34 -0
  29. data/lib/aws/core/json_response_parser.rb +81 -0
  30. data/lib/aws/core/log_formatter.rb +25 -25
  31. data/lib/aws/core/option_grammar.rb +123 -115
  32. data/lib/aws/core/options/xml_serializer.rb +13 -9
  33. data/lib/aws/core/query_client.rb +13 -104
  34. data/lib/aws/core/query_error_parser.rb +24 -0
  35. data/lib/aws/core/query_request_builder.rb +47 -0
  36. data/lib/aws/core/query_response_parser.rb +35 -0
  37. data/lib/aws/core/rest_client.rb +13 -62
  38. data/lib/aws/core/rest_error_parser.rb +24 -0
  39. data/lib/aws/core/rest_request_builder.rb +124 -0
  40. data/lib/aws/core/rest_response_parser.rb +48 -0
  41. data/lib/aws/core/xml/parser.rb +2 -2
  42. data/lib/aws/core/xml/root_frame.rb +1 -1
  43. data/lib/aws/dynamo_db.rb +10 -9
  44. data/lib/aws/dynamo_db/binary.rb +35 -0
  45. data/lib/aws/dynamo_db/client.rb +103 -20
  46. data/lib/aws/dynamo_db/config.rb +2 -0
  47. data/lib/aws/dynamo_db/item.rb +3 -0
  48. data/lib/aws/dynamo_db/primary_key_element.rb +2 -1
  49. data/lib/aws/dynamo_db/table.rb +32 -36
  50. data/lib/aws/dynamo_db/table_collection.rb +13 -13
  51. data/lib/aws/dynamo_db/types.rb +34 -9
  52. data/lib/aws/ec2/client.rb +884 -344
  53. data/lib/aws/ec2/filtered_collection.rb +2 -3
  54. data/lib/aws/elb/client.rb +59 -45
  55. data/lib/aws/emr/client.rb +2 -11
  56. data/lib/aws/iam/client.rb +9 -80
  57. data/lib/aws/record/hash_model/attributes.rb +28 -13
  58. data/lib/aws/route_53/client.rb +6 -16
  59. data/lib/aws/s3/client.rb +2 -1
  60. data/lib/aws/s3/encryption_utils.rb +2 -7
  61. data/lib/aws/s3/s3_object.rb +5 -0
  62. data/lib/aws/simple_db/client.rb +2 -14
  63. data/lib/aws/simple_email_service/client.rb +35 -19
  64. data/lib/aws/simple_email_service/identity.rb +49 -10
  65. data/lib/aws/simple_email_service/identity_collection.rb +4 -4
  66. data/lib/aws/simple_workflow/client.rb +2 -38
  67. data/lib/aws/sns/client.rb +2 -19
  68. data/lib/aws/sqs/client.rb +2 -19
  69. data/lib/aws/sqs/errors.rb +5 -5
  70. data/lib/aws/sts/client.rb +2 -6
  71. metadata +14 -5
  72. data/lib/aws/core/rest_client/input_handler.rb +0 -145
  73. data/lib/aws/core/rest_client/output_handler.rb +0 -53
@@ -62,14 +62,14 @@ require 'aws/core/autoloader'
62
62
  # config/initializers/aws-sdk.rb
63
63
  #
64
64
  # Optionally you can create a Yaml configuration file at
65
- # RAILS_ROOT/config/aws.yaml; This should be formatted in the same manor
65
+ # RAILS_ROOT/config/aws.yml; This should be formatted in the same manor
66
66
  # as the default RAILS_ROOT/config/database.yml file (one section for
67
67
  # each Rails environment).
68
68
  #
69
69
  module AWS
70
70
 
71
71
  # Current version of the AWS SDK for Ruby
72
- VERSION = "1.6.3"
72
+ VERSION = "1.6.4"
73
73
 
74
74
  register_autoloads(self) do
75
75
  autoload :Errors, 'errors'
@@ -78,6 +78,7 @@ module AWS
78
78
  module Core
79
79
 
80
80
  AWS.register_autoloads(self) do
81
+
81
82
  autoload :AsyncHandle, 'async_handle'
82
83
  autoload :Cacheable, 'cacheable'
83
84
  autoload :Client, 'client'
@@ -87,9 +88,11 @@ module AWS
87
88
  autoload :Data, 'data'
88
89
  autoload :IndifferentHash, 'indifferent_hash'
89
90
  autoload :Inflection, 'inflection'
91
+
90
92
  autoload :JSONClient, 'json_client'
91
- autoload :QueryClient, 'query_client'
92
- autoload :RESTClient, 'rest_client'
93
+ autoload :JSONRequestBuilder, 'json_request_builder'
94
+ autoload :JSONResponseParser, 'json_response_parser'
95
+
93
96
  autoload :LazyErrorClasses, 'lazy_error_classes'
94
97
  autoload :LogFormatter, 'log_formatter'
95
98
  autoload :MetaUtils, 'meta_utils'
@@ -98,13 +101,24 @@ module AWS
98
101
  autoload :OptionGrammar, 'option_grammar'
99
102
  autoload :PageResult, 'page_result'
100
103
  autoload :Policy, 'policy'
104
+
105
+ autoload :QueryClient, 'query_client'
106
+ autoload :QueryRequestBuilder, 'query_request_builder'
107
+ autoload :QueryResponseParser, 'query_response_parser'
108
+
101
109
  autoload :Resource, 'resource'
102
110
  autoload :ResourceCache, 'resource_cache'
103
111
  autoload :Response, 'response'
104
112
  autoload :ResponseCache, 'response_cache'
113
+
114
+ autoload :RESTClient, 'rest_client'
115
+ autoload :RESTRequestBuilder, 'rest_request_builder'
116
+ autoload :RESTResponseParser, 'rest_response_parser'
117
+
105
118
  autoload :ServiceInterface, 'service_interface'
106
119
  autoload :Signer, 'signer'
107
120
  autoload :UriEscape, 'uri_escape'
121
+
108
122
  end
109
123
 
110
124
  module Options
@@ -209,6 +223,12 @@ module AWS
209
223
  # @option options [String] :cloud_formation_endpoint ('cloudformation.us-east-1.amazonaws.com')
210
224
  # The service endpoint for AWS CloudFormation.
211
225
  #
226
+ # @option options [Boolean] :dynamo_db_big_decimals (true) When +true+,
227
+ # {DynamoDB} will convert number values returned by {DynamoDB::Client}
228
+ # from strings to BigDecimal objects. If you set this to +false+,
229
+ # they will be convereted from strings into floats (with a potential
230
+ # # backwards to test xml ordering loss of precision).
231
+ #
212
232
  # @option options [String] :dynamo_db_endpoint ('dynamodb.amazonaws.com')
213
233
  # The service endpoint for Amazon DynamoDB.
214
234
  #
@@ -356,15 +356,6 @@ module AWS
356
356
  end
357
357
 
358
358
  def populate_error response
359
- response.error = extract_error(response)
360
- end
361
-
362
- # If the response contains error, this method will construct
363
- # and return an error object. If no error is contained in the
364
- # response, then nil is returned.
365
- # @param [Response] response
366
- # @return [Errors::Base,nil]
367
- def extract_error response
368
359
 
369
360
  status = response.http_response.status
370
361
 
@@ -377,14 +368,25 @@ module AWS
377
368
  error_message
378
369
  ]
379
370
 
380
- case
381
- when response.network_error? then NetworkError.new
382
- when error_code then error_class(error_code).new(*error_args)
383
- when status >= 500 then Errors::ServerError.new(*error_args)
384
- when status >= 300 then Errors::ClientError.new(*error_args)
385
- else nil # no error
386
- end
371
+ response.error =
372
+ case
373
+ when response.network_error? then NetworkError.new
374
+ when error_code then error_class(error_code).new(*error_args)
375
+ when status >= 500 then Errors::ServerError.new(*error_args)
376
+ when status >= 300 then Errors::ClientError.new(*error_args)
377
+ else nil # no error
378
+ end
379
+
380
+ end
387
381
 
382
+ # Extracts the error code and error message from a response
383
+ # if it contains an error. Returns nil otherwise. Should be defined
384
+ # in sub-classes (e.g. QueryClient, RESTClient, etc).
385
+ # @param [Response] response
386
+ # @return [Array<Code,Message>,nil] Should return an array with an
387
+ # error code and message, or +nil+.
388
+ def extract_error_details response
389
+ raise NotImplementedError
388
390
  end
389
391
 
390
392
  # Given an error code string, this method will return an error class.
@@ -511,44 +513,111 @@ module AWS
511
513
  user_agent
512
514
  end
513
515
 
514
- # Adds a single method to the current client class. This method
515
- # yields a request method builder that allows you to specify how:
516
- #
517
- # * the request is built
518
- # * the response is processed
519
- # * the response is stubbed for testing
520
- #
521
- def self.add_client_request_method method_name, options = {}, &block
516
+ class << self
517
+
518
+ # @return [Array<Symbol>] Returns a list of service operations as
519
+ # method names supported by this client.
520
+ def operations
521
+ @operations ||= []
522
+ end
522
523
 
523
- operations << method_name
524
+ # @private
525
+ def request_builders
526
+ @request_builders ||= {}
527
+ end
528
+
529
+ # @private
530
+ def response_parsers
531
+ @response_parsers ||= {}
532
+ end
533
+
534
+ protected
535
+
536
+ # Define this in sub-classes (e.g. QueryClient, RESTClient, etc)
537
+ def request_builder_for api_config, operation
538
+ raise NotImplementedError
539
+ end
524
540
 
525
- ClientRequestMethodBuilder.new(self, method_name, &block)
541
+ # Define this in sub-classes (e.g. QueryClient, RESTClient, etc)
542
+ def response_parser_for api_config, operation
543
+ raise NotImplementedError
544
+ end
545
+
546
+ # Adds a single method to the current client class. This method
547
+ # yields a request method builder that allows you to specify how:
548
+ #
549
+ # * the request is built
550
+ # * the response is processed
551
+ # * the response is stubbed for testing
552
+ #
553
+ def add_client_request_method method_name, options = {}, &block
554
+
555
+ operations << method_name
556
+
557
+ ClientRequestMethodBuilder.new(self, method_name, &block)
558
+
559
+ method_def = <<-METHOD
560
+ def #{method_name}(*args, &block)
561
+ options = args.first ? args.first : {}
562
+ client_request(#{method_name.inspect}, options, &block)
563
+ end
564
+ METHOD
565
+
566
+ module_eval(method_def)
567
+
568
+ end
569
+
570
+ # Loads the API configuration for the given API version.
571
+ # @param [String] api_version The API version date string
572
+ # (e.g. '2012-01-05').
573
+ # @return [Hash]
574
+ def load_api_config api_version
575
+ lib = File.dirname(File.dirname(__FILE__))
576
+ path = "#{lib}/api_config/#{service_name}-#{api_version}.yml"
577
+ YAML.load(File.read(path))
578
+ end
579
+
580
+ # Defines one method for each service operation described in
581
+ # the API configuration.
582
+ # @param [String] api_version
583
+ def define_client_methods api_version
584
+
585
+ const_set(:API_VERSION, api_version)
586
+
587
+ api_config = load_api_config(api_version)
588
+
589
+ api_config[:operations].each do |operation|
590
+
591
+ builder = request_builder_for(api_config, operation)
592
+ parser = response_parser_for(api_config, operation)
593
+
594
+ define_client_method(operation[:method], builder, parser)
526
595
 
527
- method_def = <<-METHOD
528
- def #{method_name}(*args, &block)
529
- options = args.first ? args.first : {}
530
- client_request(#{method_name.inspect}, options, &block)
531
596
  end
532
- METHOD
597
+ end
533
598
 
534
- module_eval(method_def)
599
+ def define_client_method method_name, builder, parser
535
600
 
536
- end
601
+ request_builders[method_name] = builder
602
+ response_parsers[method_name] = parser
537
603
 
538
- # Parses the service's API configuration yaml file. This file has
539
- # configuration that drives the request and response DSLs.
540
- # @return [Hash]
541
- def self.api_config
542
- config_file =
543
- File.dirname(File.dirname(__FILE__)) +
544
- "/api_config/#{service_name}-#{self::API_VERSION}.yml"
545
- YAML.load(File.read(config_file))
546
- end
604
+ add_client_request_method(method_name) do
605
+
606
+ configure_request do |request, request_options|
607
+ builder.populate_request(request, request_options)
608
+ end
609
+
610
+ process_response do |response|
611
+ response.data = parser.extract_data(response)
612
+ end
613
+
614
+ simulate_response do |response|
615
+ response.data = parser.simulate
616
+ end
617
+
618
+ end
619
+ end
547
620
 
548
- # @return [Array<Symbol>] Returns a list of service operations as
549
- # method names supported by this client.
550
- def self.operations
551
- @operations ||= []
552
621
  end
553
622
 
554
623
  # @private
@@ -69,6 +69,12 @@ module AWS
69
69
  # @attr_reader [String] cloud_formation_endpoint ('cloudformation.us-east-1.amazonaws.com')
70
70
  # The service endpoint for AWS CloudFormation.
71
71
  #
72
+ # @attr_reader [Boolean] dynamo_db_big_decimals (true) When +true+,
73
+ # {DynamoDB} will convert number values returned by {DynamoDB::Client}
74
+ # from strings to BigDecimal objects. If you set this to +false+,
75
+ # they will be convereted from strings into floats (with a potential
76
+ # loss of precision).
77
+ #
72
78
  # @attr_reader [String] dynamo_db_endpoint ('dynamodb.us-east-1.amazonaws.com')
73
79
  # The service endpoint for Amazon DynamoDB.
74
80
  #
@@ -14,6 +14,7 @@
14
14
  require 'set'
15
15
  require 'net/http'
16
16
  require 'timeout'
17
+ require 'thread'
17
18
 
18
19
  module AWS
19
20
  module Core
@@ -16,7 +16,7 @@ require 'thread'
16
16
  module AWS
17
17
  module Core
18
18
  module Http
19
-
19
+
20
20
  # @private
21
21
  class CurbHandler
22
22
 
@@ -86,10 +86,10 @@ module AWS
86
86
 
87
87
  private
88
88
  def make_easy_handle request, response, thread = nil
89
-
89
+
90
90
  protocol = request.use_ssl? ? 'https' : 'http'
91
91
  url = "#{protocol}://#{request.host}:#{request.port}#{request.uri}"
92
-
92
+
93
93
  curl = Curl::Easy.new(url)
94
94
  # curl.verbose = true
95
95
  request.headers.each {|k, v| curl.headers[k] = v}
@@ -16,7 +16,7 @@ require 'httparty'
16
16
  module AWS
17
17
  module Core
18
18
  module Http
19
-
19
+
20
20
  # Makes HTTP requests using HTTParty. This is the default
21
21
  # handler, so you don't need to do anything special to configure
22
22
  # it. However, you can directly instantiate this class in order
@@ -31,11 +31,11 @@ module AWS
31
31
  # )
32
32
  #
33
33
  class HTTPartyHandler
34
-
34
+
35
35
  # @return [Hash] The default options to send to HTTParty on each
36
36
  # request.
37
37
  attr_reader :default_request_options
38
-
38
+
39
39
  # Constructs a new HTTP handler using HTTParty.
40
40
  #
41
41
  # @param [Hash] options Default options to send to HTTParty on
@@ -48,25 +48,25 @@ module AWS
48
48
  def initialize options = {}
49
49
  @default_request_options = options
50
50
  end
51
-
51
+
52
52
  include HTTParty
53
-
53
+
54
54
  class NoOpParser < HTTParty::Parser
55
55
  SupportedFormats = {}
56
56
  end
57
-
57
+
58
58
  def handle(request, response)
59
-
59
+
60
60
  opts = default_request_options.merge({
61
61
  :body => request.body,
62
62
  :parser => NoOpParser
63
63
  })
64
-
64
+
65
65
  if request.proxy_uri
66
66
  opts[:http_proxyaddr] = request.proxy_uri.host
67
67
  opts[:http_proxyport] = request.proxy_uri.port
68
68
  end
69
-
69
+
70
70
  if request.use_ssl?
71
71
  protocol = 'https'
72
72
  opts[:ssl_ca_file] = request.ssl_ca_file if request.ssl_verify_peer?
@@ -75,21 +75,21 @@ module AWS
75
75
  end
76
76
 
77
77
  url = "#{protocol}://#{request.host}:#{request.port}#{request.uri}"
78
-
78
+
79
79
  # get, post, put, delete, head
80
80
  method = request.http_method.downcase
81
-
81
+
82
82
  # Net::HTTP adds this header for us when the body is
83
83
  # provided, but it messes up signing
84
84
  headers = { 'content-type' => '' }
85
-
85
+
86
86
  # headers must have string values (net http calls .strip on them)
87
87
  request.headers.each_pair do |key,value|
88
88
  headers[key] = value.to_s
89
89
  end
90
-
90
+
91
91
  opts[:headers] = headers
92
-
92
+
93
93
  begin
94
94
  http_response = self.class.send(method, url, opts)
95
95
  unless http_response.nil?
@@ -105,7 +105,7 @@ module AWS
105
105
  end
106
106
  end
107
107
 
108
- # We move this from AWS::Http to AWS::Core::Http, but we want the
108
+ # We move this from AWS::Http to AWS::Core::Http, but we want the
109
109
  # previous default handler to remain accessible from its old namesapce
110
110
  # @private
111
111
  module Http
@@ -11,94 +11,36 @@
11
11
  # ANY KIND, either express or implied. See the License for the specific
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
- require 'json'
15
-
16
14
  module AWS
17
15
  module Core
18
-
19
- # = AWS::Core::Client::JSON
20
- #
21
- # Clients extend this module if the service they represent are
22
- # AWS Query services that accept and return JSON.
23
- #
24
- module JSONClient
25
-
26
- # Constructs the option grammars, one per service operation.
27
- # @private
28
- def self.extended base
29
- base.send(:include, ErrorParser)
30
- base.send(:define_grammars)
31
- end
32
-
33
- # @return [Hash<Symbol,OptionGrammar>] Returns a hash option
34
- # grammars. Keys are method names (operations) and values are
35
- # request option grammars that convert a ruby hash of options
36
- # into a JSON document.
37
- # @private
38
- def option_grammars
39
- @option_grammars ||= {}
40
- end
16
+ class JSONClient < Core::Client
41
17
 
42
18
  protected
43
19
 
44
- # Enumerates through the operations specified in the API
45
- # configuration (yaml configuration file found in lib/api_config/)
46
- # and defines one request method per operation.
47
- def define_grammars
48
- api_config[:operations].each do |op|
49
- option_grammars[op[:method]] = OptionGrammar.customize(op[:inputs])
50
- end
20
+ def self.request_builder_for api_config, operation
21
+ JSONRequestBuilder.new(api_config[:target_prefix], operation)
51
22
  end
52
23
 
53
- def define_client_method method_name, operation
54
- add_client_request_method(method_name) do
55
-
56
- configure_request do |request, options|
57
-
58
- parser = self.class.option_grammars[method_name]
59
- x_amz_target = self.class::TARGET_PREFIX + operation
60
-
61
- request.headers["content-type"] = "application/x-amz-json-1.0"
62
- request.headers["x-amz-target"] = x_amz_target
63
- request.body = parser.to_json(options)
64
-
65
- end
66
-
67
- process_response do |response|
68
- response_body = response.http_response.body
69
- response_body = "{}" if response_body == ""
70
- data = ::JSON.load(response_body)
71
- MetaUtils.extend_method(response, :data) { data }
72
- end
73
-
74
- simulate_response do |response|
75
- data = {}
76
- MetaUtils.extend_method(response, :data) { data }
77
- end
78
-
79
- end
24
+ def self.response_parser_for api_config, operation
25
+ JSONResponseParser.new(operation[:outputs])
80
26
  end
81
27
 
82
- module ErrorParser
83
-
84
- def extract_error_details response
85
- if
86
- response.http_response.status >= 300 and
87
- body = response.http_response.body and
88
- json = (::JSON.load(body) rescue nil) and
89
- type = json["__type"] and
90
- matches = type.match(/\#(.*)$/)
91
- then
92
- code = matches[1]
93
- if code == 'RequestEntityTooLarge'
94
- message = 'Request body must be less than 1 MB'
95
- else
96
- message = json['message']
97
- end
98
- [code, message]
28
+ def extract_error_details response
29
+ if
30
+ response.http_response.status >= 300 and
31
+ body = response.http_response.body and
32
+ json = (::JSON.load(body) rescue nil) and
33
+ type = json["__type"] and
34
+ matches = type.match(/\#(.*)$/)
35
+ then
36
+ code = matches[1]
37
+ if code == 'RequestEntityTooLarge'
38
+ message = 'Request body must be less than 1 MB'
39
+ else
40
+ message = json['message']
99
41
  end
42
+ [code, message]
100
43
  end
101
-
102
44
  end
103
45
 
104
46
  end