ec1175df87
During upgrade, system commands: host-pv-list, host-pv-show, host-lvg-list, host-lvg-show, host-disk-partition-list, and host-disk-partition-show could display the host configuration that will be applied to host after upgrade. A notification message is displayed in the above commands to inform the user. Test Plan: Run commands during an upgrade, verify proper message is displayed. Run commands when upgrade is not in progress, the notification message is not displayed. Story: 2009303 Task: 46764 Signed-off-by: Bin Qian <bin.qian@windriver.com> Change-Id: Ie7131f4b7fa6ec9f5ed6de5acf3cf2cde1a53601
254 lines
9.1 KiB
Python
254 lines
9.1 KiB
Python
#
|
|
# Copyright (c) 2017-2022 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 cgtsclient.v1 import idisk as idisk_utils
|
|
from cgtsclient.v1 import ihost as ihost_utils
|
|
from cgtsclient.v1 import partition as part_utils
|
|
import math
|
|
|
|
|
|
PARTITION_MAP = {'lvm_phys_vol': constants.USER_PARTITION_PHYSICAL_VOLUME}
|
|
|
|
|
|
def _print_partition_show(partition):
|
|
fields = ['device_path', 'device_node', 'type_guid', 'type_name',
|
|
'start_mib', 'end_mib', 'size_mib', 'uuid', 'ihost_uuid',
|
|
'idisk_uuid', 'ipv_uuid', 'status', 'created_at', 'updated_at']
|
|
labels = ['device_path', 'device_node', 'type_guid', 'type_name',
|
|
'start_mib', 'end_mib', 'size_mib', 'uuid', 'ihost_uuid',
|
|
'idisk_uuid', 'ipv_uuid', 'status', 'created_at', 'updated_at']
|
|
partition.status = constants.PARTITION_STATUS_MSG[partition.status]
|
|
data = [(f, getattr(partition, f, '')) for f in fields]
|
|
utils.print_tuple_list(data, labels)
|
|
|
|
|
|
@utils.arg('hostname_or_id',
|
|
metavar='<hostname or id>',
|
|
help="Name or ID of host")
|
|
@utils.arg('device_path_or_uuid',
|
|
metavar='<partition device path or uuid>',
|
|
help="Name or UUID of the disk partition")
|
|
def do_host_disk_partition_show(cc, args):
|
|
"""Show disk partition attributes."""
|
|
|
|
upgrades = cc.upgrade.list()
|
|
if upgrades:
|
|
print(constants.UPGRADE_NOTIFICATION)
|
|
|
|
ihost = ihost_utils._find_ihost(cc, args.hostname_or_id)
|
|
ipartition = part_utils._find_partition(cc, ihost,
|
|
args.device_path_or_uuid)
|
|
if not ipartition:
|
|
raise exc.CommandError('Partition not found on host \'%s\' '
|
|
'by device path or uuid: %s' %
|
|
(ihost.hostname, args.device_path_or_uuid))
|
|
|
|
_print_partition_show(ipartition)
|
|
|
|
|
|
@utils.arg('hostname_or_id',
|
|
metavar='<hostname or id>',
|
|
help="Name or ID of host")
|
|
@utils.arg('--disk',
|
|
metavar='<idisk_uuid>',
|
|
nargs='?',
|
|
default=None,
|
|
help="uuid of disk")
|
|
def do_host_disk_partition_list(cc, args):
|
|
"""List disk partitions."""
|
|
upgrades = cc.upgrade.list()
|
|
if upgrades:
|
|
print(constants.UPGRADE_NOTIFICATION)
|
|
|
|
ihost = ihost_utils._find_ihost(cc, args.hostname_or_id)
|
|
if args.disk:
|
|
idisk = idisk_utils._find_disk(cc, args.hostname_or_id, args.disk)
|
|
|
|
if not idisk:
|
|
raise exc.CommandError('Disk not found: %s' % args.disk)
|
|
|
|
ipartitions = cc.partition.list(ihost.uuid, idisk.uuid)
|
|
else:
|
|
ipartitions = cc.partition.list(ihost.uuid, None)
|
|
|
|
for p in ipartitions:
|
|
p.status = constants.PARTITION_STATUS_MSG[p.status]
|
|
|
|
p.size_mib = math.floor(float(p.size_mib) / 1024 * 1000) / 1000.0 # pylint: disable=old-division
|
|
|
|
field_labels = ['uuid', 'device_path', 'device_node', 'type_guid',
|
|
'type_name', 'size_gib', 'status']
|
|
fields = ['uuid', 'device_path', 'device_node', 'type_guid', 'type_name',
|
|
'size_mib', 'status']
|
|
|
|
utils.print_list(ipartitions, fields, field_labels, sortby=1)
|
|
|
|
|
|
@utils.arg('hostname_or_id',
|
|
metavar='<hostname or id>',
|
|
help="Name or ID of host [REQUIRED]")
|
|
@utils.arg('disk_path_or_uuid',
|
|
metavar='<disk path or uuid>',
|
|
help="UUID of the disk to place the partition [REQUIRED]")
|
|
@utils.arg('size_gib',
|
|
metavar='<partition size in GiB>',
|
|
help="Requested size of the new partition in GiB [REQUIRED]")
|
|
@utils.arg('-t', '--partition_type',
|
|
metavar='<partition type>',
|
|
choices=['lvm_phys_vol'],
|
|
default='lvm_phys_vol',
|
|
help=("Type of parition. "
|
|
"Allowed values: lvm_phys_vol"))
|
|
def do_host_disk_partition_add(cc, args):
|
|
"""Add a disk partition to a disk of a specified host."""
|
|
|
|
field_list = ['size_gib', 'partition_type']
|
|
integer_fields = ['size_gib']
|
|
|
|
user_fields = dict((k, v) for (k, v) in vars(args).items()
|
|
if k in field_list and not (v is None))
|
|
|
|
for f in user_fields:
|
|
try:
|
|
if f in integer_fields:
|
|
user_fields[f] = int(user_fields[f])
|
|
except ValueError:
|
|
raise exc.CommandError('Partition size must be an integer '
|
|
'greater than 0: %s' % user_fields[f])
|
|
|
|
# Convert size from gib to mib
|
|
user_fields['size_mib'] = user_fields.pop('size_gib') * 1024
|
|
|
|
# Get the ihost object
|
|
ihost = ihost_utils._find_ihost(cc, args.hostname_or_id)
|
|
idisk = idisk_utils._find_disk(cc, ihost, args.disk_path_or_uuid)
|
|
|
|
if not idisk:
|
|
raise exc.CommandError('Disk not found: %s' % args.disk_path_or_uuid)
|
|
|
|
# default values
|
|
fields = {'ihost_uuid': ihost.uuid,
|
|
'idisk_uuid': idisk.uuid,
|
|
'size_mib': 0}
|
|
|
|
fields.update(user_fields)
|
|
|
|
# Set the requested partition GUID
|
|
fields['type_guid'] = PARTITION_MAP[fields['partition_type']]
|
|
fields.pop('partition_type', None)
|
|
|
|
if not fields['size_mib']:
|
|
raise exc.CommandError('Partition size must be greater than 0.')
|
|
|
|
try:
|
|
partition = cc.partition.create(**fields)
|
|
except exc.HTTPNotFound:
|
|
raise exc.CommandError('Partition create failed: host %s: fields %s' %
|
|
(args.hostnameorid, fields))
|
|
|
|
puuid = getattr(partition, 'uuid', '')
|
|
try:
|
|
ipartition = cc.partition.get(puuid)
|
|
except exc.HTTPNotFound:
|
|
raise exc.CommandError('Created Partition UUID not found: %s' % puuid)
|
|
|
|
_print_partition_show(ipartition)
|
|
|
|
|
|
@utils.arg('hostname_or_id',
|
|
metavar='<hostname or id>',
|
|
help="Name or ID of host [REQUIRED]")
|
|
@utils.arg('partition_path_or_uuid',
|
|
metavar='<partition path or uuid>',
|
|
help="UUID of the partition [REQUIRED]")
|
|
def do_host_disk_partition_delete(cc, args):
|
|
"""Delete a disk partition."""
|
|
|
|
# Get the ihost object
|
|
ihost = ihost_utils._find_ihost(cc, args.hostname_or_id)
|
|
partition = part_utils._find_partition(cc, ihost,
|
|
args.partition_path_or_uuid)
|
|
if not partition:
|
|
raise exc.CommandError('Partition not found on host \'%s\' '
|
|
'by device path or uuid: %s' %
|
|
(ihost.hostname, args.partition_path_or_uuid))
|
|
|
|
try:
|
|
cc.partition.delete(partition.uuid)
|
|
except exc.HTTPNotFound:
|
|
raise exc.CommandError('Partition delete failed: host %s: '
|
|
'partition %s' % (args.hostnameorid,
|
|
args.partition_path_or_uuid))
|
|
|
|
|
|
@utils.arg('hostname_or_id',
|
|
metavar='<hostname or id>',
|
|
help="Name or ID of the host [REQUIRED]")
|
|
@utils.arg('partition_path_or_uuid',
|
|
metavar='<partition path or uuid>',
|
|
help="UUID of the partition [REQUIRED]")
|
|
@utils.arg('-s', '--size_gib',
|
|
metavar='<partition size in GiB>',
|
|
help=("Update the desired size of the partition"))
|
|
def do_host_disk_partition_modify(cc, args):
|
|
"""Modify the attributes of a Disk Partition."""
|
|
|
|
# Get all the fields from the command arguments
|
|
field_list = ['size_gib']
|
|
integer_fields = ['size_gib']
|
|
|
|
user_specified_fields = dict((k, v) for (k, v) in vars(args).items()
|
|
if k in field_list and not (v is None))
|
|
|
|
if not user_specified_fields:
|
|
raise exc.CommandError('No update parameters specified, '
|
|
'partition is unchanged.')
|
|
|
|
for f in user_specified_fields:
|
|
try:
|
|
if f in integer_fields:
|
|
user_specified_fields[f] = int(user_specified_fields[f])
|
|
except ValueError:
|
|
raise exc.CommandError('Partition size must be an integer '
|
|
'greater than 0: %s' % user_specified_fields[f])
|
|
|
|
# Convert size from gib to mib
|
|
user_specified_fields['size_mib'] = user_specified_fields.pop('size_gib') * 1024
|
|
|
|
# Get the ihost object
|
|
ihost = ihost_utils._find_ihost(cc, args.hostname_or_id)
|
|
|
|
# Get the partition
|
|
partition = part_utils._find_partition(cc, ihost,
|
|
args.partition_path_or_uuid)
|
|
if not partition:
|
|
raise exc.CommandError('Partition not found on host \'%s\' '
|
|
'by device path or uuid: %s' %
|
|
(ihost.hostname, args.partition_path_or_uuid))
|
|
|
|
patch = []
|
|
for (k, v) in user_specified_fields.items():
|
|
patch.append({'op': 'replace', 'path': '/' + k, 'value': v})
|
|
|
|
# Update the partition attributes
|
|
try:
|
|
updated_partition = cc.partition.update(partition.uuid, patch)
|
|
except exc.HTTPNotFound:
|
|
raise exc.CommandError(
|
|
"ERROR: Partition update failed: "
|
|
"host %s partition %s : update %s"
|
|
% (args.hostname_or_id, args.partition_path_or_uuid, patch))
|
|
|
|
_print_partition_show(updated_partition)
|