From d779b33d72d6ef41651ce7b93fe982f121bae2d7 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Thu, 6 Dec 2018 08:07:37 -0800 Subject: [PATCH] Make compute rpcapi version calculation check all cells For top-level services, the compute rpcapi module needs to check for the minimum version of nova-compute in all cells in order to function properly during an upgrade. This moves that module to use the all-cells variant of this routine in the case where [api_database]/connection is set. Change-Id: Icddbe4760eaff30e4e13c1e8d3d5d3f489dac3c4 Closes-Bug: #1807044 --- nova/compute/rpcapi.py | 11 +++++++-- nova/tests/unit/compute/test_rpcapi.py | 34 ++++++++++++++++++++------ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index 94a0e4dc1bcb..aa65a03a2598 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -386,8 +386,15 @@ class ComputeAPI(object): global NO_COMPUTES_WARNING if LAST_VERSION: return LAST_VERSION - service_version = objects.Service.get_minimum_version( - context.get_admin_context(), 'nova-compute') + + # NOTE(danms): If we have a connection to the api database, + # we should iterate all cells. If not, we must only look locally. + if CONF.api_database.connection: + service_version = service_obj.get_minimum_version_all_cells( + context.get_admin_context(), ['nova-compute']) + else: + service_version = objects.Service.get_minimum_version( + context.get_admin_context(), 'nova-compute') history = service_obj.SERVICE_VERSION_HISTORY diff --git a/nova/tests/unit/compute/test_rpcapi.py b/nova/tests/unit/compute/test_rpcapi.py index c24223b00cfe..3c29080841fe 100644 --- a/nova/tests/unit/compute/test_rpcapi.py +++ b/nova/tests/unit/compute/test_rpcapi.py @@ -66,16 +66,16 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): self.patcher1.stop() self.patcher2.stop() - @mock.patch('nova.objects.Service.get_minimum_version') + @mock.patch('nova.objects.service.get_minimum_version_all_cells') def test_auto_pin(self, mock_get_min): mock_get_min.return_value = 1 self.flags(compute='auto', group='upgrade_levels') compute_rpcapi.LAST_VERSION = None rpcapi = compute_rpcapi.ComputeAPI() self.assertEqual('4.4', rpcapi.router.version_cap) - mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute') + mock_get_min.assert_called_once_with(mock.ANY, ['nova-compute']) - @mock.patch('nova.objects.Service.get_minimum_version') + @mock.patch('nova.objects.service.get_minimum_version_all_cells') def test_auto_pin_fails_if_too_old(self, mock_get_min): mock_get_min.return_value = 1955 self.flags(compute='auto', group='upgrade_levels') @@ -83,7 +83,7 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): self.assertRaises(exception.ServiceTooOld, compute_rpcapi.ComputeAPI) - @mock.patch('nova.objects.Service.get_minimum_version') + @mock.patch('nova.objects.service.get_minimum_version_all_cells') 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') @@ -92,17 +92,17 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): history = service_obj.SERVICE_VERSION_HISTORY current_version = history[service_obj.SERVICE_VERSION]['compute_rpc'] self.assertEqual(current_version, rpcapi.router.version_cap) - mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute') + 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') + @mock.patch('nova.objects.service.get_minimum_version_all_cells') def test_auto_pin_caches(self, mock_get_min): mock_get_min.return_value = 1 self.flags(compute='auto', group='upgrade_levels') compute_rpcapi.LAST_VERSION = None compute_rpcapi.ComputeAPI() compute_rpcapi.ComputeAPI() - mock_get_min.assert_called_once_with(mock.ANY, 'nova-compute') + mock_get_min.assert_called_once_with(mock.ANY, ['nova-compute']) self.assertEqual('4.4', compute_rpcapi.LAST_VERSION) def _test_compute_api(self, method, rpc_method, @@ -591,7 +591,10 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): @mock.patch('nova.compute.rpcapi.LOG') @mock.patch('nova.objects.Service.get_minimum_version') - def test_version_cap_no_computes_log_once(self, mock_minver, mock_log): + @mock.patch('nova.objects.service.get_minimum_version_all_cells') + def test_version_cap_no_computes_log_once(self, mock_allcells, mock_minver, + mock_log): + self.flags(connection=None, group='api_database') self.flags(compute='auto', group='upgrade_levels') mock_minver.return_value = 0 compute_rpcapi.NO_COMPUTES_WARNING = False @@ -599,3 +602,18 @@ class ComputeRpcAPITestCase(test.NoDBTestCase): compute_rpcapi.ComputeAPI() compute_rpcapi.ComputeAPI() self.assertEqual(1, mock_log.debug.call_count) + mock_allcells.assert_not_called() + mock_minver.assert_has_calls([ + mock.call(mock.ANY, 'nova-compute'), + mock.call(mock.ANY, 'nova-compute')]) + + @mock.patch('nova.objects.Service.get_minimum_version') + @mock.patch('nova.objects.service.get_minimum_version_all_cells') + def test_version_cap_all_cells(self, mock_allcells, mock_minver): + self.flags(connection='sqlite:///', group='api_database') + self.flags(compute='auto', group='upgrade_levels') + compute_rpcapi.LAST_VERSION = None + mock_allcells.return_value = 0 + compute_rpcapi.ComputeAPI() + mock_allcells.assert_called_once_with(mock.ANY, ['nova-compute']) + mock_minver.assert_not_called()