config/sysinv/cgts-client/cgts-client/cgtsclient/v1/upgrade_shell.py

174 lines
5.6 KiB
Python
Executable File

#
# Copyright (c) 2015-2016 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# All Rights Reserved.
#
from cgtsclient.common import constants
from cgtsclient.common import utils
from cgtsclient import exc
from six.moves import input
def _print_upgrade_show(obj):
fields = ['uuid', 'state', 'from_release', 'to_release']
data = [(f, getattr(obj, f, '')) for f in fields]
utils.print_tuple_list(data)
def do_upgrade_show(cc, args):
"""Show software upgrade details and attributes."""
upgrades = cc.upgrade.list()
if upgrades:
_print_upgrade_show(upgrades[0])
else:
print('No upgrade in progress')
@utils.arg('-f', '--force',
action='store_true',
default=False,
help="Ignore non management-affecting alarms")
def do_upgrade_start(cc, args):
"""Start a software upgrade. """
upgrade = cc.upgrade.create(args.force)
uuid = getattr(upgrade, 'uuid', '')
try:
upgrade = cc.upgrade.get(uuid)
except exc.HTTPNotFound:
raise exc.CommandError('Created upgrade UUID not found: %s' % uuid)
_print_upgrade_show(upgrade)
def do_upgrade_activate(cc, args):
"""Activate a software upgrade."""
data = dict()
data['state'] = constants.UPGRADE_ACTIVATION_REQUESTED
patch = []
for (k, v) in data.items():
patch.append({'op': 'replace', 'path': '/' + k, 'value': v})
try:
upgrade = cc.upgrade.update(patch)
except exc.HTTPNotFound:
raise exc.CommandError('Upgrade UUID not found')
_print_upgrade_show(upgrade)
def do_upgrade_abort(cc, args):
"""Abort a software upgrade."""
try:
body = cc.upgrade.check_reinstall()
except Exception:
raise exc.CommandError('Error getting upgrade state')
reinstall_necessary = body.get('reinstall_necessary', None)
abort_required = False
system_type, system_mode = utils._get_system_info(cc)
is_cpe = system_type == constants.TS_AIO
simplex = system_mode == constants.SYSTEM_MODE_SIMPLEX
if simplex:
if reinstall_necessary:
warning_message = (
'\n'
'WARNING: THIS OPERATION WILL RESULT IN A COMPLETE SYSTEM '
'OUTAGE.\n'
'It will require this host to be reinstalled and the system '
'restored with the previous version. '
'The system will be restored to when the upgrade was started.'
'\n\n'
'Are you absolutely sure you want to continue? [yes/N]: ')
abort_required = True
else:
warning_message = (
'\n'
'WARNING: This will stop the upgrade process. The system '
'backup created during the upgrade-start will be removed.\n\n'
'Continue [yes/N]: ')
elif reinstall_necessary:
warning_message = (
'\n'
'WARNING: THIS OPERATION WILL RESULT IN A COMPLETE SYSTEM '
'OUTAGE.\n'
'It will require every host in the system to be powered down and '
'then reinstalled to recover. All instances will be lost, '
'including their disks. You will only be able to recover '
'instances if you have external backups for their data.\n'
'This operation should be done as a last resort, if there is '
'absolutely no other way to recover the system.\n\n'
'Are you absolutely sure you want to continue? [yes/N]: ')
abort_required = True
else:
if is_cpe:
warning_message = (
'\n'
'WARNING: THIS OPERATION WILL IMPACT RUNNING INSTANCES.\n'
'Any instances that have been migrated after the upgrade was '
'started will be lost, including their disks. You will only '
'be able to recover instances if you have external backups '
'for their data.\n'
'This operation should be done as a last resort, if there is '
'absolutely no other way to recover the system.\n\n'
'Are you absolutely sure you want to continue? [yes/N]: ')
abort_required = True
else:
warning_message = (
'\n'
'WARNING: By continuing this operation, you will be forced to '
'downgrade any hosts that have been upgraded. The system will '
'revert to the state when controller-0 was last active.\n\n'
'Continue [yes/N]: ')
confirm = input(warning_message)
if confirm != 'yes':
print("Operation cancelled.")
return
elif abort_required:
confirm = input("Type 'abort' to confirm: ")
if confirm != 'abort':
print("Operation cancelled.")
return
data = dict()
data['state'] = constants.UPGRADE_ABORTING
patch = []
for (k, v) in data.items():
patch.append({'op': 'replace', 'path': '/' + k, 'value': v})
try:
upgrade = cc.upgrade.update(patch)
except exc.HTTPNotFound:
raise exc.CommandError('Upgrade UUID not found')
_print_upgrade_show(upgrade)
def do_upgrade_complete(cc, args):
"""Complete a software upgrade."""
try:
upgrade = cc.upgrade.delete()
except exc.HTTPNotFound:
raise exc.CommandError('Upgrade not found')
_print_upgrade_show(upgrade)
def do_upgrade_abort_complete(cc, args):
"""Complete a software upgrade."""
try:
upgrade = cc.upgrade.delete()
except exc.HTTPNotFound:
raise exc.CommandError('Upgrade not found')
_print_upgrade_show(upgrade)