config/sysinv/cgts-client/cgts-client/cgtsclient/v1/istor_shell.py
Wei Zhou 3f86a35665 Use GiB for storage related size display
This commit delivers the code change in cgcsclient and sysinv to unify
storage related size (e.g. disk, partition, lvg, journal) display/input
to use GIB. It also delivers change in lab_setup.conf for all the labs
because now the partition and lvg size input is in GiB instead of MiB.

Change-Id: I7a9c88a02ce8bdd4ee43141cd149bb82b68e6e9d
2018-06-28 22:07:38 -04:00

226 lines
7.4 KiB
Python

#!/usr/bin/env python
#
# Copyright (c) 2013-2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# All Rights Reserved.
#
from cgtsclient.common import utils
from cgtsclient import exc
from cgtsclient.v1 import ihost as ihost_utils
from cgtsclient.v1 import istor as istor_utils
def _print_istor_show(istor):
fields = ['osdid', 'function', 'journal_location',
'journal_size_mib', 'journal_path', 'journal_node',
'uuid', 'ihost_uuid', 'idisk_uuid', 'tier_uuid', 'tier_name',
'created_at', 'updated_at']
labels = ['osdid', 'function', 'journal_location',
'journal_size_gib', 'journal_path', 'journal_node',
'uuid', 'ihost_uuid', 'idisk_uuid', 'tier_uuid', 'tier_name',
'created_at', 'updated_at']
data = [(f, getattr(istor, f, '')) for f in fields]
utils.print_tuple_list(data, labels)
def _find_stor(cc, ihost, storuuid):
stors = cc.istor.list(ihost.uuid)
for i in stors:
if i.uuid == storuuid:
break
else:
raise exc.CommandError('Stor not found: host %s stor %s' %
(ihost.hostname, storuuid))
return i
@utils.arg('hostnameorid',
metavar='<hostname or id>',
nargs='?',
default=None,
help="Name or ID of host")
@utils.arg('storuuid',
metavar='<stor uuid>',
help="UUID of stor")
def do_host_stor_show(cc, args):
"""Show storage attributes."""
if args.hostnameorid:
ihost_utils._find_ihost(cc, args.hostnameorid)
i = cc.istor.get(args.storuuid)
# convert journal size from mib to gib when display
if i.journal_size_mib:
i.journal_size_mib = i.journal_size_mib / 1024
_print_istor_show(i)
@utils.arg('hostnameorid',
metavar='<hostname or id>',
help="Name or ID of host")
def do_host_stor_list(cc, args):
"""List host storage."""
ihost = ihost_utils._find_ihost(cc, args.hostnameorid)
istors = cc.istor.list(ihost.uuid)
for i in istors:
istor_utils._get_disks(cc, ihost, i)
# convert journal size from mib to gib when display
if i.journal_size_mib:
i.journal_size_mib = i.journal_size_mib / 1024
field_labels = ['uuid', 'function', 'osdid', 'capabilities',
'idisk_uuid', 'journal_path', 'journal_node',
'journal_size_gib', 'tier_name']
fields = ['uuid', 'function', 'osdid', 'capabilities',
'idisk_uuid', 'journal_path', 'journal_node', 'journal_size_mib',
'tier_name']
utils.print_list(istors, fields, field_labels, sortby=0)
@utils.arg('hostnameorid',
metavar='<hostname or id>',
help="Name or ID of host [REQUIRED]")
@utils.arg('function',
metavar='<function>',
choices=['osd', 'monitor', 'journal'],
nargs='?',
default='osd',
help="Type of the stor (default: osd)")
@utils.arg('idisk_uuid',
metavar='<idisk_uuid>',
help="uuid of disk [REQUIRED]")
@utils.arg('--journal-location',
metavar='<journal_location>',
nargs='?',
default=None,
help="Location of stor's journal")
@utils.arg('--journal-size',
metavar='<size of the journal (GiB)>',
nargs='?',
default=None,
help="Size of stor's journal, in GiB")
@utils.arg('--tier-uuid',
metavar='<storage tier uuid>',
nargs='?',
default=None,
help="storage tier to assign this OSD")
def do_host_stor_add(cc, args):
"""Add a storage to a host."""
field_list = ['function', 'idisk_uuid', 'journal_location', 'journal_size',
'tier_uuid']
integer_fields = ['journal_size']
user_specified_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_specified_fields:
try:
if f in integer_fields:
user_specified_fields[f] = int(user_specified_fields[f])
except ValueError:
raise exc.CommandError('Journal size must be an integer '
'greater than 0: %s' % user_specified_fields[f])
if 'journal_size' in user_specified_fields.keys():
user_specified_fields['journal_size_mib'] = \
user_specified_fields.pop('journal_size') * 1024
if 'function' in user_specified_fields.keys():
user_specified_fields['function'] = \
user_specified_fields['function'].replace(" ", "")
if 'tier_uuid' in user_specified_fields.keys():
user_specified_fields['tier_uuid'] = \
user_specified_fields['tier_uuid'].replace(" ", "")
# default values, name comes from 'osd add'
fields = {'function': 'osd'}
fields.update(user_specified_fields)
ihost = ihost_utils._find_ihost(cc, args.hostnameorid)
try:
fields['ihost_uuid'] = ihost.uuid
istor = cc.istor.create(**fields)
except exc.HTTPNotFound:
raise exc.CommandError('Stor create failed: host %s: fields %s'
% (args.hostnameorid, fields))
suuid = getattr(istor, 'uuid', '')
try:
istor = cc.istor.get(suuid)
except exc.HTTPNotFound:
raise exc.CommandError('Created Stor UUID not found: %s' % suuid)
# istor_utils._get_disks(cc, ihost, istor)
_print_istor_show(istor)
@utils.arg('osd',
metavar='<osd stor uuid>',
help="UUID of osd[REQUIRED]")
@utils.arg('--journal-location',
metavar='<journal_location>',
nargs='?',
default=None,
help="Location of stor's journal")
@utils.arg('--journal-size',
metavar='<size of the journal (MiB)>',
nargs='?',
default=None,
help="Size of stor's journal, in MiB")
def do_host_stor_update(cc, args):
"""Modify journal attributes for OSD."""
field_list = ['function', 'idisk_uuid', 'journal_location', 'journal_size']
integer_fields = ['journal_size']
user_specified_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_specified_fields:
try:
if f in integer_fields:
user_specified_fields[f] = int(user_specified_fields[f])
except ValueError:
raise exc.CommandError('Journal size must be an integer '
'greater than 0: %s' % user_specified_fields[f])
if 'journal_size' in user_specified_fields.keys():
user_specified_fields['journal_size_mib'] = \
user_specified_fields.pop('journal_size') * 1024
patch = []
for (k, v) in user_specified_fields.items():
patch.append({'op': 'replace', 'path': '/' + k, 'value': v})
try:
istor = cc.istor.update(args.osd, patch)
except exc.HTTPNotFound:
raise exc.CommandError('OSD update failed: OSD %s: patch %s'
% (args.osd, patch))
_print_istor_show(istor)
@utils.arg('stor',
metavar='<stor id or uuid>',
help="UUID of stor[REQUIRED]")
def do_host_stor_delete(cc, args):
"""Delete a stor"""
try:
cc.istor.delete(args.stor)
except exc.HTTPNotFound:
raise exc.CommandError('Delete failed, stor: %s not found'
% args.stor)