Disallow subcloud prestage while backup is in progress

Backup and prestage operations are not allowed to be running in parallel
on a subcloud. This commit adds a check for backup status to prestage
validation.

Test Plan:
PASS: The prestage operation is rejected while backup in progress
      on a subcloud.
PASS: Successfully run prestage while no backup in progress on a
      subcloud.

Closes-Bug: 2031947

Change-Id: If91b21f12f6865f9f252a3b9538247194c19e18a
Signed-off-by: lzhu1 <li.zhu@windriver.com>
This commit is contained in:
Li Zhu 2023-08-18 17:46:14 -04:00
parent db7aed2148
commit ccf55d7263
3 changed files with 53 additions and 0 deletions

View File

@ -131,6 +131,13 @@ def initial_subcloud_validate(subcloud, installed_loads, software_version):
orch_skip=True,
details="Subcloud is not managed.")
if subcloud.backup_status in consts.STATES_FOR_ONGOING_BACKUP:
raise exceptions.PrestagePreCheckFailedException(
subcloud=subcloud.name,
orch_skip=True,
details="Prestage operation is not allowed while"
" backup is in progress.")
allowed_deploy_states = [consts.DEPLOY_STATE_DONE,
consts.PRESTAGE_STATE_FAILED,
consts.PRESTAGE_STATE_COMPLETE]
@ -164,6 +171,7 @@ def validate_prestage(subcloud, payload):
- Subcloud is an AIO-SX
- Subcloud is online
- Subcloud is managed
- Subcloud backup operation is not in progress
- Subcloud has no management-affecting alarms (unless force=true)
Raises a PrestageCheckFailedException on failure.

View File

@ -31,6 +31,7 @@ import webtest
from dccommon import consts as dccommon_consts
from dcmanager.api.controllers.v1 import subclouds
from dcmanager.common import consts
from dcmanager.common import exceptions
from dcmanager.common import phased_subcloud_deploy as psd_common
from dcmanager.common import prestage
from dcmanager.common import utils as cutils
@ -2242,6 +2243,22 @@ class TestSubcloudAPIOther(testroot.DCManagerApiTest):
str(subcloud.id) + '/prestage',
headers=FAKE_HEADERS, params=data)
def test_prestage_subcloud_backup_in_progress(self):
subcloud = fake_subcloud.create_fake_subcloud(self.ctx)
subcloud = db_api.subcloud_update(
self.ctx,
subcloud.id,
availability_status=dccommon_consts.AVAILABILITY_ONLINE,
deploy_status=consts.DEPLOY_STATE_DONE,
management_state=dccommon_consts.MANAGEMENT_MANAGED,
backup_status=consts.BACKUP_STATE_IN_PROGRESS)
self.assertRaises(exceptions.PrestagePreCheckFailedException,
prestage.initial_subcloud_validate,
subcloud,
[fake_subcloud.FAKE_SOFTWARE_VERSION],
fake_subcloud.FAKE_SOFTWARE_VERSION)
@mock.patch.object(cutils, 'get_systemcontroller_installed_loads')
@mock.patch.object(prestage, '_get_system_controller_upgrades')
@mock.patch.object(prestage, '_get_prestage_subcloud_info')

View File

@ -489,6 +489,34 @@ class TestSwUpdateManager(base.DCManagerTestCase):
um.create_sw_update_strategy,
self.ctxt, payload=data)
@mock.patch.object(prestage, '_get_system_controller_upgrades')
@mock.patch.object(sw_update_manager, 'PatchOrchThread')
def test_create_sw_prestage_strategy_backup_in_progress(self,
mock_patch_orch_thread,
mock_controller_upgrade):
mock_controller_upgrade.return_value = list()
# Create fake subcloud and respective status (managed & online)
fake_subcloud1 = self.create_subcloud(self.ctxt, 'subcloud1',
self.fake_group3.id,
is_managed=True, is_online=True)
self.update_subcloud_status(self.ctxt, fake_subcloud1.id)
db_api.subcloud_update(self.ctx,
fake_subcloud1.id,
backup_status=consts.BACKUP_STATE_IN_PROGRESS)
data = copy.copy(FAKE_SW_PRESTAGE_DATA)
fake_password = (base64.b64encode('testpass'.encode("utf-8"))).decode(
'ascii')
data['sysadmin_password'] = fake_password
data['cloud_name'] = 'subcloud1'
um = sw_update_manager.SwUpdateManager()
self.assertRaises(exceptions.BadRequest,
um.create_sw_update_strategy,
self.ctxt, payload=data)
@mock.patch.object(sw_update_manager, 'PatchOrchThread')
def test_create_sw_update_strategy_cloud_name_not_exists(self,
mock_patch_orch_thread):