diff --git a/doc/source/cli/nova-status.rst b/doc/source/cli/nova-status.rst index 9eae13b43d..680937cd6d 100644 --- a/doc/source/cli/nova-status.rst +++ b/doc/source/cli/nova-status.rst @@ -143,6 +143,10 @@ Upgrade * Checks for the policy files is not JSON-formatted. + **23.0.0 (Wallaby)** + + * Checks for computes older than the previous major release + See Also ======== diff --git a/doc/source/install/verify.rst b/doc/source/install/verify.rst index 440abc7e71..9c67e4574e 100644 --- a/doc/source/install/verify.rst +++ b/doc/source/install/verify.rst @@ -131,3 +131,7 @@ Verify operation of the Compute service. | Result: Success | | Details: None | +--------------------------------------------------------------------+ + | Check: Older than N-1 computes | + | Result: Success | + | Details: None | + +--------------------------------------------------------------------+ diff --git a/nova/cmd/status.py b/nova/cmd/status.py index fd3c307dca..0fa105aa26 100644 --- a/nova/cmd/status.py +++ b/nova/cmd/status.py @@ -427,6 +427,16 @@ class UpgradeCommands(upgradecheck.UpgradeCommands): status = upgradecheck.Result(upgradecheck.Code.FAILURE, msg) return status + def _check_old_computes(self): + # warn if there are computes in the system older than the previous + # major release + try: + utils.raise_if_old_compute() + except exception.TooOldComputeService as e: + return upgradecheck.Result(upgradecheck.Code.WARNING, str(e)) + + return upgradecheck.Result(upgradecheck.Code.SUCCESS) + # The format of the check functions is to return an upgradecheck.Result # object with the appropriate upgradecheck.Code and details set. If the # check hits warnings or failures then those should be stored in the @@ -447,6 +457,8 @@ class UpgradeCommands(upgradecheck.UpgradeCommands): (_('Policy Scope-based Defaults'), _check_policy), # Added in Victoria (_('Policy File JSON to YAML Migration'), _check_policy_json), + # Added in Wallaby + (_('Older than N-1 computes'), _check_old_computes) ) diff --git a/nova/tests/unit/cmd/test_status.py b/nova/tests/unit/cmd/test_status.py index 6922a2a6e0..f5f2a8b634 100644 --- a/nova/tests/unit/cmd/test_status.py +++ b/nova/tests/unit/cmd/test_status.py @@ -44,6 +44,7 @@ from nova import exception # NOTE(mriedem): We only use objects as a convenience to populate the database # in the tests, we don't use them in the actual CLI. from nova import objects +from nova.objects import service from nova import policy from nova import test from nova.tests import fixtures as nova_fixtures @@ -667,3 +668,32 @@ class TestUpgradeCheckPolicyJSON(test.NoDBTestCase): jsonutils.dump(self.data, fh) self.assertEqual(upgradecheck.Code.FAILURE, self.cmd._check_policy_json().code) + + +class TestUpgradeCheckOldCompute(test.NoDBTestCase): + + def setUp(self): + super(TestUpgradeCheckOldCompute, self).setUp() + self.cmd = status.UpgradeCommands() + + def test_no_compute(self): + self.assertEqual( + upgradecheck.Code.SUCCESS, self.cmd._check_old_computes().code) + + def test_only_new_compute(self): + last_supported_version = service.SERVICE_VERSION_ALIASES[ + service.OLDEST_SUPPORTED_SERVICE_VERSION] + with mock.patch( + "nova.objects.service.get_minimum_version_all_cells", + return_value=last_supported_version): + self.assertEqual( + upgradecheck.Code.SUCCESS, self.cmd._check_old_computes().code) + + def test_old_compute(self): + too_old = service.SERVICE_VERSION_ALIASES[ + service.OLDEST_SUPPORTED_SERVICE_VERSION] - 1 + with mock.patch( + "nova.objects.service.get_minimum_version_all_cells", + return_value=too_old): + result = self.cmd._check_old_computes() + self.assertEqual(upgradecheck.Code.WARNING, result.code)