Prepare for os-client-config wrapper

In order to remove the second copy of the code that is in
os-client-config, we need to be able to set a few class/module names to
allow openstacksdk methods to return the appropriate os-client-config
wrapper subclasses when called via os-client-config.

Also remove a function we had intended to remove back in 2015 that
should not be used by anyone.

Change-Id: Ie279c543fb2142c101f03dcdd45314bbc098ebc4
This commit is contained in:
Monty Taylor 2018-03-02 10:46:49 +01:00
parent 1d2753e0b8
commit 3ed046ed1a
No known key found for this signature in database
GPG Key ID: 7BAE94BC7141A594
5 changed files with 54 additions and 54 deletions

View File

@ -231,6 +231,23 @@ class CloudRegion(object):
"""Return a keystoneauth plugin from the auth credentials."""
return self._auth
def insert_user_agent(self):
"""Set sdk information into the user agent of the Session.
.. warning::
This method is here to be used by os-client-config. It exists
as a hook point so that os-client-config can provice backwards
compatibility and still be in the User Agent for people using
os-client-config directly.
Normal consumers of SDK should use app_name and app_version. However,
if someone else writes a subclass of
:class:`~openstack.config.cloud_region.CloudRegion` it may be
desirable.
"""
self._keystone_session.additional_user_agent.append(
('openstacksdk', openstack_version.__version__))
def get_session(self):
"""Return a keystoneauth session based on the auth credentials."""
if self._keystone_session is None:
@ -252,9 +269,7 @@ class CloudRegion(object):
cert=cert,
timeout=self.config['api_timeout'],
discovery_cache=self._discovery_cache)
if hasattr(self._keystone_session, 'additional_user_agent'):
self._keystone_session.additional_user_agent.append(
('openstacksdk', openstack_version.__version__))
self.insert_user_agent()
# Using old keystoneauth with new os-client-config fails if
# we pass in app_name and app_version. Those are not essential,
# nor a reason to bump our minimum, so just test for the session

View File

@ -22,7 +22,8 @@ _defaults = None
_defaults_lock = threading.Lock()
def get_defaults():
# json_path argument is there for os-client-config
def get_defaults(json_path=_json_path):
global _defaults
if _defaults is not None:
return _defaults.copy()
@ -44,7 +45,7 @@ def get_defaults():
cert=None,
key=None,
)
with open(_json_path, 'r') as json_file:
with open(json_path, 'r') as json_file:
updates = json.load(json_file)
if updates is not None:
tmp_defaults.update(updates)

View File

@ -72,19 +72,6 @@ BOOL_KEYS = ('insecure', 'cache')
FORMAT_EXCLUSIONS = frozenset(['password'])
# NOTE(dtroyer): This turns out to be not the best idea so let's move
# overriding defaults to a kwarg to OpenStackConfig.__init__()
# Remove this sometime in June 2015 once OSC is comfortably
# changed-over and global-defaults is updated.
def set_default(key, value):
warnings.warn(
"Use of set_default() is deprecated. Defaults should be set with the "
"`override_defaults` parameter of OpenStackConfig."
)
defaults.get_defaults() # make sure the dict is initialized
defaults._defaults[key] = value
def get_boolean(value):
if value is None:
return False
@ -95,30 +82,6 @@ def get_boolean(value):
return False
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_') or k.startswith(envvar_prefix))
and not k.startswith('OS_TEST') # infra CI var
and not k.startswith('OS_STD') # oslotest var
and not k.startswith('OS_LOG') # oslotest var
]
for k in environkeys:
newkey = k.split('_', 1)[-1].lower()
ret[newkey] = os.environ[k]
# If the only environ keys are selectors or behavior modification, don't
# return anything
selectors = set([
'OS_CLOUD', 'OS_REGION_NAME',
'OS_CLIENT_CONFIG_FILE', 'OS_CLIENT_SECURE_FILE', 'OS_CLOUD_NAME'])
if set(environkeys) - selectors:
return ret
return None
def _merge_clouds(old_dict, new_dict):
"""Like dict.update, except handling nested dicts."""
ret = old_dict.copy()
@ -179,6 +142,12 @@ def _fix_argv(argv):
class OpenStackConfig(object):
# These two attribute are to allow os-client-config to plumb in its
# local versions for backwards compat.
# They should not be used by anyone else.
_cloud_region_class = cloud_region.CloudRegion
_defaults_module = defaults
def __init__(self, config_files=None, vendor_files=None,
override_defaults=None, force_ipv4=None,
envvar_prefix=None, secure_files=None,
@ -208,7 +177,7 @@ class OpenStackConfig(object):
if secure_file_override:
self._secure_files.insert(0, secure_file_override)
self.defaults = defaults.get_defaults()
self.defaults = self._defaults_module.get_defaults()
if override_defaults:
self.defaults.update(override_defaults)
@ -262,7 +231,7 @@ class OpenStackConfig(object):
self.default_cloud = self._get_envvar('OS_CLOUD')
if load_envvars:
envvars = _get_os_environ(envvar_prefix=envvar_prefix)
envvars = self._get_os_environ(envvar_prefix=envvar_prefix)
if envvars:
self.cloud_config['clouds'][self.envvar_key] = envvars
if not self.default_cloud:
@ -323,6 +292,29 @@ class OpenStackConfig(object):
# password = self._pw_callback(prompt="Password: ")
self._pw_callback = pw_func
def _get_os_environ(self, envvar_prefix=None):
ret = self._defaults_module.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_') or k.startswith(envvar_prefix))
and not k.startswith('OS_TEST') # infra CI var
and not k.startswith('OS_STD') # oslotest var
and not k.startswith('OS_LOG') # oslotest var
]
for k in environkeys:
newkey = k.split('_', 1)[-1].lower()
ret[newkey] = os.environ[k]
# If the only environ keys are selectors or behavior modification,
# don't return anything
selectors = set([
'OS_CLOUD', 'OS_REGION_NAME',
'OS_CLIENT_CONFIG_FILE', 'OS_CLIENT_SECURE_FILE', 'OS_CLOUD_NAME'])
if set(environkeys) - selectors:
return ret
return None
def _get_envvar(self, key, default=None):
if not self._load_envvars:
return default
@ -1111,7 +1103,7 @@ class OpenStackConfig(object):
cloud_name = ''
else:
cloud_name = str(cloud)
return cloud_region.CloudRegion(
return self._cloud_region_class(
name=cloud_name,
region_name=config['region_name'],
config=config,
@ -1208,7 +1200,7 @@ class OpenStackConfig(object):
cloud_name = ''
else:
cloud_name = str(cloud)
return cloud_region.CloudRegion(
return self._cloud_region_class(
name=cloud_name,
region_name=config['region_name'],
config=self._normalize_keys(config),

View File

@ -24,7 +24,6 @@ import yaml
from openstack import config
from openstack.config import cloud_region
from openstack.config import defaults
from openstack.config import loader
from openstack import exceptions
from openstack.tests.unit.config import base
@ -1020,13 +1019,6 @@ class TestConfigDefault(base.TestCase):
self._assert_cloud_details(cc)
self.assertEqual('password', cc.auth_type)
def test_set_default_before_init(self):
loader.set_default('identity_api_version', '4')
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])
cc = c.get_one(cloud='_test-cloud_', argparse=None)
self.assertEqual('4', cc.identity_api_version)
class TestBackwardsCompatibility(base.TestCase):