aws-sdk 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. data/ca-bundle.crt +2 -348
  2. data/lib/aws.rb +24 -49
  3. data/lib/aws/{common.rb → core.rb} +120 -9
  4. data/lib/aws/{api_config.rb → core/api_config.rb} +19 -20
  5. data/lib/aws/core/api_config_transform.rb +36 -0
  6. data/lib/aws/core/async_handle.rb +91 -0
  7. data/lib/aws/core/authorize_v2.rb +39 -0
  8. data/lib/aws/{authorize_v3.rb → core/authorize_v3.rb} +16 -15
  9. data/lib/aws/{api_config_transform.rb → core/authorize_with_session_token.rb} +9 -12
  10. data/lib/aws/core/autoloader.rb +64 -0
  11. data/lib/aws/core/cacheable.rb +78 -0
  12. data/lib/aws/core/client.rb +471 -0
  13. data/lib/aws/core/client_logging.rb +125 -0
  14. data/lib/aws/core/collections.rb +229 -0
  15. data/lib/aws/core/configuration.rb +358 -0
  16. data/lib/aws/core/configured_client_methods.rb +76 -0
  17. data/lib/aws/core/configured_grammars.rb +63 -0
  18. data/lib/aws/{configured_option_grammars.rb → core/configured_option_grammars.rb} +18 -20
  19. data/lib/aws/{configured_xml_grammars.rb → core/configured_xml_grammars.rb} +19 -21
  20. data/lib/aws/core/default_signer.rb +67 -0
  21. data/lib/aws/core/http/curb_handler.rb +129 -0
  22. data/lib/aws/core/http/handler.rb +77 -0
  23. data/lib/aws/core/http/httparty_handler.rb +113 -0
  24. data/lib/aws/core/http/net_http_handler.rb +124 -0
  25. data/lib/aws/core/http/request.rb +207 -0
  26. data/lib/aws/core/http/response.rb +73 -0
  27. data/lib/aws/{ignore_result_element.rb → core/ignore_result_element.rb} +14 -18
  28. data/lib/aws/core/indifferent_hash.rb +88 -0
  29. data/lib/aws/core/inflection.rb +47 -0
  30. data/lib/aws/core/lazy_error_classes.rb +62 -0
  31. data/lib/aws/{uri_escape.rb → core/meta_utils.rb} +24 -23
  32. data/lib/aws/core/model.rb +57 -0
  33. data/lib/aws/{authorize_with_session_token.rb → core/naming.rb} +9 -8
  34. data/lib/aws/core/option_grammar.rb +562 -0
  35. data/lib/aws/core/policy.rb +914 -0
  36. data/lib/aws/core/resource.rb +380 -0
  37. data/lib/aws/core/resource_cache.rb +40 -0
  38. data/lib/aws/core/response.rb +125 -0
  39. data/lib/aws/core/response_cache.rb +50 -0
  40. data/lib/aws/core/service_interface.rb +60 -0
  41. data/lib/aws/core/uri_escape.rb +46 -0
  42. data/lib/aws/core/xml_grammar.rb +926 -0
  43. data/lib/aws/ec2.rb +47 -16
  44. data/lib/aws/ec2/attachment.rb +0 -2
  45. data/lib/aws/ec2/attachment_collection.rb +1 -6
  46. data/lib/aws/ec2/availability_zone.rb +0 -2
  47. data/lib/aws/ec2/availability_zone_collection.rb +0 -3
  48. data/lib/aws/ec2/client.rb +6 -9
  49. data/lib/aws/ec2/client/xml.rb +3 -6
  50. data/lib/aws/ec2/collection.rb +1 -4
  51. data/lib/aws/ec2/config.rb +18 -0
  52. data/lib/aws/ec2/elastic_ip.rb +0 -2
  53. data/lib/aws/ec2/elastic_ip_collection.rb +0 -4
  54. data/lib/aws/ec2/errors.rb +1 -4
  55. data/lib/aws/ec2/has_permissions.rb +0 -2
  56. data/lib/aws/ec2/image.rb +0 -5
  57. data/lib/aws/ec2/image_collection.rb +0 -6
  58. data/lib/aws/ec2/instance.rb +23 -9
  59. data/lib/aws/ec2/instance_collection.rb +85 -22
  60. data/lib/aws/ec2/key_pair.rb +0 -2
  61. data/lib/aws/ec2/key_pair_collection.rb +1 -4
  62. data/lib/aws/ec2/permission_collection.rb +2 -5
  63. data/lib/aws/ec2/region.rb +0 -2
  64. data/lib/aws/ec2/region_collection.rb +0 -4
  65. data/lib/aws/ec2/request.rb +4 -9
  66. data/lib/aws/ec2/reserved_instances.rb +0 -3
  67. data/lib/aws/ec2/reserved_instances_collection.rb +0 -4
  68. data/lib/aws/ec2/reserved_instances_offering.rb +0 -3
  69. data/lib/aws/ec2/reserved_instances_offering_collection.rb +0 -4
  70. data/lib/aws/ec2/resource.rb +3 -5
  71. data/lib/aws/ec2/resource_tag_collection.rb +1 -6
  72. data/lib/aws/ec2/security_group.rb +204 -72
  73. data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +53 -0
  74. data/lib/aws/ec2/security_group/ip_permission.rb +92 -10
  75. data/lib/aws/ec2/security_group/ip_permission_collection.rb +14 -15
  76. data/lib/aws/ec2/security_group_collection.rb +11 -8
  77. data/lib/aws/ec2/snapshot.rb +0 -4
  78. data/lib/aws/ec2/snapshot_collection.rb +0 -4
  79. data/lib/aws/ec2/tag.rb +0 -3
  80. data/lib/aws/ec2/tag_collection.rb +1 -8
  81. data/lib/aws/ec2/tagged_item.rb +1 -3
  82. data/lib/aws/ec2/volume.rb +0 -6
  83. data/lib/aws/ec2/volume_collection.rb +0 -4
  84. data/lib/aws/errors.rb +0 -3
  85. data/lib/aws/iam.rb +33 -12
  86. data/lib/aws/iam/access_key.rb +0 -3
  87. data/lib/aws/iam/access_key_collection.rb +0 -3
  88. data/lib/aws/iam/account_alias_collection.rb +0 -2
  89. data/lib/aws/iam/client.rb +6 -8
  90. data/lib/aws/iam/client/xml.rb +4 -8
  91. data/lib/aws/iam/collection.rb +2 -5
  92. data/lib/aws/iam/config.rb +18 -0
  93. data/lib/aws/iam/errors.rb +2 -4
  94. data/lib/aws/iam/group.rb +0 -5
  95. data/lib/aws/iam/group_collection.rb +0 -3
  96. data/lib/aws/iam/group_policy_collection.rb +0 -2
  97. data/lib/aws/iam/group_user_collection.rb +1 -4
  98. data/lib/aws/iam/login_profile.rb +0 -2
  99. data/lib/aws/iam/mfa_device.rb +1 -3
  100. data/lib/aws/iam/mfa_device_collection.rb +0 -3
  101. data/lib/aws/iam/policy.rb +2 -4
  102. data/lib/aws/iam/policy_collection.rb +0 -3
  103. data/lib/aws/iam/request.rb +3 -7
  104. data/lib/aws/iam/resource.rb +1 -4
  105. data/lib/aws/iam/server_certificate.rb +0 -2
  106. data/lib/aws/iam/server_certificate_collection.rb +0 -3
  107. data/lib/aws/iam/signing_certificate.rb +0 -2
  108. data/lib/aws/iam/signing_certificate_collection.rb +0 -3
  109. data/lib/aws/iam/user.rb +0 -7
  110. data/lib/aws/iam/user_collection.rb +0 -3
  111. data/lib/aws/iam/user_group_collection.rb +0 -3
  112. data/lib/aws/iam/user_policy.rb +0 -2
  113. data/lib/aws/iam/user_policy_collection.rb +0 -3
  114. data/lib/aws/rails.rb +5 -4
  115. data/lib/aws/record.rb +4 -1
  116. data/lib/aws/record/base.rb +3 -2
  117. data/lib/aws/record/errors.rb +1 -3
  118. data/lib/aws/s3.rb +31 -6
  119. data/lib/aws/s3/access_control_list.rb +0 -2
  120. data/lib/aws/s3/acl_object.rb +10 -12
  121. data/lib/aws/s3/bucket.rb +1 -9
  122. data/lib/aws/s3/bucket_collection.rb +2 -5
  123. data/lib/aws/s3/bucket_version_collection.rb +1 -5
  124. data/lib/aws/s3/client.rb +34 -37
  125. data/lib/aws/s3/client/xml.rb +11 -14
  126. data/lib/aws/{resource_cache.rb → s3/config.rb} +6 -20
  127. data/lib/aws/s3/errors.rb +6 -7
  128. data/lib/aws/s3/multipart_upload.rb +1 -4
  129. data/lib/aws/s3/multipart_upload_collection.rb +1 -6
  130. data/lib/aws/s3/object_collection.rb +1 -5
  131. data/lib/aws/s3/object_metadata.rb +1 -3
  132. data/lib/aws/s3/object_upload_collection.rb +1 -7
  133. data/lib/aws/s3/object_version.rb +1 -4
  134. data/lib/aws/s3/object_version_collection.rb +1 -4
  135. data/lib/aws/s3/policy.rb +3 -5
  136. data/lib/aws/s3/prefix_and_delimiter_collection.rb +0 -2
  137. data/lib/aws/s3/prefixed_collection.rb +0 -2
  138. data/lib/aws/s3/presigned_post.rb +1 -3
  139. data/lib/aws/s3/request.rb +2 -5
  140. data/lib/aws/s3/s3_object.rb +1 -8
  141. data/lib/aws/s3/tree.rb +8 -6
  142. data/lib/aws/s3/tree/branch_node.rb +0 -3
  143. data/lib/aws/s3/tree/child_collection.rb +1 -5
  144. data/lib/aws/s3/tree/leaf_node.rb +0 -5
  145. data/lib/aws/s3/tree/parent.rb +1 -4
  146. data/lib/aws/s3/uploaded_part.rb +1 -3
  147. data/lib/aws/s3/uploaded_part_collection.rb +1 -5
  148. data/lib/aws/simple_db.rb +21 -6
  149. data/lib/aws/simple_db/attribute.rb +1 -6
  150. data/lib/aws/simple_db/attribute_collection.rb +1 -7
  151. data/lib/aws/simple_db/client.rb +7 -9
  152. data/lib/aws/simple_db/client/options.rb +2 -4
  153. data/lib/aws/simple_db/client/xml.rb +5 -10
  154. data/lib/aws/{naming.rb → simple_db/config.rb} +3 -14
  155. data/lib/aws/simple_db/delete_attributes.rb +0 -2
  156. data/lib/aws/simple_db/domain.rb +1 -6
  157. data/lib/aws/simple_db/domain_collection.rb +1 -4
  158. data/lib/aws/simple_db/domain_metadata.rb +1 -3
  159. data/lib/aws/simple_db/errors.rb +1 -4
  160. data/lib/aws/simple_db/item.rb +1 -7
  161. data/lib/aws/simple_db/item_collection.rb +22 -23
  162. data/lib/aws/simple_db/put_attributes.rb +0 -2
  163. data/lib/aws/simple_db/request.rb +3 -7
  164. data/lib/aws/simple_email_service.rb +11 -6
  165. data/lib/aws/simple_email_service/client.rb +7 -9
  166. data/lib/aws/simple_email_service/client/options.rb +3 -6
  167. data/lib/aws/simple_email_service/client/xml.rb +4 -8
  168. data/lib/aws/simple_email_service/config.rb +19 -0
  169. data/lib/aws/simple_email_service/email_address_collection.rb +1 -3
  170. data/lib/aws/simple_email_service/errors.rb +1 -4
  171. data/lib/aws/simple_email_service/quotas.rb +1 -3
  172. data/lib/aws/simple_email_service/request.rb +3 -7
  173. data/lib/aws/sns.rb +15 -8
  174. data/lib/aws/sns/client.rb +7 -8
  175. data/lib/aws/sns/client/options.rb +3 -6
  176. data/lib/aws/sns/client/xml.rb +4 -8
  177. data/lib/aws/sns/config.rb +18 -0
  178. data/lib/aws/sns/errors.rb +1 -4
  179. data/lib/aws/sns/policy.rb +3 -5
  180. data/lib/aws/sns/request.rb +4 -9
  181. data/lib/aws/sns/subscription.rb +1 -5
  182. data/lib/aws/sns/subscription_collection.rb +1 -5
  183. data/lib/aws/sns/topic.rb +1 -6
  184. data/lib/aws/sns/topic_collection.rb +1 -4
  185. data/lib/aws/sns/topic_subscription_collection.rb +1 -4
  186. data/lib/aws/sqs.rb +14 -5
  187. data/lib/aws/sqs/client.rb +6 -9
  188. data/lib/aws/sqs/client/xml.rb +4 -7
  189. data/lib/aws/sqs/config.rb +18 -0
  190. data/lib/aws/sqs/errors.rb +1 -4
  191. data/lib/aws/sqs/policy.rb +3 -5
  192. data/lib/aws/sqs/queue.rb +2 -7
  193. data/lib/aws/sqs/queue_collection.rb +4 -5
  194. data/lib/aws/sqs/received_message.rb +1 -3
  195. data/lib/aws/sqs/received_sns_message.rb +2 -2
  196. data/lib/aws/sqs/request.rb +4 -7
  197. data/lib/aws/sts.rb +12 -6
  198. data/lib/aws/sts/client.rb +6 -8
  199. data/lib/aws/sts/client/xml.rb +4 -8
  200. data/lib/aws/sts/config.rb +18 -0
  201. data/lib/aws/sts/errors.rb +1 -4
  202. data/lib/aws/sts/federated_session.rb +0 -2
  203. data/lib/aws/sts/policy.rb +3 -5
  204. data/lib/aws/sts/request.rb +3 -7
  205. metadata +60 -50
  206. data/lib/aws/async_handle.rb +0 -90
  207. data/lib/aws/authorize_v2.rb +0 -37
  208. data/lib/aws/base_client.rb +0 -488
  209. data/lib/aws/cacheable.rb +0 -79
  210. data/lib/aws/client_logging.rb +0 -122
  211. data/lib/aws/collections.rb +0 -230
  212. data/lib/aws/configuration.rb +0 -357
  213. data/lib/aws/configured_client_methods.rb +0 -81
  214. data/lib/aws/configured_grammars.rb +0 -65
  215. data/lib/aws/default_signer.rb +0 -65
  216. data/lib/aws/http/curb_handler.rb +0 -127
  217. data/lib/aws/http/handler.rb +0 -77
  218. data/lib/aws/http/httparty_handler.rb +0 -103
  219. data/lib/aws/http/request.rb +0 -165
  220. data/lib/aws/http/request_param.rb +0 -64
  221. data/lib/aws/http/response.rb +0 -72
  222. data/lib/aws/indifferent_hash.rb +0 -86
  223. data/lib/aws/inflection.rb +0 -46
  224. data/lib/aws/lazy_error_classes.rb +0 -64
  225. data/lib/aws/meta_utils.rb +0 -43
  226. data/lib/aws/model.rb +0 -57
  227. data/lib/aws/option_grammar.rb +0 -565
  228. data/lib/aws/policy.rb +0 -914
  229. data/lib/aws/resource.rb +0 -381
  230. data/lib/aws/response.rb +0 -125
  231. data/lib/aws/response_cache.rb +0 -50
  232. data/lib/aws/service_interface.rb +0 -60
  233. data/lib/aws/xml_grammar.rb +0 -925
@@ -0,0 +1,125 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'benchmark'
15
+
16
+ module AWS
17
+ module Core
18
+
19
+ # @private
20
+ module ClientLogging
21
+
22
+ MAX_STRING_LENGTH = 50
23
+
24
+ def log_client_request(name, options)
25
+ response = nil
26
+ time = Benchmark.measure do
27
+ response = yield
28
+ end
29
+
30
+ if options[:async]
31
+ response.on_complete do
32
+ log_client_request_on_success(name, options, response, time)
33
+ end
34
+ else
35
+ log_client_request_on_success(name, options, response, time)
36
+ end
37
+ response
38
+ end
39
+
40
+ # Summarizes long strings and adds file size information
41
+ # @private
42
+ def sanitize_options(options)
43
+ sanitize_hash(options)
44
+ end
45
+
46
+ protected
47
+ def log severity, message
48
+ config.logger.send(severity, message + "\n") if config.logger
49
+ end
50
+
51
+ protected
52
+ def log_client_request_on_success(method_name, options, response, time)
53
+ status = response.http_response.status
54
+ service = self.class.service_name
55
+
56
+ pattern = "[AWS %s %s %.06f] %s(%s)"
57
+ parts = [service, status, time.real, method_name, sanitize_options(options)]
58
+ severity = :info
59
+
60
+ if response.error
61
+ pattern += " %s: %s"
62
+ parts << response.error.class
63
+ parts << response.error.message
64
+ severity = :error
65
+ end
66
+
67
+ if response.cached
68
+ pattern << " [CACHED]"
69
+ end
70
+
71
+ log(severity, pattern % parts)
72
+ end
73
+
74
+ protected
75
+ def sanitize_value(value)
76
+ case value
77
+ when Hash
78
+ '{' + sanitize_hash(value) + '}'
79
+ when Array
80
+ sanitize_array(value)
81
+ when File
82
+ sanitize_file(value)
83
+ when String
84
+ sanitize_string(value)
85
+ else
86
+ value.inspect
87
+ end
88
+ end
89
+
90
+ protected
91
+ def sanitize_string str
92
+ summary = summarize_string(str)
93
+ inspected = str.inspect
94
+ if inspected.size > summary.size
95
+ summary
96
+ else
97
+ inspected
98
+ end
99
+ end
100
+
101
+ protected
102
+ def summarize_string str
103
+ "#<String #{str[0,6].inspect} ... #{str[-6,6].inspect} (#{str.size} characters)>"
104
+ end
105
+
106
+ protected
107
+ def sanitize_file file
108
+ "#<File:#{file.path} (#{File.size(file.path)} bytes)>"
109
+ end
110
+
111
+ protected
112
+ def sanitize_array array
113
+ "[" + array.map { |v| sanitize_value(v) }.join(",") + "]"
114
+ end
115
+
116
+ protected
117
+ def sanitize_hash hash
118
+ hash.map do |k,v|
119
+ "#{sanitize_value(k)}=>#{sanitize_value(v)}"
120
+ end.sort.join(",")
121
+ end
122
+
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,229 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
3
+ # may not use this file except in compliance with the License. A copy of
4
+ # the License is located at
5
+ #
6
+ # http://aws.amazon.com/apache2.0/
7
+ #
8
+ # or in the "license" file accompanying this file. This file is
9
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
10
+ # ANY KIND, either express or implied. See the License for the specific
11
+ # language governing permissions and limitations under the License.
12
+
13
+ module AWS
14
+ module Core
15
+
16
+ # There are 3 collection modules:
17
+ #
18
+ # AWS::Collections::Basic
19
+ # - single request returns all items
20
+ # - (sqs, ec2, ses)
21
+ #
22
+ # AWS::Collections::Paged
23
+ # - responses may be truncated
24
+ # - truncated responses return a "next token"
25
+ # - (sns, sdb)
26
+ #
27
+ # AWS::Collections::PagedWithLimits
28
+ # - requests accept a "max items"
29
+ # - responses may be "truncated"
30
+ # - truncated responses return a "next token"
31
+ # - (s3, iam)
32
+ #
33
+ # @private
34
+ module Collections
35
+
36
+ # @private
37
+ module Basic
38
+
39
+ include Model
40
+ include Enumerable
41
+
42
+ def enumerator options = {}
43
+ Enumerator.new(self, :each, options)
44
+ end
45
+
46
+ def each options = {}, &block
47
+ each_batch(options) do |batch|
48
+ batch.each(&block)
49
+ end
50
+ nil
51
+ end
52
+
53
+ def each_batch options = {}, &block
54
+
55
+ options = options.dup
56
+
57
+ limit = options.delete(:limit)
58
+ batch_size = options.delete(:batch_size)
59
+
60
+ total = 0 # count of items yeileded across all batches
61
+
62
+ each_response(options, limit, batch_size) do |response|
63
+
64
+ batch = []
65
+ each_item(response) do |item|
66
+ batch << item
67
+ if limit and (total += 1) == limit
68
+ yield(batch)
69
+ return
70
+ end
71
+ end
72
+
73
+ yield(batch)
74
+
75
+ batch.size
76
+
77
+ end
78
+
79
+ nil
80
+
81
+ end
82
+
83
+ def in_groups_of size, options = {}, &block
84
+
85
+ group = []
86
+
87
+ each_batch(options) do |batch|
88
+ batch.each do |item|
89
+ group << item
90
+ if group.size == size
91
+ yield(group)
92
+ group = []
93
+ end
94
+ end
95
+ end
96
+
97
+ yield(group) unless group.empty?
98
+
99
+ nil
100
+
101
+ end
102
+
103
+ # @note +limit+ has no effect, simply ignored
104
+ # @note +batch_size+ has no effect, simply ignored
105
+ # @private
106
+ protected
107
+ def each_response options, limit, batch_size, &block
108
+ response = client.send(request_method, options)
109
+ yield(response)
110
+ end
111
+
112
+ # @note Define this method in classes including this module.
113
+ # @private
114
+ protected
115
+ def request_method
116
+ raise NotImplementedError
117
+ end
118
+
119
+ # @note Define this method in classes including this module.
120
+ # @private
121
+ protected
122
+ def each_item response
123
+ raise NotImplementedError
124
+ end
125
+
126
+ end
127
+
128
+ # @private
129
+ module Paged
130
+
131
+ include Basic
132
+
133
+ # @note +limit+ has no effect, simply ignored
134
+ # @note +batch_size+ has no effect, simply ignored
135
+ protected
136
+ def each_response options, limit, batch_size, &block
137
+
138
+ next_token = nil
139
+
140
+ begin
141
+
142
+ page_opts = {}
143
+ page_opts[next_token_key] = next_token if next_token
144
+
145
+ response = client.send(request_method, options.merge(page_opts))
146
+
147
+ yield(response)
148
+
149
+ next_token = next_token_for(response)
150
+
151
+ end until next_token.nil?
152
+
153
+ end
154
+
155
+ # Override this methid in collections that use a different name
156
+ # for the param that offsets the find (e.g. :marker, :next_key, etc).
157
+ # @private
158
+ protected
159
+ def next_token_key
160
+ raise NotImplementedError
161
+ end
162
+
163
+ # Override this method in collections that have an alternate method
164
+ # for finding the next token.
165
+ # @private
166
+ protected
167
+ def next_token_for response
168
+ method = next_token_key
169
+ response.respond_to?(method) ? response.send(method) : nil
170
+ end
171
+
172
+ end
173
+
174
+ # @private
175
+ module PagedWithLimits
176
+
177
+ include Paged
178
+
179
+ # A custom first method makes getting exactly one item much more
180
+ # efficient. Without the :limit => 1, an entire page of items
181
+ # is received and then only one is grabbed.
182
+ # @private
183
+ def first
184
+ enumerator(:limit => 1).first
185
+ end
186
+
187
+ # @private
188
+ protected
189
+ def each_response options, limit, batch_size, &block
190
+
191
+ total = 0
192
+ next_token = nil
193
+
194
+ begin
195
+
196
+ page_opts = {}
197
+
198
+ page_opts[next_token_key] = next_token if next_token
199
+
200
+ if limit or batch_size
201
+ max_items = []
202
+ max_items << (limit - total) if limit
203
+ max_items << batch_size if batch_size
204
+ page_opts[limit_key] = max_items.min
205
+ end
206
+
207
+ response = client.send(request_method, options.merge(page_opts))
208
+
209
+ total += yield(response)
210
+
211
+ next_token = next_token_for(response)
212
+
213
+ end until next_token.nil? or (limit and limit == total)
214
+
215
+ end
216
+
217
+ # Override this methid in collections that use a different name
218
+ # for the param that offsets the find (e.g. :marker, :next_key, etc).
219
+ # @private
220
+ protected
221
+ def limit_key
222
+ raise NotImplementedError
223
+ end
224
+
225
+ end
226
+
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,358 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
4
+ # may not use this file except in compliance with the License. A copy of
5
+ # the License is located at
6
+ #
7
+ # http://aws.amazon.com/apache2.0/
8
+ #
9
+ # or in the "license" file accompanying this file. This file is
10
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
+ # ANY KIND, either express or implied. See the License for the specific
12
+ # language governing permissions and limitations under the License.
13
+
14
+ require 'set'
15
+ require 'uri'
16
+
17
+ module AWS
18
+ module Core
19
+
20
+ # A configuration object for AWS interfaces and clients.
21
+ #
22
+ # == Configuring Credential
23
+ #
24
+ # In order to do anything with AWS you will need to assign credentials.
25
+ # The simplest method is to assing your credentials into the default
26
+ # configuration:
27
+ #
28
+ # AWS.config(:access_key_id => 'KEY', :secret_access_key => 'SECRET')
29
+ #
30
+ # You can also export them into your environment and they will be picked up
31
+ # automatically:
32
+ #
33
+ # export AWS_ACCESS_KEY_ID='YOUR_KEY_ID_HERE'
34
+ # export AWS_SECRET_ACCESS_KEY='YOUR_SECRET_KEY_HERE'
35
+ #
36
+ # For compatability with other AWS gems, the credentials can also be
37
+ # exported like:
38
+ #
39
+ # export AMAZON_ACCESS_KEY_ID='YOUR_KEY_ID_HERE'
40
+ # export AMAZON_SECRET_ACCESS_KEY='YOUR_SECRET_KEY_HERE'
41
+ #
42
+ # == Modifying a Configuration
43
+ #
44
+ # Configuration objects are read-only. If you need a different set of
45
+ # configuration values, call {#with}, passing in the updates
46
+ # and a new configuration object will be returned.
47
+ #
48
+ # config = Configuration.new(:max_retires => 3)
49
+ # new_config = config.with(:max_retries => 2)
50
+ #
51
+ # config.max_retries #=> 3
52
+ # new_config.max_retries #=> 2
53
+ #
54
+ # == Global Configuration
55
+ #
56
+ # The global default configuration can be found at {AWS.config}
57
+ #
58
+ # @attr_reader [String,nil] access_key_id AWS access key id credential.
59
+ # Defaults to +nil+.
60
+ #
61
+ # @attr_reader [String] ec2_endpoint The service endpoint for Amazon EC2.
62
+ # Defaults to 'ec2.amazonaws.com'.
63
+ #
64
+ # @attr_reader [Object] http_handler The http handler that sends requests
65
+ # to AWS. Defaults to an HTTP handler built on net/http.
66
+ #
67
+ # @attr_reader [String] iam_endpoint The service endpoint for AWS Idenity
68
+ # Access Management (IAM). Defaults to 'iam.amazonaws.com'.
69
+ #
70
+ # @attr_reader [Object,nil] logger A logger instance that
71
+ # should receive log messages generated by service requets.
72
+ # A logger needs to respond to #log and must accept a
73
+ # severity (e.g. :info, :error, etc) and a string message.
74
+ # Defaults to +nil+.
75
+ #
76
+ # @attr_reader [Integer] max_retries The maximum number of times
77
+ # service errors (500) should be retried. There is an exponential
78
+ # backoff in between service request retries, so the more retries the
79
+ # longer it can take to fail. Defautls to 3.
80
+ #
81
+ # @attr_reader [String, URI, nil] proxy_uri The URI of the proxy
82
+ # to send service requests through. You can pass a URI object or a
83
+ # URI string. Defautls to +nil+.
84
+ #
85
+ # AWS.config(:proxy_uri => 'https://user:pass@my.proxy:443/path?query')
86
+ #
87
+ # @attr_reader [String] s3_endpoint The service endpoint for Amazon S3.
88
+ # Defaults to 's3.amazonaws.com'.
89
+ #
90
+ # @attr_reader [Integer] s3_multipart_max_parts The maximum number of
91
+ # parts to split a file into when uploading in parts to S3.
92
+ # Defaults to 1000.
93
+ #
94
+ # @attr_reader [Integer] s3_multipart_threshold (16777216) When uploading
95
+ # data to S3, if the number of bytes to send exceedes
96
+ # +:s3_multipart_threshold+ then a multi part session is automatically
97
+ # started and the data is sent up in chunks. The size of each part
98
+ # is specified by +:s3_multipart_min_part_size+. Defaults to
99
+ # 16777216 (16MB).
100
+ #
101
+ # @attr_reader [Integer] s3_multipart_min_part_size The absolute minimum
102
+ # size (in bytes) each S3 multipart segment should be.
103
+ # Defaults to 5242880 (5MB).
104
+ #
105
+ # @attr_reader [String,nil] secret_access_key AWS secret access key
106
+ # credential. Defaults to +nil+.
107
+ #
108
+ # @attr_reader [String,nil] session_token AWS secret token credential.
109
+ # Defaults to +nil+.
110
+ #
111
+ # @attr_reader [String] simple_db_endpoint The service endpoint for Amazon
112
+ # SimpleDB. Defaults to 'sdb.amazonaws.com'.
113
+ #
114
+ # @attr_reader [Boolean] simple_db_consistent_reads Determines
115
+ # if all SimpleDB read requests should be done consistently.
116
+ # Consistent reads are slower, but reflect all changes to SDB.
117
+ # Defaults to +false+.
118
+ #
119
+ # @attr_reader [String] simple_email_service_endpoint The service endpoint
120
+ # for Amazon Simple Email Service. Defaults to
121
+ # 'email.us-east-1.amazonaws.com'.
122
+ #
123
+ # @attr_reader [Object] signer The request signer. Defaults to
124
+ # a default request signer implementation.
125
+ #
126
+ # @attr_reader [String] ssl_ca_file The path to a CA cert bundle in
127
+ # PEM format.
128
+ #
129
+ # If +ssl_verify_peer+ is true (the default) this bundle will be
130
+ # used to validate the server certificate in each HTTPS request.
131
+ # The AWS SDK for Ruby ships with a CA cert bundle, which is the
132
+ # default value for this option.
133
+ #
134
+ # @attr_reader [Boolean] ssl_verify_peer When +true+
135
+ # the HTTP handler validate server certificates for HTTPS requests.
136
+ # Defaults to +true+.
137
+ #
138
+ # This option should only be disabled for diagnostic purposes;
139
+ # leaving this option set to +false+ exposes your application to
140
+ # man-in-the-middle attacks and can pose a serious security
141
+ # risk.
142
+ #
143
+ # @attr_reader [Boolean] stub_requests When +true+ requests are not
144
+ # sent to AWS, instead empty reponses are generated and returned to
145
+ # each service request.
146
+ #
147
+ # @attr_reader [String] sns_endpoint The service endpoint for Amazon SNS.
148
+ # Defaults to 'sns.us-east-1.amazonaws.com'.
149
+ #
150
+ # @attr_reader [String] sqs_endpoint The service endpoint for Amazon SQS.
151
+ # Defaults to 'sqs.us-east-1.amazonaws.com'.
152
+ #
153
+ # @attr_reader [String] sts_endpoint The service endpoint for AWS
154
+ # Security Token Service. Defaults to 'sts.amazonaws.com'.
155
+ #
156
+ # @attr_reader [Boolean] use_ssl When +true+, all requests
157
+ # to AWS are sent using HTTPS instead vanilla HTTP.
158
+ # Defaults to +true+.
159
+ #
160
+ # @attr_reader [String] user_agent_prefix A string prefix to
161
+ # append to all requets against AWS services. This should be set
162
+ # for clients and applications built ontop of the aws-sdk gem.
163
+ # Defaults to +nil+.
164
+ #
165
+ class Configuration
166
+
167
+ # Creates a new Configuration object.
168
+ # @param options (see AWS.config)
169
+ # @option options (see AWS.config)
170
+ def initialize options = {}
171
+
172
+ @created = options.delete(:__created__) || {}
173
+
174
+ options.each_pair do |opt_name, value|
175
+ opt_name = opt_name.to_sym
176
+ if self.class.accepted_options.include?(opt_name)
177
+ supplied[opt_name] = value
178
+ end
179
+ end
180
+
181
+ end
182
+
183
+ # Used to create a new Configuration object with the given modifications.
184
+ # The current configuration object is not modified.
185
+ #
186
+ # AWS.config(:max_retries => 2)
187
+ #
188
+ # no_retries_config = AWS.config.with(:max_retries => 0)
189
+ #
190
+ # AWS.config.max_retries #=> 2
191
+ # no_retries_config.max_retries #=> 0
192
+ #
193
+ # You can use these configuration objects returned by #with to create
194
+ # AWS objects:
195
+ #
196
+ # AWS::S3.new(:config => no_retries_config)
197
+ # AWS::SQS.new(:config => no_retries_config)
198
+ #
199
+ # @param options (see AWS.config)
200
+ # @option options (see AWS.config)
201
+ # @return [Configuration] Copies the current configuration and returns
202
+ # a new one with modifications as provided in +:options+.
203
+ def with options = {}
204
+
205
+ # symbolize option keys
206
+ options = options.inject({}) {|h,kv| h[kv.first.to_sym] = kv.last; h }
207
+
208
+ values = supplied.merge(options)
209
+
210
+ if supplied == values
211
+ self # nothing changed
212
+ else
213
+ self.class.new(values.merge(:__created__ => @created.dup))
214
+ end
215
+
216
+ end
217
+
218
+ # @return [Hash] Returns a hash of all configuration values.
219
+ def to_h
220
+ self.class.accepted_options.inject({}) do |h,k|
221
+ h[k] = send(k)
222
+ h
223
+ end
224
+ end
225
+
226
+ # @return [Boolean] Returns true if the two configuration objects have
227
+ # the same values.
228
+ def == other
229
+ other.is_a?(self.class) and self.supplied == other.supplied
230
+ end
231
+
232
+ alias_method :eql, :==
233
+
234
+ # @private
235
+ def inspect
236
+ "<#{self.class.name}>"
237
+ end
238
+
239
+ protected
240
+ def supplied
241
+ @supplied ||= {}
242
+ end
243
+
244
+ class << self
245
+
246
+ # @private
247
+ def accepted_options
248
+ @options ||= Set.new
249
+ end
250
+
251
+ # @private
252
+ def add_option name, default_value = nil, options = {}, &transform
253
+
254
+ accepted_options << name
255
+
256
+ define_method(name) do
257
+ value = supplied.has_key?(name) ? supplied[name] : default_value
258
+ transform ? transform.call(value) : value
259
+ end
260
+
261
+ alias_method("#{name}?", name) if options[:boolean]
262
+
263
+ end
264
+
265
+ # Configuration options that have dependencies are re-recreated
266
+ # anytime one of their dependendent configuration values are
267
+ # changed.
268
+ # @private
269
+ def add_option_with_needs name, needs, &create_block
270
+
271
+ accepted_options << name
272
+
273
+ define_method(name) do
274
+
275
+ return supplied[name] if supplied.has_key?(name)
276
+
277
+ needed = needs.collect{|need| send(need) }
278
+
279
+ unless @created.key?(name) and @created[name][:needed] == needed
280
+ @created[name] = {}
281
+ @created[name][:object] = create_block.call(self)
282
+ @created[name][:needed] = needed
283
+ end
284
+
285
+ @created[name][:object]
286
+
287
+ end
288
+
289
+ end
290
+
291
+ def add_service name, ruby_name, default_endpoint
292
+
293
+ create_block = lambda do |config|
294
+ AWS.const_get(name)::Client.new(:config => config)
295
+ end
296
+
297
+ needs = [
298
+ :signer,
299
+ :http_handler,
300
+ :"#{ruby_name}_endpoint",
301
+ :max_retries,
302
+ :stub_requests?,
303
+ :proxy_uri,
304
+ :use_ssl?,
305
+ :ssl_verify_peer?,
306
+ :ssl_ca_file,
307
+ :user_agent_prefix,
308
+ :logger,
309
+ ]
310
+
311
+ add_option :"#{ruby_name}_endpoint", default_endpoint
312
+
313
+ add_option_with_needs :"#{ruby_name}_client", needs, &create_block
314
+
315
+ end
316
+
317
+ end
318
+
319
+ add_option :access_key_id,
320
+ ENV['AWS_ACCESS_KEY_ID'] || ENV['AMAZON_ACCESS_KEY_ID']
321
+
322
+ add_option :http_handler, Core::Http::NetHttpHandler.new
323
+
324
+ add_option :logger
325
+
326
+ add_option :max_retries, 3
327
+
328
+ add_option :proxy_uri do |uri| uri ? URI.parse(uri.to_s) : nil end
329
+
330
+ add_option :secret_access_key,
331
+ ENV['AWS_SECRET_ACCESS_KEY'] || ENV['AMAZON_SECRET_ACCESS_KEY']
332
+
333
+ add_option :session_token
334
+
335
+ add_option_with_needs :signer,
336
+ [:access_key_id, :secret_access_key, :session_token] do |config|
337
+
338
+ DefaultSigner.new(
339
+ config.access_key_id,
340
+ config.secret_access_key,
341
+ config.session_token)
342
+
343
+ end
344
+
345
+ add_option :ssl_verify_peer, true, :boolean => true
346
+
347
+ add_option :ssl_ca_file,
348
+ File.expand_path(File.dirname(__FILE__) + "/../../../ca-bundle.crt")
349
+
350
+ add_option :stub_requests, false, :boolean => true
351
+
352
+ add_option :use_ssl, true, :boolean => true
353
+
354
+ add_option :user_agent_prefix
355
+
356
+ end
357
+ end
358
+ end