From afbe72f07893f8fa0e66aaff95737bbce53bf428 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Tue, 12 Jan 2016 11:09:46 +0000 Subject: [PATCH 1/2] Delete the old quantum catalog entry if a neutron entry is present --- hooks/keystone_hooks.py | 4 ++++ hooks/keystone_utils.py | 26 ++++++++++++++++++++++++++ hooks/manager.py | 10 +++++++--- unit_tests/test_keystone_hooks.py | 25 +++++++++++++++++++++++++ unit_tests/test_keystone_utils.py | 22 ++++++++++++++++++++++ 5 files changed, 84 insertions(+), 3 deletions(-) diff --git a/hooks/keystone_hooks.py b/hooks/keystone_hooks.py index 058abc04..c3aac1eb 100755 --- a/hooks/keystone_hooks.py +++ b/hooks/keystone_hooks.py @@ -84,6 +84,8 @@ from keystone_utils import ( REQUIRED_INTERFACES, check_optional_relations, ensure_pki_cert_paths, + is_service_present, + delete_service_entry, ) from charmhelpers.contrib.hahelpers.cluster import ( @@ -341,6 +343,8 @@ def identity_changed(relation_id=None, remote_unit=None): return add_service_to_keystone(relation_id, remote_unit) + if is_service_present('neutron', 'network'): + delete_service_entry('quantum', 'network') settings = relation_get(rid=relation_id, unit=remote_unit) service = settings.get('service', None) if service: diff --git a/hooks/keystone_utils.py b/hooks/keystone_utils.py index d6a0d032..155ea644 100644 --- a/hooks/keystone_utils.py +++ b/hooks/keystone_utils.py @@ -244,6 +244,10 @@ valid_services = { "type": "network", "desc": "Quantum Networking Service" }, + "neutron": { + "type": "network", + "desc": "Neutron Networking Service" + }, "oxygen": { "type": "oxygen", "desc": "Oxygen Cloud Image Service" @@ -486,6 +490,28 @@ def get_admin_token(): error_out('Could not find admin_token line in %s' % KEYSTONE_CONF) +def is_service_present(service_name, service_type): + import manager + manager = manager.KeystoneManager(endpoint=get_local_endpoint(), + token=get_admin_token()) + service_id = manager.resolve_service_id(service_name, service_type) + return service_id is not None + + +def delete_service_entry(service_name, service_type): + """ Delete a service from keystone""" + import manager + manager = manager.KeystoneManager(endpoint=get_local_endpoint(), + token=get_admin_token()) + service_id = manager.resolve_service_id(service_name, service_type) + if service_id: + print "Hi!" + print service_id + print manager.api.services.delete + manager.api.services.delete(service_id) + log("Deleted service entry '%s'" % service_name, level=DEBUG) + + def create_service_entry(service_name, service_type, service_desc, owner=None): """ Add a new service entry to keystone if one does not already exist """ import manager diff --git a/hooks/manager.py b/hooks/manager.py index 8c8968d3..17c6c029 100644 --- a/hooks/manager.py +++ b/hooks/manager.py @@ -28,12 +28,16 @@ class KeystoneManager(object): if name == u['name']: return u['id'] - def resolve_service_id(self, name): + def resolve_service_id(self, name, service_type=None): """Find the service_id of a given service""" services = [s._info for s in self.api.services.list()] for s in services: - if name == s['name']: - return s['id'] + if service_type: + if name == s['name'] and service_type == s['type']: + return s['id'] + else: + if name == s['name']: + return s['id'] def resolve_service_id_by_type(self, type): """Find the service_id of a given service""" diff --git a/unit_tests/test_keystone_hooks.py b/unit_tests/test_keystone_hooks.py index c6a05a21..dae936f7 100644 --- a/unit_tests/test_keystone_hooks.py +++ b/unit_tests/test_keystone_hooks.py @@ -71,6 +71,8 @@ TO_PATCH = [ 'get_netmask_for_address', 'get_address_in_network', 'git_install', + 'is_service_present', + 'delete_service_entry', ] @@ -623,6 +625,7 @@ class KeystoneRelationTests(CharmTestCase): mock_log, mock_is_db_initialised): mock_is_db_initialised.return_value = True self.is_db_ready.return_value = True + self.is_service_present.return_value = True mock_ensure_ssl_cert_master.return_value = False hooks.identity_changed( relation_id='identity-service:0', @@ -630,6 +633,28 @@ class KeystoneRelationTests(CharmTestCase): self.add_service_to_keystone.assert_called_with( 'identity-service:0', 'unit/0') + self.delete_service_entry.assert_called_with( + 'quantum', + 'network') + + @patch.object(hooks, 'is_db_initialised') + @patch('keystone_utils.log') + @patch('keystone_utils.ensure_ssl_cert_master') + @patch.object(hooks, 'hashlib') + @patch.object(hooks, 'send_notifications') + def test_identity_changed_leader_no_neutron(self, mock_send_notifications, + mock_hashlib, + mock_ensure_ssl_cert_master, + mock_log, + mock_is_db_initialised): + mock_is_db_initialised.return_value = True + self.is_db_ready.return_value = True + self.is_service_present.return_value = False + mock_ensure_ssl_cert_master.return_value = False + hooks.identity_changed( + relation_id='identity-service:0', + remote_unit='unit/0') + self.assertFalse(self.delete_service_entry.called) @patch.object(hooks, 'local_unit') @patch('keystone_utils.log') diff --git a/unit_tests/test_keystone_utils.py b/unit_tests/test_keystone_utils.py index 1da2644b..f8d75b04 100644 --- a/unit_tests/test_keystone_utils.py +++ b/unit_tests/test_keystone_utils.py @@ -703,3 +703,25 @@ class TestKeystoneUtils(CharmTestCase): ] self.assertEquals(render.call_args_list, expected) service_restart.assert_called_with('keystone') + + @patch.object(manager, 'KeystoneManager') + def test_is_service_present(self, KeystoneManager): + mock_keystone = MagicMock() + mock_keystone.resolve_service_id.return_value = 'sid1' + KeystoneManager.return_value = mock_keystone + self.assertTrue(utils.is_service_present('bob', 'bill')) + + @patch.object(manager, 'KeystoneManager') + def test_is_service_present_false(self, KeystoneManager): + mock_keystone = MagicMock() + mock_keystone.resolve_service_id.return_value = None + KeystoneManager.return_value = mock_keystone + self.assertFalse(utils.is_service_present('bob', 'bill')) + + @patch.object(manager, 'KeystoneManager') + def test_delete_service_entry(self, KeystoneManager): + mock_keystone = MagicMock() + mock_keystone.resolve_service_id.return_value = 'sid1' + KeystoneManager.return_value = mock_keystone + utils.delete_service_entry('bob', 'bill') + mock_keystone.api.services.delete.assert_called_with('sid1') From f09e067d8696f3a7ff77a7f5b243c2e75a384efa Mon Sep 17 00:00:00 2001 From: Liam Young Date: Tue, 12 Jan 2016 15:50:54 +0000 Subject: [PATCH 2/2] Remove debug prints --- hooks/keystone_utils.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/hooks/keystone_utils.py b/hooks/keystone_utils.py index 155ea644..26125819 100644 --- a/hooks/keystone_utils.py +++ b/hooks/keystone_utils.py @@ -505,9 +505,6 @@ def delete_service_entry(service_name, service_type): token=get_admin_token()) service_id = manager.resolve_service_id(service_name, service_type) if service_id: - print "Hi!" - print service_id - print manager.api.services.delete manager.api.services.delete(service_id) log("Deleted service entry '%s'" % service_name, level=DEBUG)