diff --git a/src/azure-cli/azure/cli/command_modules/storage/_params.py b/src/azure-cli/azure/cli/command_modules/storage/_params.py index 6176b6b9e22..7b32bbe0e4e 100644 --- a/src/azure-cli/azure/cli/command_modules/storage/_params.py +++ b/src/azure-cli/azure/cli/command_modules/storage/_params.py @@ -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', @@ -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.', @@ -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() @@ -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)) @@ -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)) @@ -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)) @@ -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)) diff --git a/src/azure-cli/azure/cli/command_modules/storage/completers.py b/src/azure-cli/azure/cli/command_modules/storage/completers.py index acc8b2427cb..e391358e845 100644 --- a/src/azure-cli/azure/cli/command_modules/storage/completers.py +++ b/src/azure-cli/azure/cli/command_modules/storage/completers.py @@ -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): @@ -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