def _reload_config(): if before_2_0_64: cli_ctx.config.config_parser.read(GLOBAL_CONFIG_PATH) return cli_ctx.config else: return CLIConfig(config_dir=GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX)
def _az_config(self): # NOTE: ideally we would've used get_default_cli().config from # azure.cli.core, but azure-cli-core has a lot of conflicts with other # dependencies. So instead we are just use knack directly from knack.config import CLIConfig config_dir = os.getenv("AZURE_CONFIG_DIR", os.path.expanduser(os.path.join("~", ".azure"))) return CLIConfig(config_dir=config_dir, config_env_var_prefix="AZURE")
def get_state_path(): """ Returns the path of where the state file of sfctl is stored. :return: str """ # This is the same as # self.config_path = os.path.join(self.config_dir, CLIConfig._CONFIG_FILE_NAME) return CLIConfig(SF_CLI_STATE_DIR, SF_CLI_NAME, 'state').config_path
# Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- import os import traceback import json import re import sys import pkginfo from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from distutils.sysconfig import get_python_lib from knack.config import CLIConfig from knack.log import get_logger az_config = CLIConfig(config_dir=GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX) _CUSTOM_EXT_DIR = az_config.get('extension', 'dir', None) _DEV_EXTENSION_SOURCES = az_config.get('extension', 'dev_sources', None) EXTENSIONS_DIR = os.path.expanduser( _CUSTOM_EXT_DIR) if _CUSTOM_EXT_DIR else os.path.join( GLOBAL_CONFIG_DIR, 'cliextensions') DEV_EXTENSION_SOURCES = _DEV_EXTENSION_SOURCES.split( ',') if _DEV_EXTENSION_SOURCES else [] EXTENSIONS_SYS_DIR = os.path.join( get_python_lib(), 'azure-cli-extensions') if sys.platform.startswith('linux') else "" EXTENSIONS_MOD_PREFIX = 'azext_' WHL_METADATA_FILENAME = 'metadata.json' EGG_INFO_METADATA_FILE_NAME = 'PKG-INFO' # used for dev packages
def set_config_value(name, value): """Set a config by name to a value.""" cli_config = CLIConfig(SF_CLI_CONFIG_DIR, SF_CLI_ENV_VAR_PREFIX) cli_config.set_value('servicefabric', name, value)
def get_config_bool(name): """Checks if a config value is set to a valid bool value.""" cli_config = CLIConfig(SF_CLI_CONFIG_DIR, SF_CLI_ENV_VAR_PREFIX) return cli_config.getboolean('servicefabric', name, False)
class TestCLIConfig(unittest.TestCase): def setUp(self): self.cli_config = CLIConfig(config_dir=new_temp_folder()) # In case the previous test is stopped and doesn't clean up clean_local_temp_folder() def tearDown(self): clean_local_temp_folder() def test_has_option(self): section = 'MySection' option = 'myoption' value = 'myvalue' self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.has_option(section, option)) def test_has_option_env(self): with mock.patch.dict( 'os.environ', {self.cli_config.env_var_name('MySection', 'myoption'): 'myvalue' }): section = 'MySection' option = 'myoption' self.assertTrue(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.has_option(section, option)) def test_has_option_env_no(self): section = 'MySection' option = 'myoption' self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertFalse(self.cli_config.has_option(section, option)) def test_get(self): section = 'MySection' option = 'myoption' value = 'myvalue' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.get(section, option), value) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option), value) def test_get_env(self): with mock.patch.dict( 'os.environ', {self.cli_config.env_var_name('MySection', 'myoption'): 'myvalue' }): section = 'MySection' option = 'myoption' value = 'myvalue' self.assertEqual(self.cli_config.get(section, option), value) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option), value) def test_get_not_found_section(self): section = 'MySection' option = 'myoption' with self.assertRaises(configparser.NoSectionError): self.cli_config.get(section, option) self.cli_config.set_to_use_local_config(True) with self.assertRaises(configparser.NoSectionError): self.cli_config.get(section, option) def test_get_not_found_option(self): section = 'MySection' option = 'myoption' option_other = 'option' value = 'myvalue' self.cli_config.set_value(section, option_other, value) with self.assertRaises(configparser.NoOptionError): self.cli_config.get(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option_other, value) with self.assertRaises(configparser.NoOptionError): self.cli_config.get(section, option) def test_get_fallback(self): section = 'MySection' option = 'myoption' self.assertEqual( self.cli_config.get(section, option, fallback='fallback'), 'fallback') self.cli_config.set_to_use_local_config(True) self.assertEqual( self.cli_config.get(section, option, fallback='fallback'), 'fallback') def test_getint(self): section = 'MySection' option = 'myoption' value = '123' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getint(section, option), int(value)) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.getint(section, option), int(value)) def test_getint_error(self): section = 'MySection' option = 'myoption' value = 'not_an_int' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getint(section, option) self.cli_config.set_to_use_local_config(True) with self.assertRaises(ValueError): self.cli_config.getint(section, option) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getint(section, option) def test_getfloat(self): section = 'MySection' option = 'myoption' value = '123.456' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) def test_getfloat_error(self): section = 'MySection' option = 'myoption' value = 'not_a_float' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getfloat(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getfloat(section, option) def test_getboolean(self): section = 'MySection' option = 'myoption' value = 'true' self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.getboolean(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.getboolean(section, option)) def test_getboolean_error(self): section = 'MySection' option = 'myoption' value = 'not_a_boolean' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getboolean(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getboolean(section, option) def test_items(self): file_section = "MySection" file_value = 'file_value' env_value = 'env_value' # Test file-only options are listed file_only_option = 'file_only_option' self.cli_config.set_value(file_section, file_only_option, file_value) items_result = self.cli_config.items(file_section) self.assertEqual(len(items_result), 1) self.assertEqual(items_result[0]['name'], file_only_option) self.assertEqual(items_result[0]['value'], file_value) self.cli_config.remove_option(file_section, file_only_option) # Test env-only options are listed with mock.patch.dict('os.environ', {'CLI_MYSECTION_ENV_ONLY_OPTION': env_value}): items_result = self.cli_config.items(file_section) self.assertEqual(len(items_result), 1) self.assertEqual(items_result[0]['name'], 'env_only_option') self.assertEqual(items_result[0]['value'], env_value) # Test file options are overridden by env options, for both single-word and multi-word options test_options = [ # file_option, file_value, env_name, env_value # Test single-word option ('optionsingle', 'file_value_single', 'CLI_MYSECTION_OPTIONSINGLE', 'env_value_single'), # Test multi-word option ('option_multiple', 'file_value_multiple', 'CLI_MYSECTION_OPTION_MULTIPLE', 'env_value_multiple') ] for file_option, file_value, env_name, env_value in test_options: self.cli_config.set_value(file_section, file_option, file_value) items_result = self.cli_config.items(file_section) self.assertEqual(len(items_result), 1) self.assertEqual(items_result[0]['value'], file_value) with mock.patch.dict('os.environ', {env_name: env_value}): items_result = self.cli_config.items(file_section) self.assertEqual(len(items_result), 1) self.assertEqual(items_result[0]['value'], env_value) self.cli_config.remove_option(file_section, file_option) # Test Invalid_Env_Var is not accepted on Linux # Windows' env var is case-insensitive, so skip import platform if platform.system() != 'Windows': # Not shown with mock.patch.dict('os.environ', {'CLI_MYSECTION_Test_Option': env_value}): items_result = self.cli_config.items(file_section) self.assertEqual(len(items_result), 0) # No overriding self.cli_config.set_value(file_section, 'test_option', file_value) with mock.patch.dict('os.environ', {'CLI_MYSECTION_Test_Option': env_value}): items_result = self.cli_config.items(file_section) self.assertEqual(len(items_result), 1) self.assertEqual(items_result[0]['value'], file_value) def test_set_config_value(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') config = configparser.ConfigParser() config.read(self.cli_config.config_path) self.assertEqual(config.get('test_section', 'test_option'), 'a_value') def test_set_config_value_duplicate_section_ok(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual( self.cli_config.get('test_section', 'test_option_another'), 'another_value') self.cli_config.set_to_use_local_config(True) self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual( self.cli_config.get('test_section', 'test_option_another'), 'another_value') def test_set_config_value_not_string(self): with self.assertRaises(TypeError): self.cli_config.set_value('test_section', 'test_option', False) self.cli_config.set_to_use_local_config(True) with self.assertRaises(TypeError): self.cli_config.set_value('test_section', 'test_option', False) def test_set_config_value_file_permissions(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') file_mode = os.stat(self.cli_config.config_path).st_mode self.assertTrue(bool(file_mode & stat.S_IRUSR)) self.assertTrue(bool(file_mode & stat.S_IWUSR)) # only S_IRUSR and S_IWUSR are supported on Windows: https://docs.python.org/3.8/library/os.html#os.chmod if os.name != 'nt': self.assertFalse(bool(file_mode & stat.S_IXUSR)) self.assertFalse(bool(file_mode & stat.S_IRGRP)) self.assertFalse(bool(file_mode & stat.S_IWGRP)) self.assertFalse(bool(file_mode & stat.S_IXGRP)) self.assertFalse(bool(file_mode & stat.S_IROTH)) self.assertFalse(bool(file_mode & stat.S_IWOTH)) self.assertFalse(bool(file_mode & stat.S_IXOTH)) def test_has_option_local(self): section = 'MySection' option = 'myoption' value = 'myvalue' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) def test_get_local(self): section = 'MySection' option = 'myoption' value = 'myvalue' local_value = 'localvalue' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.get(section, option), local_value) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.get(section, option), value) def test_getint_local(self): section = 'MySection' option = 'myoption' value = '123' local_value = '1234' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.getint(section, option), int(local_value)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getint(section, option), int(value)) def test_getfloat_local(self): section = 'MySection' option = 'myoption' value = '123.456' local_value = '1234.56' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.getfloat(section, option), float(local_value)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) def test_getboolean_local(self): section = 'MySection' option = 'myoption' local_value = 'true' value = 'false' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertTrue(self.cli_config.getboolean(section, option)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertFalse(self.cli_config.getboolean(section, option)) def test_set_config_value_duplicate_section_ok_local(self): self.cli_config.set_to_use_local_config(True) self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual( self.cli_config.get('test_section', 'test_option_another'), 'another_value') self.cli_config.set_to_use_local_config(False) self.assertFalse( self.cli_config.has_option('test_section', 'test_option')) self.assertFalse( self.cli_config.has_option('test_section', 'test_option_another'))
def get_azure_config(): return CLIConfig(config_dir=get_azure_config_dir(), config_env_var_prefix='AZURE')
def setUp(self): self.cli_config = CLIConfig(config_dir=tempfile.mkdtemp())
class TestCLIConfig(unittest.TestCase): def setUp(self): self.cli_config = CLIConfig(config_dir=tempfile.mkdtemp()) def test_has_option(self): section = 'MySection' option = 'myoption' value = 'myvalue' self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.has_option(section, option)) def test_has_option_env(self): with mock.patch.dict('os.environ', {self.cli_config.env_var_name('MySection', 'myoption'): 'myvalue'}): section = 'MySection' option = 'myoption' self.assertTrue(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.has_option(section, option)) def test_has_option_env_no(self): section = 'MySection' option = 'myoption' self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertFalse(self.cli_config.has_option(section, option)) def test_get(self): section = 'MySection' option = 'myoption' value = 'myvalue' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.get(section, option), value) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option), value) def test_get_env(self): with mock.patch.dict('os.environ', {self.cli_config.env_var_name('MySection', 'myoption'): 'myvalue'}): section = 'MySection' option = 'myoption' value = 'myvalue' self.assertEqual(self.cli_config.get(section, option), value) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option), value) def test_get_not_found_section(self): section = 'MySection' option = 'myoption' with self.assertRaises(configparser.NoSectionError): self.cli_config.get(section, option) self.cli_config.set_to_use_local_config(True) with self.assertRaises(configparser.NoSectionError): self.cli_config.get(section, option) def test_get_not_found_option(self): section = 'MySection' option = 'myoption' option_other = 'option' value = 'myvalue' self.cli_config.set_value(section, option_other, value) with self.assertRaises(configparser.NoOptionError): self.cli_config.get(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option_other, value) with self.assertRaises(configparser.NoOptionError): self.cli_config.get(section, option) def test_get_fallback(self): section = 'MySection' option = 'myoption' self.assertEqual(self.cli_config.get(section, option, fallback='fallback'), 'fallback') self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option, fallback='fallback'), 'fallback') def test_getint(self): section = 'MySection' option = 'myoption' value = '123' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getint(section, option), int(value)) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.getint(section, option), int(value)) def test_getint_error(self): section = 'MySection' option = 'myoption' value = 'not_an_int' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getint(section, option) self.cli_config.set_to_use_local_config(True) with self.assertRaises(ValueError): self.cli_config.getint(section, option) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getint(section, option) def test_getfloat(self): section = 'MySection' option = 'myoption' value = '123.456' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) def test_getfloat_error(self): section = 'MySection' option = 'myoption' value = 'not_a_float' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getfloat(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getfloat(section, option) def test_getboolean(self): section = 'MySection' option = 'myoption' value = 'true' self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.getboolean(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.getboolean(section, option)) def test_getboolean_error(self): section = 'MySection' option = 'myoption' value = 'not_a_boolean' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getboolean(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getboolean(section, option) def test_set_config_value(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') config = get_config_parser() config.read(self.cli_config.config_path) self.assertEqual(config.get('test_section', 'test_option'), 'a_value') def test_set_config_value_duplicate_section_ok(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual(self.cli_config.get('test_section', 'test_option_another'), 'another_value') self.cli_config.set_to_use_local_config(True) self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual(self.cli_config.get('test_section', 'test_option_another'), 'another_value') def test_set_config_value_not_string(self): with self.assertRaises(TypeError): self.cli_config.set_value('test_section', 'test_option', False) self.cli_config.set_to_use_local_config(True) with self.assertRaises(TypeError): self.cli_config.set_value('test_section', 'test_option', False) def test_set_config_value_file_permissions(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') file_mode = os.stat(self.cli_config.config_path).st_mode self.assertTrue(bool(file_mode & stat.S_IRUSR)) self.assertTrue(bool(file_mode & stat.S_IWUSR)) self.assertFalse(bool(file_mode & stat.S_IXUSR)) self.assertFalse(bool(file_mode & stat.S_IRGRP)) self.assertFalse(bool(file_mode & stat.S_IWGRP)) self.assertFalse(bool(file_mode & stat.S_IXGRP)) self.assertFalse(bool(file_mode & stat.S_IROTH)) self.assertFalse(bool(file_mode & stat.S_IWOTH)) self.assertFalse(bool(file_mode & stat.S_IXOTH)) def test_has_option_local(self): section = 'MySection' option = 'myoption' value = 'myvalue' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) def test_get_local(self): section = 'MySection' option = 'myoption' value = 'myvalue' local_value = 'localvalue' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.get(section, option), local_value) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.get(section, option), value) def test_getint_local(self): section = 'MySection' option = 'myoption' value = '123' local_value = '1234' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.getint(section, option), int(local_value)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getint(section, option), int(value)) def test_getfloat_local(self): section = 'MySection' option = 'myoption' value = '123.456' local_value = '1234.56' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.getfloat(section, option), float(local_value)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) def test_getboolean_local(self): section = 'MySection' option = 'myoption' local_value = 'true' value = 'false' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertTrue(self.cli_config.getboolean(section, option)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertFalse(self.cli_config.getboolean(section, option)) def test_set_config_value_duplicate_section_ok_local(self): self.cli_config.set_to_use_local_config(True) self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual(self.cli_config.get('test_section', 'test_option_another'), 'another_value') self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option('test_section', 'test_option')) self.assertFalse(self.cli_config.has_option('test_section', 'test_option_another'))
# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- import os import traceback import json import re from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from knack.config import CLIConfig from knack.log import get_logger az_config = CLIConfig(config_dir=GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX) _CUSTOM_EXT_DIR = az_config.get('extension', 'dir', None) _DEV_EXTENSION_SOURCES = az_config.get('extension', 'dev_sources', None) EXTENSIONS_DIR = os.path.expanduser(_CUSTOM_EXT_DIR) if _CUSTOM_EXT_DIR else os.path.join(GLOBAL_CONFIG_DIR, 'cliextensions') DEV_EXTENSION_SOURCES = _DEV_EXTENSION_SOURCES.split(',') if _DEV_EXTENSION_SOURCES else [] EXTENSIONS_MOD_PREFIX = 'azext_' WHL_METADATA_FILENAME = 'metadata.json' EGG_INFO_METADATA_FILE_NAME = 'PKG-INFO' # used for dev packages AZEXT_METADATA_FILENAME = 'azext_metadata.json' EXT_METADATA_MINCLICOREVERSION = 'azext.minCliCoreVersion' EXT_METADATA_MAXCLICOREVERSION = 'azext.maxCliCoreVersion' EXT_METADATA_ISPREVIEW = 'azext.isPreview'
# -------------------------------------------------------------------------------------------- import random import os from knack.config import CLIConfig from azure.cli.core.commands import LongRunningOperation, _is_poller CONFIG_DIR = os.path.expanduser(os.path.join('~', '.azext_db_up')) ENV_VAR_PREFIX = 'AZEXT' MYSQL_CONFIG_SECTION = 'mysql_up' POSTGRES_CONFIG_SECTION = 'postgres_up' CONFIG_MAP = { 'mysql': MYSQL_CONFIG_SECTION, 'postgres': POSTGRES_CONFIG_SECTION } DB_CONFIG = CLIConfig(config_dir=CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX) def create_random_resource_name(prefix='azure', length=15): append_length = length - len(prefix) digits = [str(random.randrange(10)) for i in range(append_length)] return prefix + ''.join(digits) def get_config_value(db_type, option, fallback='_fallback_none'): config_section = CONFIG_MAP[db_type] if fallback == '_fallback_none': return DB_CONFIG.get(config_section, option) return DB_CONFIG.get(config_section, option, fallback=fallback)
from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.iot_hub_device_client import IotHubDeviceClient from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.models.authentication import Authentication from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.models.device_description import DeviceDescription from azure.cli.command_modules.iot.mgmt_iot_hub_device.lib.models.x509_thumbprint import X509Thumbprint from azure.cli.command_modules.iot.sas_token_auth import SasTokenAuthentication from azure.cli.core.extension import extension_exists from azure.cli.core._environment import get_config_dir from ._client_factory import resource_service_factory from ._utils import create_self_signed_certificate, open_certificate logger = get_logger(__name__) # IoT Extension run once awareness if not extension_exists('azure_cli_iot_ext'): config = CLIConfig(get_config_dir()) ran_before = config.getboolean('iot', 'first_run', fallback=False) if not ran_before: extension_text = """ Comprehensive IoT data-plane functionality is available in the Azure IoT CLI Extension. For more info and install guide go to https://github.com/Azure/azure-iot-cli-extension """ logger.warning(extension_text) config.set_value('iot', 'first_run', 'yes') # CUSTOM TYPE class KeyType(Enum): primary = 'primary' secondary = 'secondary'
# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- import os import traceback import json from knack.config import CLIConfig from knack.log import get_logger from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX az_config = CLIConfig(config_dir=GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX) _CUSTOM_EXT_DIR = az_config.get('extension', 'dir', None) EXTENSIONS_DIR = os.path.expanduser( _CUSTOM_EXT_DIR) if _CUSTOM_EXT_DIR else os.path.join( GLOBAL_CONFIG_DIR, 'cliextensions') EXTENSIONS_MOD_PREFIX = 'azext_' WHL_METADATA_FILENAME = 'metadata.json' AZEXT_METADATA_FILENAME = 'azext_metadata.json' EXT_METADATA_MINCLICOREVERSION = 'azext.minCliCoreVersion' EXT_METADATA_MAXCLICOREVERSION = 'azext.maxCliCoreVersion' EXT_METADATA_ISPREVIEW = 'azext.isPreview' logger = get_logger(__name__)
class TestCLIConfig(unittest.TestCase): def setUp(self): self.cli_config = CLIConfig(config_dir=new_temp_folder()) # In case the previous test is stopped and doesn't clean up clean_local_temp_folder() def tearDown(self): clean_local_temp_folder() def test_has_option(self): section = 'MySection' option = 'myoption' value = 'myvalue' self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.has_option(section, option)) def test_has_option_env(self): with mock.patch.dict( 'os.environ', {self.cli_config.env_var_name('MySection', 'myoption'): 'myvalue' }): section = 'MySection' option = 'myoption' self.assertTrue(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.has_option(section, option)) def test_has_option_env_no(self): section = 'MySection' option = 'myoption' self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_to_use_local_config(True) self.assertFalse(self.cli_config.has_option(section, option)) def test_get(self): section = 'MySection' option = 'myoption' value = 'myvalue' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.get(section, option), value) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option), value) def test_get_env(self): with mock.patch.dict( 'os.environ', {self.cli_config.env_var_name('MySection', 'myoption'): 'myvalue' }): section = 'MySection' option = 'myoption' value = 'myvalue' self.assertEqual(self.cli_config.get(section, option), value) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.get(section, option), value) def test_get_not_found_section(self): section = 'MySection' option = 'myoption' with self.assertRaises(configparser.NoSectionError): self.cli_config.get(section, option) self.cli_config.set_to_use_local_config(True) with self.assertRaises(configparser.NoSectionError): self.cli_config.get(section, option) def test_get_not_found_option(self): section = 'MySection' option = 'myoption' option_other = 'option' value = 'myvalue' self.cli_config.set_value(section, option_other, value) with self.assertRaises(configparser.NoOptionError): self.cli_config.get(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option_other, value) with self.assertRaises(configparser.NoOptionError): self.cli_config.get(section, option) def test_get_fallback(self): section = 'MySection' option = 'myoption' self.assertEqual( self.cli_config.get(section, option, fallback='fallback'), 'fallback') self.cli_config.set_to_use_local_config(True) self.assertEqual( self.cli_config.get(section, option, fallback='fallback'), 'fallback') def test_getint(self): section = 'MySection' option = 'myoption' value = '123' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getint(section, option), int(value)) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.getint(section, option), int(value)) def test_getint_error(self): section = 'MySection' option = 'myoption' value = 'not_an_int' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getint(section, option) self.cli_config.set_to_use_local_config(True) with self.assertRaises(ValueError): self.cli_config.getint(section, option) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getint(section, option) def test_getfloat(self): section = 'MySection' option = 'myoption' value = '123.456' self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) self.cli_config.set_to_use_local_config(True) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) def test_getfloat_error(self): section = 'MySection' option = 'myoption' value = 'not_a_float' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getfloat(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getfloat(section, option) def test_getboolean(self): section = 'MySection' option = 'myoption' value = 'true' self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.getboolean(section, option)) self.cli_config.set_to_use_local_config(True) self.assertTrue(self.cli_config.getboolean(section, option)) def test_getboolean_error(self): section = 'MySection' option = 'myoption' value = 'not_a_boolean' self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getboolean(section, option) self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) with self.assertRaises(ValueError): self.cli_config.getboolean(section, option) def test_set_config_value(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') config = configparser.ConfigParser() config.read(self.cli_config.config_path) self.assertEqual(config.get('test_section', 'test_option'), 'a_value') def test_set_config_value_duplicate_section_ok(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual( self.cli_config.get('test_section', 'test_option_another'), 'another_value') self.cli_config.set_to_use_local_config(True) self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual( self.cli_config.get('test_section', 'test_option_another'), 'another_value') def test_set_config_value_not_string(self): with self.assertRaises(TypeError): self.cli_config.set_value('test_section', 'test_option', False) self.cli_config.set_to_use_local_config(True) with self.assertRaises(TypeError): self.cli_config.set_value('test_section', 'test_option', False) def test_set_config_value_file_permissions(self): self.cli_config.set_value('test_section', 'test_option', 'a_value') file_mode = os.stat(self.cli_config.config_path).st_mode self.assertTrue(bool(file_mode & stat.S_IRUSR)) self.assertTrue(bool(file_mode & stat.S_IWUSR)) # only S_IRUSR and S_IWUSR are supported on Windows: https://docs.python.org/3.8/library/os.html#os.chmod if os.name != 'nt': self.assertFalse(bool(file_mode & stat.S_IXUSR)) self.assertFalse(bool(file_mode & stat.S_IRGRP)) self.assertFalse(bool(file_mode & stat.S_IWGRP)) self.assertFalse(bool(file_mode & stat.S_IXGRP)) self.assertFalse(bool(file_mode & stat.S_IROTH)) self.assertFalse(bool(file_mode & stat.S_IWOTH)) self.assertFalse(bool(file_mode & stat.S_IXOTH)) def test_has_option_local(self): section = 'MySection' option = 'myoption' value = 'myvalue' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertTrue(self.cli_config.has_option(section, option)) def test_get_local(self): section = 'MySection' option = 'myoption' value = 'myvalue' local_value = 'localvalue' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.get(section, option), local_value) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.get(section, option), value) def test_getint_local(self): section = 'MySection' option = 'myoption' value = '123' local_value = '1234' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.getint(section, option), int(local_value)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getint(section, option), int(value)) def test_getfloat_local(self): section = 'MySection' option = 'myoption' value = '123.456' local_value = '1234.56' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertEqual(self.cli_config.getfloat(section, option), float(local_value)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertEqual(self.cli_config.getfloat(section, option), float(value)) def test_getboolean_local(self): section = 'MySection' option = 'myoption' local_value = 'true' value = 'false' # check local config self.cli_config.set_to_use_local_config(True) self.cli_config.set_value(section, option, local_value) self.assertTrue(self.cli_config.getboolean(section, option)) # check default config self.cli_config.set_to_use_local_config(False) self.assertFalse(self.cli_config.has_option(section, option)) self.cli_config.set_value(section, option, value) self.assertFalse(self.cli_config.getboolean(section, option)) def test_set_config_value_duplicate_section_ok_local(self): self.cli_config.set_to_use_local_config(True) self.cli_config.set_value('test_section', 'test_option', 'a_value') self.cli_config.set_value('test_section', 'test_option_another', 'another_value') self.assertEqual(self.cli_config.get('test_section', 'test_option'), 'a_value') self.assertEqual( self.cli_config.get('test_section', 'test_option_another'), 'another_value') self.cli_config.set_to_use_local_config(False) self.assertFalse( self.cli_config.has_option('test_section', 'test_option')) self.assertFalse( self.cli_config.has_option('test_section', 'test_option_another'))
def setUp(self): self.cli_config = CLIConfig(config_dir=new_temp_folder()) # In case the previous test is stopped and doesn't clean up clean_local_temp_folder()
def get_azdev_config(): return CLIConfig(config_dir=get_azdev_config_dir(), config_env_var_prefix='AZDEV')