The virsh command 'domblkinfo' returns the capacity, allocation and phisycal size of the devices attached in a domain. Usually, this sizes are very big and hard to understand and calculate. This commits introduce a human readable support to check the size of each field easilly. For example, the command today: virsh # domblkinfo my_domain hda Capacity: 21474836480 Allocation: 14875545600 Physical: 21474836480 After this patch: virsh # domblkinfo my_domain hda --human Capacity: 20.0G Allocation: 13.9G Physical: 20.0G This commit supports Bytes, KiB and MiB too. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1330940 Signed-off-by: Julio Faracco <jcfaracco@xxxxxxxxx> --- tools/virsh-domain-monitor.c | 41 ++++++++++++++++++++++++++++++++++++++--- tools/virsh.pod | 5 +++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 3db4795..755d740 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -396,6 +396,10 @@ static const vshCmdOptDef opts_domblkinfo[] = { .flags = VSH_OFLAG_REQ, .help = N_("block device") }, + {.name = "human", + .type = VSH_OT_BOOL, + .help = N_("Human readable output") + }, {.name = NULL} }; @@ -405,6 +409,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd) virDomainBlockInfo info; virDomainPtr dom; bool ret = false; + bool human = false; const char *device = NULL; if (!(dom = virshCommandOptDomain(ctl, cmd, NULL))) @@ -416,9 +421,39 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd) if (virDomainGetBlockInfo(dom, device, &info, 0) < 0) goto cleanup; - vshPrint(ctl, "%-15s %llu\n", _("Capacity:"), info.capacity); - vshPrint(ctl, "%-15s %llu\n", _("Allocation:"), info.allocation); - vshPrint(ctl, "%-15s %llu\n", _("Physical:"), info.physical); + human = vshCommandOptBool(cmd, "human"); + + if (!human) { + vshPrint(ctl, "%-15s %llu\n", _("Capacity:"), info.capacity); + vshPrint(ctl, "%-15s %llu\n", _("Allocation:"), info.allocation); + vshPrint(ctl, "%-15s %llu\n", _("Physical:"), info.physical); + } else { + double sizeCapacity = 1; + const char *sizeStr = "B"; + + /* Check if capacity can be in K. */ + if (info.capacity >= 1024) { + sizeCapacity = 1024.0; + sizeStr = "K"; + } + /* Check if capacity can be in M. */ + if (info.capacity >= 1048576) { + sizeCapacity = 1048576.0; + sizeStr = "M"; + } + /* Check if capacity can be in G. */ + if (info.capacity >= 1073741824) { + sizeCapacity = 1073741824.0; + sizeStr = "G"; + } + + vshPrint(ctl, "%-15s %.1f%s\n", _("Capacity:"), + info.capacity/sizeCapacity, sizeStr); + vshPrint(ctl, "%-15s %.1f%s\n", _("Allocation:"), + info.allocation/sizeCapacity, sizeStr); + vshPrint(ctl, "%-15s %.1f%s\n", _("Physical:"), + info.physical/sizeCapacity, sizeStr); + } ret = true; diff --git a/tools/virsh.pod b/tools/virsh.pod index e16f62f..9f67de2 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -841,12 +841,13 @@ B<domstate> command says that a domain was paused due to I/O error. The B<domblkerror> command lists all block devices in error state and the error seen on each of them. -=item B<domblkinfo> I<domain> I<block-device> +=item B<domblkinfo> I<domain> I<block-device> [I<--human>] Get block device size info for a domain. A I<block-device> corresponds to a unique target name (<target dev='name'/>) or source file (<source file='name'/>) for one of the disk devices attached to I<domain> (see -also B<domblklist> for listing these names). +also B<domblklist> for listing these names). If I<--human> is set, the +output will have a human readable design. =item B<domblklist> I<domain> [I<--inactive>] [I<--details>] -- 2.7.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list