aws-sdk 1.3.2 → 1.3.3

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 (54) hide show
  1. data/lib/aws/api_config/{IAM-2010-07-15.yml → IAM-2010-05-08.yml} +56 -4
  2. data/lib/aws/api_config/SNS-2010-03-31.yml +90 -81
  3. data/lib/aws/core.rb +26 -11
  4. data/lib/aws/core/client.rb +12 -4
  5. data/lib/aws/core/collection.rb +5 -12
  6. data/lib/aws/core/collection/limitable.rb +10 -3
  7. data/lib/aws/core/collection/simple.rb +1 -0
  8. data/lib/aws/core/configuration.rb +2 -0
  9. data/lib/aws/core/configured_json_client_methods.rb +5 -2
  10. data/lib/aws/core/http/httparty_handler.rb +1 -1
  11. data/lib/aws/core/http/net_http_handler.rb +2 -1
  12. data/lib/aws/core/http/request.rb +27 -0
  13. data/lib/aws/core/json_client.rb +41 -0
  14. data/lib/aws/core/lazy_error_classes.rb +2 -0
  15. data/lib/aws/core/option_grammar.rb +1 -1
  16. data/lib/aws/core/resource.rb +12 -14
  17. data/lib/aws/core/session_signer.rb +0 -5
  18. data/lib/aws/core/xml_grammar.rb +12 -2
  19. data/lib/aws/dynamo_db.rb +4 -1
  20. data/lib/aws/dynamo_db/client.rb +4 -17
  21. data/lib/aws/dynamo_db/item_collection.rb +15 -0
  22. data/lib/aws/ec2/security_group.rb +2 -1
  23. data/lib/aws/ec2/security_group/ip_permission.rb +2 -3
  24. data/lib/aws/elb/listener.rb +2 -2
  25. data/lib/aws/iam.rb +17 -0
  26. data/lib/aws/iam/client.rb +9 -6
  27. data/lib/aws/iam/mfa_device.rb +4 -2
  28. data/lib/aws/iam/mfa_device_collection.rb +14 -3
  29. data/lib/aws/iam/user.rb +10 -0
  30. data/lib/aws/iam/virtual_mfa_device.rb +139 -0
  31. data/lib/aws/iam/virtual_mfa_device_collection.rb +73 -0
  32. data/lib/aws/record/abstract_base.rb +1 -0
  33. data/lib/aws/record/hash_model/attributes.rb +8 -8
  34. data/lib/aws/record/hash_model/finder_methods.rb +10 -15
  35. data/lib/aws/record/model.rb +1 -3
  36. data/lib/aws/record/model/finder_methods.rb +3 -3
  37. data/lib/aws/s3.rb +1 -0
  38. data/lib/aws/s3/bucket.rb +83 -16
  39. data/lib/aws/s3/bucket_lifecycle_configuration.rb +360 -0
  40. data/lib/aws/s3/client.rb +50 -0
  41. data/lib/aws/s3/client/xml.rb +10 -0
  42. data/lib/aws/s3/object_version.rb +5 -0
  43. data/lib/aws/s3/object_version_collection.rb +15 -1
  44. data/lib/aws/s3/request.rb +1 -1
  45. data/lib/aws/s3/s3_object.rb +56 -1
  46. data/lib/aws/sns.rb +1 -0
  47. data/lib/aws/sns/has_delivery_policy.rb +68 -0
  48. data/lib/aws/sns/subscription.rb +62 -14
  49. data/lib/aws/sns/subscription_collection.rb +1 -1
  50. data/lib/aws/sns/topic.rb +22 -4
  51. data/lib/aws/sts.rb +3 -2
  52. data/lib/net/http/connection_pool.rb +1 -1
  53. metadata +27 -25
  54. data/lib/aws/core/collection/batchable.rb +0 -133
@@ -38,35 +38,28 @@ module AWS
38
38
  end
39
39
  alias_method :[], :find_by_id
40
40
 
41
- # Finds records in SimpleDB and returns them as objects of the
42
- # current class.
41
+ # Finds records in Amazon DynamoDB and returns them as objects of
42
+ # the current class.
43
43
  #
44
44
  # Finding +:all+ returns an enumerable scope object
45
45
  #
46
- # People.find(:all, :order => [:age, :desc], :limit => 10).each do |person|
46
+ # People.find(:all, :limit => 10).each do |person|
47
47
  # puts person.name
48
48
  # end
49
49
  #
50
50
  # Finding +:first+ returns a single record (or nil)
51
51
  #
52
- # boss = People.find(:first, :where => { :boss => true })
52
+ # boss = People.find(:first)
53
53
  #
54
- # Find accepts a hash of find modifiers (+:where+, +:order+ and
55
- # +:limit+). You can also choose to omit these modifiers and
54
+ # Find accepts a hash of find modifiers (+:shard+ and +:limit+).
55
+ # You can also choose to omit these modifiers and
56
56
  # chain them on the scope object returned. In the following
57
57
  # example only one request is made to SimpleDB (when #each is
58
58
  # called)
59
59
  #
60
- # people = People.find(:all)
60
+ # people = People.find(:all, :limit => 10)
61
61
  #
62
- # johns = people.where(:name => 'John Doe')
63
- #
64
- # johns.order(:age, :desc).limit(10).each do |suspects|
65
- # # ...
66
- # end
67
- #
68
- # See also {#where}, {#order} and {#limit} for more
69
- # information and options.
62
+ # people = people.limit(10).find(:all)
70
63
  #
71
64
  # @overload find(id)
72
65
  # @param id The record to find, raises an exception if the record is
@@ -77,6 +70,8 @@ module AWS
77
70
  # and array is returned of records. When finding +:first+ then
78
71
  # +nil+ or a single record will be returned.
79
72
  # @param [Hash] options
73
+ # @option options [Integer] :shard The shard name of the Amazon
74
+ # DynamoDB table to search.
80
75
  # @option options [Integer] :limit The max number of records to fetch.
81
76
  def find *args
82
77
  new_scope.find(*args)
@@ -48,9 +48,7 @@ module AWS
48
48
  # * +integer_attr+
49
49
  # * +float_attr+
50
50
  # * +datetime_attr+
51
- #
52
- # For more information about the various attribute macros available,
53
- # and what options they accept, see {AttributeMacros}.
51
+ # * +date_attr+
54
52
  #
55
53
  # === Usage
56
54
  #
@@ -65,7 +65,7 @@ module AWS
65
65
  # # ...
66
66
  # end
67
67
  #
68
- # See also {#where}, {#order} and {#limit} for more
68
+ # See also {where}, {order} and {limit} for more
69
69
  # information and options.
70
70
  #
71
71
  # @overload find(id)
@@ -107,7 +107,7 @@ module AWS
107
107
  # end
108
108
  #
109
109
  # This method is equivalent to +find(:all)+, and therefore you can also
110
- # pass aditional options. See {#find} for more information on what
110
+ # pass aditional options. See {.find} for more information on what
111
111
  # options you can pass.
112
112
  #
113
113
  # Book.all(:where => { :author' => 'me' }).each do |my_book|
@@ -138,7 +138,7 @@ module AWS
138
138
  #
139
139
  # People.find(:all).where(:boss => true).count
140
140
  #
141
- # See {#find} and {Scope#count} for more details.
141
+ # See {find} and {Scope#count} for more details.
142
142
  #
143
143
  # @param [Hash] options (<code>{}</code>) Options for counting
144
144
  # records.
@@ -99,6 +99,7 @@ module AWS
99
99
  autoload :ACLObject, 'acl_object'
100
100
  autoload :Bucket, 'bucket'
101
101
  autoload :BucketCollection, 'bucket_collection'
102
+ autoload :BucketLifecycleConfiguration, 'bucket_lifecycle_configuration'
102
103
  autoload :BucketVersionCollection, 'bucket_version_collection'
103
104
  autoload :Client, 'client'
104
105
  autoload :DataOptions, 'data_options'
@@ -100,30 +100,27 @@ module AWS
100
100
  client.get_bucket_versioning(:bucket_name => @name).status
101
101
  end
102
102
 
103
- # Deletes the current bucket.
104
- #
105
- # @note This operation will fail if the bucket is not empty.
106
- #
103
+ # Deletes all objects from this bucket.
104
+ # @return [nil]
105
+ def clear!
106
+ versions.each_batch do |versions|
107
+ objects.delete(versions)
108
+ end
109
+ end
110
+
111
+ # Deletes the current bucket. An error will be raised if the
112
+ # bucket is not empty.
107
113
  # @return [nil]
108
- #
109
114
  def delete
110
115
  client.delete_bucket(:bucket_name => @name)
111
116
  nil
112
117
  end
113
118
 
114
- # Attempts to delete all objects (or object versions) from the bucket
115
- # and then attempts to delete the bucket.
116
- #
117
- # @note This operation may fail if you do not have privileges to delete
118
- # all objects from the bucket.
119
- #
119
+ # Deletes all objects in a bucket and then deletes the bucket.
120
120
  # @return [nil]
121
- #
122
121
  def delete!
123
- versions.each_batch do |versions|
124
- objects.delete(versions)
125
- end
126
- self.delete
122
+ clear!
123
+ delete
127
124
  end
128
125
 
129
126
  # @return [String] bucket owner id
@@ -286,6 +283,76 @@ module AWS
286
283
  nil
287
284
  end
288
285
 
286
+ # The primary interface for editing the lifecycle configuration.
287
+ # See {BucketLifecycleConfiguration} for more information.
288
+ #
289
+ # @example Adding rules to a bucket's lifecycle configuration
290
+ #
291
+ # bucket.lifecycle_configuration.update do
292
+ # add_rule 'cache-1/', 30
293
+ # add_rule 'cache-2/', 30
294
+ # end
295
+ #
296
+ # @example Deleting the lifecycle configuration
297
+ #
298
+ # bucket.lifecycle_configuration.clear
299
+ #
300
+ # @return [BucketLifecycleConfiguration]
301
+ #
302
+ def lifecycle_configuration
303
+ @lifecycle_cfg ||= BucketLifecycleConfiguration.new(self)
304
+ end
305
+
306
+ # You can call this method if you prefer to build your own
307
+ # lifecycle configuration.
308
+ #
309
+ # bucket.lifecycle_configuration = <<-XML
310
+ # <LifecycleConfiguration>
311
+ # ...
312
+ # </LifecycleConfiguration>
313
+ # XML
314
+ #
315
+ # You can also use this method to copy a lifecycle configuration
316
+ # from another bucket.
317
+ #
318
+ # bucket.lifecycle_configuration = other_bucket.lifecycle_configuration
319
+ #
320
+ # If you call this method, passing nil, the lifecycle configuration
321
+ # for this bucket will be deleted.
322
+ #
323
+ # @param [String,Object] config You can pass an xml string or any
324
+ # other object that responds to #to_xml (e.g.
325
+ # BucketLifecycleConfiguration).
326
+ #
327
+ # @return [nil]
328
+ #
329
+ def lifecycle_configuration= config
330
+
331
+ if config.nil?
332
+
333
+ client_opts = {}
334
+ client_opts[:bucket_name] = name
335
+ client.delete_bucket_lifecycle_configuration(client_opts)
336
+
337
+ @lifecycle_cfg = BucketLifecycleConfiguration.new(self, :empty => true)
338
+
339
+ else
340
+
341
+ xml = config.is_a?(String) ? config : config.to_xml
342
+
343
+ client_opts = {}
344
+ client_opts[:bucket_name] = name
345
+ client_opts[:lifecycle_configuration] = xml
346
+ client.set_bucket_lifecycle_configuration(client_opts)
347
+
348
+ @lifecycle_cfg = BucketLifecycleConfiguration.new(self, :xml => xml)
349
+
350
+ end
351
+
352
+ nil
353
+
354
+ end
355
+
289
356
  # Returns a tree that allows you to expose the bucket contents
290
357
  # like a directory structure.
291
358
  #
@@ -0,0 +1,360 @@
1
+ # Copyright 2011-2012 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 'builder'
15
+ require 'uuidtools'
16
+
17
+ module AWS
18
+ class S3
19
+
20
+ # A lifecycle configuration is collections of rules for a single
21
+ # bucket that instructs that instruct
22
+ # Amazon S3 to delete certain objects after a period of days.
23
+ #
24
+ # == Rules
25
+ #
26
+ # Each lifecycle configuration has a list of rules. Each rule has the
27
+ # following attributes:
28
+ #
29
+ # * +#prefix+
30
+ # * +#expiration_days+
31
+ # * +#status+
32
+ # * +#id+
33
+ #
34
+ # Objects with keys matching a rule prefix will be deleted after
35
+ # #expiration_days have passed.
36
+ #
37
+ # A rule is comprised primarily of a prefix and number of expiration days.
38
+ # Objects with keys that start with the given prefix will be automatically
39
+ # deleted after "expiration days" have passed. Rules also have an
40
+ # ID and a status (they can be disabled).
41
+ #
42
+ # See {Rule} for more information on all of the attributes and methods
43
+ # available for rules.
44
+ #
45
+ # == Adding Rules
46
+ #
47
+ # You can add a rule to a bucket lifecycle configuration using #{add_rule}.
48
+ #
49
+ # # add a rule that deletes backups after they are 1 year old
50
+ # bucket.lifecycle_configuration.update do
51
+ # add_rule('backups/', 365)
52
+ # end
53
+ #
54
+ # If you perfer to specify a rule's ID or status (defaults to 'Enabled')
55
+ # you can do this with {#add_rule}.
56
+ #
57
+ # # add a rule that deletes backups after they are 1 year old
58
+ # bucket.lifecycle_configuration.update do
59
+ # add_rule('backups/', 365, :id => 'backup-rule', :disabled => true
60
+ # end
61
+ #
62
+ # == Replacing Rules
63
+ #
64
+ # If you prefer to completely replace a lifecycle configuration, call
65
+ # #add_rule inside a #replace block instead of an #update block:
66
+ #
67
+ # # replace all existing rules with the following
68
+ # bucket.lifecycle_configuration.replace do
69
+ # add_rule('backups/', 30)
70
+ # add_rule('temp/', 10)
71
+ # end
72
+ #
73
+ # == Removing Rules
74
+ #
75
+ # You can delete specific rules with #remove_rule.
76
+ #
77
+ # # delete all disabled rules
78
+ # bucket.lifecycle_configuration.update do
79
+ # rules.each do |rule|
80
+ # remove_rule(rule) if rule.disabled?
81
+ # end
82
+ # end
83
+ #
84
+ # You can also remove all rules in a single call:
85
+ #
86
+ # # remove all rules from this lifecycle configuration
87
+ # bucket.lifecycle_configuration.clear
88
+ #
89
+ # == Editing Existing Rules
90
+ #
91
+ # You can also make changes to existing rules.
92
+ #
93
+ # # change the expiration days to 10 for EVERY rule
94
+ # bucket.lifecycle_configuration.update do
95
+ # rules.each do |rule|
96
+ # rule.expiration_days = 10
97
+ # end
98
+ # end
99
+ #
100
+ # Please be aware, if you add, remove or edit rules outside of an
101
+ # #update or #replace block, then you must call {#update} yourself
102
+ # or the changes will not be persisted.
103
+ #
104
+ class BucketLifecycleConfiguration
105
+
106
+ # @private
107
+ def initialize bucket, options = {}
108
+ @bucket = bucket
109
+ @rules = parse_xml(options[:xml]) if options[:xml]
110
+ @rules = [] if options[:empty] == true
111
+ end
112
+
113
+ # @return [Bucket] Returns the bucket this lifecycle configuration
114
+ # belongs to.
115
+ attr_reader :bucket
116
+
117
+ # @return [Array<Hash>] Returns an array of rules.
118
+ def rules
119
+ @rules ||= begin
120
+ begin
121
+ opts = { :bucket_name => bucket.name }
122
+ response = bucket.client.get_bucket_lifecycle_configuration(opts)
123
+ parse_xml(response.http_response.body)
124
+ rescue Errors::NoSuchLifecycleConfiguration
125
+ []
126
+ end
127
+ end
128
+ end
129
+
130
+ # @param [String] prefix
131
+ #
132
+ # @param [Integer] expiration_days Indicates the lifetime for objects
133
+ # matching the given prefix.
134
+ #
135
+ # @param [Hash] options
136
+ #
137
+ # @option options [String] :id A unique ID for this rule. If an ID
138
+ # is not provided, one will be generated.
139
+ #
140
+ # @option options [Boolean] :disabled (false) By default, all rules
141
+ # will have the status of enabled. You can override this default
142
+ # by passing +:disabled+ => true.
143
+ #
144
+ # @return [Rule] Returns the rule that was added, as a {Rule} object.
145
+ #
146
+ def add_rule prefix, expiration_days, options = {}
147
+ id = options[:id] || UUIDTools::UUID.random_create.to_s
148
+ status = options[:disabled] == true ? 'Disabled' : 'Enabled'
149
+ rule = Rule.new(self, id, prefix, expiration_days, status)
150
+ self.rules << rule
151
+ rule
152
+ end
153
+
154
+ # Removes a single rule. You can pass a rule id or a {Rule}
155
+ # object.
156
+ #
157
+ # # remove a single rule by its ID
158
+ # bucket.lifecycle_configuration.update do
159
+ # remove_rule('rule-id')
160
+ # end
161
+ #
162
+ # # remove all disabled rules
163
+ # bucket.lifecycle_configuration.update do
164
+ # rules.each do |rule|
165
+ # remove_rule(rule) if rule.disabled?
166
+ # end
167
+ # end
168
+ #
169
+ # If you call #remove_rule outside an update block
170
+ # you need to call #update to save the changes.
171
+ #
172
+ # @param [Rule,String] rule_or_rule_id
173
+ #
174
+ # @return [nil]
175
+ #
176
+ def remove_rule rule_or_rule_id
177
+ rule_id = rule_or_rule_id
178
+ if rule_id.nil?
179
+ raise ArgumentError, "expected a rule or rule id, got nil"
180
+ end
181
+ rule_id = rule_id.id unless rule_id.is_a?(String)
182
+ @rules = rules.select{|r| r.id != rule_id }
183
+ nil
184
+ end
185
+
186
+ # Saves changes made to this lifecycle configuration.
187
+ #
188
+ # # set the number of days before expiration for all rules to 10
189
+ # config = bucket.lifecycle_configuration
190
+ # config.rules.each do |rule|
191
+ # rule.expiration_days = 10
192
+ # end
193
+ # config.update
194
+ #
195
+ # You can call #update with a block. Changes are persisted at the
196
+ # end of the block.
197
+ #
198
+ # # shorter version of the example above
199
+ # bucket.lifecycle_configuration.update do
200
+ # rules.each {|rule| rule.expiration_days = 10 }
201
+ # end
202
+ #
203
+ # A block method for updating a BucketLifecycleConfiguration.
204
+ # All modifications made inside the block are persisted at the end of
205
+ # the block.
206
+ #
207
+ # # 1 request
208
+ # bucket.lifecycle_configuration.update do
209
+ # add_rule 'prefix/a', 10
210
+ # add_rule 'prefix/b', 5
211
+ # end
212
+ #
213
+ # # 2 requests
214
+ # bucket.lifecycle_configuration.add_rule 'prefix/a', 10
215
+ # bucket.lifecycle_configuration.add_rule 'prefix/b', 5
216
+ #
217
+ # @return [nil]
218
+ #
219
+ def update &block
220
+ begin
221
+ @batching = true
222
+ instance_eval(&block) if block_given?
223
+ persist(true)
224
+ ensure
225
+ @batching = false
226
+ end
227
+ nil
228
+ end
229
+
230
+ # Yields to the given block. Before yielding, the current
231
+ # rules will be blanked out. This allows you to provide all
232
+ # new rules.
233
+ #
234
+ # When the block is complete, a single call will be made to save
235
+ # the new rules.
236
+ #
237
+ # bucket.lifecycle_configuration.rules.size #=> 3
238
+ #
239
+ # # replace the existing 3 rules with a single rule
240
+ # bucket.lifecycle_configuration.replace
241
+ # add_rule 'temp/', 10
242
+ # end
243
+ #
244
+ # bucket.lifecycle_configuration.rules.size #=> 1
245
+ #
246
+ def replace &block
247
+ @rules = []
248
+ update(&block)
249
+ end
250
+
251
+ def clear
252
+ @rules = []
253
+ bucket.lifecycle_configuration = nil
254
+ end
255
+ alias_method :remove, :clear
256
+
257
+ # @return [String] Returns an xml string representation of this
258
+ # bucket lifecycle configuration.
259
+ def to_xml
260
+ xml = Builder::XmlMarkup.new(:indent => 2)
261
+ xml.LifecycleConfiguration do
262
+ rules.each do |rule|
263
+ xml.Rule do
264
+ xml.ID rule.id
265
+ xml.Prefix rule.prefix
266
+ xml.Status rule.status
267
+ xml.Expiration do
268
+ xml.Days rule.expiration_days
269
+ end
270
+ end
271
+ end
272
+ end.strip
273
+ end
274
+
275
+ protected
276
+ def persist force = false
277
+ unless @batching and force == false
278
+ if rules.empty?
279
+ bucket.lifecycle_configuration = nil
280
+ else
281
+ bucket.lifecycle_configuration = self
282
+ end
283
+ end
284
+ end
285
+
286
+ protected
287
+ def parse_xml xml
288
+ Client::XML::GetBucketLifecycleConfiguration.parse(xml).rules.map do |r|
289
+ Rule.new(self, r.id, r.prefix, r.expiration.days, r.status)
290
+ end
291
+ end
292
+
293
+ # Represents a single rule from an Amazon S3 bucket lifecycle
294
+ # configuration.
295
+ #
296
+ # # delete all objects with the prefix 'temporary/' after 10 days
297
+ # bucket.lifecycle_configuration.add_rule 'temporary/', 10
298
+ #
299
+ # # remove the rule created above
300
+ # bucket.lifecycle_configuration.remove_rule 'temporary/'
301
+ #
302
+ #
303
+ class Rule
304
+
305
+ def initialize configuration, id, prefix, expiration_days, status
306
+ @configuration = configuration
307
+ @id = id
308
+ @prefix = prefix
309
+ @expiration_days = expiration_days
310
+ @status = status
311
+ end
312
+
313
+ # @return [BucketLifecycleConfiguration]
314
+ attr_reader :configuration
315
+
316
+ # @return [String]
317
+ attr_reader :id
318
+
319
+ # @return [String]
320
+ attr_accessor :prefix
321
+
322
+ # @return [Integer]
323
+ attr_accessor :expiration_days
324
+
325
+ # @return [String] Returns the rule status, 'Enabled' or 'Disabled'
326
+ attr_accessor :status
327
+
328
+ def enabled?
329
+ status == 'Enabled'
330
+ end
331
+
332
+ def enable!
333
+ self.status = 'Enabled'
334
+ end
335
+
336
+ def disabled?
337
+ status == 'Disabled'
338
+ end
339
+
340
+ def disabled!
341
+ self.status = 'Disabled'
342
+ end
343
+
344
+ # @private
345
+ def eql? other
346
+ other.is_a?(Rule) and
347
+ other.configuration.bucket == configuration.bucket and
348
+ other.id == id and
349
+ other.prefix == prefix and
350
+ other.expiration_days == expiration_days and
351
+ other.status == status
352
+ end
353
+ alias_method :==, :eql?
354
+
355
+ end
356
+
357
+ end
358
+
359
+ end
360
+ end