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:
parent
7acad854b9
commit
c4ca1abb4a
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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."""
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
||||
|
|
Loading…
Reference in New Issue