Rename CLI commands

This change renames the CLI commands as give below:
1) "software release list" is now "software list"
2) "software release upload" is now "software upload"
3) "software release delete" is now "software delete"
In addition, this change updates the upload and delete
functionalities to use the major version instead of what is
provided in patch metadata while creating directories.

Test Plan:
[PASS] Verify CLI commands have been renamed

Story: 2010676
Task: 48382
Signed-off-by: Jessica Castelino <jessica.castelino@windriver.com>
Change-Id: I969ca9d4409a8f51e75a44ab6a1dc5284b396908
This commit is contained in:
Jessica Castelino
2023-06-30 14:04:51 +00:00
parent d11fde3d5b
commit 7f8c0f970b
3 changed files with 92 additions and 100 deletions

View File

@@ -1209,94 +1209,6 @@ def register_deploy_commands(commands):
cmd.set_defaults(restricted=False) # can run non root cmd.set_defaults(restricted=False) # can run non root
def register_release_commands(commands):
"""release commands
- delete
- list
- show
- upload
- upload-dir
non root/sudo users can run:
- show
- list
"""
cmd_area = 'release'
cmd_parser = commands.add_parser(
cmd_area,
help='Software Release',
epilog="StarlingX Unified Software Deployment"
)
cmd_parser.set_defaults(cmd_area=cmd_area)
sub_cmds = cmd_parser.add_subparsers(
title='Software Release Commands',
metavar=''
)
sub_cmds.required = True
# -- software release delete <release> ---------------
cmd = sub_cmds.add_parser(
'delete',
help='Delete the software release'
)
cmd.set_defaults(cmd='delete')
cmd.set_defaults(func=release_delete_req)
cmd.add_argument('release',
nargs="+", # accepts a list
help='Release ID to delete')
# --- software release list ---------------------------
cmd = sub_cmds.add_parser(
'list',
help='List the software releases'
)
cmd.set_defaults(cmd='list')
cmd.set_defaults(func=release_list_req)
cmd.set_defaults(restricted=False) # can run non root
# --release is an optional argument
cmd.add_argument('--release',
required=False,
help='filter against a release ID')
# --state is an optional argument. default: "all"
cmd.add_argument('--state',
default="all",
required=False,
help='filter against a release state')
# --- software release show <release> -----------------
cmd = sub_cmds.add_parser(
'show',
help='Show the software release'
)
cmd.set_defaults(cmd='show')
cmd.set_defaults(func=release_show_req)
cmd.set_defaults(restricted=False) # can run non root
cmd.add_argument('release',
nargs="+", # accepts a list
help='Release ID to show')
# --- software release upload <release> ---------------
cmd = sub_cmds.add_parser(
'upload',
help='Upload a software release'
)
cmd.set_defaults(cmd='upload')
cmd.set_defaults(func=release_upload_req)
cmd.add_argument('release',
nargs="+", # accepts a list
help='software releases to upload')
# --- software release upload-dir <release dir> ------
cmd = sub_cmds.add_parser(
'upload-dir',
help='Upload a software release dir'
)
cmd.set_defaults(cmd='upload-dir')
cmd.set_defaults(func=release_upload_dir_req)
cmd.add_argument('release',
nargs="+", # accepts a list
help='directory containing software releases to upload')
def setup_argparse(): def setup_argparse():
parser = argparse.ArgumentParser(prog="software", parser = argparse.ArgumentParser(prog="software",
description="Unified Software Management", description="Unified Software Management",
@@ -1323,8 +1235,70 @@ def setup_argparse():
commands = parser.add_subparsers(title='Commands', metavar='') commands = parser.add_subparsers(title='Commands', metavar='')
commands.required = True commands.required = True
# -- software delete <release> ---------------
cmd = commands.add_parser(
'delete',
help='Delete the software release'
)
cmd.set_defaults(cmd='delete')
cmd.set_defaults(func=release_delete_req)
cmd.add_argument('release',
nargs="+", # accepts a list
help='Release ID to delete')
# --- software list ---------------------------
cmd = commands.add_parser(
'list',
help='List the software releases'
)
cmd.set_defaults(cmd='list')
cmd.set_defaults(func=release_list_req)
cmd.set_defaults(restricted=False) # can run non root
# --release is an optional argument
cmd.add_argument('--release',
required=False,
help='filter against a release ID')
# --state is an optional argument. default: "all"
cmd.add_argument('--state',
default="all",
required=False,
help='filter against a release state')
# --- software show <release> -----------------
cmd = commands.add_parser(
'show',
help='Show the software release'
)
cmd.set_defaults(cmd='show')
cmd.set_defaults(func=release_show_req)
cmd.set_defaults(restricted=False) # can run non root
cmd.add_argument('release',
nargs="+", # accepts a list
help='Release ID to show')
# --- software upload <release> ---------------
cmd = commands.add_parser(
'upload',
help='Upload a software release'
)
cmd.set_defaults(cmd='upload')
cmd.set_defaults(func=release_upload_req)
cmd.add_argument('release',
nargs="+", # accepts a list
help='software releases to upload')
# --- software upload-dir <release dir> ------
cmd = commands.add_parser(
'upload-dir',
help='Upload a software release dir'
)
cmd.set_defaults(cmd='upload-dir')
cmd.set_defaults(func=release_upload_dir_req)
cmd.add_argument('release',
nargs="+", # accepts a list
help='directory containing software releases to upload')
register_deploy_commands(commands) register_deploy_commands(commands)
register_release_commands(commands)
return parser return parser

View File

@@ -1107,7 +1107,8 @@ class PatchController(PatchService):
# Handle operation # Handle operation
for release_id in release_list: for release_id in release_list:
release_sw_version = self.release_data.metadata[release_id]["sw_version"] release_sw_version = utils.get_major_release_version(
self.release_data.metadata[release_id]["sw_version"])
# Need to support delete of older centos patches (metadata) from upgrades. # Need to support delete of older centos patches (metadata) from upgrades.
# todo(abailey): do we need to be concerned about this since this component is new. # todo(abailey): do we need to be concerned about this since this component is new.
@@ -1775,6 +1776,7 @@ class PatchController(PatchService):
self.interim_state[release] = list(self.hosts) self.interim_state[release] = list(self.hosts)
elif operation == "remove": elif operation == "remove":
removed = False
deployment_list = self.release_apply_remove_order(deployment, running_sw_version) deployment_list = self.release_apply_remove_order(deployment, running_sw_version)
msg = "Deploy start order for remove operation: %s" % ",".join(deployment_list) msg = "Deploy start order for remove operation: %s" % ",".join(deployment_list)
LOG.info(msg) LOG.info(msg)
@@ -1829,6 +1831,7 @@ class PatchController(PatchService):
self.run_semantic_check(constants.SEMANTIC_PREREMOVE, deployment_list) self.run_semantic_check(constants.SEMANTIC_PREREMOVE, deployment_list)
for release in deployment_list: for release in deployment_list:
removed = True
msg = "Removing release: %s" % release msg = "Removing release: %s" % release
LOG.info(msg) LOG.info(msg)
audit_log_info(msg) audit_log_info(msg)
@@ -1865,10 +1868,6 @@ class PatchController(PatchService):
metadata_dir = DEPLOY_STATE_METADATA_DIR_DICT[deploystate] metadata_dir = DEPLOY_STATE_METADATA_DIR_DICT[deploystate]
shutil.move("%s/%s-metadata.xml" % (metadata_dir, release), shutil.move("%s/%s-metadata.xml" % (metadata_dir, release),
"%s/%s-metadata.xml" % (removing_dir, release)) "%s/%s-metadata.xml" % (removing_dir, release))
deploystate = self.release_data.metadata[deployment]["state"]
metadata_dir = DEPLOY_STATE_METADATA_DIR_DICT[deploystate]
shutil.move("%s/%s-metadata.xml" % (metadata_dir, deployment),
"%s/%s-metadata.xml" % (deploying_start_dir, deployment))
msg_info += "%s has been removed from the repo\n" % release msg_info += "%s has been removed from the repo\n" % release
except shutil.Error: except shutil.Error:
msg = "Failed to move the metadata for %s" % release msg = "Failed to move the metadata for %s" % release
@@ -1878,10 +1877,8 @@ class PatchController(PatchService):
# update state # update state
if len(self.hosts) > 0: if len(self.hosts) > 0:
self.release_data.metadata[release]["state"] = constants.REMOVING self.release_data.metadata[release]["state"] = constants.REMOVING
self.release_data.metadata[deployment]["state"] = constants.DEPLOYING_START
else: else:
self.release_data.metadata[release]["state"] = constants.UNKNOWN self.release_data.metadata[release]["state"] = constants.UNKNOWN
self.release_data.metadata[deployment]["state"] = constants.UNKNOWN
# only update lastest_feed_commit if it is an ostree patch # only update lastest_feed_commit if it is an ostree patch
if self.release_data.contents[release].get("base") is not None: if self.release_data.contents[release].get("base") is not None:
@@ -1892,6 +1889,23 @@ class PatchController(PatchService):
with self.hosts_lock: with self.hosts_lock:
self.interim_state[release] = list(self.hosts) self.interim_state[release] = list(self.hosts)
if removed:
try:
metadata_dir = DEPLOY_STATE_METADATA_DIR_DICT[deploystate]
shutil.move("%s/%s-metadata.xml" % (metadata_dir, deployment),
"%s/%s-metadata.xml" % (deploying_start_dir, deployment))
msg_info += "Deployment started for %s\n" % deployment
except shutil.Error:
msg = "Failed to move the metadata for %s" % deployment
LOG.exception(msg)
raise MetadataFail(msg)
# update state
if len(self.hosts) > 0:
self.release_data.metadata[deployment]["state"] = constants.DEPLOYING_START
else:
self.release_data.metadata[deployment]["state"] = constants.UNKNOWN
return dict(info=msg_info, warning=msg_warning, error=msg_error) return dict(info=msg_info, warning=msg_warning, error=msg_error)
def software_deploy_complete_api(self, release: str) -> dict: def software_deploy_complete_api(self, release: str) -> dict:

View File

@@ -29,6 +29,7 @@ from software.exceptions import ReleaseMismatchFailure
from software.exceptions import SoftwareFail from software.exceptions import SoftwareFail
import software.constants as constants import software.constants as constants
import software.utils as utils
try: try:
# The tsconfig module is only available at runtime # The tsconfig module is only available at runtime
@@ -347,7 +348,8 @@ class ReleaseData(object):
else: else:
self.metadata[release_id]["reboot_required"] = "N" self.metadata[release_id]["reboot_required"] = "N"
release_sw_version = self.metadata[release_id]["sw_version"] release_sw_version = utils.get_major_release_version(
self.metadata[release_id]["sw_version"])
global package_dir global package_dir
if release_sw_version not in package_dir: if release_sw_version not in package_dir:
package_dir[release_sw_version] = "%s/%s" % (root_package_dir, release_sw_version) package_dir[release_sw_version] = "%s/%s" % (root_package_dir, release_sw_version)
@@ -835,9 +837,10 @@ class PatchFile(object):
if not metadata_only and base_pkgdata is not None: if not metadata_only and base_pkgdata is not None:
# Run version validation tests first # Run version validation tests first
patch_sw_version = thispatch.metadata[patch_id]["sw_version"] patch_sw_version = utils.get_major_release_version(
thispatch.metadata[patch_id]["sw_version"])
if not base_pkgdata.check_release(patch_sw_version): if not base_pkgdata.check_release(patch_sw_version):
msg = "Patch %s software release (%s) is not installed" % (patch_id, patch_sw_version) msg = "Software version %s for release %s is not installed" % (patch_sw_version, patch_id)
LOG.exception(msg) LOG.exception(msg)
raise ReleaseValidationFailure(msg) raise ReleaseValidationFailure(msg)
@@ -849,7 +852,8 @@ class PatchFile(object):
LOG.exception(msg) LOG.exception(msg)
raise ReleaseMismatchFailure(msg) raise ReleaseMismatchFailure(msg)
patch_sw_version = thispatch.metadata[patch_id]["sw_version"] patch_sw_version = utils.get_major_release_version(
thispatch.metadata[patch_id]["sw_version"])
abs_ostree_tar_dir = package_dir[patch_sw_version] abs_ostree_tar_dir = package_dir[patch_sw_version]
if not os.path.exists(abs_ostree_tar_dir): if not os.path.exists(abs_ostree_tar_dir):
os.makedirs(abs_ostree_tar_dir) os.makedirs(abs_ostree_tar_dir)