From 697dc176ff623bca6537de031ec791e6ee5b9a56 Mon Sep 17 00:00:00 2001 From: houk-ms Date: Sat, 20 Feb 2021 15:23:55 +0800 Subject: [PATCH 1/6] bump azure-keyvault-administration to 4.0.0b3 --- .../cli/command_modules/keyvault/_params.py | 5 -- .../cli/command_modules/keyvault/commands.py | 4 +- .../cli/command_modules/keyvault/custom.py | 54 +++++++++++++------ .../tests/latest/test_keyvault_commands.py | 22 ++++---- src/azure-cli/requirements.py3.Darwin.txt | 2 +- src/azure-cli/requirements.py3.Linux.txt | 2 +- src/azure-cli/requirements.py3.windows.txt | 2 +- src/azure-cli/setup.py | 2 +- 8 files changed, 55 insertions(+), 38 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/_params.py b/src/azure-cli/azure/cli/command_modules/keyvault/_params.py index d587c20537e..223b0d7b09f 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/_params.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/_params.py @@ -389,7 +389,6 @@ class CLIJsonWebKeyCurveName(str, Enum): with self.argument_context('keyvault key restore', arg_group='Restoring keys from storage account') as c: c.argument('token', options_list=['--storage-container-SAS-token', '-t'], help='The SAS token pointing to an Azure Blob storage container') - c.argument('backup_folder', help='Name of the blob container which contains the backup') c.argument('key_name', options_list=['--name', '-n'], help='Name of the key. (Only for restoring from storage account)') @@ -518,10 +517,6 @@ class CLIJsonWebKeyCurveName(str, Enum): c.argument('token', options_list=['--storage-container-SAS-token', '-t'], required=True, help='The SAS token pointing to an Azure Blob storage container') - with self.argument_context('keyvault restore start') as c: - c.argument('folder_to_restore', options_list=['--backup-folder'], - help='Name of the blob container which contains the backup') - with self.argument_context('keyvault restore start', arg_group='Storage Id') as c: c.extra('storage_resource_uri', required=False, help='Azure Blob storage container Uri. If specified all other \'Storage Id\' ' diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/commands.py b/src/azure-cli/azure/cli/command_modules/keyvault/commands.py index 3b1d32664a0..97e0d558153 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/commands.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/commands.py @@ -128,12 +128,12 @@ def load_command_table(self, _): with self.command_group('keyvault backup', data_backup_entity.command_type, is_preview=True) as g: g.keyvault_custom('start', 'full_backup', - doc_string_source=data_backup_entity.operations_docs_tmpl.format('begin_full_backup')) + doc_string_source=data_backup_entity.operations_docs_tmpl.format('begin_backup')) with self.command_group('keyvault restore', data_backup_entity.command_type, is_preview=True) as g: g.keyvault_custom('start', 'full_restore', - doc_string_source=data_backup_entity.operations_docs_tmpl.format('begin_full_restore')) + doc_string_source=data_backup_entity.operations_docs_tmpl.format('begin_restore')) with self.command_group('keyvault security-domain', private_data_entity.command_type, is_preview=True) as g: diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/custom.py b/src/azure-cli/azure/cli/command_modules/keyvault/custom.py index 0a7eaed116c..bd01c46e97a 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/custom.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/custom.py @@ -1091,9 +1091,9 @@ def backup_key(client, file_path, vault_base_url=None, def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, identifier=None, storage_resource_uri=None, # pylint: disable=unused-argument storage_account_name=None, blob_container_name=None, - token=None, backup_folder=None, key_name=None, no_wait=False): + token=None, key_name=None, no_wait=False): if file_path: - if any([storage_account_name, blob_container_name, token, backup_folder]): + if any([storage_account_name, blob_container_name, token]): raise MutuallyExclusiveArgumentError('Do not use --file/-f with any of --storage-account-name/' '--blob-container-name/--storage-container-SAS-token/--backup-folder') if key_name: @@ -1102,7 +1102,7 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, if no_wait: raise MutuallyExclusiveArgumentError('Please do not specify --no-wait when using --file/-f') - if not file_path and not any([storage_account_name, blob_container_name, token, backup_folder]): + if not file_path and not any([storage_account_name, blob_container_name, token]): raise RequiredArgumentMissingError('Please specify --file/-f or --storage-account-name & ' '--blob-container-name & --storage-container-SAS-token & --backup-folder') @@ -1115,8 +1115,6 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, if not token: raise RequiredArgumentMissingError('Please specify --storage-container-SAS-token/-t') - if not backup_folder: - raise RequiredArgumentMissingError('Please specify --backup-folder') storage_account_parameters_check(storage_resource_uri, storage_account_name, blob_container_name) if not storage_resource_uri: @@ -1127,9 +1125,8 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, ResourceType.DATA_KEYVAULT_ADMINISTRATION_BACKUP)(cmd.cli_ctx, {'hsm_name': hsm_name}) return sdk_no_wait( no_wait, backup_client.begin_selective_restore, - blob_storage_uri=storage_resource_uri, + folder_url=storage_resource_uri, sas_token=token, - folder_name=backup_folder, key_name=key_name ) @@ -1819,14 +1816,14 @@ def _resolve_role_id(client, role, scope): else: all_roles = list_role_definitions(client, scope=scope) for _role in all_roles: - if getattr(_role, 'role_name', None) == role: - role_id = _role.id + if _role.get('roleName', None) == role: + role_id = _role['id'] break return role_id def _get_role_dics(role_defs): - return {i.id: getattr(i, 'role_name', None) for i in role_defs} + return {i['id']: i.get('roleName', None) for i in role_defs} def _get_principal_dics(cli_ctx, role_assignments): @@ -1849,7 +1846,7 @@ def _get_principal_dics(cli_ctx, role_assignments): def _reconstruct_role_assignment(role_dics, principal_dics, role_assignment): ret = { - 'id': role_assignment.assignment_id, + 'id': role_assignment.role_assignment_id, 'name': role_assignment.name, 'scope': role_assignment.scope, 'type': role_assignment.type @@ -2007,12 +2004,39 @@ def list_role_assignments(cmd, client, scope=None, assignee=None, role=None, ass return ret +def _reconstruct_role_definition(role_definition): + ret_permissions = [] + permissions = role_definition.permissions + for permission in permissions: + ret_permissions.append({ + 'actions': permission.allowed_actions, + 'notActions': permission.denied_actions, + 'dataActions': permission.allowed_data_actions, + 'notDataActions': permission.denied_data_actions + }) + + ret = { + 'assignableScopes': role_definition.assignable_scopes, + 'description': role_definition.description, + 'id': role_definition.id, + 'name': role_definition.name, + 'permissions': ret_permissions, + 'roleName': role_definition.role_name, + 'roleType': role_definition.role_type, + 'type': role_definition.type, + } + + return ret + + def list_role_definitions(client, scope=None, hsm_name=None): # pylint: disable=unused-argument """ List role definitions. """ query_scope = scope if query_scope is None: query_scope = '' - return client.list_role_definitions(role_scope=query_scope) + role_definitions = client.list_role_definitions(role_scope=query_scope) + return [_reconstruct_role_definition(role) for role in role_definitions] + # return client.list_role_definitions(role_scope=query_scope) # endregion @@ -2042,16 +2066,16 @@ def full_backup(cmd, client, token, storage_resource_uri=None, storage_account_n if not storage_resource_uri: storage_resource_uri = construct_storage_uri( cmd.cli_ctx.cloud.suffixes.storage_endpoint, storage_account_name, blob_container_name) - return client.begin_full_backup(storage_resource_uri, token) + return client.begin_backup(storage_resource_uri, token) -def full_restore(cmd, client, token, folder_to_restore, storage_resource_uri=None, storage_account_name=None, +def full_restore(cmd, client, token, storage_resource_uri=None, storage_account_name=None, blob_container_name=None, hsm_name=None): # pylint: disable=unused-argument storage_account_parameters_check(storage_resource_uri, storage_account_name, blob_container_name) if not storage_resource_uri: storage_resource_uri = construct_storage_uri( cmd.cli_ctx.cloud.suffixes.storage_endpoint, storage_account_name, blob_container_name) - return client.begin_full_restore(storage_resource_uri, token, folder_to_restore) + return client.begin_restore(storage_resource_uri, token) # endregion diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py b/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py index 7427e33827d..86c6da42245 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py @@ -431,11 +431,11 @@ def test_keyvault_hsm_selective_key_restore(self): checks=[ self.check('status', 'Succeeded'), self.exists('startTime'), - self.exists('id'), - self.exists('azureStorageBlobContainerUri') + self.exists('jobId'), + self.exists('folderUrl') ]).get_output_in_json() - self.kwargs['backup_folder'] = backup_data['azureStorageBlobContainerUri'].split('/')[-1] + self.kwargs['backup_folder'] = backup_data['folderUrl'].split('/')[-1] self.cmd('az keyvault key list --hsm-name {hsm_name}', checks=self.check('length(@)', 1)) self.cmd('az keyvault key delete -n {key_name} --hsm-name {hsm_name}') @@ -445,7 +445,6 @@ def test_keyvault_hsm_selective_key_restore(self): self.cmd('az keyvault key restore --hsm-name {hsm_name} --blob-container-name {blob} ' '--storage-account-name {storage_account} ' '--storage-container-SAS-token "{sas}" ' - '--backup-folder "{backup_folder}" ' '--name {key_name}', checks=self.check('status', 'Succeeded')) self.cmd('az keyvault key list --hsm-name {hsm_name}', checks=[ @@ -481,8 +480,8 @@ def test_keyvault_hsm_full_backup_restore(self): checks=[ self.check('status', 'Succeeded'), self.exists('startTime'), - self.exists('id'), - self.exists('azureStorageBlobContainerUri') + self.exists('jobId'), + self.exists('folderUrl') ]) backup_data = self.cmd('az keyvault backup start --hsm-name {hsm_name} --blob-container-name {blob} ' @@ -491,19 +490,18 @@ def test_keyvault_hsm_full_backup_restore(self): checks=[ self.check('status', 'Succeeded'), self.exists('startTime'), - self.exists('id'), - self.exists('azureStorageBlobContainerUri') + self.exists('jobId'), + self.exists('folderUrl') ]).get_output_in_json() - self.kwargs['backup_folder'] = backup_data['azureStorageBlobContainerUri'].split('/')[-1] + self.kwargs['backup_folder'] = backup_data['folderUrl'].split('/')[-1] self.cmd('az keyvault restore start --hsm-name {hsm_name} --blob-container-name {blob} ' '--storage-account-name {storage_account} ' - '--storage-container-SAS-token "{sas}" ' - '--backup-folder "{backup_folder}"', + '--storage-container-SAS-token "{sas}" ', checks=[ self.check('status', 'Succeeded'), self.exists('startTime'), - self.exists('id') + self.exists('jobId') ]) diff --git a/src/azure-cli/requirements.py3.Darwin.txt b/src/azure-cli/requirements.py3.Darwin.txt index 35b67c4483d..ca3ac88a9e4 100644 --- a/src/azure-cli/requirements.py3.Darwin.txt +++ b/src/azure-cli/requirements.py3.Darwin.txt @@ -14,7 +14,7 @@ azure-datalake-store==0.0.49 azure-functions-devops-build==0.0.22 azure-graphrbac==0.60.0 azure-keyvault==1.1.0 -azure-keyvault-administration==4.0.0b1 +azure-keyvault-administration==4.0.0b3 azure-mgmt-advisor==2.0.1 azure-mgmt-apimanagement==0.2.0 azure-mgmt-appconfiguration==1.0.1 diff --git a/src/azure-cli/requirements.py3.Linux.txt b/src/azure-cli/requirements.py3.Linux.txt index 35b67c4483d..ca3ac88a9e4 100644 --- a/src/azure-cli/requirements.py3.Linux.txt +++ b/src/azure-cli/requirements.py3.Linux.txt @@ -14,7 +14,7 @@ azure-datalake-store==0.0.49 azure-functions-devops-build==0.0.22 azure-graphrbac==0.60.0 azure-keyvault==1.1.0 -azure-keyvault-administration==4.0.0b1 +azure-keyvault-administration==4.0.0b3 azure-mgmt-advisor==2.0.1 azure-mgmt-apimanagement==0.2.0 azure-mgmt-appconfiguration==1.0.1 diff --git a/src/azure-cli/requirements.py3.windows.txt b/src/azure-cli/requirements.py3.windows.txt index 8729c896cd0..2e19b8e1d1e 100644 --- a/src/azure-cli/requirements.py3.windows.txt +++ b/src/azure-cli/requirements.py3.windows.txt @@ -14,7 +14,7 @@ azure-datalake-store==0.0.49 azure-functions-devops-build==0.0.22 azure-graphrbac==0.60.0 azure-keyvault==1.1.0 -azure-keyvault-administration==4.0.0b1 +azure-keyvault-administration==4.0.0b3 azure-mgmt-advisor==2.0.1 azure-mgmt-apimanagement==0.2.0 azure-mgmt-appconfiguration==1.0.1 diff --git a/src/azure-cli/setup.py b/src/azure-cli/setup.py index fd7fe85d19a..cedb119c449 100644 --- a/src/azure-cli/setup.py +++ b/src/azure-cli/setup.py @@ -59,7 +59,7 @@ 'azure-functions-devops-build~=0.0.22', 'azure-graphrbac~=0.60.0', 'azure-keyvault~=1.1.0', - 'azure-keyvault-administration==4.0.0b1', + 'azure-keyvault-administration==4.0.0b3', 'azure-mgmt-advisor>=2.0.1,<3.0.0', 'azure-mgmt-apimanagement~=0.2.0', 'azure-mgmt-applicationinsights~=0.1.1', From 002944423116a94380bc2be728e94162c092a6a0 Mon Sep 17 00:00:00 2001 From: houk-ms Date: Sat, 20 Feb 2021 16:42:13 +0800 Subject: [PATCH 2/6] test bump msrest --- src/azure-cli/requirements.py3.Darwin.txt | 2 +- src/azure-cli/requirements.py3.Linux.txt | 2 +- src/azure-cli/requirements.py3.windows.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/azure-cli/requirements.py3.Darwin.txt b/src/azure-cli/requirements.py3.Darwin.txt index ca3ac88a9e4..4d938b4c52a 100644 --- a/src/azure-cli/requirements.py3.Darwin.txt +++ b/src/azure-cli/requirements.py3.Darwin.txt @@ -106,7 +106,7 @@ jsmin==2.2.2 knack==0.8.0rc2 MarkupSafe==1.1.1 mock==4.0.2 -msrest==0.6.18 +msrest==0.6.21 msrestazure==0.6.3 oauthlib==3.0.1 paramiko==2.6.0 diff --git a/src/azure-cli/requirements.py3.Linux.txt b/src/azure-cli/requirements.py3.Linux.txt index ca3ac88a9e4..4d938b4c52a 100644 --- a/src/azure-cli/requirements.py3.Linux.txt +++ b/src/azure-cli/requirements.py3.Linux.txt @@ -106,7 +106,7 @@ jsmin==2.2.2 knack==0.8.0rc2 MarkupSafe==1.1.1 mock==4.0.2 -msrest==0.6.18 +msrest==0.6.21 msrestazure==0.6.3 oauthlib==3.0.1 paramiko==2.6.0 diff --git a/src/azure-cli/requirements.py3.windows.txt b/src/azure-cli/requirements.py3.windows.txt index 2e19b8e1d1e..21dc706eed5 100644 --- a/src/azure-cli/requirements.py3.windows.txt +++ b/src/azure-cli/requirements.py3.windows.txt @@ -105,7 +105,7 @@ jsmin==2.2.2 knack==0.8.0rc2 MarkupSafe==1.1.1 mock==4.0.2 -msrest==0.6.18 +msrest==0.6.21 msrestazure==0.6.3 oauthlib==3.0.1 paramiko==2.6.0 From 6f5a8f8ecb6b382424792a3d469664a01bdc1dcc Mon Sep 17 00:00:00 2001 From: houk-ms Date: Tue, 23 Feb 2021 16:07:50 +0800 Subject: [PATCH 3/6] avoid command interface breaking changes --- .../azure/cli/core/command_recommender.py | 6 ++++++ .../azure/cli/command_modules/keyvault/_params.py | 5 +++++ .../azure/cli/command_modules/keyvault/custom.py | 14 ++++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/command_recommender.py b/src/azure-cli-core/azure/cli/core/command_recommender.py index a302abbc604..488cd510d1f 100644 --- a/src/azure-cli-core/azure/cli/core/command_recommender.py +++ b/src/azure-cli-core/azure/cli/core/command_recommender.py @@ -160,6 +160,12 @@ def _set_aladdin_recommendations(self): # pylint: disable=too-many-locals "parameters": ','.join(parameters) } + params={ + 'query': json.dumps(query), + 'clientType': 'AzureCli', + 'context': json.dumps(context) + } + print(params) response = None try: response = requests.get( diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/_params.py b/src/azure-cli/azure/cli/command_modules/keyvault/_params.py index 223b0d7b09f..d587c20537e 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/_params.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/_params.py @@ -389,6 +389,7 @@ class CLIJsonWebKeyCurveName(str, Enum): with self.argument_context('keyvault key restore', arg_group='Restoring keys from storage account') as c: c.argument('token', options_list=['--storage-container-SAS-token', '-t'], help='The SAS token pointing to an Azure Blob storage container') + c.argument('backup_folder', help='Name of the blob container which contains the backup') c.argument('key_name', options_list=['--name', '-n'], help='Name of the key. (Only for restoring from storage account)') @@ -517,6 +518,10 @@ class CLIJsonWebKeyCurveName(str, Enum): c.argument('token', options_list=['--storage-container-SAS-token', '-t'], required=True, help='The SAS token pointing to an Azure Blob storage container') + with self.argument_context('keyvault restore start') as c: + c.argument('folder_to_restore', options_list=['--backup-folder'], + help='Name of the blob container which contains the backup') + with self.argument_context('keyvault restore start', arg_group='Storage Id') as c: c.extra('storage_resource_uri', required=False, help='Azure Blob storage container Uri. If specified all other \'Storage Id\' ' diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/custom.py b/src/azure-cli/azure/cli/command_modules/keyvault/custom.py index bd01c46e97a..7e88c962c51 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/custom.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/custom.py @@ -1091,9 +1091,9 @@ def backup_key(client, file_path, vault_base_url=None, def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, identifier=None, storage_resource_uri=None, # pylint: disable=unused-argument storage_account_name=None, blob_container_name=None, - token=None, key_name=None, no_wait=False): + token=None, backup_folder=None, key_name=None, no_wait=False): if file_path: - if any([storage_account_name, blob_container_name, token]): + if any([storage_account_name, blob_container_name, token, backup_folder]): raise MutuallyExclusiveArgumentError('Do not use --file/-f with any of --storage-account-name/' '--blob-container-name/--storage-container-SAS-token/--backup-folder') if key_name: @@ -1102,7 +1102,7 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, if no_wait: raise MutuallyExclusiveArgumentError('Please do not specify --no-wait when using --file/-f') - if not file_path and not any([storage_account_name, blob_container_name, token]): + if not file_path and not any([storage_account_name, blob_container_name, token, backup_folder]): raise RequiredArgumentMissingError('Please specify --file/-f or --storage-account-name & ' '--blob-container-name & --storage-container-SAS-token & --backup-folder') @@ -1115,6 +1115,8 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, if not token: raise RequiredArgumentMissingError('Please specify --storage-container-SAS-token/-t') + if not backup_folder: + raise RequiredArgumentMissingError('Please specify --backup-folder') storage_account_parameters_check(storage_resource_uri, storage_account_name, blob_container_name) if not storage_resource_uri: @@ -1125,7 +1127,7 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, ResourceType.DATA_KEYVAULT_ADMINISTRATION_BACKUP)(cmd.cli_ctx, {'hsm_name': hsm_name}) return sdk_no_wait( no_wait, backup_client.begin_selective_restore, - folder_url=storage_resource_uri, + folder_url=storage_resource_uri + backup_folder, sas_token=token, key_name=key_name ) @@ -2069,13 +2071,13 @@ def full_backup(cmd, client, token, storage_resource_uri=None, storage_account_n return client.begin_backup(storage_resource_uri, token) -def full_restore(cmd, client, token, storage_resource_uri=None, storage_account_name=None, +def full_restore(cmd, client, token, folder_to_restore, storage_resource_uri=None, storage_account_name=None, blob_container_name=None, hsm_name=None): # pylint: disable=unused-argument storage_account_parameters_check(storage_resource_uri, storage_account_name, blob_container_name) if not storage_resource_uri: storage_resource_uri = construct_storage_uri( cmd.cli_ctx.cloud.suffixes.storage_endpoint, storage_account_name, blob_container_name) - return client.begin_restore(storage_resource_uri, token) + return client.begin_restore(storage_resource_uri + folder_to_restore, token) # endregion From 8fc5999cd4c91ca54f520b5e0bb5de733ba6016a Mon Sep 17 00:00:00 2001 From: houk-ms Date: Wed, 24 Feb 2021 11:13:22 +0800 Subject: [PATCH 4/6] update test --- .../keyvault/tests/latest/test_keyvault_commands.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py b/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py index 86c6da42245..41ee9916631 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/tests/latest/test_keyvault_commands.py @@ -445,6 +445,7 @@ def test_keyvault_hsm_selective_key_restore(self): self.cmd('az keyvault key restore --hsm-name {hsm_name} --blob-container-name {blob} ' '--storage-account-name {storage_account} ' '--storage-container-SAS-token "{sas}" ' + '--backup-folder "{backup_folder}" ' '--name {key_name}', checks=self.check('status', 'Succeeded')) self.cmd('az keyvault key list --hsm-name {hsm_name}', checks=[ @@ -497,7 +498,8 @@ def test_keyvault_hsm_full_backup_restore(self): self.kwargs['backup_folder'] = backup_data['folderUrl'].split('/')[-1] self.cmd('az keyvault restore start --hsm-name {hsm_name} --blob-container-name {blob} ' '--storage-account-name {storage_account} ' - '--storage-container-SAS-token "{sas}" ', + '--storage-container-SAS-token "{sas}" ' + '--backup-folder "{backup_folder}"', checks=[ self.check('status', 'Succeeded'), self.exists('startTime'), From e123c7846145ab22ded1bba178fb7724d3de1422 Mon Sep 17 00:00:00 2001 From: houk-ms Date: Wed, 24 Feb 2021 11:14:46 +0800 Subject: [PATCH 5/6] code refining --- src/azure-cli-core/azure/cli/core/command_recommender.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/command_recommender.py b/src/azure-cli-core/azure/cli/core/command_recommender.py index 488cd510d1f..a302abbc604 100644 --- a/src/azure-cli-core/azure/cli/core/command_recommender.py +++ b/src/azure-cli-core/azure/cli/core/command_recommender.py @@ -160,12 +160,6 @@ def _set_aladdin_recommendations(self): # pylint: disable=too-many-locals "parameters": ','.join(parameters) } - params={ - 'query': json.dumps(query), - 'clientType': 'AzureCli', - 'context': json.dumps(context) - } - print(params) response = None try: response = requests.get( From 7a3bf506076c5c747ea09e89c334b2ec2f30a8e8 Mon Sep 17 00:00:00 2001 From: houk-ms Date: Wed, 24 Feb 2021 14:44:09 +0800 Subject: [PATCH 6/6] fix issue: full_restore and selective_key_restore --- src/azure-cli/azure/cli/command_modules/keyvault/custom.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/keyvault/custom.py b/src/azure-cli/azure/cli/command_modules/keyvault/custom.py index 7e88c962c51..860318a262f 100644 --- a/src/azure-cli/azure/cli/command_modules/keyvault/custom.py +++ b/src/azure-cli/azure/cli/command_modules/keyvault/custom.py @@ -1127,7 +1127,7 @@ def restore_key(cmd, client, file_path=None, vault_base_url=None, hsm_name=None, ResourceType.DATA_KEYVAULT_ADMINISTRATION_BACKUP)(cmd.cli_ctx, {'hsm_name': hsm_name}) return sdk_no_wait( no_wait, backup_client.begin_selective_restore, - folder_url=storage_resource_uri + backup_folder, + folder_url='{}/{}'.format(storage_resource_uri, backup_folder), sas_token=token, key_name=key_name ) @@ -2038,7 +2038,6 @@ def list_role_definitions(client, scope=None, hsm_name=None): # pylint: disable query_scope = '' role_definitions = client.list_role_definitions(role_scope=query_scope) return [_reconstruct_role_definition(role) for role in role_definitions] - # return client.list_role_definitions(role_scope=query_scope) # endregion @@ -2077,7 +2076,8 @@ def full_restore(cmd, client, token, folder_to_restore, storage_resource_uri=Non if not storage_resource_uri: storage_resource_uri = construct_storage_uri( cmd.cli_ctx.cloud.suffixes.storage_endpoint, storage_account_name, blob_container_name) - return client.begin_restore(storage_resource_uri + folder_to_restore, token) + folder_url = '{}/{}'.format(storage_resource_uri, folder_to_restore) + return client.begin_restore(folder_url, token) # endregion