[libvirt] [PATCH 03/11] vsh: Add @silent to vshConnectionHook

Michal Privoznik mprivozn at redhat.com
Tue Nov 7 12:22:51 UTC 2017


In near future we will want to not report error when connecting
fails. In order to achieve that we have to pass a boolean that
suppresses error messages.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 tools/virsh-domain.c |  2 +-
 tools/virsh.c        | 67 ++++++++++++++++++++++++++++++++--------------------
 tools/virsh.h        |  5 +++-
 tools/virt-admin.c   | 49 +++++++++++++++++++++-----------------
 tools/vsh.c          |  2 +-
 tools/vsh.h          |  3 ++-
 6 files changed, 76 insertions(+), 52 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 42d552637..cf612f73e 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -10931,7 +10931,7 @@ cmdMigrate(vshControl *ctl, const vshCmd *cmd)
         if (vshCommandOptStringReq(ctl, cmd, "desturi", &desturi) < 0)
             goto cleanup;
 
-        dconn = virshConnect(ctl, desturi, false);
+        dconn = virshConnect(ctl, desturi, false, false);
         if (!dconn)
             goto cleanup;
 
diff --git a/tools/virsh.c b/tools/virsh.c
index d0c135016..7d6dc2620 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -137,7 +137,7 @@ virshCatchDisconnect(virConnectPtr conn,
 /* Main Function which should be used for connecting.
  * This function properly handles keepalive settings. */
 virConnectPtr
-virshConnect(vshControl *ctl, const char *uri, bool readonly)
+virshConnect(vshControl *ctl, const char *uri, bool readonly, bool silent)
 {
     virConnectPtr c = NULL;
     int interval = 5; /* Default */
@@ -191,15 +191,19 @@ virshConnect(vshControl *ctl, const char *uri, bool readonly)
     if (interval > 0 &&
         virConnectSetKeepAlive(c, interval, count) != 0) {
         if (keepalive_forced) {
-            vshError(ctl, "%s",
-                     _("Cannot setup keepalive on connection "
-                       "as requested, disconnecting"));
+            if (!silent) {
+                vshError(ctl, "%s",
+                         _("Cannot setup keepalive on connection "
+                           "as requested, disconnecting"));
+            }
             virConnectClose(c);
             c = NULL;
             goto cleanup;
         }
-        vshDebug(ctl, VSH_ERR_INFO, "%s",
-                 _("Failed to setup keepalive on connection\n"));
+        if (!silent) {
+            vshDebug(ctl, VSH_ERR_INFO, "%s",
+                     _("Failed to setup keepalive on connection\n"));
+        }
     }
 
  cleanup:
@@ -214,7 +218,11 @@ virshConnect(vshControl *ctl, const char *uri, bool readonly)
  *
  */
 static int
-virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
+virshReconnect(vshControl *ctl,
+               const char *name,
+               bool readonly,
+               bool force,
+               bool silent)
 {
     bool connected = false;
     virshControlPtr priv = ctl->privData;
@@ -232,20 +240,25 @@ virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
 
         virConnectUnregisterCloseCallback(priv->conn, virshCatchDisconnect);
         ret = virConnectClose(priv->conn);
-        if (ret < 0)
-            vshError(ctl, "%s", _("Failed to disconnect from the hypervisor"));
-        else if (ret > 0)
-            vshError(ctl, "%s", _("One or more references were leaked after "
-                                  "disconnect from the hypervisor"));
+        if (!silent) {
+            if (ret < 0)
+                vshError(ctl, "%s", _("Failed to disconnect from the hypervisor"));
+            else if (ret > 0)
+                vshError(ctl, "%s", _("One or more references were leaked after "
+                                      "disconnect from the hypervisor"));
+        }
     }
 
-    priv->conn = virshConnect(ctl, name ? name : ctl->connname, readonly);
+    priv->conn = virshConnect(ctl, name ? name : ctl->connname,
+                              readonly, silent);
 
     if (!priv->conn) {
-        if (disconnected)
-            vshError(ctl, "%s", _("Failed to reconnect to the hypervisor"));
-        else
-            vshError(ctl, "%s", _("failed to connect to the hypervisor"));
+        if (!silent) {
+            if (disconnected)
+                vshError(ctl, "%s", _("Failed to reconnect to the hypervisor"));
+            else
+                vshError(ctl, "%s", _("Failed to connect to the hypervisor"));
+        }
         return -1;
     } else {
         if (name) {
@@ -255,8 +268,9 @@ virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
         }
         if (virConnectRegisterCloseCallback(priv->conn, virshCatchDisconnect,
                                             ctl, NULL) < 0)
-            vshError(ctl, "%s", _("Unable to register disconnect callback"));
-        if (connected && !force)
+            if (!silent)
+                vshError(ctl, "%s", _("Unable to register disconnect callback"));
+        if (connected && !force && !silent)
             vshError(ctl, "%s", _("Reconnected to the hypervisor"));
     }
     disconnected = 0;
@@ -304,7 +318,7 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
     if (vshCommandOptStringReq(ctl, cmd, "name", &name) < 0)
         return false;
 
-    if (virshReconnect(ctl, name, ro, true) < 0)
+    if (virshReconnect(ctl, name, ro, true, false) < 0)
         return false;
 
     return true;
@@ -316,11 +330,12 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
  */
 
 static bool
-virshConnectionUsability(vshControl *ctl, virConnectPtr conn)
+virshConnectionUsability(vshControl *ctl, virConnectPtr conn, bool silent)
 {
     if (!conn ||
         virConnectIsAlive(conn) == 0) {
-        vshError(ctl, "%s", _("no valid connection"));
+        if (!silent)
+            vshError(ctl, "%s", _("no valid connection"));
         return false;
     }
 
@@ -333,15 +348,15 @@ virshConnectionUsability(vshControl *ctl, virConnectPtr conn)
 }
 
 static void *
-virshConnectionHandler(vshControl *ctl)
+virshConnectionHandler(vshControl *ctl, bool silent)
 {
     virshControlPtr priv = ctl->privData;
 
     if ((!priv->conn || disconnected) &&
-        virshReconnect(ctl, NULL, false, false) < 0)
+        virshReconnect(ctl, NULL, false, false, silent) < 0)
         return NULL;
 
-    if (virshConnectionUsability(ctl, priv->conn))
+    if (virshConnectionUsability(ctl, priv->conn, silent))
         return priv->conn;
 
     return NULL;
@@ -391,7 +406,7 @@ virshInit(vshControl *ctl)
          * non-default connection, or might be 'help' which needs no
          * connection).
          */
-        if (virshReconnect(ctl, NULL, false, false) < 0) {
+        if (virshReconnect(ctl, NULL, false, false, false) < 0) {
             vshReportError(ctl);
             return false;
         }
diff --git a/tools/virsh.h b/tools/virsh.h
index b353b645a..e03b597ef 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -144,6 +144,9 @@ typedef enum {
     VIRSH_BYMAC  = (1 << 4),
 } virshLookupByFlags;
 
-virConnectPtr virshConnect(vshControl *ctl, const char *uri, bool readonly);
+virConnectPtr virshConnect(vshControl *ctl,
+                           const char *uri,
+                           bool readonly,
+                           bool silent);
 
 #endif /* VIRSH_H */
diff --git a/tools/virt-admin.c b/tools/virt-admin.c
index b8b33af19..5d7ef7988 100644
--- a/tools/virt-admin.c
+++ b/tools/virt-admin.c
@@ -154,24 +154,26 @@ vshAdmCatchDisconnect(virAdmConnectPtr conn ATTRIBUTE_UNUSED,
 }
 
 static int
-vshAdmConnect(vshControl *ctl, unsigned int flags)
+vshAdmConnect(vshControl *ctl, unsigned int flags, bool silent)
 {
     vshAdmControlPtr priv = ctl->privData;
 
     priv->conn = virAdmConnectOpen(ctl->connname, flags);
 
     if (!priv->conn) {
-        if (priv->wantReconnect)
-            vshError(ctl, "%s", _("Failed to reconnect to the admin server"));
-        else
-            vshError(ctl, "%s", _("Failed to connect to the admin server"));
+        if (!silent) {
+            if (priv->wantReconnect)
+                vshError(ctl, "%s", _("Failed to reconnect to the admin server"));
+            else
+                vshError(ctl, "%s", _("Failed to connect to the admin server"));
+        }
         return -1;
     } else {
         if (virAdmConnectRegisterCloseCallback(priv->conn, vshAdmCatchDisconnect,
-                                               NULL, NULL) < 0)
+                                               NULL, NULL) < 0 && !silent)
             vshError(ctl, "%s", _("Unable to register disconnect callback"));
 
-        if (priv->wantReconnect)
+        if (priv->wantReconnect && !silent)
             vshPrint(ctl, "%s\n", _("Reconnected to the admin server"));
     }
 
@@ -179,7 +181,7 @@ vshAdmConnect(vshControl *ctl, unsigned int flags)
 }
 
 static int
-vshAdmDisconnect(vshControl *ctl)
+vshAdmDisconnect(vshControl *ctl, bool silent)
 {
     int ret = 0;
     vshAdmControlPtr priv = ctl->privData;
@@ -189,11 +191,13 @@ vshAdmDisconnect(vshControl *ctl)
 
     virAdmConnectUnregisterCloseCallback(priv->conn, vshAdmCatchDisconnect);
     ret = virAdmConnectClose(priv->conn);
-    if (ret < 0)
-        vshError(ctl, "%s", _("Failed to disconnect from the admin server"));
-    else if (ret > 0)
-        vshError(ctl, "%s", _("One or more references were leaked after "
-                              "disconnect from the hypervisor"));
+    if (!silent) {
+        if (ret < 0)
+            vshError(ctl, "%s", _("Failed to disconnect from the admin server"));
+        else if (ret > 0)
+            vshError(ctl, "%s", _("One or more references were leaked after "
+                                  "disconnect from the hypervisor"));
+    }
     priv->conn = NULL;
     return ret;
 }
@@ -205,14 +209,14 @@ vshAdmDisconnect(vshControl *ctl)
  *
  */
 static void
-vshAdmReconnect(vshControl *ctl)
+vshAdmReconnect(vshControl *ctl, bool silent)
 {
     vshAdmControlPtr priv = ctl->privData;
     if (priv->conn)
         priv->wantReconnect = true;
 
-    vshAdmDisconnect(ctl);
-    vshAdmConnect(ctl, 0);
+    vshAdmDisconnect(ctl, silent);
+    vshAdmConnect(ctl, 0, silent);
 
     priv->wantReconnect = false;
 }
@@ -350,7 +354,7 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
         ctl->connname = vshStrdup(ctl, name);
     }
 
-    vshAdmReconnect(ctl);
+    vshAdmReconnect(ctl, false);
     if (!connected && priv->conn)
         vshPrint(ctl, "%s\n", _("Connected to the admin server"));
 
@@ -1080,15 +1084,16 @@ cmdDaemonLogOutputs(vshControl *ctl, const vshCmd *cmd)
 }
 
 static void *
-vshAdmConnectionHandler(vshControl *ctl)
+vshAdmConnectionHandler(vshControl *ctl, bool silent)
 {
     vshAdmControlPtr priv = ctl->privData;
 
     if (!virAdmConnectIsAlive(priv->conn))
-        vshAdmReconnect(ctl);
+        vshAdmReconnect(ctl, silent);
 
     if (!virAdmConnectIsAlive(priv->conn)) {
-        vshError(ctl, "%s", _("no valid connection"));
+        if (!silent)
+            vshError(ctl, "%s", _("no valid connection"));
         return NULL;
     }
 
@@ -1122,7 +1127,7 @@ vshAdmInit(vshControl *ctl)
     ctl->eventLoopStarted = true;
 
     if (ctl->connname) {
-        vshAdmReconnect(ctl);
+        vshAdmReconnect(ctl, false);
         /* Connecting to a named connection must succeed, but we delay
          * connecting to the default connection until we need it
          * (since the first command might be 'connect' which allows a
@@ -1156,7 +1161,7 @@ vshAdmDeinit(vshControl *ctl)
     VIR_FREE(ctl->connname);
 
     if (priv->conn)
-        vshAdmDisconnect(ctl);
+        vshAdmDisconnect(ctl, false);
 
     virResetLastError();
 
diff --git a/tools/vsh.c b/tools/vsh.c
index 24ea45aa4..83c96e1a8 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -1321,7 +1321,7 @@ vshCommandRun(vshControl *ctl, const vshCmd *cmd)
             GETTIMEOFDAY(&before);
 
         if ((cmd->def->flags & VSH_CMD_FLAG_NOCONNECT) ||
-            (hooks && hooks->connHandler && hooks->connHandler(ctl))) {
+            (hooks && hooks->connHandler && hooks->connHandler(ctl, false))) {
             ret = cmd->def->handler(ctl, cmd);
         } else {
             /* connection is not usable, return error */
diff --git a/tools/vsh.h b/tools/vsh.h
index 8f7df9ff8..c411c2ca4 100644
--- a/tools/vsh.h
+++ b/tools/vsh.h
@@ -232,7 +232,8 @@ struct _vshControl {
 };
 
 typedef void *
-(*vshConnectionHook)(vshControl *ctl);
+(*vshConnectionHook)(vshControl *ctl,
+                     bool silent);
 
 struct _vshClientHooks {
     vshConnectionHook connHandler;
-- 
2.13.6




More information about the libvir-list mailing list