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:
parent
1d2753e0b8
commit
3ed046ed1a
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
Loading…
Reference in New Issue