Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions sdk/storage/azure-storage-blob/HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
- `set_container_access_policy` has required parameter `signed_identifiers`.
- NoRetry policy has been removed. Use keyword argument `retry_total=0` for no retries.

**New features**

- `ResourceTypes`, and `Services` now have method `from_string` which takes parameters as a string.

## Version 12.0.0b4:

Expand Down Expand Up @@ -44,6 +47,8 @@ changed include:
- Add support for set_premium_page_blob_tier_blobs to ContainerClient (Python 3 only)
- Added support to set rehydrate blob priority for Block Blob, including Set Standard Blob Tier/Copy Blob APIs
- Added blob tier support for Block Blob, including Upload Blob/Commit Block List/Copy Blob APIs.
- `AccountSasPermissions`, `BlobSasPermissions`, `ContainerSasPermissions` now have method `from_string`
which takes parameters as a string.

**Fixes and improvements**
- Downloading page blobs now take advantage of their sparseness.
Expand Down
92 changes: 31 additions & 61 deletions sdk/storage/azure-storage-blob/azure/storage/blob/_shared/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,16 +225,6 @@ class ResourceTypes(object):
"""
Specifies the resource types that are accessible with the account SAS.

:cvar ResourceTypes ResourceTypes.CONTAINER:
Access to container-level APIs (e.g., Create/Delete Container,
Create/Delete Queue, Create/Delete Share,
List Blobs/Files and Directories)
:cvar ResourceTypes ResourceTypes.OBJECT:
Access to object-level APIs for blobs, queue messages, and
files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.)
:cvar ResourceTypes ResourceTypes.SERVICE:
Access to service-level APIs (e.g., Get/Set Service Properties,
Get Service Stats, List Containers/Queues/Shares)
:param bool service:
Access to service-level APIs (e.g., Get/Set Service Properties,
Get Service Stats, List Containers/Queues/Shares)
Expand All @@ -245,36 +235,28 @@ class ResourceTypes(object):
:param bool object:
Access to object-level APIs for blobs, queue messages, and
files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.)
:param str _str:
A string representing the resource types.
"""

SERVICE = None # type: ResourceTypes
CONTAINER = None # type: ResourceTypes
OBJECT = None # type: ResourceTypes

def __init__(self, service=False, container=False, object=False, _str=None): # pylint: disable=redefined-builtin
if not _str:
_str = ''
self.service = service or ('s' in _str)
self.container = container or ('c' in _str)
self.object = object or ('o' in _str)

def __or__(self, other):
return ResourceTypes(_str=str(self) + str(other))

def __add__(self, other):
return ResourceTypes(_str=str(self) + str(other))

def __str__(self):
return (('s' if self.service else '') +
def __init__(self, service=False, container=False, object=False): # pylint: disable=redefined-builtin
self.service = service
self.container = container
self.object = object
self._str = (('s' if self.service else '') +
('c' if self.container else '') +
('o' if self.object else ''))

def __str__(self):
return self._str

@classmethod
def from_string(cls, string):
res_service = 's' in string
res_container = 'c' in string
res_object = 'o' in string

ResourceTypes.SERVICE = ResourceTypes(service=True)
ResourceTypes.CONTAINER = ResourceTypes(container=True)
ResourceTypes.OBJECT = ResourceTypes(object=True)
parsed = cls(res_service, res_container, res_object)
parsed._str = string # pylint: disable = protected-access
return parsed


class AccountSasPermissions(object):
Expand Down Expand Up @@ -348,46 +330,34 @@ def from_string(cls, permission):
class Services(object):
"""Specifies the services accessible with the account SAS.

:cvar Services Services.BLOB: The blob service.
:cvar Services Services.FILE: The file service
:cvar Services Services.QUEUE: The queue service.
:param bool blob:
Access for the `~azure.storage.blob.blob_service_client.BlobServiceClient`
:param bool queue:
Access for the `~azure.storage.queue.queue_service_client.QueueServiceClient`
:param bool file:
Access for the `~azure.storage.file.file_service_client.FileServiceClient`
:param str _str:
A string representing the services.
"""

BLOB = None # type: Services
QUEUE = None # type: Services
FILE = None # type: Services

def __init__(self, blob=False, queue=False, file=False, _str=None):
if not _str:
_str = ''
self.blob = blob or ('b' in _str)
self.queue = queue or ('q' in _str)
self.file = file or ('f' in _str)

def __or__(self, other):
return Services(_str=str(self) + str(other))

def __add__(self, other):
return Services(_str=str(self) + str(other))

def __str__(self):
return (('b' if self.blob else '') +
def __init__(self, blob=False, queue=False, file=False):
self.blob = blob
self.queue = queue
self.file = file
self._str = (('b' if self.blob else '') +
('q' if self.queue else '') +
('f' if self.file else ''))

def __str__(self):
return self._str

Services.BLOB = Services(blob=True)
Services.QUEUE = Services(queue=True)
Services.FILE = Services(file=True)
@classmethod
def from_string(cls, string):
res_blob = 'b' in string
res_queue = 'q' in string
res_file = 'f' in string

parsed = cls(res_blob, res_queue, res_file)
parsed._str = string # pylint: disable = protected-access
return parsed

class UserDelegationKey(object):
"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ def generate_shared_access_signature(

sas = SharedAccessSignature(self.credential.account_name, self.credential.account_key)
return sas.generate_account(
services=Services.BLOB,
services=Services(blob=True),
resource_types=resource_types,
permission=permission,
expiry=expiry,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ def test_auth_shared_access_signature(self):
from azure.storage.blob import ResourceTypes, AccountSasPermissions

sas_token = blob_service_client.generate_shared_access_signature(
resource_types=ResourceTypes.OBJECT,
resource_types=ResourceTypes(object=True),
permission=AccountSasPermissions(read=True),
expiry=datetime.utcnow() + timedelta(hours=1)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ async def _test_auth_shared_access_signature_async(self):
from azure.storage.blob import ResourceTypes, AccountSasPermissions

sas_token = blob_service_client.generate_shared_access_signature(
resource_types=ResourceTypes.OBJECT,
resource_types=ResourceTypes(object=True),
permission=AccountSasPermissions(read=True),
expiry=datetime.utcnow() + timedelta(hours=1)
)
Expand Down
10 changes: 9 additions & 1 deletion sdk/storage/azure-storage-file/HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@

- `file_permission_key` parameter has been renamed to `permission_key`
- `set_share_access_policy` has required parameter `signed_identifiers`.
- NoRetry policy has been removed. Use keyword argument `retry_total=0` for no retries.
- NoRetry policy has been removed. Use keyword argument `retry_total=0` for no retries.

**New features**

- `ResourceTypes`, `NTFSAttributes`, and `Services` now have method `from_string` which takes parameters as a string.

## Version 12.0.0b4:

Expand All @@ -20,6 +23,11 @@
- `__add__` and `__or__` methods are removed.
- `max_connections` is now renamed to `max_concurrency`.

**New features**

- `AccountSasPermissions`, `FileSasPermissions`, `ShareSasPermissions` now have method `from_string` which
takes parameters as a string.

## Version 12.0.0b3:

**New features**
Expand Down
94 changes: 33 additions & 61 deletions sdk/storage/azure-storage-file/azure/storage/file/_shared/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,16 +225,6 @@ class ResourceTypes(object):
"""
Specifies the resource types that are accessible with the account SAS.

:cvar ResourceTypes ResourceTypes.CONTAINER:
Access to container-level APIs (e.g., Create/Delete Container,
Create/Delete Queue, Create/Delete Share,
List Blobs/Files and Directories)
:cvar ResourceTypes ResourceTypes.OBJECT:
Access to object-level APIs for blobs, queue messages, and
files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.)
:cvar ResourceTypes ResourceTypes.SERVICE:
Access to service-level APIs (e.g., Get/Set Service Properties,
Get Service Stats, List Containers/Queues/Shares)
:param bool service:
Access to service-level APIs (e.g., Get/Set Service Properties,
Get Service Stats, List Containers/Queues/Shares)
Expand All @@ -245,36 +235,28 @@ class ResourceTypes(object):
:param bool object:
Access to object-level APIs for blobs, queue messages, and
files(e.g. Put Blob, Query Entity, Get Messages, Create File, etc.)
:param str _str:
A string representing the resource types.
"""

SERVICE = None # type: ResourceTypes
CONTAINER = None # type: ResourceTypes
OBJECT = None # type: ResourceTypes

def __init__(self, service=False, container=False, object=False, _str=None): # pylint: disable=redefined-builtin
if not _str:
_str = ''
self.service = service or ('s' in _str)
self.container = container or ('c' in _str)
self.object = object or ('o' in _str)

def __or__(self, other):
return ResourceTypes(_str=str(self) + str(other))

def __add__(self, other):
return ResourceTypes(_str=str(self) + str(other))

def __str__(self):
return (('s' if self.service else '') +
def __init__(self, service=False, container=False, object=False): # pylint: disable=redefined-builtin
self.service = service
self.container = container
self.object = object
self._str = (('s' if self.service else '') +
('c' if self.container else '') +
('o' if self.object else ''))

def __str__(self):
return self._str

@classmethod
def from_string(cls, string):
res_service = 's' in string
res_container = 'c' in string
res_object = 'o' in string

ResourceTypes.SERVICE = ResourceTypes(service=True)
ResourceTypes.CONTAINER = ResourceTypes(container=True)
ResourceTypes.OBJECT = ResourceTypes(object=True)
parsed = cls(res_service, res_container, res_object)
parsed._str = string # pylint: disable = protected-access
return parsed


class AccountSasPermissions(object):
Expand All @@ -285,6 +267,7 @@ class AccountSasPermissions(object):
specific resource (resource-specific). Another is to grant access to the
entire service for a specific account and allow certain operations based on
perms found here.

:param bool read:
Valid for all signed resources types (Service, Container, and Object).
Permits read permissions to the specified resource type.
Expand Down Expand Up @@ -346,45 +329,34 @@ def from_string(cls, permission):
class Services(object):
"""Specifies the services accessible with the account SAS.

:cvar Services Services.BLOB: The blob service.
:cvar Services Services.FILE: The file service
:cvar Services Services.QUEUE: The queue service.
:param bool blob:
Access for the `~azure.storage.blob.blob_service_client.BlobServiceClient`
:param bool queue:
Access for the `~azure.storage.queue.queue_service_client.QueueServiceClient`
:param bool file:
Access for the `~azure.storage.file.file_service_client.FileServiceClient`
:param str _str:
A string representing the services.
"""

BLOB = None # type: Services
QUEUE = None # type: Services
FILE = None # type: Services

def __init__(self, blob=False, queue=False, file=False, _str=None):
if not _str:
_str = ''
self.blob = blob or ('b' in _str)
self.queue = queue or ('q' in _str)
self.file = file or ('f' in _str)

def __or__(self, other):
return Services(_str=str(self) + str(other))

def __add__(self, other):
return Services(_str=str(self) + str(other))

def __str__(self):
return (('b' if self.blob else '') +
def __init__(self, blob=False, queue=False, file=False):
self.blob = blob
self.queue = queue
self.file = file
self._str = (('b' if self.blob else '') +
('q' if self.queue else '') +
('f' if self.file else ''))

def __str__(self):
return self._str

Services.BLOB = Services(blob=True)
Services.QUEUE = Services(queue=True)
Services.FILE = Services(file=True)
@classmethod
def from_string(cls, string):
res_blob = 'b' in string
res_queue = 'q' in string
res_file = 'f' in string

parsed = cls(res_blob, res_queue, res_file)
parsed._str = string # pylint: disable = protected-access
return parsed


class UserDelegationKey(object):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ def generate_shared_access_signature(

sas = SharedAccessSignature(self.credential.account_name, self.credential.account_key)
return sas.generate_account(
services=Services.FILE,
services=Services(file=True),
resource_types=resource_types,
permission=permission,
expiry=expiry,
Expand Down
Loading