From 43813d26b86af5f1070a81ff1890bd8df10ef838 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Mon, 6 Mar 2023 14:29:55 +0800 Subject: [PATCH 01/13] Use random config dir in DummyCli --- src/azure-cli-core/azure/cli/core/mock.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/azure-cli-core/azure/cli/core/mock.py b/src/azure-cli-core/azure/cli/core/mock.py index 5f42fe58f30..e285fe2a0d0 100644 --- a/src/azure-cli-core/azure/cli/core/mock.py +++ b/src/azure-cli-core/azure/cli/core/mock.py @@ -16,6 +16,7 @@ def __init__(self, commands_loader_cls=None, **kwargs): from azure.cli.core.azlogging import AzCliLogging from azure.cli.core.cloud import get_active_cloud from azure.cli.core.parser import AzCliCommandParser + from azure.cli.core.util import random_string from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from azure.cli.core._help import AzCliHelp from azure.cli.core._output import AzOutputProducer @@ -24,7 +25,7 @@ def __init__(self, commands_loader_cls=None, **kwargs): super(DummyCli, self).__init__( cli_name='az', - config_dir=GLOBAL_CONFIG_DIR, + config_dir=GLOBAL_CONFIG_DIR + random_string(), config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls or MainCommandsLoader, parser_cls=AzCliCommandParser, From 109201c30195863c4314f640d866e85666c4e7b3 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Mon, 6 Mar 2023 15:15:29 +0800 Subject: [PATCH 02/13] Use subdir --- src/azure-cli-core/azure/cli/core/mock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli-core/azure/cli/core/mock.py b/src/azure-cli-core/azure/cli/core/mock.py index e285fe2a0d0..6c1a5f061d0 100644 --- a/src/azure-cli-core/azure/cli/core/mock.py +++ b/src/azure-cli-core/azure/cli/core/mock.py @@ -25,7 +25,7 @@ def __init__(self, commands_loader_cls=None, **kwargs): super(DummyCli, self).__init__( cli_name='az', - config_dir=GLOBAL_CONFIG_DIR + random_string(), + config_dir=os.path.join(GLOBAL_CONFIG_DIR, random_string()), config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls or MainCommandsLoader, parser_cls=AzCliCommandParser, From b94d580d37f84bf5bd39eff6954129b80f57d425 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 8 Mar 2023 11:05:25 +0800 Subject: [PATCH 03/13] Fix test --- .../cli/command_modules/config/tests/latest/test_config.py | 6 +++--- .../cli/command_modules/role/tests/latest/test_role.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py index ea620276fe8..43fab43d158 100644 --- a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py +++ b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py @@ -34,9 +34,9 @@ def test_config(self): for args in (global_test_args, local_test_args): print("Testing for {}".format(args)) - test_option1_expected = {'name': 'test_option1', 'source': args["source"], 'value': 'test_value1'} - test_option21_expected = {'name': 'test_option21', 'source': args["source"], 'value': 'test_value21'} - test_option22_expected = {'name': 'test_option22', 'source': args["source"], 'value': 'test_value22'} + test_option1_expected = {'name': 'test_option1', 'value': 'test_value1'} + test_option21_expected = {'name': 'test_option21', 'value': 'test_value21'} + test_option22_expected = {'name': 'test_option22', 'value': 'test_value22'} test_section1_expected = [test_option1_expected] test_section2_expected = [test_option21_expected, test_option22_expected] diff --git a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py index ef4c69d2172..ef555119018 100644 --- a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py +++ b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py @@ -567,8 +567,8 @@ def test_role_assignment_handle_conflicted_assignments(self, resource_group): local_defaults_config = self.cmd('configure --list-defaults --scope local').get_output_in_json() self.assertGreaterEqual(len(local_defaults_config), 1) - actual = set([(x['name'], x['source'], x['value']) for x in local_defaults_config if x['name'] == 'group']) - expected = set([('group', os.path.join(temp_dir, '.azure', 'config'), self.kwargs['rg'])]) + actual = set([(x['name'], x['value']) for x in local_defaults_config if x['name'] == 'group']) + expected = set([('group', self.kwargs['rg'])]) self.assertEqual(actual, expected) # test role assignments on a resource group From 1b87eeab00f0986ecc6c82eb25371cb11f6dc5e9 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 8 Mar 2023 11:12:29 +0800 Subject: [PATCH 04/13] Remove warning --- src/azure-cli-core/azure/cli/core/_session.py | 8 +++++--- src/azure-cli-core/azure/cli/core/mock.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/_session.py b/src/azure-cli-core/azure/cli/core/_session.py index 471a0344c27..f3b7e166182 100644 --- a/src/azure-cli-core/azure/cli/core/_session.py +++ b/src/azure-cli-core/azure/cli/core/_session.py @@ -44,9 +44,11 @@ def load(self, filename, max_age=0): if isinstance(load_exception, json.JSONDecodeError): log_level = logging.WARNING - get_logger(__name__).log(log_level, - "Failed to load or parse file %s. It will be overridden by default settings.", - self.filename) + # DummyCLI uses random config folder, it will always use default settings. This avoids unnecessary warning. + if 'PYTEST_CURRENT_TEST' not in os.environ: + get_logger(__name__).log(log_level, + "Failed to load or parse file %s. It will be overridden by default settings.", + self.filename) self.save() def save(self): diff --git a/src/azure-cli-core/azure/cli/core/mock.py b/src/azure-cli-core/azure/cli/core/mock.py index 6c1a5f061d0..c3100fe0acd 100644 --- a/src/azure-cli-core/azure/cli/core/mock.py +++ b/src/azure-cli-core/azure/cli/core/mock.py @@ -25,7 +25,7 @@ def __init__(self, commands_loader_cls=None, **kwargs): super(DummyCli, self).__init__( cli_name='az', - config_dir=os.path.join(GLOBAL_CONFIG_DIR, random_string()), + config_dir=os.path.join(GLOBAL_CONFIG_DIR, 'dummy_cli_config_dir', random_string()), config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls or MainCommandsLoader, parser_cls=AzCliCommandParser, From 869aacb4378e1ced6365925c7ead7a9db8d25e04 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 8 Mar 2023 14:32:43 +0800 Subject: [PATCH 05/13] Fix test --- .../config/tests/latest/test_config.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py index 43fab43d158..929e294d8b5 100644 --- a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py +++ b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py @@ -50,21 +50,30 @@ def test_config(self): # 2. get # 2.1 Test get all sections output = self.cmd('config get' + args['flag']).get_output_in_json() + # 'source' is config dir path, remove it from data as it's random. + output['test_section1'][0].pop('source') + output['test_section2'][0].pop('source') + output['test_section2'][1].pop('source') self.assertListEqual(output['test_section1'], test_section1_expected) self.assertListEqual(output['test_section2'], test_section2_expected) # 2.2 Test get one section output = self.cmd('config get test_section1' + args['flag']).get_output_in_json() - self.assertListEqual(output, test_section1_expected) + output[0].pop('source') output = self.cmd('config get test_section2' + args['flag']).get_output_in_json() + output[0].pop('source') + output[1].pop('source') self.assertListEqual(output, test_section2_expected) # 2.3 Test get one item output = self.cmd('config get test_section1.test_option1' + args['flag']).get_output_in_json() + output.pop('source') self.assertDictEqual(output, test_option1_expected) output = self.cmd('config get test_section2.test_option21' + args['flag']).get_output_in_json() + output.pop('source') self.assertDictEqual(output, test_option21_expected) output = self.cmd('config get test_section2.test_option22' + args['flag']).get_output_in_json() + output.pop('source') self.assertDictEqual(output, test_option22_expected) with self.assertRaises(CLIError): From 99aeaf0d790fe513a9e9645009a580fe64492ab7 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 8 Mar 2023 15:02:37 +0800 Subject: [PATCH 06/13] Get real config dir from cli_ctx.config --- .../config/tests/latest/test_config.py | 23 ++++++------------- .../role/tests/latest/test_role.py | 4 ++-- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py index 929e294d8b5..1d8fdea1d63 100644 --- a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py +++ b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py @@ -28,15 +28,16 @@ def test_config(self): os.chdir(tempdir) print("Using temp dir: {}".format(tempdir)) - global_test_args = {"source": os.path.expanduser(os.path.join('~', '.azure', 'config')), "flag": ""} - local_test_args = {"source": os.path.join(tempdir, '.azure', 'config'), "flag": " --local"} + global_test_args = {"source": os.path.join(self.cli_ctx.config.config_dir, 'config'), "flag": ""} + local_test_args = {"source": os.path.join(tempdir, os.path.basename(self.cli_ctx.config.config_dir), 'config'), + "flag": " --local"} for args in (global_test_args, local_test_args): print("Testing for {}".format(args)) - test_option1_expected = {'name': 'test_option1', 'value': 'test_value1'} - test_option21_expected = {'name': 'test_option21', 'value': 'test_value21'} - test_option22_expected = {'name': 'test_option22', 'value': 'test_value22'} + test_option1_expected = {'name': 'test_option1', 'source': args["source"], 'value': 'test_value1'} + test_option21_expected = {'name': 'test_option21', 'source': args["source"], 'value': 'test_value21'} + test_option22_expected = {'name': 'test_option22', 'source': args["source"], 'value': 'test_value22'} test_section1_expected = [test_option1_expected] test_section2_expected = [test_option21_expected, test_option22_expected] @@ -50,30 +51,21 @@ def test_config(self): # 2. get # 2.1 Test get all sections output = self.cmd('config get' + args['flag']).get_output_in_json() - # 'source' is config dir path, remove it from data as it's random. - output['test_section1'][0].pop('source') - output['test_section2'][0].pop('source') - output['test_section2'][1].pop('source') self.assertListEqual(output['test_section1'], test_section1_expected) self.assertListEqual(output['test_section2'], test_section2_expected) # 2.2 Test get one section output = self.cmd('config get test_section1' + args['flag']).get_output_in_json() - output[0].pop('source') + self.assertListEqual(output, test_section1_expected) output = self.cmd('config get test_section2' + args['flag']).get_output_in_json() - output[0].pop('source') - output[1].pop('source') self.assertListEqual(output, test_section2_expected) # 2.3 Test get one item output = self.cmd('config get test_section1.test_option1' + args['flag']).get_output_in_json() - output.pop('source') self.assertDictEqual(output, test_option1_expected) output = self.cmd('config get test_section2.test_option21' + args['flag']).get_output_in_json() - output.pop('source') self.assertDictEqual(output, test_option21_expected) output = self.cmd('config get test_section2.test_option22' + args['flag']).get_output_in_json() - output.pop('source') self.assertDictEqual(output, test_option22_expected) with self.assertRaises(CLIError): @@ -84,7 +76,6 @@ def test_config(self): self.cmd('config unset test_section1.test_option1' + args['flag']) # Test unsetting multiple options self.cmd('config unset test_section2.test_option21 test_section2.test_option22' + args['flag']) - os.chdir(original_path) diff --git a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py index ef555119018..4eb50d73544 100644 --- a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py +++ b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py @@ -567,8 +567,8 @@ def test_role_assignment_handle_conflicted_assignments(self, resource_group): local_defaults_config = self.cmd('configure --list-defaults --scope local').get_output_in_json() self.assertGreaterEqual(len(local_defaults_config), 1) - actual = set([(x['name'], x['value']) for x in local_defaults_config if x['name'] == 'group']) - expected = set([('group', self.kwargs['rg'])]) + actual = set([(x['name'], x['source'], x['value']) for x in local_defaults_config if x['name'] == 'group']) + expected = set([('group', os.path.join(self.cli_ctx.config.config_dir, 'config'), self.kwargs['rg'])]) self.assertEqual(actual, expected) # test role assignments on a resource group From c29ff94ee724e2ad07294d1317c7889d09991c18 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 8 Mar 2023 15:47:59 +0800 Subject: [PATCH 07/13] Fix path --- .../azure/cli/command_modules/role/tests/latest/test_role.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py index 4eb50d73544..54ad3b0f766 100644 --- a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py +++ b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py @@ -568,7 +568,7 @@ def test_role_assignment_handle_conflicted_assignments(self, resource_group): self.assertGreaterEqual(len(local_defaults_config), 1) actual = set([(x['name'], x['source'], x['value']) for x in local_defaults_config if x['name'] == 'group']) - expected = set([('group', os.path.join(self.cli_ctx.config.config_dir, 'config'), self.kwargs['rg'])]) + expected = set([('group', os.path.join(temp_dir, os.path.basename(self.cli_ctx.config.config_dir), 'config'), self.kwargs['rg'])]) self.assertEqual(actual, expected) # test role assignments on a resource group From 6a6ca82bd1a9eddb4d99c964177034b3d722c361 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 8 Mar 2023 17:49:11 +0800 Subject: [PATCH 08/13] Add random_config_dir param --- src/azure-cli-core/azure/cli/core/mock.py | 5 ++++- src/azure-cli-testsdk/azure/cli/testsdk/base.py | 12 +++++++++--- .../config/tests/latest/test_config.py | 3 +++ .../configure/tests/latest/test_configure.py | 3 +++ .../resource/tests/latest/test_resource.py | 3 +++ .../command_modules/role/tests/latest/test_role.py | 3 +++ 6 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/mock.py b/src/azure-cli-core/azure/cli/core/mock.py index c3100fe0acd..d4341d9cac6 100644 --- a/src/azure-cli-core/azure/cli/core/mock.py +++ b/src/azure-cli-core/azure/cli/core/mock.py @@ -23,9 +23,12 @@ def __init__(self, commands_loader_cls=None, **kwargs): from knack.completion import ARGCOMPLETE_ENV_NAME + random_config_dir = kwargs.get('random_config_dir', False) + super(DummyCli, self).__init__( cli_name='az', - config_dir=os.path.join(GLOBAL_CONFIG_DIR, 'dummy_cli_config_dir', random_string()), + config_dir=os.path.join(GLOBAL_CONFIG_DIR, 'dummy_cli_config_dir', + random_string()) if random_config_dir else GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls or MainCommandsLoader, parser_cls=AzCliCommandParser, diff --git a/src/azure-cli-testsdk/azure/cli/testsdk/base.py b/src/azure-cli-testsdk/azure/cli/testsdk/base.py index 28fc4cdd4aa..be2e0d72885 100644 --- a/src/azure-cli-testsdk/azure/cli/testsdk/base.py +++ b/src/azure-cli-testsdk/azure/cli/testsdk/base.py @@ -81,8 +81,10 @@ def is_empty(self): # pylint: disable=no-self-use class ScenarioTest(ReplayableTest, CheckerMixin, unittest.TestCase): def __init__(self, method_name, config_file=None, recording_name=None, - recording_processors=None, replay_processors=None, recording_patches=None, replay_patches=None): - self.cli_ctx = get_dummy_cli() + recording_processors=None, replay_processors=None, recording_patches=None, replay_patches=None, + random_config_dir=False): + self.cli_ctx = get_dummy_cli(random_config_dir=random_config_dir) + self.random_config_dir = random_config_dir self.name_replacer = GeneralNameReplacer() self.kwargs = {} self.test_guid_count = 0 @@ -137,6 +139,9 @@ def _merge_lists(base, patches): def tearDown(self): for processor in self._processors_to_reset: processor.reset() + if self.random_config_dir: + import shutil + shutil.rmtree(self.cli_ctx.config.config_dir, ignore_errors=True) super(ScenarioTest, self).tearDown() def create_random_name(self, prefix, length): @@ -181,7 +186,8 @@ class LocalContextScenarioTest(ScenarioTest): def __init__(self, method_name, config_file=None, recording_name=None, recording_processors=None, replay_processors=None, recording_patches=None, replay_patches=None, working_dir=None): super(LocalContextScenarioTest, self).__init__(method_name, config_file, recording_name, recording_processors, - replay_processors, recording_patches, replay_patches) + replay_processors, recording_patches, replay_patches, + random_config_dir=True) if self.in_recording: self.recording_patches.append(patch_get_current_system_username) else: diff --git a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py index 1d8fdea1d63..1c6b7cac061 100644 --- a/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py +++ b/src/azure-cli/azure/cli/command_modules/config/tests/latest/test_config.py @@ -13,6 +13,9 @@ class ConfigTest(ScenarioTest): + def __init__(self, *arg, **kwargs): + super().__init__(*arg, random_config_dir=True, **kwargs) + def test_config(self): # [test_section1] diff --git a/src/azure-cli/azure/cli/command_modules/configure/tests/latest/test_configure.py b/src/azure-cli/azure/cli/command_modules/configure/tests/latest/test_configure.py index 02723df65d2..525586f4f0a 100644 --- a/src/azure-cli/azure/cli/command_modules/configure/tests/latest/test_configure.py +++ b/src/azure-cli/azure/cli/command_modules/configure/tests/latest/test_configure.py @@ -26,6 +26,9 @@ def test_configure_output_options(self): class ConfigureGlobalDefaultsTest(ScenarioTest): + def __init__(self, *arg, **kwargs): + super().__init__(*arg, random_config_dir=True, **kwargs) + def setUp(self): self.local_dir = tempfile.mkdtemp() diff --git a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource.py b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource.py index 1e4a327d045..fe63da11e8a 100644 --- a/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource.py +++ b/src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource.py @@ -326,6 +326,9 @@ def test_resource_create_and_show(self, resource_group, resource_group_location) class TagScenarioTest(ScenarioTest): + def __init__(self, *arg, **kwargs): + super().__init__(*arg, random_config_dir=True, **kwargs) + def test_tag_scenario(self): self.kwargs.update({ diff --git a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py index 54ad3b0f766..17fd257bd12 100644 --- a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py +++ b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py @@ -255,6 +255,9 @@ def test_role_definition_scenario(self): class RoleAssignmentScenarioTest(RoleScenarioTestBase): + def __init__(self, *arg, **kwargs): + super().__init__(*arg, random_config_dir=True, **kwargs) + @ResourceGroupPreparer(name_prefix='cli_role_assign') @AllowLargeResponse() def test_role_assignment_scenario(self, resource_group): From 60afa328f5748d01ed5d4de59b5d13f23699e59d Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Thu, 9 Mar 2023 12:00:50 +0800 Subject: [PATCH 09/13] Minor change --- src/azure-cli-core/azure/cli/core/_session.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/_session.py b/src/azure-cli-core/azure/cli/core/_session.py index f3b7e166182..471a0344c27 100644 --- a/src/azure-cli-core/azure/cli/core/_session.py +++ b/src/azure-cli-core/azure/cli/core/_session.py @@ -44,11 +44,9 @@ def load(self, filename, max_age=0): if isinstance(load_exception, json.JSONDecodeError): log_level = logging.WARNING - # DummyCLI uses random config folder, it will always use default settings. This avoids unnecessary warning. - if 'PYTEST_CURRENT_TEST' not in os.environ: - get_logger(__name__).log(log_level, - "Failed to load or parse file %s. It will be overridden by default settings.", - self.filename) + get_logger(__name__).log(log_level, + "Failed to load or parse file %s. It will be overridden by default settings.", + self.filename) self.save() def save(self): From 7a8d2bf0226bff02be194f81e8ceb79e00fbffe5 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 24 Mar 2023 12:36:42 +0800 Subject: [PATCH 10/13] Use random folder --- src/azure-cli-core/azure/cli/core/mock.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/mock.py b/src/azure-cli-core/azure/cli/core/mock.py index d4341d9cac6..79dedc59043 100644 --- a/src/azure-cli-core/azure/cli/core/mock.py +++ b/src/azure-cli-core/azure/cli/core/mock.py @@ -8,27 +8,24 @@ class DummyCli(AzCli): """A dummy CLI instance can be used to facilitate automation""" - def __init__(self, commands_loader_cls=None, **kwargs): + def __init__(self, commands_loader_cls=None, random_config_dir=False, **kwargs): import os + import tempfile from azure.cli.core import MainCommandsLoader from azure.cli.core.commands import AzCliCommandInvoker from azure.cli.core.azlogging import AzCliLogging from azure.cli.core.cloud import get_active_cloud from azure.cli.core.parser import AzCliCommandParser - from azure.cli.core.util import random_string from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from azure.cli.core._help import AzCliHelp from azure.cli.core._output import AzOutputProducer from knack.completion import ARGCOMPLETE_ENV_NAME - random_config_dir = kwargs.get('random_config_dir', False) - super(DummyCli, self).__init__( cli_name='az', - config_dir=os.path.join(GLOBAL_CONFIG_DIR, 'dummy_cli_config_dir', - random_string()) if random_config_dir else GLOBAL_CONFIG_DIR, + config_dir=tempfile.TemporaryDirectory().name if random_config_dir else GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls or MainCommandsLoader, parser_cls=AzCliCommandParser, From d777ac0703db5499b8bb2196516113808570ea8a Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 24 Mar 2023 12:36:49 +0800 Subject: [PATCH 11/13] Use rmtree --- src/azure-cli-testsdk/azure/cli/testsdk/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/azure-cli-testsdk/azure/cli/testsdk/base.py b/src/azure-cli-testsdk/azure/cli/testsdk/base.py index be2e0d72885..d82186a2ffe 100644 --- a/src/azure-cli-testsdk/azure/cli/testsdk/base.py +++ b/src/azure-cli-testsdk/azure/cli/testsdk/base.py @@ -140,8 +140,8 @@ def tearDown(self): for processor in self._processors_to_reset: processor.reset() if self.random_config_dir: - import shutil - shutil.rmtree(self.cli_ctx.config.config_dir, ignore_errors=True) + from azure.cli.core.util import rmtree_with_retry + rmtree_with_retry(self.cli_ctx.config.config_dir) super(ScenarioTest, self).tearDown() def create_random_name(self, prefix, length): From 7f9e0d4a4888015bc524fe1a5e47de50a892b1a6 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Mon, 27 Mar 2023 10:46:46 +0800 Subject: [PATCH 12/13] Minor fix --- src/azure-cli-core/azure/cli/core/mock.py | 5 +++-- .../azure/cli/command_modules/role/tests/latest/test_role.py | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/azure-cli-core/azure/cli/core/mock.py b/src/azure-cli-core/azure/cli/core/mock.py index 79dedc59043..c96eedca0c2 100644 --- a/src/azure-cli-core/azure/cli/core/mock.py +++ b/src/azure-cli-core/azure/cli/core/mock.py @@ -10,13 +10,13 @@ class DummyCli(AzCli): """A dummy CLI instance can be used to facilitate automation""" def __init__(self, commands_loader_cls=None, random_config_dir=False, **kwargs): import os - import tempfile from azure.cli.core import MainCommandsLoader from azure.cli.core.commands import AzCliCommandInvoker from azure.cli.core.azlogging import AzCliLogging from azure.cli.core.cloud import get_active_cloud from azure.cli.core.parser import AzCliCommandParser + from azure.cli.core.util import random_string from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from azure.cli.core._help import AzCliHelp from azure.cli.core._output import AzOutputProducer @@ -25,7 +25,8 @@ def __init__(self, commands_loader_cls=None, random_config_dir=False, **kwargs): super(DummyCli, self).__init__( cli_name='az', - config_dir=tempfile.TemporaryDirectory().name if random_config_dir else GLOBAL_CONFIG_DIR, + config_dir=os.path.join(GLOBAL_CONFIG_DIR, 'dummy_cli_config_dir', + random_string()) if random_config_dir else GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls or MainCommandsLoader, parser_cls=AzCliCommandParser, diff --git a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py index 17fd257bd12..e1c7c91316c 100644 --- a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py +++ b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py @@ -571,6 +571,8 @@ def test_role_assignment_handle_conflicted_assignments(self, resource_group): self.assertGreaterEqual(len(local_defaults_config), 1) actual = set([(x['name'], x['source'], x['value']) for x in local_defaults_config if x['name'] == 'group']) + # If global config_dir is ~/.azure/dummy_cli_config_dir/0azXbKR9OdJuZPFS/config, + # local config file is ./0azXbKR9OdJuZPFS/config expected = set([('group', os.path.join(temp_dir, os.path.basename(self.cli_ctx.config.config_dir), 'config'), self.kwargs['rg'])]) self.assertEqual(actual, expected) From 0ec24067c34bf43c2e3967b4ec3d3cd16beaea08 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 29 Mar 2023 17:02:18 +0800 Subject: [PATCH 13/13] Minor fix --- .../azure/cli/command_modules/role/tests/latest/test_role.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py index e1c7c91316c..b7966e980d7 100644 --- a/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py +++ b/src/azure-cli/azure/cli/command_modules/role/tests/latest/test_role.py @@ -571,7 +571,7 @@ def test_role_assignment_handle_conflicted_assignments(self, resource_group): self.assertGreaterEqual(len(local_defaults_config), 1) actual = set([(x['name'], x['source'], x['value']) for x in local_defaults_config if x['name'] == 'group']) - # If global config_dir is ~/.azure/dummy_cli_config_dir/0azXbKR9OdJuZPFS/config, + # If global config_dir is ~/.azure/dummy_cli_config_dir/0azXbKR9OdJuZPFS/, # local config file is ./0azXbKR9OdJuZPFS/config expected = set([('group', os.path.join(temp_dir, os.path.basename(self.cli_ctx.config.config_dir), 'config'), self.kwargs['rg'])]) self.assertEqual(actual, expected)