fog 1.5.0 → 1.6.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/.travis.yml +21 -0
- data/README.md +3 -1
- data/Rakefile +4 -1
- data/changelog.txt +462 -0
- data/docs/storage/index.markdown +4 -4
- data/fog.gemspec +2 -2
- data/lib/fog.rb +1 -1
- data/lib/fog/atmos.rb +11 -0
- data/lib/fog/atmos/models/storage/directories.rb +48 -0
- data/lib/fog/atmos/models/storage/directory.rb +53 -0
- data/lib/fog/atmos/models/storage/file.rb +107 -0
- data/lib/fog/atmos/models/storage/files.rb +73 -0
- data/lib/fog/atmos/requests/storage/delete_namespace.rb +19 -0
- data/lib/fog/atmos/requests/storage/get_namespace.rb +20 -0
- data/lib/fog/atmos/requests/storage/head_namespace.rb +20 -0
- data/lib/fog/atmos/requests/storage/post_namespace.rb +20 -0
- data/lib/fog/atmos/requests/storage/put_namespace.rb +20 -0
- data/lib/fog/atmos/storage.rb +186 -0
- data/lib/fog/aws.rb +2 -0
- data/lib/fog/aws/auto_scaling.rb +15 -1
- data/lib/fog/aws/compute.rb +26 -17
- data/lib/fog/aws/elb.rb +14 -2
- data/lib/fog/aws/glacier.rb +172 -0
- data/lib/fog/aws/iam.rb +35 -29
- data/lib/fog/aws/models/auto_scaling/group.rb +1 -1
- data/lib/fog/aws/models/compute/flavors.rb +11 -0
- data/lib/fog/aws/models/compute/security_group.rb +22 -6
- data/lib/fog/aws/models/compute/server.rb +5 -1
- data/lib/fog/aws/models/compute/spot_request.rb +12 -0
- data/lib/fog/aws/models/compute/spot_requests.rb +1 -2
- data/lib/fog/aws/models/compute/volume.rb +7 -1
- data/lib/fog/aws/models/glacier/archive.rb +70 -0
- data/lib/fog/aws/models/glacier/archives.rb +30 -0
- data/lib/fog/aws/models/glacier/job.rb +65 -0
- data/lib/fog/aws/models/glacier/jobs.rb +45 -0
- data/lib/fog/aws/models/glacier/vault.rb +53 -0
- data/lib/fog/aws/models/glacier/vaults.rb +28 -0
- data/lib/fog/aws/models/rds/server.rb +3 -1
- data/lib/fog/aws/models/rds/snapshot.rb +1 -0
- data/lib/fog/aws/models/rds/snapshots.rb +3 -0
- data/lib/fog/aws/models/storage/file.rb +4 -3
- data/lib/fog/aws/parsers/auto_scaling/describe_auto_scaling_groups.rb +8 -1
- data/lib/fog/aws/parsers/compute/create_volume.rb +2 -2
- data/lib/fog/aws/parsers/compute/describe_instance_status.rb +8 -1
- data/lib/fog/aws/parsers/compute/describe_instances.rb +2 -0
- data/lib/fog/aws/parsers/compute/describe_reserved_instances_offerings.rb +1 -1
- data/lib/fog/aws/parsers/compute/describe_volumes.rb +2 -2
- data/lib/fog/aws/parsers/compute/run_instances.rb +2 -0
- data/lib/fog/aws/parsers/compute/spot_instance_requests.rb +1 -1
- data/lib/fog/aws/parsers/dns/list_resource_record_sets.rb +3 -1
- data/lib/fog/aws/parsers/rds/db_parser.rb +3 -1
- data/lib/fog/aws/parsers/rds/snapshot_parser.rb +1 -0
- data/lib/fog/aws/rds.rb +9 -9
- data/lib/fog/aws/requests/auto_scaling/create_auto_scaling_group.rb +1 -0
- data/lib/fog/aws/requests/auto_scaling/delete_auto_scaling_group.rb +1 -1
- data/lib/fog/aws/requests/compute/create_volume.rb +53 -14
- data/lib/fog/aws/requests/compute/describe_instance_status.rb +2 -0
- data/lib/fog/aws/requests/compute/describe_instances.rb +3 -1
- data/lib/fog/aws/requests/compute/describe_internet_gateways.rb +13 -7
- data/lib/fog/aws/requests/compute/describe_spot_instance_requests.rb +1 -0
- data/lib/fog/aws/requests/compute/describe_subnets.rb +13 -7
- data/lib/fog/aws/requests/compute/describe_volumes.rb +2 -0
- data/lib/fog/aws/requests/compute/describe_vpcs.rb +12 -6
- data/lib/fog/aws/requests/compute/request_spot_instances.rb +2 -0
- data/lib/fog/aws/requests/compute/run_instances.rb +8 -2
- data/lib/fog/aws/requests/dns/change_resource_record_sets.rb +20 -1
- data/lib/fog/aws/requests/elb/create_load_balancer.rb +2 -2
- data/lib/fog/aws/requests/elb/describe_load_balancers.rb +1 -1
- data/lib/fog/aws/requests/glacier/abort_multipart_upload.rb +35 -0
- data/lib/fog/aws/requests/glacier/complete_multipart_upload.rb +42 -0
- data/lib/fog/aws/requests/glacier/create_archive.rb +43 -0
- data/lib/fog/aws/requests/glacier/create_vault.rb +34 -0
- data/lib/fog/aws/requests/glacier/delete_archive.rb +35 -0
- data/lib/fog/aws/requests/glacier/delete_vault.rb +34 -0
- data/lib/fog/aws/requests/glacier/delete_vault_notification_configuration.rb +33 -0
- data/lib/fog/aws/requests/glacier/describe_job.rb +35 -0
- data/lib/fog/aws/requests/glacier/describe_vault.rb +34 -0
- data/lib/fog/aws/requests/glacier/get_job_output.rb +41 -0
- data/lib/fog/aws/requests/glacier/get_vault_notification_configuration.rb +34 -0
- data/lib/fog/aws/requests/glacier/initiate_job.rb +41 -0
- data/lib/fog/aws/requests/glacier/initiate_multipart_upload.rb +38 -0
- data/lib/fog/aws/requests/glacier/list_jobs.rb +39 -0
- data/lib/fog/aws/requests/glacier/list_multipart_uploads.rb +37 -0
- data/lib/fog/aws/requests/glacier/list_parts.rb +37 -0
- data/lib/fog/aws/requests/glacier/list_vaults.rb +36 -0
- data/lib/fog/aws/requests/glacier/set_vault_notification_configuration.rb +37 -0
- data/lib/fog/aws/requests/glacier/upload_part.rb +46 -0
- data/lib/fog/aws/requests/rds/create_db_instance.rb +7 -5
- data/lib/fog/aws/requests/rds/create_db_instance_read_replica.rb +41 -1
- data/lib/fog/aws/requests/rds/create_db_snapshot.rb +1 -1
- data/lib/fog/aws/requests/rds/describe_db_instances.rb +8 -10
- data/lib/fog/aws/requests/rds/describe_db_security_groups.rb +1 -1
- data/lib/fog/aws/requests/rds/describe_db_snapshots.rb +2 -0
- data/lib/fog/aws/requests/rds/modify_db_instance.rb +7 -6
- data/lib/fog/aws/requests/rds/reboot_db_instance.rb +6 -5
- data/lib/fog/aws/requests/storage/get_object.rb +45 -2
- data/lib/fog/aws/requests/storage/upload_part.rb +1 -0
- data/lib/fog/aws/signaturev4.rb +73 -0
- data/lib/fog/aws/sqs.rb +2 -6
- data/lib/fog/bare_metal_cloud/compute.rb +3 -1
- data/lib/fog/bare_metal_cloud/requests/compute/add_server_by_configuration.rb +33 -0
- data/lib/fog/bare_metal_cloud/requests/compute/get_server.rb +17 -12
- data/lib/fog/bare_metal_cloud/requests/compute/list_configurations.rb +27 -0
- data/lib/fog/bare_metal_cloud/requests/compute/list_images.rb +4 -4
- data/lib/fog/bare_metal_cloud/requests/compute/list_plans.rb +7 -7
- data/lib/fog/bare_metal_cloud/requests/compute/list_servers.rb +2 -2
- data/lib/fog/bin.rb +7 -0
- data/lib/fog/bin/atmos.rb +31 -0
- data/lib/fog/bin/aws.rb +4 -0
- data/lib/fog/bin/ecloud.rb +4 -0
- data/lib/fog/bin/rackspace.rb +7 -0
- data/lib/fog/bin/serverlove.rb +31 -0
- data/lib/fog/bluebox/requests/compute/create_block.rb +18 -4
- data/lib/fog/brightbox/compute.rb +52 -0
- data/lib/fog/brightbox/models/compute/cloud_ip.rb +2 -0
- data/lib/fog/brightbox/models/compute/image.rb +1 -0
- data/lib/fog/brightbox/models/compute/server.rb +46 -3
- data/lib/fog/brightbox/requests/compute/create_cloud_ip.rb +3 -3
- data/lib/fog/cloudstack/compute.rb +4 -1
- data/lib/fog/cloudstack/models/compute/images.rb +15 -6
- data/lib/fog/cloudstack/models/compute/job.rb +1 -1
- data/lib/fog/cloudstack/requests/compute/attach_volume.rb +1 -1
- data/lib/fog/cloudstack/requests/compute/register_template.rb +35 -0
- data/lib/fog/compute.rb +15 -3
- data/lib/fog/core/errors.rb +1 -0
- data/lib/fog/core/time.rb +4 -0
- data/lib/fog/dynect/dns.rb +5 -5
- data/lib/fog/ecloud.rb +6 -0
- data/lib/fog/ecloud/compute.rb +3 -1
- data/lib/fog/ecloud/models/compute/ip_addresses.rb +1 -0
- data/lib/fog/ecloud/models/compute/networks.rb +1 -0
- data/lib/fog/ecloud/models/compute/server.rb +31 -1
- data/lib/fog/ecloud/requests/compute/virtual_machine_add_ip.rb +40 -0
- data/lib/fog/ecloud/requests/compute/virtual_machine_upload_file.rb +31 -0
- data/lib/fog/google/models/storage/directory.rb +2 -2
- data/lib/fog/google/models/storage/file.rb +2 -2
- data/lib/fog/google/requests/storage/get_bucket.rb +1 -2
- data/lib/fog/google/requests/storage/put_object.rb +1 -2
- data/lib/fog/google/storage.rb +1 -1
- data/lib/fog/hp/models/compute/image.rb +1 -1
- data/lib/fog/hp/models/compute/server.rb +4 -0
- data/lib/fog/hp/requests/compute/delete_security_group_rule.rb +4 -4
- data/lib/fog/hp/requests/storage/get_object.rb +8 -2
- data/lib/fog/hp/storage.rb +1 -0
- data/lib/fog/libvirt/models/compute/server.rb +1 -1
- data/lib/fog/libvirt/models/compute/templates/server.xml.erb +1 -1
- data/lib/fog/openstack.rb +7 -0
- data/lib/fog/openstack/compute.rb +4 -1
- data/lib/fog/openstack/models/compute/server.rb +1 -1
- data/lib/fog/openstack/requests/compute/create_server.rb +8 -2
- data/lib/fog/openstack/requests/identity/list_roles_for_user_on_tenant.rb +1 -1
- data/lib/fog/openstack/requests/identity/list_tenants.rb +1 -0
- data/lib/fog/providers.rb +2 -0
- data/lib/fog/rackspace.rb +9 -7
- data/lib/fog/rackspace/block_storage.rb +114 -0
- data/lib/fog/rackspace/compute_v2.rb +123 -0
- data/lib/fog/rackspace/models/block_storage/snapshot.rb +46 -0
- data/lib/fog/rackspace/models/block_storage/snapshots.rb +25 -0
- data/lib/fog/rackspace/models/block_storage/volume.rb +58 -0
- data/lib/fog/rackspace/models/block_storage/volume_type.rb +14 -0
- data/lib/fog/rackspace/models/block_storage/volume_types.rb +25 -0
- data/lib/fog/rackspace/models/block_storage/volumes.rb +25 -0
- data/lib/fog/rackspace/models/compute_v2/attachment.rb +34 -0
- data/lib/fog/rackspace/models/compute_v2/attachments.rb +25 -0
- data/lib/fog/rackspace/models/compute_v2/flavor.rb +17 -0
- data/lib/fog/rackspace/models/compute_v2/flavors.rb +25 -0
- data/lib/fog/rackspace/models/compute_v2/image.rb +30 -0
- data/lib/fog/rackspace/models/compute_v2/images.rb +25 -0
- data/lib/fog/rackspace/models/compute_v2/server.rb +147 -0
- data/lib/fog/rackspace/models/compute_v2/servers.rb +25 -0
- data/lib/fog/rackspace/models/storage/directory.rb +3 -3
- data/lib/fog/rackspace/requests/block_storage/create_snapshot.rb +26 -0
- data/lib/fog/rackspace/requests/block_storage/create_volume.rb +27 -0
- data/lib/fog/rackspace/requests/block_storage/delete_snapshot.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/delete_volume.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/get_snapshot.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/get_volume.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/get_volume_type.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/list_snapshots.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/list_volume_types.rb +15 -0
- data/lib/fog/rackspace/requests/block_storage/list_volumes.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/attach_volume.rb +23 -0
- data/lib/fog/rackspace/requests/compute_v2/change_server_password.rb +22 -0
- data/lib/fog/rackspace/requests/compute_v2/confirm_resize_server.rb +20 -0
- data/lib/fog/rackspace/requests/compute_v2/create_server.rb +28 -0
- data/lib/fog/rackspace/requests/compute_v2/delete_attachment.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/delete_server.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/get_attachment.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/get_flavor.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/get_image.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/get_server.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/list_attachments.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/list_flavors.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/list_images.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/list_servers.rb +15 -0
- data/lib/fog/rackspace/requests/compute_v2/reboot_server.rb +22 -0
- data/lib/fog/rackspace/requests/compute_v2/rebuild_server.rb +22 -0
- data/lib/fog/rackspace/requests/compute_v2/resize_server.rb +22 -0
- data/lib/fog/rackspace/requests/compute_v2/revert_resize_server.rb +20 -0
- data/lib/fog/rackspace/requests/compute_v2/update_server.rb +22 -0
- data/lib/fog/rackspace/requests/storage/delete_object.rb +1 -1
- data/lib/fog/rackspace/requests/storage/get_object_https_url.rb +51 -0
- data/lib/fog/rackspace/requests/storage/post_set_meta_temp_url_key.rb +37 -0
- data/lib/fog/rackspace/storage.rb +4 -0
- data/lib/fog/serverlove.rb +10 -0
- data/lib/fog/serverlove/compute.rb +97 -0
- data/lib/fog/serverlove/models/compute/image.rb +57 -0
- data/lib/fog/serverlove/models/compute/images.rb +26 -0
- data/lib/fog/serverlove/models/compute/server.rb +72 -0
- data/lib/fog/serverlove/models/compute/servers.rb +26 -0
- data/lib/fog/serverlove/requests/compute/create_image.rb +32 -0
- data/lib/fog/serverlove/requests/compute/create_server.rb +34 -0
- data/lib/fog/serverlove/requests/compute/destroy_image.rb +13 -0
- data/lib/fog/serverlove/requests/compute/destroy_server.rb +13 -0
- data/lib/fog/serverlove/requests/compute/get_image.rb +13 -0
- data/lib/fog/serverlove/requests/compute/get_images.rb +13 -0
- data/lib/fog/serverlove/requests/compute/get_server.rb +13 -0
- data/lib/fog/serverlove/requests/compute/get_servers.rb +13 -0
- data/lib/fog/serverlove/requests/compute/load_standard_image.rb +13 -0
- data/lib/fog/serverlove/requests/compute/reset_server.rb +13 -0
- data/lib/fog/serverlove/requests/compute/shutdown_server.rb +13 -0
- data/lib/fog/serverlove/requests/compute/start_server.rb +13 -0
- data/lib/fog/serverlove/requests/compute/stop_server.rb +13 -0
- data/lib/fog/serverlove/requests/compute/update_image.rb +15 -0
- data/lib/fog/serverlove/requests/compute/update_server.rb +15 -0
- data/lib/fog/serverlove/util/compute/password_generator.rb +11 -0
- data/lib/fog/storage.rb +3 -0
- data/lib/fog/terremark/models/shared/image.rb +22 -0
- data/lib/fog/terremark/models/shared/images.rb +48 -0
- data/lib/fog/terremark/models/shared/internetservice.rb +67 -0
- data/lib/fog/terremark/models/shared/internetservices.rb +42 -0
- data/lib/fog/terremark/models/shared/nodeservice.rb +52 -0
- data/lib/fog/terremark/models/shared/nodeservices.rb +32 -0
- data/lib/fog/terremark/models/shared/server.rb +114 -15
- data/lib/fog/terremark/models/shared/servers.rb +7 -8
- data/lib/fog/terremark/models/shared/vdc.rb +6 -1
- data/lib/fog/terremark/parsers/shared/get_catalog.rb +7 -2
- data/lib/fog/terremark/parsers/shared/get_keys_list.rb +56 -0
- data/lib/fog/terremark/requests/shared/add_internet_service.rb +10 -9
- data/lib/fog/terremark/requests/shared/add_node_service.rb +10 -12
- data/lib/fog/terremark/requests/shared/configure_vapp.rb +61 -0
- data/lib/fog/terremark/requests/shared/create_internet_service.rb +16 -11
- data/lib/fog/terremark/requests/shared/delete_internet_service.rb +2 -1
- data/lib/fog/terremark/requests/shared/delete_node_service.rb +2 -1
- data/lib/fog/terremark/requests/shared/delete_public_ip.rb +2 -1
- data/lib/fog/terremark/requests/shared/get_internet_services.rb +2 -1
- data/lib/fog/terremark/requests/shared/get_keys_list.rb +36 -0
- data/lib/fog/terremark/requests/shared/get_node_services.rb +2 -1
- data/lib/fog/terremark/requests/shared/instantiate_vapp_template.rb +11 -1
- data/lib/fog/terremark/shared.rb +19 -1
- data/lib/fog/terremark/vcloud.rb +10 -1
- data/lib/fog/vcloud/compute.rb +13 -13
- data/lib/fog/vcloud/models/compute/catalog_items.rb +6 -2
- data/lib/fog/vcloud/models/compute/organizations.rb +1 -2
- data/lib/fog/vcloud/models/compute/server.rb +37 -3
- data/lib/fog/vcloud/models/compute/vapps.rb +1 -1
- data/lib/fog/vcloud/requests/compute/configure_org_network.rb +141 -0
- data/lib/fog/vcloud/requests/compute/configure_vm_cpus.rb +38 -0
- data/lib/fog/vcloud/requests/compute/configure_vm_memory.rb +11 -12
- data/lib/fog/vcloud/requests/compute/configure_vm_password.rb +39 -0
- data/lib/fog/vcloud/requests/compute/undeploy.rb +9 -1
- data/lib/fog/vsphere/requests/compute/vm_reboot.rb +1 -1
- data/tests/atmos/models/storage/file_update_tests.rb +19 -0
- data/tests/atmos/models/storage/nested_directories_tests.rb +23 -0
- data/tests/aws/models/compute/security_group_tests.rb +21 -12
- data/tests/aws/models/dns/records_tests.rb +8 -2
- data/tests/aws/models/glacier/model_tests.rb +47 -0
- data/tests/aws/models/iam/policies_tests.rb +2 -2
- data/tests/aws/models/rds/server_tests.rb +5 -2
- data/tests/aws/models/storage/directory_tests.rb +1 -1
- data/tests/aws/models/storage/file_tests.rb +1 -1
- data/tests/aws/models/storage/files_tests.rb +1 -1
- data/tests/aws/models/storage/url_tests.rb +8 -8
- data/tests/aws/models/storage/version_tests.rb +1 -1
- data/tests/aws/models/storage/versions_tests.rb +1 -1
- data/tests/aws/requests/auto_scaling/auto_scaling_tests.rb +5 -0
- data/tests/aws/requests/auto_scaling/helper.rb +2 -1
- data/tests/aws/requests/compute/instance_tests.rb +17 -23
- data/tests/aws/requests/compute/spot_instance_tests.rb +2 -1
- data/tests/aws/requests/compute/tag_tests.rb +1 -0
- data/tests/aws/requests/compute/volume_tests.rb +45 -4
- data/tests/aws/requests/elb/helper.rb +2 -2
- data/tests/aws/requests/elb/listener_tests.rb +2 -2
- data/tests/aws/requests/elb/load_balancer_tests.rb +1 -1
- data/tests/aws/requests/glacier/archive_tests.rb +13 -0
- data/tests/aws/requests/glacier/multipart_upload_tests.rb +30 -0
- data/tests/aws/requests/glacier/tree_hash_tests.rb +63 -0
- data/tests/aws/requests/glacier/vault_tests.rb +35 -0
- data/tests/aws/requests/rds/helper.rb +11 -5
- data/tests/aws/requests/rds/instance_tests.rb +0 -2
- data/tests/aws/requests/storage/acl_utils_tests.rb +1 -1
- data/tests/aws/requests/storage/bucket_tests.rb +1 -1
- data/tests/aws/requests/storage/multipart_upload_tests.rb +1 -1
- data/tests/aws/requests/storage/object_tests.rb +8 -0
- data/tests/aws/requests/storage/versioning_tests.rb +1 -1
- data/tests/aws/signaturev4_tests.rb +41 -0
- data/tests/brightbox/compute_tests.rb +9 -0
- data/tests/brightbox/requests/compute/helper.rb +21 -6
- data/tests/cloudstack/compute/models/volume_tests.rb +1 -1
- data/tests/cloudstack/requests/volume_tests.rb +1 -1
- data/tests/compute/helper.rb +10 -4
- data/tests/dynect/requests/dns/dns_tests.rb +39 -0
- data/tests/google/requests/storage/bucket_tests.rb +2 -3
- data/tests/google/requests/storage/object_tests.rb +1 -1
- data/tests/helper.rb +10 -3
- data/tests/helpers/formats_helper.rb +4 -2
- data/tests/helpers/formats_helper_tests.rb +9 -0
- data/tests/helpers/mock_helper.rb +6 -1
- data/tests/helpers/model_helper.rb +0 -3
- data/tests/hp/models/compute/address_tests.rb +1 -1
- data/tests/hp/models/compute/addresses_tests.rb +1 -1
- data/tests/hp/models/compute/key_pair_tests.rb +1 -1
- data/tests/hp/models/compute/key_pairs_tests.rb +1 -1
- data/tests/hp/models/compute/security_group_tests.rb +1 -1
- data/tests/hp/models/compute/security_groups_tests.rb +1 -1
- data/tests/hp/requests/cdn/container_tests.rb +1 -1
- data/tests/hp/requests/compute/address_tests.rb +1 -1
- data/tests/hp/requests/compute/flavor_tests.rb +1 -1
- data/tests/hp/requests/compute/image_tests.rb +1 -1
- data/tests/hp/requests/compute/key_pair_tests.rb +1 -1
- data/tests/hp/requests/compute/security_group_rule_tests.rb +1 -1
- data/tests/hp/requests/compute/security_group_tests.rb +1 -1
- data/tests/hp/requests/compute/server_address_tests.rb +1 -1
- data/tests/hp/requests/compute/server_tests.rb +1 -1
- data/tests/hp/requests/storage/container_tests.rb +1 -1
- data/tests/hp/requests/storage/object_tests.rb +1 -1
- data/tests/local/models/file_tests.rb +1 -1
- data/tests/rackspace/models/block_storage/snapshot_tests.rb +20 -0
- data/tests/rackspace/models/block_storage/snapshots_tests.rb +20 -0
- data/tests/rackspace/models/block_storage/volume_tests.rb +27 -0
- data/tests/rackspace/models/block_storage/volume_types_tests.rb +20 -0
- data/tests/rackspace/models/block_storage/volumes_tests.rb +11 -0
- data/tests/rackspace/models/compute_v2/flavors_tests.rb +20 -0
- data/tests/rackspace/models/compute_v2/images_tests.rb +22 -0
- data/tests/rackspace/models/compute_v2/server_tests.rb +62 -0
- data/tests/rackspace/models/compute_v2/servers_tests.rb +14 -0
- data/tests/rackspace/requests/block_storage/snapshot_tests.rb +81 -0
- data/tests/rackspace/requests/block_storage/volume_tests.rb +61 -0
- data/tests/rackspace/requests/block_storage/volume_type_tests.rb +31 -0
- data/tests/rackspace/requests/compute_v2/attachment_tests.rb +68 -0
- data/tests/rackspace/requests/compute_v2/flavor_tests.rb +43 -0
- data/tests/rackspace/requests/compute_v2/image_tests.rb +47 -0
- data/tests/rackspace/requests/compute_v2/server_tests.rb +147 -0
- data/tests/rackspace/requests/storage/account_tests.rb +17 -0
- data/tests/rackspace/requests/storage/container_tests.rb +1 -1
- data/tests/rackspace/requests/storage/large_object_tests.rb +1 -1
- data/tests/rackspace/requests/storage/object_tests.rb +41 -2
- data/tests/serverlove/requests/compute/image_tests.rb +57 -0
- data/tests/serverlove/requests/compute/server_tests.rb +85 -0
- data/tests/serverlove/util/compute/password_generator_tests.rb +19 -0
- data/tests/storage/models/directories_tests.rb +1 -1
- data/tests/storage/models/directory_test.rb +1 -1
- data/tests/storage/models/file_tests.rb +1 -1
- data/tests/storage/models/files_tests.rb +1 -1
- metadata +188 -3
@@ -0,0 +1,37 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class Glacier
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Set a vault's notification configuration
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * name<~String> Name of the vault
|
10
|
+
# * SnsTopic<~String> ARN of the topic to notify
|
11
|
+
# * events<~Array> Events you wish to receive. Valid events are ArchiveRetrievalCompleted, InventoryRetrievalCompleted
|
12
|
+
# * options<~Hash>
|
13
|
+
# * account_id<~String> - The AWS account id. Defaults to the account owning the credentials making the request
|
14
|
+
# ==== Returns
|
15
|
+
# * response<~Excon::Response>:
|
16
|
+
# * body<~Hash>:
|
17
|
+
#
|
18
|
+
# ==== See Also
|
19
|
+
# http://docs.amazonwebservices.com/amazonglacier/latest/dev/api-vault-notifications-put.html
|
20
|
+
#
|
21
|
+
def set_vault_notification_configuration(name,sns_topic, events, options={})
|
22
|
+
account_id = options['account_id'] || '-'
|
23
|
+
path = "/#{account_id}/vaults/#{Fog::AWS.escape(name)}/notification-configuration"
|
24
|
+
request(
|
25
|
+
:expects => 204,
|
26
|
+
:idempotent => true,
|
27
|
+
:headers => {},
|
28
|
+
:method => :put,
|
29
|
+
:path => path,
|
30
|
+
:body => Fog::JSON.encode('SNSTopic' => sns_topic, 'Events' => events)
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Fog
|
2
|
+
module AWS
|
3
|
+
class Glacier
|
4
|
+
class Real
|
5
|
+
|
6
|
+
# Upload an archive
|
7
|
+
#
|
8
|
+
# ==== Parameters
|
9
|
+
# * name<~String> Name of the vault to upload to
|
10
|
+
# * uploadId<~String> Id of the upload
|
11
|
+
# * body<~String> The data to upload
|
12
|
+
# * offset<~Integer> The offset of the data within the archive
|
13
|
+
# * hash<~String> The tree hash for this part
|
14
|
+
# * options<~Hash>
|
15
|
+
# * account_id<~String> - The AWS account id. Defaults to the account owning the credentials making the request
|
16
|
+
# ==== Returns
|
17
|
+
# * response<~Excon::Response>:
|
18
|
+
#
|
19
|
+
# ==== See Also
|
20
|
+
# http://docs.amazonwebservices.com/amazonglacier/latest/dev/api-upload-part.html
|
21
|
+
#
|
22
|
+
def upload_part(vault_name, upload_id, body, offset, hash, options={})
|
23
|
+
account_id = options['account_id'] || '-'
|
24
|
+
path = "/#{account_id}/vaults/#{Fog::AWS.escape(vault_name)}/multipart-uploads/#{Fog::AWS.escape(upload_id)}"
|
25
|
+
|
26
|
+
headers = {
|
27
|
+
'Content-Length' => body.bytesize.to_s,
|
28
|
+
'Content-Range' => "bytes #{offset}-#{offset+body.bytesize-1}/*",
|
29
|
+
'x-amz-content-sha256' => Digest::SHA256.hexdigest(body),
|
30
|
+
'x-amz-sha256-tree-hash' => hash
|
31
|
+
}
|
32
|
+
|
33
|
+
request(
|
34
|
+
:expects => 204,
|
35
|
+
:idempotent => true,
|
36
|
+
:headers => headers,
|
37
|
+
:method => :put,
|
38
|
+
:path => path,
|
39
|
+
:body => body
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -26,6 +26,7 @@ module Fog
|
|
26
26
|
# * Port <~Integer> The port number on which the database accepts connections.
|
27
27
|
# * PreferredBackupWindow <~String> The daily time range during which automated backups are created if automated backups are enabled
|
28
28
|
# * PreferredMaintenanceWindow <~String> The weekly time range (in UTC) during which system maintenance can occur, which may result in an outage
|
29
|
+
# * DBSubnetGroupName <~String> The name, if any, of the VPC subnet for this RDS instance
|
29
30
|
# ==== Returns
|
30
31
|
# * response<~Excon::Response>:
|
31
32
|
# * body<~Hash>:
|
@@ -80,19 +81,19 @@ module Fog
|
|
80
81
|
"InstanceCreateTime" => nil,
|
81
82
|
"AutoMinorVersionUpgrade"=>true,
|
82
83
|
"Endpoint"=>{},
|
83
|
-
"ReadReplicaDBInstanceIdentifiers"=>[
|
84
|
+
"ReadReplicaDBInstanceIdentifiers"=>[],
|
84
85
|
"PreferredMaintenanceWindow"=>"mon:04:30-mon:05:00",
|
85
86
|
"Engine"=> options["Engine"],
|
86
|
-
"EngineVersion"=> options["EngineVersion"] || "5.
|
87
|
+
"EngineVersion"=> options["EngineVersion"] || "5.5.12",
|
87
88
|
"PendingModifiedValues"=>{"MasterUserPassword"=>"****"}, # This clears when is available
|
88
|
-
"MultiAZ"=>
|
89
|
+
"MultiAZ"=> !!options['MultiAZ'],
|
89
90
|
"MasterUsername"=> options["MasterUsername"],
|
90
91
|
"DBInstanceClass"=> options["DBInstanceClass"],
|
91
92
|
"DBInstanceStatus"=>"creating",
|
92
93
|
"BackupRetentionPeriod"=> options["BackupRetentionPeriod"] || 1,
|
93
94
|
"AllocatedStorage"=> options["AllocatedStorage"],
|
94
95
|
"DBParameterGroups"=> # I think groups should be in the self.data method
|
95
|
-
[{"DBParameterGroupName"=>"default.mysql5.
|
96
|
+
[{"DBParameterGroupName"=>"default.mysql5.5",
|
96
97
|
"ParameterApplyStatus"=>"in-sync"}],
|
97
98
|
"DBSecurityGroups"=>
|
98
99
|
[{"Status"=>"active",
|
@@ -101,7 +102,8 @@ module Fog
|
|
101
102
|
"PreferredBackupWindow"=>"08:00-08:30",
|
102
103
|
# "ReadReplicaSourceDBInstanceIdentifier" => nil,
|
103
104
|
# "LatestRestorableTime" => nil,
|
104
|
-
"AvailabilityZone" => options["AvailabilityZone"]
|
105
|
+
"AvailabilityZone" => options["AvailabilityZone"],
|
106
|
+
"DBSubnetGroupName" => options["DBSubnetGroupName"]
|
105
107
|
}
|
106
108
|
|
107
109
|
|
@@ -33,7 +33,47 @@ module Fog
|
|
33
33
|
class Mock
|
34
34
|
|
35
35
|
def create_db_instance_read_replica(instance_identifier, source_identifier, options={})
|
36
|
-
|
36
|
+
# TODO: throw error when instance_identifier already exists,
|
37
|
+
# or source_identifier doesn't exist
|
38
|
+
|
39
|
+
source = self.data[:servers][source_identifier]
|
40
|
+
data = {
|
41
|
+
'AllocatedStorage' => source['AllocatedStorage'],
|
42
|
+
'AutoMinorVersionUpgrade' => options.key?('AutoMinorVersionUpgrade') ? options['AutoMinorVersionUpgrade'] : true,
|
43
|
+
'AvailabilityZone' => options['AvailabilityZone'],
|
44
|
+
'DBInstanceClass' => options['DBInstanceClass'] || 'db.m1.small',
|
45
|
+
'DBInstanceIdentifier' => instance_identifier,
|
46
|
+
'DBInstanceStatus' => 'creating',
|
47
|
+
'DBName' => source['DBName'],
|
48
|
+
'DBParameterGroups' => source['DBParameterGroups'],
|
49
|
+
'DBSecurityGroups' => source['DBSecurityGroups'],
|
50
|
+
'Endpoint' => {},
|
51
|
+
'Engine' => source['Engine'],
|
52
|
+
'EngineVersion' => options['EngineVersion'] || '5.5.12',
|
53
|
+
'InstanceCreateTime' => nil,
|
54
|
+
'LatestRestorableTime' => nil,
|
55
|
+
'LicenseModel' => 'general-public-license',
|
56
|
+
'MasterUsername' => source['MasterUsername'],
|
57
|
+
'MultiAZ' => false,
|
58
|
+
'PendingModifiedValues' => {},
|
59
|
+
'PreferredBackupWindow'=> '08:00-08:30',
|
60
|
+
'PreferredMaintenanceWindow'=> "mon:04:30-mon:05:00",
|
61
|
+
'ReadReplicaDBInstanceIdentifiers'=> [],
|
62
|
+
'ReadReplicaSourceDBInstanceIdentifier'=> source_identifier
|
63
|
+
}
|
64
|
+
self.data[:servers][instance_identifier] = data
|
65
|
+
self.data[:servers][source_identifier]['ReadReplicaDBInstanceIdentifiers'] << instance_identifier
|
66
|
+
|
67
|
+
response = Excon::Response.new
|
68
|
+
response.body = {
|
69
|
+
"ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id },
|
70
|
+
"CreateDBInstanceReadReplicaResult"=> {"DBInstance"=> data}
|
71
|
+
}
|
72
|
+
response.status = 200
|
73
|
+
# This values aren't showed at creating time but at available time
|
74
|
+
self.data[:servers][instance_identifier]["InstanceCreateTime"] = Time.now
|
75
|
+
|
76
|
+
response
|
37
77
|
end
|
38
78
|
|
39
79
|
end
|
@@ -41,7 +41,7 @@ module Fog
|
|
41
41
|
|
42
42
|
snapshot_data = {
|
43
43
|
'Status' => 'creating',
|
44
|
-
|
44
|
+
'SnapshotType' => 'manual',
|
45
45
|
'DBInstanceIdentifier' => identifier,
|
46
46
|
'DBSnapshotIdentifier' => name,
|
47
47
|
'InstanceCreateTime' => Time.now
|
@@ -51,25 +51,23 @@ module Fog
|
|
51
51
|
if Time.now - server['InstanceCreateTime'] >= Fog::Mock.delay * 2
|
52
52
|
region = "us-east-1"
|
53
53
|
server["DBInstanceStatus"] = "available"
|
54
|
-
server["AvailabilityZone"]
|
54
|
+
server["AvailabilityZone"] ||= region + 'a'
|
55
55
|
server["Endpoint"] = {"Port"=>3306,
|
56
56
|
"Address"=> Fog::AWS::Mock.rds_address(server["DBInstanceIdentifier"],region) }
|
57
57
|
server["PendingModifiedValues"] = {}
|
58
58
|
end
|
59
|
-
when "rebooting"
|
60
|
-
|
61
|
-
|
59
|
+
when "rebooting"
|
60
|
+
if Time.now - self.data[:reboot_time] >= Fog::Mock.delay
|
61
|
+
# apply pending modified values
|
62
62
|
server.merge!(server["PendingModifiedValues"])
|
63
63
|
server["PendingModifiedValues"] = {}
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
self.data.delete(:tmp)
|
68
|
-
end
|
64
|
+
|
65
|
+
server["DBInstanceStatus"] = 'available'
|
66
|
+
self.data.delete(:reboot_time)
|
69
67
|
end
|
70
68
|
when "modifying"
|
71
69
|
# TODO there are some fields that only applied after rebooting
|
72
|
-
|
70
|
+
if Time.now - self.data[:modify_time] >= Fog::Mock.delay
|
73
71
|
server.merge!(server["PendingModifiedValues"])
|
74
72
|
server["PendingModifiedValues"] = {}
|
75
73
|
server["DBInstanceStatus"] = 'available'
|
@@ -59,7 +59,7 @@ module Fog
|
|
59
59
|
# TODO: refactor to not delete items that we're iterating over. Causes
|
60
60
|
# model tests to fail (currently pending)
|
61
61
|
sec_group["EC2SecurityGroups"].each do |ec2_secg|
|
62
|
-
if ec2_secg["Status"] == "authorizing" ||
|
62
|
+
if ec2_secg["Status"] == "authorizing" || ec2_secg["Status"] == "revoking"
|
63
63
|
ec2_secg[:tmp] ||= Time.now + Fog::Mock.delay * 2
|
64
64
|
if ec2_secg[:tmp] <= Time.now
|
65
65
|
ec2_secg["Status"] = "authorized" if ec2_secg["Status"] == "authorizing"
|
@@ -10,6 +10,7 @@ module Fog
|
|
10
10
|
# ==== Parameters
|
11
11
|
# * DBInstanceIdentifier <~String> - ID of instance to retrieve information for. if absent information for all instances is returned
|
12
12
|
# * DBSnapshotIdentifier <~String> - ID of snapshot to retrieve information for. if absent information for all snapshots is returned
|
13
|
+
# * SnapshotType <~String> - type of snapshot to retrive (automated|manual)
|
13
14
|
# * Marker <~String> - An optional marker provided in the previous DescribeDBInstances request
|
14
15
|
# * MaxRecords <~Integer> - Max number of records to return (between 20 and 100)
|
15
16
|
# Only one of DBInstanceIdentifier or DBSnapshotIdentifier can be specified
|
@@ -18,6 +19,7 @@ module Fog
|
|
18
19
|
# * body<~Hash>:
|
19
20
|
def describe_db_snapshots(opts={})
|
20
21
|
params = {}
|
22
|
+
params['SnapshotType'] = opts[:type] if opts[:type]
|
21
23
|
params['DBInstanceIdentifier'] = opts[:identifier] if opts[:identifier]
|
22
24
|
params['DBSnapshotIdentifier'] = opts[:snapshot_id] if opts[:snapshot_id]
|
23
25
|
params['Marker'] = opts[:marker] if opts[:marker]
|
@@ -10,7 +10,7 @@ module Fog
|
|
10
10
|
# ==== Parameters
|
11
11
|
# * DBInstanceIdentifier <~String> - name of the db instance to modify
|
12
12
|
# * ApplyImmediately <~Boolean> - whether to apply the changes immediately or wait for the next maintenance window
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# * AllocatedStorage <~Integer> Storage space, in GB
|
15
15
|
# * AllowMajorVersionUpgrade <~Boolean> Must be set to true if EngineVersion specifies a different major version
|
16
16
|
# * AutoMinorVersionUpgrade <~Boolean> Indicates that minor version upgrades will be applied automatically to the DB Instance during the maintenance window
|
@@ -27,11 +27,11 @@ module Fog
|
|
27
27
|
# * response<~Excon::Response>:
|
28
28
|
# * body<~Hash>:
|
29
29
|
def modify_db_instance(db_name, apply_immediately, options={})
|
30
|
-
|
30
|
+
|
31
31
|
if security_groups = options.delete('DBSecurityGroups')
|
32
32
|
options.merge!(Fog::AWS.indexed_param('DBSecurityGroups.member.%d', [*security_groups]))
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
request({
|
36
36
|
'Action' => 'ModifyDBInstance',
|
37
37
|
'DBInstanceIdentifier' => db_name,
|
@@ -50,8 +50,9 @@ module Fog
|
|
50
50
|
if self.data[:servers][db_name]["DBInstanceStatus"] != "available"
|
51
51
|
raise Fog::AWS::RDS::NotFound.new("DBInstance #{db_name} not available for modification")
|
52
52
|
else
|
53
|
+
self.data[:modify_time] = Time.now
|
53
54
|
# TODO verify the params options
|
54
|
-
# if apply_immediately is false, all the options go to pending_modified_values and then apply and clear after either
|
55
|
+
# if apply_immediately is false, all the options go to pending_modified_values and then apply and clear after either
|
55
56
|
# a reboot or the maintainance window
|
56
57
|
#if apply_immediately
|
57
58
|
# modified_server = server.merge(options)
|
@@ -59,14 +60,14 @@ module Fog
|
|
59
60
|
# modified_server = server["PendingModifiedValues"].merge!(options) # it appends
|
60
61
|
#end
|
61
62
|
self.data[:servers][db_name]["PendingModifiedValues"].merge!(options) # it appends
|
62
|
-
|
63
|
+
self.data[:servers][db_name]["DBInstanceStatus"] = "modifying"
|
63
64
|
response.status = 200
|
64
65
|
response.body = {
|
65
66
|
"ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id },
|
66
67
|
"ModifyDBInstanceResult" => { "DBInstance" => self.data[:servers][db_name] }
|
67
68
|
}
|
68
69
|
response
|
69
|
-
|
70
|
+
|
70
71
|
end
|
71
72
|
else
|
72
73
|
raise Fog::AWS::RDS::NotFound.new("DBInstance #{db_name} not found")
|
@@ -26,18 +26,19 @@ module Fog
|
|
26
26
|
|
27
27
|
def reboot_db_instance(instance_identifier)
|
28
28
|
response = Excon::Response.new
|
29
|
-
if self.data[:servers][instance_identifier]
|
30
|
-
if
|
29
|
+
if server = self.data[:servers][instance_identifier]
|
30
|
+
if server["DBInstanceStatus"] != "available"
|
31
31
|
raise Fog::AWS::RDS::NotFound.new("DBInstance #{instance_identifier} not available for rebooting")
|
32
32
|
else
|
33
|
-
|
33
|
+
server["DBInstanceStatus"] = 'rebooting'
|
34
|
+
self.data[:reboot_time] = Time.now
|
34
35
|
response.status = 200
|
35
36
|
response.body = {
|
36
37
|
"ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id },
|
37
|
-
"RebootDBInstanceResult" => { "DBInstance" =>
|
38
|
+
"RebootDBInstanceResult" => { "DBInstance" => server }
|
38
39
|
}
|
39
40
|
response
|
40
|
-
|
41
|
+
|
41
42
|
end
|
42
43
|
else
|
43
44
|
raise Fog::AWS::RDS::NotFound.new("DBInstance #{instance_identifier} not found")
|
@@ -103,10 +103,20 @@ module Fog
|
|
103
103
|
|
104
104
|
response.headers['x-amz-version-id'] = object['VersionId'] if bucket[:versioning]
|
105
105
|
|
106
|
+
body = object[:body]
|
107
|
+
if options['Range']
|
108
|
+
# since AWS S3 itself does not support multiple range headers, we will use only the first
|
109
|
+
ranges = byte_ranges(options['Range'], body.size)
|
110
|
+
unless ranges.nil? || ranges.empty?
|
111
|
+
response.status = 206
|
112
|
+
body = body[ranges.first]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
106
116
|
unless block_given?
|
107
|
-
response.body =
|
117
|
+
response.body = body
|
108
118
|
else
|
109
|
-
data = StringIO.new(
|
119
|
+
data = StringIO.new(body)
|
110
120
|
remaining = data.length
|
111
121
|
while remaining > 0
|
112
122
|
chunk = data.read([remaining, Excon::CHUNK_SIZE].min)
|
@@ -142,6 +152,39 @@ module Fog
|
|
142
152
|
response
|
143
153
|
end
|
144
154
|
|
155
|
+
private
|
156
|
+
|
157
|
+
# === Borrowed from rack
|
158
|
+
# Parses the "Range:" header, if present, into an array of Range objects.
|
159
|
+
# Returns nil if the header is missing or syntactically invalid.
|
160
|
+
# Returns an empty array if none of the ranges are satisfiable.
|
161
|
+
def byte_ranges(http_range, size)
|
162
|
+
# See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35>
|
163
|
+
return nil unless http_range
|
164
|
+
ranges = []
|
165
|
+
http_range.split(/,\s*/).each do |range_spec|
|
166
|
+
matches = range_spec.match(/bytes=(\d*)-(\d*)/)
|
167
|
+
return nil unless matches
|
168
|
+
r0,r1 = matches[1], matches[2]
|
169
|
+
if r0.empty?
|
170
|
+
return nil if r1.empty?
|
171
|
+
# suffix-byte-range-spec, represents trailing suffix of file
|
172
|
+
r0 = [size - r1.to_i, 0].max
|
173
|
+
r1 = size - 1
|
174
|
+
else
|
175
|
+
r0 = r0.to_i
|
176
|
+
if r1.empty?
|
177
|
+
r1 = size - 1
|
178
|
+
else
|
179
|
+
r1 = r1.to_i
|
180
|
+
return nil if r1 < r0 # backwards range is syntactically invalid
|
181
|
+
r1 = size-1 if r1 >= size
|
182
|
+
end
|
183
|
+
end
|
184
|
+
ranges << (r0..r1) if r0 <= r1
|
185
|
+
end
|
186
|
+
ranges
|
187
|
+
end
|
145
188
|
end
|
146
189
|
end
|
147
190
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# See http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html
|
2
|
+
#
|
3
|
+
module Fog
|
4
|
+
module AWS
|
5
|
+
class SignatureV4
|
6
|
+
def initialize(aws_access_key_id, secret_key, region,service)
|
7
|
+
@region = region
|
8
|
+
@service = service
|
9
|
+
@aws_access_key_id = aws_access_key_id
|
10
|
+
@hmac = Fog::HMAC.new('sha256', 'AWS4' + secret_key)
|
11
|
+
end
|
12
|
+
|
13
|
+
def sign(params, date)
|
14
|
+
canonical_request = <<-DATA
|
15
|
+
#{params[:method].to_s.upcase}
|
16
|
+
#{params[:path]}
|
17
|
+
#{canonical_query_string(params[:query])}
|
18
|
+
#{canonical_headers(params[:headers])}
|
19
|
+
#{signed_headers(params[:headers])}
|
20
|
+
#{Digest::SHA256.hexdigest(params[:body] || '')}
|
21
|
+
DATA
|
22
|
+
canonical_request.chop!
|
23
|
+
credential_scope = "#{date.utc.strftime('%Y%m%d')}/#{@region}/#{@service}/aws4_request"
|
24
|
+
string_to_sign = <<-DATA
|
25
|
+
AWS4-HMAC-SHA256
|
26
|
+
#{date.to_iso8601_basic}
|
27
|
+
#{credential_scope}
|
28
|
+
#{Digest::SHA256.hexdigest(canonical_request)}
|
29
|
+
DATA
|
30
|
+
|
31
|
+
string_to_sign.chop!
|
32
|
+
|
33
|
+
signature = derived_hmac(date).sign(string_to_sign)
|
34
|
+
|
35
|
+
"AWS4-HMAC-SHA256 Credential=#{@aws_access_key_id}/#{credential_scope}, SignedHeaders=#{signed_headers(params[:headers])}, Signature=#{signature.unpack('H*').first}"
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def canonical_query_string(query)
|
41
|
+
canonical_query_string = []
|
42
|
+
for key in (query || {}).keys.sort_by {|k| k.to_s}
|
43
|
+
component = "#{Fog::AWS.escape(key.to_s)}=#{Fog::AWS.escape(query[key].to_s)}"
|
44
|
+
canonical_query_string << component
|
45
|
+
end
|
46
|
+
canonical_query_string.join("&")
|
47
|
+
end
|
48
|
+
|
49
|
+
def canonical_headers(headers)
|
50
|
+
canonical_headers = ''
|
51
|
+
|
52
|
+
for key in headers.keys.sort_by {|k| k.to_s}
|
53
|
+
canonical_headers << "#{key.to_s.downcase}:#{headers[key].to_s.strip}\n"
|
54
|
+
end
|
55
|
+
canonical_headers
|
56
|
+
end
|
57
|
+
|
58
|
+
def signed_headers(headers)
|
59
|
+
headers.keys.collect {|key| key.to_s}.sort.collect {|key| key.downcase}.join(';')
|
60
|
+
end
|
61
|
+
|
62
|
+
def derived_hmac(date)
|
63
|
+
kDate = @hmac.sign(date.utc.strftime('%Y%m%d'))
|
64
|
+
kRegion = Fog::HMAC.new('sha256', kDate).sign(@region)
|
65
|
+
kService = Fog::HMAC.new('sha256', kRegion).sign(@service)
|
66
|
+
kSigning = Fog::HMAC.new('sha256', kService).sign('aws4_request')
|
67
|
+
Fog::HMAC.new('sha256', kSigning)
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|