aws-sdk 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. data/.yardopts +0 -1
  2. data/lib/aws/api_config/AutoScaling-2011-01-01.yml +772 -544
  3. data/lib/aws/api_config/CloudFormation-2010-05-15.yml +284 -185
  4. data/lib/aws/api_config/DynamoDB-2011-12-05.yml +458 -738
  5. data/lib/aws/api_config/EC2-2011-12-15.yml +3502 -2653
  6. data/lib/aws/api_config/ELB-2011-08-15.yml +484 -352
  7. data/lib/aws/api_config/IAM-2010-05-08.yml +899 -711
  8. data/lib/aws/api_config/SNS-2010-03-31.yml +235 -167
  9. data/lib/aws/api_config/SQS-2011-10-01.yml +290 -251
  10. data/lib/aws/api_config/STS-2011-06-15.yml +35 -41
  11. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +290 -263
  12. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +144 -130
  13. data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +697 -1139
  14. data/lib/aws/auto_scaling/activity_collection.rb +1 -1
  15. data/lib/aws/auto_scaling/client.rb +724 -9
  16. data/lib/aws/auto_scaling/errors.rb +1 -5
  17. data/lib/aws/auto_scaling/group.rb +1 -1
  18. data/lib/aws/auto_scaling/group_collection.rb +1 -1
  19. data/lib/aws/auto_scaling/instance_collection.rb +1 -1
  20. data/lib/aws/auto_scaling/launch_configuration.rb +1 -1
  21. data/lib/aws/auto_scaling/launch_configuration_collection.rb +1 -1
  22. data/lib/aws/auto_scaling/notification_configuration_collection.rb +1 -1
  23. data/lib/aws/auto_scaling/request.rb +1 -2
  24. data/lib/aws/auto_scaling/scaling_policy_collection.rb +1 -1
  25. data/lib/aws/auto_scaling/scheduled_action_collection.rb +3 -3
  26. data/lib/aws/auto_scaling/tag_collection.rb +1 -1
  27. data/lib/aws/cloud_formation.rb +1 -18
  28. data/lib/aws/cloud_formation/client.rb +314 -8
  29. data/lib/aws/cloud_formation/errors.rb +1 -5
  30. data/lib/aws/cloud_formation/request.rb +1 -2
  31. data/lib/aws/cloud_formation/stack.rb +4 -3
  32. data/lib/aws/cloud_formation/stack_collection.rb +2 -2
  33. data/lib/aws/cloud_formation/stack_resource_collection.rb +1 -1
  34. data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +2 -2
  35. data/lib/aws/cloud_formation/stack_summary_collection.rb +1 -1
  36. data/lib/aws/core.rb +29 -14
  37. data/lib/aws/core/async_handle.rb +11 -12
  38. data/lib/aws/core/client.rb +112 -102
  39. data/lib/aws/core/client/query_json.rb +110 -0
  40. data/lib/aws/core/client/query_xml.rb +122 -0
  41. data/lib/aws/core/data.rb +242 -0
  42. data/lib/aws/core/http/request.rb +7 -4
  43. data/lib/aws/core/lazy_error_classes.rb +60 -38
  44. data/lib/aws/core/option_grammar.rb +1 -0
  45. data/lib/aws/core/policy.rb +2 -1
  46. data/lib/aws/core/resource.rb +38 -33
  47. data/lib/aws/core/response.rb +109 -44
  48. data/lib/aws/core/signature/version_2.rb +42 -0
  49. data/lib/aws/core/signature/version_3.rb +73 -0
  50. data/lib/aws/core/signature/version_3_http.rb +72 -0
  51. data/lib/aws/core/signature/version_4.rb +138 -0
  52. data/lib/aws/core/uri_escape.rb +6 -9
  53. data/lib/aws/core/xml/frame.rb +242 -0
  54. data/lib/aws/core/xml/frame_stack.rb +85 -0
  55. data/lib/aws/core/xml/grammar.rb +299 -0
  56. data/lib/aws/core/xml/parser.rb +70 -0
  57. data/lib/aws/core/xml/root_frame.rb +65 -0
  58. data/lib/aws/core/{configured_xml_grammars.rb → xml/sax_handlers/libxml.rb} +22 -20
  59. data/lib/aws/core/xml/sax_handlers/nokogiri.rb +55 -0
  60. data/lib/aws/core/{authorize_with_session_token.rb → xml/sax_handlers/ox.rb} +19 -7
  61. data/lib/aws/core/{configured_option_grammars.rb → xml/sax_handlers/rexml.rb} +22 -23
  62. data/lib/aws/core/xml/stub.rb +123 -0
  63. data/lib/aws/dynamo_db/batch_get.rb +1 -1
  64. data/lib/aws/dynamo_db/client.rb +796 -14
  65. data/lib/aws/dynamo_db/errors.rb +1 -38
  66. data/lib/aws/dynamo_db/item_collection.rb +29 -28
  67. data/lib/aws/dynamo_db/request.rb +3 -53
  68. data/lib/aws/dynamo_db/table.rb +6 -2
  69. data/lib/aws/ec2/attachment.rb +1 -1
  70. data/lib/aws/ec2/client.rb +3954 -9
  71. data/lib/aws/ec2/dhcp_options.rb +3 -3
  72. data/lib/aws/ec2/errors.rb +10 -4
  73. data/lib/aws/ec2/instance.rb +7 -6
  74. data/lib/aws/ec2/instance_collection.rb +2 -2
  75. data/lib/aws/ec2/key_pair_collection.rb +3 -3
  76. data/lib/aws/ec2/network_acl.rb +4 -2
  77. data/lib/aws/ec2/network_acl/entry.rb +10 -10
  78. data/lib/aws/ec2/network_interface.rb +2 -3
  79. data/lib/aws/ec2/network_interface/attachment.rb +8 -8
  80. data/lib/aws/ec2/permission_collection.rb +3 -3
  81. data/lib/aws/ec2/request.rb +1 -3
  82. data/lib/aws/ec2/resource_tag_collection.rb +4 -8
  83. data/lib/aws/ec2/route_table.rb +3 -2
  84. data/lib/aws/ec2/route_table/route.rb +7 -7
  85. data/lib/aws/ec2/security_group.rb +2 -2
  86. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +16 -5
  87. data/lib/aws/ec2/security_group/ingress_ip_permission_collection.rb +4 -3
  88. data/lib/aws/ec2/security_group/ip_permission.rb +1 -2
  89. data/lib/aws/ec2/snapshot_collection.rb +6 -3
  90. data/lib/aws/ec2/subnet.rb +1 -1
  91. data/lib/aws/ec2/volume.rb +1 -3
  92. data/lib/aws/ec2/volume_collection.rb +2 -0
  93. data/lib/aws/elb/availability_zone_collection.rb +2 -2
  94. data/lib/aws/elb/backend_server_policy_collection.rb +1 -1
  95. data/lib/aws/elb/client.rb +513 -9
  96. data/lib/aws/elb/errors.rb +2 -6
  97. data/lib/aws/elb/instance_collection.rb +2 -2
  98. data/lib/aws/elb/request.rb +1 -1
  99. data/lib/aws/errors.rb +61 -74
  100. data/lib/aws/iam.rb +2 -3
  101. data/lib/aws/iam/client.rb +1178 -10
  102. data/lib/aws/iam/collection.rb +2 -1
  103. data/lib/aws/iam/errors.rb +1 -6
  104. data/lib/aws/iam/group.rb +8 -9
  105. data/lib/aws/iam/request.rb +1 -1
  106. data/lib/aws/iam/server_certificate_collection.rb +8 -5
  107. data/lib/aws/iam/signing_certificate.rb +1 -1
  108. data/lib/aws/iam/user.rb +2 -2
  109. data/lib/aws/iam/user_policy.rb +3 -2
  110. data/lib/aws/rails.rb +1 -2
  111. data/lib/aws/record.rb +3 -3
  112. data/lib/aws/record/abstract_base.rb +0 -3
  113. data/lib/aws/record/attributes.rb +7 -7
  114. data/lib/aws/record/model.rb +19 -19
  115. data/lib/aws/record/model/finder_methods.rb +7 -7
  116. data/lib/aws/s3/bucket.rb +7 -2
  117. data/lib/aws/s3/client.rb +391 -398
  118. data/lib/aws/s3/client/xml.rb +44 -71
  119. data/lib/aws/s3/data_options.rb +3 -2
  120. data/lib/aws/s3/errors.rb +8 -11
  121. data/lib/aws/s3/multipart_upload_collection.rb +1 -3
  122. data/lib/aws/s3/object_collection.rb +2 -1
  123. data/lib/aws/s3/object_metadata.rb +2 -2
  124. data/lib/aws/s3/paginated_collection.rb +2 -2
  125. data/lib/aws/s3/prefix_and_delimiter_collection.rb +1 -1
  126. data/lib/aws/s3/presigned_post.rb +18 -17
  127. data/lib/aws/s3/request.rb +4 -3
  128. data/lib/aws/s3/s3_object.rb +8 -10
  129. data/lib/aws/simple_db/attribute.rb +2 -2
  130. data/lib/aws/simple_db/attribute_collection.rb +14 -4
  131. data/lib/aws/simple_db/client.rb +313 -14
  132. data/lib/aws/simple_db/domain.rb +1 -1
  133. data/lib/aws/simple_db/domain_collection.rb +4 -4
  134. data/lib/aws/simple_db/domain_metadata.rb +1 -1
  135. data/lib/aws/simple_db/errors.rb +14 -2
  136. data/lib/aws/simple_db/expect_condition_option.rb +1 -1
  137. data/lib/aws/simple_db/item.rb +1 -1
  138. data/lib/aws/simple_db/item_collection.rb +9 -9
  139. data/lib/aws/simple_db/item_data.rb +9 -6
  140. data/lib/aws/simple_db/request.rb +1 -1
  141. data/lib/aws/simple_email_service.rb +8 -7
  142. data/lib/aws/simple_email_service/client.rb +174 -9
  143. data/lib/aws/simple_email_service/email_address_collection.rb +0 -1
  144. data/lib/aws/simple_email_service/errors.rb +1 -5
  145. data/lib/aws/simple_email_service/quotas.rb +8 -6
  146. data/lib/aws/simple_email_service/request.rb +7 -1
  147. data/lib/aws/simple_workflow/client.rb +1383 -6
  148. data/lib/aws/simple_workflow/decision_task.rb +1 -3
  149. data/lib/aws/simple_workflow/errors.rb +1 -38
  150. data/lib/aws/simple_workflow/history_event_collection.rb +2 -2
  151. data/lib/aws/simple_workflow/request.rb +5 -49
  152. data/lib/aws/simple_workflow/type.rb +1 -1
  153. data/lib/aws/simple_workflow/type_collection.rb +4 -3
  154. data/lib/aws/simple_workflow/workflow_execution_collection.rb +2 -2
  155. data/lib/aws/sns/client.rb +345 -9
  156. data/lib/aws/sns/errors.rb +1 -5
  157. data/lib/aws/sns/request.rb +1 -2
  158. data/lib/aws/sns/subscription_collection.rb +2 -2
  159. data/lib/aws/sns/topic.rb +15 -14
  160. data/lib/aws/sns/topic_collection.rb +1 -1
  161. data/lib/aws/sqs/client.rb +334 -9
  162. data/lib/aws/sqs/errors.rb +1 -6
  163. data/lib/aws/sqs/queue.rb +20 -21
  164. data/lib/aws/sqs/queue_collection.rb +3 -3
  165. data/lib/aws/sqs/request.rb +2 -2
  166. data/lib/aws/sts.rb +8 -10
  167. data/lib/aws/sts/client.rb +67 -10
  168. data/lib/aws/sts/errors.rb +1 -5
  169. data/lib/aws/sts/request.rb +1 -1
  170. data/lib/user.rb +49 -0
  171. metadata +21 -28
  172. data/lib/aws/auto_scaling/client/xml.rb +0 -32
  173. data/lib/aws/cloud_formation/client/xml.rb +0 -32
  174. data/lib/aws/core/api_config.rb +0 -44
  175. data/lib/aws/core/authorize_v2.rb +0 -39
  176. data/lib/aws/core/authorize_v3.rb +0 -38
  177. data/lib/aws/core/authorize_v4.rb +0 -149
  178. data/lib/aws/core/configured_client_methods.rb +0 -76
  179. data/lib/aws/core/configured_grammars.rb +0 -63
  180. data/lib/aws/core/configured_json_client_methods.rb +0 -74
  181. data/lib/aws/core/ignore_result_element.rb +0 -34
  182. data/lib/aws/core/json_client.rb +0 -41
  183. data/lib/aws/core/xml_grammar.rb +0 -957
  184. data/lib/aws/ec2/client/xml.rb +0 -175
  185. data/lib/aws/elb/client/xml.rb +0 -33
  186. data/lib/aws/elb/listener_spec.rb +0 -14
  187. data/lib/aws/iam/client/xml.rb +0 -34
  188. data/lib/aws/simple_db/client/options.rb +0 -32
  189. data/lib/aws/simple_db/client/xml.rb +0 -63
  190. data/lib/aws/simple_email_service/client/xml.rb +0 -34
  191. data/lib/aws/sns/client/xml.rb +0 -34
  192. data/lib/aws/sqs/client/xml.rb +0 -33
  193. data/lib/aws/sts/client/xml.rb +0 -34
@@ -13,13 +13,9 @@
13
13
 
14
14
  module AWS
15
15
  class CloudFormation
16
-
17
- # @private
18
16
  module Errors
19
17
 
20
- BASE_ERROR_GRAMMAR = Client::XML::BaseError
21
-
22
- include Core::LazyErrorClasses
18
+ extend Core::LazyErrorClasses
23
19
 
24
20
  end
25
21
  end
@@ -17,8 +17,7 @@ module AWS
17
17
  # @private
18
18
  class Request < Core::Http::Request
19
19
 
20
- include Core::AuthorizeV4
21
- include Core::AuthorizeWithSessionToken
20
+ include Core::Signature::Version4
22
21
 
23
22
  def service
24
23
  'cloudformation'
@@ -99,7 +99,7 @@ module AWS
99
99
  describe_attribute :parameters do
100
100
  translates_output do |params|
101
101
  params.inject({}) do |hash,param|
102
- hash.merge(param.parameter_key => param.parameter_value)
102
+ hash.merge(param[:parameter_key] => param[:parameter_value])
103
103
  end
104
104
  end
105
105
  end
@@ -112,7 +112,7 @@ module AWS
112
112
 
113
113
  provider(:describe_stacks) do |provider|
114
114
  provider.find do |resp|
115
- resp.stacks.find{|stack| stack.stack_name == name }
115
+ resp.data[:stacks].find{|stack| stack[:stack_name] == name }
116
116
  end
117
117
  provider.provides *describe_attributes.keys
118
118
  end
@@ -127,7 +127,8 @@ module AWS
127
127
  # @return [Array<StackOutput>]
128
128
  def outputs
129
129
  output_details.collect do |o|
130
- StackOutput.new(self, o.output_key, o.output_value, o.description)
130
+ key, value, desc = o.values_at(:output_key, :output_value, :description)
131
+ StackOutput.new(self, key, value, desc)
131
132
  end
132
133
  end
133
134
 
@@ -188,12 +188,12 @@ module AWS
188
188
  protected
189
189
 
190
190
  def _each_item options = {}
191
- client.describe_stacks.stacks.each do |summary|
191
+ client.describe_stacks.data[:stacks].each do |summary|
192
192
 
193
193
  stack = Stack.new_from(
194
194
  :describe_stacks,
195
195
  summary,
196
- summary.stack_name,
196
+ summary[:stack_name],
197
197
  :config => config)
198
198
 
199
199
  yield(stack)
@@ -23,7 +23,7 @@ module AWS
23
23
  # = Other Ways to Get Resource Details
24
24
  #
25
25
  # If you want to get a {StackResource} by its physical resource
26
- # id, then you should use {CloudFormation#get_resource}.
26
+ # id, then you should use {CloudFormation#stack_resource}.
27
27
  #
28
28
  # You can also take a look at {Stack#resource_summaries} for
29
29
  # light-weight hashes of stack resource details.
@@ -38,7 +38,7 @@ module AWS
38
38
  include Core::Collection::Simple
39
39
 
40
40
  # @param [Stack] stack
41
- # @param [Hash[ options
41
+ # @param [Hash] options
42
42
  def initialize stack, options = {}
43
43
  @stack = stack
44
44
  super
@@ -62,7 +62,7 @@ module AWS
62
62
  yield(summary.to_hash)
63
63
  end
64
64
 
65
- next_token = resp.next_token if resp.respond_to?(:next_token)
65
+ next_token = resp.data[:next_token]
66
66
 
67
67
  end while next_token
68
68
  end
@@ -117,7 +117,7 @@ module AWS
117
117
  yield(summary.to_hash)
118
118
  end
119
119
 
120
- next_token = resp.next_token if resp.respond_to?(:next_token)
120
+ next_token = resp.data[:next_token]
121
121
 
122
122
  end while next_token
123
123
  end
data/lib/aws/core.rb CHANGED
@@ -61,7 +61,7 @@ require 'aws/core/autoloader'
61
61
  module AWS
62
62
 
63
63
  # Current version of the AWS SDK for Ruby
64
- VERSION = "1.4.1"
64
+ VERSION = "1.5.0"
65
65
 
66
66
  register_autoloads(self) do
67
67
  autoload :Errors, 'errors'
@@ -70,26 +70,15 @@ module AWS
70
70
  module Core
71
71
 
72
72
  AWS.register_autoloads(self) do
73
- autoload :ApiConfig, 'api_config'
74
73
  autoload :AsyncHandle, 'async_handle'
75
- autoload :AuthorizeV2, 'authorize_v2'
76
- autoload :AuthorizeV3, 'authorize_v3'
77
- autoload :AuthorizeV4, 'authorize_v4'
78
- autoload :AuthorizeWithSessionToken, 'authorize_with_session_token'
79
74
  autoload :Cacheable, 'cacheable'
80
75
  autoload :Client, 'client'
81
76
  autoload :Collection, 'collection'
82
77
  autoload :Configuration, 'configuration'
83
- autoload :ConfiguredClientMethods, 'configured_client_methods'
84
- autoload :ConfiguredGrammars, 'configured_grammars'
85
- autoload :ConfiguredJsonClientMethods, 'configured_json_client_methods'
86
- autoload :ConfiguredOptionGrammars, 'configured_option_grammars'
87
- autoload :ConfiguredXmlGrammars, 'configured_xml_grammars'
78
+ autoload :Data, 'data'
88
79
  autoload :DefaultSigner, 'default_signer'
89
- autoload :IgnoreResultElement, 'ignore_result_element'
90
80
  autoload :IndifferentHash, 'indifferent_hash'
91
81
  autoload :Inflection, 'inflection'
92
- autoload :JsonClient, 'json_client'
93
82
  autoload :LazyErrorClasses, 'lazy_error_classes'
94
83
  autoload :LogFormatter, 'log_formatter'
95
84
  autoload :MetaUtils, 'meta_utils'
@@ -105,7 +94,33 @@ module AWS
105
94
  autoload :ServiceInterface, 'service_interface'
106
95
  autoload :SessionSigner, 'session_signer'
107
96
  autoload :UriEscape, 'uri_escape'
108
- autoload :XmlGrammar, 'xml_grammar'
97
+ end
98
+
99
+ module Signature
100
+ AWS.register_autoloads(self) do
101
+ autoload :Version2, 'version_2'
102
+ autoload :Version3, 'version_3'
103
+ autoload :Version4, 'version_4'
104
+ end
105
+ end
106
+
107
+ module XML
108
+ AWS.register_autoloads(self) do
109
+ autoload :Parser, 'parser'
110
+ autoload :Grammar, 'grammar'
111
+ autoload :Stub, 'stub'
112
+ autoload :Frame, 'frame'
113
+ autoload :RootFrame, 'root_frame'
114
+ autoload :FrameStack, 'frame_stack'
115
+ end
116
+
117
+ module SaxHandlers
118
+ AWS.register_autoloads(self, 'aws/core/xml/sax_handlers') do
119
+ autoload :Nokogiri, 'nokogiri'
120
+ autoload :REXML, 'rexml'
121
+ end
122
+ end
123
+
109
124
  end
110
125
 
111
126
  module Http
@@ -16,7 +16,6 @@ module AWS
16
16
 
17
17
  # Mixin that provides a generic callback facility for asynchronous
18
18
  # tasks that can either succeed or fail.
19
- # @private
20
19
  module AsyncHandle
21
20
 
22
21
  # Called to signal success and fire off the success and complete callbacks.
@@ -36,11 +35,11 @@ module AWS
36
35
  #
37
36
  # If this is called when the task has already completed
38
37
  # successfully, it will call the callback immediately.
39
- def on_success(&blk)
38
+ def on_success(&block)
40
39
  if @_async_status == :success
41
- blk.call
40
+ block.call
42
41
  else
43
- (@_async_callbacks ||= []) << { :success => blk }
42
+ (@_async_callbacks ||= []) << { :success => block }
44
43
  end
45
44
  end
46
45
 
@@ -50,11 +49,11 @@ module AWS
50
49
  #
51
50
  # If this is called when the task has already failed, it will
52
51
  # call the callback immediately.
53
- def on_failure(&blk)
52
+ def on_failure(&block)
54
53
  if @_async_status == :failure
55
- blk.call
54
+ block.call
56
55
  else
57
- (@_async_callbacks ||= []) << { :failure => blk }
56
+ (@_async_callbacks ||= []) << { :failure => block }
58
57
  end
59
58
  end
60
59
 
@@ -67,13 +66,13 @@ module AWS
67
66
  #
68
67
  # If this is called when the task has already completed, it will
69
68
  # call the callback immediately.
70
- def on_complete(&blk)
69
+ def on_complete(&block)
71
70
  if !@_async_status.nil?
72
- blk.call(@_async_status)
71
+ block.call(@_async_status)
73
72
  else
74
73
  (@_async_callbacks ||= []) << {
75
- :failure => lambda { blk.call(:failure) },
76
- :success => lambda { blk.call(:success) }
74
+ :failure => lambda { block.call(:failure) },
75
+ :success => lambda { block.call(:success) }
77
76
  }
78
77
  end
79
78
  end
@@ -83,7 +82,7 @@ module AWS
83
82
  @_async_status = kind
84
83
  @_async_callbacks.map do |cb|
85
84
  cb[kind]
86
- end.compact.each { |blk| blk.call } if @_async_callbacks
85
+ end.compact.each {|block| block.call } if @_async_callbacks
87
86
  end
88
87
 
89
88
  end
@@ -12,17 +12,19 @@
12
12
  # language governing permissions and limitations under the License.
13
13
 
14
14
  require 'set'
15
+ require 'aws/core/client/query_xml'
16
+ require 'aws/core/client/query_json'
15
17
 
16
18
  module AWS
17
19
  module Core
18
20
 
19
- # Base class for all of the Amazon AWS service clients.
20
- # @private
21
+ # Base client class for all of the Amazon AWS service clients.
21
22
  class Client
22
23
 
23
24
  extend Naming
24
25
 
25
- CACHEABLE_REQUESTS = Set.new
26
+ # @private
27
+ CACHEABLE_REQUESTS = Set[]
26
28
 
27
29
  # Creates a new low-level client.
28
30
  #
@@ -82,18 +84,27 @@ module AWS
82
84
  # @return [DefaultSigner,Object] Returns the signer for this client.
83
85
  # This is normally a DefaultSigner, but it can be configured to
84
86
  # an other object.
87
+ # @private
85
88
  attr_reader :signer
86
89
 
87
90
  # @return [String] The snake-cased ruby name for the service
88
91
  # (e.g. 's3', 'iam', 'dynamo_db', etc).
92
+ # @private
89
93
  attr_reader :service_ruby_name
90
94
 
91
95
  # @return [Integer] What port this client makes requests via.
96
+ # @private
92
97
  attr_reader :port
93
98
 
94
99
  # @return [String] Returns the service endpoint (hostname) this client
95
100
  # makes requests against.
101
+ # @private
96
102
  attr_reader :endpoint
103
+
104
+ # @return (see Client.operations)
105
+ def operations
106
+ self.class.operations
107
+ end
97
108
 
98
109
  # Returns a copy of the client with a different HTTP handler.
99
110
  # You can pass an object like BuiltinHttpHandler or you can
@@ -126,7 +137,7 @@ module AWS
126
137
  with_config(config.with(options))
127
138
  end
128
139
 
129
- # @param [Configuration] The configuration object to use.
140
+ # @param [Configuration] config The configuration object to use.
130
141
  # @return [Core::Client] Returns a new client object with the given
131
142
  # configuration.
132
143
  def with_config config
@@ -155,21 +166,15 @@ module AWS
155
166
  end
156
167
 
157
168
  protected
169
+
158
170
  def new_request
159
- req = self.class::REQUEST_CLASS.new
160
- req.http_method = 'POST'
161
- req.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
162
- req.add_param 'Timestamp', Time.now.utc.strftime('%Y-%m-%dT%H:%M:%SZ')
163
- req.add_param 'Version', self.class::API_VERSION
164
- req
171
+ eval(self.class.name.sub(/::Client$/, ''))::Request.new
165
172
  end
166
173
 
167
- protected
168
174
  def new_response(*args, &block)
169
175
  Response.new(*args, &block)
170
176
  end
171
177
 
172
- private
173
178
  def make_async_request response
174
179
 
175
180
  pauses = async_request_with_retries(response, response.http_request)
@@ -178,7 +183,6 @@ module AWS
178
183
 
179
184
  end
180
185
 
181
- private
182
186
  def async_request_with_retries response, http_request, retry_delays = nil
183
187
 
184
188
  response.http_response = Http::Response.new
@@ -210,7 +214,6 @@ module AWS
210
214
 
211
215
  end
212
216
 
213
- private
214
217
  def make_sync_request response
215
218
  retry_server_errors do
216
219
 
@@ -218,8 +221,6 @@ module AWS
218
221
  Http::Response.new
219
222
 
220
223
  @http_handler.handle(response.http_request, http_response)
221
-
222
- populate_error(response)
223
224
 
224
225
  populate_error(response)
225
226
  response.signal_success unless response.error
@@ -228,7 +229,6 @@ module AWS
228
229
  end
229
230
  end
230
231
 
231
- private
232
232
  def retry_server_errors &block
233
233
 
234
234
  response = yield
@@ -246,31 +246,26 @@ module AWS
246
246
 
247
247
  end
248
248
 
249
- private
250
249
  def rebuild_http_request response
251
250
  response.rebuild_request
252
251
  response.retry_count += 1
253
252
  end
254
253
 
255
- private
256
254
  def sleep_durations response
257
255
  factor = scaling_factor(response)
258
256
  Array.new(config.max_retries) {|n| (2 ** n) * factor }
259
257
  end
260
258
 
261
- private
262
259
  def scaling_factor response
263
260
  response.throttled? ? (0.5 + Kernel.rand * 0.1) : 0.3
264
261
  end
265
262
 
266
- private
267
263
  def should_retry? response
268
264
  response.timeout? or
269
265
  response.throttled? or
270
266
  response.error.kind_of?(Errors::ServerError)
271
267
  end
272
268
 
273
- private
274
269
  def return_or_raise options, &block
275
270
  response = yield
276
271
  unless options[:async]
@@ -279,85 +274,99 @@ module AWS
279
274
  response
280
275
  end
281
276
 
282
- private
283
- def log_client_request options
277
+ # Yields to the given block (which should be making a
278
+ # request and returning a {Response} object). The results of the
279
+ # request/response are logged.
280
+ #
281
+ # @param [Hash] options
282
+ # @option options [Boolean] :async
283
+ # @return [Response]
284
+ def log_client_request options, &block
284
285
 
285
286
  # time the request, retries and all
286
287
  start = Time.now
287
288
  response = yield
288
289
  response.duration = Time.now - start
289
290
 
290
- if config.logger
291
- if options[:async]
292
- response.on_complete { log_response(response) }
293
- else
294
- log_response(response)
295
- end
291
+ if options[:async]
292
+ response.on_complete { log_response(response) }
293
+ else
294
+ log_response(response)
296
295
  end
297
296
 
298
297
  response
299
298
 
300
299
  end
301
300
 
301
+ # Logs the response to the configured logger.
302
+ # @param [Resposne] response
303
+ # @return [nil]
302
304
  def log_response response
303
- message = config.log_formatter.format(response)
304
- config.logger.send(config.log_level, message)
305
+ if config.logger
306
+ message = config.log_formatter.format(response)
307
+ config.logger.send(config.log_level, message)
308
+ end
309
+ nil
305
310
  end
306
311
 
307
- protected
308
312
  def populate_error response
309
-
310
- # clear out a previous error
311
- response.error = nil
313
+ response.error = extract_error(response)
314
+ end
315
+
316
+ # If the response contains error, this method will construct
317
+ # and return an error object. If no error is contained in the
318
+ # response, then nil is returned.
319
+ # @param [Response] response
320
+ # @return [Errors::Base,nil]
321
+ def extract_error response
322
+
312
323
  status = response.http_response.status
313
- code = nil
314
- code = extract_error_code(response)
324
+
325
+ error_code, error_message = extract_error_details(response)
326
+
327
+ error_args = [
328
+ response.http_request,
329
+ response.http_response,
330
+ error_code,
331
+ error_message
332
+ ]
315
333
 
316
334
  case
317
- when response.timeout?
318
- response.error = Timeout::Error.new
319
-
320
- when code
321
- response.error =
322
- service_module::Errors.error_class(code).new(response.http_request,
323
- response.http_response)
324
- when status >= 500
325
- response.error =
326
- Errors::ServerError.new(response.http_request, response.http_response)
327
-
328
- when status >= 300
329
- response.error =
330
- Errors::ClientError.new(response.http_request, response.http_response)
331
- end
332
-
333
- end
334
-
335
- protected
336
- def extract_error_code response
337
- if response.http_response.status >= 300 and
338
- body = response.http_response.body and
339
- parse = xml_error_grammar.parse(body) and
340
- parse.respond_to?(:code)
341
- parse.code
335
+ when response.timeout? then TimeoutError.new
336
+ when error_code then error_class(error_code).new(*error_args)
337
+ when status >= 500 then Errors::ServerError.new(*error_args)
338
+ when status >= 300 then Errors::ClientError.new(*error_args)
339
+ else nil # no error
342
340
  end
341
+
343
342
  end
344
343
 
345
- protected
346
- def xml_error_grammar
347
- if service_module::const_defined?(:Errors) and
348
- service_module::Errors::const_defined?(:BASE_ERROR_GRAMMAR)
349
- service_module::Errors::BASE_ERROR_GRAMMAR
350
- else
351
- XmlGrammar
352
- end
344
+ # Given an error code string, this method will return an error class.
345
+ #
346
+ # AWS::EC2::Client.new.send(:error_code, 'InvalidInstanceId')
347
+ # #=> AWS::EC2::Errors::InvalidInstanceId
348
+ #
349
+ # @param [String] error_code The error code string as returned by
350
+ # the service. If this class contains periods, they will be
351
+ # converted into namespaces (e.g. 'Foo.Bar' becomes Errors::Foo::Bar).
352
+ #
353
+ # @return [Class]
354
+ #
355
+ def error_class error_code
356
+ errors_module.error_class(error_code)
353
357
  end
354
-
355
- protected
356
- def service_module
357
- AWS.const_get(self.class.to_s[/(\w+)::Client/, 1])
358
+
359
+ # Returns the ::Errors module for the current client.
360
+ #
361
+ # AWS::S3::Client.new.errors_module
362
+ # #=> AWS::S3::Errors
363
+ #
364
+ # @return [Module]
365
+ #
366
+ def errors_module
367
+ AWS.const_get(self.class.to_s[/(\w+)::Client/, 1])::Errors
358
368
  end
359
369
 
360
- private
361
370
  def client_request name, options, &block
362
371
  return_or_raise(options) do
363
372
  log_client_request(options) do
@@ -407,13 +416,12 @@ module AWS
407
416
  end
408
417
  end
409
418
 
410
- private
411
419
  def cacheable_request? name, options
412
420
  self.class::CACHEABLE_REQUESTS.include?(name)
413
421
  end
414
422
 
415
- private
416
423
  def build_request(name, options, &block)
424
+
417
425
  # we dont want to pass the async option to the configure block
418
426
  opts = options.dup
419
427
  opts.delete(:async)
@@ -432,12 +440,14 @@ module AWS
432
440
  http_request.ssl_ca_path = config.ssl_ca_path if config.ssl_ca_path
433
441
 
434
442
  send("configure_#{name}_request", http_request, opts, &block)
443
+
435
444
  http_request.headers["user-agent"] = user_agent_string
436
445
  http_request.add_authorization!(signer)
446
+
437
447
  http_request
448
+
438
449
  end
439
450
 
440
- private
441
451
  def user_agent_string
442
452
  engine = (RUBY_ENGINE rescue nil or "ruby")
443
453
  user_agent = "%s aws-sdk-ruby/#{VERSION} %s/%s %s" %
@@ -449,24 +459,18 @@ module AWS
449
459
  user_agent
450
460
  end
451
461
 
452
- private
462
+ # Adds a single method to the current client class. This method
463
+ # yields a request method builder that allows you to specify how:
464
+ #
465
+ # * the request is built
466
+ # * the response is processed
467
+ # * the response is stubbed for testing
468
+ #
453
469
  def self.add_client_request_method method_name, options = {}, &block
470
+
471
+ self.operations << method_name
454
472
 
455
- method = ClientRequestMethodBuilder.new(self, method_name, &block)
456
-
457
- if xml_grammar = options[:xml_grammar]
458
-
459
- method.process_response do |resp|
460
- xml_grammar.parse(resp.http_response.body, :context => resp)
461
- super(resp)
462
- end
463
-
464
- method.simulate_response do |resp|
465
- xml_grammar.simulate(resp)
466
- super(resp)
467
- end
468
-
469
- end
473
+ ClientRequestMethodBuilder.new(self, method_name, &block)
470
474
 
471
475
  module_eval <<-END
472
476
  def #{method_name}(*args, &block)
@@ -476,13 +480,19 @@ module AWS
476
480
  END
477
481
 
478
482
  end
479
-
480
- protected
481
- def self.configure_client
482
-
483
- module_eval('module Options; end')
484
- module_eval('module XML; end')
485
-
483
+
484
+ # Parses the service's API configuration yaml file. This file has
485
+ # configuration that drives the request and response DSLs.
486
+ # @return [Hash]
487
+ def self.api_config
488
+ path = "lib/aws/api_config/#{service_name}-#{self::API_VERSION}.yml"
489
+ YAML.load(File.read(path))
490
+ end
491
+
492
+ # @return [Array<Symbol>] Returns a list of service operations as
493
+ # method names supported by this client.
494
+ def self.operations
495
+ @operations ||= []
486
496
  end
487
497
 
488
498
  # @private