aws-sdk 1.0.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 (205) hide show
  1. data/.yardopts +6 -0
  2. data/LICENSE.txt +171 -0
  3. data/NOTICE.txt +2 -0
  4. data/README.rdoc +189 -0
  5. data/lib/aws-sdk.rb +14 -0
  6. data/lib/aws.rb +63 -0
  7. data/lib/aws/api_config.rb +45 -0
  8. data/lib/aws/api_config/.document +0 -0
  9. data/lib/aws/api_config/EC2-2011-02-28.yml +2314 -0
  10. data/lib/aws/api_config/SNS-2010-03-31.yml +171 -0
  11. data/lib/aws/api_config/SQS-2009-02-01.yml +161 -0
  12. data/lib/aws/api_config/SimpleDB-2009-04-15.yml +278 -0
  13. data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +147 -0
  14. data/lib/aws/api_config_transform.rb +32 -0
  15. data/lib/aws/async_handle.rb +90 -0
  16. data/lib/aws/authorize_v2.rb +37 -0
  17. data/lib/aws/authorize_v3.rb +37 -0
  18. data/lib/aws/base_client.rb +524 -0
  19. data/lib/aws/cacheable.rb +92 -0
  20. data/lib/aws/common.rb +228 -0
  21. data/lib/aws/configurable.rb +36 -0
  22. data/lib/aws/configuration.rb +272 -0
  23. data/lib/aws/configured_client_methods.rb +81 -0
  24. data/lib/aws/configured_grammars.rb +65 -0
  25. data/lib/aws/configured_option_grammars.rb +46 -0
  26. data/lib/aws/configured_xml_grammars.rb +47 -0
  27. data/lib/aws/default_signer.rb +38 -0
  28. data/lib/aws/ec2.rb +321 -0
  29. data/lib/aws/ec2/attachment.rb +149 -0
  30. data/lib/aws/ec2/attachment_collection.rb +57 -0
  31. data/lib/aws/ec2/availability_zone.rb +80 -0
  32. data/lib/aws/ec2/availability_zone_collection.rb +47 -0
  33. data/lib/aws/ec2/block_device_mappings.rb +53 -0
  34. data/lib/aws/ec2/client.rb +54 -0
  35. data/lib/aws/ec2/client/xml.rb +127 -0
  36. data/lib/aws/ec2/collection.rb +39 -0
  37. data/lib/aws/ec2/config_transform.rb +63 -0
  38. data/lib/aws/ec2/elastic_ip.rb +107 -0
  39. data/lib/aws/ec2/elastic_ip_collection.rb +85 -0
  40. data/lib/aws/ec2/errors.rb +29 -0
  41. data/lib/aws/ec2/filtered_collection.rb +65 -0
  42. data/lib/aws/ec2/has_permissions.rb +46 -0
  43. data/lib/aws/ec2/image.rb +245 -0
  44. data/lib/aws/ec2/image_collection.rb +235 -0
  45. data/lib/aws/ec2/instance.rb +515 -0
  46. data/lib/aws/ec2/instance_collection.rb +276 -0
  47. data/lib/aws/ec2/key_pair.rb +86 -0
  48. data/lib/aws/ec2/key_pair_collection.rb +102 -0
  49. data/lib/aws/ec2/permission_collection.rb +177 -0
  50. data/lib/aws/ec2/region.rb +81 -0
  51. data/lib/aws/ec2/region_collection.rb +55 -0
  52. data/lib/aws/ec2/request.rb +27 -0
  53. data/lib/aws/ec2/reserved_instances.rb +50 -0
  54. data/lib/aws/ec2/reserved_instances_collection.rb +44 -0
  55. data/lib/aws/ec2/reserved_instances_offering.rb +55 -0
  56. data/lib/aws/ec2/reserved_instances_offering_collection.rb +43 -0
  57. data/lib/aws/ec2/resource.rb +340 -0
  58. data/lib/aws/ec2/resource_tag_collection.rb +218 -0
  59. data/lib/aws/ec2/security_group.rb +246 -0
  60. data/lib/aws/ec2/security_group/ip_permission.rb +70 -0
  61. data/lib/aws/ec2/security_group/ip_permission_collection.rb +59 -0
  62. data/lib/aws/ec2/security_group_collection.rb +132 -0
  63. data/lib/aws/ec2/snapshot.rb +138 -0
  64. data/lib/aws/ec2/snapshot_collection.rb +90 -0
  65. data/lib/aws/ec2/tag.rb +88 -0
  66. data/lib/aws/ec2/tag_collection.rb +114 -0
  67. data/lib/aws/ec2/tagged_collection.rb +48 -0
  68. data/lib/aws/ec2/tagged_item.rb +87 -0
  69. data/lib/aws/ec2/volume.rb +190 -0
  70. data/lib/aws/ec2/volume_collection.rb +95 -0
  71. data/lib/aws/errors.rb +129 -0
  72. data/lib/aws/http/builtin_handler.rb +69 -0
  73. data/lib/aws/http/curb_handler.rb +123 -0
  74. data/lib/aws/http/handler.rb +77 -0
  75. data/lib/aws/http/httparty_handler.rb +61 -0
  76. data/lib/aws/http/request.rb +136 -0
  77. data/lib/aws/http/request_param.rb +63 -0
  78. data/lib/aws/http/response.rb +75 -0
  79. data/lib/aws/ignore_result_element.rb +38 -0
  80. data/lib/aws/indifferent_hash.rb +86 -0
  81. data/lib/aws/inflection.rb +46 -0
  82. data/lib/aws/lazy_error_classes.rb +64 -0
  83. data/lib/aws/meta_utils.rb +43 -0
  84. data/lib/aws/model.rb +57 -0
  85. data/lib/aws/naming.rb +32 -0
  86. data/lib/aws/option_grammar.rb +544 -0
  87. data/lib/aws/policy.rb +912 -0
  88. data/lib/aws/rails.rb +209 -0
  89. data/lib/aws/record.rb +79 -0
  90. data/lib/aws/record/attribute.rb +94 -0
  91. data/lib/aws/record/attribute_macros.rb +288 -0
  92. data/lib/aws/record/attributes/boolean.rb +49 -0
  93. data/lib/aws/record/attributes/datetime.rb +86 -0
  94. data/lib/aws/record/attributes/float.rb +48 -0
  95. data/lib/aws/record/attributes/integer.rb +68 -0
  96. data/lib/aws/record/attributes/sortable_float.rb +60 -0
  97. data/lib/aws/record/attributes/sortable_integer.rb +95 -0
  98. data/lib/aws/record/attributes/string.rb +69 -0
  99. data/lib/aws/record/base.rb +728 -0
  100. data/lib/aws/record/conversion.rb +38 -0
  101. data/lib/aws/record/dirty_tracking.rb +286 -0
  102. data/lib/aws/record/errors.rb +153 -0
  103. data/lib/aws/record/exceptions.rb +48 -0
  104. data/lib/aws/record/finder_methods.rb +262 -0
  105. data/lib/aws/record/naming.rb +31 -0
  106. data/lib/aws/record/scope.rb +157 -0
  107. data/lib/aws/record/validations.rb +653 -0
  108. data/lib/aws/record/validator.rb +237 -0
  109. data/lib/aws/record/validators/acceptance.rb +51 -0
  110. data/lib/aws/record/validators/block.rb +38 -0
  111. data/lib/aws/record/validators/confirmation.rb +43 -0
  112. data/lib/aws/record/validators/count.rb +108 -0
  113. data/lib/aws/record/validators/exclusion.rb +43 -0
  114. data/lib/aws/record/validators/format.rb +57 -0
  115. data/lib/aws/record/validators/inclusion.rb +56 -0
  116. data/lib/aws/record/validators/length.rb +107 -0
  117. data/lib/aws/record/validators/numericality.rb +138 -0
  118. data/lib/aws/record/validators/presence.rb +45 -0
  119. data/lib/aws/resource_cache.rb +39 -0
  120. data/lib/aws/response.rb +113 -0
  121. data/lib/aws/response_cache.rb +50 -0
  122. data/lib/aws/s3.rb +109 -0
  123. data/lib/aws/s3/access_control_list.rb +252 -0
  124. data/lib/aws/s3/acl_object.rb +266 -0
  125. data/lib/aws/s3/bucket.rb +320 -0
  126. data/lib/aws/s3/bucket_collection.rb +122 -0
  127. data/lib/aws/s3/bucket_version_collection.rb +85 -0
  128. data/lib/aws/s3/client.rb +999 -0
  129. data/lib/aws/s3/client/xml.rb +190 -0
  130. data/lib/aws/s3/data_options.rb +99 -0
  131. data/lib/aws/s3/errors.rb +43 -0
  132. data/lib/aws/s3/multipart_upload.rb +318 -0
  133. data/lib/aws/s3/multipart_upload_collection.rb +78 -0
  134. data/lib/aws/s3/object_collection.rb +159 -0
  135. data/lib/aws/s3/object_metadata.rb +67 -0
  136. data/lib/aws/s3/object_upload_collection.rb +83 -0
  137. data/lib/aws/s3/object_version.rb +141 -0
  138. data/lib/aws/s3/object_version_collection.rb +78 -0
  139. data/lib/aws/s3/paginated_collection.rb +94 -0
  140. data/lib/aws/s3/policy.rb +76 -0
  141. data/lib/aws/s3/prefix_and_delimiter_collection.rb +56 -0
  142. data/lib/aws/s3/prefixed_collection.rb +84 -0
  143. data/lib/aws/s3/presigned_post.rb +504 -0
  144. data/lib/aws/s3/request.rb +198 -0
  145. data/lib/aws/s3/s3_object.rb +794 -0
  146. data/lib/aws/s3/tree.rb +116 -0
  147. data/lib/aws/s3/tree/branch_node.rb +71 -0
  148. data/lib/aws/s3/tree/child_collection.rb +108 -0
  149. data/lib/aws/s3/tree/leaf_node.rb +99 -0
  150. data/lib/aws/s3/tree/node.rb +22 -0
  151. data/lib/aws/s3/tree/parent.rb +90 -0
  152. data/lib/aws/s3/uploaded_part.rb +82 -0
  153. data/lib/aws/s3/uploaded_part_collection.rb +86 -0
  154. data/lib/aws/service_interface.rb +60 -0
  155. data/lib/aws/simple_db.rb +202 -0
  156. data/lib/aws/simple_db/attribute.rb +159 -0
  157. data/lib/aws/simple_db/attribute_collection.rb +227 -0
  158. data/lib/aws/simple_db/client.rb +52 -0
  159. data/lib/aws/simple_db/client/options.rb +34 -0
  160. data/lib/aws/simple_db/client/xml.rb +68 -0
  161. data/lib/aws/simple_db/consistent_read_option.rb +42 -0
  162. data/lib/aws/simple_db/delete_attributes.rb +64 -0
  163. data/lib/aws/simple_db/domain.rb +118 -0
  164. data/lib/aws/simple_db/domain_collection.rb +116 -0
  165. data/lib/aws/simple_db/domain_metadata.rb +112 -0
  166. data/lib/aws/simple_db/errors.rb +46 -0
  167. data/lib/aws/simple_db/expect_condition_option.rb +45 -0
  168. data/lib/aws/simple_db/item.rb +84 -0
  169. data/lib/aws/simple_db/item_collection.rb +594 -0
  170. data/lib/aws/simple_db/item_data.rb +70 -0
  171. data/lib/aws/simple_db/put_attributes.rb +62 -0
  172. data/lib/aws/simple_db/request.rb +27 -0
  173. data/lib/aws/simple_email_service.rb +373 -0
  174. data/lib/aws/simple_email_service/client.rb +39 -0
  175. data/lib/aws/simple_email_service/client/options.rb +24 -0
  176. data/lib/aws/simple_email_service/client/xml.rb +38 -0
  177. data/lib/aws/simple_email_service/email_address_collection.rb +66 -0
  178. data/lib/aws/simple_email_service/errors.rb +29 -0
  179. data/lib/aws/simple_email_service/quotas.rb +64 -0
  180. data/lib/aws/simple_email_service/request.rb +27 -0
  181. data/lib/aws/sns.rb +69 -0
  182. data/lib/aws/sns/client.rb +37 -0
  183. data/lib/aws/sns/client/options.rb +24 -0
  184. data/lib/aws/sns/client/xml.rb +38 -0
  185. data/lib/aws/sns/errors.rb +29 -0
  186. data/lib/aws/sns/policy.rb +49 -0
  187. data/lib/aws/sns/request.rb +27 -0
  188. data/lib/aws/sns/subscription.rb +100 -0
  189. data/lib/aws/sns/subscription_collection.rb +84 -0
  190. data/lib/aws/sns/topic.rb +384 -0
  191. data/lib/aws/sns/topic_collection.rb +70 -0
  192. data/lib/aws/sns/topic_subscription_collection.rb +58 -0
  193. data/lib/aws/sqs.rb +70 -0
  194. data/lib/aws/sqs/client.rb +38 -0
  195. data/lib/aws/sqs/client/xml.rb +36 -0
  196. data/lib/aws/sqs/errors.rb +33 -0
  197. data/lib/aws/sqs/policy.rb +50 -0
  198. data/lib/aws/sqs/queue.rb +507 -0
  199. data/lib/aws/sqs/queue_collection.rb +105 -0
  200. data/lib/aws/sqs/received_message.rb +184 -0
  201. data/lib/aws/sqs/received_sns_message.rb +112 -0
  202. data/lib/aws/sqs/request.rb +44 -0
  203. data/lib/aws/xml_grammar.rb +923 -0
  204. data/rails/init.rb +15 -0
  205. metadata +298 -0
@@ -0,0 +1,87 @@
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 'aws/ec2/resource_tag_collection'
15
+
16
+ module AWS
17
+ class EC2
18
+ module TaggedItem
19
+
20
+ # Adds a single tag with an optional tag value.
21
+ #
22
+ # # adds a tag with the key production
23
+ # resource.tag('production')
24
+ #
25
+ # # adds a tag with the optional value set to production
26
+ # resource.tag('role', :value => 'webserver')
27
+ #
28
+ # @param [String] key The name of the tag to add.
29
+ # @param [Hash] options
30
+ # @option options [String] :value An optional tag value.
31
+ # @return [Tag] The tag that was created.
32
+ def add_tag key, options = {}
33
+ client.create_tags({
34
+ :resources => [id],
35
+ :tags => [{ :key => key, :value => options[:value].to_s }],
36
+ })
37
+ Tag.new(self, key, options.merge(:config => config))
38
+ end
39
+ alias_method :tag, :add_tag
40
+
41
+ # Deletes all tags associated with this EC2 resource.
42
+ # @return [nil]
43
+ def clear_tags
44
+ client.delete_tags(:resources => [self.id])
45
+ nil
46
+ end
47
+
48
+ # Returns a collection that represents only tags belonging to
49
+ # this resource.
50
+ #
51
+ # @example Manipulating the tags of an EC2 instance
52
+ # i = ec2.instances["i-123"]
53
+ # i.tags.to_h # => { "foo" => "bar", ... }
54
+ # i.tags.clear
55
+ # i.tags.stage = "production"
56
+ # i.tags.stage # => "production"
57
+ #
58
+ # @return [ResourceTagCollection] A collection of tags that
59
+ # belong to this resource.
60
+ #
61
+ def tags
62
+ ResourceTagCollection.new(self, :config => config)
63
+ end
64
+
65
+ # @private
66
+ def cached_tags
67
+ if cache = AWS.response_cache
68
+ cache.select(describe_call_name.to_sym).each do |resp|
69
+ if obj = find_in_response(resp)
70
+ return obj.tag_set.inject({}) do |hash, tag|
71
+ hash[tag.key] = tag.value
72
+ hash
73
+ end
74
+ end
75
+ end
76
+ end
77
+ nil
78
+ end
79
+
80
+ # @private
81
+ def tagging_resource_type
82
+ Inflection.ruby_name(self.class.to_s).tr("_","-")
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,190 @@
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 'aws/ec2/resource'
15
+ require 'aws/ec2/tagged_item'
16
+ require 'aws/ec2/availability_zone'
17
+ require 'aws/ec2/attachment'
18
+ require 'aws/ec2/attachment_collection'
19
+
20
+ module AWS
21
+ class EC2
22
+
23
+ # Represents an Amazon EBS volume.
24
+ #
25
+ # @example Create an empty 15GiB volume and attach it to an instance
26
+ # volume = ec2.volumes.create(:size => 15,
27
+ # :availability_zone => "us-east-1a")
28
+ # attachment = volume.attach_to(ec2.instances["i-123"], "/dev/sdf")
29
+ # sleep 1 until attachment.status != :attaching
30
+ #
31
+ # @example Remove all attachments from a volume and then delete it
32
+ # volume.attachments.each do |attachment|
33
+ # attachment.delete(:force => true)
34
+ # end
35
+ # sleep 1 until volume.status == :available
36
+ # volume.delete
37
+ #
38
+ # @attr_reader [Symbol] status The status of the volume.
39
+ # Possible values:
40
+ #
41
+ # * +:creating+
42
+ # * +:available+
43
+ # * +:in_use+
44
+ # * +:deleting+
45
+ # * +:deleted+
46
+ # * +:error+
47
+ #
48
+ # @attr_reader [Integer] size The size of the volume in
49
+ # gigabytes.
50
+ #
51
+ # @attr_reader [AvailabilityZone] availability_zone Availability
52
+ # Zone in which the volume was created.
53
+ #
54
+ # @attr_reader [Time] create_time The time at which the volume
55
+ # was created.
56
+ class Volume < Resource
57
+
58
+ include TaggedItem
59
+
60
+ attr_reader :id
61
+
62
+ # @private
63
+ def initialize(id, opts = {})
64
+ @id = id
65
+ super(opts)
66
+ end
67
+
68
+ # Deletes the volume.
69
+ def delete
70
+ client.delete_volume(:volume_id => id)
71
+ end
72
+
73
+ # @return [Snapshot] A new snapshot created from the volume.
74
+ #
75
+ # @param [String] description An optional description of the
76
+ # snapshot. May be up to 255 characters in length.
77
+ def create_snapshot(description = nil)
78
+ opts = { :volume => self }
79
+ opts[:description] = description if description
80
+ SnapshotCollection.new(:config => config).
81
+ create(opts)
82
+ end
83
+
84
+ # Attaches the volume to an instance.
85
+ #
86
+ # @param [Instance] instance The instance to which the volume
87
+ # attaches. The volume and instance must be within the same
88
+ # Availability Zone and the instance must be running.
89
+ #
90
+ # @param [String] device How the device is exposed to the
91
+ # instance (e.g., /dev/sdh, or xvdh).
92
+ #
93
+ # @return [Attachment] An object representing the attachment,
94
+ # which you can use to query the attachment status.
95
+ def attach_to(instance, device)
96
+ resp = client.attach_volume(:volume_id => id,
97
+ :instance_id => instance.id,
98
+ :device => device)
99
+ Attachment.new(self,
100
+ Instance.new(resp.instance_id),
101
+ resp.device,
102
+ :config => config)
103
+ end
104
+ alias_method :attach, :attach_to
105
+
106
+ # Detaches the volume from an instance.
107
+ #
108
+ # @param [Instance] instance The instance to detach from.
109
+ #
110
+ # @param [String] device The device name.
111
+ #
112
+ # @param [Hash] opts Additional options for detaching the
113
+ # volume.
114
+ #
115
+ # @option opts [Boolean] :force Forces detachment if the
116
+ # previous detachment attempt did not occur cleanly (logging
117
+ # into an instance, unmounting the volume, and detaching
118
+ # normally). This option can lead to data loss or a
119
+ # corrupted file system. Use this option only as a last
120
+ # resort to detach a volume from a failed instance. The
121
+ # instance will not have an opportunity to flush file system
122
+ # caches or file system metadata. If you use this option,
123
+ # you must perform file system check and repair procedures.
124
+ def detach_from(instance, device, opts = {})
125
+ a = Attachment.new(self,
126
+ Instance.new(instance.id),
127
+ device,
128
+ :config => config)
129
+ a.delete
130
+ a
131
+ end
132
+
133
+ # @return [AttachmentCollection] The collection of attachments
134
+ # that involve this volume.
135
+ def attachments
136
+ AttachmentCollection.new(self, :config => config)
137
+ end
138
+
139
+ # @return [Boolean] True if the volume exists.
140
+ def exists?
141
+ resp =
142
+ client.describe_volumes(:filters => [{ :name => 'volume-id',
143
+ :values => [id] }]) and
144
+ resp.volume_index.key?(id)
145
+ end
146
+
147
+ describe_call_attribute :status, :to_sym => true
148
+ alias_method :state, :status
149
+
150
+ describe_call_attribute :snapshot_id
151
+
152
+ # @return [Snapshot] Snapshot from which the volume was created
153
+ # (may be nil).
154
+ def snapshot;
155
+ if snapshot_id = self.snapshot_id
156
+ Snapshot.new(snapshot_id, :config => config)
157
+ end
158
+ end
159
+
160
+ describe_call_attribute :size do
161
+ translate_output { |value| value.to_i if value }
162
+ end
163
+
164
+ describe_call_attribute :availability_zone, :getter => :availability_zone_name
165
+
166
+ def availability_zone
167
+ if name = availability_zone_name
168
+ AvailabilityZone.new(name, :config => config)
169
+ end
170
+ end
171
+
172
+ describe_call_attribute :create_time
173
+
174
+ describe_call_attribute :attachment_set
175
+
176
+ populate_from :create_volume do |resp|
177
+ attributes_from_response_object(resp) if
178
+ resp.volume_id == id
179
+ end
180
+
181
+ # @private
182
+ protected
183
+ def find_in_response(resp)
184
+ resp.volume_index[id]
185
+ end
186
+
187
+ end
188
+
189
+ end
190
+ end
@@ -0,0 +1,95 @@
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 'aws/ec2/collection'
15
+ require 'aws/ec2/tagged_collection'
16
+ require 'aws/ec2/volume'
17
+
18
+ module AWS
19
+ class EC2
20
+
21
+ # Represents a collection of Amazon EBS volumes. Typically you
22
+ # should get an instance of this class by calling {EC2#volumes}.
23
+ #
24
+ # @example Create an empty 15GiB volume
25
+ # ec2.volumes.create(:size => 15,
26
+ # :availability_zone => "us-east-1a")
27
+ #
28
+ # @example Get a volume by ID
29
+ # volume = ec2.volumes["vol-123"]
30
+ # volume.exists?
31
+ #
32
+ # @example Get a map of volume IDs to volume status
33
+ # ec2.volumes.inject({}) { |m, v| m[i.id] = v.status; m }
34
+ # # => { "vol-12345678" => :available, "vol-87654321" => :in_use }
35
+ class VolumeCollection < Collection
36
+
37
+ include TaggedCollection
38
+
39
+ # @yield [Instance] Yields each volume in the collection.
40
+ # @return [nil]
41
+ def each(&block)
42
+ resp = filtered_request(:describe_volumes)
43
+ resp.volume_set.each do |v|
44
+ volume = Volume.new(v.volume_id, :config => config)
45
+ yield(volume)
46
+ end
47
+ nil
48
+ end
49
+
50
+ # Creates a new Amazon EBS volume that any Amazon EC2 instance
51
+ # in the same Availability Zone can attach to. For more
52
+ # information about Amazon EBS, go to the {Amazon Elastic
53
+ # Compute Cloud User
54
+ # Guide}[http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?using-ebs.html].
55
+ #
56
+ # @return [Volume] An object representing the new volume.
57
+ #
58
+ # @param [Hash] opts Options for creating the volume.
59
+ # +:availability_zone+ and one of +:size+, +:snapshot+, or
60
+ # +:snapshot_id+ is required.
61
+ #
62
+ # @option opts [Integer] :size The size of the volume, in
63
+ # GiBs. Valid values: 1 - 1024. If +:snapshot+ or
64
+ # +:snapshot_id+ is specified, this defaults to the size of
65
+ # the specified snapshot.
66
+ #
67
+ # @option opts [Snapshot] :snapshot The snapshot from which to
68
+ # create the new volume.
69
+ #
70
+ # @option opts [String] :snapshot_id The ID of the snapshot
71
+ # from which to create the new volume.
72
+ #
73
+ # @option opts [String, AvailabilityZone] :availability_zone
74
+ # The Availability Zone in which to create the new volume.
75
+ # To get a list of the availability zones you can use, see
76
+ # {EC2#availability_zones}.
77
+ # @return [Volume]
78
+ def create(opts = {})
79
+ if snapshot = opts.delete(:snapshot)
80
+ opts[:snapshot_id] = snapshot.id
81
+ end
82
+ resp = client.create_volume(opts)
83
+ Volume.new(resp.volume_id, :config => config)
84
+ end
85
+
86
+ # @private
87
+ protected
88
+ def member_class
89
+ Volume
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+ end
@@ -0,0 +1,129 @@
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 'thread'
15
+ require 'aws/xml_grammar'
16
+
17
+ module AWS
18
+ module Errors
19
+
20
+ # Base class for the two service error classes:
21
+ #
22
+ # * {ClientError}
23
+ # * {ServerError}
24
+ #
25
+ # When interacting with Amazon AWS services, you will sometimes
26
+ # receive a non-200 level response. These http responses are treated
27
+ # as errors.
28
+ #
29
+ # == Client Errors
30
+ #
31
+ # Errors in the three and four hundreds are client errors ({ClientError}).
32
+ # A client error should not be resent without changes. The body of the
33
+ # http response (the error #message) should give more information about
34
+ # the nature of the problem.
35
+ #
36
+ # == Server Errors
37
+ #
38
+ # A 500 level error typically indicates the service is having an issue.
39
+ #
40
+ # Requests that generate service errors are automatically retried with
41
+ # an exponential backoff. If the service still fails to respond with
42
+ # a 200 after 3 retries the error is raised.
43
+ #
44
+ class Base < StandardError
45
+
46
+ # @return [Http::Request] The low level http request that caused the
47
+ # error to be raised.
48
+ attr_reader :http_request
49
+
50
+ # @return [Http::Response] The low level http response from the service
51
+ # that wrapped the service error.
52
+ attr_reader :http_response
53
+
54
+ def initialize http_request, http_response, message = http_response.body
55
+ @http_request = http_request
56
+ @http_response = http_response
57
+ super(message)
58
+ end
59
+
60
+ end
61
+
62
+ # @private
63
+ module ExceptionMixinClassMethods
64
+ def new(*args)
65
+ e = Base.new(*args)
66
+ e.extend(self)
67
+ e
68
+ end
69
+ end
70
+
71
+ # Raised when an error occurs as a result of bad client
72
+ # behavior, most commonly when the parameters passed to a method
73
+ # are somehow invalid. Other common cases:
74
+ #
75
+ # * Throttling errors
76
+ # * Bad credentials
77
+ # * No permission to do the requested operation
78
+ # * Limits exceeded (e.g. too many buckets)
79
+ #
80
+ module ClientError
81
+ extend ExceptionMixinClassMethods
82
+ end
83
+
84
+ # Raised when an AWS service is unable to handle the request. These
85
+ # are automatically retired. If after 3 retries the request is still
86
+ # failing, then the error is raised.
87
+ module ServerError
88
+ extend ExceptionMixinClassMethods
89
+ end
90
+
91
+ # @private
92
+ module ModeledError
93
+
94
+ # @return [String] The error message given by the AWS service.
95
+ attr_accessor :message
96
+
97
+ # @return [Integer] The HTTP status code returned by the AWS service.
98
+ attr_reader :code
99
+
100
+ def initialize(req, resp)
101
+ super(req, resp, message)
102
+ include_error_type
103
+ parse_body(resp.body)
104
+ end
105
+
106
+ def include_error_type
107
+ if http_response.status >= 500
108
+ extend ServerError
109
+ else
110
+ extend ClientError
111
+ end
112
+ end
113
+
114
+ def parse_body(body)
115
+ error_grammar.parse(body, :context => self)
116
+ end
117
+
118
+ def extract_message(body)
119
+ error_grammar.parse(body).message
120
+ end
121
+
122
+ def error_grammar
123
+ self.class::BASE_ERROR_GRAMMAR
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+ end