%% WARNING: DO NOT EDIT, AUTO-GENERATED CODE! %% See https://github.com/aws-beam/aws-codegen for more details. %% @doc Amazon S3 Glacier (Glacier) is a storage solution for "cold data." %% %% Glacier is an extremely low-cost storage service that provides secure, %% durable, and easy-to-use storage for data backup and archival. With %% Glacier, customers can store their data cost effectively for months, %% years, or decades. Glacier also enables customers to offload the %% administrative burdens of operating and scaling storage to AWS, so they %% don't have to worry about capacity planning, hardware provisioning, data %% replication, hardware failure and recovery, or time-consuming hardware %% migrations. %% %% Glacier is a great storage choice when low storage cost is paramount and %% your data is rarely retrieved. If your application requires fast or %% frequent access to your data, consider using Amazon S3. For more %% information, see Amazon Simple Storage %% Service (Amazon S3). %% %% You can store any kind of data in any format. There is no maximum limit on %% the total amount of data you can store in Glacier. %% %% If you are a first-time user of Glacier, we recommend that you begin by %% reading the following sections in the Amazon S3 Glacier Developer %% Guide: %% %% -module(aws_glacier). -export([abort_multipart_upload/5, abort_multipart_upload/6, abort_vault_lock/4, abort_vault_lock/5, add_tags_to_vault/4, add_tags_to_vault/5, complete_multipart_upload/5, complete_multipart_upload/6, complete_vault_lock/5, complete_vault_lock/6, create_vault/4, create_vault/5, delete_archive/5, delete_archive/6, delete_vault/4, delete_vault/5, delete_vault_access_policy/4, delete_vault_access_policy/5, delete_vault_notifications/4, delete_vault_notifications/5, describe_job/4, describe_job/5, describe_vault/3, describe_vault/4, get_data_retrieval_policy/2, get_data_retrieval_policy/3, get_job_output/5, get_job_output/6, get_vault_access_policy/3, get_vault_access_policy/4, get_vault_lock/3, get_vault_lock/4, get_vault_notifications/3, get_vault_notifications/4, initiate_job/4, initiate_job/5, initiate_multipart_upload/4, initiate_multipart_upload/5, initiate_vault_lock/4, initiate_vault_lock/5, list_jobs/3, list_jobs/4, list_multipart_uploads/3, list_multipart_uploads/4, list_parts/4, list_parts/5, list_provisioned_capacity/2, list_provisioned_capacity/3, list_tags_for_vault/3, list_tags_for_vault/4, list_vaults/2, list_vaults/3, purchase_provisioned_capacity/3, purchase_provisioned_capacity/4, remove_tags_from_vault/4, remove_tags_from_vault/5, set_data_retrieval_policy/3, set_data_retrieval_policy/4, set_vault_access_policy/4, set_vault_access_policy/5, set_vault_notifications/4, set_vault_notifications/5, upload_archive/4, upload_archive/5, upload_multipart_part/5, upload_multipart_part/6]). -include_lib("hackney/include/hackney_lib.hrl"). %%==================================================================== %% API %%==================================================================== %% @doc This operation aborts a multipart upload identified by the upload ID. %% %% After the Abort Multipart Upload request succeeds, you cannot upload any %% more parts to the multipart upload or complete the multipart upload. %% Aborting a completed upload fails. However, aborting an already-aborted %% upload will succeed, for a short time. For more information about %% uploading a part and completing a multipart upload, see %% UploadMultipartPart and CompleteMultipartUpload. %% %% This operation is idempotent. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Working %% with Archives in Amazon S3 Glacier and Abort %% Multipart Upload in the Amazon Glacier Developer Guide. abort_multipart_upload(Client, AccountId, UploadId, VaultName, Input) -> abort_multipart_upload(Client, AccountId, UploadId, VaultName, Input, []). abort_multipart_upload(Client, AccountId, UploadId, VaultName, Input0, Options) -> Method = delete, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/multipart-uploads/", http_uri:encode(UploadId), ""], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation aborts the vault locking process if the vault lock is %% not in the Locked state. If the vault lock is in the %% Locked state when this operation is requested, the operation %% returns an AccessDeniedException error. Aborting the vault %% locking process removes the vault lock policy from the specified vault. %% %% A vault lock is put into the InProgress state by calling %% InitiateVaultLock. A vault lock is put into the Locked %% state by calling CompleteVaultLock. You can get the state of a %% vault lock by calling GetVaultLock. For more information about the %% vault locking process, see Amazon %% Glacier Vault Lock. For more information about vault lock policies, %% see Amazon %% Glacier Access Control with Vault Lock Policies. %% %% This operation is idempotent. You can successfully invoke this operation %% multiple times, if the vault lock is in the InProgress state %% or if there is no policy associated with the vault. abort_vault_lock(Client, AccountId, VaultName, Input) -> abort_vault_lock(Client, AccountId, VaultName, Input, []). abort_vault_lock(Client, AccountId, VaultName, Input0, Options) -> Method = delete, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/lock-policy"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation adds the specified tags to a vault. Each tag is %% composed of a key and a value. Each vault can have up to 10 tags. If your %% request would cause the tag limit for the vault to be exceeded, the %% operation throws the LimitExceededException error. If a tag %% already exists on the vault under a specified key, the existing key value %% will be overwritten. For more information about tags, see Tagging %% Amazon S3 Glacier Resources. add_tags_to_vault(Client, AccountId, VaultName, Input) -> add_tags_to_vault(Client, AccountId, VaultName, Input, []). add_tags_to_vault(Client, AccountId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/tags?operation=add"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc You call this operation to inform Amazon S3 Glacier (Glacier) that %% all the archive parts have been uploaded and that Glacier can now assemble %% the archive from the uploaded parts. After assembling and saving the %% archive to the vault, Glacier returns the URI path of the newly created %% archive resource. Using the URI path, you can then access the archive. %% After you upload an archive, you should save the archive ID returned to %% retrieve the archive at a later point. You can also get the vault %% inventory to obtain a list of archive IDs in a vault. For more %% information, see InitiateJob. %% %% In the request, you must include the computed SHA256 tree hash of the %% entire archive you have uploaded. For information about computing a SHA256 %% tree hash, see Computing %% Checksums. On the server side, Glacier also constructs the SHA256 tree %% hash of the assembled archive. If the values match, Glacier saves the %% archive to the vault; otherwise, it returns an error, and the operation %% fails. The ListParts operation returns a list of parts uploaded for %% a specific multipart upload. It includes checksum information for each %% uploaded part that can be used to debug a bad checksum issue. %% %% Additionally, Glacier also checks for any missing content ranges when %% assembling the archive, if missing content ranges are found, Glacier %% returns an error and the operation fails. %% %% Complete Multipart Upload is an idempotent operation. After your first %% successful complete multipart upload, if you call the operation again %% within a short period, the operation will succeed and return the same %% archive ID. This is useful in the event you experience a network issue %% that causes an aborted connection or receive a 500 server error, in which %% case you can repeat your Complete Multipart Upload request and get the %% same archive ID without creating duplicate archives. Note, however, that %% after the multipart upload completes, you cannot call the List Parts %% operation and the multipart upload will not appear in List Multipart %% Uploads response, even if idempotent complete is possible. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Uploading %% Large Archives in Parts (Multipart Upload) and Complete %% Multipart Upload in the Amazon Glacier Developer Guide. complete_multipart_upload(Client, AccountId, UploadId, VaultName, Input) -> complete_multipart_upload(Client, AccountId, UploadId, VaultName, Input, []). complete_multipart_upload(Client, AccountId, UploadId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/multipart-uploads/", http_uri:encode(UploadId), ""], SuccessStatusCode = 201, HeadersMapping = [ {"x-amz-archive-size", "archiveSize"}, {"x-amz-sha256-tree-hash", "checksum"} ], {Headers, Input} = aws_request:build_headers(HeadersMapping, Input0), case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"x-amz-archive-id", "archiveId"}, {"x-amz-sha256-tree-hash", "checksum"}, {"Location", "location"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation completes the vault locking process by transitioning %% the vault lock from the InProgress state to the %% Locked state, which causes the vault lock policy to become %% unchangeable. A vault lock is put into the InProgress state %% by calling InitiateVaultLock. You can obtain the state of the vault %% lock by calling GetVaultLock. For more information about the vault %% locking process, Amazon %% Glacier Vault Lock. %% %% This operation is idempotent. This request is always successful if the %% vault lock is in the Locked state and the provided lock ID %% matches the lock ID originally used to lock the vault. %% %% If an invalid lock ID is passed in the request when the vault lock is in %% the Locked state, the operation returns an %% AccessDeniedException error. If an invalid lock ID is passed %% in the request when the vault lock is in the InProgress %% state, the operation throws an InvalidParameter error. complete_vault_lock(Client, AccountId, LockId, VaultName, Input) -> complete_vault_lock(Client, AccountId, LockId, VaultName, Input, []). complete_vault_lock(Client, AccountId, LockId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/lock-policy/", http_uri:encode(LockId), ""], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation creates a new vault with the specified name. The name %% of the vault must be unique within a region for an AWS account. You can %% create up to 1,000 vaults per account. If you need to create more vaults, %% contact Amazon S3 Glacier. %% %% You must use the following guidelines when naming a vault. %% %% This operation is idempotent. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Creating %% a Vault in Amazon Glacier and Create %% Vault in the Amazon Glacier Developer Guide. create_vault(Client, AccountId, VaultName, Input) -> create_vault(Client, AccountId, VaultName, Input, []). create_vault(Client, AccountId, VaultName, Input0, Options) -> Method = put, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), ""], SuccessStatusCode = 201, Headers = [], Input = Input0, case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"Location", "location"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation deletes an archive from a vault. Subsequent requests %% to initiate a retrieval of this archive will fail. Archive retrievals that %% are in progress for this archive ID may or may not succeed according to %% the following scenarios: %% %% This operation is idempotent. Attempting to delete an %% already-deleted archive does not result in an error. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Deleting %% an Archive in Amazon Glacier and Delete %% Archive in the Amazon Glacier Developer Guide. delete_archive(Client, AccountId, ArchiveId, VaultName, Input) -> delete_archive(Client, AccountId, ArchiveId, VaultName, Input, []). delete_archive(Client, AccountId, ArchiveId, VaultName, Input0, Options) -> Method = delete, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/archives/", http_uri:encode(ArchiveId), ""], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation deletes a vault. Amazon S3 Glacier will delete a vault %% only if there are no archives in the vault as of the last inventory and %% there have been no writes to the vault since the last inventory. If either %% of these conditions is not satisfied, the vault deletion fails (that is, %% the vault is not removed) and Amazon S3 Glacier returns an error. You can %% use DescribeVault to return the number of archives in a vault, and %% you can use Initiate %% a Job (POST jobs) to initiate a new inventory retrieval for a vault. %% The inventory contains the archive IDs you use to delete archives using Delete %% Archive (DELETE archive). %% %% This operation is idempotent. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Deleting %% a Vault in Amazon Glacier and Delete %% Vault in the Amazon S3 Glacier Developer Guide. delete_vault(Client, AccountId, VaultName, Input) -> delete_vault(Client, AccountId, VaultName, Input, []). delete_vault(Client, AccountId, VaultName, Input0, Options) -> Method = delete, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), ""], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation deletes the access policy associated with the %% specified vault. The operation is eventually consistent; that is, it might %% take some time for Amazon S3 Glacier to completely remove the access %% policy, and you might still see the effect of the policy for a short time %% after you send the delete request. %% %% This operation is idempotent. You can invoke delete multiple times, even %% if there is no policy associated with the vault. For more information %% about vault access policies, see Amazon %% Glacier Access Control with Vault Access Policies. delete_vault_access_policy(Client, AccountId, VaultName, Input) -> delete_vault_access_policy(Client, AccountId, VaultName, Input, []). delete_vault_access_policy(Client, AccountId, VaultName, Input0, Options) -> Method = delete, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/access-policy"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation deletes the notification configuration set for a %% vault. The operation is eventually consistent; that is, it might take some %% time for Amazon S3 Glacier to completely disable the notifications and you %% might still receive some notifications for a short time after you send the %% delete request. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Configuring %% Vault Notifications in Amazon S3 Glacier and Delete %% Vault Notification Configuration in the Amazon S3 Glacier Developer %% Guide. delete_vault_notifications(Client, AccountId, VaultName, Input) -> delete_vault_notifications(Client, AccountId, VaultName, Input, []). delete_vault_notifications(Client, AccountId, VaultName, Input0, Options) -> Method = delete, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/notification-configuration"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation returns information about a job you previously %% initiated, including the job initiation date, the user who initiated the %% job, the job status code/message and the Amazon SNS topic to notify after %% Amazon S3 Glacier (Glacier) completes the job. For more information about %% initiating a job, see InitiateJob. %% %% This operation enables you to check the status of your job. %% However, it is strongly recommended that you set up an Amazon SNS topic %% and specify it in your initiate job request so that Glacier can notify the %% topic after it completes the job. %% %% A job ID will not expire for at least 24 hours after Glacier %% completes the job. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For more information about using this operation, see the documentation for %% the underlying REST API Describe %% Job in the Amazon Glacier Developer Guide. describe_job(Client, AccountId, JobId, VaultName) when is_map(Client) -> describe_job(Client, AccountId, JobId, VaultName, []). describe_job(Client, AccountId, JobId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/jobs/", http_uri:encode(JobId), ""], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation returns information about a vault, including the %% vault's Amazon Resource Name (ARN), the date the vault was created, the %% number of archives it contains, and the total size of all the archives in %% the vault. The number of archives and their total size are as of the last %% inventory generation. This means that if you add or remove an archive from %% a vault, and then immediately use Describe Vault, the change in contents %% will not be immediately reflected. If you want to retrieve the latest %% inventory of the vault, use InitiateJob. Amazon S3 Glacier %% generates vault inventories approximately daily. For more information, see %% Downloading %% a Vault Inventory in Amazon S3 Glacier. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Retrieving %% Vault Metadata in Amazon S3 Glacier and Describe %% Vault in the Amazon Glacier Developer Guide. describe_vault(Client, AccountId, VaultName) when is_map(Client) -> describe_vault(Client, AccountId, VaultName, []). describe_vault(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), ""], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation returns the current data retrieval policy for the %% account and region specified in the GET request. For more information %% about data retrieval policies, see Amazon %% Glacier Data Retrieval Policies. get_data_retrieval_policy(Client, AccountId) when is_map(Client) -> get_data_retrieval_policy(Client, AccountId, []). get_data_retrieval_policy(Client, AccountId, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/policies/data-retrieval"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation downloads the output of the job you initiated using %% InitiateJob. Depending on the job type you specified when you %% initiated the job, the output will be either the content of an archive or %% a vault inventory. %% %% You can download all the job output or download a portion of the output by %% specifying a byte range. In the case of an archive retrieval job, %% depending on the byte range you specify, Amazon S3 Glacier (Glacier) %% returns the checksum for the portion of the data. You can compute the %% checksum on the client and verify that the values match to ensure the %% portion you downloaded is the correct data. %% %% A job ID will not expire for at least 24 hours after Glacier completes the %% job. That a byte range. For both archive and inventory retrieval jobs, you %% should verify the downloaded size against the size returned in the headers %% from the Get Job Output response. %% %% For archive retrieval jobs, you should also verify that the size is what %% you expected. If you download a portion of the output, the expected size %% is based on the range of bytes you specified. For example, if you specify %% a range of bytes=0-1048575, you should verify your download %% size is 1,048,576 bytes. If you download an entire archive, the expected %% size is the size of the archive when you uploaded it to Amazon S3 Glacier %% The expected size is also returned in the headers from the Get Job %% Output response. %% %% In the case of an archive retrieval job, depending on the byte range you %% specify, Glacier returns the checksum for the portion of the data. To %% ensure the portion you downloaded is the correct data, compute the %% checksum on the client, verify that the values match, and verify that the %% size is what you expected. %% %% A job ID does not expire for at least 24 hours after Glacier completes the %% job. That is, you can download the job output within the 24 hours period %% after Amazon Glacier completes the job. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and the underlying REST API, see Downloading %% a Vault Inventory, Downloading %% an Archive, and Get %% Job Output get_job_output(Client, AccountId, JobId, VaultName, Range) when is_map(Client) -> get_job_output(Client, AccountId, JobId, VaultName, Range, []). get_job_output(Client, AccountId, JobId, VaultName, Range, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/jobs/", http_uri:encode(JobId), "/output"], SuccessStatusCode = undefined, Headers0 = [ {"Range", Range} ], Headers = [H || {_, V} = H <- Headers0, V =/= undefined], case request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"Accept-Ranges", "acceptRanges"}, {"x-amz-archive-description", "archiveDescription"}, {"x-amz-sha256-tree-hash", "checksum"}, {"Content-Range", "contentRange"}, {"Content-Type", "contentType"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation retrieves the access-policy subresource %% set on the vault; for more information on setting this subresource, see Set %% Vault Access Policy (PUT access-policy). If there is no access policy %% set on the vault, the operation returns a 404 Not found %% error. For more information about vault access policies, see Amazon %% Glacier Access Control with Vault Access Policies. get_vault_access_policy(Client, AccountId, VaultName) when is_map(Client) -> get_vault_access_policy(Client, AccountId, VaultName, []). get_vault_access_policy(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/access-policy"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation retrieves the following attributes from the %% lock-policy subresource set on the specified vault: %% %% A vault lock is put into the InProgress state by %% calling InitiateVaultLock. A vault lock is put into the %% Locked state by calling CompleteVaultLock. You can %% abort the vault locking process by calling AbortVaultLock. For more %% information about the vault locking process, Amazon %% Glacier Vault Lock. %% %% If there is no vault lock policy set on the vault, the operation returns a %% 404 Not found error. For more information about vault lock %% policies, Amazon %% Glacier Access Control with Vault Lock Policies. get_vault_lock(Client, AccountId, VaultName) when is_map(Client) -> get_vault_lock(Client, AccountId, VaultName, []). get_vault_lock(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/lock-policy"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation retrieves the notification-configuration %% subresource of the specified vault. %% %% For information about setting a notification configuration on a vault, see %% SetVaultNotifications. If a notification configuration for a vault %% is not set, the operation returns a 404 Not Found error. For %% more information about vault notifications, see Configuring %% Vault Notifications in Amazon S3 Glacier. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Configuring %% Vault Notifications in Amazon S3 Glacier and Get %% Vault Notification Configuration in the Amazon Glacier Developer %% Guide. get_vault_notifications(Client, AccountId, VaultName) when is_map(Client) -> get_vault_notifications(Client, AccountId, VaultName, []). get_vault_notifications(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/notification-configuration"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation initiates a job of the specified type, which can be a %% select, an archival retrieval, or a vault retrieval. For more information %% about using this operation, see the documentation for the underlying REST %% API Initiate %% a Job. initiate_job(Client, AccountId, VaultName, Input) -> initiate_job(Client, AccountId, VaultName, Input, []). initiate_job(Client, AccountId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/jobs"], SuccessStatusCode = 202, Headers = [], Input = Input0, case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"x-amz-job-id", "jobId"}, {"x-amz-job-output-path", "jobOutputPath"}, {"Location", "location"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation initiates a multipart upload. Amazon S3 Glacier %% creates a multipart upload resource and returns its ID in the response. %% The multipart upload ID is used in subsequent requests to upload parts of %% an archive (see UploadMultipartPart). %% %% When you initiate a multipart upload, you specify the part size in number %% of bytes. The part size must be a megabyte (1024 KB) multiplied by a power %% of 2-for example, 1048576 (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 %% (8 MB), and so on. The minimum allowable part size is 1 MB, and the %% maximum is 4 GB. %% %% Every part you upload to this resource (see UploadMultipartPart), %% except the last one, must have the same size. The last one can be the same %% size or smaller. For example, suppose you want to upload a 16.2 MB file. %% If you initiate the multipart upload with a part size of 4 MB, you will %% upload four parts of 4 MB each and one part of 0.2 MB. %% %% You don't need to know the size of the archive when you start a %% multipart upload because Amazon S3 Glacier does not require you to specify %% the overall archive size. %% %% After you complete the multipart upload, Amazon S3 Glacier %% (Glacier) removes the multipart upload resource referenced by the ID. %% Glacier also removes the multipart upload resource if you cancel the %% multipart upload or it may be removed if there is no activity for a period %% of 24 hours. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Uploading %% Large Archives in Parts (Multipart Upload) and Initiate %% Multipart Upload in the Amazon Glacier Developer Guide. initiate_multipart_upload(Client, AccountId, VaultName, Input) -> initiate_multipart_upload(Client, AccountId, VaultName, Input, []). initiate_multipart_upload(Client, AccountId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/multipart-uploads"], SuccessStatusCode = 201, HeadersMapping = [ {"x-amz-archive-description", "archiveDescription"}, {"x-amz-part-size", "partSize"} ], {Headers, Input} = aws_request:build_headers(HeadersMapping, Input0), case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"Location", "location"}, {"x-amz-multipart-upload-id", "uploadId"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation initiates the vault locking process by doing the %% following: %% %% You can set one vault lock policy for each vault and this %% policy can be up to 20 KB in size. For more information about vault lock %% policies, see Amazon %% Glacier Access Control with Vault Lock Policies. %% %% You must complete the vault locking process within 24 hours after the %% vault lock enters the InProgress state. After the 24 hour %% window ends, the lock ID expires, the vault automatically exits the %% InProgress state, and the vault lock policy is removed from %% the vault. You call CompleteVaultLock to complete the vault locking %% process by setting the state of the vault lock to Locked. %% %% After a vault lock is in the Locked state, you cannot %% initiate a new vault lock for the vault. %% %% You can abort the vault locking process by calling AbortVaultLock. %% You can get the state of the vault lock by calling GetVaultLock. %% For more information about the vault locking process, Amazon %% Glacier Vault Lock. %% %% If this operation is called when the vault lock is in the %% InProgress state, the operation returns an %% AccessDeniedException error. When the vault lock is in the %% InProgress state you must call AbortVaultLock before %% you can initiate a new vault lock policy. initiate_vault_lock(Client, AccountId, VaultName, Input) -> initiate_vault_lock(Client, AccountId, VaultName, Input, []). initiate_vault_lock(Client, AccountId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/lock-policy"], SuccessStatusCode = 201, Headers = [], Input = Input0, case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"x-amz-lock-id", "lockId"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation lists jobs for a vault, including jobs that are %% in-progress and jobs that have recently finished. The List Job operation %% returns a list of these jobs sorted by job initiation time. %% %% Amazon Glacier retains recently completed jobs for a period before %% deleting them; however, it eventually removes completed jobs. The output %% of completed jobs can be retrieved. Retaining completed jobs for a period %% of time after they have completed enables you to get a job output in the %% event you miss the job completion notification or your first attempt to %% download it fails. For example, suppose you start an archive retrieval job %% to download an archive. After the job completes, you start to download the %% archive but encounter a network error. In this scenario, you can retry and %% download the archive while the job exists. %% %% The List Jobs operation supports pagination. You should always %% check the response Marker field. If there are no more jobs to %% list, the Marker field is set to null. If there %% are more jobs to list, the Marker field is set to a non-null %% value, which you can use to continue the pagination of the list. To return %% a list of jobs that begins at a specific job, set the marker request %% parameter to the Marker value for that job that you obtained %% from a previous List Jobs request. %% %% You can set a maximum limit for the number of jobs returned in the %% response by specifying the limit parameter in the request. %% The default limit is 50. The number of jobs returned might be fewer than %% the limit, but the number of returned jobs never exceeds the limit. %% %% Additionally, you can filter the jobs list returned by specifying the %% optional statuscode parameter or completed %% parameter, or both. Using the statuscode parameter, you can %% specify to return only jobs that match either the InProgress, %% Succeeded, or Failed status. Using the %% completed parameter, you can specify to return only jobs that %% were completed (true) or jobs that were not completed %% (false). %% %% For more information about using this operation, see the documentation for %% the underlying REST API List %% Jobs. list_jobs(Client, AccountId, VaultName) when is_map(Client) -> list_jobs(Client, AccountId, VaultName, []). list_jobs(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/jobs"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation lists in-progress multipart uploads for the specified %% vault. An in-progress multipart upload is a multipart upload that has been %% initiated by an InitiateMultipartUpload request, but has not yet %% been completed or aborted. The list returned in the List Multipart Upload %% response has no guaranteed order. %% %% The List Multipart Uploads operation supports pagination. By default, this %% operation returns up to 50 multipart uploads in the response. You should %% always check the response for a marker at which to continue %% the list; if there are no more items the marker is %% null. To return a list of multipart uploads that begins at a %% specific upload, set the marker request parameter to the %% value you obtained from a previous List Multipart Upload request. You can %% also limit the number of uploads returned in the response by specifying %% the limit parameter in the request. %% %% Note the difference between this operation and listing parts %% (ListParts). The List Multipart Uploads operation lists all %% multipart uploads for a vault and does not require a multipart upload ID. %% The List Parts operation requires a multipart upload ID since parts are %% associated with a single upload. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and the underlying REST API, see Working %% with Archives in Amazon S3 Glacier and List %% Multipart Uploads in the Amazon Glacier Developer Guide. list_multipart_uploads(Client, AccountId, VaultName) when is_map(Client) -> list_multipart_uploads(Client, AccountId, VaultName, []). list_multipart_uploads(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/multipart-uploads"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation lists the parts of an archive that have been uploaded %% in a specific multipart upload. You can make this request at any time %% during an in-progress multipart upload before you complete the upload (see %% CompleteMultipartUpload. List Parts returns an error for completed %% uploads. The list returned in the List Parts response is sorted by part %% range. %% %% The List Parts operation supports pagination. By default, this operation %% returns up to 50 uploaded parts in the response. You should always check %% the response for a marker at which to continue the list; if %% there are no more items the marker is null. To %% return a list of parts that begins at a specific part, set the %% marker request parameter to the value you obtained from a %% previous List Parts request. You can also limit the number of parts %% returned in the response by specifying the limit parameter in %% the request. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and the underlying REST API, see Working %% with Archives in Amazon S3 Glacier and List %% Parts in the Amazon Glacier Developer Guide. list_parts(Client, AccountId, UploadId, VaultName) when is_map(Client) -> list_parts(Client, AccountId, UploadId, VaultName, []). list_parts(Client, AccountId, UploadId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/multipart-uploads/", http_uri:encode(UploadId), ""], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation lists the provisioned capacity units for the specified %% AWS account. list_provisioned_capacity(Client, AccountId) when is_map(Client) -> list_provisioned_capacity(Client, AccountId, []). list_provisioned_capacity(Client, AccountId, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/provisioned-capacity"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation lists all the tags attached to a vault. The operation %% returns an empty map if there are no tags. For more information about %% tags, see Tagging %% Amazon S3 Glacier Resources. list_tags_for_vault(Client, AccountId, VaultName) when is_map(Client) -> list_tags_for_vault(Client, AccountId, VaultName, []). list_tags_for_vault(Client, AccountId, VaultName, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/tags"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation lists all vaults owned by the calling user's account. %% The list returned in the response is ASCII-sorted by vault name. %% %% By default, this operation returns up to 10 items. If there are more %% vaults to list, the response marker field contains the vault %% Amazon Resource Name (ARN) at which to continue the list with a new List %% Vaults request; otherwise, the marker field is %% null. To return a list of vaults that begins at a specific %% vault, set the marker request parameter to the vault ARN you %% obtained from a previous List Vaults request. You can also limit the %% number of vaults returned in the response by specifying the %% limit parameter in the request. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Retrieving %% Vault Metadata in Amazon S3 Glacier and List %% Vaults in the Amazon Glacier Developer Guide. list_vaults(Client, AccountId) when is_map(Client) -> list_vaults(Client, AccountId, []). list_vaults(Client, AccountId, Options) when is_map(Client), is_list(Options) -> Path = ["/", http_uri:encode(AccountId), "/vaults"], SuccessStatusCode = undefined, Headers = [], request(Client, get, Path, Headers, undefined, Options, SuccessStatusCode). %% @doc This operation purchases a provisioned capacity unit for an AWS %% account. purchase_provisioned_capacity(Client, AccountId, Input) -> purchase_provisioned_capacity(Client, AccountId, Input, []). purchase_provisioned_capacity(Client, AccountId, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/provisioned-capacity"], SuccessStatusCode = 201, Headers = [], Input = Input0, case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"x-amz-capacity-id", "capacityId"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation removes one or more tags from the set of tags attached %% to a vault. For more information about tags, see Tagging %% Amazon S3 Glacier Resources. This operation is idempotent. The %% operation will be successful, even if there are no tags attached to the %% vault. remove_tags_from_vault(Client, AccountId, VaultName, Input) -> remove_tags_from_vault(Client, AccountId, VaultName, Input, []). remove_tags_from_vault(Client, AccountId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/tags?operation=remove"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation sets and then enacts a data retrieval policy in the %% region specified in the PUT request. You can set one policy per region for %% an AWS account. The policy is enacted within a few minutes of a successful %% PUT operation. %% %% The set policy operation does not affect retrieval jobs that were in %% progress before the policy was enacted. For more information about data %% retrieval policies, see Amazon %% Glacier Data Retrieval Policies. set_data_retrieval_policy(Client, AccountId, Input) -> set_data_retrieval_policy(Client, AccountId, Input, []). set_data_retrieval_policy(Client, AccountId, Input0, Options) -> Method = put, Path = ["/", http_uri:encode(AccountId), "/policies/data-retrieval"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation configures an access policy for a vault and will %% overwrite an existing policy. To configure a vault access policy, send a %% PUT request to the access-policy subresource of the vault. An %% access policy is specific to a vault and is also called a vault %% subresource. You can set one access policy per vault and the policy can be %% up to 20 KB in size. For more information about vault access policies, see %% Amazon %% Glacier Access Control with Vault Access Policies. set_vault_access_policy(Client, AccountId, VaultName, Input) -> set_vault_access_policy(Client, AccountId, VaultName, Input, []). set_vault_access_policy(Client, AccountId, VaultName, Input0, Options) -> Method = put, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/access-policy"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation configures notifications that will be sent when %% specific events happen to a vault. By default, you don't get any %% notifications. %% %% To configure vault notifications, send a PUT request to the %% notification-configuration subresource of the vault. The %% request should include a JSON document that provides an Amazon SNS topic %% and specific events for which you want Amazon S3 Glacier to send %% notifications to the topic. %% %% Amazon SNS topics must grant permission to the vault to be allowed to %% publish notifications to the topic. You can configure a vault to publish a %% notification for the following vault events: %% %% An AWS account has full permission to perform all operations %% (actions). However, AWS Identity and Access Management (IAM) users don't %% have any permissions by default. You must grant them explicit permission %% to perform specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Configuring %% Vault Notifications in Amazon S3 Glacier and Set %% Vault Notification Configuration in the Amazon Glacier Developer %% Guide. set_vault_notifications(Client, AccountId, VaultName, Input) -> set_vault_notifications(Client, AccountId, VaultName, Input, []). set_vault_notifications(Client, AccountId, VaultName, Input0, Options) -> Method = put, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/notification-configuration"], SuccessStatusCode = 204, Headers = [], Input = Input0, request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode). %% @doc This operation adds an archive to a vault. This is a synchronous %% operation, and for a successful upload, your data is durably persisted. %% Amazon S3 Glacier returns the archive ID in the %% x-amz-archive-id header of the response. %% %% You must use the archive ID to access your data in Amazon S3 Glacier. %% After you upload an archive, you should save the archive ID returned so %% that you can retrieve or delete the archive later. Besides saving the %% archive ID, you can also index it and give it a friendly name to allow for %% better searching. You can also use the optional archive description field %% to specify how the archive is referred to in an external index of %% archives, such as you might create in Amazon DynamoDB. You can also get %% the vault inventory to obtain a list of archive IDs in a vault. For more %% information, see InitiateJob. %% %% You must provide a SHA256 tree hash of the data you are uploading. For %% information about computing a SHA256 tree hash, see Computing %% Checksums. %% %% You can optionally specify an archive description of up to 1,024 printable %% ASCII characters. You can get the archive description when you either %% retrieve the archive or get the vault inventory. For more information, see %% InitiateJob. Amazon Glacier does not interpret the description in %% any way. An archive description does not need to be unique. You cannot use %% the description to retrieve or sort the archive list. %% %% Archives are immutable. After you upload an archive, you cannot edit the %% archive or its description. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Uploading %% an Archive in Amazon Glacier and Upload %% Archive in the Amazon Glacier Developer Guide. upload_archive(Client, AccountId, VaultName, Input) -> upload_archive(Client, AccountId, VaultName, Input, []). upload_archive(Client, AccountId, VaultName, Input0, Options) -> Method = post, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/archives"], SuccessStatusCode = 201, HeadersMapping = [ {"x-amz-archive-description", "archiveDescription"}, {"x-amz-sha256-tree-hash", "checksum"} ], {Headers, Input} = aws_request:build_headers(HeadersMapping, Input0), case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"x-amz-archive-id", "archiveId"}, {"x-amz-sha256-tree-hash", "checksum"}, {"Location", "location"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %% @doc This operation uploads a part of an archive. You can upload archive %% parts in any order. You can also upload them in parallel. You can upload %% up to 10,000 parts for a multipart upload. %% %% Amazon Glacier rejects your upload part request if any of the following %% conditions is true: %% %% This operation is idempotent. If you upload the same part %% multiple times, the data included in the most recent request overwrites %% the previously uploaded data. %% %% An AWS account has full permission to perform all operations (actions). %% However, AWS Identity and Access Management (IAM) users don't have any %% permissions by default. You must grant them explicit permission to perform %% specific actions. For more information, see Access %% Control Using AWS Identity and Access Management (IAM). %% %% For conceptual information and underlying REST API, see Uploading %% Large Archives in Parts (Multipart Upload) and Upload %% Part in the Amazon Glacier Developer Guide. upload_multipart_part(Client, AccountId, UploadId, VaultName, Input) -> upload_multipart_part(Client, AccountId, UploadId, VaultName, Input, []). upload_multipart_part(Client, AccountId, UploadId, VaultName, Input0, Options) -> Method = put, Path = ["/", http_uri:encode(AccountId), "/vaults/", http_uri:encode(VaultName), "/multipart-uploads/", http_uri:encode(UploadId), ""], SuccessStatusCode = 204, HeadersMapping = [ {"x-amz-sha256-tree-hash", "checksum"}, {"Content-Range", "range"} ], {Headers, Input} = aws_request:build_headers(HeadersMapping, Input0), case request(Client, Method, Path, Headers, Input, Options, SuccessStatusCode) of {ok, Body0, {_, ResponseHeaders, _} = Response} -> ResponseHeadersParams = [ {"x-amz-sha256-tree-hash", "checksum"} ], FoldFun = fun({Name, Key}, Acc) -> case lists:keyfind(Name, 1, ResponseHeaders) of false -> Acc; {_, Value} -> Acc#{Key => Value} end end, Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams), {ok, Body, Response}; Result -> Result end. %%==================================================================== %% Internal functions %%==================================================================== -spec request(aws_client:aws_client(), atom(), iolist(), list(), map() | undefined, list(), pos_integer() | undefined) -> {ok, Result, {integer(), list(), hackney:client()}} | {error, Error, {integer(), list(), hackney:client()}} | {error, term()} when Result :: map() | undefined, Error :: {binary(), binary()}. request(Client, Method, Path, Headers0, Input, Options, SuccessStatusCode) -> Client1 = Client#{service => <<"glacier">>}, Host = get_host(<<"glacier">>, Client1), URL = get_url(Host, Path, Client1), Headers1 = [ {<<"Host">>, Host}, {<<"Content-Type">>, <<"application/x-amz-json-1.1">>} | Headers0 ], Payload = encode_payload(Input), MethodBin = aws_request:method_to_binary(Method), SignedHeaders = aws_request:sign_request(Client1, MethodBin, URL, Headers1, Payload), Response = hackney:request(Method, URL, SignedHeaders, Payload, Options), handle_response(Response, SuccessStatusCode). handle_response({ok, StatusCode, ResponseHeaders, Client}, SuccessStatusCode) when StatusCode =:= 200; StatusCode =:= 202; StatusCode =:= 204; StatusCode =:= SuccessStatusCode -> case hackney:body(Client) of {ok, <<>>} when StatusCode =:= 200; StatusCode =:= SuccessStatusCode -> {ok, undefined, {StatusCode, ResponseHeaders, Client}}; {ok, Body} -> Result = jsx:decode(Body, [return_maps]), {ok, Result, {StatusCode, ResponseHeaders, Client}} end; handle_response({ok, StatusCode, ResponseHeaders, Client}, _) -> {ok, Body} = hackney:body(Client), Error = jsx:decode(Body, [return_maps]), Reason1 = maps:get(<<"message">>, Error, undefined), Reason2 = maps:get(<<"Message">>, Error, Reason1), {error, Reason2, {StatusCode, ResponseHeaders, Client}}; handle_response({error, Reason}, _) -> {error, Reason}. get_host(_EndpointPrefix, #{region := <<"local">>}) -> <<"localhost">>; get_host(EndpointPrefix, #{region := Region, endpoint := Endpoint}) -> aws_util:binary_join([EndpointPrefix, <<".">>, Region, <<".">>, Endpoint], <<"">>). get_url(Host, Path0, Client) -> Proto = maps:get(proto, Client), Path = erlang:iolist_to_binary(Path0), Port = maps:get(port, Client), aws_util:binary_join([Proto, <<"://">>, Host, <<":">>, Port, Path], <<"">>). -spec encode_payload(undefined | map()) -> binary(). encode_payload(undefined) -> <<>>; encode_payload(Input) -> jsx:encode(Input).