[libvirt] [PATCH 12/20] qemumonitortestutils: Add instrumentation for guest agent testing

Peter Krempa pkrempa at redhat.com
Tue Jul 30 13:05:47 UTC 2013


Add helper functions to open guest agent connections and a handler for
replying to the "guest-sync" command.
---
 tests/qemumonitortestutils.c | 133 ++++++++++++++++++++++++++++++++++++++++++-
 tests/qemumonitortestutils.h |   6 ++
 2 files changed, 137 insertions(+), 2 deletions(-)

diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c
index 6dc430e..96cb054 100644
--- a/tests/qemumonitortestutils.c
+++ b/tests/qemumonitortestutils.c
@@ -28,6 +28,7 @@

 #include "virthread.h"
 #include "qemu/qemu_monitor.h"
+#include "qemu/qemu_agent.h"
 #include "rpc/virnetsocket.h"
 #include "viralloc.h"
 #include "virlog.h"
@@ -68,6 +69,7 @@ struct _qemuMonitorTest {
     virNetSocketPtr client;

     qemuMonitorPtr mon;
+    qemuAgentPtr agent;

     char *tmpdir;

@@ -118,7 +120,7 @@ qemuMonitorTestAddReponse(qemuMonitorTestPtr test,
 static int
 qemuMonitorTestAddUnexpectedErrorResponse(qemuMonitorTestPtr test)
 {
-    if (test->json) {
+    if (test->agent || test->json) {
         return qemuMonitorTestAddReponse(test,
                                          "{ \"error\": "
                                          " { \"desc\": \"Unexpected command\", "
@@ -312,6 +314,11 @@ qemuMonitorTestFree(qemuMonitorTestPtr test)
         qemuMonitorClose(test->mon);
     }

+    if (test->agent) {
+        virObjectUnlock(test->agent);
+        qemuAgentClose(test->agent);
+    }
+
     virObjectUnref(test->vm);

     if (test->running)
@@ -387,7 +394,7 @@ qemuMonitorTestProcessCommandDefault(qemuMonitorTestPtr test,
     char *tmp;
     int ret = -1;

-    if (test->json) {
+    if (test->agent || test->json) {
         if (!(val = virJSONValueFromString(cmdstr)))
             return -1;

@@ -442,6 +449,72 @@ qemuMonitorTestAddItem(qemuMonitorTestPtr test,
 }


+static int
+qemuMonitorTestProcessGuestAgentSync(qemuMonitorTestPtr test,
+                                     qemuMonitorTestItemPtr item ATTRIBUTE_UNUSED,
+                                     const char *cmdstr)
+{
+    virJSONValuePtr val = NULL;
+    virJSONValuePtr args;
+    unsigned long long id;
+    const char *cmdname;
+    char *retmsg = NULL;
+    int ret = -1;
+
+    if (!(val = virJSONValueFromString(cmdstr)))
+        return -1;
+
+    if (!(cmdname = virJSONValueObjectGetString(val, "execute"))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       "Missing guest-sync command name");
+        goto cleanup;
+    }
+
+    if (STRNEQ(cmdname, "guest-sync")) {
+        ret = qemuMonitorTestAddUnexpectedErrorResponse(test);
+        goto cleanup;
+    }
+
+    if (!(args = virJSONValueObjectGet(val, "arguments"))) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       "Missing arguments for guest-sync");
+        goto cleanup;
+    }
+
+    if (virJSONValueObjectGetNumberUlong(args, "id", &id)) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       "Missing id for guest sync");
+        goto cleanup;
+    }
+
+    if (virAsprintf(&retmsg, "{\"return\":%llu}", id) < 0)
+        goto cleanup;
+
+
+    ret = qemuMonitorTestAddReponse(test, retmsg);
+
+cleanup:
+    virJSONValueFree(val);
+    VIR_FREE(retmsg);
+    return ret;
+}
+
+
+int
+qemuMonitorTestAddAgentSyncResponse(qemuMonitorTestPtr test)
+{
+    if (!test->agent) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       "This test is not an agent test");
+        return -1;
+    }
+
+    return qemuMonitorTestAddHandler(test,
+                                     qemuMonitorTestProcessGuestAgentSync,
+                                     NULL, NULL);
+}
+
+
 static void
 qemuMonitorTestEOFNotify(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
                          virDomainObjPtr vm ATTRIBUTE_UNUSED)
@@ -462,6 +535,24 @@ static qemuMonitorCallbacks qemuMonitorTestCallbacks = {
 };


+static void
+qemuMonitorTestAgentEOFNotify(qemuAgentPtr agent ATTRIBUTE_UNUSED,
+                              virDomainObjPtr vm ATTRIBUTE_UNUSED)
+{
+}
+
+static void
+qemuMonitorTestAgentErrorNotify(qemuAgentPtr agent ATTRIBUTE_UNUSED,
+                                virDomainObjPtr vm ATTRIBUTE_UNUSED)
+{
+}
+
+static qemuAgentCallbacks qemuMonitorTestAgentCallbacks = {
+    .eofNotify = qemuMonitorTestAgentEOFNotify,
+    .errorNotify = qemuMonitorTestAgentErrorNotify,
+};
+
+
 static qemuMonitorTestPtr
 qemuMonitorCommonTestNew(virDomainXMLOptionPtr xmlopt,
                          virDomainChrSourceDefPtr src)
@@ -594,12 +685,50 @@ qemuMonitorTestNew(bool json, virDomainXMLOptionPtr xmlopt)
     return test;

 error:
+    virDomainChrSourceDefClear(&src);
+    qemuMonitorTestFree(test);
+    return NULL;
+}
+
+qemuMonitorTestPtr
+qemuMonitorTestNewAgent(virDomainXMLOptionPtr xmlopt)
+{
+    qemuMonitorTestPtr test = NULL;
+    virDomainChrSourceDef src;
+
+    if (!(test = qemuMonitorCommonTestNew(xmlopt, &src)))
+        goto error;
+
+    if (!(test->agent = qemuAgentOpen(test->vm,
+                                      &src,
+                                      &qemuMonitorTestAgentCallbacks)))
+        goto error;
+
+    virObjectLock(test->agent);
+
+    if (qemuMonitorCommonTestInit(test) < 0)
+        goto error;
+
+    virDomainChrSourceDefClear(&src);
+
+    return test;
+
+error:
+    virDomainChrSourceDefClear(&src);
     qemuMonitorTestFree(test);
     return NULL;
 }

+
 qemuMonitorPtr
 qemuMonitorTestGetMonitor(qemuMonitorTestPtr test)
 {
     return test->mon;
 }
+
+
+qemuAgentPtr
+qemuMonitorTestGetAgent(qemuMonitorTestPtr test)
+{
+    return test->agent;
+}
diff --git a/tests/qemumonitortestutils.h b/tests/qemumonitortestutils.h
index 9df118f..4307feb 100644
--- a/tests/qemumonitortestutils.h
+++ b/tests/qemumonitortestutils.h
@@ -22,6 +22,7 @@

 # include "domain_conf.h"
 # include "qemu/qemu_monitor.h"
+# include "qemu/qemu_agent.h"

 typedef struct _qemuMonitorTest qemuMonitorTest;
 typedef qemuMonitorTest *qemuMonitorTestPtr;
@@ -31,12 +32,17 @@ qemuMonitorTestAddItem(qemuMonitorTestPtr test,
                        const char *command_name,
                        const char *response);

+int qemuMonitorTestAddAgentSyncResponse(qemuMonitorTestPtr test);
+
 qemuMonitorTestPtr qemuMonitorTestNew(bool json,
                                       virDomainXMLOptionPtr xmlopt);

+qemuMonitorTestPtr qemuMonitorTestNewAgent(virDomainXMLOptionPtr xmlopt);
+

 void qemuMonitorTestFree(qemuMonitorTestPtr test);

 qemuMonitorPtr qemuMonitorTestGetMonitor(qemuMonitorTestPtr test);
+qemuAgentPtr qemuMonitorTestGetAgent(qemuMonitorTestPtr test);

 #endif /* __VIR_QEMU_MONITOR_TEST_UTILS_H__ */
-- 
1.8.3.2




More information about the libvir-list mailing list