[libvirt] RFE: virsh list improvement (--description and --details)

Pavel Hrdina phrdina at redhat.com
Tue May 9 08:06:26 UTC 2017


On Mon, May 08, 2017 at 09:16:26AM +0200, Przemysław Sztoch wrote:
> Dear Michal and Pavel,
> 
> We cover about 100 clients who have their own and simple CentOS KVM 
> installations.
> Their technical skills are far from writing python scripts. They expect 
> simple solutions.

Libvirt is an library that provides unified API to manage different
hypervisors.  Virsh is a simple command line tool to manage one host,
it's not an advanced management application.

> Talking to our helpdesk, I found that 70% of libvirt and virtualization 
> problems are:
> A) lack of autostart activation on critical guests; then occasional 
> failures and reboots affect lack of automatic startup of key services,
> B) frequent overcommiting of allocated virtual processors and memory due 
> to the lack of basic planning and addition operations of local admin 
> stuff :-(,
> C) misconfiguration of qemu-agent, which affects many problems with safe 
> restart, snapshot, backup, etc. (the "Time" column is a perfect 
> diagnostic here)
> D) leaving unnecessary snapshots that lie unused after many months,
> E) live migration attempts that fail to put domain in a transient mode 
> leave the guests disappearing in unexplained circumstances after kvm 
> host restart :-)
> 
> Virtually all the above problems of everyday life, our helpdesk is now 
> able to diagnose by command:
> virsh list --details --managed-save
> By the way, they can easily update the documentation with one compact list.
> 
> I do not understand your dislike for the proposed changes. All the 
> members of our team and teams of our partners have been very 
> enthusiastic about the new functionality.
> You govern, so you have to decide. ;-)

My dislike is that virsh isn't a management application, it's more like
a shell for virtualization.  All the listed problems are things, that
should be handled by management application build on top of libvirt.
This is a common misuse of libvirt.

For simple workstation usage there is virt-manager.  For advanced
management tasks there are different type of applications, see
<http://libvirt.org/apps.html>.

To address the patch itself, as it was already stated by Peter, instead
of adding --details there is command line tool "virt-top" and adding
--description isn't a good idea, because it will break the simple table
printed by "virsh list".  Abusing "virsh list" to provide statistics and
detailed information about domains isn't a way to go.

Pavel

> 
> Przemyslaw Sztoch

> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
> index 0ca53e4..1c3ec37 100644
> --- a/tools/virsh-domain-monitor.c
> +++ b/tools/virsh-domain-monitor.c
> @@ -1769,6 +1769,14 @@ static const vshCmdOptDef opts_list[] = {
>       .type = VSH_OT_BOOL,
>       .help = N_("show domain title")
>      },
> +    {.name = "description",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("show domain description")
> +    },
> +    {.name = "details",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("show domain details")
> +    },
>      {.name = NULL}
>  };
>  
> @@ -1780,6 +1788,8 @@ cmdList(vshControl *ctl, const vshCmd *cmd)
>  {
>      bool managed = vshCommandOptBool(cmd, "managed-save");
>      bool optTitle = vshCommandOptBool(cmd, "title");
> +    bool optDescription = vshCommandOptBool(cmd, "description");
> +    bool optDetails = vshCommandOptBool(cmd, "details");
>      bool optTable = vshCommandOptBool(cmd, "table");
>      bool optUUID = vshCommandOptBool(cmd, "uuid");
>      bool optName = vshCommandOptBool(cmd, "name");
> @@ -1822,6 +1832,9 @@ cmdList(vshControl *ctl, const vshCmd *cmd)
>  
>      VSH_EXCLUSIVE_OPTIONS("table", "name");
>      VSH_EXCLUSIVE_OPTIONS("table", "uuid");
> +    VSH_EXCLUSIVE_OPTIONS("description", "title");
> +    VSH_EXCLUSIVE_OPTIONS("details", "title");
> +    VSH_EXCLUSIVE_OPTIONS("details", "description");
>  
>      if (!optUUID && !optName)
>          optTable = true;
> @@ -1831,9 +1844,19 @@ cmdList(vshControl *ctl, const vshCmd *cmd)
>  
>      /* print table header in legacy mode */
>      if (optTable) {
> -        if (optTitle)
> +        if (optTitle || optDescription)
>              vshPrintExtra(ctl, " %-5s %-30s %-10s %-20s\n%s\n",
> -                          _("Id"), _("Name"), _("State"), _("Title"),
> +                          _("Id"), _("Name"), _("State"),
> +                          optTitle ? _("Title") : _("Description"),
> +                          "-----------------------------------------"
> +                          "-----------------------------------------");
> +        else if (optDetails)
> +            vshPrintExtra(ctl, " %-5s %-30s %-10s %-13s %-13s %5s %9s %9s %s\n%s\n",
> +                          _("Id"), _("Name"), _("State"), 
> +                          _("Autostart"), _("Persistent"),
> +                          _("vCPU"), _("Memory"), _("Snapshots"),
> +                          _("Time"),
> +                          "-----------------------------------------"
>                            "-----------------------------------------"
>                            "-----------------------------------------");
>          else
> @@ -1862,8 +1885,8 @@ cmdList(vshControl *ctl, const vshCmd *cmd)
>                  virDomainHasManagedSaveImage(dom, 0) > 0)
>                  state = -2;
>  
> -            if (optTitle) {
> -                if (!(title = virshGetDomainDescription(ctl, dom, true, 0)))
> +            if (optTitle || optDescription) {
> +                if (!(title = virshGetDomainDescription(ctl, dom, optTitle, 0)))
>                      goto cleanup;
>  
>                  vshPrint(ctl, " %-5s %-30s %-10s %-20s\n", id_buf,
> @@ -1873,6 +1896,60 @@ cmdList(vshControl *ctl, const vshCmd *cmd)
>                           title);
>  
>                  VIR_FREE(title);
> +            } else if (optDetails) {
> +                int autostart;
> +                int persistent;
> +                int vcpu = -1;
> +                int memory = -1;
> +                int nsnap;
> +                long long seconds = 0;
> +                unsigned int nseconds = 0;
> +
> +                virDomainInfo info;
> +
> +                if (virDomainGetAutostart(dom, &autostart) < 0) {
> +                    autostart = -1;
> +                }
> +                persistent = virDomainIsPersistent(dom);
> +
> +                if (virDomainGetInfo(dom, &info) == 0) {
> +                    vcpu = info.nrVirtCpu;
> +                    memory = info.memory / 1024;
> +                }
> +
> +                nsnap = virDomainSnapshotNum(dom, 0);
> +
> +                char timestr[100];
> +                if (state == VIR_DOMAIN_RUNNING) {
> +                        if (virDomainGetTime(dom, &seconds, &nseconds, 0) < 0) {
> +                        strcpy(timestr, _("unknown"));
> +                    } else {
> +                        time_t cur_time = seconds;
> +                        struct tm time_info;
> +
> +                        if (!gmtime_r(&cur_time, &time_info)) {
> +                                vshError(ctl, _("Unable to format time"));
> +                                goto cleanup;
> +                    }
> +                        strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", &time_info);
> +                    }
> +                } else {
> +                    strcpy(timestr, "");
> +                }
> +
> +                vshPrint(ctl, " %-5s %-30s %-10s %-13s %-13s %5d %9d %9d %s\n", id_buf,
> +                         virDomainGetName(dom),
> +                         state == -2 ? _("saved")
> +                         : virshDomainStateToString(state),
> +                         autostart == 1 ? _("yes") :
> +                         autostart == 0 ? _("no") : _("unknown"),
> +                         persistent == 1 ? _("yes") :
> +                         persistent == 0 ? _("no") : _("unknown"),
> +                         vcpu, memory,
> +                         nsnap,
> +                         timestr
> +                         );
> +
>              } else {
>                  vshPrint(ctl, " %-5s %-30s %s\n", id_buf,
>                           virDomainGetName(dom),

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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170509/57857d37/attachment-0001.sig>


More information about the libvir-list mailing list