aws_sdk 3.1.5
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/lib/aws-sdk.rb +14 -0
- data/lib/aws.rb +49 -0
- data/lib/aws/api_config/AutoScaling-2011-01-01.yml +791 -0
- data/lib/aws/api_config/CloudFormation-2010-05-15.yml +303 -0
- data/lib/aws/api_config/DynamoDB-2011-12-05.yml +540 -0
- data/lib/aws/api_config/EC2-2011-12-15.yml +3638 -0
- data/lib/aws/api_config/EC2-2012-04-01.yml +3739 -0
- data/lib/aws/api_config/ELB-2011-08-15.yml +512 -0
- data/lib/aws/api_config/IAM-2010-05-08.yml +1221 -0
- data/lib/aws/api_config/SNS-2010-03-31.yml +248 -0
- data/lib/aws/api_config/SQS-2011-10-01.yml +314 -0
- data/lib/aws/api_config/STS-2011-06-15.yml +54 -0
- data/lib/aws/api_config/SimpleDB-2009-04-15.yml +305 -0
- data/lib/aws/api_config/SimpleEmailService-2010-12-01.yml +231 -0
- data/lib/aws/api_config/SimpleWorkflow-2012-01-25.yml +721 -0
- data/lib/aws/auto_scaling.rb +162 -0
- data/lib/aws/auto_scaling/activity.rb +102 -0
- data/lib/aws/auto_scaling/activity_collection.rb +82 -0
- data/lib/aws/auto_scaling/client.rb +765 -0
- data/lib/aws/auto_scaling/config.rb +18 -0
- data/lib/aws/auto_scaling/errors.rb +22 -0
- data/lib/aws/auto_scaling/group.rb +420 -0
- data/lib/aws/auto_scaling/group_collection.rb +96 -0
- data/lib/aws/auto_scaling/group_options.rb +146 -0
- data/lib/aws/auto_scaling/instance.rb +192 -0
- data/lib/aws/auto_scaling/instance_collection.rb +63 -0
- data/lib/aws/auto_scaling/launch_configuration.rb +150 -0
- data/lib/aws/auto_scaling/launch_configuration_collection.rb +144 -0
- data/lib/aws/auto_scaling/notification_configuration.rb +89 -0
- data/lib/aws/auto_scaling/notification_configuration_collection.rb +184 -0
- data/lib/aws/auto_scaling/request.rb +23 -0
- data/lib/aws/auto_scaling/scaling_policy.rb +125 -0
- data/lib/aws/auto_scaling/scaling_policy_collection.rb +72 -0
- data/lib/aws/auto_scaling/scaling_policy_options.rb +61 -0
- data/lib/aws/auto_scaling/scheduled_action.rb +145 -0
- data/lib/aws/auto_scaling/scheduled_action_collection.rb +195 -0
- data/lib/aws/auto_scaling/tag.rb +59 -0
- data/lib/aws/auto_scaling/tag_collection.rb +112 -0
- data/lib/aws/cloud_formation.rb +270 -0
- data/lib/aws/cloud_formation/client.rb +339 -0
- data/lib/aws/cloud_formation/config.rb +18 -0
- data/lib/aws/cloud_formation/errors.rb +22 -0
- data/lib/aws/cloud_formation/request.rb +29 -0
- data/lib/aws/cloud_formation/stack.rb +256 -0
- data/lib/aws/cloud_formation/stack_collection.rb +206 -0
- data/lib/aws/cloud_formation/stack_event.rb +75 -0
- data/lib/aws/cloud_formation/stack_event_collection.rb +47 -0
- data/lib/aws/cloud_formation/stack_options.rb +72 -0
- data/lib/aws/cloud_formation/stack_output.rb +53 -0
- data/lib/aws/cloud_formation/stack_resource.rb +117 -0
- data/lib/aws/cloud_formation/stack_resource_collection.rb +84 -0
- data/lib/aws/cloud_formation/stack_resource_summary_collection.rb +72 -0
- data/lib/aws/cloud_formation/stack_summary.rb +71 -0
- data/lib/aws/cloud_formation/stack_summary_collection.rb +127 -0
- data/lib/aws/core.rb +474 -0
- data/lib/aws/core/async_handle.rb +90 -0
- data/lib/aws/core/autoloader.rb +64 -0
- data/lib/aws/core/cacheable.rb +78 -0
- data/lib/aws/core/client.rb +541 -0
- data/lib/aws/core/client/query_json.rb +110 -0
- data/lib/aws/core/client/query_xml.rb +122 -0
- data/lib/aws/core/collection.rb +234 -0
- data/lib/aws/core/collection/limitable.rb +99 -0
- data/lib/aws/core/collection/simple.rb +90 -0
- data/lib/aws/core/configuration.rb +445 -0
- data/lib/aws/core/data.rb +242 -0
- data/lib/aws/core/default_signer.rb +67 -0
- data/lib/aws/core/http/curb_handler.rb +136 -0
- data/lib/aws/core/http/handler.rb +77 -0
- data/lib/aws/core/http/httparty_handler.rb +114 -0
- data/lib/aws/core/http/net_http_handler.rb +85 -0
- data/lib/aws/core/http/request.rb +250 -0
- data/lib/aws/core/http/response.rb +74 -0
- data/lib/aws/core/indifferent_hash.rb +88 -0
- data/lib/aws/core/inflection.rb +47 -0
- data/lib/aws/core/lazy_error_classes.rb +90 -0
- data/lib/aws/core/log_formatter.rb +454 -0
- data/lib/aws/core/meta_utils.rb +45 -0
- data/lib/aws/core/model.rb +57 -0
- data/lib/aws/core/naming.rb +30 -0
- data/lib/aws/core/option_grammar.rb +700 -0
- data/lib/aws/core/page_result.rb +73 -0
- data/lib/aws/core/policy.rb +916 -0
- data/lib/aws/core/resource.rb +408 -0
- data/lib/aws/core/resource_cache.rb +40 -0
- data/lib/aws/core/response.rb +202 -0
- data/lib/aws/core/response_cache.rb +50 -0
- data/lib/aws/core/service_interface.rb +61 -0
- data/lib/aws/core/session_signer.rb +90 -0
- data/lib/aws/core/signature/version_2.rb +42 -0
- data/lib/aws/core/signature/version_3.rb +73 -0
- data/lib/aws/core/signature/version_3_http.rb +72 -0
- data/lib/aws/core/signature/version_4.rb +138 -0
- data/lib/aws/core/uri_escape.rb +42 -0
- data/lib/aws/core/xml/frame.rb +242 -0
- data/lib/aws/core/xml/frame_stack.rb +85 -0
- data/lib/aws/core/xml/grammar.rb +299 -0
- data/lib/aws/core/xml/parser.rb +70 -0
- data/lib/aws/core/xml/root_frame.rb +65 -0
- data/lib/aws/core/xml/sax_handlers/libxml.rb +47 -0
- data/lib/aws/core/xml/sax_handlers/nokogiri.rb +55 -0
- data/lib/aws/core/xml/sax_handlers/ox.rb +41 -0
- data/lib/aws/core/xml/sax_handlers/rexml.rb +43 -0
- data/lib/aws/core/xml/stub.rb +123 -0
- data/lib/aws/dynamo_db.rb +213 -0
- data/lib/aws/dynamo_db/attribute_collection.rb +460 -0
- data/lib/aws/dynamo_db/batch_get.rb +206 -0
- data/lib/aws/dynamo_db/batch_write.rb +251 -0
- data/lib/aws/dynamo_db/client.rb +888 -0
- data/lib/aws/dynamo_db/config.rb +20 -0
- data/lib/aws/dynamo_db/errors.rb +20 -0
- data/lib/aws/dynamo_db/expectations.rb +40 -0
- data/lib/aws/dynamo_db/item.rb +130 -0
- data/lib/aws/dynamo_db/item_collection.rb +852 -0
- data/lib/aws/dynamo_db/item_data.rb +31 -0
- data/lib/aws/dynamo_db/keys.rb +41 -0
- data/lib/aws/dynamo_db/primary_key_element.rb +47 -0
- data/lib/aws/dynamo_db/request.rb +28 -0
- data/lib/aws/dynamo_db/resource.rb +33 -0
- data/lib/aws/dynamo_db/table.rb +489 -0
- data/lib/aws/dynamo_db/table_collection.rb +165 -0
- data/lib/aws/dynamo_db/types.rb +86 -0
- data/lib/aws/ec2.rb +431 -0
- data/lib/aws/ec2/attachment.rb +140 -0
- data/lib/aws/ec2/attachment_collection.rb +54 -0
- data/lib/aws/ec2/availability_zone.rb +87 -0
- data/lib/aws/ec2/availability_zone_collection.rb +43 -0
- data/lib/aws/ec2/block_device_mappings.rb +53 -0
- data/lib/aws/ec2/client.rb +4121 -0
- data/lib/aws/ec2/collection.rb +36 -0
- data/lib/aws/ec2/config.rb +18 -0
- data/lib/aws/ec2/config_transform.rb +63 -0
- data/lib/aws/ec2/customer_gateway.rb +90 -0
- data/lib/aws/ec2/customer_gateway_collection.rb +73 -0
- data/lib/aws/ec2/dhcp_options.rb +106 -0
- data/lib/aws/ec2/dhcp_options_collection.rb +87 -0
- data/lib/aws/ec2/elastic_ip.rb +157 -0
- data/lib/aws/ec2/elastic_ip_collection.rb +97 -0
- data/lib/aws/ec2/errors.rb +32 -0
- data/lib/aws/ec2/filtered_collection.rb +90 -0
- data/lib/aws/ec2/has_permissions.rb +44 -0
- data/lib/aws/ec2/image.rb +254 -0
- data/lib/aws/ec2/image_collection.rb +228 -0
- data/lib/aws/ec2/instance.rb +669 -0
- data/lib/aws/ec2/instance_collection.rb +346 -0
- data/lib/aws/ec2/internet_gateway.rb +122 -0
- data/lib/aws/ec2/internet_gateway/attachment.rb +78 -0
- data/lib/aws/ec2/internet_gateway_collection.rb +54 -0
- data/lib/aws/ec2/key_pair.rb +82 -0
- data/lib/aws/ec2/key_pair_collection.rb +99 -0
- data/lib/aws/ec2/network_acl.rb +256 -0
- data/lib/aws/ec2/network_acl/association.rb +56 -0
- data/lib/aws/ec2/network_acl/entry.rb +147 -0
- data/lib/aws/ec2/network_acl_collection.rb +64 -0
- data/lib/aws/ec2/network_interface.rb +228 -0
- data/lib/aws/ec2/network_interface/attachment.rb +100 -0
- data/lib/aws/ec2/network_interface_collection.rb +103 -0
- data/lib/aws/ec2/permission_collection.rb +174 -0
- data/lib/aws/ec2/region.rb +97 -0
- data/lib/aws/ec2/region_collection.rb +51 -0
- data/lib/aws/ec2/request.rb +22 -0
- data/lib/aws/ec2/reserved_instances.rb +53 -0
- data/lib/aws/ec2/reserved_instances_collection.rb +40 -0
- data/lib/aws/ec2/reserved_instances_offering.rb +58 -0
- data/lib/aws/ec2/reserved_instances_offering_collection.rb +39 -0
- data/lib/aws/ec2/resource.rb +161 -0
- data/lib/aws/ec2/resource_tag_collection.rb +211 -0
- data/lib/aws/ec2/route_table.rb +205 -0
- data/lib/aws/ec2/route_table/association.rb +119 -0
- data/lib/aws/ec2/route_table/route.rb +113 -0
- data/lib/aws/ec2/route_table_collection.rb +72 -0
- data/lib/aws/ec2/security_group.rb +458 -0
- data/lib/aws/ec2/security_group/egress_ip_permission_collection.rb +63 -0
- data/lib/aws/ec2/security_group/ingress_ip_permission_collection.rb +61 -0
- data/lib/aws/ec2/security_group/ip_permission.rb +128 -0
- data/lib/aws/ec2/security_group_collection.rb +135 -0
- data/lib/aws/ec2/snapshot.rb +143 -0
- data/lib/aws/ec2/snapshot_collection.rb +131 -0
- data/lib/aws/ec2/subnet.rb +161 -0
- data/lib/aws/ec2/subnet_collection.rb +115 -0
- data/lib/aws/ec2/tag.rb +81 -0
- data/lib/aws/ec2/tag_collection.rb +107 -0
- data/lib/aws/ec2/tagged_collection.rb +53 -0
- data/lib/aws/ec2/tagged_item.rb +85 -0
- data/lib/aws/ec2/volume.rb +170 -0
- data/lib/aws/ec2/volume_collection.rb +97 -0
- data/lib/aws/ec2/vpc.rb +166 -0
- data/lib/aws/ec2/vpc_collection.rb +70 -0
- data/lib/aws/ec2/vpn_connection.rb +99 -0
- data/lib/aws/ec2/vpn_connection/telemetry.rb +49 -0
- data/lib/aws/ec2/vpn_connection_collection.rb +96 -0
- data/lib/aws/ec2/vpn_gateway.rb +123 -0
- data/lib/aws/ec2/vpn_gateway/attachment.rb +45 -0
- data/lib/aws/ec2/vpn_gateway_collection.rb +77 -0
- data/lib/aws/elb.rb +65 -0
- data/lib/aws/elb/availability_zone_collection.rb +138 -0
- data/lib/aws/elb/backend_server_policy_collection.rb +140 -0
- data/lib/aws/elb/client.rb +539 -0
- data/lib/aws/elb/config.rb +18 -0
- data/lib/aws/elb/errors.rb +26 -0
- data/lib/aws/elb/instance_collection.rb +174 -0
- data/lib/aws/elb/listener.rb +189 -0
- data/lib/aws/elb/listener_collection.rb +119 -0
- data/lib/aws/elb/listener_opts.rb +45 -0
- data/lib/aws/elb/load_balancer.rb +253 -0
- data/lib/aws/elb/load_balancer_collection.rb +113 -0
- data/lib/aws/elb/load_balancer_policy.rb +93 -0
- data/lib/aws/elb/load_balancer_policy_collection.rb +208 -0
- data/lib/aws/elb/request.rb +23 -0
- data/lib/aws/errors.rb +122 -0
- data/lib/aws/iam.rb +418 -0
- data/lib/aws/iam/access_key.rb +180 -0
- data/lib/aws/iam/access_key_collection.rb +128 -0
- data/lib/aws/iam/account_alias_collection.rb +79 -0
- data/lib/aws/iam/client.rb +1609 -0
- data/lib/aws/iam/collection.rb +83 -0
- data/lib/aws/iam/config.rb +18 -0
- data/lib/aws/iam/errors.rb +22 -0
- data/lib/aws/iam/group.rb +111 -0
- data/lib/aws/iam/group_collection.rb +132 -0
- data/lib/aws/iam/group_policy_collection.rb +47 -0
- data/lib/aws/iam/group_user_collection.rb +84 -0
- data/lib/aws/iam/login_profile.rb +99 -0
- data/lib/aws/iam/mfa_device.rb +52 -0
- data/lib/aws/iam/mfa_device_collection.rb +127 -0
- data/lib/aws/iam/policy.rb +46 -0
- data/lib/aws/iam/policy_collection.rb +188 -0
- data/lib/aws/iam/request.rb +29 -0
- data/lib/aws/iam/resource.rb +71 -0
- data/lib/aws/iam/server_certificate.rb +141 -0
- data/lib/aws/iam/server_certificate_collection.rb +138 -0
- data/lib/aws/iam/signing_certificate.rb +169 -0
- data/lib/aws/iam/signing_certificate_collection.rb +131 -0
- data/lib/aws/iam/user.rb +205 -0
- data/lib/aws/iam/user_collection.rb +133 -0
- data/lib/aws/iam/user_group_collection.rb +98 -0
- data/lib/aws/iam/user_policy.rb +90 -0
- data/lib/aws/iam/user_policy_collection.rb +45 -0
- data/lib/aws/iam/virtual_mfa_device.rb +139 -0
- data/lib/aws/iam/virtual_mfa_device_collection.rb +73 -0
- data/lib/aws/rails.rb +195 -0
- data/lib/aws/record.rb +116 -0
- data/lib/aws/record/abstract_base.rb +645 -0
- data/lib/aws/record/attributes.rb +384 -0
- data/lib/aws/record/conversion.rb +38 -0
- data/lib/aws/record/dirty_tracking.rb +285 -0
- data/lib/aws/record/errors.rb +143 -0
- data/lib/aws/record/exceptions.rb +48 -0
- data/lib/aws/record/hash_model.rb +161 -0
- data/lib/aws/record/hash_model/attributes.rb +182 -0
- data/lib/aws/record/hash_model/finder_methods.rb +172 -0
- data/lib/aws/record/hash_model/scope.rb +108 -0
- data/lib/aws/record/model.rb +427 -0
- data/lib/aws/record/model/attributes.rb +379 -0
- data/lib/aws/record/model/finder_methods.rb +232 -0
- data/lib/aws/record/model/scope.rb +213 -0
- data/lib/aws/record/naming.rb +31 -0
- data/lib/aws/record/scope.rb +199 -0
- data/lib/aws/record/validations.rb +694 -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/method.rb +33 -0
- data/lib/aws/record/validators/numericality.rb +138 -0
- data/lib/aws/record/validators/presence.rb +45 -0
- data/lib/aws/s3.rb +135 -0
- data/lib/aws/s3/access_control_list.rb +250 -0
- data/lib/aws/s3/acl_object.rb +264 -0
- data/lib/aws/s3/bucket.rb +393 -0
- data/lib/aws/s3/bucket_collection.rb +143 -0
- data/lib/aws/s3/bucket_lifecycle_configuration.rb +360 -0
- data/lib/aws/s3/bucket_version_collection.rb +77 -0
- data/lib/aws/s3/client.rb +1184 -0
- data/lib/aws/s3/client/xml.rb +177 -0
- data/lib/aws/s3/config.rb +26 -0
- data/lib/aws/s3/data_options.rb +100 -0
- data/lib/aws/s3/errors.rb +81 -0
- data/lib/aws/s3/multipart_upload.rb +317 -0
- data/lib/aws/s3/multipart_upload_collection.rb +68 -0
- data/lib/aws/s3/object_collection.rb +337 -0
- data/lib/aws/s3/object_metadata.rb +96 -0
- data/lib/aws/s3/object_upload_collection.rb +77 -0
- data/lib/aws/s3/object_version.rb +143 -0
- data/lib/aws/s3/object_version_collection.rb +89 -0
- data/lib/aws/s3/paginated_collection.rb +75 -0
- data/lib/aws/s3/policy.rb +74 -0
- data/lib/aws/s3/prefix_and_delimiter_collection.rb +47 -0
- data/lib/aws/s3/prefixed_collection.rb +81 -0
- data/lib/aws/s3/presigned_post.rb +553 -0
- data/lib/aws/s3/request.rb +201 -0
- data/lib/aws/s3/s3_object.rb +1037 -0
- data/lib/aws/s3/tree.rb +118 -0
- data/lib/aws/s3/tree/branch_node.rb +68 -0
- data/lib/aws/s3/tree/child_collection.rb +104 -0
- data/lib/aws/s3/tree/leaf_node.rb +94 -0
- data/lib/aws/s3/tree/node.rb +22 -0
- data/lib/aws/s3/tree/parent.rb +87 -0
- data/lib/aws/s3/uploaded_part.rb +80 -0
- data/lib/aws/s3/uploaded_part_collection.rb +84 -0
- data/lib/aws/simple_db.rb +217 -0
- data/lib/aws/simple_db/attribute.rb +154 -0
- data/lib/aws/simple_db/attribute_collection.rb +231 -0
- data/lib/aws/simple_db/client.rb +349 -0
- data/lib/aws/simple_db/config.rb +20 -0
- data/lib/aws/simple_db/consistent_read_option.rb +42 -0
- data/lib/aws/simple_db/delete_attributes.rb +62 -0
- data/lib/aws/simple_db/domain.rb +121 -0
- data/lib/aws/simple_db/domain_collection.rb +113 -0
- data/lib/aws/simple_db/domain_metadata.rb +110 -0
- data/lib/aws/simple_db/errors.rb +55 -0
- data/lib/aws/simple_db/expect_condition_option.rb +45 -0
- data/lib/aws/simple_db/item.rb +93 -0
- data/lib/aws/simple_db/item_collection.rb +649 -0
- data/lib/aws/simple_db/item_data.rb +73 -0
- data/lib/aws/simple_db/put_attributes.rb +60 -0
- data/lib/aws/simple_db/request.rb +23 -0
- data/lib/aws/simple_email_service.rb +426 -0
- data/lib/aws/simple_email_service/client.rb +286 -0
- data/lib/aws/simple_email_service/config.rb +19 -0
- data/lib/aws/simple_email_service/email_address_collection.rb +69 -0
- data/lib/aws/simple_email_service/errors.rb +22 -0
- data/lib/aws/simple_email_service/identity.rb +91 -0
- data/lib/aws/simple_email_service/identity_collection.rb +81 -0
- data/lib/aws/simple_email_service/quotas.rb +64 -0
- data/lib/aws/simple_email_service/request.rb +29 -0
- data/lib/aws/simple_workflow.rb +226 -0
- data/lib/aws/simple_workflow/activity_task.rb +173 -0
- data/lib/aws/simple_workflow/activity_task_collection.rb +123 -0
- data/lib/aws/simple_workflow/activity_type.rb +131 -0
- data/lib/aws/simple_workflow/activity_type_collection.rb +93 -0
- data/lib/aws/simple_workflow/client.rb +1434 -0
- data/lib/aws/simple_workflow/config.rb +18 -0
- data/lib/aws/simple_workflow/count.rb +49 -0
- data/lib/aws/simple_workflow/decision_task.rb +601 -0
- data/lib/aws/simple_workflow/decision_task_collection.rb +225 -0
- data/lib/aws/simple_workflow/domain.rb +122 -0
- data/lib/aws/simple_workflow/domain_collection.rb +169 -0
- data/lib/aws/simple_workflow/errors.rb +20 -0
- data/lib/aws/simple_workflow/history_event.rb +276 -0
- data/lib/aws/simple_workflow/history_event_collection.rb +76 -0
- data/lib/aws/simple_workflow/option_formatters.rb +82 -0
- data/lib/aws/simple_workflow/request.rb +36 -0
- data/lib/aws/simple_workflow/resource.rb +94 -0
- data/lib/aws/simple_workflow/type.rb +89 -0
- data/lib/aws/simple_workflow/type_collection.rb +140 -0
- data/lib/aws/simple_workflow/workflow_execution.rb +386 -0
- data/lib/aws/simple_workflow/workflow_execution_collection.rb +617 -0
- data/lib/aws/simple_workflow/workflow_type.rb +177 -0
- data/lib/aws/simple_workflow/workflow_type_collection.rb +91 -0
- data/lib/aws/sns.rb +74 -0
- data/lib/aws/sns/client.rb +371 -0
- data/lib/aws/sns/config.rb +18 -0
- data/lib/aws/sns/errors.rb +22 -0
- data/lib/aws/sns/has_delivery_policy.rb +68 -0
- data/lib/aws/sns/policy.rb +47 -0
- data/lib/aws/sns/request.rb +23 -0
- data/lib/aws/sns/subscription.rb +144 -0
- data/lib/aws/sns/subscription_collection.rb +80 -0
- data/lib/aws/sns/topic.rb +403 -0
- data/lib/aws/sns/topic_collection.rb +67 -0
- data/lib/aws/sns/topic_subscription_collection.rb +55 -0
- data/lib/aws/sqs.rb +79 -0
- data/lib/aws/sqs/client.rb +360 -0
- data/lib/aws/sqs/config.rb +18 -0
- data/lib/aws/sqs/errors.rb +101 -0
- data/lib/aws/sqs/policy.rb +48 -0
- data/lib/aws/sqs/queue.rb +725 -0
- data/lib/aws/sqs/queue_collection.rb +170 -0
- data/lib/aws/sqs/received_message.rb +181 -0
- data/lib/aws/sqs/received_sns_message.rb +112 -0
- data/lib/aws/sqs/request.rb +43 -0
- data/lib/aws/sts.rb +152 -0
- data/lib/aws/sts/client.rb +105 -0
- data/lib/aws/sts/config.rb +18 -0
- data/lib/aws/sts/errors.rb +22 -0
- data/lib/aws/sts/federated_session.rb +56 -0
- data/lib/aws/sts/policy.rb +30 -0
- data/lib/aws/sts/request.rb +29 -0
- data/lib/aws/sts/session.rb +48 -0
- data/lib/net/http/connection_pool.rb +210 -0
- data/lib/net/http/connection_pool/connection.rb +132 -0
- data/lib/net/http/connection_pool/session.rb +93 -0
- data/lib/user.rb +49 -0
- metadata +433 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
|
|
14
|
+
module AWS
|
|
15
|
+
module Core
|
|
16
|
+
|
|
17
|
+
# Mixin that provides a generic callback facility for asynchronous
|
|
18
|
+
# tasks that can either succeed or fail.
|
|
19
|
+
module AsyncHandle
|
|
20
|
+
|
|
21
|
+
# Called to signal success and fire off the success and complete callbacks.
|
|
22
|
+
def signal_success
|
|
23
|
+
__send_signal(:success)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Called to signal failure and fire off the failure and complete callbacks.
|
|
27
|
+
def signal_failure
|
|
28
|
+
__send_signal(:failure)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Registers a callback to be called on successful completion of
|
|
32
|
+
# the task.
|
|
33
|
+
#
|
|
34
|
+
# handle.on_success { puts "It worked!" }
|
|
35
|
+
#
|
|
36
|
+
# If this is called when the task has already completed
|
|
37
|
+
# successfully, it will call the callback immediately.
|
|
38
|
+
def on_success(&block)
|
|
39
|
+
if @_async_status == :success
|
|
40
|
+
block.call
|
|
41
|
+
else
|
|
42
|
+
(@_async_callbacks ||= []) << { :success => block }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Registers a callback to be called when the task fails.
|
|
47
|
+
#
|
|
48
|
+
# handle.on_failure { puts "It didn't work!" }
|
|
49
|
+
#
|
|
50
|
+
# If this is called when the task has already failed, it will
|
|
51
|
+
# call the callback immediately.
|
|
52
|
+
def on_failure(&block)
|
|
53
|
+
if @_async_status == :failure
|
|
54
|
+
block.call
|
|
55
|
+
else
|
|
56
|
+
(@_async_callbacks ||= []) << { :failure => block }
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Registers a callback to be called when the task is complete,
|
|
61
|
+
# regardless of its status. Yields the status to the block.
|
|
62
|
+
#
|
|
63
|
+
# handle.on_complete do |status|
|
|
64
|
+
# puts "It #{status == :success ? 'did' : 'did not'} work!"
|
|
65
|
+
# end
|
|
66
|
+
#
|
|
67
|
+
# If this is called when the task has already completed, it will
|
|
68
|
+
# call the callback immediately.
|
|
69
|
+
def on_complete(&block)
|
|
70
|
+
if !@_async_status.nil?
|
|
71
|
+
block.call(@_async_status)
|
|
72
|
+
else
|
|
73
|
+
(@_async_callbacks ||= []) << {
|
|
74
|
+
:failure => lambda { block.call(:failure) },
|
|
75
|
+
:success => lambda { block.call(:success) }
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
private
|
|
81
|
+
def __send_signal(kind)
|
|
82
|
+
@_async_status = kind
|
|
83
|
+
@_async_callbacks.map do |cb|
|
|
84
|
+
cb[kind]
|
|
85
|
+
end.compact.each {|block| block.call } if @_async_callbacks
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
|
|
14
|
+
require 'set'
|
|
15
|
+
|
|
16
|
+
module AWS
|
|
17
|
+
|
|
18
|
+
@@eager = false
|
|
19
|
+
@@autoloads = {}
|
|
20
|
+
|
|
21
|
+
def self.register_autoloads klass, prefix = nil, &block
|
|
22
|
+
autoloader = Core::Autoloader.new(klass, prefix)
|
|
23
|
+
autoloader.instance_eval(&block)
|
|
24
|
+
autoloader.autoloads.each_pair do |const_name, file_path|
|
|
25
|
+
require(file_path) if @@eager
|
|
26
|
+
@@autoloads["#{klass}::#{const_name}"] = file_path
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.eager_autoload!
|
|
31
|
+
unless @@eager
|
|
32
|
+
@@eager = true
|
|
33
|
+
@@autoloads.values.uniq.each {|file_path| require(file_path) }
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.autoloads
|
|
38
|
+
@@autoloads
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
module Core
|
|
42
|
+
|
|
43
|
+
# @private
|
|
44
|
+
class Autoloader
|
|
45
|
+
|
|
46
|
+
def initialize klass, prefix = nil
|
|
47
|
+
@klass = klass
|
|
48
|
+
@prefix = prefix || klass.name.gsub(/::/, '/').downcase
|
|
49
|
+
@autoloads = {}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
attr_reader :autoloads
|
|
53
|
+
|
|
54
|
+
def autoload const_name, file_name
|
|
55
|
+
path = "#{@prefix}/#{file_name}"
|
|
56
|
+
@klass.autoload(const_name, path)
|
|
57
|
+
@autoloads[const_name] = path
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
|
|
14
|
+
module AWS
|
|
15
|
+
module Core
|
|
16
|
+
|
|
17
|
+
# @private
|
|
18
|
+
module Cacheable
|
|
19
|
+
|
|
20
|
+
# @private
|
|
21
|
+
class NoData < StandardError; end
|
|
22
|
+
|
|
23
|
+
def self.included base
|
|
24
|
+
base.extend Naming unless base.respond_to?(:service_ruby_name)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @private
|
|
28
|
+
protected
|
|
29
|
+
def local_cache_key
|
|
30
|
+
raise NotImplementedError
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @private
|
|
34
|
+
protected
|
|
35
|
+
def cache_key
|
|
36
|
+
@cache_key ||= begin
|
|
37
|
+
endpoint_method = self.class.service_ruby_name + "_endpoint"
|
|
38
|
+
config.signer.access_key_id + ":" +
|
|
39
|
+
config.send(endpoint_method) + ":" +
|
|
40
|
+
self.class.name + ":" +
|
|
41
|
+
local_cache_key
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @private
|
|
46
|
+
public
|
|
47
|
+
def retrieve_attribute attr, &block
|
|
48
|
+
|
|
49
|
+
if cache = AWS.response_cache
|
|
50
|
+
|
|
51
|
+
if cache.resource_cache.cached?(cache_key, attr.name)
|
|
52
|
+
return cache.resource_cache.get(cache_key, attr.name)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
cache.select(*attr.request_types).each do |response|
|
|
56
|
+
if attributes = attributes_from_response(response)
|
|
57
|
+
cache.resource_cache.store(cache_key, attributes)
|
|
58
|
+
return attributes[attr.name] if attributes.key?(attr.name)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
response = yield
|
|
65
|
+
|
|
66
|
+
if attributes = attributes_from_response(response)
|
|
67
|
+
if cache = AWS.response_cache
|
|
68
|
+
cache.resource_cache.store(cache_key, attributes)
|
|
69
|
+
end
|
|
70
|
+
attributes[attr.name] if attributes.key?(attr.name)
|
|
71
|
+
else
|
|
72
|
+
raise NoData.new("no data in #{response.request_type} response")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
# Copyright 2011-2012 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"). You
|
|
4
|
+
# may not use this file except in compliance with the License. A copy of
|
|
5
|
+
# the License is located at
|
|
6
|
+
#
|
|
7
|
+
# http://aws.amazon.com/apache2.0/
|
|
8
|
+
#
|
|
9
|
+
# or in the "license" file accompanying this file. This file is
|
|
10
|
+
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
11
|
+
# ANY KIND, either express or implied. See the License for the specific
|
|
12
|
+
# language governing permissions and limitations under the License.
|
|
13
|
+
|
|
14
|
+
require 'set'
|
|
15
|
+
require 'aws/core/client/query_xml'
|
|
16
|
+
require 'aws/core/client/query_json'
|
|
17
|
+
require 'json'
|
|
18
|
+
|
|
19
|
+
module AWS
|
|
20
|
+
module Core
|
|
21
|
+
|
|
22
|
+
# Base client class for all of the Amazon AWS service clients.
|
|
23
|
+
class Client
|
|
24
|
+
|
|
25
|
+
extend Naming
|
|
26
|
+
|
|
27
|
+
# @private
|
|
28
|
+
CACHEABLE_REQUESTS = Set[]
|
|
29
|
+
|
|
30
|
+
# Creates a new low-level client.
|
|
31
|
+
#
|
|
32
|
+
# == Required Options
|
|
33
|
+
#
|
|
34
|
+
# To create a client you must provide access to AWS credentials.
|
|
35
|
+
# There are two options:
|
|
36
|
+
#
|
|
37
|
+
# * +:signer+ -- An object that responds to +access_key_id+
|
|
38
|
+
# (to return the AWS Access Key ID) and to
|
|
39
|
+
# <code>sign(string_to_sign)</code> (to return a signature
|
|
40
|
+
# for a given string). An example implementation is
|
|
41
|
+
# AWS::Core::DefaultSigner. This option is useful if you want to
|
|
42
|
+
# more tightly control access to your secret access key (for
|
|
43
|
+
# example by moving the signature computation into a
|
|
44
|
+
# different process).
|
|
45
|
+
#
|
|
46
|
+
# * +:access_key_id+ and +:secret_access_key+ -- You can use
|
|
47
|
+
# these options to provide the AWS Access Key ID and AWS
|
|
48
|
+
# Secret Access Key directly to the client.
|
|
49
|
+
#
|
|
50
|
+
# == Optional
|
|
51
|
+
#
|
|
52
|
+
# * +:http_handler+ -- Any object that implements a
|
|
53
|
+
# <code>handle(request, response)</code> method; an example
|
|
54
|
+
# is BuiltinHttpHandler. This method is used to perform the
|
|
55
|
+
# HTTP requests that this client constructs.
|
|
56
|
+
#
|
|
57
|
+
def initialize options = {}
|
|
58
|
+
|
|
59
|
+
options = options.dup # so we don't modify the options passed in
|
|
60
|
+
|
|
61
|
+
@service_ruby_name = self.class.service_ruby_name
|
|
62
|
+
|
|
63
|
+
# translate these into service specific configuration options,
|
|
64
|
+
# e.g. :endpoint into :s3_endpoint
|
|
65
|
+
[:endpoint, :region, :port].each do |opt|
|
|
66
|
+
if options[opt]
|
|
67
|
+
options[:"#{service_ruby_name}_#{opt}"] = options.delete(opt)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
@config = options.delete(:config)
|
|
72
|
+
@config ||= AWS.config
|
|
73
|
+
@config = @config.with(options)
|
|
74
|
+
|
|
75
|
+
@signer = @config.signer
|
|
76
|
+
@http_handler = @config.http_handler
|
|
77
|
+
@endpoint = config.send(:"#{service_ruby_name}_endpoint")
|
|
78
|
+
@port = config.send(:"#{service_ruby_name}_port")
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# @return [Configuration] This clients configuration.
|
|
83
|
+
attr_reader :config
|
|
84
|
+
|
|
85
|
+
# @return [DefaultSigner,Object] Returns the signer for this client.
|
|
86
|
+
# This is normally a DefaultSigner, but it can be configured to
|
|
87
|
+
# an other object.
|
|
88
|
+
# @private
|
|
89
|
+
attr_reader :signer
|
|
90
|
+
|
|
91
|
+
# @return [String] The snake-cased ruby name for the service
|
|
92
|
+
# (e.g. 's3', 'iam', 'dynamo_db', etc).
|
|
93
|
+
# @private
|
|
94
|
+
attr_reader :service_ruby_name
|
|
95
|
+
|
|
96
|
+
# @return [Integer] What port this client makes requests via.
|
|
97
|
+
# @private
|
|
98
|
+
attr_reader :port
|
|
99
|
+
|
|
100
|
+
# @return [String] Returns the service endpoint (hostname) this client
|
|
101
|
+
# makes requests against.
|
|
102
|
+
# @private
|
|
103
|
+
attr_reader :endpoint
|
|
104
|
+
|
|
105
|
+
# @return (see Client.operations)
|
|
106
|
+
def operations
|
|
107
|
+
self.class.operations
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Returns a copy of the client with a different HTTP handler.
|
|
111
|
+
# You can pass an object like BuiltinHttpHandler or you can
|
|
112
|
+
# use a block; for example:
|
|
113
|
+
#
|
|
114
|
+
# s3_with_logging = s3.with_http_handler do |request, response|
|
|
115
|
+
# $stderr.puts request.inspect
|
|
116
|
+
# super
|
|
117
|
+
# end
|
|
118
|
+
#
|
|
119
|
+
# The block executes in the context of an HttpHandler
|
|
120
|
+
# instance, and +super+ delegates to the HTTP handler used by
|
|
121
|
+
# this client. This provides an easy way to spy on requests
|
|
122
|
+
# and responses. See HttpHandler, HttpRequest, and
|
|
123
|
+
# HttpResponse for more details on how to implement a fully
|
|
124
|
+
# functional HTTP handler using a different HTTP library than
|
|
125
|
+
# the one that ships with Ruby.
|
|
126
|
+
# @param handler (nil) A new http handler. Leave blank and pass a
|
|
127
|
+
# block to wrap the current handler with the block.
|
|
128
|
+
# @return [Core::Client] Returns a new instance of the client class with
|
|
129
|
+
# the modified or wrapped http handler.
|
|
130
|
+
def with_http_handler(handler = nil, &blk)
|
|
131
|
+
handler ||= Http::Handler.new(@http_handler, &blk)
|
|
132
|
+
with_options(:http_handler => handler)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# @param [Hash] options
|
|
136
|
+
# @see AWS.config detailed list of accepted options.
|
|
137
|
+
def with_options options
|
|
138
|
+
with_config(config.with(options))
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# @param [Configuration] config The configuration object to use.
|
|
142
|
+
# @return [Core::Client] Returns a new client object with the given
|
|
143
|
+
# configuration.
|
|
144
|
+
def with_config config
|
|
145
|
+
self.class.new(:config => config)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# The stub returned is memoized.
|
|
149
|
+
# @see new_stub_for
|
|
150
|
+
# @private
|
|
151
|
+
def stub_for method_name
|
|
152
|
+
@stubs ||= {}
|
|
153
|
+
@stubs[method_name] ||= new_stub_for(method_name)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Primarily used for testing, this method returns an empty psuedo
|
|
157
|
+
# service response without making a request. Its used primarily for
|
|
158
|
+
# testing the ligher level service interfaces.
|
|
159
|
+
# @private
|
|
160
|
+
def new_stub_for method_name
|
|
161
|
+
response = Response.new(Http::Request.new, Http::Response.new)
|
|
162
|
+
response.request_type = method_name
|
|
163
|
+
response.request_options = {}
|
|
164
|
+
send("simulate_#{method_name}_response", response)
|
|
165
|
+
response.signal_success
|
|
166
|
+
response
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
protected
|
|
170
|
+
|
|
171
|
+
def new_request
|
|
172
|
+
eval(self.class.name.sub(/::Client$/, ''))::Request.new
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def new_response(*args, &block)
|
|
176
|
+
Response.new(*args, &block)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def make_async_request response
|
|
180
|
+
|
|
181
|
+
pauses = async_request_with_retries(response, response.http_request)
|
|
182
|
+
|
|
183
|
+
response
|
|
184
|
+
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def async_request_with_retries response, http_request, retry_delays = nil
|
|
188
|
+
|
|
189
|
+
response.http_response = Http::Response.new
|
|
190
|
+
|
|
191
|
+
handle = Object.new
|
|
192
|
+
handle.extend AsyncHandle
|
|
193
|
+
handle.on_complete do |status|
|
|
194
|
+
case status
|
|
195
|
+
when :failure
|
|
196
|
+
response.error = StandardError.new("failed to contact the service")
|
|
197
|
+
response.signal_failure
|
|
198
|
+
when :success
|
|
199
|
+
populate_error(response)
|
|
200
|
+
retry_delays ||= sleep_durations(response)
|
|
201
|
+
if should_retry?(response) and !retry_delays.empty?
|
|
202
|
+
rebuild_http_request(response)
|
|
203
|
+
@http_handler.sleep_with_callback(retry_delays.shift) do
|
|
204
|
+
async_request_with_retries(response, response.http_request, retry_delays)
|
|
205
|
+
end
|
|
206
|
+
else
|
|
207
|
+
response.error ?
|
|
208
|
+
response.signal_failure :
|
|
209
|
+
response.signal_success
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
@http_handler.handle_async(http_request, response.http_response, handle)
|
|
215
|
+
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def make_sync_request response
|
|
219
|
+
retry_server_errors do
|
|
220
|
+
|
|
221
|
+
response.http_response = http_response =
|
|
222
|
+
Http::Response.new
|
|
223
|
+
|
|
224
|
+
@http_handler.handle(response.http_request, http_response)
|
|
225
|
+
|
|
226
|
+
populate_error(response)
|
|
227
|
+
response.signal_success unless response.error
|
|
228
|
+
response
|
|
229
|
+
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def retry_server_errors &block
|
|
234
|
+
|
|
235
|
+
response = yield
|
|
236
|
+
|
|
237
|
+
sleeps = sleep_durations(response)
|
|
238
|
+
while should_retry?(response)
|
|
239
|
+
break if sleeps.empty?
|
|
240
|
+
Kernel.sleep(sleeps.shift)
|
|
241
|
+
# rebuild the request to get a fresh signature
|
|
242
|
+
rebuild_http_request(response)
|
|
243
|
+
response = yield
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
response
|
|
247
|
+
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def rebuild_http_request response
|
|
251
|
+
response.rebuild_request
|
|
252
|
+
response.retry_count += 1
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def sleep_durations response
|
|
256
|
+
factor = scaling_factor(response)
|
|
257
|
+
Array.new(config.max_retries) {|n| (2 ** n) * factor }
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def scaling_factor response
|
|
261
|
+
response.throttled? ? (0.5 + Kernel.rand * 0.1) : 0.3
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def should_retry? response
|
|
265
|
+
response.timeout? or
|
|
266
|
+
response.throttled? or
|
|
267
|
+
response.error.kind_of?(Errors::ServerError)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def return_or_raise options, &block
|
|
271
|
+
response = yield
|
|
272
|
+
unless options[:async]
|
|
273
|
+
raise response.error if response.error
|
|
274
|
+
end
|
|
275
|
+
response
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
# Yields to the given block (which should be making a
|
|
279
|
+
# request and returning a {Response} object). The results of the
|
|
280
|
+
# request/response are logged.
|
|
281
|
+
#
|
|
282
|
+
# @param [Hash] options
|
|
283
|
+
# @option options [Boolean] :async
|
|
284
|
+
# @return [Response]
|
|
285
|
+
def log_client_request options, &block
|
|
286
|
+
|
|
287
|
+
# time the request, retries and all
|
|
288
|
+
start = Time.now
|
|
289
|
+
response = yield
|
|
290
|
+
response.duration = Time.now - start
|
|
291
|
+
|
|
292
|
+
if options[:async]
|
|
293
|
+
response.on_complete { log_response(response) }
|
|
294
|
+
else
|
|
295
|
+
log_response(response)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
response
|
|
299
|
+
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# Logs the response to the configured logger.
|
|
303
|
+
# @param [Resposne] response
|
|
304
|
+
# @return [nil]
|
|
305
|
+
def log_response response
|
|
306
|
+
if config.logger
|
|
307
|
+
message = config.log_formatter.format(response)
|
|
308
|
+
config.logger.send(config.log_level, message)
|
|
309
|
+
end
|
|
310
|
+
nil
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def populate_error response
|
|
314
|
+
response.error = extract_error(response)
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# If the response contains error, this method will construct
|
|
318
|
+
# and return an error object. If no error is contained in the
|
|
319
|
+
# response, then nil is returned.
|
|
320
|
+
# @param [Response] response
|
|
321
|
+
# @return [Errors::Base,nil]
|
|
322
|
+
def extract_error response
|
|
323
|
+
|
|
324
|
+
status = response.http_response.status
|
|
325
|
+
|
|
326
|
+
error_code, error_message = extract_error_details(response)
|
|
327
|
+
|
|
328
|
+
error_args = [
|
|
329
|
+
response.http_request,
|
|
330
|
+
response.http_response,
|
|
331
|
+
error_code,
|
|
332
|
+
error_message
|
|
333
|
+
]
|
|
334
|
+
|
|
335
|
+
case
|
|
336
|
+
when response.timeout? then TimeoutError.new
|
|
337
|
+
when error_code then error_class(error_code).new(*error_args)
|
|
338
|
+
when status >= 500 then Errors::ServerError.new(*error_args)
|
|
339
|
+
when status >= 300 then Errors::ClientError.new(*error_args)
|
|
340
|
+
else nil # no error
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
# Given an error code string, this method will return an error class.
|
|
346
|
+
#
|
|
347
|
+
# AWS::EC2::Client.new.send(:error_code, 'InvalidInstanceId')
|
|
348
|
+
# #=> AWS::EC2::Errors::InvalidInstanceId
|
|
349
|
+
#
|
|
350
|
+
# @param [String] error_code The error code string as returned by
|
|
351
|
+
# the service. If this class contains periods, they will be
|
|
352
|
+
# converted into namespaces (e.g. 'Foo.Bar' becomes Errors::Foo::Bar).
|
|
353
|
+
#
|
|
354
|
+
# @return [Class]
|
|
355
|
+
#
|
|
356
|
+
def error_class error_code
|
|
357
|
+
errors_module.error_class(error_code)
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
# Returns the ::Errors module for the current client.
|
|
361
|
+
#
|
|
362
|
+
# AWS::S3::Client.new.errors_module
|
|
363
|
+
# #=> AWS::S3::Errors
|
|
364
|
+
#
|
|
365
|
+
# @return [Module]
|
|
366
|
+
#
|
|
367
|
+
def errors_module
|
|
368
|
+
AWS.const_get(self.class.to_s[/(\w+)::Client/, 1])::Errors
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
def client_request name, options, &block
|
|
372
|
+
return_or_raise(options) do
|
|
373
|
+
log_client_request(options) do
|
|
374
|
+
|
|
375
|
+
if config.stub_requests?
|
|
376
|
+
|
|
377
|
+
response = stub_for(name)
|
|
378
|
+
response.http_request = build_request(name, options, &block)
|
|
379
|
+
response.request_options = options
|
|
380
|
+
response
|
|
381
|
+
|
|
382
|
+
else
|
|
383
|
+
|
|
384
|
+
client = self
|
|
385
|
+
response = new_response { client.send(:build_request, name, options, &block) }
|
|
386
|
+
response.request_type = name
|
|
387
|
+
response.request_options = options
|
|
388
|
+
|
|
389
|
+
if
|
|
390
|
+
cacheable_request?(name, options) and
|
|
391
|
+
cache = AWS.response_cache and
|
|
392
|
+
cached_response = cache.cached(response)
|
|
393
|
+
then
|
|
394
|
+
cached_response.cached = true
|
|
395
|
+
cached_response
|
|
396
|
+
else
|
|
397
|
+
# process the http request
|
|
398
|
+
options[:async] ?
|
|
399
|
+
make_async_request(response) :
|
|
400
|
+
make_sync_request(response)
|
|
401
|
+
|
|
402
|
+
# process the http response
|
|
403
|
+
response.on_success do
|
|
404
|
+
send("process_#{name}_response", response)
|
|
405
|
+
if cache = AWS.response_cache
|
|
406
|
+
cache.add(response)
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
response
|
|
411
|
+
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
def cacheable_request? name, options
|
|
421
|
+
self.class::CACHEABLE_REQUESTS.include?(name)
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
def build_request(name, options, &block)
|
|
425
|
+
|
|
426
|
+
# we dont want to pass the async option to the configure block
|
|
427
|
+
opts = options.dup
|
|
428
|
+
opts.delete(:async)
|
|
429
|
+
|
|
430
|
+
http_request = new_request
|
|
431
|
+
|
|
432
|
+
# configure the http request
|
|
433
|
+
http_request.service_ruby_name = service_ruby_name
|
|
434
|
+
http_request.host = endpoint
|
|
435
|
+
http_request.port = port
|
|
436
|
+
http_request.region = config.send(:"#{service_ruby_name}_region")
|
|
437
|
+
http_request.proxy_uri = config.proxy_uri
|
|
438
|
+
http_request.use_ssl = config.use_ssl?
|
|
439
|
+
http_request.ssl_verify_peer = config.ssl_verify_peer?
|
|
440
|
+
http_request.ssl_ca_file = config.ssl_ca_file if config.ssl_ca_file
|
|
441
|
+
http_request.ssl_ca_path = config.ssl_ca_path if config.ssl_ca_path
|
|
442
|
+
|
|
443
|
+
send("configure_#{name}_request", http_request, opts, &block)
|
|
444
|
+
|
|
445
|
+
http_request.headers["user-agent"] = user_agent_string
|
|
446
|
+
http_request.add_authorization!(signer)
|
|
447
|
+
|
|
448
|
+
http_request
|
|
449
|
+
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def user_agent_string
|
|
453
|
+
engine = (RUBY_ENGINE rescue nil or "ruby")
|
|
454
|
+
user_agent = "%s aws-sdk-ruby/#{VERSION} %s/%s %s" %
|
|
455
|
+
[config.user_agent_prefix, engine, RUBY_VERSION, RUBY_PLATFORM]
|
|
456
|
+
user_agent.strip!
|
|
457
|
+
if AWS.memoizing?
|
|
458
|
+
user_agent << " memoizing"
|
|
459
|
+
end
|
|
460
|
+
user_agent
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
# Adds a single method to the current client class. This method
|
|
464
|
+
# yields a request method builder that allows you to specify how:
|
|
465
|
+
#
|
|
466
|
+
# * the request is built
|
|
467
|
+
# * the response is processed
|
|
468
|
+
# * the response is stubbed for testing
|
|
469
|
+
#
|
|
470
|
+
def self.add_client_request_method method_name, options = {}, &block
|
|
471
|
+
|
|
472
|
+
self.operations << method_name
|
|
473
|
+
|
|
474
|
+
ClientRequestMethodBuilder.new(self, method_name, &block)
|
|
475
|
+
|
|
476
|
+
module_eval <<-END
|
|
477
|
+
def #{method_name}(*args, &block)
|
|
478
|
+
options = args.first ? args.first : {}
|
|
479
|
+
client_request(#{method_name.inspect}, options, &block)
|
|
480
|
+
end
|
|
481
|
+
END
|
|
482
|
+
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
# Parses the service's API configuration yaml file. This file has
|
|
486
|
+
# configuration that drives the request and response DSLs.
|
|
487
|
+
# @return [Hash]
|
|
488
|
+
def self.api_config
|
|
489
|
+
config_file =
|
|
490
|
+
File.dirname(File.dirname(__FILE__)) +
|
|
491
|
+
"/api_config/#{service_name}-#{self::API_VERSION}.yml"
|
|
492
|
+
YAML.load(File.read(config_file))
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
# @return [Array<Symbol>] Returns a list of service operations as
|
|
496
|
+
# method names supported by this client.
|
|
497
|
+
def self.operations
|
|
498
|
+
@operations ||= []
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
# @private
|
|
502
|
+
class ClientRequestMethodBuilder
|
|
503
|
+
|
|
504
|
+
def initialize client_class, method_name, &block
|
|
505
|
+
@client_class = client_class
|
|
506
|
+
@method_name = method_name
|
|
507
|
+
configure_request {|request, options|}
|
|
508
|
+
process_response {|response|}
|
|
509
|
+
simulate_response {|response|}
|
|
510
|
+
instance_eval(&block)
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
def configure_request options = {}, &block
|
|
514
|
+
name = "configure_#{@method_name}_request"
|
|
515
|
+
MetaUtils.class_extend_method(@client_class, name, &block)
|
|
516
|
+
if block.arity == 3
|
|
517
|
+
m = Module.new
|
|
518
|
+
m.module_eval(<<-END)
|
|
519
|
+
def #{name}(req, options, &block)
|
|
520
|
+
super(req, options, block)
|
|
521
|
+
end
|
|
522
|
+
END
|
|
523
|
+
@client_class.send(:include, m)
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
def process_response &block
|
|
528
|
+
name = "process_#{@method_name}_response"
|
|
529
|
+
MetaUtils.class_extend_method(@client_class, name, &block)
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
def simulate_response &block
|
|
533
|
+
name = "simulate_#{@method_name}_response"
|
|
534
|
+
MetaUtils.class_extend_method(@client_class, name, &block)
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
end
|
|
540
|
+
end
|
|
541
|
+
end
|