aws-sdk 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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