aws-sdk 1.0.4 → 1.1.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 (71) hide show
  1. data/lib/aws.rb +10 -9
  2. data/lib/aws/api_config/IAM-2010-07-15.yml +632 -0
  3. data/lib/aws/base_client.rb +1 -1
  4. data/lib/aws/cacheable.rb +34 -46
  5. data/lib/aws/client_logging.rb +19 -14
  6. data/lib/aws/collections.rb +230 -0
  7. data/lib/aws/common.rb +4 -0
  8. data/lib/aws/configuration.rb +7 -0
  9. data/lib/aws/ec2.rb +2 -2
  10. data/lib/aws/ec2/attachment.rb +64 -71
  11. data/lib/aws/ec2/attachment_collection.rb +11 -9
  12. data/lib/aws/ec2/availability_zone.rb +40 -31
  13. data/lib/aws/ec2/availability_zone_collection.rb +2 -3
  14. data/lib/aws/ec2/elastic_ip.rb +25 -22
  15. data/lib/aws/ec2/elastic_ip_collection.rb +5 -2
  16. data/lib/aws/ec2/image.rb +113 -129
  17. data/lib/aws/ec2/image_collection.rb +5 -6
  18. data/lib/aws/ec2/instance.rb +290 -233
  19. data/lib/aws/ec2/instance_collection.rb +72 -67
  20. data/lib/aws/ec2/key_pair.rb +16 -18
  21. data/lib/aws/ec2/region.rb +25 -17
  22. data/lib/aws/ec2/reserved_instances.rb +7 -1
  23. data/lib/aws/ec2/reserved_instances_collection.rb +3 -3
  24. data/lib/aws/ec2/reserved_instances_offering.rb +7 -1
  25. data/lib/aws/ec2/reserved_instances_offering_collection.rb +3 -3
  26. data/lib/aws/ec2/resource.rb +41 -222
  27. data/lib/aws/ec2/security_group.rb +22 -18
  28. data/lib/aws/ec2/security_group_collection.rb +2 -5
  29. data/lib/aws/ec2/snapshot.rb +44 -35
  30. data/lib/aws/ec2/snapshot_collection.rb +43 -1
  31. data/lib/aws/ec2/tag.rb +14 -18
  32. data/lib/aws/ec2/volume.rb +59 -72
  33. data/lib/aws/ec2/volume_collection.rb +16 -12
  34. data/lib/aws/errors.rb +14 -5
  35. data/lib/aws/http/httparty_handler.rb +2 -2
  36. data/lib/aws/iam.rb +306 -0
  37. data/lib/aws/iam/access_key.rb +183 -0
  38. data/lib/aws/iam/access_key_collection.rb +131 -0
  39. data/lib/aws/iam/account_alias_collection.rb +81 -0
  40. data/lib/aws/iam/client.rb +44 -0
  41. data/lib/aws/iam/client/xml.rb +38 -0
  42. data/lib/aws/iam/collection.rb +87 -0
  43. data/lib/aws/iam/errors.rb +29 -0
  44. data/lib/aws/iam/group.rb +117 -0
  45. data/lib/aws/iam/group_collection.rb +135 -0
  46. data/lib/aws/iam/group_policy_collection.rb +49 -0
  47. data/lib/aws/iam/group_user_collection.rb +94 -0
  48. data/lib/aws/iam/login_profile.rb +97 -0
  49. data/lib/aws/iam/mfa_device.rb +52 -0
  50. data/lib/aws/iam/mfa_device_collection.rb +119 -0
  51. data/lib/aws/iam/policy.rb +48 -0
  52. data/lib/aws/iam/policy_collection.rb +191 -0
  53. data/lib/aws/iam/request.rb +27 -0
  54. data/lib/aws/iam/resource.rb +74 -0
  55. data/lib/aws/iam/server_certificate.rb +143 -0
  56. data/lib/aws/iam/server_certificate_collection.rb +174 -0
  57. data/lib/aws/iam/signing_certificate.rb +171 -0
  58. data/lib/aws/iam/signing_certificate_collection.rb +134 -0
  59. data/lib/aws/iam/user.rb +196 -0
  60. data/lib/aws/iam/user_collection.rb +136 -0
  61. data/lib/aws/iam/user_group_collection.rb +101 -0
  62. data/lib/aws/iam/user_policy.rb +90 -0
  63. data/lib/aws/iam/user_policy_collection.rb +48 -0
  64. data/lib/aws/resource.rb +381 -0
  65. data/lib/aws/resource_cache.rb +1 -2
  66. data/lib/aws/response.rb +5 -1
  67. data/lib/aws/response_cache.rb +1 -1
  68. data/lib/aws/s3/client.rb +3 -1
  69. data/lib/aws/s3/presigned_post.rb +1 -1
  70. data/lib/aws/simple_db.rb +1 -1
  71. metadata +113 -50
@@ -0,0 +1,48 @@
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
+ require 'aws/iam/policy_collection'
14
+ require 'aws/iam/user_policy'
15
+
16
+ module AWS
17
+ class IAM
18
+
19
+ # A collection that provides access to the policies associated
20
+ # with an IAM user. The interface mimics a hash containing
21
+ # string keys and values that are instances of {Policy}. For
22
+ # example:
23
+ #
24
+ # # add or replace a policy named "ReadOnly"
25
+ # policy = AWS::IAM::Policy.new do |p|
26
+ # # ...
27
+ # end
28
+ # user.policies["ReadOnly"] = policy
29
+ # user.policies.has_key?("ReadOnly") # => true
30
+ #
31
+ # All of the methods for this class are defined in the
32
+ # {PolicyCollection} module.
33
+ class UserPolicyCollection
34
+
35
+ include PolicyCollection
36
+
37
+ # @param [User] user The user that owns this collection.
38
+ def initialize user, options = {}
39
+ @user = user
40
+ super
41
+ end
42
+
43
+ # @return [User] Returns the user that this collection belongs to.
44
+ attr_reader :user
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,381 @@
1
+
2
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"). You
5
+ # may not use this file except in compliance with the License. A copy of
6
+ # the License is located at
7
+ #
8
+ # http://aws.amazon.com/apache2.0/
9
+ #
10
+ # or in the "license" file accompanying this file. This file is
11
+ # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ # ANY KIND, either express or implied. See the License for the specific
13
+ # language governing permissions and limitations under the License.
14
+
15
+ require 'aws/model'
16
+ require 'aws/cacheable'
17
+
18
+ module AWS
19
+
20
+ # @private
21
+ class Resource
22
+
23
+ include Model
24
+ include Cacheable
25
+
26
+ # @private
27
+ class NotFound < StandardError; end
28
+
29
+ def initialize *args
30
+
31
+ super
32
+
33
+ # cache static attributes passed into options
34
+
35
+ options = args.last.is_a?(Hash) ? args.last : {}
36
+ options.each_pair do |opt_name,opt_value|
37
+ if
38
+ self.class.attributes.has_key?(opt_name) and
39
+ self.class.attributes[opt_name].static?
40
+ then
41
+ static_attributes[opt_name] = opt_value
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+ # @return [String] Returns a simple string representation of this resource.
48
+ def inspect
49
+
50
+ identifiers = []
51
+ resource_identifiers.each do |key, value|
52
+ if attr = self.class.attributes.values.find{|a| a.get_as == key }
53
+ identifiers << "#{attr.name}:#{value}"
54
+ else
55
+ identifiers << "#{key}:#{value}"
56
+ end
57
+ end
58
+
59
+ "<#{self::class} #{identifiers.join(' ')}>"
60
+
61
+ end
62
+
63
+ # @return [Boolean] Returns true if the objects references the same
64
+ # AWS resource.
65
+ def == other
66
+ other.kind_of?(self.class) and
67
+ resource_identifiers == other.resource_identifiers
68
+ end
69
+
70
+ alias_method :eql?, :==
71
+
72
+ # @private
73
+ protected
74
+ def get_resource attr_name
75
+ raise NotImplementedError
76
+ end
77
+
78
+ # @private
79
+ protected
80
+ def update_resource attr, value
81
+ raise NotImplementedError
82
+ end
83
+
84
+ # Overide this method is subclasses of Resource. This method should
85
+ # return an array of identifying key/value pairs.
86
+ #
87
+ # # @private
88
+ # protected
89
+ # def resource_identifiers
90
+ # [[:user_name, name]]
91
+ # end
92
+ #
93
+ # @private
94
+ protected
95
+ def resource_identifiers
96
+ raise NotImplementedError
97
+ end
98
+
99
+ # @protected
100
+ protected
101
+ def resource_options(additional = {})
102
+ Hash[resource_identifiers].merge(additional)
103
+ end
104
+
105
+ # @private
106
+ protected
107
+ def local_cache_key
108
+ resource_identifiers.collect{|name,value| value.to_s }.join(":")
109
+ end
110
+
111
+ # @private
112
+ protected
113
+ def static_attributes
114
+ @static_attributes ||= {}
115
+ end
116
+
117
+ # @private
118
+ protected
119
+ def ruby_name
120
+ @ruby_name ||= Inflection.ruby_name(self.class.name)
121
+ end
122
+
123
+ # @private
124
+ public
125
+ def attributes_from_response resp
126
+
127
+ attributes = {}
128
+
129
+ self.class.attribute_providers_for(resp.request_type).each do |provider|
130
+ attributes.merge!(provider.attributes_from_response(self, resp))
131
+ end
132
+
133
+ # cache static attributes
134
+ attributes.each do |attr_name,value|
135
+ if self.class.attributes[attr_name].static?
136
+ static_attributes[attr_name] = value
137
+ end
138
+ end
139
+
140
+ attributes.empty? ? nil : attributes
141
+
142
+ end
143
+
144
+ # @private
145
+ protected
146
+ def cache_static_attributes request_type, resp_obj
147
+ self.class.attribute_providers_for(request_type).each do |provider|
148
+ attributes = provider.attributes_from_response_object(resp_obj)
149
+ attributes.each_pair do |attr_name,value|
150
+ if self.class.attributes[attr_name].static?
151
+ static_attributes[attr_name] = value
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+
158
+ class << self
159
+
160
+ # @private
161
+ def new_from request_type, resp_obj, *args
162
+ resource = new(*args)
163
+ resource.send(:cache_static_attributes, request_type, resp_obj)
164
+ resource
165
+ end
166
+
167
+ # @private
168
+ def attributes
169
+ @attributes ||= Hash.new do |hash,attr_name|
170
+ raise "uknown attribute #{attr_name}"
171
+ end
172
+ end
173
+
174
+ # @private
175
+ def attribute_providers
176
+ @attribute_providers ||= []
177
+ end
178
+
179
+ # @private
180
+ def attribute_providers_for request_type
181
+ attribute_providers.select do |provider|
182
+ provider.request_types.include?(request_type)
183
+ end
184
+ end
185
+
186
+ # @private
187
+ protected
188
+ def attribute name, options = {}, &block
189
+ attr = Attribute.new(name, options)
190
+ attr.instance_eval(&block) if block_given?
191
+ define_attribute_getter(attr)
192
+ define_attribute_setter(attr) if attr.mutable?
193
+ attributes[attr.name] = attr
194
+ end
195
+
196
+ # @private
197
+ protected
198
+ def mutable_attribute name, options = {}, &block
199
+ attribute(name, options.merge(:mutable => true), &block)
200
+ end
201
+
202
+ # @private
203
+ protected
204
+ def define_attribute_getter attribute
205
+ define_method(attribute.name) do
206
+
207
+ return static_attributes[attribute.name] if
208
+ static_attributes.has_key?(attribute.name)
209
+
210
+ begin
211
+ retrieve_attribute(attribute) { get_resource(attribute) }
212
+ rescue Cacheable::NoData => e
213
+ name = ruby_name.tr("_", " ")
214
+ raise NotFound, "unable to find the #{name}"
215
+ end
216
+
217
+ end
218
+ end
219
+
220
+ # @private
221
+ protected
222
+ def define_attribute_setter attribute
223
+ setter = attribute.name.to_s.sub(/\?/, '') + '='
224
+ define_method(setter) do |value|
225
+ translated_value = attribute.translate_input_value(value)
226
+ update_resource(attribute, translated_value)
227
+ if attribute.static?
228
+ static_attributes[attribute.name] = translated_value
229
+ end
230
+ value
231
+ end
232
+ end
233
+
234
+ # @private
235
+ protected
236
+ def populates_from *request_types, &block
237
+ provider = provider(*request_types)
238
+ provider.find(&block)
239
+ provider.provides(*attributes.keys)
240
+ provider
241
+ end
242
+
243
+ # @private
244
+ protected
245
+ def provider *request_types, &block
246
+ provider = AttributeProvider.new(self, request_types)
247
+ if block_given?
248
+ yield(provider)
249
+ end
250
+ attribute_providers << provider
251
+ provider
252
+ end
253
+
254
+ end
255
+
256
+ # @private
257
+ class Attribute
258
+
259
+ def initialize name, options = {}
260
+ @name = name
261
+ @options = options
262
+ @request_types = []
263
+ end
264
+
265
+ attr_reader :name
266
+
267
+ attr_reader :request_types
268
+
269
+ def get_as
270
+ @get_as ||= (@options[:get_as] || @options[:as] || name)
271
+ end
272
+
273
+ def set_as
274
+ @set_as ||= (@options[:set_as] || @options[:as] || name)
275
+ end
276
+
277
+ def mutable?
278
+ @options[:mutable] == true
279
+ end
280
+
281
+ def static?
282
+ @options[:static] == true
283
+ end
284
+
285
+ def translates_input &block
286
+ @input_translator = block
287
+ end
288
+
289
+ def translates_output options = {}, &block
290
+ @translates_nil = options[:nil]
291
+ @output_translator = block
292
+ end
293
+
294
+ def translate_input_value value
295
+ @input_translator ? @input_translator.call(value) : value
296
+ end
297
+
298
+ def translate_output_value value
299
+
300
+ # by default nil values are not translated
301
+ return nil if value.nil? and @translates_nil != true
302
+
303
+ case
304
+ when @options[:to_sym] then value.tr('-','_').downcase.to_sym
305
+ when @output_translator then @output_translator.call(value)
306
+ else value
307
+ end
308
+
309
+ end
310
+
311
+ end
312
+
313
+ # @private
314
+ class AttributeProvider
315
+
316
+ def initialize klass, request_types
317
+ @klass = klass
318
+ @id = klass.attribute_providers.length
319
+ @request_types = request_types
320
+ @provides = {}
321
+ end
322
+
323
+ attr_reader :request_types
324
+
325
+ def find &block
326
+ @klass.send(:define_method, finder_method, &block)
327
+ end
328
+
329
+ def finder_method
330
+ "find_in_response_#{@id}"
331
+ end
332
+
333
+ # Indicates that all of the the named attributes can be retrieved
334
+ # from an appropriate response object.
335
+ #
336
+ # @param [Symbol] attr_names A list of attributes provided
337
+ # @param [Hash] options
338
+ # @option options [Boolean] :value_wrapped (false) If true, then
339
+ # the value returned by the response object will also receive
340
+ # the message :value before it is translated and returned.
341
+ # @option options [Symbol] :get_as Defaults to the method named
342
+ # by the attribute. This is useful when you have two providers
343
+ # for the same attribute but their response object name
344
+ # them differently.
345
+ def provides *attr_names
346
+ options = attr_names.last.is_a?(Hash) ? attr_names.pop : {}
347
+ attr_names.each do |attr_name|
348
+ attr = @klass.attributes[attr_name]
349
+ attr.request_types.push(*request_types)
350
+ @provides[attr_name] = options
351
+ end
352
+ end
353
+
354
+ def attributes_from_response resource, response
355
+ if response_object = resource.send(finder_method, response)
356
+ attributes_from_response_object(response_object)
357
+ else
358
+ {}
359
+ end
360
+ end
361
+
362
+ def attributes_from_response_object resp_obj
363
+ attributes = {}
364
+ @provides.each do |attr_name, options|
365
+
366
+ attr = @klass.attributes[attr_name]
367
+ method = options[:get_as] || attr.get_as
368
+
369
+ v = resp_obj.respond_to?(method) ? resp_obj.send(method) : nil
370
+ v = v.value if v and options[:value_wrapped]
371
+ v = attr.translate_output_value(v)
372
+
373
+ attributes[attr_name] = v
374
+
375
+ end
376
+ attributes
377
+ end
378
+
379
+ end
380
+ end
381
+ end
@@ -25,8 +25,7 @@ module AWS
25
25
  end
26
26
 
27
27
  def cached?(key, attribute)
28
- attributes = @cache[key] and
29
- attributes.key?(attribute)
28
+ attributes = @cache[key] and attributes.has_key?(attribute)
30
29
  end
31
30
 
32
31
  def get(key, attribute)
@@ -78,7 +78,11 @@ module AWS
78
78
 
79
79
  # @private
80
80
  def inspect
81
- "<#{self.class}>"
81
+ if request_type
82
+ "<#{self.class}:#{request_type}>"
83
+ else
84
+ "<#{self.class}>"
85
+ end
82
86
  end
83
87
 
84
88
  def cache_key