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.
- data/.yardopts +6 -0
- data/LICENSE.txt +171 -0
- data/NOTICE.txt +2 -0
- data/README.rdoc +189 -0
- data/lib/aws-sdk.rb +14 -0
- data/lib/aws.rb +63 -0
- data/lib/aws/api_config.rb +45 -0
- data/lib/aws/api_config/.document +0 -0
- data/lib/aws/api_config/EC2-2011-02-28.yml +2314 -0
- data/lib/aws/api_config/SNS-2010-03-31.yml +171 -0
- data/lib/aws/api_config/SQS-2009-02-01.yml +161 -0
- data/lib/aws/api_config/SimpleDB-2009-04-15.yml +278 -0
- data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +147 -0
- data/lib/aws/api_config_transform.rb +32 -0
- data/lib/aws/async_handle.rb +90 -0
- data/lib/aws/authorize_v2.rb +37 -0
- data/lib/aws/authorize_v3.rb +37 -0
- data/lib/aws/base_client.rb +524 -0
- data/lib/aws/cacheable.rb +92 -0
- data/lib/aws/common.rb +228 -0
- data/lib/aws/configurable.rb +36 -0
- data/lib/aws/configuration.rb +272 -0
- data/lib/aws/configured_client_methods.rb +81 -0
- data/lib/aws/configured_grammars.rb +65 -0
- data/lib/aws/configured_option_grammars.rb +46 -0
- data/lib/aws/configured_xml_grammars.rb +47 -0
- data/lib/aws/default_signer.rb +38 -0
- data/lib/aws/ec2.rb +321 -0
- data/lib/aws/ec2/attachment.rb +149 -0
- data/lib/aws/ec2/attachment_collection.rb +57 -0
- data/lib/aws/ec2/availability_zone.rb +80 -0
- data/lib/aws/ec2/availability_zone_collection.rb +47 -0
- data/lib/aws/ec2/block_device_mappings.rb +53 -0
- data/lib/aws/ec2/client.rb +54 -0
- data/lib/aws/ec2/client/xml.rb +127 -0
- data/lib/aws/ec2/collection.rb +39 -0
- data/lib/aws/ec2/config_transform.rb +63 -0
- data/lib/aws/ec2/elastic_ip.rb +107 -0
- data/lib/aws/ec2/elastic_ip_collection.rb +85 -0
- data/lib/aws/ec2/errors.rb +29 -0
- data/lib/aws/ec2/filtered_collection.rb +65 -0
- data/lib/aws/ec2/has_permissions.rb +46 -0
- data/lib/aws/ec2/image.rb +245 -0
- data/lib/aws/ec2/image_collection.rb +235 -0
- data/lib/aws/ec2/instance.rb +515 -0
- data/lib/aws/ec2/instance_collection.rb +276 -0
- data/lib/aws/ec2/key_pair.rb +86 -0
- data/lib/aws/ec2/key_pair_collection.rb +102 -0
- data/lib/aws/ec2/permission_collection.rb +177 -0
- data/lib/aws/ec2/region.rb +81 -0
- data/lib/aws/ec2/region_collection.rb +55 -0
- data/lib/aws/ec2/request.rb +27 -0
- data/lib/aws/ec2/reserved_instances.rb +50 -0
- data/lib/aws/ec2/reserved_instances_collection.rb +44 -0
- data/lib/aws/ec2/reserved_instances_offering.rb +55 -0
- data/lib/aws/ec2/reserved_instances_offering_collection.rb +43 -0
- data/lib/aws/ec2/resource.rb +340 -0
- data/lib/aws/ec2/resource_tag_collection.rb +218 -0
- data/lib/aws/ec2/security_group.rb +246 -0
- data/lib/aws/ec2/security_group/ip_permission.rb +70 -0
- data/lib/aws/ec2/security_group/ip_permission_collection.rb +59 -0
- data/lib/aws/ec2/security_group_collection.rb +132 -0
- data/lib/aws/ec2/snapshot.rb +138 -0
- data/lib/aws/ec2/snapshot_collection.rb +90 -0
- data/lib/aws/ec2/tag.rb +88 -0
- data/lib/aws/ec2/tag_collection.rb +114 -0
- data/lib/aws/ec2/tagged_collection.rb +48 -0
- data/lib/aws/ec2/tagged_item.rb +87 -0
- data/lib/aws/ec2/volume.rb +190 -0
- data/lib/aws/ec2/volume_collection.rb +95 -0
- data/lib/aws/errors.rb +129 -0
- data/lib/aws/http/builtin_handler.rb +69 -0
- data/lib/aws/http/curb_handler.rb +123 -0
- data/lib/aws/http/handler.rb +77 -0
- data/lib/aws/http/httparty_handler.rb +61 -0
- data/lib/aws/http/request.rb +136 -0
- data/lib/aws/http/request_param.rb +63 -0
- data/lib/aws/http/response.rb +75 -0
- data/lib/aws/ignore_result_element.rb +38 -0
- data/lib/aws/indifferent_hash.rb +86 -0
- data/lib/aws/inflection.rb +46 -0
- data/lib/aws/lazy_error_classes.rb +64 -0
- data/lib/aws/meta_utils.rb +43 -0
- data/lib/aws/model.rb +57 -0
- data/lib/aws/naming.rb +32 -0
- data/lib/aws/option_grammar.rb +544 -0
- data/lib/aws/policy.rb +912 -0
- data/lib/aws/rails.rb +209 -0
- data/lib/aws/record.rb +79 -0
- data/lib/aws/record/attribute.rb +94 -0
- data/lib/aws/record/attribute_macros.rb +288 -0
- data/lib/aws/record/attributes/boolean.rb +49 -0
- data/lib/aws/record/attributes/datetime.rb +86 -0
- data/lib/aws/record/attributes/float.rb +48 -0
- data/lib/aws/record/attributes/integer.rb +68 -0
- data/lib/aws/record/attributes/sortable_float.rb +60 -0
- data/lib/aws/record/attributes/sortable_integer.rb +95 -0
- data/lib/aws/record/attributes/string.rb +69 -0
- data/lib/aws/record/base.rb +728 -0
- data/lib/aws/record/conversion.rb +38 -0
- data/lib/aws/record/dirty_tracking.rb +286 -0
- data/lib/aws/record/errors.rb +153 -0
- data/lib/aws/record/exceptions.rb +48 -0
- data/lib/aws/record/finder_methods.rb +262 -0
- data/lib/aws/record/naming.rb +31 -0
- data/lib/aws/record/scope.rb +157 -0
- data/lib/aws/record/validations.rb +653 -0
- data/lib/aws/record/validator.rb +237 -0
- data/lib/aws/record/validators/acceptance.rb +51 -0
- data/lib/aws/record/validators/block.rb +38 -0
- data/lib/aws/record/validators/confirmation.rb +43 -0
- data/lib/aws/record/validators/count.rb +108 -0
- data/lib/aws/record/validators/exclusion.rb +43 -0
- data/lib/aws/record/validators/format.rb +57 -0
- data/lib/aws/record/validators/inclusion.rb +56 -0
- data/lib/aws/record/validators/length.rb +107 -0
- data/lib/aws/record/validators/numericality.rb +138 -0
- data/lib/aws/record/validators/presence.rb +45 -0
- data/lib/aws/resource_cache.rb +39 -0
- data/lib/aws/response.rb +113 -0
- data/lib/aws/response_cache.rb +50 -0
- data/lib/aws/s3.rb +109 -0
- data/lib/aws/s3/access_control_list.rb +252 -0
- data/lib/aws/s3/acl_object.rb +266 -0
- data/lib/aws/s3/bucket.rb +320 -0
- data/lib/aws/s3/bucket_collection.rb +122 -0
- data/lib/aws/s3/bucket_version_collection.rb +85 -0
- data/lib/aws/s3/client.rb +999 -0
- data/lib/aws/s3/client/xml.rb +190 -0
- data/lib/aws/s3/data_options.rb +99 -0
- data/lib/aws/s3/errors.rb +43 -0
- data/lib/aws/s3/multipart_upload.rb +318 -0
- data/lib/aws/s3/multipart_upload_collection.rb +78 -0
- data/lib/aws/s3/object_collection.rb +159 -0
- data/lib/aws/s3/object_metadata.rb +67 -0
- data/lib/aws/s3/object_upload_collection.rb +83 -0
- data/lib/aws/s3/object_version.rb +141 -0
- data/lib/aws/s3/object_version_collection.rb +78 -0
- data/lib/aws/s3/paginated_collection.rb +94 -0
- data/lib/aws/s3/policy.rb +76 -0
- data/lib/aws/s3/prefix_and_delimiter_collection.rb +56 -0
- data/lib/aws/s3/prefixed_collection.rb +84 -0
- data/lib/aws/s3/presigned_post.rb +504 -0
- data/lib/aws/s3/request.rb +198 -0
- data/lib/aws/s3/s3_object.rb +794 -0
- data/lib/aws/s3/tree.rb +116 -0
- data/lib/aws/s3/tree/branch_node.rb +71 -0
- data/lib/aws/s3/tree/child_collection.rb +108 -0
- data/lib/aws/s3/tree/leaf_node.rb +99 -0
- data/lib/aws/s3/tree/node.rb +22 -0
- data/lib/aws/s3/tree/parent.rb +90 -0
- data/lib/aws/s3/uploaded_part.rb +82 -0
- data/lib/aws/s3/uploaded_part_collection.rb +86 -0
- data/lib/aws/service_interface.rb +60 -0
- data/lib/aws/simple_db.rb +202 -0
- data/lib/aws/simple_db/attribute.rb +159 -0
- data/lib/aws/simple_db/attribute_collection.rb +227 -0
- data/lib/aws/simple_db/client.rb +52 -0
- data/lib/aws/simple_db/client/options.rb +34 -0
- data/lib/aws/simple_db/client/xml.rb +68 -0
- data/lib/aws/simple_db/consistent_read_option.rb +42 -0
- data/lib/aws/simple_db/delete_attributes.rb +64 -0
- data/lib/aws/simple_db/domain.rb +118 -0
- data/lib/aws/simple_db/domain_collection.rb +116 -0
- data/lib/aws/simple_db/domain_metadata.rb +112 -0
- data/lib/aws/simple_db/errors.rb +46 -0
- data/lib/aws/simple_db/expect_condition_option.rb +45 -0
- data/lib/aws/simple_db/item.rb +84 -0
- data/lib/aws/simple_db/item_collection.rb +594 -0
- data/lib/aws/simple_db/item_data.rb +70 -0
- data/lib/aws/simple_db/put_attributes.rb +62 -0
- data/lib/aws/simple_db/request.rb +27 -0
- data/lib/aws/simple_email_service.rb +373 -0
- data/lib/aws/simple_email_service/client.rb +39 -0
- data/lib/aws/simple_email_service/client/options.rb +24 -0
- data/lib/aws/simple_email_service/client/xml.rb +38 -0
- data/lib/aws/simple_email_service/email_address_collection.rb +66 -0
- data/lib/aws/simple_email_service/errors.rb +29 -0
- data/lib/aws/simple_email_service/quotas.rb +64 -0
- data/lib/aws/simple_email_service/request.rb +27 -0
- data/lib/aws/sns.rb +69 -0
- data/lib/aws/sns/client.rb +37 -0
- data/lib/aws/sns/client/options.rb +24 -0
- data/lib/aws/sns/client/xml.rb +38 -0
- data/lib/aws/sns/errors.rb +29 -0
- data/lib/aws/sns/policy.rb +49 -0
- data/lib/aws/sns/request.rb +27 -0
- data/lib/aws/sns/subscription.rb +100 -0
- data/lib/aws/sns/subscription_collection.rb +84 -0
- data/lib/aws/sns/topic.rb +384 -0
- data/lib/aws/sns/topic_collection.rb +70 -0
- data/lib/aws/sns/topic_subscription_collection.rb +58 -0
- data/lib/aws/sqs.rb +70 -0
- data/lib/aws/sqs/client.rb +38 -0
- data/lib/aws/sqs/client/xml.rb +36 -0
- data/lib/aws/sqs/errors.rb +33 -0
- data/lib/aws/sqs/policy.rb +50 -0
- data/lib/aws/sqs/queue.rb +507 -0
- data/lib/aws/sqs/queue_collection.rb +105 -0
- data/lib/aws/sqs/received_message.rb +184 -0
- data/lib/aws/sqs/received_sns_message.rb +112 -0
- data/lib/aws/sqs/request.rb +44 -0
- data/lib/aws/xml_grammar.rb +923 -0
- data/rails/init.rb +15 -0
- metadata +298 -0
|
@@ -0,0 +1,92 @@
|
|
|
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/naming'
|
|
15
|
+
require 'aws/meta_utils'
|
|
16
|
+
|
|
17
|
+
module AWS
|
|
18
|
+
|
|
19
|
+
# @private
|
|
20
|
+
module Cacheable
|
|
21
|
+
|
|
22
|
+
def local_cache_key
|
|
23
|
+
raise NotImplementedError
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def cache_key
|
|
27
|
+
endpoint_method = self.class.service_ruby_name + "_endpoint"
|
|
28
|
+
config.signer.access_key_id + ":" +
|
|
29
|
+
config.send(endpoint_method) + ":" +
|
|
30
|
+
local_cache_key
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def attributes_from_response(response)
|
|
34
|
+
method = "populate_from_#{response.request_type}"
|
|
35
|
+
if respond_to?(method)
|
|
36
|
+
send(method, response)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def request_types
|
|
41
|
+
self.class.request_types
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class NoData < StandardError; end
|
|
45
|
+
|
|
46
|
+
def retrieve_attribute(attribute)
|
|
47
|
+
if cache = AWS.response_cache
|
|
48
|
+
if cache.resource_cache.cached?(cache_key, attribute)
|
|
49
|
+
return cache.resource_cache.get(cache_key, attribute)
|
|
50
|
+
end
|
|
51
|
+
cache.select(*request_types).each do |resp|
|
|
52
|
+
if attributes = attributes_from_response(resp)
|
|
53
|
+
cache.resource_cache.store(cache_key, attributes)
|
|
54
|
+
return attributes[attribute] if attributes.key?(attribute)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
resp = yield
|
|
59
|
+
if attributes = attributes_from_response(resp)
|
|
60
|
+
if cache = AWS.response_cache
|
|
61
|
+
cache.resource_cache.store(cache_key, attributes)
|
|
62
|
+
end
|
|
63
|
+
attributes[attribute] if attributes.key?(attribute)
|
|
64
|
+
else
|
|
65
|
+
raise NoData.new("no data for #{self} in response to #{resp.request_type}")
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
module ClassMethods
|
|
70
|
+
|
|
71
|
+
def request_types
|
|
72
|
+
[]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def populate_from(type, &block)
|
|
76
|
+
define_method("populate_from_#{type}", &block)
|
|
77
|
+
new_request_types = request_types + [type]
|
|
78
|
+
new_request_types.uniq!
|
|
79
|
+
MetaUtils.extend_method(self, :request_types) { new_request_types }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def self.included(mod)
|
|
85
|
+
mod.extend ClassMethods
|
|
86
|
+
mod.extend Naming unless
|
|
87
|
+
mod.respond_to?(:service_ruby_name)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
data/lib/aws/common.rb
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
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/configuration'
|
|
15
|
+
require 'aws/resource_cache'
|
|
16
|
+
require 'aws/response_cache'
|
|
17
|
+
|
|
18
|
+
# Root namespace for the AWS SDK for Ruby.
|
|
19
|
+
module AWS
|
|
20
|
+
class << self
|
|
21
|
+
|
|
22
|
+
# @private
|
|
23
|
+
@@config = nil
|
|
24
|
+
|
|
25
|
+
# The global configuration for AWS. Generally you set your prefered
|
|
26
|
+
# configuration operations once after loading the aws-sdk gem.
|
|
27
|
+
#
|
|
28
|
+
# AWS.config({
|
|
29
|
+
# :access_key_id => 'ACCESS_KEY_ID',
|
|
30
|
+
# :secret_access_key => 'SECRET_ACCESS_KEY',
|
|
31
|
+
# :simple_db_endpoint => 'sdb.us-west-1.amazonaws.com',
|
|
32
|
+
# :max_retries => 2,
|
|
33
|
+
# })
|
|
34
|
+
#
|
|
35
|
+
# When using AWS classes they will always default to use configuration
|
|
36
|
+
# values defined in {AWS.config}.
|
|
37
|
+
#
|
|
38
|
+
# AWS.config(:max_retries => 2)
|
|
39
|
+
#
|
|
40
|
+
# sqs = AWS::SQS.new
|
|
41
|
+
# sqs.config.max_retries #=> 2
|
|
42
|
+
#
|
|
43
|
+
# If you want to change a configuration value for a single instance you
|
|
44
|
+
# pass the new configuration value to that objects initializer:
|
|
45
|
+
#
|
|
46
|
+
# AWS::SQS.new(:max_retries => 0)
|
|
47
|
+
#
|
|
48
|
+
# @note Changing the global configuration does not affect objects
|
|
49
|
+
# that have already been constructed.
|
|
50
|
+
# @param [Hash] options
|
|
51
|
+
# @option options [String] :access_key_id Your account access key
|
|
52
|
+
# id credential.
|
|
53
|
+
# @option options [String] :secret_access_key Your account secret
|
|
54
|
+
# access key credential.
|
|
55
|
+
# @option options [Integer] :max_retries (3) The maximum number of times
|
|
56
|
+
# service errors (500) should be retried. There is an exponential
|
|
57
|
+
# backoff in between service request retries, so the more retries the
|
|
58
|
+
# longer it can take to fail.
|
|
59
|
+
# @option options [String] :ec2_endpoint ('ec2.amazonaws.com') The
|
|
60
|
+
# service endpoint to use when communicating with Amazon EC2.
|
|
61
|
+
# @option options :http_handler The request/response handler
|
|
62
|
+
# for all service requests. The default handler uses HTTParty to
|
|
63
|
+
# send requests.
|
|
64
|
+
# @option options :logger (nil) A logger instance that should receive log
|
|
65
|
+
# messages generated by service requets. A logger needs to respond to
|
|
66
|
+
# #log and must accept a severity (e.g. :info, :error, etc) and
|
|
67
|
+
# a string message.
|
|
68
|
+
# @option options [String] :s3_endpoint ('s3.amazonaws.com') The
|
|
69
|
+
# service endpoint to use when communicating with Amazon S3.
|
|
70
|
+
# @option [Integer] :s3_multipart_threshold (16777216) When uploading
|
|
71
|
+
# data to S3, if the number of bytes to send exceedes
|
|
72
|
+
# +:s3_multipart_threshold+ then a multi part session is automatically
|
|
73
|
+
# started and the data is sent up in chunks. The size of each part
|
|
74
|
+
# is specified by +:s3_multipart_min_part_size+.
|
|
75
|
+
# @option [Integer] :s3_multipart_min_part_size (5242880)
|
|
76
|
+
# @option [Integer] :s3_multipart_max_parts (1000)
|
|
77
|
+
# @option options [Boolean] :simple_db_consistent_reads (false) When true
|
|
78
|
+
# all read operations against SimpleDB will be consistent reads (slower).
|
|
79
|
+
# @option options [String] :simple_db_endpoint ('sdb.amazonaws.com') The
|
|
80
|
+
# service endpoint to use when communicating with Amazon SimpleDB.
|
|
81
|
+
# @option options [String] :simple_email_service_endpoint ('email.us-east-1.amazonaws.com')
|
|
82
|
+
# The service endpoint to use when communicating with Amazon
|
|
83
|
+
# SimpleEmailService.
|
|
84
|
+
# @option options :signer The request signer. Defaults to a
|
|
85
|
+
# {DefaultSigner}.
|
|
86
|
+
# @option options [String] :sns_endpoint ('sns.us-east-1.amazonaws.com')
|
|
87
|
+
# The service endpoint to use when communicating with Amazon SNS.
|
|
88
|
+
# @option options [String] :sqs_endpoint ('sqs.us-east-1.amazonaws.com')
|
|
89
|
+
# The service endpoint to use when communicating with Amazon SQS.
|
|
90
|
+
# @option options :stub_requests (false) When true no requests will be
|
|
91
|
+
# made against the live service. Responses returned will have empty
|
|
92
|
+
# values. This is primarily used for writing tests.
|
|
93
|
+
# @option options [Boolean] :use_ssl (true) When true, all requests are
|
|
94
|
+
# sent over SSL.
|
|
95
|
+
# @option options [String] :user_agent_prefix (nil) A string prefix to
|
|
96
|
+
# append to all requets against AWS services. This should be set
|
|
97
|
+
# for clients and applications built ontop of the aws-sdk gem.
|
|
98
|
+
# @return [Configuration] Returns the new configuration.
|
|
99
|
+
def config options = {}
|
|
100
|
+
@@config ||= Configuration.new
|
|
101
|
+
@@config = @@config.with(options) unless options.empty?
|
|
102
|
+
@@config
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @note Memoization is currently only supported for the EC2 APIs;
|
|
106
|
+
# other APIs are unaffected by the status of memoization. To
|
|
107
|
+
# protect your code from future changes in memoization support,
|
|
108
|
+
# you should not enable memoization while calling non-EC2 APIs.
|
|
109
|
+
#
|
|
110
|
+
# Starts memoizing service requests made in the current thread.
|
|
111
|
+
# See {memoize} for a full discussion of the memoization feature.
|
|
112
|
+
# This has no effect if memoization is already enabled.
|
|
113
|
+
def start_memoizing
|
|
114
|
+
Thread.current[:aws_memoization] ||= {}
|
|
115
|
+
nil
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @note Memoization is currently only supported for the EC2 APIs;
|
|
119
|
+
# other APIs are unaffected by the status of memoization. To
|
|
120
|
+
# protect your code from future changes in memoization support,
|
|
121
|
+
# you should not enable memoization while calling non-EC2 APIs.
|
|
122
|
+
#
|
|
123
|
+
# Stops memoizing service requests made in the current thread.
|
|
124
|
+
# See {memoize} for a full discussion of the memoization feature.
|
|
125
|
+
# This has no effect if memoization is already disabled.
|
|
126
|
+
def stop_memoizing
|
|
127
|
+
Thread.current[:aws_memoization] = nil
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# @note Memoization is currently only supported for the EC2 APIs;
|
|
131
|
+
# other APIs are unaffected by the status of memoization. To
|
|
132
|
+
# protect your code from future changes in memoization support,
|
|
133
|
+
# you should not enable memoization while calling non-EC2 APIs.
|
|
134
|
+
#
|
|
135
|
+
# @return [Boolean] True if memoization is enabled for the current
|
|
136
|
+
# thread. See {memoize} for a full discussion of the
|
|
137
|
+
# memoization feature.
|
|
138
|
+
def memoizing?
|
|
139
|
+
!Thread.current[:aws_memoization].nil?
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# @note Memoization is currently only supported for the EC2 APIs;
|
|
143
|
+
# other APIs are unaffected by the status of memoization. To
|
|
144
|
+
# protect your code from future changes in memoization support,
|
|
145
|
+
# you should not enable memoization while calling non-EC2 APIs.
|
|
146
|
+
#
|
|
147
|
+
# Enables memoization for the current thread, within a block.
|
|
148
|
+
# Memoization lets you avoid making multiple requests for the same
|
|
149
|
+
# data by reusing the responses which have already been received.
|
|
150
|
+
# For example, consider the following code to get the most
|
|
151
|
+
# recently launched EC2 instance:
|
|
152
|
+
#
|
|
153
|
+
# latest = ec2.instances.sort_by(&:launch_time).last
|
|
154
|
+
#
|
|
155
|
+
# The above code would make N+1 requests (where N is the number of
|
|
156
|
+
# instances in the account); iterating the collection of instances
|
|
157
|
+
# is one request, and +Enumerable#sort_by+ calls
|
|
158
|
+
# {AWS::EC2::Instance#launch_time} for each instance, causing
|
|
159
|
+
# another request per instance. We can rewrite the code as
|
|
160
|
+
# follows to make only one request:
|
|
161
|
+
#
|
|
162
|
+
# latest = AWS.memoize do
|
|
163
|
+
# ec2.instances.sort_by(&:launch_time).last
|
|
164
|
+
# end
|
|
165
|
+
#
|
|
166
|
+
# Iterating the collection still causes a request, but each
|
|
167
|
+
# subsequent call to {AWS::EC2::Instance#launch_time} uses the
|
|
168
|
+
# results from that first request rather than making a new request
|
|
169
|
+
# for the same data.
|
|
170
|
+
#
|
|
171
|
+
# While memoization is enabled, every response that is received
|
|
172
|
+
# from the service is retained in memory. Therefore you should
|
|
173
|
+
# use memoization only for short-lived blocks of code that make
|
|
174
|
+
# relatively small numbers of requests. The cached responses are
|
|
175
|
+
# used in two ways while memoization is enabled:
|
|
176
|
+
#
|
|
177
|
+
# 1. Before making a request, the SDK checks the cache for a
|
|
178
|
+
# response to a request with the same signature (credentials,
|
|
179
|
+
# service endpoint, operation name, and parameters). If such a
|
|
180
|
+
# response is found, it is used instead of making a new
|
|
181
|
+
# request.
|
|
182
|
+
#
|
|
183
|
+
# 2. Before retrieving data for an attribute of a resource
|
|
184
|
+
# (e.g. {AWS::EC2::Instance#launch_time}), the SDK attempts to
|
|
185
|
+
# find a cached response that contains the requested data. If
|
|
186
|
+
# such a response is found, the cached data is returned instead
|
|
187
|
+
# of making a new request.
|
|
188
|
+
#
|
|
189
|
+
# When memoization is disabled, all previously cached responses
|
|
190
|
+
# are discarded.
|
|
191
|
+
def memoize
|
|
192
|
+
return yield if memoizing?
|
|
193
|
+
|
|
194
|
+
begin
|
|
195
|
+
start_memoizing
|
|
196
|
+
yield if block_given?
|
|
197
|
+
ensure
|
|
198
|
+
stop_memoizing
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# @private
|
|
203
|
+
def resource_cache
|
|
204
|
+
if memoizing?
|
|
205
|
+
Thread.current[:aws_memoization][:resource_cache] ||=
|
|
206
|
+
ResourceCache.new
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# @private
|
|
211
|
+
def response_cache
|
|
212
|
+
if memoizing?
|
|
213
|
+
Thread.current[:aws_memoization][:response_cache] ||=
|
|
214
|
+
ResponseCache.new
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Causes all requests to return empty responses without making any
|
|
219
|
+
# requests against the live services. This does not attempt to
|
|
220
|
+
# mock the services.
|
|
221
|
+
# @return [nil]
|
|
222
|
+
def stub!
|
|
223
|
+
config(:stub_requests => true)
|
|
224
|
+
nil
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
end
|
|
228
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
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/configuration'
|
|
15
|
+
|
|
16
|
+
module AWS
|
|
17
|
+
|
|
18
|
+
# @private
|
|
19
|
+
module Configurable
|
|
20
|
+
|
|
21
|
+
module ClassMethods
|
|
22
|
+
|
|
23
|
+
def make_configurable(name, opts = {})
|
|
24
|
+
Configuration.add_parameter_type(self, name, opts)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.included(m)
|
|
30
|
+
m.extend ClassMethods
|
|
31
|
+
super
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
@@ -0,0 +1,272 @@
|
|
|
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/default_signer'
|
|
15
|
+
require 'aws/http/httparty_handler'
|
|
16
|
+
require 'set'
|
|
17
|
+
|
|
18
|
+
module AWS
|
|
19
|
+
|
|
20
|
+
# A configuration object for AWS interfaces and clients.
|
|
21
|
+
#
|
|
22
|
+
# == Configuring Credential
|
|
23
|
+
#
|
|
24
|
+
# In order to do anything with AWS you will need to assign credentials.
|
|
25
|
+
# The simplest method is to assing your credentials into the default
|
|
26
|
+
# configuration:
|
|
27
|
+
#
|
|
28
|
+
# AWS.config(:access_key_id => 'KEY', :secret_access_key => 'SECRET')
|
|
29
|
+
#
|
|
30
|
+
# You can also export them into your environment and they will be picked up
|
|
31
|
+
# automatically:
|
|
32
|
+
#
|
|
33
|
+
# export AWS_ACCESS_KEY_ID='YOUR_KEY_ID_HERE'
|
|
34
|
+
# export AWS_SECRET_ACCESS_KEY='YOUR_SECRET_KEY_HERE'
|
|
35
|
+
#
|
|
36
|
+
# For compatability with other AWS gems, the credentials can also be
|
|
37
|
+
# exported like:
|
|
38
|
+
#
|
|
39
|
+
# export AMAZON_ACCESS_KEY_ID='YOUR_KEY_ID_HERE'
|
|
40
|
+
# export AMAZON_SECRET_ACCESS_KEY='YOUR_SECRET_KEY_HERE'
|
|
41
|
+
#
|
|
42
|
+
# == Modifying a Configuration
|
|
43
|
+
#
|
|
44
|
+
# Configuration objects are read-only. If you need a different set of
|
|
45
|
+
# configuration values, call {#with}, passing in the updates
|
|
46
|
+
# and a new configuration object will be returned.
|
|
47
|
+
#
|
|
48
|
+
# config = Configuration.new(:max_retires => 3)
|
|
49
|
+
# new_config = config.with(:max_retries => 2)
|
|
50
|
+
#
|
|
51
|
+
# config.max_retries #=> 3
|
|
52
|
+
# new_config.max_retries #=> 2
|
|
53
|
+
#
|
|
54
|
+
# == Global Configuration
|
|
55
|
+
#
|
|
56
|
+
# The global default configuration can be found at {AWS.config}
|
|
57
|
+
#
|
|
58
|
+
class Configuration
|
|
59
|
+
|
|
60
|
+
# Creates a new Configuration object.
|
|
61
|
+
# @param options (see AWS.config)
|
|
62
|
+
# @option options (see AWS.config)
|
|
63
|
+
def initialize options = {}
|
|
64
|
+
|
|
65
|
+
@create_options = options.delete(:__create_options__) || {}
|
|
66
|
+
|
|
67
|
+
@overridden = options.delete(:__overridden__) ||
|
|
68
|
+
Set.new(options.keys.map { |k| k.to_sym })
|
|
69
|
+
|
|
70
|
+
@options = {
|
|
71
|
+
:ec2_endpoint => 'ec2.amazonaws.com',
|
|
72
|
+
:http_handler => Http::HTTPartyHandler.new,
|
|
73
|
+
:max_retries => 3,
|
|
74
|
+
:s3_endpoint => 's3.amazonaws.com',
|
|
75
|
+
:s3_multipart_threshold => 16 * 1024 * 1024,
|
|
76
|
+
:s3_multipart_min_part_size => 5 * 1024 * 1024,
|
|
77
|
+
:s3_multipart_max_parts => 10000,
|
|
78
|
+
:simple_db_endpoint => 'sdb.amazonaws.com',
|
|
79
|
+
:simple_db_consistent_reads => false,
|
|
80
|
+
:simple_email_service_endpoint => 'email.us-east-1.amazonaws.com',
|
|
81
|
+
:sns_endpoint => 'sns.us-east-1.amazonaws.com',
|
|
82
|
+
:sqs_endpoint => 'sqs.us-east-1.amazonaws.com',
|
|
83
|
+
:stub_requests => false,
|
|
84
|
+
:use_ssl => true,
|
|
85
|
+
:user_agent_prefix => nil,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
{
|
|
89
|
+
'AWS_ACCESS_KEY_ID' => :access_key_id,
|
|
90
|
+
'AWS_SECRET_ACCESS_KEY' => :secret_access_key,
|
|
91
|
+
'AMAZON_ACCESS_KEY_ID' => :access_key_id,
|
|
92
|
+
'AMAZON_SECRET_ACCESS_KEY' => :secret_access_key,
|
|
93
|
+
}.each_pair do |env_key, opt_key|
|
|
94
|
+
if ENV[env_key]
|
|
95
|
+
@options[opt_key] = ENV[env_key]
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
options.each do |(k,v)|
|
|
100
|
+
@options[k.to_sym] = v
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @return [Boolean] Returns true if web service requets should be
|
|
106
|
+
# made with HTTPS.
|
|
107
|
+
def use_ssl?
|
|
108
|
+
@options[:use_ssl]
|
|
109
|
+
end
|
|
110
|
+
alias_method :use_ssl, :use_ssl?
|
|
111
|
+
|
|
112
|
+
# @return [String] Your AWS account access key id credential.
|
|
113
|
+
def access_key_id
|
|
114
|
+
@options[:access_key_id]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @return [String] Your AWS secret access key credential.
|
|
118
|
+
def secret_access_key
|
|
119
|
+
@options[:secret_access_key]
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Used to create a new Configuration object with the given modifications.
|
|
123
|
+
# The current configuration object is not modified.
|
|
124
|
+
#
|
|
125
|
+
# AWS.config(:max_retries => 2)
|
|
126
|
+
#
|
|
127
|
+
# no_retries_config = AWS.config.with(:max_retries => 0)
|
|
128
|
+
#
|
|
129
|
+
# AWS.config.max_retries #=> 2
|
|
130
|
+
# no_retries_config.max_retries #=> 0
|
|
131
|
+
#
|
|
132
|
+
# You can use these configuration objects returned by #with to create
|
|
133
|
+
# AWS objects:
|
|
134
|
+
#
|
|
135
|
+
# AWS::S3.new(:config => no_retries_config)
|
|
136
|
+
# AWS::SQS.new(:config => no_retries_config)
|
|
137
|
+
#
|
|
138
|
+
# @param options (see AWS.config)
|
|
139
|
+
# @option options (see AWS.config)
|
|
140
|
+
# @return [Configuration] Copies the current configuration and returns
|
|
141
|
+
# a new one with modifications as provided in +:options+.
|
|
142
|
+
def with options = {}
|
|
143
|
+
overridden = @overridden + options.keys.map { |k| k.to_sym }
|
|
144
|
+
self.class.new(@options.merge(options).
|
|
145
|
+
merge(:__create_options__ => @create_options,
|
|
146
|
+
:__overridden__ => overridden))
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# @return [Integer] Maximum number of times to retry server errors.
|
|
150
|
+
def max_retries
|
|
151
|
+
@options[:max_retries]
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# @return [String] The service endpoint for Amazon S3.
|
|
155
|
+
def s3_endpoint
|
|
156
|
+
@options[:s3_endpoint]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# @return [String] The default service endpoint for Amazon EC2.
|
|
160
|
+
def ec2_endpoint
|
|
161
|
+
@options[:ec2_endpoint]
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# @return [String] The service endpoint for Amazon SimpleDB.
|
|
165
|
+
def simple_db_endpoint
|
|
166
|
+
@options[:simple_db_endpoint]
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# @return [String] The service endpoint for Amazon SimpleEmailService.
|
|
170
|
+
def simple_email_service_endpoint
|
|
171
|
+
@options[:simple_email_service_endpoint]
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# @return [String] The service endpoint for Amazon SNS.
|
|
175
|
+
def sns_endpoint
|
|
176
|
+
@options[:sns_endpoint]
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# @return [String] The service endpoint for Amazon SQS.
|
|
180
|
+
def sqs_endpoint
|
|
181
|
+
@options[:sqs_endpoint]
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# @return [Boolean] Returns true if all reads to SimpleDB default to
|
|
185
|
+
# consistent reads.
|
|
186
|
+
def simple_db_consistent_reads?
|
|
187
|
+
@options[:simple_db_consistent_reads]
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# @return [String,nil] Returns the prefix that is appended to the
|
|
191
|
+
# user agent string that is sent with all requests to AWS.
|
|
192
|
+
def user_agent_prefix
|
|
193
|
+
@options[:user_agent_prefix]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# @return [Object] Returns the current http handler.
|
|
197
|
+
def http_handler
|
|
198
|
+
@options[:http_handler]
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# @return [Object] Returns the current request signer.
|
|
202
|
+
def signer
|
|
203
|
+
return @options[:signer] if @options[:signer]
|
|
204
|
+
raise "Missing credentials" unless access_key_id and secret_access_key
|
|
205
|
+
@options[:signer] ||= DefaultSigner.new(access_key_id, secret_access_key)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# @return [Object,nil] Returns the current logger.
|
|
209
|
+
def logger
|
|
210
|
+
@options[:logger]
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# @return [Boolean] Returns true if this configuration causes
|
|
214
|
+
# all AWS requests to return stubbed (empty) responses without making a
|
|
215
|
+
# request to the actual service.
|
|
216
|
+
def stub_requests?
|
|
217
|
+
@options[:stub_requests]
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
# @return [Integer] Returns the number of bytes where files larger
|
|
221
|
+
# are uploaded to S3 in multiple parts.
|
|
222
|
+
def s3_multipart_threshold
|
|
223
|
+
@options[:s3_multipart_threshold]
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# @return [Integer] The absolute minimum size (in bytes) each S3 multipart
|
|
227
|
+
# segment should be.
|
|
228
|
+
def s3_multipart_min_part_size
|
|
229
|
+
@options[:s3_multipart_min_part_size]
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# @return [Integer] The maximum number of parts to split a file into
|
|
233
|
+
# when uploading to S3.
|
|
234
|
+
def s3_multipart_max_parts
|
|
235
|
+
@options[:s3_multipart_max_parts]
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# @private
|
|
239
|
+
def inspect
|
|
240
|
+
"<#{self.class}>"
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
class << self
|
|
244
|
+
|
|
245
|
+
# @private
|
|
246
|
+
def add_parameter_type(klass, name, options = {})
|
|
247
|
+
if options[:needs]
|
|
248
|
+
define_method(name) do
|
|
249
|
+
unless @overridden.include?(name)
|
|
250
|
+
create_options = { :config => self }
|
|
251
|
+
options[:needs].each do |need|
|
|
252
|
+
create_options[need] = send(need)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
return @options[name] if @options[name] and
|
|
257
|
+
(@overridden.include?(name) or
|
|
258
|
+
@create_options[name] == create_options)
|
|
259
|
+
|
|
260
|
+
@create_options[name] = create_options
|
|
261
|
+
@options[name] = klass.new(create_options)
|
|
262
|
+
end
|
|
263
|
+
else
|
|
264
|
+
define_method(name) do
|
|
265
|
+
@options[name] ||= klass.new(:config => self)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|