static int testQemuAgentFSFreeze(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); const char *mountpoints[] = {"/fs1", "/fs2", "/fs3", "/fs4", "/fs5"}; int ret = -1; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-fsfreeze-freeze-list", "{ \"return\" : 5 }") < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-fsfreeze-freeze", "{ \"return\" : 7 }") < 0) goto cleanup; if ((ret = qemuAgentFSFreeze(qemuMonitorTestGetAgent(test), mountpoints, 5)) < 0) goto cleanup; if (ret != 5) { virReportError(VIR_ERR_INTERNAL_ERROR, "expected 5 frozen filesystems, got %d", ret); goto cleanup; } if ((ret = qemuAgentFSFreeze(qemuMonitorTestGetAgent(test), NULL, 0)) < 0) goto cleanup; if (ret != 7) { virReportError(VIR_ERR_INTERNAL_ERROR, "expected 7 frozen filesystems, got %d", ret); goto cleanup; } ret = 0; cleanup: qemuMonitorTestFree(test); return ret; }
static int testQemuAgentFSThaw(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); int ret = -1; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-fsfreeze-thaw", "{ \"return\" : 5 }") < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-fsfreeze-thaw", "{ \"return\" : 7 }") < 0) goto cleanup; if ((ret = qemuAgentFSThaw(qemuMonitorTestGetAgent(test))) < 0) goto cleanup; if (ret != 5) { virReportError(VIR_ERR_INTERNAL_ERROR, "expected 5 thawed filesystems, got %d", ret); goto cleanup; } if ((ret = qemuAgentFSThaw(qemuMonitorTestGetAgent(test))) < 0) goto cleanup; if (ret != 7) { virReportError(VIR_ERR_INTERNAL_ERROR, "expected 7 thawed filesystems, got %d", ret); goto cleanup; } ret = 0; cleanup: qemuMonitorTestFree(test); return ret; }
static int testQemuAgentFSTrim(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); int ret = -1; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItemParams(test, "guest-fstrim", "{ \"return\" : {} }", "minimum", "1337", NULL) < 0) goto cleanup; if (qemuAgentFSTrim(qemuMonitorTestGetAgent(test), 1337) < 0) goto cleanup; ret = 0; cleanup: qemuMonitorTestFree(test); return ret; }
static int testQemuAgentSuspend(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); int ret = -1; size_t i; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-suspend-ram", "{ \"return\" : {} }") < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-suspend-disk", "{ \"return\" : {} }") < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-suspend-hybrid", "{ \"return\" : {} }") < 0) goto cleanup; /* try the commands - fail if ordering changes */ for (i = 0; i < VIR_NODE_SUSPEND_TARGET_LAST; i++) { if (qemuAgentSuspend(qemuMonitorTestGetAgent(test), i) < 0) goto cleanup; } ret = 0; cleanup: qemuMonitorTestFree(test); return ret; }
static int testQemuAgentArbitraryCommand(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); int ret = -1; char *reply = NULL; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "ble", testQemuAgentArbitraryCommandResponse) < 0) goto cleanup; if (qemuAgentArbitraryCommand(qemuMonitorTestGetAgent(test), "{\"execute\":\"ble\"}", &reply, VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) < 0) goto cleanup; if (STRNEQ(reply, testQemuAgentArbitraryCommandResponse)) { virReportError(VIR_ERR_INTERNAL_ERROR, "invalid processing of guest agent reply: " "got '%s' expected '%s'", reply, testQemuAgentArbitraryCommandResponse); goto cleanup; } ret = 0; cleanup: VIR_FREE(reply); qemuMonitorTestFree(test); return ret; }
static int testQemuAgentCPU(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); qemuAgentCPUInfoPtr cpuinfo = NULL; int nvcpus; int ret = -1; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-get-vcpus", testQemuAgentCPUResponse) < 0) goto cleanup; /* get cpus */ if ((nvcpus = qemuAgentGetVCPUs(qemuMonitorTestGetAgent(test), &cpuinfo)) < 0) goto cleanup; if (nvcpus != 4) { virReportError(VIR_ERR_INTERNAL_ERROR, "Expected '4' cpus, got '%d'", nvcpus); goto cleanup; } /* try to unplug one */ if (qemuAgentUpdateCPUInfo(2, cpuinfo, nvcpus) < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItemParams(test, "guest-set-vcpus", "{ \"return\" : 4 }", "vcpus", testQemuAgentCPUArguments1, NULL) < 0) goto cleanup; if ((nvcpus = qemuAgentSetVCPUs(qemuMonitorTestGetAgent(test), cpuinfo, nvcpus)) < 0) goto cleanup; if (nvcpus != 4) { virReportError(VIR_ERR_INTERNAL_ERROR, "Expected '4' cpus updated , got '%d'", nvcpus); goto cleanup; } /* try to hotplug two */ if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItemParams(test, "guest-set-vcpus", "{ \"return\" : 4 }", "vcpus", testQemuAgentCPUArguments2, NULL) < 0) goto cleanup; if (qemuAgentUpdateCPUInfo(4, cpuinfo, nvcpus) < 0) goto cleanup; if ((nvcpus = qemuAgentSetVCPUs(qemuMonitorTestGetAgent(test), cpuinfo, nvcpus)) < 0) goto cleanup; if (nvcpus != 4) { virReportError(VIR_ERR_INTERNAL_ERROR, "Expected '4' cpus updated , got '%d'", nvcpus); goto cleanup; } ret = 0; cleanup: VIR_FREE(cpuinfo); qemuMonitorTestFree(test); return ret; }
static int testQemuAgentShutdown(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); struct qemuAgentShutdownTestData priv; int ret = -1; if (!test) return -1; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; priv.event = QEMU_AGENT_EVENT_SHUTDOWN; priv.mode = "halt"; if (qemuMonitorTestAddHandler(test, qemuAgentShutdownTestMonitorHandler, &priv, NULL) < 0) goto cleanup; if (qemuAgentShutdown(qemuMonitorTestGetAgent(test), QEMU_AGENT_SHUTDOWN_HALT) < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; priv.event = QEMU_AGENT_EVENT_SHUTDOWN; priv.mode = "powerdown"; if (qemuMonitorTestAddHandler(test, qemuAgentShutdownTestMonitorHandler, &priv, NULL) < 0) goto cleanup; if (qemuAgentShutdown(qemuMonitorTestGetAgent(test), QEMU_AGENT_SHUTDOWN_POWERDOWN) < 0) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; priv.event = QEMU_AGENT_EVENT_RESET; priv.mode = "reboot"; if (qemuMonitorTestAddHandler(test, qemuAgentShutdownTestMonitorHandler, &priv, NULL) < 0) goto cleanup; if (qemuAgentShutdown(qemuMonitorTestGetAgent(test), QEMU_AGENT_SHUTDOWN_REBOOT) < 0) goto cleanup; /* check negative response, so that we can verify that the agent breaks * out from sleep */ if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-shutdown", "{\"error\":" " {\"class\":\"CommandDisabled\"," " \"desc\":\"The command guest-shutdown has " "been disabled for this instance\"," " \"data\":{\"name\":\"guest-shutdown\"}" " }" "}") < 0) goto cleanup; if (qemuAgentShutdown(qemuMonitorTestGetAgent(test), QEMU_AGENT_SHUTDOWN_REBOOT) != -1) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "agent shutdown command should have failed"); goto cleanup; } ret = 0; cleanup: qemuMonitorTestFree(test); return ret; }
static int testQemuAgentGetFSInfo(const void *data) { virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data; qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt); char *domain_filename = NULL; virDomainDefPtr def = NULL; virDomainFSInfoPtr *info = NULL; int ret = -1, ninfo = 0, i; if (!test) return -1; if (virAsprintf(&domain_filename, "%s/qemuagentdata/fsinfo.xml", abs_srcdir) < 0) goto cleanup; if (!(def = virDomainDefParseFile(domain_filename, driver.caps, xmlopt, NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto cleanup; if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-get-fsinfo", "{\"return\": [" " {\"name\": \"sda1\", \"mountpoint\": \"/\"," " \"disk\": [" " {\"bus-type\": \"ide\"," " \"bus\": 1, \"unit\": 0," " \"pci-controller\": {" " \"bus\": 0, \"slot\": 1," " \"domain\": 0, \"function\": 1}," " \"target\": 0}]," " \"type\": \"ext4\"}," " {\"name\": \"dm-1\"," " \"mountpoint\": \"/opt\"," " \"disk\": [" " {\"bus-type\": \"virtio\"," " \"bus\": 0, \"unit\": 0," " \"pci-controller\": {" " \"bus\": 0, \"slot\": 6," " \"domain\": 0, \"function\": 0}," " \"target\": 0}," " {\"bus-type\": \"virtio\"," " \"bus\": 0, \"unit\": 0," " \"pci-controller\": {" " \"bus\": 0, \"slot\": 7," " \"domain\": 0, \"function\": 0}," " \"target\": 0}]," " \"type\": \"vfat\"}," " {\"name\": \"sdb1\"," " \"mountpoint\": \"/mnt/disk\"," " \"disk\": [], \"type\": \"xfs\"}]}") < 0) goto cleanup; if ((ninfo = qemuAgentGetFSInfo(qemuMonitorTestGetAgent(test), &info, def)) < 0) goto cleanup; if (ninfo != 3) { virReportError(VIR_ERR_INTERNAL_ERROR, "expected 3 filesystems information, got %d", ninfo); ret = -1; goto cleanup; } if (STRNEQ(info[2]->name, "sda1") || STRNEQ(info[2]->mountpoint, "/") || STRNEQ(info[2]->fstype, "ext4") || info[2]->ndevAlias != 1 || !info[2]->devAlias || !info[2]->devAlias[0] || STRNEQ(info[2]->devAlias[0], "hdc")) { virReportError(VIR_ERR_INTERNAL_ERROR, "unexpected filesystems information returned for sda1 (%s,%s)", info[2]->name, info[2]->devAlias ? info[2]->devAlias[0] : "null"); ret = -1; goto cleanup; } if (STRNEQ(info[1]->name, "dm-1") || STRNEQ(info[1]->mountpoint, "/opt") || STRNEQ(info[1]->fstype, "vfat") || info[1]->ndevAlias != 2 || !info[1]->devAlias || !info[1]->devAlias[0] || !info[1]->devAlias[1] || STRNEQ(info[1]->devAlias[0], "vda") || STRNEQ(info[1]->devAlias[1], "vdb")) { virReportError(VIR_ERR_INTERNAL_ERROR, "unexpected filesystems information returned for dm-1 (%s,%s)", info[0]->name, info[0]->devAlias ? info[0]->devAlias[0] : "null"); ret = -1; goto cleanup; } if (STRNEQ(info[0]->name, "sdb1") || STRNEQ(info[0]->mountpoint, "/mnt/disk") || STRNEQ(info[0]->fstype, "xfs") || info[0]->ndevAlias != 0 || info[0]->devAlias) { virReportError(VIR_ERR_INTERNAL_ERROR, "unexpected filesystems information returned for sdb1 (%s,%s)", info[0]->name, info[0]->devAlias ? info[0]->devAlias[0] : "null"); ret = -1; goto cleanup; } if (qemuMonitorTestAddAgentSyncResponse(test) < 0) goto cleanup; if (qemuMonitorTestAddItem(test, "guest-get-fsinfo", "{\"error\":" " {\"class\":\"CommandDisabled\"," " \"desc\":\"The command guest-get-fsinfo " "has been disabled for " "this instance\"," " \"data\":{\"name\":\"guest-get-fsinfo\"}" " }" "}") < 0) goto cleanup; if (qemuAgentGetFSInfo(qemuMonitorTestGetAgent(test), &info, def) != -1) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "agent get-fsinfo command should have failed"); goto cleanup; } ret = 0; cleanup: for (i = 0; i < ninfo; i++) virDomainFSInfoFree(info[i]); VIR_FREE(info); VIR_FREE(domain_filename); virDomainDefFree(def); qemuMonitorTestFree(test); return ret; }