Skip to content

Commit

Permalink
Storage options
Browse files Browse the repository at this point in the history
  • Loading branch information
lmazuel committed Sep 30, 2019
1 parent 0d0752a commit 3f3769d
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
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
from azure.core.exceptions import HttpResponseError

from .._shared.base_client_async import AsyncStorageAccountHostsMixin
from .._shared.policies import StorageHeadersPolicy
Expand Down Expand Up @@ -830,18 +832,23 @@ async def delete_blobs(
The timeout parameter is expressed in seconds.
:rtype: None
"""
from azure.core.pipeline.transport import HttpRequest, HttpResponse, RequestsTransport
from azure.core.pipeline.policies import HeadersPolicy
from azure.core.exceptions import map_error, HttpResponseError
options = BlobClient._generic_delete_blob_options(
delete_snapshots=delete_snapshots,
lease=lease,
timeout=timeout,
**kwargs
)
query_parameters, header_parameters = self._generate_delete_blobs_options(**options)

reqs = []
for blob in blobs:
reqs.append(HttpRequest(
req = HttpRequest(
"DELETE",
"/{}/{}".format(self.container_name, blob),
headers={
'Content-Length': '0'
}
))
headers=header_parameters
)
req.format_parameters(query_parameters)
reqs.append(req)

request = self._client._client.post(
url='https://{}/?comp=batch'.format(self.primary_hostname),
Expand Down
14 changes: 10 additions & 4 deletions sdk/storage/azure-storage-blob/azure/storage/blob/blob_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -670,27 +670,33 @@ 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(
if_modified_since=kwargs.pop('if_modified_since', None),
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

from azure.core.paging import ItemPaged
from azure.core.tracing.decorator import distributed_trace
from azure.core.pipeline.transport import HttpRequest
from azure.core.exceptions import HttpResponseError

from ._shared.base_client import StorageAccountHostsMixin, parse_connection_str, parse_query
from ._shared.request_handlers import add_metadata_headers, serialize_iso
Expand Down Expand Up @@ -944,6 +946,49 @@ 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):
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')
if timeout is not None:
query_parameters['timeout'] = self._client._serialize.query("timeout", timeout, 'int', minimum=0)

# Construct headers
header_parameters = {}
if delete_snapshots is not None:
header_parameters['x-ms-delete-snapshots'] = self._client._serialize.header("delete_snapshots", delete_snapshots, 'DeleteSnapshotsOptionType')
if request_id is not None:
header_parameters['x-ms-client-request-id'] = self._client._serialize.header("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')
if if_modified_since is not None:
header_parameters['If-Modified-Since'] = self._client._serialize.header("if_modified_since", if_modified_since, 'rfc-1123')
if if_unmodified_since is not None:
header_parameters['If-Unmodified-Since'] = self._client._serialize.header("if_unmodified_since", if_unmodified_since, 'rfc-1123')
if if_match is not None:
header_parameters['If-Match'] = self._client._serialize.header("if_match", if_match, 'str')
if if_none_match is not None:
header_parameters['If-None-Match'] = self._client._serialize.header("if_none_match", if_none_match, 'str')

return query_parameters, header_parameters

@distributed_trace
def delete_blobs(
self, *blobs, # type: Union[str, BlobProperties]
Expand Down Expand Up @@ -1006,18 +1051,23 @@ def delete_blobs(
The timeout parameter is expressed in seconds.
:rtype: None
"""
from azure.core.pipeline.transport import HttpRequest, HttpResponse, RequestsTransport
from azure.core.pipeline.policies import HeadersPolicy
from azure.core.exceptions import map_error, HttpResponseError
options = BlobClient._generic_delete_blob_options(
delete_snapshots=delete_snapshots,
lease=lease,
timeout=timeout,
**kwargs
)
query_parameters, header_parameters = self._generate_delete_blobs_options(**options)

reqs = []
for blob in blobs:
reqs.append(HttpRequest(
req = HttpRequest(
"DELETE",
"/{}/{}".format(self.container_name, blob),
headers={
'Content-Length': '0'
}
))
headers=header_parameters
)
req.format_parameters(query_parameters)
reqs.append(req)

request = self._client._client.post(
url='https://{}/?comp=batch'.format(self.primary_hostname),
Expand Down

0 comments on commit 3f3769d

Please sign in to comment.