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

Przemysław Sztoch psztoch at gmail.com
Mon May 8 07:16:26 UTC 2017


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.

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. ;-)

Przemyslaw Sztoch
-------------- next part --------------
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),


More information about the libvir-list mailing list