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:
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user