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
This commit is contained in:
Monty Taylor 2015-11-12 09:43:05 -05:00
parent 38f959b1b5
commit f5e1b859c8
2 changed files with 30 additions and 8 deletions

View File

@ -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

View File

@ -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)