From 5fb505242784e01bfb983590291c3cb246eddfcd Mon Sep 17 00:00:00 2001 From: Shrikumar Sharma Date: Tue, 31 Jan 2023 01:58:40 +0000 Subject: [PATCH] Skip prestage_prepare for upgrade on Debian Since the ostree repo will no longer be copied to /var/run before prestaging for upgrade, preparing the prestage packages is not required anymore. This commit removes support for preparing prestage packages for upgrade in dcmanager. Since the existing unit test for this support is no longer relevant, it has been removed. Test Plan: PASS: Verify that prestage for upgrade is successfully executed. PASS: Verify that prestage for reinstall is successfully executed. Depends-On: https://review.opendev.org/c/starlingx/ansible-playbooks/+/870682 Closes-Bug: 2003271 Change-Id: Ibc4f1a3969db060f708592dbedd91a1f3fdbd6fa Signed-off-by: Shrikumar Sharma --- distributedcloud/dcmanager/common/prestage.py | 13 ++++- .../unit/manager/test_subcloud_manager.py | 47 +++++++++++++++---- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/distributedcloud/dcmanager/common/prestage.py b/distributedcloud/dcmanager/common/prestage.py index 68384c246..761400822 100644 --- a/distributedcloud/dcmanager/common/prestage.py +++ b/distributedcloud/dcmanager/common/prestage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Wind River Systems, Inc. +# Copyright (c) 2023 Wind River Systems, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -58,6 +58,8 @@ ANSIBLE_PRESTAGE_SUBCLOUD_IMAGES_PLAYBOOK = \ "/usr/share/ansible/stx-ansible/playbooks/prestage_images.yml" ANSIBLE_PRESTAGE_INVENTORY_SUFFIX = '_prestage_inventory.yml' +LAST_SW_VERSION_IN_CENTOS = "22.06" + def is_deploy_status_prestage(deploy_status): return deploy_status in (consts.PRESTAGE_STATE_PREPARE, @@ -315,9 +317,18 @@ def _sync_run_prestage_prepare_packages(context, subcloud, payload): LOG.info("Prepare prestage ansible successful") +# TODO(Shrikumar): Cleanup this function, especially the comparison for +# software versions. +# Rationale: In CentOS, prestage_prepare is required; in Debian, it is not. + + @utils.synchronized('prestage-prepare-packages', external=True) def prestage_prepare(context, subcloud, payload): """Run the prepare prestage packages playbook if required.""" + if SW_VERSION > LAST_SW_VERSION_IN_CENTOS: + LOG.info("Skipping prestage package preparation in Debian") + return + if is_upgrade(subcloud.software_version): if not os.path.exists(PRESTAGE_PREPARATION_COMPLETED_FILE): _sync_run_prestage_prepare_packages(context, subcloud, payload) diff --git a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py index d3aa3b830..bf6d58140 100644 --- a/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py +++ b/distributedcloud/dcmanager/tests/unit/manager/test_subcloud_manager.py @@ -39,6 +39,8 @@ from dcmanager.tests.unit.common import fake_subcloud from dcmanager.tests import utils from tsconfig.tsconfig import SW_VERSION +LAST_SW_VERSION_IN_CENTOS = "22.06" + FAKE_ADMIN_USER_ID = 1 FAKE_SYSINV_USER_ID = 2 @@ -2067,20 +2069,20 @@ class TestSubcloudManager(base.DCManagerTestCase): @mock.patch.object(prestage, 'prestage_packages') @mock.patch.object(cutils, 'delete_subcloud_inventory') @mock.patch.object(prestage, '_run_ansible') - def test_prestage_subcloud_prestage_prepare(self, - mock_run_ansible, - mock_delete_subcloud_inventory, - mock_prestage_packages, - mock_prestage_images, - mock_prestage_complete): + def test_prestage_subcloud_prestage_prepare_centos(self, + mock_run_ansible, + mock_delete_subcloud_inventory, + mock_prestage_packages, + mock_prestage_images, + mock_prestage_complete): values = copy.copy(FAKE_PRESTAGE_PAYLOAD) subcloud = self.create_subcloud_static(self.ctx, name='subcloud1', deploy_status=consts.DEPLOY_STATE_NONE) - + current_sw_version = prestage.SW_VERSION + prestage.SW_VERSION = LAST_SW_VERSION_IN_CENTOS prestage._prestage_standalone_thread(self.ctx, subcloud, payload=values) - mock_run_ansible.return_value = None mock_prestage_packages.assert_called_once_with(self.ctx, subcloud, values) mock_prestage_images.assert_called_once_with(self.ctx, subcloud, values) @@ -2089,9 +2091,38 @@ class TestSubcloudManager(base.DCManagerTestCase): # Verify that subcloud has the correct deploy status updated_subcloud = db_api.subcloud_get_by_name(self.ctx, subcloud.name) + prestage.SW_VERSION = current_sw_version self.assertEqual(consts.PRESTAGE_STATE_PREPARE, updated_subcloud.deploy_status) + @mock.patch.object(prestage, 'prestage_complete') + @mock.patch.object(prestage, 'prestage_images') + @mock.patch.object(prestage, 'prestage_packages') + @mock.patch.object(cutils, 'delete_subcloud_inventory') + @mock.patch.object(prestage, '_run_ansible') + def test_prestage_subcloud_prestage_prepare_debian(self, + mock_run_ansible, + mock_delete_subcloud_inventory, + mock_prestage_packages, + mock_prestage_images, + mock_prestage_complete): + + values = copy.copy(FAKE_PRESTAGE_PAYLOAD) + subcloud = self.create_subcloud_static(self.ctx, + name='subcloud1', + deploy_status=consts.DEPLOY_STATE_NONE) + prestage._prestage_standalone_thread(self.ctx, subcloud, payload=values) + mock_run_ansible.return_value = None + mock_prestage_packages.assert_called_once_with(self.ctx, subcloud, values) + mock_prestage_images.assert_called_once_with(self.ctx, subcloud, values) + mock_prestage_complete.assert_called_once_with(self.ctx, subcloud.id) + mock_delete_subcloud_inventory.return_value = None + + # Verify that subcloud has the correct deploy status + updated_subcloud = db_api.subcloud_get_by_name(self.ctx, subcloud.name) + self.assertEqual(consts.DEPLOY_STATE_NONE, + updated_subcloud.deploy_status) + def test_get_cached_regionone_data(self): mock_keystone_client = FakeKeystoneClient() mock_sysinv_client = FakeSysinvClient()