Skip to content

Commit

Permalink
[gnuoy, r=james-page] Delete the old quantum catalogue entry if a neu…
Browse files Browse the repository at this point in the history
…tron entry is present
  • Loading branch information
Liam Young committed Jan 13, 2016
2 parents 110dca5 + e654d7c commit 06b5b7d
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 3 deletions.
4 changes: 4 additions & 0 deletions hooks/keystone_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@
REQUIRED_INTERFACES,
check_optional_relations,
ensure_pki_cert_paths,
is_service_present,
delete_service_entry,
)

from charmhelpers.contrib.hahelpers.cluster import (
Expand Down Expand Up @@ -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:
Expand Down
23 changes: 23 additions & 0 deletions hooks/keystone_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,10 @@
"type": "network",
"desc": "Quantum Networking Service"
},
"neutron": {
"type": "network",
"desc": "Neutron Networking Service"
},
"oxygen": {
"type": "oxygen",
"desc": "Oxygen Cloud Image Service"
Expand Down Expand Up @@ -486,6 +490,25 @@ 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:
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
Expand Down
10 changes: 7 additions & 3 deletions hooks/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,16 @@ def resolve_user_id(self, name):
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"""
Expand Down
25 changes: 25 additions & 0 deletions unit_tests/test_keystone_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@
'get_netmask_for_address',
'get_address_in_network',
'git_install',
'is_service_present',
'delete_service_entry',
]


Expand Down Expand Up @@ -623,13 +625,36 @@ def test_identity_changed_leader(self, mock_send_notifications,
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',
remote_unit='unit/0')
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')
Expand Down
22 changes: 22 additions & 0 deletions unit_tests/test_keystone_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -703,3 +703,25 @@ def test_git_post_install(self, check_call, rmtree, copytree, symlink,
]
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')

0 comments on commit 06b5b7d

Please sign in to comment.