[libvirt] [PATCH] virsh-domain-monitor: add human readable output for 'domblkinfo'.

Julio Faracco posted 1 patch 6 years, 11 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/1493678155-10011-1-git-send-email-jcfaracco@gmail.com
tools/virsh-domain-monitor.c | 41 ++++++++++++++++++++++++++++++++++++++---
tools/virsh.pod              |  5 +++--
2 files changed, 41 insertions(+), 5 deletions(-)
[libvirt] [PATCH] virsh-domain-monitor: add human readable output for 'domblkinfo'.
Posted by Julio Faracco 6 years, 11 months ago
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@gmail.com>
---
 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@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] virsh-domain-monitor: add human readable output for 'domblkinfo'.
Posted by Michal Privoznik 6 years, 11 months ago
On 05/02/2017 12:35 AM, Julio Faracco wrote:
> 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@gmail.com>
> ---
>  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";
> +        }

There's no need for this complexity. We have vshPrettyCapacity() just
for that. You can look at cmdDomjobinfo() for example of its usage.

> +
> +        vshPrint(ctl, "%-15s %.1f%s\n", _("Capacity:"),

Here we prefer slightly different format: "%-.3lf":
- double is long float
- .3 for more digits after decimal point
- `-` for left alignment

> +                                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.

I personally prefer "human readable output".

So, I'm fixing all the nits I've pointed out, ACKing and pushing.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list