Reset the compute_rpcapi in Compute manager on SIGHUP

This links Service.reset() to the manager, which for compute will
rebuild the compute_rpcapi and thus re-determine the appropriate
RPC versions.

Change-Id: Ifec7f6ff604d1e5f3663633065e9a55baacffec8
This commit is contained in:
Dan Smith 2015-12-04 13:07:51 -08:00
parent 7acad854b9
commit c4ca1abb4a
6 changed files with 29 additions and 1 deletions

View File

@ -718,6 +718,10 @@ class ComputeManager(manager.Manager):
self.use_legacy_block_device_info = \
self.driver.need_legacy_block_device_info
def reset(self):
LOG.info(_LI('Reloading compute RPC API'))
self.compute_rpcapi = compute_rpcapi.ComputeAPI()
def _get_resource_tracker(self, nodename):
rt = self._resource_tracker_dict.get(nodename)
if not rt:

View File

@ -333,7 +333,6 @@ class ComputeAPI(object):
self.client = self.get_client(target, version_cap, serializer)
def _determine_version_cap(self, target):
# FIXME(danms): We should reload this on SIGHUP, or by timer
service_version = objects.Service.get_minimum_version(
context.get_admin_context(), 'nova-compute')
history = service_obj.SERVICE_VERSION_HISTORY

View File

@ -119,3 +119,9 @@ class Manager(base.Base, PeriodicTasks):
Child classes should override this method.
"""
pass
def reset(self):
"""Hook called on SIGHUP to signal the manager to re-read any
dynamic configuration or do any reconfiguration tasks.
"""
pass

View File

@ -331,6 +331,9 @@ class Service(service.Service):
LOG.error(_LE('Temporary directory is invalid: %s'), e)
sys.exit(1)
def reset(self):
self.manager.reset()
class WSGIService(service.Service):
"""Provides ability to launch API from a 'paste' configuration."""

View File

@ -2867,6 +2867,13 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase):
mock_save.assert_called_once_with()
mock_rt.assert_called_once_with(self.context, instance)
def test_reset_reloads_rpcapi(self):
orig_rpc = self.compute.compute_rpcapi
with mock.patch('nova.compute.rpcapi.ComputeAPI') as mock_rpc:
self.compute.reset()
mock_rpc.assert_called_once_with()
self.assertIsNot(orig_rpc, self.compute.compute_rpcapi)
class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
def setUp(self):

View File

@ -258,6 +258,15 @@ class ServiceTestCase(test.NoDBTestCase):
serv.rpcserver.stop.assert_called_once_with()
serv.rpcserver.wait.assert_called_once_with()
def test_reset(self):
serv = service.Service(self.host,
self.binary,
self.topic,
'nova.tests.unit.test_service.FakeManager')
with mock.patch.object(serv.manager, 'reset') as mock_reset:
serv.reset()
mock_reset.assert_called_once_with()
class TestWSGIService(test.NoDBTestCase):