[PATCH 04/12] qemuAgentCommand: Wire up suppressing of error reporting for unsupported commands

Peter Krempa pkrempa at redhat.com
Mon Mar 16 08:35:46 UTC 2020


In some cases we don't want to log errors if an agent command is
unsupported. Wire it up into qemuAgentCheckError via qemuAgentCommandFull
and provide a thin wrapper (qemuAgentCommand) to prevent having to fix
all callers.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_agent.c | 45 +++++++++++++++++++++++++++++++------------
 1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index 8790c47b87..bc5d57ab94 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -1051,7 +1051,8 @@ qemuAgentCommandName(virJSONValuePtr cmd)

 static int
 qemuAgentCheckError(virJSONValuePtr cmd,
-                    virJSONValuePtr reply)
+                    virJSONValuePtr reply,
+                    bool report_unsupported)
 {
     if (virJSONValueObjectHasKey(reply, "error")) {
         virJSONValuePtr error = virJSONValueObjectGet(reply, "error");
@@ -1063,15 +1064,25 @@ qemuAgentCheckError(virJSONValuePtr cmd,
                   NULLSTR(cmdstr), NULLSTR(replystr));

         /* Only send the user the command name + friendly error */
-        if (!error)
+        if (!error) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("unable to execute QEMU agent command '%s'"),
                            qemuAgentCommandName(cmd));
-        else
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("unable to execute QEMU agent command '%s': %s"),
-                           qemuAgentCommandName(cmd),
-                           qemuAgentStringifyError(error));
+            return -1;
+        }
+
+        if (!report_unsupported) {
+            const char *klass = virJSONValueObjectGetString(error, "class");
+
+            if (STREQ_NULLABLE(klass, "CommandNotFound") ||
+                STREQ_NULLABLE(klass, "CommandDisabled"))
+                return -2;
+        }
+
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("unable to execute QEMU agent command '%s': %s"),
+                       qemuAgentCommandName(cmd),
+                       qemuAgentStringifyError(error));

         return -1;
     } else if (!virJSONValueObjectHasKey(reply, "return")) {
@@ -1089,10 +1100,11 @@ qemuAgentCheckError(virJSONValuePtr cmd,
 }

 static int
-qemuAgentCommand(qemuAgentPtr agent,
-                 virJSONValuePtr cmd,
-                 virJSONValuePtr *reply,
-                 int seconds)
+qemuAgentCommandFull(qemuAgentPtr agent,
+                     virJSONValuePtr cmd,
+                     virJSONValuePtr *reply,
+                     int seconds,
+                     bool report_unsupported)
 {
     int ret = -1;
     qemuAgentMessage msg;
@@ -1143,7 +1155,7 @@ qemuAgentCommand(qemuAgentPtr agent,
     }

     *reply = msg.rxObject;
-    ret = qemuAgentCheckError(cmd, *reply);
+    ret = qemuAgentCheckError(cmd, *reply, report_unsupported);

  cleanup:
     VIR_FREE(cmdstr);
@@ -1153,6 +1165,15 @@ qemuAgentCommand(qemuAgentPtr agent,
     return ret;
 }

+static int
+qemuAgentCommand(qemuAgentPtr agent,
+                 virJSONValuePtr cmd,
+                 virJSONValuePtr *reply,
+                 int seconds)
+{
+    return qemuAgentCommandFull(agent, cmd, reply, seconds, true);
+}
+
 static virJSONValuePtr G_GNUC_NULL_TERMINATED
 qemuAgentMakeCommand(const char *cmdname,
                      ...)
-- 
2.24.1




More information about the libvir-list mailing list