endpoint notification v2 API compatibility

Fallback to v2 API behaviour for processing endpoints for older
OpenStack releases where the v2 API is still the default.

Change-Id: Ieb9afed0a6442fac48f8e1ccc0f5c34626a3be18
Closes-Bug: 1889180
This commit is contained in:
James Page 2020-07-28 10:13:55 +01:00
parent 819c41acda
commit e02f0590a7
2 changed files with 50 additions and 2 deletions

View File

@ -2108,7 +2108,15 @@ def service_endpoint_dict(service_name):
endpoint_dict = {}
for endpoint in current_endpoints:
if endpoint['service_id'] == service_id:
endpoint_dict[endpoint['interface']] = endpoint['url']
if 'interface' in endpoint:
# NOTE: v3 API response - endpoint per interface
endpoint_dict[endpoint['interface']] = endpoint['url']
else:
# NOTE: v2 API response - endpoint has all interfaces
for interface in ('public', 'internal', 'admin'):
endpoint_url = endpoint.get('{}url'.format(interface))
if endpoint_url:
endpoint_dict[interface] = endpoint_url
return endpoint_dict

View File

@ -978,7 +978,7 @@ class TestKeystoneUtils(CharmTestCase):
any_order=True)
@patch.object(utils, 'get_manager')
def test_service_endpoint_dict(self, mock_get_manager):
def test_service_endpoint_dict_v3(self, mock_get_manager):
mock_manager = MagicMock()
mock_get_manager.return_value = mock_manager
mock_manager.resolve_service_id.return_value = None
@ -1019,6 +1019,46 @@ class TestKeystoneUtils(CharmTestCase):
{}
)
@patch.object(utils, 'get_manager')
def test_service_endpoint_dict_v2(self, mock_get_manager):
mock_manager = MagicMock()
mock_get_manager.return_value = mock_manager
mock_manager.resolve_service_id.return_value = None
self.assertIsNone(utils.service_endpoint_dict('dummyservice'))
mock_manager.reset_mock()
mock_manager.resolve_service_id.return_value = 'd123456'
mock_manager.list_endpoints.return_value = [
{'service_id': 'd123456',
'internalurl': 'http://dummyservice.demo.com',
'publicurl': 'http://anotherservice.demo.com'},
]
self.assertEqual(
utils.service_endpoint_dict('dummyservice'),
{'internal': 'http://dummyservice.demo.com',
'public': 'http://anotherservice.demo.com'}
)
mock_manager.reset_mock()
mock_manager.resolve_service_id.return_value = 'd123456'
mock_manager.list_endpoints.return_value = [
{'service_id': 'd789102',
'internalurl': 'http://dummyservice.demo.com',
'publicurl': 'http://anotherservice.demo.com'},
{'service_id': 'd789102',
'internalurl': 'http://dummyservice.demo.com',
'publicurl': 'http://anotherservice.demo.com'},
]
self.assertEqual(
utils.service_endpoint_dict('dummyservice'),
{}
)
def test_get_admin_passwd_pwd_set(self):
self.test_config.set('admin-password', 'supersecret')
self.assertEqual(utils.get_admin_passwd(), 'supersecret')