192 lines
6.5 KiB
Python
192 lines
6.5 KiB
Python
#
|
|
# Copyright (c) 2020-2021, 2024 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
import mock
|
|
|
|
from dccommon.drivers.openstack import vim
|
|
from dcmanager.common import consts
|
|
from dcmanager.tests.unit.common import fake_strategy
|
|
from dcmanager.tests.unit.fakes import FakeVimStrategy
|
|
from dcmanager.tests.unit.orchestrator.states.fakes import FakeKubeUpgrade
|
|
from dcmanager.tests.unit.orchestrator.states.fakes import FakeKubeVersion
|
|
from dcmanager.tests.unit.orchestrator.states.fakes \
|
|
import PREVIOUS_KUBE_VERSION
|
|
from dcmanager.tests.unit.orchestrator.states.fakes \
|
|
import UPGRADED_KUBE_VERSION
|
|
from dcmanager.tests.unit.orchestrator.states.kube.test_base \
|
|
import TestKubeUpgradeState
|
|
from dcmanager.tests.unit.orchestrator.states.test_creating_vim_strategy \
|
|
import CreatingVIMStrategyStageMixin
|
|
|
|
STRATEGY_BUILDING = FakeVimStrategy(state=vim.STATE_BUILDING)
|
|
STRATEGY_DONE_BUILDING = FakeVimStrategy(state=vim.STATE_READY_TO_APPLY)
|
|
|
|
KUBE_VERSION_LIST = [
|
|
FakeKubeVersion(obj_id=1,
|
|
version='v1.2.3',
|
|
target=True,
|
|
state='active'),
|
|
FakeKubeVersion(obj_id=2,
|
|
version='v1.2.4',
|
|
target=False,
|
|
state='available'),
|
|
FakeKubeVersion(obj_id=3,
|
|
version='v1.2.5',
|
|
target=False,
|
|
state='available'),
|
|
]
|
|
|
|
KUBE_VERSION_LIST_SC = [
|
|
FakeKubeVersion(obj_id=1,
|
|
version='v1.2.5',
|
|
target=True,
|
|
state='active')
|
|
]
|
|
|
|
KUBE_VERSION_LIST_SC_2 = [
|
|
FakeKubeVersion(obj_id=1,
|
|
version='v1.2.4',
|
|
target=True,
|
|
state='active')
|
|
]
|
|
|
|
KUBE_UPGRADE_LIST = [
|
|
FakeKubeUpgrade(
|
|
obj_id=1,
|
|
to_version='v1.2.5',
|
|
from_version='v1.2.4',
|
|
state='active'
|
|
)
|
|
]
|
|
|
|
KUBE_VERSION_LIST_WITHOUT_ACTIVE = [
|
|
FakeKubeVersion(
|
|
obj_id=1,
|
|
version='v1.2.3',
|
|
target=True,
|
|
state='available'
|
|
)
|
|
]
|
|
|
|
|
|
class TestCreatingVIMKubeUpgradeStrategyStage(
|
|
CreatingVIMStrategyStageMixin, TestKubeUpgradeState
|
|
):
|
|
"""Test a vim kube upgrade strategy during kube orchestration"""
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.set_state(
|
|
consts.STRATEGY_STATE_KUBE_CREATING_VIM_KUBE_UPGRADE_STRATEGY,
|
|
consts.STRATEGY_STATE_KUBE_APPLYING_VIM_KUBE_UPGRADE_STRATEGY
|
|
)
|
|
|
|
# creating the vim strategy checks if an existing upgrade exists
|
|
self.sysinv_client.get_kube_upgrades = mock.MagicMock()
|
|
self.sysinv_client.get_kube_upgrades.return_value = []
|
|
|
|
# when no vim strategy exists, the available version is used
|
|
self.sysinv_client.get_kube_versions = mock.MagicMock()
|
|
self.sysinv_client.get_kube_versions.return_value = [
|
|
FakeKubeVersion(obj_id=1,
|
|
version=PREVIOUS_KUBE_VERSION,
|
|
target=True,
|
|
state='active'),
|
|
FakeKubeVersion(obj_id=2,
|
|
version=UPGRADED_KUBE_VERSION,
|
|
target=False,
|
|
state='available'),
|
|
]
|
|
|
|
def mock_and_assert_step_update(
|
|
self, is_upgrade=False, kube_version=None, kube_version_list=None
|
|
):
|
|
"""Encapsulates the required arrangements to run the tests"""
|
|
|
|
# first api query is before the create
|
|
# remaining api query results are waiting for the strategy to build
|
|
self.vim_client.get_strategy.side_effect = [
|
|
None,
|
|
STRATEGY_BUILDING,
|
|
STRATEGY_DONE_BUILDING,
|
|
]
|
|
self.sysinv_client.get_kube_versions.return_value = KUBE_VERSION_LIST
|
|
|
|
if is_upgrade:
|
|
self.sysinv_client.get_kube_upgrades.return_value = kube_version_list
|
|
kube_version = kube_version_list[0].to_version
|
|
|
|
if kube_version:
|
|
extra_args = {"to-version": kube_version}
|
|
self.strategy = fake_strategy.create_fake_strategy(
|
|
self.ctx,
|
|
self.DEFAULT_STRATEGY_TYPE,
|
|
extra_args=extra_args)
|
|
else:
|
|
kube_version = kube_version_list[0].version
|
|
self.sysinv_client.get_kube_versions.side_effect = \
|
|
[kube_version_list, KUBE_VERSION_LIST]
|
|
|
|
# API calls acts as expected
|
|
self.vim_client.create_strategy.return_value = STRATEGY_BUILDING
|
|
|
|
# invoke the strategy state operation on the orch thread
|
|
self.worker.perform_state_action(self.strategy_step)
|
|
|
|
self.vim_client.create_strategy.assert_called_with(
|
|
'kube-upgrade', 'parallel', 'parallel', 10,
|
|
'migrate', 'relaxed', to_version=kube_version
|
|
)
|
|
|
|
# Successful promotion to next state
|
|
self.assert_step_updated(
|
|
self.strategy_step.subcloud_id, self.on_success_state
|
|
)
|
|
|
|
def test_strategy_succeeds_with_highest_kube_version(self):
|
|
"""Test strategy succeeds when selecting the highest kube version"""
|
|
|
|
self.mock_and_assert_step_update(kube_version='v1.2.5')
|
|
|
|
def test_strategy_succeeds_with_lowest_kube_version(self):
|
|
"""Test strategy succeeds when selecting the lowest kube version"""
|
|
|
|
self.mock_and_assert_step_update(kube_version='v1.2.4')
|
|
|
|
def test_strategy_succeeds_without_kube_version_selected(self):
|
|
"""Test strategy succeeds without a selected kube_version"""
|
|
|
|
self.mock_and_assert_step_update(kube_version_list=KUBE_VERSION_LIST_SC)
|
|
|
|
def test_strategy_succeeds_when_sc_has_middle_version_active(self):
|
|
"""Test strategy succeeds when sc has the middle version active"""
|
|
|
|
self.mock_and_assert_step_update(kube_version_list=KUBE_VERSION_LIST_SC_2)
|
|
|
|
def test_strategy_succeeds_with_subcloud_kube_upgrade(self):
|
|
"""Test strategy succeeds when there are subcloud kube upgrades"""
|
|
|
|
self.mock_and_assert_step_update(
|
|
is_upgrade=True, kube_version_list=KUBE_UPGRADE_LIST
|
|
)
|
|
|
|
def test_strategy_fails_without_active_version_to_upgrade(self):
|
|
"""Test upgrade fails without an active version to upgrade"""
|
|
|
|
fake_strategy.create_fake_strategy(
|
|
self.ctx, self.DEFAULT_STRATEGY_TYPE
|
|
)
|
|
|
|
self.sysinv_client.get_kube_versions.return_value = \
|
|
KUBE_VERSION_LIST_WITHOUT_ACTIVE
|
|
|
|
self.worker.perform_state_action(self.strategy_step)
|
|
|
|
self.assert_step_updated(
|
|
self.strategy_step.subcloud_id, consts.STRATEGY_STATE_FAILED
|
|
)
|