Merge "Prepare for os-client-config wrapper"
This commit is contained in:
@@ -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):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user