Don't cache RPC pin when service_version is 0

Its possible for RPC calls to be made before a nova-compute process
starts up. When this happens we cache the RPC pin of kilo. This causes
breakages in live-migrate, but in Mitaka we only work with Liberty.

Change-Id: I5f1e0904c34c4fe26fc75998441602925d2f0593
Closes-Bug: #1598860
This commit is contained in:
John Garbutt 2016-07-07 16:20:27 +01:00 committed by John Garbutt
parent 9fdb5a43f2
commit dc6b3ab6ef
2 changed files with 14 additions and 2 deletions

View File

@ -341,6 +341,17 @@ class ComputeAPI(object):
return LAST_VERSION
service_version = objects.Service.get_minimum_version(
context.get_admin_context(), 'nova-compute')
# NOTE(johngarbutt) when there are no nova-compute services running we
# get service_version == 0. In that case we do not want to cache
# this result, because we will get a better answer next time.
# As a sane default, return the version from the last release.
if service_version == 0:
LOG.debug("Not caching compute RPC version_cap, because min "
"service_version is 0. Please ensure a nova-compute "
"service has been started. Defaulting to Mitaka RPC.")
return self.VERSION_ALIASES["mitaka"]
history = service_obj.SERVICE_VERSION_HISTORY
try:
version_cap = history[service_version]['compute_rpc']

View File

@ -71,13 +71,14 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
compute_rpcapi.ComputeAPI)
@mock.patch('nova.objects.Service.get_minimum_version')
def test_auto_pin_kilo(self, mock_get_min):
def test_auto_pin_with_service_version_zero(self, mock_get_min):
mock_get_min.return_value = 0
self.flags(compute='auto', group='upgrade_levels')
compute_rpcapi.LAST_VERSION = None
rpcapi = compute_rpcapi.ComputeAPI()
self.assertEqual('4.0', rpcapi.client.version_cap)
self.assertEqual('4.11', rpcapi.client.version_cap)
mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute')
self.assertIsNone(compute_rpcapi.LAST_VERSION)
@mock.patch('nova.objects.Service.get_minimum_version')
def test_auto_pin_caches(self, mock_get_min):