Merge "Create software-deploy-strategy command"

This commit is contained in:
Zuul 2024-02-20 21:37:20 +00:00 committed by Gerrit Code Review
commit 76029da32b
5 changed files with 307 additions and 110 deletions

View File

@ -1,7 +1,7 @@
# Copyright 2014 - Mirantis, Inc. # Copyright 2014 - Mirantis, Inc.
# Copyright 2015 - StackStorm, Inc. # Copyright 2015 - StackStorm, Inc.
# Copyright 2016 - Ericsson AB. # Copyright 2016 - Ericsson AB.
# Copyright (c) 2017-2023 Wind River Systems, Inc. # Copyright (c) 2017-2024 Wind River Systems, Inc.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -34,6 +34,7 @@ from dcmanagerclient.api.v1 import subcloud_deploy_manager as sdm
from dcmanagerclient.api.v1 import subcloud_group_manager as gm from dcmanagerclient.api.v1 import subcloud_group_manager as gm
from dcmanagerclient.api.v1 import subcloud_manager as sm from dcmanagerclient.api.v1 import subcloud_manager as sm
from dcmanagerclient.api.v1 import subcloud_peer_group_manager as pm from dcmanagerclient.api.v1 import subcloud_peer_group_manager as pm
from dcmanagerclient.api.v1 import sw_deploy_manager as swdm
from dcmanagerclient.api.v1 import sw_patch_manager as spm from dcmanagerclient.api.v1 import sw_patch_manager as spm
from dcmanagerclient.api.v1 import sw_prestage_manager as spr from dcmanagerclient.api.v1 import sw_prestage_manager as spr
from dcmanagerclient.api.v1 import sw_strategy_manager as sstm from dcmanagerclient.api.v1 import sw_strategy_manager as sstm
@ -118,6 +119,7 @@ class Client(object):
self.kube_rootca_update_manager = \ self.kube_rootca_update_manager = \
krum.kube_rootca_update_manager(self.http_client) krum.kube_rootca_update_manager(self.http_client)
self.kube_upgrade_manager = kupm.kube_upgrade_manager(self.http_client) self.kube_upgrade_manager = kupm.kube_upgrade_manager(self.http_client)
self.sw_deploy_manager = swdm.SwDeployManager(self.http_client)
self.sw_patch_manager = spm.sw_patch_manager(self.http_client) self.sw_patch_manager = spm.sw_patch_manager(self.http_client)
self.sw_prestage_manager = spr.sw_prestage_manager(self.http_client) self.sw_prestage_manager = spr.sw_prestage_manager(self.http_client)
self.sw_update_options_manager = \ self.sw_update_options_manager = \

View File

@ -0,0 +1,16 @@
#
# Copyright (c) 2024 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
from dcmanagerclient.api.v1.sw_update_manager import sw_update_manager
SW_UPDATE_TYPE_USM = "software"
class SwDeployManager(sw_update_manager):
def __init__(self, http_client):
super().__init__(
http_client, update_type=SW_UPDATE_TYPE_USM, extra_args=["release"]
)

View File

@ -0,0 +1,95 @@
#
# Copyright (c) 2024 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
from dcmanagerclient.commands.v1 import sw_update_manager
RELEASE_FIELD = -3
class SwDeployManagerMixin(object):
"""This Mixin provides the manager used for software deploy releases."""
def get_sw_update_manager(self):
dcmanager_client = self.app.client_manager.sw_deploy_manager
return dcmanager_client.sw_deploy_manager
def custom_format_function(self, sw_update_strategy=None):
original_fmt_func = super()._get_format_function()
columns, data = original_fmt_func(sw_update_strategy)
release_id = ""
if sw_update_strategy and sw_update_strategy.extra_args:
release_id = sw_update_strategy.extra_args.get("release_id")
# Insert the 'release_id' field before the 'state',
# 'created_at' and 'updated_at' fields
columns = columns[:RELEASE_FIELD] + (
"release_id",) + columns[RELEASE_FIELD:]
data = data[:RELEASE_FIELD] + (release_id,) + data[RELEASE_FIELD:]
return columns, data
def _get_format_function(self):
return self.custom_format_function
class CreateSwDeployStrategy(
SwDeployManagerMixin, sw_update_manager.CreateSwUpdateStrategy
):
"""Create a software deploy strategy."""
def add_force_argument(self, parser):
parser.add_argument(
"--force",
required=False,
action="store_true",
help="Skip checking the subcloud for management affecting alarms.",
)
def get_parser(self, prog_name):
parser = super(CreateSwDeployStrategy, self).get_parser(prog_name)
parser.add_argument(
"--release-id",
required=True,
help="The release to be deployed.",
)
return parser
def process_custom_params(self, parsed_args, kwargs_dict):
"""Updates kwargs dictionary from parsed_args for patching"""
kwargs_dict["release_id"] = parsed_args.release_id
# override validate_force_params defined in CreateSwUpdateStrategy
def validate_force_params(self, parsed_args):
pass
class ShowSwDeployStrategy(
SwDeployManagerMixin, sw_update_manager.ShowSwUpdateStrategy
):
"""Show the details of a software deploy strategy for a subcloud."""
pass
class DeleteSwDeployStrategy(
SwDeployManagerMixin, sw_update_manager.DeleteSwUpdateStrategy
):
"""Delete software deploy strategy from the database."""
pass
class ApplySwDeployStrategy(
SwDeployManagerMixin, sw_update_manager.ApplySwUpdateStrategy
):
"""Apply a software deploy strategy."""
pass
class AbortSwDeployStrategy(
SwDeployManagerMixin, sw_update_manager.AbortSwUpdateStrategy
):
"""Abort a software deploy strategy."""
pass

View File

@ -18,20 +18,18 @@
Command-line interface to the DC Manager APIs Command-line interface to the DC Manager APIs
""" """
import argparse
import logging import logging
import os import os
import sys import sys
from dcmanagerclient import __version__ as dcmanager_version
from dcmanagerclient.api import client
from dcmanagerclient import exceptions
from cliff import app from cliff import app
from cliff import commandmanager from cliff import commandmanager
from cliff import help from cliff import help as cliff_help
from osc_lib.command import command from osc_lib.command import command
import argparse from dcmanagerclient import __version__ as dcmanager_version
from dcmanagerclient.api import client
from dcmanagerclient.commands.v1 import alarm_manager as am from dcmanagerclient.commands.v1 import alarm_manager as am
from dcmanagerclient.commands.v1 import fw_update_manager as fum from dcmanagerclient.commands.v1 import fw_update_manager as fum
from dcmanagerclient.commands.v1 import kube_rootca_update_manager as krum from dcmanagerclient.commands.v1 import kube_rootca_update_manager as krum
@ -43,12 +41,14 @@ from dcmanagerclient.commands.v1 import subcloud_deploy_manager as sdm
from dcmanagerclient.commands.v1 import subcloud_group_manager as gm from dcmanagerclient.commands.v1 import subcloud_group_manager as gm
from dcmanagerclient.commands.v1 import subcloud_manager as sm from dcmanagerclient.commands.v1 import subcloud_manager as sm
from dcmanagerclient.commands.v1 import subcloud_peer_group_manager as pm from dcmanagerclient.commands.v1 import subcloud_peer_group_manager as pm
from dcmanagerclient.commands.v1 import sw_deploy_manager as swdm
from dcmanagerclient.commands.v1 import sw_patch_manager as spm from dcmanagerclient.commands.v1 import sw_patch_manager as spm
from dcmanagerclient.commands.v1 import sw_prestage_manager as spr from dcmanagerclient.commands.v1 import sw_prestage_manager as spr
from dcmanagerclient.commands.v1 import sw_update_manager as sum from dcmanagerclient.commands.v1 import sw_update_manager as swum
from dcmanagerclient.commands.v1 import sw_update_options_manager as suom from dcmanagerclient.commands.v1 import sw_update_options_manager as suom
from dcmanagerclient.commands.v1 import sw_upgrade_manager as supm from dcmanagerclient.commands.v1 import sw_upgrade_manager as supm
from dcmanagerclient.commands.v1 import system_peer_manager as sp from dcmanagerclient.commands.v1 import system_peer_manager as sp
from dcmanagerclient import exceptions
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -81,7 +81,7 @@ class OpenStackHelpFormatter(argparse.HelpFormatter):
super(OpenStackHelpFormatter, self).start_section(heading) super(OpenStackHelpFormatter, self).start_section(heading)
class HelpCommand(help.HelpCommand): class HelpCommand(cliff_help.HelpCommand):
"""print detailed help for another command """print detailed help for another command
Provide a custom action so the help command without Provide a custom action so the help command without
@ -498,6 +498,7 @@ class DCManagerShell(app.App):
strategy_step_manager=self.client, strategy_step_manager=self.client,
sw_update_options_manager=self.client, sw_update_options_manager=self.client,
sw_upgrade_manager=self.client, sw_upgrade_manager=self.client,
sw_deploy_manager=self.client,
kube_upgrade_manager=self.client, kube_upgrade_manager=self.client,
kube_rootca_update_manager=self.client, kube_rootca_update_manager=self.client,
sw_prestage_manager=self.client, sw_prestage_manager=self.client,
@ -528,109 +529,114 @@ class DCManagerShell(app.App):
@staticmethod @staticmethod
def _get_commands_v1(): def _get_commands_v1():
return { return {
'bash-completion': BashCompletionCommand, "alarm summary": am.ListAlarmSummary,
'subcloud add': sm.AddSubcloud, "bash-completion": BashCompletionCommand,
'subcloud delete': sm.DeleteSubcloud, "fw-update-strategy abort": fum.AbortFwUpdateStrategy,
'subcloud list': sm.ListSubcloud, "fw-update-strategy apply": fum.ApplyFwUpdateStrategy,
'subcloud show': sm.ShowSubcloud, "fw-update-strategy create": fum.CreateFwUpdateStrategy,
'subcloud errors': sm.ShowSubcloudError, "fw-update-strategy delete": fum.DeleteFwUpdateStrategy,
'subcloud unmanage': sm.UnmanageSubcloud, "fw-update-strategy show": fum.ShowFwUpdateStrategy,
'subcloud manage': sm.ManageSubcloud, "kube-rootca-update-strategy abort":
'subcloud update': sm.UpdateSubcloud,
'subcloud reconfig': sm.ReconfigSubcloud,
'subcloud reinstall': sm.ReinstallSubcloud,
'subcloud redeploy': sm.RedeploySubcloud,
'subcloud restore': sm.RestoreSubcloud,
'subcloud prestage': sm.PrestageSubcloud,
'subcloud-backup create': sbm.CreateSubcloudBackup,
'subcloud-backup delete': sbm.DeleteSubcloudBackup,
'subcloud-backup restore': sbm.RestoreSubcloudBackup,
'subcloud-group add': gm.AddSubcloudGroup,
'subcloud-group delete': gm.DeleteSubcloudGroup,
'subcloud-group list': gm.ListSubcloudGroup,
'subcloud-group list-subclouds': gm.ListSubcloudGroupSubclouds,
'subcloud-group show': gm.ShowSubcloudGroup,
'subcloud-group update': gm.UpdateSubcloudGroup,
'subcloud deploy abort': psdm.AbortPhasedSubcloudDeploy,
'subcloud deploy create': psdm.CreatePhasedSubcloudDeploy,
'subcloud deploy bootstrap': psdm.BootstrapPhasedSubcloudDeploy,
'subcloud deploy config': psdm.ConfigPhasedSubcloudDeploy,
'subcloud deploy install': psdm.InstallPhasedSubcloudDeploy,
'subcloud deploy complete': psdm.CompletePhasedSubcloudDeploy,
'subcloud deploy resume': psdm.PhasedSubcloudDeployResume,
'subcloud deploy upload': sdm.SubcloudDeployUpload,
'subcloud deploy show': sdm.SubcloudDeployShow,
'subcloud deploy delete': sdm.SubcloudDeployDelete,
'subcloud-deploy upload': sdm.DeprecatedSubcloudDeployUpload,
'subcloud-deploy show': sdm.DeprecatedSubcloudDeployShow,
'subcloud-peer-group add': pm.AddSubcloudPeerGroup,
'subcloud-peer-group list': pm.ListSubcloudPeerGroup,
'subcloud-peer-group list-subclouds':
pm.ListSubcloudPeerGroupSubclouds,
'subcloud-peer-group show': pm.ShowSubcloudPeerGroup,
'subcloud-peer-group update': pm.UpdateSubcloudPeerGroup,
'subcloud-peer-group delete': pm.DeleteSubcloudPeerGroup,
'subcloud-peer-group migrate': pm.MigrateSubcloudPeerGroup,
'subcloud-peer-group status': pm.StatusSubcloudPeerGroup,
'system-peer add': sp.AddSystemPeer,
'system-peer list': sp.ListSystemPeer,
'system-peer show': sp.ShowSystemPeer,
'system-peer update': sp.UpdateSystemPeer,
'system-peer delete': sp.DeleteSystemPeer,
'system-peer list-subcloud-peer-groups':
sp.ListSystemPeerSubcloudPeerGroups,
'peer-group-association add': pgam.AddPeerGroupAssociation,
'peer-group-association list': pgam.ListPeerGroupAssociation,
'peer-group-association show': pgam.ShowPeerGroupAssociation,
'peer-group-association sync': pgam.SyncPeerGroupAssociation,
'peer-group-association update': pgam.UpdatePeerGroupAssociation,
'peer-group-association delete': pgam.DeletePeerGroupAssociation,
'alarm summary': am.ListAlarmSummary,
'fw-update-strategy create': fum.CreateFwUpdateStrategy,
'fw-update-strategy delete': fum.DeleteFwUpdateStrategy,
'fw-update-strategy apply': fum.ApplyFwUpdateStrategy,
'fw-update-strategy abort': fum.AbortFwUpdateStrategy,
'fw-update-strategy show': fum.ShowFwUpdateStrategy,
'kube-rootca-update-strategy create':
krum.CreateKubeRootcaUpdateStrategy,
'kube-rootca-update-strategy delete':
krum.DeleteKubeRootcaUpdateStrategy,
'kube-rootca-update-strategy apply':
krum.ApplyKubeRootcaUpdateStrategy,
'kube-rootca-update-strategy abort':
krum.AbortKubeRootcaUpdateStrategy, krum.AbortKubeRootcaUpdateStrategy,
'kube-rootca-update-strategy show': "kube-rootca-update-strategy apply":
krum.ApplyKubeRootcaUpdateStrategy,
"kube-rootca-update-strategy create":
krum.CreateKubeRootcaUpdateStrategy,
"kube-rootca-update-strategy delete":
krum.DeleteKubeRootcaUpdateStrategy,
"kube-rootca-update-strategy show":
krum.ShowKubeRootcaUpdateStrategy, krum.ShowKubeRootcaUpdateStrategy,
'kube-upgrade-strategy create': kupm.CreateKubeUpgradeStrategy, "kube-upgrade-strategy abort": kupm.AbortKubeUpgradeStrategy,
'kube-upgrade-strategy delete': kupm.DeleteKubeUpgradeStrategy, "kube-upgrade-strategy apply": kupm.ApplyKubeUpgradeStrategy,
'kube-upgrade-strategy apply': kupm.ApplyKubeUpgradeStrategy, "kube-upgrade-strategy create": kupm.CreateKubeUpgradeStrategy,
'kube-upgrade-strategy abort': kupm.AbortKubeUpgradeStrategy, "kube-upgrade-strategy delete": kupm.DeleteKubeUpgradeStrategy,
'kube-upgrade-strategy show': kupm.ShowKubeUpgradeStrategy, "kube-upgrade-strategy show": kupm.ShowKubeUpgradeStrategy,
'patch-strategy create': spm.CreatePatchUpdateStrategy, "patch-strategy abort": spm.AbortPatchUpdateStrategy,
'patch-strategy delete': spm.DeletePatchUpdateStrategy, "patch-strategy apply": spm.ApplyPatchUpdateStrategy,
'patch-strategy apply': spm.ApplyPatchUpdateStrategy, "patch-strategy create": spm.CreatePatchUpdateStrategy,
'patch-strategy abort': spm.AbortPatchUpdateStrategy, "patch-strategy delete": spm.DeletePatchUpdateStrategy,
'patch-strategy show': spm.ShowPatchUpdateStrategy, "patch-strategy show": spm.ShowPatchUpdateStrategy,
'prestage-strategy create': spr.CreateSwPrestageStrategy, "patch-strategy-config delete": suom.DeleteSwUpdateOptions,
'prestage-strategy delete': spr.DeleteSwPrestageStrategy, "patch-strategy-config list": suom.ListSwUpdateOptions,
'prestage-strategy apply': spr.ApplySwPrestageStrategy, "patch-strategy-config show": suom.ShowSwUpdateOptions,
'prestage-strategy abort': spr.AbortSwPrestageStrategy, "patch-strategy-config update": suom.UpdateSwUpdateOptions,
'prestage-strategy show': spr.ShowSwPrestageStrategy, "peer-group-association add": pgam.AddPeerGroupAssociation,
'strategy-step list': sum.ListSwUpdateStrategyStep, "peer-group-association delete": pgam.DeletePeerGroupAssociation,
'strategy-step show': sum.ShowSwUpdateStrategyStep, "peer-group-association list": pgam.ListPeerGroupAssociation,
'patch-strategy-config update': suom.UpdateSwUpdateOptions, "peer-group-association show": pgam.ShowPeerGroupAssociation,
'patch-strategy-config list': suom.ListSwUpdateOptions, "peer-group-association sync": pgam.SyncPeerGroupAssociation,
'patch-strategy-config show': suom.ShowSwUpdateOptions, "peer-group-association update": pgam.UpdatePeerGroupAssociation,
'patch-strategy-config delete': suom.DeleteSwUpdateOptions, "prestage-strategy abort": spr.AbortSwPrestageStrategy,
'strategy-config update': suom.UpdateSwUpdateOptions, "prestage-strategy apply": spr.ApplySwPrestageStrategy,
'strategy-config list': suom.ListSwUpdateOptions, "prestage-strategy create": spr.CreateSwPrestageStrategy,
'strategy-config show': suom.ShowSwUpdateOptions, "prestage-strategy delete": spr.DeleteSwPrestageStrategy,
'strategy-config delete': suom.DeleteSwUpdateOptions, "prestage-strategy show": spr.ShowSwPrestageStrategy,
'upgrade-strategy create': supm.CreateSwUpgradeStrategy, "software-deploy-strategy abort": swdm.AbortSwDeployStrategy,
'upgrade-strategy delete': supm.DeleteSwUpgradeStrategy, "software-deploy-strategy apply": swdm.ApplySwDeployStrategy,
'upgrade-strategy apply': supm.ApplySwUpgradeStrategy, "software-deploy-strategy create": swdm.CreateSwDeployStrategy,
'upgrade-strategy abort': supm.AbortSwUpgradeStrategy, "software-deploy-strategy delete": swdm.DeleteSwDeployStrategy,
'upgrade-strategy show': supm.ShowSwUpgradeStrategy, "software-deploy-strategy show": swdm.ShowSwDeployStrategy,
"strategy-step list": swum.ListSwUpdateStrategyStep,
"strategy-step show": swum.ShowSwUpdateStrategyStep,
"strategy-config delete": suom.DeleteSwUpdateOptions,
"strategy-config list": suom.ListSwUpdateOptions,
"strategy-config show": suom.ShowSwUpdateOptions,
"strategy-config update": suom.UpdateSwUpdateOptions,
"subcloud add": sm.AddSubcloud,
"subcloud delete": sm.DeleteSubcloud,
"subcloud deploy abort": psdm.AbortPhasedSubcloudDeploy,
"subcloud deploy bootstrap": psdm.BootstrapPhasedSubcloudDeploy,
"subcloud deploy complete": psdm.CompletePhasedSubcloudDeploy,
"subcloud deploy config": psdm.ConfigPhasedSubcloudDeploy,
"subcloud deploy create": psdm.CreatePhasedSubcloudDeploy,
"subcloud deploy delete": sdm.SubcloudDeployDelete,
"subcloud deploy install": psdm.InstallPhasedSubcloudDeploy,
"subcloud deploy resume": psdm.PhasedSubcloudDeployResume,
"subcloud deploy show": sdm.SubcloudDeployShow,
"subcloud deploy upload": sdm.SubcloudDeployUpload,
"subcloud errors": sm.ShowSubcloudError,
"subcloud list": sm.ListSubcloud,
"subcloud manage": sm.ManageSubcloud,
"subcloud reconfig": sm.ReconfigSubcloud,
"subcloud redeploy": sm.RedeploySubcloud,
"subcloud reinstall": sm.ReinstallSubcloud,
"subcloud restore": sm.RestoreSubcloud,
"subcloud show": sm.ShowSubcloud,
"subcloud prestage": sm.PrestageSubcloud,
"subcloud unmanage": sm.UnmanageSubcloud,
"subcloud update": sm.UpdateSubcloud,
"subcloud-backup create": sbm.CreateSubcloudBackup,
"subcloud-backup delete": sbm.DeleteSubcloudBackup,
"subcloud-backup restore": sbm.RestoreSubcloudBackup,
"subcloud-deploy show": sdm.DeprecatedSubcloudDeployShow,
"subcloud-deploy upload": sdm.DeprecatedSubcloudDeployUpload,
"subcloud-group add": gm.AddSubcloudGroup,
"subcloud-group delete": gm.DeleteSubcloudGroup,
"subcloud-group list": gm.ListSubcloudGroup,
"subcloud-group list-subclouds": gm.ListSubcloudGroupSubclouds,
"subcloud-group show": gm.ShowSubcloudGroup,
"subcloud-group update": gm.UpdateSubcloudGroup,
"subcloud-peer-group add": pm.AddSubcloudPeerGroup,
"subcloud-peer-group delete": pm.DeleteSubcloudPeerGroup,
"subcloud-peer-group list": pm.ListSubcloudPeerGroup,
"subcloud-peer-group list-subclouds":
pm.ListSubcloudPeerGroupSubclouds,
"subcloud-peer-group migrate": pm.MigrateSubcloudPeerGroup,
"subcloud-peer-group show": pm.ShowSubcloudPeerGroup,
"subcloud-peer-group status": pm.StatusSubcloudPeerGroup,
"subcloud-peer-group update": pm.UpdateSubcloudPeerGroup,
"system-peer add": sp.AddSystemPeer,
"system-peer delete": sp.DeleteSystemPeer,
"system-peer list": sp.ListSystemPeer,
"system-peer list-subcloud-peer-groups":
sp.ListSystemPeerSubcloudPeerGroups,
"system-peer show": sp.ShowSystemPeer,
"system-peer update": sp.UpdateSystemPeer,
"upgrade-strategy abort": supm.AbortSwUpgradeStrategy,
"upgrade-strategy apply": supm.ApplySwUpgradeStrategy,
"upgrade-strategy create": supm.CreateSwUpgradeStrategy,
"upgrade-strategy delete": supm.DeleteSwUpgradeStrategy,
"upgrade-strategy show": supm.ShowSwUpgradeStrategy,
} }

View File

@ -0,0 +1,78 @@
#
# Copyright (c) 2024 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
from dcmanagerclient.commands.v1 import sw_deploy_manager as cli_cmd
from dcmanagerclient.tests import base
from dcmanagerclient.tests.v1.mixins import UpdateStrategyMixin
from dcmanagerclient.tests.v1 import utils
class TestSwDeployStrategy(UpdateStrategyMixin, base.BaseCommandTest):
def setUp(self):
super().setUp()
# Increase results_length due to the 'upload only' field
self.results_length += 1
self.sw_update_manager = (
self.app.client_manager.sw_deploy_manager.sw_deploy_manager
)
self.create_command = cli_cmd.CreateSwDeployStrategy
self.show_command = cli_cmd.ShowSwDeployStrategy
self.delete_command = cli_cmd.DeleteSwDeployStrategy
self.apply_command = cli_cmd.ApplySwDeployStrategy
self.abort_command = cli_cmd.AbortSwDeployStrategy
def test_create_strategy(self):
"""Test deploy strategy should be created with --release-id"""
# prepare mixin attributes
manager_to_test = self.sw_update_manager
expected_strategy_type = manager_to_test.update_type
# mock the result of the API call
strategy = utils.make_strategy(
strategy_type=expected_strategy_type, extra_args={
"release_id": "stx-24.09.1"}
)
# mock that there is no pre-existing strategy
manager_to_test.create_sw_update_strategy.return_value = strategy
# invoke the backend method for the CLI.
# Returns a tuple of field descriptions, and a second tuple of values
fields, results = self.call(
self.create_command, ["--release-id", "stx-24.09.1"])
# results is a tuple of expected length
self.assertEqual(len(results), self.results_length)
# result tuple values are
# - strategy type
# - subcloud apply type
# - max parallel subclouds
# - stop on failure
# - release_id
# - state
# - created_at
# - updated_at
self.assertEqual(results[0], expected_strategy_type)
self.assertEqual(fields[-4], "release_id")
self.assertEqual(results[-4], "stx-24.09.1")
def test_create_strategy_without_release_id(self):
"""Test deploy strategy should not be created without --release-id"""
# prepare mixin attributes
manager_to_test = self.sw_update_manager
# mock that there is no pre-existing strategy
manager_to_test.create_sw_update_strategy.return_value = None
# invoke the backend method for the CLI.
# Returns a tuple of field descriptions, and a second tuple of values
self.assertRaises(SystemExit, self.call, self.create_command, [])