From f5e1b859c8547865deb0ef8241c51ea4a00a7f97 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 12 Nov 2015 09:43:05 -0500 Subject: [PATCH] Add support for legacy envvar prefixes In trying to move the legacy clients to do their config via os-client-config, many of them had prefixes like NOVA_ or GLANCE_ in their shells. It's pretty easy to support optionally passing those in so that the transition to OCC is less of a change and we can treat the deprecation cycle of those features as a different topic. Change-Id: Ic819c0790989fa034db03d83535ee7b70aaacc3a --- os_client_config/config.py | 20 ++++++++++++-------- os_client_config/tests/test_environ.py | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/os_client_config/config.py b/os_client_config/config.py index f439d5f..8d92c8f 100644 --- a/os_client_config/config.py +++ b/os_client_config/config.py @@ -81,21 +81,24 @@ def get_boolean(value): return False -def _get_os_environ(): +def _get_os_environ(envvar_prefix=None): ret = defaults.get_defaults() + if not envvar_prefix: + # This makes the or below be OS_ or OS_ which is a no-op + envvar_prefix = 'OS_' environkeys = [k for k in os.environ.keys() - if k.startswith('OS_') + if k.startswith('OS_') or k.startswith(envvar_prefix) and not k.startswith('OS_TEST') # infra CI var and not k.startswith('OS_STD') # infra CI var ] + for k in environkeys: + newkey = k.split('_', 1)[-1].lower() + ret[newkey] = os.environ[k] # If the only environ key is region name, don't make a cloud, because # it's being used as a cloud selector if not environkeys or ( - len(environkeys) == 1 and 'OS_REGION_NAME' in environkeys): + len(environkeys) == 1 and 'region_name' in ret): return None - for k in environkeys: - newkey = k[3:].lower() - ret[newkey] = os.environ[k] return ret @@ -115,7 +118,8 @@ def _auth_update(old_dict, new_dict): class OpenStackConfig(object): def __init__(self, config_files=None, vendor_files=None, - override_defaults=None, force_ipv4=None): + override_defaults=None, force_ipv4=None, + envvar_prefix=None): self._config_files = config_files or CONFIG_FILES self._vendor_files = vendor_files or VENDOR_FILES @@ -173,7 +177,7 @@ class OpenStackConfig(object): # make an envvars cloud self.default_cloud = os.environ.pop('OS_CLOUD', None) - envvars = _get_os_environ() + envvars = _get_os_environ(envvar_prefix=envvar_prefix) if envvars: self.cloud_config['clouds'][self.envvar_key] = envvars diff --git a/os_client_config/tests/test_environ.py b/os_client_config/tests/test_environ.py index 7f284c5..1e804fc 100644 --- a/os_client_config/tests/test_environ.py +++ b/os_client_config/tests/test_environ.py @@ -31,6 +31,8 @@ class TestEnviron(base.TestCase): fixtures.EnvironmentVariable('OS_USERNAME', 'testuser')) self.useFixture( fixtures.EnvironmentVariable('OS_PROJECT_NAME', 'testproject')) + self.useFixture( + fixtures.EnvironmentVariable('NOVA_PROJECT_ID', 'testnova')) def test_get_one_cloud(self): c = config.OpenStackConfig(config_files=[self.cloud_yaml], @@ -66,6 +68,22 @@ class TestEnviron(base.TestCase): self._assert_cloud_details(cc) self.assertNotIn('auth_url', cc.config) self.assertIn('auth_url', cc.config['auth']) + self.assertNotIn('project_id', cc.config['auth']) + self.assertNotIn('auth_url', cc.config) + cc = c.get_one_cloud('_test-cloud_') + self._assert_cloud_details(cc) + cc = c.get_one_cloud('_test_cloud_no_vendor') + self._assert_cloud_details(cc) + + def test_environ_prefix(self): + c = config.OpenStackConfig(config_files=[self.cloud_yaml], + vendor_files=[self.vendor_yaml], + envvar_prefix='NOVA_') + cc = c.get_one_cloud('envvars') + self._assert_cloud_details(cc) + self.assertNotIn('auth_url', cc.config) + self.assertIn('auth_url', cc.config['auth']) + self.assertIn('project_id', cc.config['auth']) self.assertNotIn('auth_url', cc.config) cc = c.get_one_cloud('_test-cloud_') self._assert_cloud_details(cc)