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,39 @@
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/model'
15
+ require 'aws/ec2/filtered_collection'
16
+
17
+ module AWS
18
+ class EC2
19
+
20
+ # @private
21
+ class Collection
22
+
23
+ include Model
24
+ include Enumerable
25
+ include FilteredCollection
26
+
27
+ def [] id
28
+ member_class.new(id.to_s, :config => config)
29
+ end
30
+
31
+ protected
32
+ def member_class
33
+ raise NotImplementedError
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,63 @@
1
+ # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+
3
+ module AWS
4
+ class EC2
5
+
6
+ # @private
7
+ class ConfigTransform
8
+
9
+ class << self
10
+
11
+ def transform(api_config)
12
+ ["RunInstances",
13
+ "DetachVolume",
14
+ "AttachVolume",
15
+ "CreateSnapshot",
16
+ "CreateVolume",
17
+ "DescribeImageAttribute",
18
+ "DescribeInstanceAttribute"].each do |(op, wrapper)|
19
+ if op_config = api_config[:operations][op]
20
+ op_config[:output] = op_config[:output].first.values.first
21
+ end
22
+ end
23
+
24
+ api_config[:operations].each do |op, op_config|
25
+ op_config[:input] =
26
+ capitalize_input_structure(op_config[:input])
27
+ end
28
+
29
+ api_config
30
+ end
31
+
32
+ private
33
+ def capitalize_input_structure(struct)
34
+ struct.inject({}) do |m, (name, desc)|
35
+
36
+ name = name[0,1].upcase + name[1..-1]
37
+ m[name] = capitalize_input_descriptors(desc)
38
+ m
39
+ end
40
+ end
41
+
42
+ private
43
+ def capitalize_input_descriptors(desc)
44
+ desc.map do |d|
45
+ case
46
+ when d.kind_of?(Hash) && d.key?(:structure)
47
+ d.merge(:structure =>
48
+ capitalize_input_structure(d[:structure]))
49
+ when d.kind_of?(Hash) && d.key?(:list)
50
+ d.merge(:list =>
51
+ capitalize_input_descriptors(d[:list]))
52
+ else
53
+ d
54
+ end
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,107 @@
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
+
16
+ module AWS
17
+ class EC2
18
+ class ElasticIp < Resource
19
+
20
+ def initialize public_ip, options = {}
21
+ @public_ip = public_ip
22
+ @instance_id = options[:instance_id]
23
+ super
24
+ end
25
+
26
+ # @private
27
+ def self.describe_call_name; :describe_addresses; end
28
+
29
+ # @private
30
+ def describe_call_name; self.class.describe_call_name; end
31
+
32
+ # @return [String] The public IP address.
33
+ attr_reader :public_ip
34
+
35
+ alias_method :ip_address, :public_ip
36
+
37
+ # @return [String,nil] Returns the instance id if assigned to an
38
+ # EC2 instance
39
+ def instance_id; end
40
+ describe_call_attribute :instance_id
41
+
42
+ # @return [Boolean] Returns true if this IP address is attached to
43
+ # an EC2 instance.
44
+ def associated?
45
+ !!instance_id
46
+ end
47
+ alias_method :attached?, :associated?
48
+
49
+ # @return [Instance,nil] If associated, returns the {Instance} this
50
+ # elastic IP address is associated to, nil otherwise.
51
+ def instance
52
+ associated? ? Instance.new(instance_id, :config => config) : nil
53
+ end
54
+
55
+ # Releases the elastic IP address.
56
+ #
57
+ # (For non-VPC elastic ips) Releasing an IP address automatically
58
+ # disassociates it from any instance it's associated with.
59
+ #
60
+ # @return [true]
61
+ def delete
62
+ client.release_address(:public_ip => public_ip)
63
+ true
64
+ end
65
+
66
+ alias_method :release, :delete
67
+
68
+ # Disassociates this elastic IP address from an EC2 instance.
69
+ # Raises an exception if this elastic IP is not currently
70
+ # associated with an instance.
71
+ # @return [true]
72
+ def disassociate
73
+ client.disassociate_address(:public_ip => public_ip)
74
+ true
75
+ end
76
+
77
+ # @private
78
+ # @return [String] Returns the public IP address
79
+ def to_s
80
+ public_ip.to_s
81
+ end
82
+
83
+ # @private
84
+ protected
85
+ def resource_id_method
86
+ :public_ip
87
+ end
88
+
89
+ # @private
90
+ protected
91
+ def response_id_method
92
+ :public_ip
93
+ end
94
+
95
+ # @private
96
+ protected
97
+ def find_in_response(resp)
98
+ resp.address_index[public_ip]
99
+ end
100
+
101
+ # @private
102
+ protected
103
+ def __resource_id__; public_ip; end
104
+
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,85 @@
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/model'
15
+ require 'aws/ec2/collection'
16
+ require 'aws/ec2/elastic_ip'
17
+
18
+ module AWS
19
+ class EC2
20
+ class ElasticIpCollection < Collection
21
+
22
+ def create
23
+ response = client.allocate_address
24
+ ElasticIp.new(response.public_ip, :config => config)
25
+ end
26
+
27
+ alias_method :allocate, :create
28
+
29
+ # @param [String] public_ip The public IP address of an elastic ip.
30
+ # @return [ElasticIp] The elastic IP with the given address.
31
+ def [] public_ip
32
+ super
33
+ end
34
+
35
+ # Specify one or more criteria to filter elastic IP addresses by.
36
+ # A subsequent call to #each will limit the resutls returned
37
+ # by provided filters.
38
+ #
39
+ # * Chain multiple calls of #filter together to AND multiple conditions
40
+ # together.
41
+ #
42
+ # * Supply multiple values to a singler #filter call to OR those
43
+ # value conditions together.
44
+ #
45
+ # * '*' matches one or more characters and '?' matches any one
46
+ # character.
47
+ #
48
+ # === Valid Filters
49
+ #
50
+ # * domain - Whether the address is a EC2 address, or a VPC address.
51
+ # Valid values include 'standard' and 'vpc'
52
+ # * instance-id - Instance the address is associated with (if any).
53
+ # * public-ip - The Elastic IP address.
54
+ # * allocation-id - Allocation ID for the address. For VPC addresses
55
+ # only.
56
+ # * association-id - Association ID for the address. For VPC addresses
57
+ # only.
58
+ #
59
+ # @return [ElasticIpCollection] A new collection that represents
60
+ # a subset of the elastic IP addresses associated with this account.
61
+
62
+ # Yields once for each elastic IP address.
63
+ #
64
+ # @yield [elastic_ip]
65
+ # @yieldparam [ElasticIp] elastic_ip
66
+ def each &block
67
+ response = filtered_request(:describe_addresses)
68
+ response.addresses_set.each do |address|
69
+
70
+ elastic_ip = ElasticIp.new(address.public_ip,
71
+ :config => config)
72
+
73
+ yield(elastic_ip)
74
+
75
+ end
76
+ end
77
+
78
+ protected
79
+ def member_class
80
+ ElasticIp
81
+ end
82
+
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,29 @@
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/lazy_error_classes'
15
+ require 'aws/ec2/client/xml'
16
+
17
+ module AWS
18
+ class EC2
19
+
20
+ # @private
21
+ module Errors
22
+
23
+ BASE_ERROR_GRAMMAR = Client::XML::BaseError
24
+
25
+ include LazyErrorClasses
26
+
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,65 @@
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
+ module AWS
15
+ class EC2
16
+
17
+ # @private
18
+ module FilteredCollection
19
+
20
+ def initialize options = {}
21
+ @filters = options[:filters] || []
22
+ super
23
+ end
24
+
25
+ # Specify one or more criteria to filter elastic IP addresses by.
26
+ # A subsequent call to #each will limit the results returned
27
+ # by provided filters.
28
+ #
29
+ # * Chain multiple calls of #filter together to AND multiple conditions
30
+ # together.
31
+ #
32
+ # * Supply multiple values to a singler #filter call to OR those
33
+ # value conditions together.
34
+ #
35
+ # * '*' matches one or more characters and '?' matches any one
36
+ # character.
37
+ #
38
+ def filter filter_name, *values
39
+ filters = @filters.dup
40
+ filters << { :name => filter_name, :values => values.flatten }
41
+ collection_with(:filters => filters)
42
+ end
43
+
44
+ # @private
45
+ def filtered_request client_method, options = {}, &block
46
+ options[:filters] = @filters unless @filters.empty?
47
+ client.send(client_method, options)
48
+ end
49
+
50
+ # @private
51
+ protected
52
+ def preserved_options
53
+ { :config => config,
54
+ :filters => @filters }
55
+ end
56
+
57
+ # @private
58
+ protected
59
+ def collection_with(options = {})
60
+ self.class.new(preserved_options.merge(options))
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,46 @@
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/permission_collection'
15
+
16
+ module AWS
17
+ class EC2
18
+
19
+ # Helper methods for managing EC2 resource permissions. See
20
+ # {Image} and {Snapshot} for usage examples.
21
+ module HasPermissions
22
+
23
+ # (see PermissionCollection#public?)
24
+ def public?
25
+ permissions.public?
26
+ end
27
+
28
+ # (see PermissionCollection#private?)
29
+ def private?
30
+ permissions.private?
31
+ end
32
+
33
+ # (see PermissionCollection#public=)
34
+ def public=(value)
35
+ permissions.public = value
36
+ end
37
+
38
+ # @return [PermissionCollection] An object to manage the
39
+ # collection of permissions for this resource.
40
+ def permissions
41
+ PermissionCollection.new(self, :config => config)
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,245 @@
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/has_permissions'
17
+ require 'aws/ec2/instance_collection'
18
+
19
+ module AWS
20
+ class EC2
21
+
22
+ # Represents an Amazon Machine Image (AMI).
23
+ #
24
+ # @attr [String] description A description of the image.
25
+ #
26
+ # @attr_reader [String] location The location of the AMI.
27
+ #
28
+ # @attr_reader [Symbol] state Current state of the AMI. If the
29
+ # state is +:available+, the image is successfully registered
30
+ # and available for launching. Valid values:
31
+ #
32
+ # * +:available+
33
+ # * +:pending+
34
+ # * +:failed+
35
+ #
36
+ # @attr_reader [String] owner_id AWS account ID of the image
37
+ # owner.
38
+ #
39
+ # @attr_reader [Symbol] architecture The architecture of the
40
+ # image (e.g. +:i386+).
41
+ #
42
+ # @attr_reader [Symbol] type The type of image. Valid values:
43
+ #
44
+ # * +:machine+
45
+ # * +:kernel+
46
+ # * +:ramdisk+
47
+ #
48
+ # @attr_reader [String] kernel_id The kernel ID associated with
49
+ # the image, if any. Only applicable for machine images.
50
+ #
51
+ # @attr_reader [String] ramdisk_id The RAM disk ID associated
52
+ # with the image, if any. Only applicable for machine images.
53
+ #
54
+ # @attr_reader [String] platform Value is +windows+ for Windows
55
+ # AMIs; otherwise blank.
56
+ #
57
+ # @attr_reader [Object] state_reason The reason for the image's
58
+ # most recent state change. The return value is an object with
59
+ # the following methods:
60
+ #
61
+ # [code] Reason code for the state change.
62
+ #
63
+ # [message] A textual description of the state change.
64
+ #
65
+ # @attr_reader [String] owner_alias The AWS account alias (e.g.,
66
+ # +"amazon"+) or AWS account ID that owns the AMI.
67
+ #
68
+ # @attr_reader [String] name The name of the AMI that was
69
+ # provided during image creation.
70
+ #
71
+ # @attr [String] description A free-form description of the AMI.
72
+ # May contain up to 255 characters.
73
+ #
74
+ # @attr_reader [Symbol] root_device_type The root device type
75
+ # used by the AMI. Possible values:
76
+ #
77
+ # * +:ebs+
78
+ # * +:instance_store+
79
+ #
80
+ # @attr_reader [String] root_device_name The root device name
81
+ # (e.g., +"/dev/sda1"+, or +"xvda"+).
82
+ #
83
+ # @attr_reader [Hash] block_device_mappings A hash of block
84
+ # device mappings for the image. In each entry, the key is
85
+ # the device name (e.g. +"/dev/sda1"+) and the value is an
86
+ # object with the following methods that return information
87
+ # about the block device:
88
+ #
89
+ # [snapshot_id] The ID of the snapshot that will be used to
90
+ # create this device (may be nil).
91
+ #
92
+ # [volume_size] The size of the volume, in GiBs.
93
+ #
94
+ # [delete_on_termination] True if the Amazon EBS volume is
95
+ # deleted on instance termination.
96
+ #
97
+ # @attr_reader [Symbol] virtualization_type The type of
98
+ # virtualization of the AMI. Possible values:
99
+ #
100
+ # * +:paravirtual+
101
+ # * +:hvm+
102
+ #
103
+ # @attr_reader [Symbol] hypervisor The image's hypervisor type.
104
+ # Possible values:
105
+ #
106
+ # * +:ovm+
107
+ # * +:xen+
108
+ class Image < Resource
109
+
110
+ include TaggedItem
111
+ include HasPermissions
112
+ alias_method :launch_permissions, :permissions
113
+
114
+ # The ID of the AMI.
115
+ attr_reader :id
116
+
117
+ # @private
118
+ def initialize(id, opts = {})
119
+ @id = id
120
+ super(opts)
121
+ end
122
+
123
+ # Deregisters this AMI. Once deregistered, the AMI cannot be
124
+ # used to launch new instances.
125
+ def deregister
126
+ client.deregister_image(:image_id => id)
127
+ end
128
+ alias_method :delete, :deregister
129
+
130
+ # Runs a single instance of this image.
131
+ #
132
+ # @param [Hash] opts Additional options for running the
133
+ # instance. See {InstanceCollection#create} for a full list
134
+ # of supported options.
135
+ #
136
+ # @return [Instance] An object representing the new instance.
137
+ def run_instance(opts = {})
138
+ InstanceCollection.new(:config => config).
139
+ create(opts.merge(:image => self))
140
+ end
141
+
142
+ # Runs multiple instances of this image.
143
+ #
144
+ # @param count How many instances to request. You can specify
145
+ # this either as an integer or as a Range, to indicate the
146
+ # minimum and maximum number of instances to run. Note that
147
+ # for a new account you can request at most 20 instances at
148
+ # a time.
149
+ #
150
+ # @param [Hash] opts Additional options for running the
151
+ # instance. See {InstanceCollection#create} for a full list
152
+ # of supported options.
153
+ #
154
+ # @return [Array] An array containing an {Instance} object for
155
+ # each instance that was run.
156
+ def run_instances(count, opts = {})
157
+ InstanceCollection.new(:config => config).
158
+ create(opts.merge(:image => self,
159
+ :count => count))
160
+ end
161
+
162
+ # @return [Boolean] +true+ if the AMI exists (is returned by
163
+ # the DescribeImages action).
164
+ def exists?
165
+ resp = client.describe_images(:filters =>
166
+ [{ :name => "image-id",
167
+ :values => [id] }]) and
168
+ !resp.images_set.empty?
169
+ end
170
+
171
+ mutable_attribute :description
172
+ # use describe_images to get it, so it will work with public images
173
+ describe_call_attribute :description
174
+
175
+ describe_call_attribute :name, :memoize => true
176
+ describe_call_attribute(:image_location,
177
+ :getter => :location,
178
+ :memoize => true)
179
+ describe_call_attribute :image_state, :getter => :state, :to_sym => true
180
+ describe_call_attribute(:image_owner_id,
181
+ :getter => :owner_id,
182
+ :memoize => true)
183
+ describe_call_attribute(:image_owner_alias,
184
+ :getter => :owner_alias,
185
+ :memoize => true)
186
+ describe_call_attribute(:architecture,
187
+ :to_sym => true,
188
+ :memoize => true)
189
+ describe_call_attribute(:image_type,
190
+ :getter => :type,
191
+ :to_sym => true,
192
+ :memoize => true)
193
+
194
+ describe_call_attribute :kernel_id, :memoize => true
195
+
196
+ # @return [Image] The kernel associated with the image, if
197
+ # any. Only applicable for machine images.
198
+ def kernel
199
+ if id = kernel_id
200
+ Image.new(id, :config => config)
201
+ end
202
+ end
203
+
204
+ describe_call_attribute :ramdisk_id, :memoize => true
205
+
206
+ # @return [Image] The RAM disk associated with the image, if
207
+ # any. Only applicable for machine images.
208
+ def ramdisk
209
+ if id = ramdisk_id
210
+ Image.new(id, :config => config)
211
+ end
212
+ end
213
+
214
+ describe_call_attribute :platform, :memoize => true
215
+ describe_call_attribute :state_reason
216
+ describe_call_attribute(:root_device_type,
217
+ :to_sym => true,
218
+ :memoize => true)
219
+ describe_call_attribute :root_device_name
220
+ describe_call_attribute :virtualization_type, :to_sym => true
221
+ describe_call_attribute :hypervisor, :to_sym => true
222
+ describe_call_attribute(:block_device_mapping,
223
+ :getter => :block_device_mappings) do
224
+ translate_output do |mappings|
225
+ (mappings || []).inject({}) do |h, mapping|
226
+ h[mapping.device_name] = mapping.ebs
227
+ h
228
+ end
229
+ end
230
+ end
231
+
232
+ # @private
233
+ def __permissions_attribute__
234
+ "launchPermission"
235
+ end
236
+
237
+ protected
238
+ def find_in_response(resp)
239
+ resp.image_index[id]
240
+ end
241
+
242
+ end
243
+
244
+ end
245
+ end