5e5c416a9b
This commit allows the state machine to be defined through an ordered list of states. The states are mapped to by a dictionary to state handler classes. This greatly simplifies the software upgrade orch thread so that it can be refactored in the future to share functionality with other orch thread strategy types. The following states have been implemented: - 'importing load' - 'starting upgrade' - 'activating upgrade' - 'completing upgrade' The 'installing license' state now uses this design pattern. Its functionality and unit tests are now in their own files. The 'unlocking' state requires additional changes for the 'activating' and 'completing' states to pass. Change-Id: Iedc40bdea406461dd4c2ce3887a37be6ec3c999f Story: 2007403 Task: 40001 Signed-off-by: albailey <Al.Bailey@windriver.com>
91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
#
|
|
# Copyright (c) 2020 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
import mock
|
|
|
|
from dcmanager.common import consts
|
|
|
|
from dcmanager.tests.unit.manager.states.upgrade.test_base import FakeUpgrade
|
|
from dcmanager.tests.unit.manager.states.upgrade.test_base \
|
|
import TestSwUpgradeState
|
|
|
|
VALID_UPGRADE = FakeUpgrade(state='activation-complete')
|
|
INVALID_UPGRADE = FakeUpgrade(state='aborting')
|
|
|
|
|
|
class TestSwUpgradeCompletingStage(TestSwUpgradeState):
|
|
|
|
def setUp(self):
|
|
super(TestSwUpgradeCompletingStage, self).setUp()
|
|
|
|
# next state after completing an upgrade is 'complete'
|
|
self.on_success_state = consts.STRATEGY_STATE_COMPLETE
|
|
|
|
# Add the strategy_step state being processed by this unit test
|
|
self.strategy_step = \
|
|
self.setup_strategy_step(consts.STRATEGY_STATE_COMPLETING_UPGRADE)
|
|
|
|
# Add mock API endpoints for sysinv client calls invcked by this state
|
|
self.sysinv_client.upgrade_complete = mock.MagicMock()
|
|
self.sysinv_client.get_upgrades = mock.MagicMock()
|
|
|
|
def test_upgrade_subcloud_completing_upgrade_failure(self):
|
|
"""Test the completing upgrade API call fails."""
|
|
|
|
# upgrade_complete will only be called if an appropriate upgrade exists
|
|
self.sysinv_client.get_upgrades.return_value = [VALID_UPGRADE, ]
|
|
|
|
# API call raises an exception when it is rejected
|
|
self.sysinv_client.upgrade_complete.side_effect = \
|
|
Exception("upgrade complete failed for some reason")
|
|
|
|
# invoke the strategy state operation on the orch thread
|
|
self.worker.perform_state_action(self.strategy_step)
|
|
|
|
# verify the expected API call was invoked
|
|
self.sysinv_client.upgrade_complete.assert_called()
|
|
|
|
# Verify the state moves to 'failed'
|
|
self.assert_step_updated(self.strategy_step.subcloud_id,
|
|
consts.STRATEGY_STATE_FAILED)
|
|
|
|
def test_upgrade_subcloud_completing_upgrade_success(self):
|
|
"""Test the completing upgrade step succeeds."""
|
|
|
|
# upgrade_complete will only be called if an appropriate upgrade exists
|
|
self.sysinv_client.get_upgrades.return_value = [VALID_UPGRADE, ]
|
|
|
|
# API call will not raise an exception. It will delete the upgrade
|
|
self.sysinv_client.upgrade_complete.return_value = None
|
|
|
|
# invoke the strategy state operation on the orch thread
|
|
self.worker.perform_state_action(self.strategy_step)
|
|
|
|
# verify the API cvall was invoked
|
|
self.sysinv_client.upgrade_complete.assert_called()
|
|
|
|
# On success, the state should be updated to the next state
|
|
self.assert_step_updated(self.strategy_step.subcloud_id,
|
|
self.on_success_state)
|
|
|
|
def test_upgrade_subcloud_completing_upgrade_skip_already_completed(self):
|
|
"""Test the completing upgrade step skipped if already completed."""
|
|
|
|
# upgrade_complete will only be called if an appropriate upgrade exists
|
|
# If the upgrade has been deleted, there is nothing to complete
|
|
self.sysinv_client.get_upgrades.return_value = []
|
|
|
|
# API call will not be invoked, so no need to mock it
|
|
|
|
# invoke the strategy state operation on the orch thread
|
|
self.worker.perform_state_action(self.strategy_step)
|
|
|
|
# upgrade is already in one of the completing states so skip completing
|
|
self.sysinv_client.upgrade_complete.assert_not_called()
|
|
|
|
# On success, the state is set to the next state
|
|
self.assert_step_updated(self.strategy_step.subcloud_id,
|
|
self.on_success_state)
|