This patch adds extraction of the <cpu> element from capabilities and domain definition XML documents to improve user experience. https://bugzilla.redhat.com/show_bug.cgi?id=731151 --- tools/virsh.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 46 insertions(+), 8 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 3c6e65a..ddb61af 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -11846,9 +11846,15 @@ static bool cmdCPUCompare(vshControl *ctl, const vshCmd *cmd) { const char *from = NULL; - bool ret = true; + bool ret = false; char *buffer; int result; + const char *snippet; + + xmlDocPtr xml = NULL; + xmlXPathContextPtr ctxt = NULL; + xmlBufferPtr xml_buf = NULL; + xmlNodePtr node; if (!vshConnectionUsability(ctl, ctl->conn)) return false; @@ -11856,37 +11862,69 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd) if (vshCommandOptString(cmd, "file", &from) <= 0) return false; - if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) + if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) { + vshError(ctl, _("Failed to read file '%s' to compare."), + from); return false; + } - result = virConnectCompareCPU(ctl->conn, buffer, 0); - VIR_FREE(buffer); + /* try to extract the CPU element from as it would appear in a domain XML*/ + if (!(xml = virXMLParseStringCtxt(buffer, from, &ctxt))) + goto cleanup; + + if ((node = virXPathNode("/cpu|" + "/domain/cpu|" + "/capabilities/host/cpu", ctxt))) { + if (!(xml_buf = xmlBufferCreate())) { + vshError(ctl, _("Can't create XML buffer to extract CPU element.")); + goto cleanup; + } + + if (xmlNodeDump(xml_buf, xml, node, 0, 0) < 0) { + vshError(ctl, _("Failed to extract CPU element snippet from domain XML.")); + goto cleanup; + } + + snippet = (const char *) xmlBufferContent(xml_buf); + } else { + vshError(ctl, _("File '%s' does not contain a <cpu> element or is not " + "a valid domain or capabilities XML"), from); + goto cleanup; + } + + result = virConnectCompareCPU(ctl->conn, snippet, 0); switch (result) { case VIR_CPU_COMPARE_INCOMPATIBLE: vshPrint(ctl, _("CPU described in %s is incompatible with host CPU\n"), from); - ret = false; + goto cleanup; break; case VIR_CPU_COMPARE_IDENTICAL: vshPrint(ctl, _("CPU described in %s is identical to host CPU\n"), from); - ret = true; break; case VIR_CPU_COMPARE_SUPERSET: vshPrint(ctl, _("Host CPU is a superset of CPU described in %s\n"), from); - ret = true; break; case VIR_CPU_COMPARE_ERROR: default: vshError(ctl, _("Failed to compare host CPU with %s"), from); - ret = false; + goto cleanup; } + ret = true; + +cleanup: + VIR_FREE(buffer); + xmlBufferFree(xml_buf); + xmlXPathFreeContext(ctxt); + xmlFreeDoc(xml); + return ret; } -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list