diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client.py index 226626d026e1..91205c8f3fdb 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client.py @@ -26,6 +26,7 @@ import six from azure.core import Configuration +from azure.core.exceptions import HttpResponseError from azure.core.pipeline import Pipeline from azure.core.pipeline.transport import RequestsTransport from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy @@ -46,6 +47,8 @@ QueueMessagePolicy, ExponentialRetry, ) +from .._generated.models import StorageErrorException +from .response_handlers import process_storage_error _LOGGER = logging.getLogger(__name__) @@ -147,11 +150,11 @@ def _format_query_string(self, sas_token, credential, snapshot=None, share_snaps def _create_pipeline(self, credential, **kwargs): # type: (Any, **Any) -> Tuple[Configuration, Pipeline] - credential_policy = None + self._credential_policy = None if hasattr(credential, "get_token"): - credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + self._credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) elif isinstance(credential, SharedKeyCredentialPolicy): - credential_policy = credential + self._credential_policy = credential elif credential is not None: raise TypeError("Unsupported credential: {}".format(credential)) @@ -169,7 +172,7 @@ def _create_pipeline(self, credential, **kwargs): config.user_agent_policy, StorageContentValidation(), StorageRequestHook(**kwargs), - credential_policy, + self._credential_policy, ContentDecodePolicy(), RedirectPolicy(**kwargs), StorageHosts(hosts=self._hosts, **kwargs), @@ -180,6 +183,39 @@ def _create_pipeline(self, credential, **kwargs): ] return config, Pipeline(config.transport, policies=policies) + def _batch_send( + self, *reqs, # type: HttpRequest + **kwargs + ): + """Given a series of request, do a Storage batch call. + """ + request = self._client._client.post( # pylint: disable=protected-access + url='https://{}/?comp=batch'.format(self.primary_hostname), + headers={ + 'x-ms-version': self._client._config.version # pylint: disable=protected-access + } + ) + + request.set_multipart_mixed( + *reqs, + policies=[ + StorageHeadersPolicy(), + self._credential_policy + ] + ) + + pipeline_response = self._pipeline.run( + request, **kwargs + ) + response = pipeline_response.http_response + + try: + if response.status_code not in [202]: + raise HttpResponseError(response=response) + return response.parts() + except StorageErrorException as error: + process_storage_error(error) + def format_shared_key_credential(account, credential): if isinstance(credential, six.string_types): diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client_async.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client_async.py index d2f21e4f30fe..e76fad464878 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client_async.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_shared/base_client_async.py @@ -11,7 +11,7 @@ import logging from azure.core.pipeline import AsyncPipeline - +from azure.core.exceptions import HttpResponseError from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy from azure.core.pipeline.policies import ( ContentDecodePolicy, @@ -25,11 +25,16 @@ StorageContentValidation, StorageRequestHook, StorageHosts, + StorageHeadersPolicy, QueueMessagePolicy) from .policies_async import AsyncStorageResponseHook +from .._generated.models import StorageErrorException +from .response_handlers import process_storage_error + if TYPE_CHECKING: from azure.core.pipeline import Pipeline + from azure.core.pipeline.transport import HttpRequest from azure.core import Configuration _LOGGER = logging.getLogger(__name__) @@ -51,11 +56,11 @@ async def __aexit__(self, *args): def _create_pipeline(self, credential, **kwargs): # type: (Any, **Any) -> Tuple[Configuration, Pipeline] - credential_policy = None + self._credential_policy = None if hasattr(credential, 'get_token'): - credential_policy = AsyncBearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + self._credential_policy = AsyncBearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) elif isinstance(credential, SharedKeyCredentialPolicy): - credential_policy = credential + self._credential_policy = credential elif credential is not None: raise TypeError("Unsupported credential: {}".format(credential)) config = kwargs.get('_configuration') or create_configuration(**kwargs) @@ -76,7 +81,7 @@ def _create_pipeline(self, credential, **kwargs): config.user_agent_policy, StorageContentValidation(), StorageRequestHook(**kwargs), - credential_policy, + self._credential_policy, ContentDecodePolicy(), AsyncRedirectPolicy(**kwargs), StorageHosts(hosts=self._hosts, **kwargs), # type: ignore @@ -86,3 +91,36 @@ def _create_pipeline(self, credential, **kwargs): DistributedTracingPolicy(), ] return config, AsyncPipeline(config.transport, policies=policies) + + async def _batch_send( + self, *reqs: 'HttpRequest', + **kwargs + ): + """Given a series of request, do a Storage batch call. + """ + request = self._client._client.post( # pylint: disable=protected-access + url='https://{}/?comp=batch'.format(self.primary_hostname), + headers={ + 'x-ms-version': self._client._config.version # pylint: disable=protected-access + } + ) + + request.set_multipart_mixed( + *reqs, + policies=[ + StorageHeadersPolicy(), + self._credential_policy + ] + ) + + pipeline_response = await self._pipeline.run( + request, **kwargs + ) + response = pipeline_response.http_response + + try: + if response.status_code not in [202]: + raise HttpResponseError(response=response) + return response.parts() # Return an AsyncIterator + except StorageErrorException as error: + process_storage_error(error) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/container_client_async.py b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/container_client_async.py index 1deb4111ea5e..b4611d3a29d6 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/container_client_async.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/container_client_async.py @@ -1,3 +1,4 @@ +# pylint: disable=too-many-lines # ------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for @@ -6,13 +7,14 @@ import functools from typing import ( # pylint: disable=unused-import - Union, Optional, Any, Iterable, AnyStr, Dict, List, Tuple, IO, + Union, Optional, Any, Iterable, AnyStr, Dict, List, Tuple, IO, AsyncIterator, TYPE_CHECKING ) from azure.core.tracing.decorator import distributed_trace from azure.core.tracing.decorator_async import distributed_trace_async from azure.core.async_paging import AsyncItemPaged +from azure.core.pipeline.transport import HttpRequest, AsyncHttpResponse from .._shared.base_client_async import AsyncStorageAccountHostsMixin from .._shared.policies_async import ExponentialRetry @@ -42,6 +44,7 @@ from ..models import ( # pylint: disable=unused-import AccessPolicy, ContentSettings, + StandardBlobTier, PremiumPageBlobTier) @@ -775,6 +778,200 @@ async def delete_blob( timeout=timeout, **kwargs) + @distributed_trace_async + async def delete_blobs( # pylint: disable=arguments-differ + self, *blobs, # type: Union[str, BlobProperties] + delete_snapshots=None, # type: Optional[str] + lease=None, # type: Optional[Union[str, LeaseClient]] + timeout=None, # type: Optional[int] + **kwargs + ): + # type: (...) -> None + """Marks the specified blobs or snapshots for deletion. + + The blob is later deleted during garbage collection. + Note that in order to delete a blob, you must delete all of its + snapshots. You can delete both at the same time with the Delete + Blob operation. + + If a delete retention policy is enabled for the service, then this operation soft deletes the blob or snapshot + and retains the blob or snapshot for specified number of days. + After specified number of days, blob's data is removed from the service during garbage collection. + Soft deleted blob or snapshot is accessible through List Blobs API specifying `include="deleted"` option. + Soft-deleted blob or snapshot can be restored using Undelete API. + + :param blob: The blob with which to interact. If specified, this value will override + a blob value specified in the blob URL. + :type blob: str or ~azure.storage.blob.models.BlobProperties + :param str delete_snapshots: + Required if the blob has associated snapshots. Values include: + - "only": Deletes only the blobs snapshots. + - "include": Deletes the blob along with all snapshots. + :param lease: + Required if the blob has an active lease. Value can be a Lease object + or the lease ID as a string. + :type lease: ~azure.storage.blob.lease.LeaseClient or str + :param str delete_snapshots: + Required if the blob has associated snapshots. Values include: + - "only": Deletes only the blobs snapshots. + - "include": Deletes the blob along with all snapshots. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + options = BlobClient._generic_delete_blob_options( # pylint: disable=protected-access + delete_snapshots=delete_snapshots, + lease=lease, + timeout=timeout, + **kwargs + ) + query_parameters, header_parameters = self._generate_delete_blobs_options(**options) + # To pass kwargs to "_batch_send", we need to remove anything that was + # in the Autorest signature for Autorest, otherwise transport will be upset + for possible_param in ['timeout', 'delete_snapshots', 'lease_access_conditions', 'modified_access_conditions']: + options.pop(possible_param, None) + + reqs = [] + for blob in blobs: + req = HttpRequest( + "DELETE", + "/{}/{}".format(self.container_name, blob), + headers=header_parameters + ) + req.format_parameters(query_parameters) + reqs.append(req) + + return await self._batch_send(*reqs, **options) + + @distributed_trace + async def set_standard_blob_tier_blobs( + self, + standard_blob_tier: Union[str, 'StandardBlobTier'], + *blobs: Union[str, BlobProperties], + **kwargs + ) -> AsyncIterator[AsyncHttpResponse]: + """This operation sets the tier on block blobs. + + A block blob's tier determines Hot/Cool/Archive storage type. + This operation does not update the blob's ETag. + + :param blobs: The blobs with which to interact. + :type blobs: str or ~azure.storage.blob.models.BlobProperties + :param standard_blob_tier: + Indicates the tier to be set on the blob. Options include 'Hot', 'Cool', + 'Archive'. The hot tier is optimized for storing data that is accessed + frequently. The cool storage tier is optimized for storing data that + is infrequently accessed and stored for at least a month. The archive + tier is optimized for storing data that is rarely accessed and stored + for at least six months with flexible latency requirements. + :type standard_blob_tier: str or ~azure.storage.blob.models.StandardBlobTier + :param int timeout: + The timeout parameter is expressed in seconds. + :param lease: + Required if the blob has an active lease. Value can be a LeaseClient object + or the lease ID as a string. + :type lease: ~azure.storage.blob.lease.LeaseClient or str + :rtype: None + """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) + if standard_blob_tier is None: + raise ValueError("A StandardBlobTier must be specified") + + query_parameters, header_parameters = self._generate_set_tier_options( + tier=standard_blob_tier, + lease_access_conditions=access_conditions, + **kwargs + ) + # To pass kwargs to "_batch_send", we need to remove anything that was + # in the Autorest signature for Autorest, otherwise transport will be upset + for possible_param in ['timeout', 'lease']: + kwargs.pop(possible_param, None) + + reqs = [] + for blob in blobs: + req = HttpRequest( + "PUT", + "/{}/{}".format(self.container_name, blob), + headers=header_parameters + ) + req.format_parameters(query_parameters) + reqs.append(req) + + return await self._batch_send(*reqs, **kwargs) + + @distributed_trace + async def set_premium_page_blob_tier_blobs( + self, + premium_page_blob_tier: Union[str, 'PremiumPageBlobTier'], + *blobs: Union[str, BlobProperties], + **kwargs + ) -> AsyncIterator[AsyncHttpResponse]: + """Sets the page blob tiers on the blobs. This API is only supported for page blobs on premium accounts. + + :param blobs: The blobs with which to interact. + :type blobs: str or ~azure.storage.blob.models.BlobProperties + :param premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :type premium_page_blob_tier: ~azure.storage.blob.models.PremiumPageBlobTier + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param lease: + Required if the blob has an active lease. Value can be a LeaseClient object + or the lease ID as a string. + :type lease: ~azure.storage.blob.lease.LeaseClient or str + :rtype: None + """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) + if premium_page_blob_tier is None: + raise ValueError("A PremiumPageBlobTier must be specified") + + query_parameters, header_parameters = self._generate_set_tier_options( + tier=premium_page_blob_tier, + lease_access_conditions=access_conditions, + **kwargs + ) + # To pass kwargs to "_batch_send", we need to remove anything that was + # in the Autorest signature for Autorest, otherwise transport will be upset + for possible_param in ['timeout', 'lease']: + kwargs.pop(possible_param, None) + + reqs = [] + for blob in blobs: + req = HttpRequest( + "PUT", + "/{}/{}".format(self.container_name, blob), + headers=header_parameters + ) + req.format_parameters(query_parameters) + reqs.append(req) + + return await self._batch_send(*reqs, **kwargs) + def get_blob_client( self, blob, # type: Union[str, BlobProperties] snapshot=None # type: str diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/blob_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/blob_client.py index 7f4f7fef0d38..bedf49a3be52 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/blob_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/blob_client.py @@ -673,7 +673,8 @@ def download_blob(self, offset=None, length=None, validate_content=False, **kwar } return StorageStreamDownloader(extra_properties=extra_properties, **options) - def _delete_blob_options(self, delete_snapshots=False, **kwargs): + @staticmethod + def _generic_delete_blob_options(delete_snapshots=False, **kwargs): # type: (bool, **Any) -> Dict[str, Any] access_conditions = get_access_conditions(kwargs.pop('lease', None)) mod_conditions = ModifiedAccessConditions( @@ -681,19 +682,24 @@ def _delete_blob_options(self, delete_snapshots=False, **kwargs): if_unmodified_since=kwargs.pop('if_unmodified_since', None), if_match=kwargs.pop('if_match', None), if_none_match=kwargs.pop('if_none_match', None)) - if self.snapshot and delete_snapshots: - raise ValueError("The delete_snapshots option cannot be used with a specific snapshot.") if delete_snapshots: delete_snapshots = DeleteSnapshotsOptionType(delete_snapshots) options = { 'timeout': kwargs.pop('timeout', None), 'delete_snapshots': delete_snapshots or None, - 'snapshot': self.snapshot, 'lease_access_conditions': access_conditions, 'modified_access_conditions': mod_conditions} options.update(kwargs) return options + def _delete_blob_options(self, delete_snapshots=False, **kwargs): + # type: (bool, **Any) -> Dict[str, Any] + if self.snapshot and delete_snapshots: + raise ValueError("The delete_snapshots option cannot be used with a specific snapshot.") + options = self._generic_delete_blob_options(delete_snapshots, **kwargs) + options['snapshot'] = self.snapshot + return options + @distributed_trace def delete_blob(self, delete_snapshots=False, **kwargs): # type: (bool, **Any) -> None diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/container_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/container_client.py index 0d00056451e9..a4f176c35685 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/container_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/container_client.py @@ -1,3 +1,4 @@ +# pylint: disable=too-many-lines # ------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for @@ -20,6 +21,7 @@ from azure.core.paging import ItemPaged from azure.core.tracing.decorator import distributed_trace +from azure.core.pipeline.transport import HttpRequest from ._shared.base_client import StorageAccountHostsMixin, parse_connection_str, parse_query from ._shared.request_handlers import add_metadata_headers, serialize_iso @@ -951,6 +953,286 @@ def delete_blob( timeout=timeout, **kwargs) + def _generate_delete_blobs_options( + self, snapshot=None, + timeout=None, + delete_snapshots=None, + request_id=None, + lease_access_conditions=None, + modified_access_conditions=None + ): + """This code is a copy from _generated. + + Once Autorest is able to provide request preparation this code should be removed. + """ + lease_id = None + if lease_access_conditions is not None: + lease_id = lease_access_conditions.lease_id + if_modified_since = None + if modified_access_conditions is not None: + if_modified_since = modified_access_conditions.if_modified_since + if_unmodified_since = None + if modified_access_conditions is not None: + if_unmodified_since = modified_access_conditions.if_unmodified_since + if_match = None + if modified_access_conditions is not None: + if_match = modified_access_conditions.if_match + if_none_match = None + if modified_access_conditions is not None: + if_none_match = modified_access_conditions.if_none_match + + # Construct parameters + query_parameters = {} + if snapshot is not None: + query_parameters['snapshot'] = self._client._serialize.query("snapshot", snapshot, 'str') # pylint: disable=protected-access + if timeout is not None: + query_parameters['timeout'] = self._client._serialize.query("timeout", timeout, 'int', minimum=0) # pylint: disable=protected-access + + # Construct headers + header_parameters = {} + if delete_snapshots is not None: + header_parameters['x-ms-delete-snapshots'] = self._client._serialize.header( # pylint: disable=protected-access + "delete_snapshots", delete_snapshots, 'DeleteSnapshotsOptionType') + if request_id is not None: + header_parameters['x-ms-client-request-id'] = self._client._serialize.header( # pylint: disable=protected-access + "request_id", request_id, 'str') + if lease_id is not None: + header_parameters['x-ms-lease-id'] = self._client._serialize.header( # pylint: disable=protected-access + "lease_id", lease_id, 'str') + if if_modified_since is not None: + header_parameters['If-Modified-Since'] = self._client._serialize.header( # pylint: disable=protected-access + "if_modified_since", if_modified_since, 'rfc-1123') + if if_unmodified_since is not None: + header_parameters['If-Unmodified-Since'] = self._client._serialize.header( # pylint: disable=protected-access + "if_unmodified_since", if_unmodified_since, 'rfc-1123') + if if_match is not None: + header_parameters['If-Match'] = self._client._serialize.header( # pylint: disable=protected-access + "if_match", if_match, 'str') + if if_none_match is not None: + header_parameters['If-None-Match'] = self._client._serialize.header( # pylint: disable=protected-access + "if_none_match", if_none_match, 'str') + + return query_parameters, header_parameters + + @distributed_trace + def delete_blobs(self, *blobs, **kwargs): + # type: (...) -> None + """Marks the specified blobs or snapshots for deletion. + + The blob is later deleted during garbage collection. + Note that in order to delete a blob, you must delete all of its + snapshots. You can delete both at the same time with the Delete + Blob operation. + + If a delete retention policy is enabled for the service, then this operation soft deletes the blob or snapshot + and retains the blob or snapshot for specified number of days. + After specified number of days, blob's data is removed from the service during garbage collection. + Soft deleted blob or snapshot is accessible through List Blobs API specifying `include="deleted"` option. + Soft-deleted blob or snapshot can be restored using Undelete API. + + :param blobs: The blobs with which to interact. + :type blobs: str or ~azure.storage.blob.models.BlobProperties + :param str delete_snapshots: + Required if the blob has associated snapshots. Values include: + - "only": Deletes only the blobs snapshots. + - "include": Deletes the blob along with all snapshots. + :param lease: + Required if the blob has an active lease. Value can be a Lease object + or the lease ID as a string. + :type lease: ~azure.storage.blob.lease.LeaseClient or str + :param str delete_snapshots: + Required if the blob has associated snapshots. Values include: + - "only": Deletes only the blobs snapshots. + - "include": Deletes the blob along with all snapshots. + :param datetime if_modified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only + if the resource has been modified since the specified time. + :param datetime if_unmodified_since: + A DateTime value. Azure expects the date value passed in to be UTC. + If timezone is included, any non-UTC datetimes will be converted to UTC. + If a date is passed in without timezone info, it is assumed to be UTC. + Specify this header to perform the operation only if + the resource has not been modified since the specified date/time. + :param str if_match: + An ETag value, or the wildcard character (*). Specify this header to perform + the operation only if the resource's ETag matches the value specified. + :param str if_none_match: + An ETag value, or the wildcard character (*). Specify this header + to perform the operation only if the resource's ETag does not match + the value specified. Specify the wildcard character (*) to perform + the operation only if the resource does not exist, and fail the + operation if it does exist. + :param int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + options = BlobClient._generic_delete_blob_options( # pylint: disable=protected-access + **kwargs + ) + query_parameters, header_parameters = self._generate_delete_blobs_options(**options) + # To pass kwargs to "_batch_send", we need to remove anything that was + # in the Autorest signature for Autorest, otherwise transport will be upset + for possible_param in ['timeout', 'delete_snapshots', 'lease_access_conditions', 'modified_access_conditions']: + options.pop(possible_param, None) + + reqs = [] + for blob in blobs: + req = HttpRequest( + "DELETE", + "/{}/{}".format(self.container_name, blob), + headers=header_parameters + ) + req.format_parameters(query_parameters) + reqs.append(req) + + return self._batch_send(*reqs, **options) + + def _generate_set_tier_options( + self, tier, timeout=None, rehydrate_priority=None, request_id=None, lease_access_conditions=None + ): + """This code is a copy from _generated. + + Once Autorest is able to provide request preparation this code should be removed. + """ + lease_id = None + if lease_access_conditions is not None: + lease_id = lease_access_conditions.lease_id + + comp = "tier" + + # Construct parameters + query_parameters = {} + if timeout is not None: + query_parameters['timeout'] = self._client._serialize.query("timeout", timeout, 'int', minimum=0) # pylint: disable=protected-access + query_parameters['comp'] = self._client._serialize.query("comp", comp, 'str') # pylint: disable=protected-access, specify-parameter-names-in-call + + # Construct headers + header_parameters = {} + header_parameters['x-ms-access-tier'] = self._client._serialize.header("tier", tier, 'str') # pylint: disable=protected-access, specify-parameter-names-in-call + if rehydrate_priority is not None: + header_parameters['x-ms-rehydrate-priority'] = self._client._serialize.header( # pylint: disable=protected-access + "rehydrate_priority", rehydrate_priority, 'str') + if request_id is not None: + header_parameters['x-ms-client-request-id'] = self._client._serialize.header( # pylint: disable=protected-access + "request_id", request_id, 'str') + if lease_id is not None: + header_parameters['x-ms-lease-id'] = self._client._serialize.header("lease_id", lease_id, 'str') # pylint: disable=protected-access + + return query_parameters, header_parameters + + @distributed_trace + def set_standard_blob_tier_blobs( + self, + standard_blob_tier, # type: Union[str, StandardBlobTier] + *blobs, # type: Union[str, BlobProperties] + **kwargs + ): + # type: (...) -> Iterator[HttpResponse] + """This operation sets the tier on block blobs. + + A block blob's tier determines Hot/Cool/Archive storage type. + This operation does not update the blob's ETag. + + :param blobs: The blobs with which to interact. + :type blobs: str or ~azure.storage.blob.models.BlobProperties + :param standard_blob_tier: + Indicates the tier to be set on the blob. Options include 'Hot', 'Cool', + 'Archive'. The hot tier is optimized for storing data that is accessed + frequently. The cool storage tier is optimized for storing data that + is infrequently accessed and stored for at least a month. The archive + tier is optimized for storing data that is rarely accessed and stored + for at least six months with flexible latency requirements. + :type standard_blob_tier: str or ~azure.storage.blob.models.StandardBlobTier + :param int timeout: + The timeout parameter is expressed in seconds. + :param lease: + Required if the blob has an active lease. Value can be a LeaseClient object + or the lease ID as a string. + :type lease: ~azure.storage.blob.lease.LeaseClient or str + :rtype: None + """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) + if standard_blob_tier is None: + raise ValueError("A StandardBlobTier must be specified") + + query_parameters, header_parameters = self._generate_set_tier_options( + tier=standard_blob_tier, + lease_access_conditions=access_conditions, + **kwargs + ) + # To pass kwargs to "_batch_send", we need to remove anything that was + # in the Autorest signature for Autorest, otherwise transport will be upset + for possible_param in ['timeout', 'lease']: + kwargs.pop(possible_param, None) + + reqs = [] + for blob in blobs: + req = HttpRequest( + "PUT", + "/{}/{}".format(self.container_name, blob), + headers=header_parameters + ) + req.format_parameters(query_parameters) + reqs.append(req) + + return self._batch_send(*reqs, **kwargs) + + @distributed_trace + def set_premium_page_blob_tier_blobs( + self, + premium_page_blob_tier, # type: Union[str, PremiumPageBlobTier] + *blobs, # type: Union[str, BlobProperties] + **kwargs + ): + # type: (...) -> Iterator[HttpResponse] + """Sets the page blob tiers on the blobs. This API is only supported for page blobs on premium accounts. + + :param blobs: The blobs with which to interact. + :type blobs: str or ~azure.storage.blob.models.BlobProperties + :param premium_page_blob_tier: + A page blob tier value to set the blob to. The tier correlates to the size of the + blob and number of allowed IOPS. This is only applicable to page blobs on + premium storage accounts. + :type premium_page_blob_tier: ~azure.storage.blob.models.PremiumPageBlobTier + :param int timeout: + The timeout parameter is expressed in seconds. This method may make + multiple calls to the Azure service and the timeout will apply to + each call individually. + :param lease: + Required if the blob has an active lease. Value can be a LeaseClient object + or the lease ID as a string. + :type lease: ~azure.storage.blob.lease.LeaseClient or str + :rtype: None + """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) + if premium_page_blob_tier is None: + raise ValueError("A PremiumPageBlobTier must be specified") + + query_parameters, header_parameters = self._generate_set_tier_options( + tier=premium_page_blob_tier, + lease_access_conditions=access_conditions, + **kwargs + ) + # To pass kwargs to "_batch_send", we need to remove anything that was + # in the Autorest signature for Autorest, otherwise transport will be upset + for possible_param in ['timeout', 'lease']: + kwargs.pop(possible_param, None) + + reqs = [] + for blob in blobs: + req = HttpRequest( + "PUT", + "/{}/{}".format(self.container_name, blob), + headers=header_parameters + ) + req.format_parameters(query_parameters) + reqs.append(req) + + return self._batch_send(*reqs, **kwargs) + def get_blob_client( self, blob, # type: Union[str, BlobProperties] snapshot=None # type: str diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_delete_blobs_simple.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_delete_blobs_simple.yaml new file mode 100644 index 000000000000..2c9dc6710d1b --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_delete_blobs_simple.yaml @@ -0,0 +1,266 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 404c268a-e56c-11e9-8565-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:50 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container40320ffd?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 02 Oct 2019 23:27:49 GMT + ETag: + - '"0x8D74790244CD3F2"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 2e9c4a7f-501e-0091-3f79-791aed000000 + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 406fbe28-e56c-11e9-932e-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container40320ffd/blob1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:27:49 GMT + ETag: + - '"0x8D747902454372A"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 2e9c4aa6-501e-0091-6479-791aed000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 407647f0-e56c-11e9-a9ed-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container40320ffd/blob2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:27:49 GMT + ETag: + - '"0x8D74790245C9BA3"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 2e9c4abf-501e-0091-7979-791aed000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 407ed140-e56c-11e9-a07b-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container40320ffd/blob3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + ETag: + - '"0x8D7479024632B6A"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 2e9c4af0-501e-0091-2979-791aed000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: "--===============8911883992722617746==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /container40320ffd/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:27:51 GMT\r\nx-ms-client-request-id: 4084db54-e56c-11e9-8797-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:vyDpAPz8TaXR5sTt3LaoLLZmDXEuhJCky86GVPIOmUQ=\r\n\r\n\r\n--===============8911883992722617746==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /container40320ffd/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:27:51 GMT\r\nx-ms-client-request-id: + 40850146-e56c-11e9-8a70-1831bf6ae40e\r\nAuthorization: SharedKey storagename:yRlN32wb+MK7DXJp1qPrhLOncARuDUUjzwsNRKqe/LI=\r\n\r\n\r\n--===============8911883992722617746==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /container40320ffd/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:27:51 GMT\r\nx-ms-client-request-id: + 40850147-e56c-11e9-b3d9-1831bf6ae40e\r\nAuthorization: SharedKey storagename:qhPtekve+yBJAtzJnPsoS3E2IdK2867mUsw6226fKOo=\r\n\r\n\r\n--===============8911883992722617746==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================8911883992722617746== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 408613dc-e56c-11e9-9685-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_f0656806-c881-4025-8bba-603c1f075aa8\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 2e9c4b1c-501e-0091-5379-791aed1e2d9f\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_f0656806-c881-4025-8bba-603c1f075aa8\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 2e9c4b1c-501e-0091-5379-791aed1e2da1\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_f0656806-c881-4025-8bba-603c1f075aa8\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 2e9c4b1c-501e-0091-5379-791aed1e2da2\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_f0656806-c881-4025-8bba-603c1f075aa8--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_f0656806-c881-4025-8bba-603c1f075aa8 + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2e9c4b1c-501e-0091-5379-791aed000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_delete_blobs_snapshot.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_delete_blobs_snapshot.yaml new file mode 100644 index 000000000000..bf44adbf971b --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_delete_blobs_snapshot.yaml @@ -0,0 +1,426 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 40b10828-e56c-11e9-b82e-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container617e10e3?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + ETag: + - '"0x8D7479024A3C2B8"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a9ba22f4-f01e-000e-1079-7956ef000000 + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 40c694ba-e56c-11e9-8ad0-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container617e10e3/blob1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + ETag: + - '"0x8D7479024A9838C"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - a9ba2317-f01e-000e-2d79-7956ef000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 40cb385e-e56c-11e9-b5fb-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container617e10e3/blob1?comp=snapshot + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + ETag: + - '"0x8D7479024A9838C"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a9ba233a-f01e-000e-4f79-7956ef000000 + x-ms-request-server-encrypted: + - 'false' + x-ms-snapshot: + - '2019-10-02T23:27:51.2566284Z' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 40d1f4a4-e56c-11e9-b182-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container617e10e3/blob2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + ETag: + - '"0x8D7479024B654D8"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - a9ba2351-f01e-000e-6679-7956ef000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 40d8731e-e56c-11e9-ba1f-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container617e10e3/blob3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + ETag: + - '"0x8D7479024BC968D"' + Last-Modified: + - Wed, 02 Oct 2019 23:27:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - a9ba2371-f01e-000e-0379-7956ef000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 40de09b6-e56c-11e9-998e-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: GET + uri: https://storagename.blob.core.windows.net/container617e10e3?include=snapshots&restype=container&comp=list + response: + body: + string: "\uFEFFblob12019-10-02T23:27:51.2566284ZWed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024A9838C11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottruetrueblob1Wed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024A9838C11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob2Wed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024B654D811application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob3Wed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024BC968D11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrue" + headers: + Content-Type: + - application/xml + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a9ba2383-f01e-000e-1579-7956ef000000 + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============3459304103527371314==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /container617e10e3/blob1? HTTP/1.1\r\nx-ms-delete-snapshots: + only\r\nx-ms-date: Wed, 02 Oct 2019 23:27:51 GMT\r\nx-ms-client-request-id: + 40e6f4c2-e56c-11e9-98d9-1831bf6ae40e\r\nAuthorization: SharedKey storagename:cXMhY5oqSdhqhzne+vC5WMw/O7h7DlpjGh/XiWSku/c=\r\n\r\n\r\n--===============3459304103527371314==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /container617e10e3/blob2? HTTP/1.1\r\nx-ms-delete-snapshots: only\r\nx-ms-date: + Wed, 02 Oct 2019 23:27:51 GMT\r\nx-ms-client-request-id: 40e6f4c3-e56c-11e9-b7b3-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:ugyealFbrFB7Aazr7Bo+FjX0vItAuSCpgCyU3qvHoGE=\r\n\r\n\r\n--===============3459304103527371314==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /container617e10e3/blob3? HTTP/1.1\r\nx-ms-delete-snapshots: only\r\nx-ms-date: + Wed, 02 Oct 2019 23:27:51 GMT\r\nx-ms-client-request-id: 40e6f4c4-e56c-11e9-8760-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:a1nviBTPatxPjnp1/fzj5yzi7CW7ibCrQDUj4nbQMHs=\r\n\r\n\r\n--===============3459304103527371314==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1224' + Content-Type: + - multipart/mixed; boundary================3459304103527371314== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 40e7420a-e56c-11e9-ae20-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:51 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_bf2693d9-6669-4afc-99bd-42df497f92af\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: a9ba23a7-f01e-000e-3879-7956ef1edacc\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_bf2693d9-6669-4afc-99bd-42df497f92af\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: a9ba23a7-f01e-000e-3879-7956ef1edace\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:a9ba23a7-f01e-000e-3879-7956ef1edace\nTime:2019-10-02T23:27:51.4521191Z\r\n--batchresponse_bf2693d9-6669-4afc-99bd-42df497f92af\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: a9ba23a7-f01e-000e-3879-7956ef1edacf\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:a9ba23a7-f01e-000e-3879-7956ef1edacf\nTime:2019-10-02T23:27:51.4521191Z\r\n--batchresponse_bf2693d9-6669-4afc-99bd-42df497f92af--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_bf2693d9-6669-4afc-99bd-42df497f92af + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a9ba23a7-f01e-000e-3879-7956ef000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 40f0bd98-e56c-11e9-bc6d-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:27:52 GMT + x-ms-version: + - '2019-02-02' + method: GET + uri: https://storagename.blob.core.windows.net/container617e10e3?include=snapshots&restype=container&comp=list + response: + body: + string: "\uFEFFblob1Wed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024A9838C11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob2Wed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024B654D811application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob3Wed, + 02 Oct 2019 23:27:51 GMTWed, 02 Oct 2019 23:27:51 + GMT0x8D7479024BC968D11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrue" + headers: + Content-Type: + - application/xml + Date: + - Wed, 02 Oct 2019 23:27:50 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a9ba23c8-f01e-000e-5879-7956ef000000 + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_standard_blob_tier_set_tier_api_batch.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_standard_blob_tier_set_tier_api_batch.yaml new file mode 100644 index 000000000000..3598cbef77e2 --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_container.test_standard_blob_tier_set_tier_api_batch.yaml @@ -0,0 +1,1322 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8be64b8c-e56c-11e9-879f-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:57 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D747906FE8388D"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 39ef909c-d01e-00b0-6f79-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: "--===============1483581254377965210==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /containera687174a/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: 8c0c6140-e56c-11e9-b4a6-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:UiVXjEnPsxw+CBLDKVwFRVpT0YdGHKq49i+0EsL84AA=\r\n\r\n\r\n--===============1483581254377965210==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /containera687174a/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c0c6141-e56c-11e9-be8a-1831bf6ae40e\r\nAuthorization: SharedKey storagename:LHu86Yxl0zZMYLOwgd4dNVpS2UfZ7J2GZcwXrS2pzQE=\r\n\r\n\r\n--===============1483581254377965210==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /containera687174a/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c0c8858-e56c-11e9-aff8-1831bf6ae40e\r\nAuthorization: SharedKey storagename:YVb9JFgSGe7fjD5Kd1AfA16fqQscUWdufd+RkG26FlE=\r\n\r\n\r\n--===============1483581254377965210==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================1483581254377965210== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c0d73e4-e56c-11e9-a250-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_f2415df9-cc8e-4dc7-95c4-21b60b2e1675\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 39ef90b9-d01e-00b0-0a79-793e961e611c\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:39ef90b9-d01e-00b0-0a79-793e961e611c\nTime:2019-10-02T23:29:57.5487074Z\r\n--batchresponse_f2415df9-cc8e-4dc7-95c4-21b60b2e1675\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 39ef90b9-d01e-00b0-0a79-793e961e611e\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:39ef90b9-d01e-00b0-0a79-793e961e611e\nTime:2019-10-02T23:29:57.5487074Z\r\n--batchresponse_f2415df9-cc8e-4dc7-95c4-21b60b2e1675\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: 39ef90b9-d01e-00b0-0a79-793e961e611f\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:39ef90b9-d01e-00b0-0a79-793e961e611f\nTime:2019-10-02T23:29:57.5487074Z\r\n--batchresponse_f2415df9-cc8e-4dc7-95c4-21b60b2e1675--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_f2415df9-cc8e-4dc7-95c4-21b60b2e1675 + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef90b9-d01e-00b0-0a79-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c1eb0ae-e56c-11e9-bfd1-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D747907002B685"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef9108-d01e-00b0-5179-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c251950-e56c-11e9-8f34-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D747907008D12D"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef9122-d01e-00b0-6679-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c2ae5ae-e56c-11e9-95ab-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D74790700EC4AD"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef9144-d01e-00b0-0179-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c3075ca-e56c-11e9-b860-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '11' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Content-Type: + - application/octet-stream + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D747907002B685"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Wed, 02 Oct 2019 23:29:57 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 39ef9163-d01e-00b0-2079-793e96000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============3485947800101400709==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nPUT /containera687174a/blob1?comp=tier HTTP/1.1\r\nContent-Length: + 0\r\nx-ms-access-tier: Archive\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c36799e-e56c-11e9-96c8-1831bf6ae40e\r\nAuthorization: SharedKey storagename:JkapTAnFkkWEKnNqb9s8UfQPx34gvAzMtHe/ShejRzw=\r\n\r\n\r\n--===============3485947800101400709==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nPUT + /containera687174a/blob2?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Archive\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c36799f-e56c-11e9-ad8e-1831bf6ae40e\r\nAuthorization: SharedKey storagename:ZjLvzFCLamCCor/tqSLgqEEJ/FeV3xxafyNlyPY8uuM=\r\n\r\n\r\n--===============3485947800101400709==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nPUT + /containera687174a/blob3?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Archive\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c3679a0-e56c-11e9-83dc-1831bf6ae40e\r\nAuthorization: SharedKey storagename:M5Jt22fkFUE+xgOYiQ+ZTQMkSRzsKFbcuocKyu8lsvk=\r\n\r\n\r\n--===============3485947800101400709==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1293' + Content-Type: + - multipart/mixed; boundary================3485947800101400709== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c36c7c0-e56c-11e9-ae48-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_6493f1ce-4c1d-4aa5-84ca-73549df8936d\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef9180-d01e-00b0-3d79-793e961e612e\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_6493f1ce-4c1d-4aa5-84ca-73549df8936d\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef9180-d01e-00b0-3d79-793e961e612f\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_6493f1ce-4c1d-4aa5-84ca-73549df8936d\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef9180-d01e-00b0-3d79-793e961e6130\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_6493f1ce-4c1d-4aa5-84ca-73549df8936d--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_6493f1ce-4c1d-4aa5-84ca-73549df8936d + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef9180-d01e-00b0-3d79-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c3fca76-e56c-11e9-9f17-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '11' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Content-Type: + - application/octet-stream + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D747907002B685"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Archive + x-ms-access-tier-change-time: + - Wed, 02 Oct 2019 23:29:57 GMT + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Wed, 02 Oct 2019 23:29:57 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 39ef91ad-d01e-00b0-6a79-793e96000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============3596608585363756258==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /containera687174a/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: 8c446e6e-e56c-11e9-98b4-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:Cf1l+IdHT5pLTKFkaYYszqolSlUWPkhvayxguGChFNM=\r\n\r\n\r\n--===============3596608585363756258==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /containera687174a/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c446e6f-e56c-11e9-afcf-1831bf6ae40e\r\nAuthorization: SharedKey storagename:BPg1qRQ+WFFTEdnI88csJZP7cq4BQ8/xNnPyUVvUo0E=\r\n\r\n\r\n--===============3596608585363756258==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /containera687174a/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c44946e-e56c-11e9-ad3e-1831bf6ae40e\r\nAuthorization: SharedKey storagename:uIGHVLjmBAInCrQH9YmvSz/vJyjuvZyaysgtA248TzQ=\r\n\r\n\r\n--===============3596608585363756258==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================3596608585363756258== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c44e274-e56c-11e9-904d-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_723231f0-dd17-4abd-83a8-2336ab208e7a\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef91cc-d01e-00b0-0779-793e961e6133\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_723231f0-dd17-4abd-83a8-2336ab208e7a\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef91cc-d01e-00b0-0779-793e961e6134\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_723231f0-dd17-4abd-83a8-2336ab208e7a\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef91cc-d01e-00b0-0779-793e961e6135\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_723231f0-dd17-4abd-83a8-2336ab208e7a--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_723231f0-dd17-4abd-83a8-2336ab208e7a + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef91cc-d01e-00b0-0779-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c4ba4f0-e56c-11e9-aac4-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D74790702FBA4F"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef91eb-d01e-00b0-2679-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c520100-e56c-11e9-bc69-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:56 GMT + ETag: + - '"0x8D74790703649E4"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef9202-d01e-00b0-3d79-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c585480-e56c-11e9-b5f3-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D74790703CD9C0"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:58 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef9219-d01e-00b0-5479-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c5eaea4-e56c-11e9-832c-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '11' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Content-Type: + - application/octet-stream + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D74790702FBA4F"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Wed, 02 Oct 2019 23:29:57 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 39ef922a-d01e-00b0-6479-793e96000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============8089144083184603275==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nPUT /containera687174a/blob1?comp=tier HTTP/1.1\r\nContent-Length: + 0\r\nx-ms-access-tier: Cool\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c63e934-e56c-11e9-9f70-1831bf6ae40e\r\nAuthorization: SharedKey storagename:215ijii+HbTbASqrh+m6BVutAnCZavZ++HK31VgRlzU=\r\n\r\n\r\n--===============8089144083184603275==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nPUT + /containera687174a/blob2?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Cool\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c63e935-e56c-11e9-bba1-1831bf6ae40e\r\nAuthorization: SharedKey storagename:qqI6xg7pQbjBBL7Q1tr+FZnHTN+FmvJgOV83kffkPTw=\r\n\r\n\r\n--===============8089144083184603275==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nPUT + /containera687174a/blob3?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Cool\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c63e936-e56c-11e9-986e-1831bf6ae40e\r\nAuthorization: SharedKey storagename:FS60zvJqEXzSpd7Zr3Cec9RdeNPa5U+R794uR4Ee8yk=\r\n\r\n\r\n--===============8089144083184603275==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1284' + Content-Type: + - multipart/mixed; boundary================8089144083184603275== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c643846-e56c-11e9-9c80-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_9a31cb17-099d-4d0d-a966-cda3308762d8\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef924d-d01e-00b0-0679-793e961e6136\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_9a31cb17-099d-4d0d-a966-cda3308762d8\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef924d-d01e-00b0-0679-793e961e6137\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_9a31cb17-099d-4d0d-a966-cda3308762d8\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef924d-d01e-00b0-0679-793e961e6138\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_9a31cb17-099d-4d0d-a966-cda3308762d8--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_9a31cb17-099d-4d0d-a966-cda3308762d8 + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef924d-d01e-00b0-0679-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c6adfd8-e56c-11e9-a993-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '11' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Content-Type: + - application/octet-stream + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D74790702FBA4F"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Cool + x-ms-access-tier-change-time: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Wed, 02 Oct 2019 23:29:57 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 39ef9279-d01e-00b0-3079-793e96000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============5575056120482726072==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /containera687174a/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: 8c6fad42-e56c-11e9-a40a-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:CeEFmWwz8wg2zyFLqZBgz9sWnnzogfe4yGrXj6jRtt4=\r\n\r\n\r\n--===============5575056120482726072==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /containera687174a/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c6fd324-e56c-11e9-b57e-1831bf6ae40e\r\nAuthorization: SharedKey storagename:cl7h9S0iamtkjPdyJf/xCeCpcaM2ilTF2+ux57IpHMA=\r\n\r\n\r\n--===============5575056120482726072==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /containera687174a/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c6fd325-e56c-11e9-afb0-1831bf6ae40e\r\nAuthorization: SharedKey storagename:05ypdkBQIqYg/RMV1cmWlj4c52I9kGPl3kuQ7EZoR4Y=\r\n\r\n\r\n--===============5575056120482726072==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================5575056120482726072== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c702136-e56c-11e9-a7b8-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_c85a109b-e1b4-469a-96f3-361e2dc853b2\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef9295-d01e-00b0-4b79-793e961e613d\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_c85a109b-e1b4-469a-96f3-361e2dc853b2\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef9295-d01e-00b0-4b79-793e961e613e\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_c85a109b-e1b4-469a-96f3-361e2dc853b2\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef9295-d01e-00b0-4b79-793e961e613f\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_c85a109b-e1b4-469a-96f3-361e2dc853b2--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_c85a109b-e1b4-469a-96f3-361e2dc853b2 + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef9295-d01e-00b0-4b79-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c78446e-e56c-11e9-9edf-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D74790705C21CF"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:58 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef92c0-d01e-00b0-7279-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c7e4f38-e56c-11e9-9dc9-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob2 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D7479070623C2C"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:58 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef92e4-d01e-00b0-1379-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: hello world + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 8c847b58-e56c-11e9-ab05-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containera687174a/blob3 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D7479070682FA2"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:58 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: + - vo7q9sPVKY0= + x-ms-request-id: + - 39ef92fc-d01e-00b0-2879-793e96000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c8a11b0-e56c-11e9-a069-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '11' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Content-Type: + - application/octet-stream + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D74790705C21CF"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:58 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 39ef930e-d01e-00b0-3979-793e96000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============5715678060279454027==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nPUT /containera687174a/blob1?comp=tier HTTP/1.1\r\nContent-Length: + 0\r\nx-ms-access-tier: Hot\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c8e8452-e56c-11e9-8d77-1831bf6ae40e\r\nAuthorization: SharedKey storagename:IBVXRoHYodB+DIEIAOp1yfMyjn0910oOxBCjy/b3vWs=\r\n\r\n\r\n--===============5715678060279454027==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nPUT + /containera687174a/blob2?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Hot\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: 8c8e8453-e56c-11e9-bee2-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:PB6IJemRV6Vqt0Y/kQXUbIn+1kUX894/4XPZZLGmGyI=\r\n\r\n\r\n--===============5715678060279454027==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nPUT + /containera687174a/blob3?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Hot\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: 8c8eaa34-e56c-11e9-b171-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:SeJxLYIwzrwfl5PoX4RyZ9SfdVtBpePzE5W6ObFOwP4=\r\n\r\n\r\n--===============5715678060279454027==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1281' + Content-Type: + - multipart/mixed; boundary================5715678060279454027== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c8ef95a-e56c-11e9-9164-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_b6816b40-aa4a-4e13-99f8-db84954be5db\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef9322-d01e-00b0-4c79-793e961e6148\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_b6816b40-aa4a-4e13-99f8-db84954be5db\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef9322-d01e-00b0-4c79-793e961e6149\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_b6816b40-aa4a-4e13-99f8-db84954be5db\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 39ef9322-d01e-00b0-4c79-793e961e614a\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_b6816b40-aa4a-4e13-99f8-db84954be5db--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_b6816b40-aa4a-4e13-99f8-db84954be5db + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef9322-d01e-00b0-4c79-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c955074-e56c-11e9-9582-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/containera687174a/blob1 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '11' + Content-MD5: + - XrY7u+Ae7tCTyyK7j1rNww== + Content-Type: + - application/octet-stream + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + ETag: + - '"0x8D74790705C21CF"' + Last-Modified: + - Wed, 02 Oct 2019 23:29:58 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Hot + x-ms-access-tier-change-time: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 39ef933a-d01e-00b0-6479-793e96000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2019-02-02' + status: + code: 200 + message: OK +- request: + body: "--===============5183461022170956857==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /containera687174a/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: 8c9a348c-e56c-11e9-a98a-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:zFylWRP5on4lmjkhDJAPiPu4vMpr7bxhVnmVu1dIe4U=\r\n\r\n\r\n--===============5183461022170956857==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /containera687174a/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c9a5b9e-e56c-11e9-ba16-1831bf6ae40e\r\nAuthorization: SharedKey storagename:onp9uFerwAeLViyD1x+/Www+g2irtYcB3qeZ4DC272E=\r\n\r\n\r\n--===============5183461022170956857==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /containera687174a/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:29:58 GMT\r\nx-ms-client-request-id: + 8c9a5b9f-e56c-11e9-9321-1831bf6ae40e\r\nAuthorization: SharedKey storagename:C/6xrthKyt7l5vPh2NgR7ONM++nRPP05R7h39Bb8iOU=\r\n\r\n\r\n--===============5183461022170956857==--\r\n" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================5183461022170956857== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 8c9aa9ba-e56c-11e9-96cb-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:29:58 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_7a38dc67-c8ef-4d9b-ae64-2b04b11f284f\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef9351-d01e-00b0-7a79-793e961e614c\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_7a38dc67-c8ef-4d9b-ae64-2b04b11f284f\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef9351-d01e-00b0-7a79-793e961e614d\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_7a38dc67-c8ef-4d9b-ae64-2b04b11f284f\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 39ef9351-d01e-00b0-7a79-793e961e614e\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_7a38dc67-c8ef-4d9b-ae64-2b04b11f284f--" + headers: + Content-Type: + - multipart/mixed; boundary=batchresponse_7a38dc67-c8ef-4d9b-ae64-2b04b11f284f + Date: + - Wed, 02 Oct 2019 23:29:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 39ef9351-d01e-00b0-7a79-793e96000000 + x-ms-version: + - '2019-02-02' + status: + code: 202 + message: Accepted +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_delete_blobs_simple.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_delete_blobs_simple.yaml new file mode 100644 index 000000000000..9cd848ab0010 --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_delete_blobs_simple.yaml @@ -0,0 +1,285 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 24761c64-e56d-11e9-ad36-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:13 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containeraa4e127a?restype=container + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:12 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D747910865C811"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 8c2c2a12-901e-006a-3a79-79a777000000 + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containeraa4e127a + - restype=container + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 24899374-e56d-11e9-b396-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:13 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containeraa4e127a/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:12 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791086C714B"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 8c2c2a22-901e-006a-4679-79a777000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containeraa4e127a/blob1 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 248f71fe-e56d-11e9-8379-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:13 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containeraa4e127a/blob2 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:12 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479108734F45"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 8c2c2a32-901e-006a-5679-79a777000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containeraa4e127a/blob2 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 249633d4-e56d-11e9-b40f-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:13 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containeraa4e127a/blob3 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:12 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791087969BE"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 8c2c2a44-901e-006a-6779-79a777000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containeraa4e127a/blob3 + - '' + - '' +- request: + body: "--===============0872275850216249893==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /containeraa4e127a/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:34:13 GMT\r\nx-ms-client-request-id: 249bc928-e56d-11e9-8a78-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:FAA6wmBM/Vo50GKEBnkwrip4DbkSiizArLjJkjFJXbM=\r\n\r\n\r\n--===============0872275850216249893==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /containeraa4e127a/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:13 GMT\r\nx-ms-client-request-id: + 249bc929-e56d-11e9-876d-1831bf6ae40e\r\nAuthorization: SharedKey storagename:vSUUco9xi+Wj/DwuuistZDbBrPsxEU9qo8xjqMSckT8=\r\n\r\n\r\n--===============0872275850216249893==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /containeraa4e127a/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:13 GMT\r\nx-ms-client-request-id: + 249bc92a-e56d-11e9-9c05-1831bf6ae40e\r\nAuthorization: SharedKey storagename:iP/wlodCCrYCWMYz4Vyrv6/dLwDgxfmUMr6dYOQMeYE=\r\n\r\n\r\n--===============0872275850216249893==--\r\n" + headers: + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================0872275850216249893== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 249cb24c-e56d-11e9-a996-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:13 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_dc7ce28b-cd1c-4770-b051-98de0c310e58\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 8c2c2a5c-901e-006a-7d79-79a7771e842b\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_dc7ce28b-cd1c-4770-b051-98de0c310e58\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 8c2c2a5c-901e-006a-7d79-79a7771e842d\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_dc7ce28b-cd1c-4770-b051-98de0c310e58\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 8c2c2a5c-901e-006a-7d79-79a7771e842e\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_dc7ce28b-cd1c-4770-b051-98de0c310e58--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_dc7ce28b-cd1c-4770-b051-98de0c310e58 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:12 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: 8c2c2a5c-901e-006a-7d79-79a777000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_delete_blobs_snapshot.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_delete_blobs_snapshot.yaml new file mode 100644 index 000000000000..ce1d5be443c3 --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_delete_blobs_snapshot.yaml @@ -0,0 +1,458 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 24acbb7a-e56d-11e9-9b04-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containerd0941360?restype=container + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791089B22BC"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: b242b8cb-b01e-0099-4679-7900e2000000 + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360 + - restype=container + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 24be1458-e56d-11e9-920d-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containerd0941360/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479108A0A118"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: b242b8d8-b01e-0099-5179-7900e2000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360/blob1 + - '' + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 24c651c6-e56d-11e9-9542-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containerd0941360/blob1?comp=snapshot + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479108A0A118"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: b242b8ec-b01e-0099-6279-7900e2000000 + x-ms-request-server-encrypted: 'false' + x-ms-snapshot: '2019-10-02T23:34:13.7309250Z' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360/blob1 + - comp=snapshot + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 24cba8e8-e56d-11e9-8af9-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containerd0941360/blob2 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479108AE359F"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: b242b8f8-b01e-0099-6e79-7900e2000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360/blob2 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 24d1c366-e56d-11e9-b3ab-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/containerd0941360/blob3 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479108B4EC76"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: b242b90e-b01e-0099-0379-7900e2000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360/blob3 + - '' + - '' +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 24d70e40-e56d-11e9-a133-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: GET + uri: https://storagename.blob.core.windows.net/containerd0941360?include=snapshots&restype=container&comp=list + response: + body: + string: "\uFEFFblob12019-10-02T23:34:13.7309250ZWed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108A0A11811application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottruetrueblob1Wed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108A0A11811application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob2Wed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108AE359F11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob3Wed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108B4EC7611application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrue" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/xml + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: b242b911-b01e-0099-0679-7900e2000000 + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360 + - include=snapshots&restype=container&comp=list + - '' +- request: + body: "--===============7998856315149802492==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /containerd0941360/blob1? HTTP/1.1\r\nx-ms-delete-snapshots: + only\r\nx-ms-date: Wed, 02 Oct 2019 23:34:14 GMT\r\nx-ms-client-request-id: + 24dfc35b-e56d-11e9-9c49-1831bf6ae40e\r\nAuthorization: SharedKey storagename:UB7LfNetpvgQaiT0YsYkx6rPoiGJ1GWFVf90Pbht4PQ=\r\n\r\n\r\n--===============7998856315149802492==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /containerd0941360/blob2? HTTP/1.1\r\nx-ms-delete-snapshots: only\r\nx-ms-date: + Wed, 02 Oct 2019 23:34:14 GMT\r\nx-ms-client-request-id: 24dfc35a-e56d-11e9-a261-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:ga7dxFIMwaJN++JqWfrS5ArP5QVUtD7skKPBTBeCuO0=\r\n\r\n\r\n--===============7998856315149802492==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /containerd0941360/blob3? HTTP/1.1\r\nx-ms-delete-snapshots: only\r\nx-ms-date: + Wed, 02 Oct 2019 23:34:14 GMT\r\nx-ms-client-request-id: 24dfc35c-e56d-11e9-882b-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:8Dh1oNkS8omkQrhg1MZOxz9HX0Lhj+KyxPGkpNgUDlY=\r\n\r\n\r\n--===============7998856315149802492==--\r\n" + headers: + Content-Length: + - '1224' + Content-Type: + - multipart/mixed; boundary================7998856315149802492== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 24e01178-e56d-11e9-9703-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_35579099-eb20-4851-ad90-9521253e026e\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: b242b924-b01e-0099-1879-7900e21e1483\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_35579099-eb20-4851-ad90-9521253e026e\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: b242b924-b01e-0099-1879-7900e21e1485\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:b242b924-b01e-0099-1879-7900e21e1485\nTime:2019-10-02T23:34:13.9769390Z\r\n--batchresponse_35579099-eb20-4851-ad90-9521253e026e\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 404 The specified blob does + not exist.\r\nx-ms-error-code: BlobNotFound\r\nx-ms-request-id: b242b924-b01e-0099-1879-7900e21e1486\r\nx-ms-version: + 2019-02-02\r\nContent-Length: 216\r\nContent-Type: application/xml\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n\uFEFF\nBlobNotFoundThe + specified blob does not exist.\nRequestId:b242b924-b01e-0099-1879-7900e21e1486\nTime:2019-10-02T23:34:13.9769390Z\r\n--batchresponse_35579099-eb20-4851-ad90-9521253e026e--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_35579099-eb20-4851-ad90-9521253e026e + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: b242b924-b01e-0099-1879-7900e2000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 24f30692-e56d-11e9-a289-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:14 GMT + x-ms-version: + - '2019-02-02' + method: GET + uri: https://storagename.blob.core.windows.net/containerd0941360?include=snapshots&restype=container&comp=list + response: + body: + string: "\uFEFFblob1Wed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108A0A11811application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob2Wed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108AE359F11application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrueblob3Wed, + 02 Oct 2019 23:34:13 GMTWed, 02 Oct 2019 23:34:13 + GMT0x8D7479108B4EC7611application/octet-streamXrY7u+Ae7tCTyyK7j1rNww==BlockBlobHottrueunlockedavailabletrue" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/xml + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:13 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: b242b942-b01e-0099-3579-7900e2000000 + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /containerd0941360 + - include=snapshots&restype=container&comp=list + - '' +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_standard_blob_tier_set_tier_api_batch.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_standard_blob_tier_set_tier_api_batch.yaml new file mode 100644 index 000000000000..b8925e6c4655 --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_container_async.test_standard_blob_tier_set_tier_api_batch.yaml @@ -0,0 +1,1325 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 32d7c2dc-e56d-11e9-9db5-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:37 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7?restype=container + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479116D2797E"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: c97a0e14-a01e-0071-7d79-799974000000 + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7 + - restype=container + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 330081c6-e56d-11e9-87cc-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479116E3383E"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: c97a0e59-a01e-0071-3b79-799974000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 33062838-e56d-11e9-8003-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob2 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479116E904C5"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: c97a0e70-a01e-0071-5279-799974000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob2 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 330c27b0-e56d-11e9-afb2-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob3 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479116EEF81E"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: c97a0e91-a01e-0071-6e79-799974000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob3 + - '' + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 33132c9e-e56d-11e9-9723-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Accept-Ranges + : bytes + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '11' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/octet-stream + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479116E3383E"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Wed, 02 Oct 2019 23:34:37 GMT + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: c97a0eb5-a01e-0071-1279-799974000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: "--===============5802361980353224357==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nPUT /container3d7c19c7/blob1?comp=tier HTTP/1.1\r\nContent-Length: + 0\r\nx-ms-access-tier: Archive\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 331a7fa0-e56d-11e9-801a-1831bf6ae40e\r\nAuthorization: SharedKey storagename:pOd7Li6+PCp6RwpB/8txWn9enj72uZqNDJM/yxgW/qg=\r\n\r\n\r\n--===============5802361980353224357==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nPUT + /container3d7c19c7/blob2?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Archive\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 331a7f9f-e56d-11e9-a0cb-1831bf6ae40e\r\nAuthorization: SharedKey storagename:CL0F6M5fMpKwC/g/ZQllS3FNuC/ZERZLdkb5FNVHTSk=\r\n\r\n\r\n--===============5802361980353224357==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nPUT + /container3d7c19c7/blob3?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Archive\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 331a7f9e-e56d-11e9-8142-1831bf6ae40e\r\nAuthorization: SharedKey storagename:kT/BrdmwrkWixIKsFwKs+JtmhDH4JycbB/X6kAXod14=\r\n\r\n\r\n--===============5802361980353224357==--\r\n" + headers: + Content-Length: + - '1293' + Content-Type: + - multipart/mixed; boundary================5802361980353224357== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 331b68c0-e56d-11e9-903c-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_238f34ad-2ef1-4e8f-ad72-4e053dd442d8\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 2ea12eb8-501e-0091-3c79-791aed1e5238\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_238f34ad-2ef1-4e8f-ad72-4e053dd442d8\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 2ea12eb8-501e-0091-3c79-791aed1e523a\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_238f34ad-2ef1-4e8f-ad72-4e053dd442d8\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 2ea12eb8-501e-0091-3c79-791aed1e523b\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_238f34ad-2ef1-4e8f-ad72-4e053dd442d8--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_238f34ad-2ef1-4e8f-ad72-4e053dd442d8 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: 2ea12eb8-501e-0091-3c79-791aed000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 3331ab86-e56d-11e9-ba5b-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Accept-Ranges + : bytes + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '11' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/octet-stream + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479116E3383E"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Archive + x-ms-access-tier-change-time: Wed, 02 Oct 2019 23:34:37 GMT + x-ms-blob-type: BlockBlob + x-ms-creation-time: Wed, 02 Oct 2019 23:34:37 GMT + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: 2ea12ee9-501e-0091-6c79-791aed000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: "--===============1060753039404979828==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /container3d7c19c7/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: 33364540-e56d-11e9-9878-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:S/N5AIT6JVVz+ukPIvBmhvBn0W4T70Owrh+l6c5KLR8=\r\n\r\n\r\n--===============1060753039404979828==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /container3d7c19c7/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 33364542-e56d-11e9-81f7-1831bf6ae40e\r\nAuthorization: SharedKey storagename:So7Kdr7n2sIOs+nXBTkdhIvoqzqf1Ix5xV6O4+uDnLc=\r\n\r\n\r\n--===============1060753039404979828==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /container3d7c19c7/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 33364541-e56d-11e9-bec3-1831bf6ae40e\r\nAuthorization: SharedKey storagename:uNeVcTa0IZsOaAmu9WDWWe4MJeUITSfGDKrfEjjC5sU=\r\n\r\n\r\n--===============1060753039404979828==--\r\n" + headers: + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================1060753039404979828== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 33366c52-e56d-11e9-ac00-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_e11492a4-5f25-48ff-8839-65ee748cdcd1\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 45b83b52-601e-0023-1679-79e59c1e6f0e\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_e11492a4-5f25-48ff-8839-65ee748cdcd1\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 45b83b52-601e-0023-1679-79e59c1e6f10\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_e11492a4-5f25-48ff-8839-65ee748cdcd1\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 45b83b52-601e-0023-1679-79e59c1e6f11\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_e11492a4-5f25-48ff-8839-65ee748cdcd1--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_e11492a4-5f25-48ff-8839-65ee748cdcd1 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: 45b83b52-601e-0023-1679-79e59c000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 3349d806-e56d-11e9-b52f-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791172CC4B3"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 45b83b7b-601e-0023-3e79-79e59c000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 334fcb74-e56d-11e9-8b65-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob2 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479117335494"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 45b83b97-601e-0023-5779-79e59c000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob2 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 335673a8-e56d-11e9-ba2e-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob3 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D747911738F9CB"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 45b83bac-601e-0023-6979-79e59c000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob3 + - '' + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 335b0d1e-e56d-11e9-a3fe-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Accept-Ranges + : bytes + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '11' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/octet-stream + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791172CC4B3"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Wed, 02 Oct 2019 23:34:38 GMT + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: 45b83bbb-601e-0023-7879-79e59c000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: "--===============8384162589281376436==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nPUT /container3d7c19c7/blob1?comp=tier HTTP/1.1\r\nContent-Length: + 0\r\nx-ms-access-tier: Cool\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 335eddaf-e56d-11e9-97ff-1831bf6ae40e\r\nAuthorization: SharedKey storagename:xHmMZBjPWfFYaqAsg09EcYnZ7jutQTmjF/x7RUdEnOw=\r\n\r\n\r\n--===============8384162589281376436==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nPUT + /container3d7c19c7/blob2?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Cool\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 335eddb0-e56d-11e9-a0bf-1831bf6ae40e\r\nAuthorization: SharedKey storagename:pR8Mfuwg8CQy83Kl8Yk4NJMuHW85CDQAj/sqb47yS8U=\r\n\r\n\r\n--===============8384162589281376436==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nPUT + /container3d7c19c7/blob3?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Cool\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 335eddae-e56d-11e9-ab2e-1831bf6ae40e\r\nAuthorization: SharedKey storagename:HfM90lZP+SwJ1TzA2C3ZA7WrwuZ9VIxOZCArKq57f8w=\r\n\r\n\r\n--===============8384162589281376436==--\r\n" + headers: + Content-Length: + - '1284' + Content-Type: + - multipart/mixed; boundary================8384162589281376436== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 335f2cfe-e56d-11e9-8b67-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_3773e08a-4ca7-48ed-8a17-b8f3e4587693\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 4d079d02-201e-006f-4479-7975ac1e00d4\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_3773e08a-4ca7-48ed-8a17-b8f3e4587693\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 4d079d02-201e-006f-4479-7975ac1e00d6\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_3773e08a-4ca7-48ed-8a17-b8f3e4587693\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 4d079d02-201e-006f-4479-7975ac1e00d7\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_3773e08a-4ca7-48ed-8a17-b8f3e4587693--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_3773e08a-4ca7-48ed-8a17-b8f3e4587693 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: 4d079d02-201e-006f-4479-7975ac000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 3370a074-e56d-11e9-97be-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Accept-Ranges + : bytes + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '11' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/octet-stream + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:37 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791172CC4B3"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Cool + x-ms-access-tier-change-time: Wed, 02 Oct 2019 23:34:38 GMT + x-ms-blob-type: BlockBlob + x-ms-creation-time: Wed, 02 Oct 2019 23:34:38 GMT + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: 4d079d15-201e-006f-5379-7975ac000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: "--===============7887429700725587355==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /container3d7c19c7/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: 33753486-e56d-11e9-ac79-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:XlGV2pwHKZ3Hg9KU4oEVkF+mI9W3OKMdof+MUpG9o0s=\r\n\r\n\r\n--===============7887429700725587355==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /container3d7c19c7/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 33753487-e56d-11e9-86cb-1831bf6ae40e\r\nAuthorization: SharedKey storagename:LB/lqbwvfs2uQJznVaKaGU1qvoLnhQwNo3kKrMephTA=\r\n\r\n\r\n--===============7887429700725587355==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /container3d7c19c7/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:38 GMT\r\nx-ms-client-request-id: + 33753488-e56d-11e9-aac5-1831bf6ae40e\r\nAuthorization: SharedKey storagename:fa+vsvA91rRiFZVC+TjzGkOW5wF0JeTnWkEOJy7LF48=\r\n\r\n\r\n--===============7887429700725587355==--\r\n" + headers: + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================7887429700725587355== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 33755ba6-e56d-11e9-9b92-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:38 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_897df75a-6226-4fd4-9055-18ca7f162434\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 5c3c0e4c-101e-0064-2d79-798ec71e3e2d\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_897df75a-6226-4fd4-9055-18ca7f162434\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 5c3c0e4c-101e-0064-2d79-798ec71e3e2f\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_897df75a-6226-4fd4-9055-18ca7f162434\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: 5c3c0e4c-101e-0064-2d79-798ec71e3e30\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_897df75a-6226-4fd4-9055-18ca7f162434--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_897df75a-6226-4fd4-9055-18ca7f162434 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: 5c3c0e4c-101e-0064-2d79-798ec7000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 3387b018-e56d-11e9-9dea-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791176A4362"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 5c3c0e5e-101e-0064-3f79-798ec7000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 338d3aa6-e56d-11e9-a062-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob2 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D7479117700FA4"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 5c3c0e73-101e-0064-5379-798ec7000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob2 + - '' + - '' +- request: + body: hello world + headers: + Content-Length: + - '11' + Content-Type: + - application/octet-stream + If-None-Match: + - '*' + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-client-request-id: + - 3392f6c0-e56d-11e9-bafd-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: PUT + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob3 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '0' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D747911776514E"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-content-crc64: vo7q9sPVKY0= + x-ms-request-id: 5c3c0e8c-101e-0064-6b79-798ec7000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 201 + message: Created + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob3 + - '' + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 33986614-e56d-11e9-8a77-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Accept-Ranges + : bytes + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '11' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/octet-stream + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791176A4362"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Wed, 02 Oct 2019 23:34:38 GMT + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: 5c3c0e9a-101e-0064-7879-798ec7000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: "--===============5308695583842449546==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nPUT /container3d7c19c7/blob1?comp=tier HTTP/1.1\r\nContent-Length: + 0\r\nx-ms-access-tier: Hot\r\nx-ms-date: Wed, 02 Oct 2019 23:34:39 GMT\r\nx-ms-client-request-id: + 339d5392-e56d-11e9-bdea-1831bf6ae40e\r\nAuthorization: SharedKey storagename:F8yhqZPmXO7EmiNQsZqPDblUYl2LSr/wt4JsJca8Bkw=\r\n\r\n\r\n--===============5308695583842449546==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nPUT + /container3d7c19c7/blob2?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Hot\r\nx-ms-date: Wed, 02 Oct 2019 23:34:39 GMT\r\nx-ms-client-request-id: 339d5393-e56d-11e9-8c80-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:jS+sQ29jp/GPf4SIiyCib+NVcI9R9fcaHs8seL/csLw=\r\n\r\n\r\n--===============5308695583842449546==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nPUT + /container3d7c19c7/blob3?comp=tier HTTP/1.1\r\nContent-Length: 0\r\nx-ms-access-tier: + Hot\r\nx-ms-date: Wed, 02 Oct 2019 23:34:39 GMT\r\nx-ms-client-request-id: 339d7ae8-e56d-11e9-8a88-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:zbgDbDKApE1bOVrD67DNARCB6ADMz371RZcEXpwRPI8=\r\n\r\n\r\n--===============5308695583842449546==--\r\n" + headers: + Content-Length: + - '1281' + Content-Type: + - multipart/mixed; boundary================5308695583842449546== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 339da1b8-e56d-11e9-a989-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_55bf2fbc-6cf3-43b3-b7f7-6b3e79f1a866\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 88f6ede9-901e-009e-4279-796c811e4a8b\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_55bf2fbc-6cf3-43b3-b7f7-6b3e79f1a866\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 88f6ede9-901e-009e-4279-796c811e4a8d\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_55bf2fbc-6cf3-43b3-b7f7-6b3e79f1a866\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 200 OK\r\nx-ms-request-id: + 88f6ede9-901e-009e-4279-796c811e4a8e\r\nx-ms-version: 2019-02-02\r\nServer: + Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_55bf2fbc-6cf3-43b3-b7f7-6b3e79f1a866--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_55bf2fbc-6cf3-43b3-b7f7-6b3e79f1a866 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: 88f6ede9-901e-009e-4279-796c81000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 33af96ba-e56d-11e9-b793-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: HEAD + uri: https://storagename.blob.core.windows.net/container3d7c19c7/blob1 + response: + body: + string: '' + headers: + ? !!python/object/new:multidict._istr.istr + - Accept-Ranges + : bytes + ? !!python/object/new:multidict._istr.istr + - Content-Length + : '11' + ? !!python/object/new:multidict._istr.istr + - Content-Md5 + : XrY7u+Ae7tCTyyK7j1rNww== + ? !!python/object/new:multidict._istr.istr + - Content-Type + : application/octet-stream + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Etag + : '"0x8D74791176A4362"' + ? !!python/object/new:multidict._istr.istr + - Last-Modified + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Hot + x-ms-access-tier-change-time: Wed, 02 Oct 2019 23:34:38 GMT + x-ms-blob-type: BlockBlob + x-ms-creation-time: Wed, 02 Oct 2019 23:34:38 GMT + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: 88f6edfc-901e-009e-5379-796c81000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2019-02-02' + status: + code: 200 + message: OK + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - /container3d7c19c7/blob1 + - '' + - '' +- request: + body: "--===============7945161974409073757==\r\nContent-Type: application/http\r\nContent-Transfer-Encoding: + binary\r\nContent-ID: 0\r\n\r\nDELETE /container3d7c19c7/blob1? HTTP/1.1\r\nx-ms-date: + Wed, 02 Oct 2019 23:34:39 GMT\r\nx-ms-client-request-id: 33b48407-e56d-11e9-b0f2-1831bf6ae40e\r\nAuthorization: + SharedKey storagename:/a55a5lsjdYZH/P4BP8+lIEVg7081pVLBbc6PpOeT/A=\r\n\r\n\r\n--===============7945161974409073757==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 1\r\n\r\nDELETE + /container3d7c19c7/blob2? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:39 GMT\r\nx-ms-client-request-id: + 33b48406-e56d-11e9-a2f1-1831bf6ae40e\r\nAuthorization: SharedKey storagename:hElc6IUrPeXujnB6wgiYK0sNnswHh5tCFsVJs7CN6DM=\r\n\r\n\r\n--===============7945161974409073757==\r\nContent-Type: + application/http\r\nContent-Transfer-Encoding: binary\r\nContent-ID: 2\r\n\r\nDELETE + /container3d7c19c7/blob3? HTTP/1.1\r\nx-ms-date: Wed, 02 Oct 2019 23:34:39 GMT\r\nx-ms-client-request-id: + 33b48408-e56d-11e9-ac61-1831bf6ae40e\r\nAuthorization: SharedKey storagename:3PdTre1M5TkyIu9t5eKepJ96YdCN4oJQKGVoqs0gPyM=\r\n\r\n\r\n--===============7945161974409073757==--\r\n" + headers: + Content-Length: + - '1137' + Content-Type: + - multipart/mixed; boundary================7945161974409073757== + User-Agent: + - azsdk-python-storage-blob/12.0.0b4 Python/3.6.3 (Windows-10-10.0.18362-SP0) + x-ms-client-request-id: + - 33b4d222-e56d-11e9-a947-1831bf6ae40e + x-ms-date: + - Wed, 02 Oct 2019 23:34:39 GMT + x-ms-version: + - '2019-02-02' + method: POST + uri: https://storagename.blob.core.windows.net/?comp=batch + response: + body: + string: "--batchresponse_9d6d9a0c-eba6-4b69-966f-c5a214183f04\r\nContent-Type: + application/http\r\nContent-ID: 0\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: ea41c276-901e-0055-5b79-796fd41ed228\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_9d6d9a0c-eba6-4b69-966f-c5a214183f04\r\nContent-Type: + application/http\r\nContent-ID: 1\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: ea41c276-901e-0055-5b79-796fd41ed22a\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_9d6d9a0c-eba6-4b69-966f-c5a214183f04\r\nContent-Type: + application/http\r\nContent-ID: 2\r\n\r\nHTTP/1.1 202 Accepted\r\nx-ms-delete-type-permanent: + true\r\nx-ms-request-id: ea41c276-901e-0055-5b79-796fd41ed22b\r\nx-ms-version: + 2019-02-02\r\nServer: Windows-Azure-Blob/1.0\r\n\r\n--batchresponse_9d6d9a0c-eba6-4b69-966f-c5a214183f04--" + headers: + ? !!python/object/new:multidict._istr.istr + - Content-Type + : multipart/mixed; boundary=batchresponse_9d6d9a0c-eba6-4b69-966f-c5a214183f04 + ? !!python/object/new:multidict._istr.istr + - Date + : Wed, 02 Oct 2019 23:34:38 GMT + ? !!python/object/new:multidict._istr.istr + - Server + : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + ? !!python/object/new:multidict._istr.istr + - Transfer-Encoding + : chunked + x-ms-request-id: ea41c276-901e-0055-5b79-796fd4000000 + x-ms-version: '2019-02-02' + status: + code: 202 + message: Accepted + url: !!python/object/new:yarl.URL + state: !!python/tuple + - !!python/object/new:urllib.parse.SplitResult + - https + - lmazueltracingtest.blob.core.windows.net + - / + - comp=batch + - '' +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/test_container.py b/sdk/storage/azure-storage-blob/tests/test_container.py index 1e02d20e4b4a..cf707fe22095 100644 --- a/sdk/storage/azure-storage-blob/tests/test_container.py +++ b/sdk/storage/azure-storage-blob/tests/test_container.py @@ -7,6 +7,8 @@ # -------------------------------------------------------------------------- import pytest import unittest +import re +import sys from dateutil.tz import tzutc import requests @@ -21,12 +23,16 @@ ContainerPermissions, PublicAccess, ContainerPermissions, - AccessPolicy + AccessPolicy, + StandardBlobTier, + PremiumPageBlobTier ) from azure.identity import ClientSecretCredential from testcase import StorageTestCase, TestMode, record, LogCaptured +import pytest + #------------------------------------------------------------------------------ TEST_CONTAINER_PREFIX = 'container' #------------------------------------------------------------------------------ @@ -862,7 +868,7 @@ def test_list_blobs_with_include_snapshots(self): @record def test_list_blobs_with_include_metadata(self): # Arrange - + container = self._create_container() data = b'hello world' blob1 = container.get_blob_client('blob1') @@ -961,6 +967,165 @@ def test_list_blobs_with_delimiter(self): self.assertNamedItemInContainer(resp, 'b/') self.assertNamedItemInContainer(resp, 'blob4') + @pytest.mark.skipif(sys.version_info < (3, 0), reason="Batch not supported on Python 2.7") + @record + def test_delete_blobs_simple(self): + # Arrange + container = self._create_container() + data = b'hello world' + + try: + container.get_blob_client('blob1').upload_blob(data) + container.get_blob_client('blob2').upload_blob(data) + container.get_blob_client('blob3').upload_blob(data) + except: + pass + + # Act + response = container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + ) + assert len(response) == 3 + assert response[0].status_code == 202 + assert response[1].status_code == 202 + assert response[2].status_code == 202 + + @pytest.mark.skipif(sys.version_info < (3, 0), reason="Batch not supported on Python 2.7") + @record + def test_delete_blobs_snapshot(self): + # Arrange + container = self._create_container() + data = b'hello world' + + try: + blob1_client = container.get_blob_client('blob1') + blob1_client.upload_blob(data) + blob1_client.create_snapshot() + container.get_blob_client('blob2').upload_blob(data) + container.get_blob_client('blob3').upload_blob(data) + except: + pass + blobs = list(container.list_blobs(include='snapshots')) + assert len(blobs) == 4 # 3 blobs + 1 snapshot + + # Act + response = container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + delete_snapshots='only' + ) + assert len(response) == 3 + assert response[0].status_code == 202 + assert response[1].status_code == 404 # There was no snapshot + assert response[2].status_code == 404 # There was no snapshot + + blobs = list(container.list_blobs(include='snapshots')) + assert len(blobs) == 3 # 3 blobs + + @pytest.mark.skipif(sys.version_info < (3, 0), reason="Batch not supported on Python 2.7") + @record + def test_standard_blob_tier_set_tier_api_batch(self): + container = self._create_container() + tiers = [StandardBlobTier.Archive, StandardBlobTier.Cool, StandardBlobTier.Hot] + + response = container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + ) + + for tier in tiers: + blob = container.get_blob_client('blob1') + data = b'hello world' + blob.upload_blob(data) + container.get_blob_client('blob2').upload_blob(data) + container.get_blob_client('blob3').upload_blob(data) + + blob_ref = blob.get_blob_properties() + assert blob_ref.blob_tier is not None + assert blob_ref.blob_tier_inferred + assert blob_ref.blob_tier_change_time is None + + parts = container.set_standard_blob_tier_blobs( + tier, + 'blob1', + 'blob2', + 'blob3', + ) + + parts = list(parts) + assert len(parts) == 3 + + assert parts[0].status_code in [200, 202] + assert parts[1].status_code in [200, 202] + assert parts[2].status_code in [200, 202] + + blob_ref2 = blob.get_blob_properties() + assert tier == blob_ref2.blob_tier + assert not blob_ref2.blob_tier_inferred + assert blob_ref2.blob_tier_change_time is not None + + response = container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + ) + + @pytest.mark.skip(reason="Wasn't able to get premium account with batch enabled") + # once we have premium tests, still we don't want to test Py 2.7 + # @pytest.mark.skipif(sys.version_info < (3, 0), reason="Batch not supported on Python 2.7") + @record + def test_premium_tier_set_tier_api_batch(self): + url = self._get_premium_account_url() + credential = self._get_premium_shared_key_credential() + pbs = BlobServiceClient(url, credential=credential) + + try: + container_name = self.get_resource_name('utpremiumcontainer') + container = pbs.get_container_client(container_name) + + if not self.is_playback(): + try: + container.create_container() + except ResourceExistsError: + pass + + pblob = container.get_blob_client('blob1') + pblob.create_page_blob(1024) + container.get_blob_client('blob2').create_page_blob(1024) + container.get_blob_client('blob3').create_page_blob(1024) + + blob_ref = pblob.get_blob_properties() + assert PremiumPageBlobTier.P10 == blob_ref.blob_tier + assert blob_ref.blob_tier is not None + assert blob_ref.blob_tier_inferred + + parts = container.set_premium_page_blob_tier_blobs( + PremiumPageBlobTier.P50, + 'blob1', + 'blob2', + 'blob3', + ) + + parts = list(parts) + assert len(parts) == 3 + + assert parts[0].status_code in [200, 202] + assert parts[1].status_code in [200, 202] + assert parts[2].status_code in [200, 202] + + + blob_ref2 = pblob.get_blob_properties() + assert PremiumPageBlobTier.P50 == blob_ref2.blob_tier + assert not blob_ref2.blob_tier_inferred + + finally: + container.delete_container() + + @record def test_walk_blobs_with_delimiter(self): # Arrange @@ -990,7 +1155,7 @@ def recursive_walk(prefix): @record def test_list_blobs_with_include_multiple(self): # Arrange - + container = self._create_container() data = b'hello world' blob1 = container.get_blob_client('blob1') diff --git a/sdk/storage/azure-storage-blob/tests/test_container_async.py b/sdk/storage/azure-storage-blob/tests/test_container_async.py index 212cec72043a..3f511f8e60bc 100644 --- a/sdk/storage/azure-storage-blob/tests/test_container_async.py +++ b/sdk/storage/azure-storage-blob/tests/test_container_async.py @@ -29,7 +29,9 @@ BlobType, ContentSettings, BlobProperties, - ContainerPermissions + ContainerPermissions, + StandardBlobTier, + PremiumPageBlobTier ) from testcase import StorageTestCase, TestMode, record, LogCaptured @@ -38,6 +40,13 @@ TEST_CONTAINER_PREFIX = 'container' #------------------------------------------------------------------------------ +async def _to_list(async_iterator): + result = [] + async for item in async_iterator: + result.append(item) + return result + + class AiohttpTestTransport(AioHttpTransport): """Workaround to vcrpy bug: https://github.com/kevin1024/vcrpy/pull/461 """ @@ -95,7 +104,7 @@ async def _create_container(self, prefix=TEST_CONTAINER_PREFIX): return container #--Test cases for containers ----------------------------------------- - + async def _test_create_container(self): # Arrange container_name = self._get_container_reference() @@ -1192,6 +1201,173 @@ async def _test_list_blobs_with_delimiter(self): self.assertNamedItemInContainer(resp, 'b/') self.assertNamedItemInContainer(resp, 'blob4') + @record + def test_delete_blobs_simple(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_delete_blobs_simple()) + + async def _test_delete_blobs_simple(self): + # Arrange + container = await self._create_container() + data = b'hello world' + + try: + await container.get_blob_client('blob1').upload_blob(data) + await container.get_blob_client('blob2').upload_blob(data) + await container.get_blob_client('blob3').upload_blob(data) + except: + pass + + # Act + response = await _to_list(await container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + )) + assert len(response) == 3 + assert response[0].status_code == 202 + assert response[1].status_code == 202 + assert response[2].status_code == 202 + + @record + def test_delete_blobs_snapshot(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_delete_blobs_snapshot()) + + async def _test_delete_blobs_snapshot(self): + # Arrange + container = await self._create_container() + data = b'hello world' + + try: + blob1_client = container.get_blob_client('blob1') + await blob1_client.upload_blob(data) + await blob1_client.create_snapshot() + await container.get_blob_client('blob2').upload_blob(data) + await container.get_blob_client('blob3').upload_blob(data) + except: + pass + blobs = await _to_list(container.list_blobs(include='snapshots')) + assert len(blobs) == 4 # 3 blobs + 1 snapshot + + # Act + response = await _to_list(await container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + delete_snapshots='only' + )) + assert len(response) == 3 + assert response[0].status_code == 202 + assert response[1].status_code == 404 # There was no snapshot + assert response[2].status_code == 404 # There was no snapshot + + blobs = await _to_list(container.list_blobs(include='snapshots')) + assert len(blobs) == 3 # 3 blobs + + @record + def test_standard_blob_tier_set_tier_api_batch(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_standard_blob_tier_set_tier_api_batch()) + + async def _test_standard_blob_tier_set_tier_api_batch(self): + container = await self._create_container() + tiers = [StandardBlobTier.Archive, StandardBlobTier.Cool, StandardBlobTier.Hot] + + for tier in tiers: + try: + blob = container.get_blob_client('blob1') + data = b'hello world' + await blob.upload_blob(data) + await container.get_blob_client('blob2').upload_blob(data) + await container.get_blob_client('blob3').upload_blob(data) + + blob_ref = await blob.get_blob_properties() + assert blob_ref.blob_tier is not None + assert blob_ref.blob_tier_inferred + assert blob_ref.blob_tier_change_time is None + + parts = await _to_list(await container.set_standard_blob_tier_blobs( + tier, + 'blob1', + 'blob2', + 'blob3', + )) + + assert len(parts) == 3 + + assert parts[0].status_code in [200, 202] + assert parts[1].status_code in [200, 202] + assert parts[2].status_code in [200, 202] + + blob_ref2 = await blob.get_blob_properties() + assert tier == blob_ref2.blob_tier + assert not blob_ref2.blob_tier_inferred + assert blob_ref2.blob_tier_change_time is not None + + finally: + await container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + ) + + @pytest.mark.skip(reason="Wasn't able to get premium account with batch enabled") + @record + def test_premium_tier_set_tier_api_batch(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_premium_tier_set_tier_api_batch()) + + async def _test_premium_tier_set_tier_api_batch(self): + url = self._get_premium_account_url() + credential = self._get_premium_shared_key_credential() + pbs = BlobServiceClient(url, credential=credential) + + try: + container_name = self.get_resource_name('utpremiumcontainer') + container = pbs.get_container_client(container_name) + + if not self.is_playback(): + try: + await container.create_container() + except ResourceExistsError: + pass + + pblob = container.get_blob_client('blob1') + await pblob.create_page_blob(1024) + await container.get_blob_client('blob2').create_page_blob(1024) + await container.get_blob_client('blob3').create_page_blob(1024) + + blob_ref = await pblob.get_blob_properties() + assert PremiumPageBlobTier.P10 == blob_ref.blob_tier + assert blob_ref.blob_tier is not None + assert blob_ref.blob_tier_inferred + + parts = await _to_list(container.set_premium_page_blob_tier_blobs( + PremiumPageBlobTier.P50, + 'blob1', + 'blob2', + 'blob3', + )) + + assert len(parts) == 3 + + assert parts[0].status_code in [200, 202] + assert parts[1].status_code in [200, 202] + assert parts[2].status_code in [200, 202] + + + blob_ref2 = await pblob.get_blob_properties() + assert PremiumPageBlobTier.P50 == blob_ref2.blob_tier + assert not blob_ref2.blob_tier_inferred + + finally: + await container.delete_blobs( + 'blob1', + 'blob2', + 'blob3', + ) + @record def test_list_blobs_with_delimiter(self): loop = asyncio.get_event_loop() diff --git a/sdk/storage/azure-storage-blob/tests/testcase.py b/sdk/storage/azure-storage-blob/tests/testcase.py index 3304b2ed3638..5a171f0395ae 100644 --- a/sdk/storage/azure-storage-blob/tests/testcase.py +++ b/sdk/storage/azure-storage-blob/tests/testcase.py @@ -10,6 +10,7 @@ import inspect import os import os.path +import re import time from unittest import SkipTest @@ -348,6 +349,12 @@ def internal_scrub(key, val): if body_str: response['body']['string'] = self._scrub(body_str) + content_type = response.get('headers', {}).get('Content-Type', '') + if content_type: + content_type = (content_type[0] if isinstance(content_type, list) else content_type).lower() + if 'multipart/mixed' in content_type: + response['body']['string'] = re.sub("x-ms-client-request-id: [a-f0-9-]+\r\n", "", body_str.decode()).encode() + return response def _scrub(self, val): diff --git a/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client.py b/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client.py index 226626d026e1..f784ac130cf9 100644 --- a/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client.py +++ b/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client.py @@ -26,6 +26,7 @@ import six from azure.core import Configuration +from azure.core.exceptions import HttpResponseError from azure.core.pipeline import Pipeline from azure.core.pipeline.transport import RequestsTransport from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy @@ -46,6 +47,8 @@ QueueMessagePolicy, ExponentialRetry, ) +from .._generated.models import StorageErrorException +from .response_handlers import process_storage_error _LOGGER = logging.getLogger(__name__) @@ -147,11 +150,11 @@ def _format_query_string(self, sas_token, credential, snapshot=None, share_snaps def _create_pipeline(self, credential, **kwargs): # type: (Any, **Any) -> Tuple[Configuration, Pipeline] - credential_policy = None + self._credential_policy = None if hasattr(credential, "get_token"): - credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + self._credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) elif isinstance(credential, SharedKeyCredentialPolicy): - credential_policy = credential + self._credential_policy = credential elif credential is not None: raise TypeError("Unsupported credential: {}".format(credential)) @@ -169,7 +172,7 @@ def _create_pipeline(self, credential, **kwargs): config.user_agent_policy, StorageContentValidation(), StorageRequestHook(**kwargs), - credential_policy, + self._credential_policy, ContentDecodePolicy(), RedirectPolicy(**kwargs), StorageHosts(hosts=self._hosts, **kwargs), @@ -180,6 +183,38 @@ def _create_pipeline(self, credential, **kwargs): ] return config, Pipeline(config.transport, policies=policies) + def _batch_send( + self, *reqs # type: HttpRequest + ): + """Given a series of request, do a Storage batch call. + """ + request = self._client._client.post( # pylint: disable=protected-access + url='https://{}/?comp=batch'.format(self.primary_hostname), + headers={ + 'x-ms-version': self._client._config.version # pylint: disable=protected-access + } + ) + + request.set_multipart_mixed( + *reqs, + policies=[ + StorageHeadersPolicy(), + self._credential_policy + ] + ) + + pipeline_response = self._pipeline.run( + request, + ) + response = pipeline_response.http_response + + try: + if response.status_code not in [202]: + raise HttpResponseError(response=response) + return response.parts() + except StorageErrorException as error: + process_storage_error(error) + def format_shared_key_credential(account, credential): if isinstance(credential, six.string_types): diff --git a/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client_async.py b/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client_async.py index 19a27ba24eb0..bdcaba15d86f 100644 --- a/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client_async.py +++ b/sdk/storage/azure-storage-file/azure/storage/file/_shared/base_client_async.py @@ -11,6 +11,7 @@ import logging from azure.core.pipeline import AsyncPipeline +from azure.core.exceptions import HttpResponseError from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy from azure.core.pipeline.policies import ( ContentDecodePolicy, @@ -24,9 +25,13 @@ StorageContentValidation, StorageRequestHook, StorageHosts, + StorageHeadersPolicy, QueueMessagePolicy) from .policies_async import AsyncStorageResponseHook +from .._generated.models import StorageErrorException +from .response_handlers import process_storage_error + if TYPE_CHECKING: from azure.core.pipeline import Pipeline from azure.core import Configuration @@ -50,11 +55,11 @@ async def __aexit__(self, *args): def _create_pipeline(self, credential, **kwargs): # type: (Any, **Any) -> Tuple[Configuration, Pipeline] - credential_policy = None + self._credential_policy = None if hasattr(credential, 'get_token'): - credential_policy = AsyncBearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + self._credential_policy = AsyncBearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) elif isinstance(credential, SharedKeyCredentialPolicy): - credential_policy = credential + self._credential_policy = credential elif credential is not None: raise TypeError("Unsupported credential: {}".format(credential)) config = kwargs.get('_configuration') or create_configuration(**kwargs) @@ -75,7 +80,7 @@ def _create_pipeline(self, credential, **kwargs): config.user_agent_policy, StorageContentValidation(), StorageRequestHook(**kwargs), - credential_policy, + self._credential_policy, ContentDecodePolicy(), AsyncRedirectPolicy(**kwargs), StorageHosts(hosts=self._hosts, **kwargs), # type: ignore @@ -85,3 +90,35 @@ def _create_pipeline(self, credential, **kwargs): DistributedTracingPolicy(), ] return config, AsyncPipeline(config.transport, policies=policies) + + async def _batch_send( + self, *reqs # type: HttpRequest + ): + """Given a series of request, do a Storage batch call. + """ + request = self._client._client.post( # pylint: disable=protected-access + url='https://{}/?comp=batch'.format(self.primary_hostname), + headers={ + 'x-ms-version': self._client._config.version # pylint: disable=protected-access + } + ) + + request.set_multipart_mixed( + *reqs, + policies=[ + StorageHeadersPolicy(), + self._credential_policy + ] + ) + + pipeline_response = await self._pipeline.run( + request, + ) + response = pipeline_response.http_response + + try: + if response.status_code not in [202]: + raise HttpResponseError(response=response) + return response.parts() # Return an AsyncIterator + except StorageErrorException as error: + process_storage_error(error) diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client.py index 226626d026e1..f784ac130cf9 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client.py @@ -26,6 +26,7 @@ import six from azure.core import Configuration +from azure.core.exceptions import HttpResponseError from azure.core.pipeline import Pipeline from azure.core.pipeline.transport import RequestsTransport from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy @@ -46,6 +47,8 @@ QueueMessagePolicy, ExponentialRetry, ) +from .._generated.models import StorageErrorException +from .response_handlers import process_storage_error _LOGGER = logging.getLogger(__name__) @@ -147,11 +150,11 @@ def _format_query_string(self, sas_token, credential, snapshot=None, share_snaps def _create_pipeline(self, credential, **kwargs): # type: (Any, **Any) -> Tuple[Configuration, Pipeline] - credential_policy = None + self._credential_policy = None if hasattr(credential, "get_token"): - credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + self._credential_policy = BearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) elif isinstance(credential, SharedKeyCredentialPolicy): - credential_policy = credential + self._credential_policy = credential elif credential is not None: raise TypeError("Unsupported credential: {}".format(credential)) @@ -169,7 +172,7 @@ def _create_pipeline(self, credential, **kwargs): config.user_agent_policy, StorageContentValidation(), StorageRequestHook(**kwargs), - credential_policy, + self._credential_policy, ContentDecodePolicy(), RedirectPolicy(**kwargs), StorageHosts(hosts=self._hosts, **kwargs), @@ -180,6 +183,38 @@ def _create_pipeline(self, credential, **kwargs): ] return config, Pipeline(config.transport, policies=policies) + def _batch_send( + self, *reqs # type: HttpRequest + ): + """Given a series of request, do a Storage batch call. + """ + request = self._client._client.post( # pylint: disable=protected-access + url='https://{}/?comp=batch'.format(self.primary_hostname), + headers={ + 'x-ms-version': self._client._config.version # pylint: disable=protected-access + } + ) + + request.set_multipart_mixed( + *reqs, + policies=[ + StorageHeadersPolicy(), + self._credential_policy + ] + ) + + pipeline_response = self._pipeline.run( + request, + ) + response = pipeline_response.http_response + + try: + if response.status_code not in [202]: + raise HttpResponseError(response=response) + return response.parts() + except StorageErrorException as error: + process_storage_error(error) + def format_shared_key_credential(account, credential): if isinstance(credential, six.string_types): diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client_async.py index 19a27ba24eb0..bdcaba15d86f 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client_async.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_shared/base_client_async.py @@ -11,6 +11,7 @@ import logging from azure.core.pipeline import AsyncPipeline +from azure.core.exceptions import HttpResponseError from azure.core.pipeline.policies.distributed_tracing import DistributedTracingPolicy from azure.core.pipeline.policies import ( ContentDecodePolicy, @@ -24,9 +25,13 @@ StorageContentValidation, StorageRequestHook, StorageHosts, + StorageHeadersPolicy, QueueMessagePolicy) from .policies_async import AsyncStorageResponseHook +from .._generated.models import StorageErrorException +from .response_handlers import process_storage_error + if TYPE_CHECKING: from azure.core.pipeline import Pipeline from azure.core import Configuration @@ -50,11 +55,11 @@ async def __aexit__(self, *args): def _create_pipeline(self, credential, **kwargs): # type: (Any, **Any) -> Tuple[Configuration, Pipeline] - credential_policy = None + self._credential_policy = None if hasattr(credential, 'get_token'): - credential_policy = AsyncBearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) + self._credential_policy = AsyncBearerTokenCredentialPolicy(credential, STORAGE_OAUTH_SCOPE) elif isinstance(credential, SharedKeyCredentialPolicy): - credential_policy = credential + self._credential_policy = credential elif credential is not None: raise TypeError("Unsupported credential: {}".format(credential)) config = kwargs.get('_configuration') or create_configuration(**kwargs) @@ -75,7 +80,7 @@ def _create_pipeline(self, credential, **kwargs): config.user_agent_policy, StorageContentValidation(), StorageRequestHook(**kwargs), - credential_policy, + self._credential_policy, ContentDecodePolicy(), AsyncRedirectPolicy(**kwargs), StorageHosts(hosts=self._hosts, **kwargs), # type: ignore @@ -85,3 +90,35 @@ def _create_pipeline(self, credential, **kwargs): DistributedTracingPolicy(), ] return config, AsyncPipeline(config.transport, policies=policies) + + async def _batch_send( + self, *reqs # type: HttpRequest + ): + """Given a series of request, do a Storage batch call. + """ + request = self._client._client.post( # pylint: disable=protected-access + url='https://{}/?comp=batch'.format(self.primary_hostname), + headers={ + 'x-ms-version': self._client._config.version # pylint: disable=protected-access + } + ) + + request.set_multipart_mixed( + *reqs, + policies=[ + StorageHeadersPolicy(), + self._credential_policy + ] + ) + + pipeline_response = await self._pipeline.run( + request, + ) + response = pipeline_response.http_response + + try: + if response.status_code not in [202]: + raise HttpResponseError(response=response) + return response.parts() # Return an AsyncIterator + except StorageErrorException as error: + process_storage_error(error)