[libvirt] [PATCH v2 2/2] virsh: Enhance the detailed output of domblklist for networked source

Lin Ma lma at suse.com
Fri Sep 4 05:59:25 UTC 2015


Just tested the patch, It works well.
The changes makes more sense, Thanks for helping me to improve the patch!

在 2015年09月02日 23:58, Michal Privoznik 写道:
> From: Lin Ma <lma at suse.com>
>
> Format & output more detailed information about networked source
>
> e.g: The output without the patch:
> $ virsh domblklist $DOMAIN --details
> Type       Device     Target     Source
> ------------------------------------------------
> network    disk       vda        test-pool/image
> network    disk       vdb        iqn.2015-08.org.example:sn01/0
> network    disk       vdc        /image.raw
> network    disk       vdd        -
> network    disk       vde        -
> network    disk       vdf        image1
> network    disk       vdg        test-volume/image.raw
>
> The output with the patch:
> $ virsh domblklist $DOMAIN --details
> Type       Device     Target     Source
> ------------------------------------------------
> network    disk       vda        rbd://monitor1.example.org:6321/test-pool/image
> network    disk       vdb        iscsi://192.168.124.200:3260/iqn.2015-08.org.example:sn01/0
> network    disk       vdc        http://192.168.124.200:80/image.raw
> network    disk       vdd        nbd+unix:///var/run/nbdsock
> network    disk       vde        nbd://192.168.124.200:12345
> network    disk       vdf        sheepdog://192.168.124.200:6000/image1
> network    disk       vdg        gluster://192.168.124.200/test-volume/image.raw
>
> Signed-off-by: Lin Ma <lma at suse.com>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>   tools/virsh-domain-monitor.c | 64 ++++++++++++++++++++++++++++++++++++++++----
>   1 file changed, 59 insertions(+), 5 deletions(-)
>
> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index d4e500b..6446549 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -486,10 +486,17 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd)
>       xmlNodePtr *disks = NULL;
>       size_t i;
>       bool details = false;
> +    virBuffer buf = VIR_BUFFER_INITIALIZER;
>       char *type = NULL;
>       char *device = NULL;
>       char *target = NULL;
>       char *source = NULL;
> +    char *protocol = NULL;
> +    char *transport = NULL;
> +    char *host_name = NULL;
> +    char *host_port = NULL;
> +    char *socket = NULL;
> +    char *name = NULL;
>   
>       if (vshCommandOptBool(cmd, "inactive"))
>           flags |= VIR_DOMAIN_XML_INACTIVE;
> @@ -536,11 +543,45 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd)
>               vshError(ctl, "unable to query block list");
>               goto cleanup;
>           }
> -        source = virXPathString("string(./source/@file"
> -                                "|./source/@dev"
> -                                "|./source/@dir"
> -                                "|./source/@name"
> -                                "|./source/@volume)", ctxt);
> +        if (type && STREQ(type, "network")) {
> +            protocol = virXPathString("string(./source/@protocol)", ctxt);
> +            name = virXPathString("string(./source/@name)", ctxt);
> +            transport = virXPathString("string(./source/host/@transport)", ctxt);
> +            socket = virXPathString("string(./source/host/@socket)", ctxt);
> +            host_name = virXPathString("string(./source/host/@name)", ctxt);
> +            host_port = virXPathString("string(./source/host/@port)", ctxt);
> +
> +            virBufferAddStr(&buf, protocol);
> +
> +            if (transport)
> +                virBufferAsprintf(&buf, "+%s", transport);
> +            virBufferAddLit(&buf, "://");
> +            if (host_name) {
> +                virBufferAddStr(&buf, host_name);
> +                if (host_port)
> +                    virBufferAsprintf(&buf, ":%s", host_port);
> +            }
> +            if (name) {
> +                if (!STRPREFIX(name, "/"))
> +                    virBufferAddChar(&buf, '/');
> +                virBufferAddStr(&buf, name);
> +            } else if (socket) {
> +                if (!STRPREFIX(socket, "/"))
> +                    virBufferAddChar(&buf, '/');
> +                virBufferAddStr(&buf, socket);
> +            }
> +            if (virBufferError(&buf)) {
> +                virReportOOMError();
> +                goto cleanup;
> +            }
> +            source = virBufferContentAndReset(&buf);
> +        } else {
> +            source = virXPathString("string(./source/@file"
> +                                    "|./source/@dev"
> +                                    "|./source/@dir"
> +                                    "|./source/@name"
> +                                    "|./source/@volume)", ctxt);
> +        }
>           if (details) {
>               vshPrint(ctl, "%-10s %-10s %-10s %s\n", type, device,
>                        target, source ? source : "-");
> @@ -548,6 +589,12 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd)
>               vshPrint(ctl, "%-10s %s\n", target, source ? source : "-");
>           }
>   
> +        VIR_FREE(name);
> +        VIR_FREE(socket);
> +        VIR_FREE(host_port);
> +        VIR_FREE(host_name);
> +        VIR_FREE(transport);
> +        VIR_FREE(protocol);
>           VIR_FREE(source);
>           VIR_FREE(target);
>           VIR_FREE(device);
> @@ -557,10 +604,17 @@ cmdDomblklist(vshControl *ctl, const vshCmd *cmd)
>       ret = true;
>   
>    cleanup:
> +    VIR_FREE(name);
> +    VIR_FREE(socket);
> +    VIR_FREE(host_port);
> +    VIR_FREE(host_name);
> +    VIR_FREE(transport);
> +    VIR_FREE(protocol);
>       VIR_FREE(source);
>       VIR_FREE(target);
>       VIR_FREE(device);
>       VIR_FREE(type);
> +    virBufferFreeAndReset(&buf);
>       VIR_FREE(disks);
>       xmlXPathFreeContext(ctxt);
>       xmlFreeDoc(xmldoc);




More information about the libvir-list mailing list