Update OVS detection plugin for Keystone v3

To properly support Keystone V3, we must also properly convey the
domain information to the underlaying Keystone client.

Story: 2005045
Task: 29542

Change-Id: I57f233578132a3689a2182c53483d8110f15bcea
This commit is contained in:
Witek Bedyk 2019-02-19 13:46:21 +01:00
parent 4fd4b26f54
commit 5fe2a6d7b9
2 changed files with 47 additions and 20 deletions

View File

@ -47,12 +47,15 @@ use_health_metrics = True
publish_router_capacity = False
# Acceptable arguments
acceptable_args = ['username', 'password', 'project_name',
'user_domain_name', 'user_domain_id',
'project_domain_name', 'project_domain_id'
'auth_url', 'cache_dir', 'neutron_refresh', 'ovs_cmd',
'network_use_bits', 'check_router_ha', 'region_name',
'included_interface_re', 'conf_file_path', 'use_absolute_metrics',
'use_rate_metrics', 'use_health_metrics', 'publish_router_capacity']
# Arguments which must be ignored if provided
ignorable_args = ['username', 'password', 'project_name',
ignorable_args = ['username', 'password', 'project_name', 'user_domain_name',
'user_domain_id', 'project_domain_name', 'project_domain_id',
'auth_url', 'region_name', 'conf_file_path']
@ -109,14 +112,29 @@ class Ovs(detection.Plugin):
'Run pip install monasca-agent[ovs] '
'to install all dependencies.'))
else:
for_opts = [{'opt': cfg.StrOpt('region', default='RegionOne'), 'group': 'service_auth'},
for_opts = [{'opt': cfg.StrOpt('region', default='RegionOne'),
'group': 'service_auth'},
{'opt': cfg.StrOpt('region_name'), 'group': 'nova'},
{'opt': cfg.StrOpt('nova_region_name'), 'group': 'DEFAULT'},
{'opt': cfg.StrOpt('username'), 'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('password'), 'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('project_name'), 'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('auth_url'), 'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('identity_uri'), 'group': 'keystone_authtoken'}]
{'opt': cfg.StrOpt('nova_region_name'),
'group': 'DEFAULT'},
{'opt': cfg.StrOpt('username'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('password'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('project_name'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('user_domain_name'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('user_domain_id'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('project_domain_name'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('project_domain_id'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('auth_url'),
'group': 'keystone_authtoken'},
{'opt': cfg.StrOpt('identity_uri'),
'group': 'keystone_authtoken'}]
self.conf = utils.load_oslo_configuration(from_cmd=self.cmd,
in_project='neutron',
for_opts=for_opts
@ -167,6 +185,8 @@ class Ovs(detection.Plugin):
cfg_needed = {'username': 'username',
'password': 'password',
'project_name': 'project_name'}
cfg_domain = ['user_domain_name', 'user_domain_id',
'project_domain_name', 'project_domain_id']
# Start with plugin-specific configuration parameters
init_config = {'cache_dir': cache_dir,
@ -182,6 +202,10 @@ class Ovs(detection.Plugin):
for option in cfg_needed:
init_config[option] = self.get_option(cfg_section, cfg_needed[option])
for option in cfg_domain:
if self.has_option(cfg_section, option):
init_config[option] = self.get_option(cfg_section, option)
# Create an identity URI (again, slightly different for Devstack)
if self.has_option(cfg_section, 'auth_url'):
init_config['auth_url'] = self.get_option(cfg_section, 'auth_url')

View File

@ -52,9 +52,10 @@ class TestOvs(unittest.TestCase):
unittest.TestCase.setUp(self)
with patch.object(Ovs, '_detect') as mock_detect:
self.ovs_obj = Ovs('temp_dir')
self.has_option = [False, True]
self.has_option = [True, False, True, False, False, True]
self.get_value = [MagicMock(), MagicMock(), MagicMock(),
'http://10.10.10.10', 'region1']
MagicMock(), MagicMock(), 'http://10.10.10.10',
'region1']
self.assertTrue(mock_detect.called)
def _detect(self, ovs_obj, file_config_valid=True):
@ -227,6 +228,8 @@ class TestOvs(unittest.TestCase):
self.ovs_obj.args = {'username': 'admin',
'password': 'password',
'project_name': 'tenant',
'user_domain_name': 'default',
'project_domain_name': 'default',
'auth_url': '10.10.10.20',
'region_name': 'region0',
'neutron_refresh': 13000,
@ -234,15 +237,15 @@ class TestOvs(unittest.TestCase):
'invalid_arg': 'inv-arg'}
result = self._build_config_with_arg(self.ovs_obj)
self.assertTrue(mock_log_warn.called)
self.assertEqual(mock_log_warn.call_count, 6)
self.assertEqual(mock_log_warn.call_count, 8)
self.assertEqual(result['ovs']['init_config']['included_interface_re'],
'qg.*|vhu.*|sg.*')
def test_build_config_if_auth_version(self):
self.ovs_obj.neutron_conf = 'neutron-conf'
self.has_option = [True, True]
self.get_value = [MagicMock(), MagicMock(), MagicMock(),
'http://10.10.10.10',
self.has_option = [True, False, True, False, True, True]
self.get_value = [MagicMock(), MagicMock(), MagicMock(), MagicMock(),
MagicMock(), 'http://10.10.10.10',
'http://10.10.10.10', 'region1']
result = self._build_config_without_args(self.ovs_obj)
self.assertEqual(result['ovs']['init_config']['auth_url'],
@ -250,9 +253,9 @@ class TestOvs(unittest.TestCase):
def test_build_config_if_auth_url_has_version(self):
self.ovs_obj.neutron_conf = 'neutron-conf'
self.has_option = [True, True]
self.get_value = [MagicMock(), MagicMock(), MagicMock(),
'http://10.10.10.10/v1',
self.has_option = [True, False, True, False, True, True]
self.get_value = [MagicMock(), MagicMock(), MagicMock(), MagicMock(),
MagicMock(), 'http://10.10.10.10/v1',
'http://10.10.10.10/v1', 'region1']
result = self._build_config_without_args(self.ovs_obj)
self.assertEqual(result['ovs']['init_config']['auth_url'],
@ -260,9 +263,9 @@ class TestOvs(unittest.TestCase):
def test_build_config_region_name_from_nova(self):
self.ovs_obj.neutron_conf = 'neutron-conf'
self.has_option = [False, False]
self.get_value = [MagicMock(), MagicMock(), MagicMock(),
'http://10.10.10.10', 'region2']
self.has_option = [True, False, True, False, False, False]
self.get_value = [MagicMock(), MagicMock(), MagicMock(), MagicMock(),
MagicMock(), 'http://10.10.10.10', 'region2']
result = self._build_config_without_args(self.ovs_obj)
self.assertEqual(result['ovs']['init_config']['auth_url'],
'http://10.10.10.10')