Allow target k8s version more than one minor version larger for AIO-SX

For AIO-SX "system kube-upgrade-start" allow a target kube upgrade
version more than one version larger than the current version.

Test Plan:
Pass: "system kube-upgrade-start v1.24.4" allow kube upgrade from
the current version v1.22.5.

Story: 2010565
Task: 47269

Signed-off-by: Boovan Rajendran <boovan.rajendran@windriver.com>
Change-Id: I05033fdb909a1caaf4d0c69e8b8b4c73289b81f4
This commit is contained in:
Boovan Rajendran 2023-02-22 06:05:31 -05:00
parent 8c359198c8
commit 4bc5b367a1
2 changed files with 69 additions and 9 deletions

View File

@ -192,6 +192,7 @@ class KubeUpgradeController(rest.RestController):
force = body.get('force', False) is True
alarm_ignore_list = body.get('alarm_ignore_list')
system = pecan.request.dbapi.isystem_get_one()
# There must not be a platform upgrade in progress
try:
@ -212,7 +213,7 @@ class KubeUpgradeController(rest.RestController):
raise wsme.exc.ClientSideError(_(
"A kubernetes upgrade is already in progress"))
# The target version must be available
# Check whether target version is available or not
try:
target_version_obj = objects.kube_version.get_by_version(
to_version)
@ -221,16 +222,23 @@ class KubeUpgradeController(rest.RestController):
"Kubernetes version %s is not available" % to_version))
# The upgrade path must be supported
current_kube_version = \
self._kube_operator.kube_get_kubernetes_version()
if not target_version_obj.can_upgrade_from(current_kube_version):
raise wsme.exc.ClientSideError(_(
"The installed Kubernetes version %s cannot upgrade to "
"version %s" % (current_kube_version,
target_version_obj.version)))
current_kube_version = self._kube_operator.kube_get_kubernetes_version()
version_states = self._kube_operator.kube_get_version_states()
# The target version must be available state
if system.system_mode == constants.SYSTEM_MODE_SIMPLEX:
if version_states.get(to_version) != kubernetes.KUBE_STATE_AVAILABLE:
raise wsme.exc.ClientSideError(_(
"The target Kubernetes version %s is not in "
"available state" % (target_version_obj.version)))
else:
if not target_version_obj.can_upgrade_from(current_kube_version):
raise wsme.exc.ClientSideError(_(
"The installed Kubernetes version %s cannot upgrade to "
"version %s" % (current_kube_version,
target_version_obj.version)))
# The current kubernetes version must be active
version_states = self._kube_operator.kube_get_version_states()
if version_states.get(current_kube_version) != \
kubernetes.KUBE_STATE_ACTIVE:
raise wsme.exc.ClientSideError(_(

View File

@ -249,6 +249,58 @@ class TestListKubeUpgrade(TestKubeUpgrade):
kubernetes.KUBE_UPGRADING_FIRST_MASTER)
class TestPostKubeUpgradeSimplex(TestKubeUpgrade,
dbbase.ProvisionedControllerHostTestCase):
system_mode = constants.SYSTEM_MODE_SIMPLEX
@mock.patch('sysinv.common.health.Health._check_trident_compatibility', lambda x: True)
def test_create_simplex(self):
# Test creation of upgrade
self.kube_get_kubernetes_version_result = 'v1.42.1'
self.kube_get_version_states_result = {'v1.42.1': 'active',
'v1.42.2': 'available',
'v1.43.1': 'available',
'v1.43.2': 'available',
'v1.43.3': 'available'}
create_dict = dbutils.post_get_test_kube_upgrade(to_version='v1.43.3')
result = self.post_json('/kube_upgrade', create_dict,
headers={'User-Agent': 'sysinv-test'})
# Verify that the upgrade has the expected attributes
self.assertEqual(result.json['from_version'], 'v1.42.1')
self.assertEqual(result.json['to_version'], 'v1.43.3')
self.assertEqual(result.json['state'],
kubernetes.KUBE_UPGRADE_STARTED)
# see if kubeadm_version was changed in DB
kube_cmd_version = self.dbapi.kube_cmd_version_get()
self.assertEqual(kube_cmd_version.kubeadm_version, '1.43.3')
# Verify that the target version for the host is still the current version
kube_host_upgrade = self.dbapi.kube_host_upgrade_get_by_host(
self.host.id)
self.assertEqual('v1.42.1', kube_host_upgrade.target_version)
def test_create_simplex_upgrade_path_not_supported(self):
# Test creation of upgrade when upgrade path is not supported
self.kube_get_kubernetes_version_result = 'v1.42.1'
self.kube_get_version_states_result = {'v1.42.1': 'active',
'v1.42.2': 'available',
'v1.43.1': 'unavailable',
'v1.43.2': 'unavailable',
'v1.43.3': 'unavailable'}
create_dict = dbutils.post_get_test_kube_upgrade(to_version='v1.43.3')
result = self.post_json('/kube_upgrade', create_dict,
headers={'User-Agent': 'sysinv-test'},
expect_errors=True)
self.assertEqual(result.content_type, 'application/json')
self.assertEqual(http_client.BAD_REQUEST, result.status_int)
self.assertIn("version v1.43.3 is not in available state",
result.json['error_message'])
class TestPostKubeUpgrade(TestKubeUpgrade,
dbbase.ProvisionedControllerHostTestCase):