Fix setting of admin_password
admin_password wasn't obtained from the client's config file, so when it wasn't specified in CLI it led to an error. The patch moves obtaining values from the config file to a function, which is executed before override values (from CLI) are set, so they may be overridden. Change-Id: If20ae0ea1e38d1b670d5a395ac004f74466c404a
This commit is contained in:
parent
c48fd2aa0a
commit
18db2c939a
@ -26,9 +26,13 @@ Some required options differ among deployed clouds but the right values cannot
|
|||||||
be discovered by the user. The file used here could be created by an installer,
|
be discovered by the user. The file used here could be created by an installer,
|
||||||
or manually if necessary.
|
or manually if necessary.
|
||||||
|
|
||||||
3. Values provided on the command line. These override all other values.
|
3. Values provided in client's cloud config file or as an environment
|
||||||
|
variables, see documentation of os-client-config
|
||||||
|
https://docs.openstack.org/developer/os-client-config/
|
||||||
|
|
||||||
4. Discovery. Values that have not been provided in steps [2-3] will be
|
4. Values provided on the command line. These override all other values.
|
||||||
|
|
||||||
|
5. Discovery. Values that have not been provided in steps [2-4] will be
|
||||||
obtained by querying the cloud.
|
obtained by querying the cloud.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -131,13 +135,12 @@ def main():
|
|||||||
# There are no deployer input options in DEFAULT
|
# There are no deployer input options in DEFAULT
|
||||||
for (key, value) in deployer_input.items(section):
|
for (key, value) in deployer_input.items(section):
|
||||||
conf.set(section, key, value, priority=True)
|
conf.set(section, key, value, priority=True)
|
||||||
|
# get and set auth data from client's config (os-client-config support)
|
||||||
|
set_cloud_config_values(conf, args)
|
||||||
|
# set overrides - vales specified in CLI
|
||||||
for section, key, value in args.overrides:
|
for section, key, value in args.overrides:
|
||||||
conf.set(section, key, value, priority=True)
|
conf.set(section, key, value, priority=True)
|
||||||
if conf.has_option("identity", "uri"):
|
uri = conf.get("identity", "uri")
|
||||||
uri = conf.get("identity", "uri")
|
|
||||||
else:
|
|
||||||
uri = args.config['auth'].get('auth_url')
|
|
||||||
conf.set("identity", "uri", uri)
|
|
||||||
api_version = 2
|
api_version = 2
|
||||||
v3_only = False
|
v3_only = False
|
||||||
if "v3" in uri and v3_only:
|
if "v3" in uri and v3_only:
|
||||||
@ -166,7 +169,7 @@ def main():
|
|||||||
# new way for running using accounts file
|
# new way for running using accounts file
|
||||||
conf.set("auth", "use_dynamic_credentials", "False")
|
conf.set("auth", "use_dynamic_credentials", "False")
|
||||||
conf.set("auth", "test_accounts_file", "etc/accounts.yaml")
|
conf.set("auth", "test_accounts_file", "etc/accounts.yaml")
|
||||||
clients = ClientManager(conf, not args.non_admin, args)
|
clients = ClientManager(conf, not args.non_admin)
|
||||||
swift_discover = conf.get_defaulted('object-storage-feature-enabled',
|
swift_discover = conf.get_defaulted('object-storage-feature-enabled',
|
||||||
'discoverability')
|
'discoverability')
|
||||||
services = api_discovery.discover(
|
services = api_discovery.discover(
|
||||||
@ -311,6 +314,38 @@ def parse_overrides(overrides):
|
|||||||
return new_overrides
|
return new_overrides
|
||||||
|
|
||||||
|
|
||||||
|
def set_cloud_config_values(conf, args):
|
||||||
|
"""Set values from client's cloud config file.
|
||||||
|
|
||||||
|
If the cloud config files was provided, set admin and non-admin credentials
|
||||||
|
and uri.
|
||||||
|
Note: the values may be later overriden by values specified in CLI.
|
||||||
|
|
||||||
|
:conf TempestConf object
|
||||||
|
:args parsed arguments including client config values
|
||||||
|
"""
|
||||||
|
cloud_creds = args.config.get('auth')
|
||||||
|
if cloud_creds:
|
||||||
|
try:
|
||||||
|
if args.non_admin:
|
||||||
|
conf.set('identity', 'username', cloud_creds['username'])
|
||||||
|
conf.set('identity',
|
||||||
|
'tenant_name',
|
||||||
|
cloud_creds['project_name'])
|
||||||
|
conf.set('identity', 'password', cloud_creds['password'])
|
||||||
|
else:
|
||||||
|
conf.set('identity', 'admin_username', cloud_creds['username'])
|
||||||
|
conf.set('identity',
|
||||||
|
'admin_tenant_name',
|
||||||
|
cloud_creds['project_name'])
|
||||||
|
conf.set('identity', 'admin_password', cloud_creds['password'])
|
||||||
|
conf.set('identity', 'uri', cloud_creds['auth_url'])
|
||||||
|
|
||||||
|
except cfg.NoSuchOptError:
|
||||||
|
LOG.warning(
|
||||||
|
'Could not load some identity options from cloud config file')
|
||||||
|
|
||||||
|
|
||||||
class ClientManager(object):
|
class ClientManager(object):
|
||||||
"""Manager of various OpenStack API clients.
|
"""Manager of various OpenStack API clients.
|
||||||
|
|
||||||
@ -363,16 +398,11 @@ class ClientManager(object):
|
|||||||
else:
|
else:
|
||||||
return "v2"
|
return "v2"
|
||||||
|
|
||||||
def __init__(self, conf, admin, args):
|
def __init__(self, conf, admin):
|
||||||
self.identity_version = self.get_identity_version(conf)
|
self.identity_version = self.get_identity_version(conf)
|
||||||
username = None
|
username = None
|
||||||
password = None
|
password = None
|
||||||
tenant_name = None
|
tenant_name = None
|
||||||
os_client_creds = args.config.get('auth')
|
|
||||||
if os_client_creds:
|
|
||||||
username = os_client_creds.get('username')
|
|
||||||
password = os_client_creds.get('password')
|
|
||||||
tenant_name = os_client_creds.get('project_name')
|
|
||||||
if admin:
|
if admin:
|
||||||
try:
|
try:
|
||||||
username = conf.get_defaulted('auth', 'admin_username')
|
username = conf.get_defaulted('auth', 'admin_username')
|
||||||
@ -395,13 +425,9 @@ class ClientManager(object):
|
|||||||
DEFAULTS_FILE)
|
DEFAULTS_FILE)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
# override values only when were set in CLI
|
username = conf.get_defaulted('identity', 'username')
|
||||||
if conf.has_option('identity', 'username'):
|
password = conf.get_defaulted('identity', 'password')
|
||||||
username = conf.get_defaulted('identity', 'username')
|
tenant_name = conf.get_defaulted('identity', 'tenant_name')
|
||||||
if conf.has_option('identity', 'password'):
|
|
||||||
password = conf.get_defaulted('identity', 'password')
|
|
||||||
if conf.has_option('identity', 'tenant_name'):
|
|
||||||
tenant_name = conf.get_defaulted('identity', 'tenant_name')
|
|
||||||
|
|
||||||
except cfg.NoSuchOptError:
|
except cfg.NoSuchOptError:
|
||||||
LOG.warning(
|
LOG.warning(
|
||||||
|
@ -67,7 +67,7 @@ class BaseConfigTempestTest(base.BaseTestCase):
|
|||||||
mock_function = mock.Mock(return_value=False)
|
mock_function = mock.Mock(return_value=False)
|
||||||
func2mock = 'os_client_config.cloud_config.CloudConfig.config.get'
|
func2mock = 'os_client_config.cloud_config.CloudConfig.config.get'
|
||||||
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
||||||
return tool.ClientManager(conf, admin=admin, args=mock_args)
|
return tool.ClientManager(conf, admin=admin)
|
||||||
|
|
||||||
|
|
||||||
class BaseServiceTest(base.BaseTestCase):
|
class BaseServiceTest(base.BaseTestCase):
|
||||||
|
@ -148,7 +148,8 @@ class TestOsClientConfigSupport(BaseConfigTempestTest):
|
|||||||
self.assertEqual(exp_pass, password)
|
self.assertEqual(exp_pass, password)
|
||||||
self.assertEqual(exp_tenant, tenant_name)
|
self.assertEqual(exp_tenant, tenant_name)
|
||||||
|
|
||||||
def _override_setup(self):
|
@mock.patch('os_client_config.cloud_config.CloudConfig')
|
||||||
|
def _override_setup(self, mock_args):
|
||||||
cloud_args = {
|
cloud_args = {
|
||||||
'username': 'cloud_user',
|
'username': 'cloud_user',
|
||||||
'password': 'cloud_pass',
|
'password': 'cloud_pass',
|
||||||
@ -161,53 +162,70 @@ class TestOsClientConfigSupport(BaseConfigTempestTest):
|
|||||||
func2mock = 'config_tempest.config_tempest.identity.get_tenant_by_name'
|
func2mock = 'config_tempest.config_tempest.identity.get_tenant_by_name'
|
||||||
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
||||||
|
|
||||||
@mock.patch('os_client_config.cloud_config.CloudConfig')
|
def _obtain_client_config_data(self, mock_args, admin):
|
||||||
def test_init_manager_client_config(self, mock_args):
|
|
||||||
cloud_args = {
|
cloud_args = {
|
||||||
'username': 'cloud_user',
|
'username': 'cloud_user',
|
||||||
'password': 'cloud_pass',
|
'password': 'cloud_pass',
|
||||||
'project_name': 'cloud_project'
|
'project_name': 'cloud_project',
|
||||||
|
'auth_url': 'http://auth.url.com/'
|
||||||
}
|
}
|
||||||
mock_function = mock.Mock(return_value=cloud_args)
|
mock_function = mock.Mock(return_value=cloud_args)
|
||||||
func2mock = 'os_client_config.cloud_config.CloudConfig.config.get'
|
func2mock = 'os_client_config.cloud_config.CloudConfig.config.get'
|
||||||
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
||||||
# remove options, pretend like they aren't set in CLI
|
# create an empty conf
|
||||||
self.conf.remove_option('identity', 'username')
|
conf = tool.TempestConf()
|
||||||
self.conf.remove_option('identity', 'password')
|
conf.set('identity', 'uri', cloud_args['auth_url'], priority=True)
|
||||||
self.conf.remove_option('identity', 'tenant_name')
|
# call the function and check if data were obtained properly
|
||||||
manager = tool.ClientManager(self.conf, admin=False, args=mock_args)
|
tool.set_cloud_config_values(conf, mock_args)
|
||||||
# check if cloud_args credentials were used
|
if admin:
|
||||||
self._check_credentials(manager,
|
self.assertEqual(cloud_args['username'],
|
||||||
cloud_args['username'],
|
conf.get('identity', 'admin_username'))
|
||||||
cloud_args['password'],
|
self.assertEqual(cloud_args['password'],
|
||||||
cloud_args['project_name'])
|
conf.get('identity', 'admin_password'))
|
||||||
|
self.assertEqual(cloud_args['project_name'],
|
||||||
|
conf.get('identity', 'admin_tenant_name'))
|
||||||
|
else:
|
||||||
|
self.assertEqual(cloud_args['username'],
|
||||||
|
conf.get('identity', 'username'))
|
||||||
|
self.assertEqual(cloud_args['password'],
|
||||||
|
conf.get('identity', 'password'))
|
||||||
|
self.assertEqual(cloud_args['project_name'],
|
||||||
|
conf.get('identity', 'tenant_name'))
|
||||||
|
|
||||||
|
@mock.patch('os_client_config.cloud_config.CloudConfig',
|
||||||
|
**{'non_admin': True})
|
||||||
|
def test_init_manager_client_config(self, mock_args):
|
||||||
|
self._obtain_client_config_data(mock_args, False)
|
||||||
|
|
||||||
|
@mock.patch('os_client_config.cloud_config.CloudConfig',
|
||||||
|
**{'non_admin': False})
|
||||||
|
def test_init_manager_client_config_as_admin(self, mock_args):
|
||||||
|
self._obtain_client_config_data(mock_args, True)
|
||||||
|
|
||||||
@mock.patch('os_client_config.cloud_config.CloudConfig')
|
@mock.patch('os_client_config.cloud_config.CloudConfig')
|
||||||
def test_init_manager_client_config_get_default(self, mock_args):
|
def test_init_manager_client_config_get_default(self, mock_args):
|
||||||
mock_function = mock.Mock(return_value={})
|
mock_function = mock.Mock(return_value={})
|
||||||
func2mock = 'os_client_config.cloud_config.CloudConfig.config.get'
|
func2mock = 'os_client_config.cloud_config.CloudConfig.config.get'
|
||||||
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
self.useFixture(MonkeyPatch(func2mock, mock_function))
|
||||||
manager = tool.ClientManager(self.conf, admin=False, args=mock_args)
|
manager = tool.ClientManager(self.conf, admin=False)
|
||||||
# cloud_args is empty => check if default credentials were used
|
# cloud_args is empty => check if default credentials were used
|
||||||
self._check_credentials(manager,
|
self._check_credentials(manager,
|
||||||
self.conf.get('identity', 'username'),
|
self.conf.get('identity', 'username'),
|
||||||
self.conf.get('identity', 'password'),
|
self.conf.get('identity', 'password'),
|
||||||
self.conf.get('identity', 'tenant_name'))
|
self.conf.get('identity', 'tenant_name'))
|
||||||
|
|
||||||
@mock.patch('os_client_config.cloud_config.CloudConfig')
|
def test_init_manager_client_config_override(self):
|
||||||
def test_init_manager_client_config_override(self, mock_args):
|
|
||||||
self._override_setup()
|
self._override_setup()
|
||||||
manager = tool.ClientManager(self.conf, admin=False, args=mock_args)
|
manager = tool.ClientManager(self.conf, admin=False)
|
||||||
# check if cloud_args credentials were overrided by the ones set in CLI
|
# check if cloud_args credentials were overrided by the ones set in CLI
|
||||||
self._check_credentials(manager,
|
self._check_credentials(manager,
|
||||||
self.conf.get('identity', 'username'),
|
self.conf.get('identity', 'username'),
|
||||||
self.conf.get('identity', 'password'),
|
self.conf.get('identity', 'password'),
|
||||||
self.conf.get('identity', 'tenant_name'))
|
self.conf.get('identity', 'tenant_name'))
|
||||||
|
|
||||||
@mock.patch('os_client_config.cloud_config.CloudConfig')
|
def test_init_manager_client_config_admin_override(self):
|
||||||
def test_init_manager_client_config_admin_override(self, mock_args):
|
|
||||||
self._override_setup()
|
self._override_setup()
|
||||||
manager = tool.ClientManager(self.conf, admin=True, args=mock_args)
|
manager = tool.ClientManager(self.conf, admin=True)
|
||||||
# check if cloud_args credentials were overrided by admin ones
|
# check if cloud_args credentials were overrided by admin ones
|
||||||
self._check_credentials(manager,
|
self._check_credentials(manager,
|
||||||
self.conf.get('identity', 'admin_username'),
|
self.conf.get('identity', 'admin_username'),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user