Skip to content
Draft
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
49 changes: 23 additions & 26 deletions src/azure-cli/azure/cli/command_modules/storage/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem

from azure.cli.core.commands.parameters import get_resource_name_completion_list

from .completers import get_storage_name_completion_list
from .completers import get_storage_name_completion_list, get_storage_name_completion_list_track2
from ._client_factory import cf_blob_service, cf_container_client, cf_share_client

t_base_blob_service = self.get_sdk('blob.baseblobservice#BaseBlobService')
t_file_service = self.get_sdk('file#FileService')
t_share_service = self.get_sdk('_share_service_client#ShareServiceClient',
resource_type=ResourceType.DATA_STORAGE_FILESHARE)
t_queue_service = self.get_sdk('_queue_service_client#QueueServiceClient',
Expand All @@ -55,20 +54,18 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem
local_context_attribute=LocalContextAttribute(
name='storage_account_name', actions=[LocalContextAction.GET]))
blob_name_type = CLIArgumentType(options_list=['--blob-name', '-b'], help='The blob name.',
completer=get_storage_name_completion_list(t_base_blob_service, 'list_blobs',
parent='container_name'))
completer=get_storage_name_completion_list_track2(
cf_container_client, 'list_blobs', required='container_name'))

container_name_type = CLIArgumentType(options_list=['--container-name', '-c'], help='The container name.',
completer=get_storage_name_completion_list(t_base_blob_service,
'list_containers'))
completer=get_storage_name_completion_list_track2(
cf_blob_service, 'list_containers'))
directory_type = CLIArgumentType(options_list=['--directory-name', '-d'], help='The directory name.',
completer=get_storage_name_completion_list(t_file_service,
'list_directories_and_files',
parent='share_name'))
completer=get_storage_name_completion_list_track2(
cf_share_client, 'list_directories_and_files', required='share_name'))
file_name_type = CLIArgumentType(options_list=['--file-name', '-f'],
completer=get_storage_name_completion_list(t_file_service,
'list_directories_and_files',
parent='share_name'))
completer=get_storage_name_completion_list_track2(
cf_share_client, 'list_directories_and_files', required='share_name'))
share_name_type = CLIArgumentType(options_list=['--share-name', '-s'], help='The file share name.',
completer=get_storage_name_completion_list(t_share_service, 'list_shares'))
table_name_type = CLIArgumentType(options_list=['--table-name', '-t'], help='The table name.',
Expand Down Expand Up @@ -978,7 +975,7 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem
help='Show nextMarker in result when specified.')

with self.argument_context('storage blob generate-sas', resource_type=ResourceType.DATA_STORAGE_BLOB) as c:
from .completers import get_storage_acl_name_completion_list
from .completers import get_storage_acl_name_completion_list_track2

t_blob_permissions = self.get_sdk('_models#BlobSasPermissions', resource_type=ResourceType.DATA_STORAGE_BLOB)
c.register_sas_arguments()
Expand All @@ -1001,8 +998,8 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem
"The expiry parameter and '--auth-mode login' are required if this argument is specified. ")
c.argument('id', options_list='--policy-name', validator=validate_policy,
help='The name of a stored access policy within the container\'s ACL.',
completer=get_storage_acl_name_completion_list(t_base_blob_service, 'container_name',
'get_access_policy'))
completer=get_storage_acl_name_completion_list_track2(
cf_container_client, 'get_container_access_policy', required='container_name'))
c.argument('permission', options_list='--permissions',
help=sas_help.format(get_permission_help_string(t_blob_permissions)),
validator=get_permission_validator(t_blob_permissions))
Expand Down Expand Up @@ -1694,13 +1691,13 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem
"cannot be modified or deleted.")

with self.argument_context('storage container policy') as c:
from .completers import get_storage_acl_name_completion_list
from .completers import get_storage_acl_name_completion_list_track2
t_container_permissions = self.get_sdk('_models#ContainerSasPermissions',
resource_type=ResourceType.DATA_STORAGE_BLOB)
c.argument('container_name', container_name_type)
c.argument('policy_name', options_list=('--name', '-n'), help='The stored access policy name.',
completer=get_storage_acl_name_completion_list(t_base_blob_service, 'container_name',
'get_access_policy'))
completer=get_storage_acl_name_completion_list_track2(
cf_container_client, 'get_container_access_policy', required='container_name'))
help_str = 'Allowed values: {}. Can be combined'.format(get_permission_help_string(t_container_permissions))
c.argument('permission', options_list='--permissions', help=help_str,
validator=get_permission_validator(t_container_permissions))
Expand All @@ -1720,14 +1717,14 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem
'Environment variable: AZURE_STORAGE_AUTH_MODE')

with self.argument_context('storage container generate-sas', resource_type=ResourceType.DATA_STORAGE_BLOB) as c:
from .completers import get_storage_acl_name_completion_list
from .completers import get_storage_acl_name_completion_list_track2
t_container_permissions = self.get_sdk('_models#ContainerSasPermissions',
resource_type=ResourceType.DATA_STORAGE_BLOB)
c.register_sas_arguments()
c.argument('id', options_list='--policy-name', validator=validate_policy,
help='The name of a stored access policy within the container\'s ACL.',
completer=get_storage_acl_name_completion_list(t_base_blob_service, 'container_name',
'get_access_policy'))
completer=get_storage_acl_name_completion_list_track2(
cf_container_client, 'get_container_access_policy', required='container_name'))
c.argument('permission', options_list='--permissions',
help=sas_help.format(get_permission_help_string(t_container_permissions)),
validator=get_permission_validator(t_container_permissions))
Expand Down Expand Up @@ -2208,17 +2205,17 @@ def load_arguments(self, _): # pylint: disable=too-many-locals, too-many-statem
c.extra('snapshot', help="A string that represents the snapshot version, if applicable.")

with self.argument_context('storage file generate-sas') as c:
from .completers import get_storage_acl_name_completion_list
from .completers import get_storage_acl_name_completion_list_track2

c.register_path_argument()
c.register_sas_arguments()
c.extra('share_name', share_name_type, required=True)
t_file_svc = self.get_sdk('file.fileservice#FileService')
t_file_permissions = self.get_sdk('_models#FileSasPermissions',
resource_type=ResourceType.DATA_STORAGE_FILESHARE)
c.argument('id', options_list='--policy-name',
help='The name of a stored access policy within the container\'s ACL.',
completer=get_storage_acl_name_completion_list(t_file_svc, 'container_name', 'get_container_acl'))
help='The name of a stored access policy within the file share\'s ACL.',
completer=get_storage_acl_name_completion_list_track2(
cf_share_client, 'get_share_access_policy', required='share_name'))
c.argument('permission', options_list='--permissions',
help=sas_help.format(get_permission_help_string(t_file_permissions)),
validator=get_permission_validator(t_file_permissions))
Expand Down
43 changes: 43 additions & 0 deletions src/azure-cli/azure/cli/command_modules/storage/completers.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,30 @@ def completer(cmd, _, namespace):
return completer


def _get_track2_client(cmd, namespace, client_factory, required=None):
if required and not getattr(namespace, required, None):
return None
validate_client_parameters(cmd, namespace)
return client_factory(cmd.cli_ctx, vars(namespace).copy())


def _get_name(item):
if isinstance(item, dict):
return item.get('name')
return getattr(item, 'name', None)


def get_storage_name_completion_list_track2(client_factory, func, required=None):
@Completer
def completer(cmd, _, namespace):
client = _get_track2_client(cmd, namespace, client_factory, required=required)
if not client:
return []
return sorted(x for x in (_get_name(item) for item in getattr(client, func)()) if x)

return completer


def get_storage_acl_name_completion_list(service, container_param, func):
@Completer
def completer(cmd, _, namespace):
Expand All @@ -97,3 +121,22 @@ def completer(cmd, _, namespace):
return list(getattr(client, func)(container_name))

return completer


def _get_policy_id(item):
if isinstance(item, dict):
return item.get('id')
return getattr(item, 'id', None)


def get_storage_acl_name_completion_list_track2(client_factory, func, required=None):
@Completer
def completer(cmd, _, namespace):
client = _get_track2_client(cmd, namespace, client_factory, required=required)
if not client:
return []
policy = getattr(client, func)()
identifiers = policy.get('signed_identifiers', []) if isinstance(policy, dict) else policy
return sorted(x for x in (_get_policy_id(item) for item in identifiers or []) if x)

return completer
Loading