mirror of https://gitee.com/openkylin/libvirt.git
virsh: Move cpu-{baseline,compare} commands
Similarly to cpu-models these two commands do not operate on a domain and should be listed in the "Host and Hypervisor" commands section. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> Reviewed-by: Collin Walling <walling@linux.ibm.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
b29fa23ea9
commit
361989bd18
|
@ -7679,217 +7679,6 @@ cmdIOThreadDel(vshControl *ctl, const vshCmd *cmd)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* "cpu-compare" command
|
|
||||||
*/
|
|
||||||
static const vshCmdInfo info_cpu_compare[] = {
|
|
||||||
{.name = "help",
|
|
||||||
.data = N_("compare host CPU with a CPU described by an XML file")
|
|
||||||
},
|
|
||||||
{.name = "desc",
|
|
||||||
.data = N_("compare CPU with host CPU")
|
|
||||||
},
|
|
||||||
{.name = NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const vshCmdOptDef opts_cpu_compare[] = {
|
|
||||||
VIRSH_COMMON_OPT_FILE(N_("file containing an XML CPU description")),
|
|
||||||
{.name = "error",
|
|
||||||
.type = VSH_OT_BOOL,
|
|
||||||
.help = N_("report error if CPUs are incompatible")
|
|
||||||
},
|
|
||||||
{.name = NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
{
|
|
||||||
const char *from = NULL;
|
|
||||||
bool ret = false;
|
|
||||||
char *buffer;
|
|
||||||
int result;
|
|
||||||
char *snippet = NULL;
|
|
||||||
unsigned int flags = 0;
|
|
||||||
xmlDocPtr xml = NULL;
|
|
||||||
xmlXPathContextPtr ctxt = NULL;
|
|
||||||
xmlNodePtr node;
|
|
||||||
virshControlPtr priv = ctl->privData;
|
|
||||||
|
|
||||||
if (vshCommandOptBool(cmd, "error"))
|
|
||||||
flags |= VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE;
|
|
||||||
|
|
||||||
if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* 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 (!(snippet = virXMLNodeToString(xml, node))) {
|
|
||||||
vshSaveLibvirtError();
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
} 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(priv->conn, snippet, flags);
|
|
||||||
|
|
||||||
switch (result) {
|
|
||||||
case VIR_CPU_COMPARE_INCOMPATIBLE:
|
|
||||||
vshPrint(ctl, _("CPU described in %s is incompatible with host CPU\n"),
|
|
||||||
from);
|
|
||||||
goto cleanup;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_CPU_COMPARE_IDENTICAL:
|
|
||||||
vshPrint(ctl, _("CPU described in %s is identical to host CPU\n"),
|
|
||||||
from);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_CPU_COMPARE_SUPERSET:
|
|
||||||
vshPrint(ctl, _("Host CPU is a superset of CPU described in %s\n"),
|
|
||||||
from);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_CPU_COMPARE_ERROR:
|
|
||||||
default:
|
|
||||||
vshError(ctl, _("Failed to compare host CPU with %s"), from);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = true;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
VIR_FREE(buffer);
|
|
||||||
VIR_FREE(snippet);
|
|
||||||
xmlXPathFreeContext(ctxt);
|
|
||||||
xmlFreeDoc(xml);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* "cpu-baseline" command
|
|
||||||
*/
|
|
||||||
static const vshCmdInfo info_cpu_baseline[] = {
|
|
||||||
{.name = "help",
|
|
||||||
.data = N_("compute baseline CPU")
|
|
||||||
},
|
|
||||||
{.name = "desc",
|
|
||||||
.data = N_("Compute baseline CPU for a set of given CPUs.")
|
|
||||||
},
|
|
||||||
{.name = NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const vshCmdOptDef opts_cpu_baseline[] = {
|
|
||||||
VIRSH_COMMON_OPT_FILE(N_("file containing XML CPU descriptions")),
|
|
||||||
{.name = "features",
|
|
||||||
.type = VSH_OT_BOOL,
|
|
||||||
.help = N_("Show features that are part of the CPU model type")
|
|
||||||
},
|
|
||||||
{.name = "migratable",
|
|
||||||
.type = VSH_OT_BOOL,
|
|
||||||
.help = N_("Do not include features that block migration")
|
|
||||||
},
|
|
||||||
{.name = NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool
|
|
||||||
cmdCPUBaseline(vshControl *ctl, const vshCmd *cmd)
|
|
||||||
{
|
|
||||||
const char *from = NULL;
|
|
||||||
bool ret = false;
|
|
||||||
char *buffer;
|
|
||||||
char *result = NULL;
|
|
||||||
char **list = NULL;
|
|
||||||
unsigned int flags = 0;
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
xmlDocPtr xml = NULL;
|
|
||||||
xmlNodePtr *node_list = NULL;
|
|
||||||
xmlXPathContextPtr ctxt = NULL;
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
size_t i;
|
|
||||||
virshControlPtr priv = ctl->privData;
|
|
||||||
|
|
||||||
if (vshCommandOptBool(cmd, "features"))
|
|
||||||
flags |= VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES;
|
|
||||||
if (vshCommandOptBool(cmd, "migratable"))
|
|
||||||
flags |= VIR_CONNECT_BASELINE_CPU_MIGRATABLE;
|
|
||||||
|
|
||||||
if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* add a separate container around the xml */
|
|
||||||
virBufferStrcat(&buf, "<container>", buffer, "</container>", NULL);
|
|
||||||
if (virBufferError(&buf))
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
VIR_FREE(buffer);
|
|
||||||
buffer = virBufferContentAndReset(&buf);
|
|
||||||
|
|
||||||
|
|
||||||
if (!(xml = virXMLParseStringCtxt(buffer, from, &ctxt)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((count = virXPathNodeSet("//cpu[not(ancestor::cpus)]",
|
|
||||||
ctxt, &node_list)) == -1)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (count == 0) {
|
|
||||||
vshError(ctl, _("No host CPU specified in '%s'"), from);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
list = vshCalloc(ctl, count, sizeof(const char *));
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
if (!(list[i] = virXMLNodeToString(xml, node_list[i]))) {
|
|
||||||
vshSaveLibvirtError();
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = virConnectBaselineCPU(priv->conn,
|
|
||||||
(const char **)list, count, flags);
|
|
||||||
|
|
||||||
if (result) {
|
|
||||||
vshPrint(ctl, "%s", result);
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
xmlXPathFreeContext(ctxt);
|
|
||||||
xmlFreeDoc(xml);
|
|
||||||
VIR_FREE(result);
|
|
||||||
if (list != NULL && count > 0) {
|
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
VIR_FREE(list[i]);
|
|
||||||
}
|
|
||||||
VIR_FREE(list);
|
|
||||||
VIR_FREE(buffer);
|
|
||||||
VIR_FREE(node_list);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
no_memory:
|
|
||||||
vshError(ctl, "%s", _("Out of memory"));
|
|
||||||
ret = false;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "cpu-stats" command
|
* "cpu-stats" command
|
||||||
*/
|
*/
|
||||||
|
@ -14012,18 +13801,6 @@ const vshCmdDef domManagementCmds[] = {
|
||||||
.flags = 0
|
.flags = 0
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
{.name = "cpu-baseline",
|
|
||||||
.handler = cmdCPUBaseline,
|
|
||||||
.opts = opts_cpu_baseline,
|
|
||||||
.info = info_cpu_baseline,
|
|
||||||
.flags = 0
|
|
||||||
},
|
|
||||||
{.name = "cpu-compare",
|
|
||||||
.handler = cmdCPUCompare,
|
|
||||||
.opts = opts_cpu_compare,
|
|
||||||
.info = info_cpu_compare,
|
|
||||||
.flags = 0
|
|
||||||
},
|
|
||||||
{.name = "cpu-stats",
|
{.name = "cpu-stats",
|
||||||
.handler = cmdCPUStats,
|
.handler = cmdCPUStats,
|
||||||
.opts = opts_cpu_stats,
|
.opts = opts_cpu_stats,
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "virxml.h"
|
#include "virxml.h"
|
||||||
#include "virtypedparam.h"
|
#include "virtypedparam.h"
|
||||||
#include "virstring.h"
|
#include "virstring.h"
|
||||||
|
#include "virfile.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "capabilities" command
|
* "capabilities" command
|
||||||
|
@ -1110,6 +1111,217 @@ cmdURI(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "cpu-compare" command
|
||||||
|
*/
|
||||||
|
static const vshCmdInfo info_cpu_compare[] = {
|
||||||
|
{.name = "help",
|
||||||
|
.data = N_("compare host CPU with a CPU described by an XML file")
|
||||||
|
},
|
||||||
|
{.name = "desc",
|
||||||
|
.data = N_("compare CPU with host CPU")
|
||||||
|
},
|
||||||
|
{.name = NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const vshCmdOptDef opts_cpu_compare[] = {
|
||||||
|
VIRSH_COMMON_OPT_FILE(N_("file containing an XML CPU description")),
|
||||||
|
{.name = "error",
|
||||||
|
.type = VSH_OT_BOOL,
|
||||||
|
.help = N_("report error if CPUs are incompatible")
|
||||||
|
},
|
||||||
|
{.name = NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool
|
||||||
|
cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
|
||||||
|
{
|
||||||
|
const char *from = NULL;
|
||||||
|
bool ret = false;
|
||||||
|
char *buffer;
|
||||||
|
int result;
|
||||||
|
char *snippet = NULL;
|
||||||
|
unsigned int flags = 0;
|
||||||
|
xmlDocPtr xml = NULL;
|
||||||
|
xmlXPathContextPtr ctxt = NULL;
|
||||||
|
xmlNodePtr node;
|
||||||
|
virshControlPtr priv = ctl->privData;
|
||||||
|
|
||||||
|
if (vshCommandOptBool(cmd, "error"))
|
||||||
|
flags |= VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE;
|
||||||
|
|
||||||
|
if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* 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 (!(snippet = virXMLNodeToString(xml, node))) {
|
||||||
|
vshSaveLibvirtError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
} 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(priv->conn, snippet, flags);
|
||||||
|
|
||||||
|
switch (result) {
|
||||||
|
case VIR_CPU_COMPARE_INCOMPATIBLE:
|
||||||
|
vshPrint(ctl, _("CPU described in %s is incompatible with host CPU\n"),
|
||||||
|
from);
|
||||||
|
goto cleanup;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_CPU_COMPARE_IDENTICAL:
|
||||||
|
vshPrint(ctl, _("CPU described in %s is identical to host CPU\n"),
|
||||||
|
from);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_CPU_COMPARE_SUPERSET:
|
||||||
|
vshPrint(ctl, _("Host CPU is a superset of CPU described in %s\n"),
|
||||||
|
from);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_CPU_COMPARE_ERROR:
|
||||||
|
default:
|
||||||
|
vshError(ctl, _("Failed to compare host CPU with %s"), from);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = true;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(buffer);
|
||||||
|
VIR_FREE(snippet);
|
||||||
|
xmlXPathFreeContext(ctxt);
|
||||||
|
xmlFreeDoc(xml);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "cpu-baseline" command
|
||||||
|
*/
|
||||||
|
static const vshCmdInfo info_cpu_baseline[] = {
|
||||||
|
{.name = "help",
|
||||||
|
.data = N_("compute baseline CPU")
|
||||||
|
},
|
||||||
|
{.name = "desc",
|
||||||
|
.data = N_("Compute baseline CPU for a set of given CPUs.")
|
||||||
|
},
|
||||||
|
{.name = NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const vshCmdOptDef opts_cpu_baseline[] = {
|
||||||
|
VIRSH_COMMON_OPT_FILE(N_("file containing XML CPU descriptions")),
|
||||||
|
{.name = "features",
|
||||||
|
.type = VSH_OT_BOOL,
|
||||||
|
.help = N_("Show features that are part of the CPU model type")
|
||||||
|
},
|
||||||
|
{.name = "migratable",
|
||||||
|
.type = VSH_OT_BOOL,
|
||||||
|
.help = N_("Do not include features that block migration")
|
||||||
|
},
|
||||||
|
{.name = NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool
|
||||||
|
cmdCPUBaseline(vshControl *ctl, const vshCmd *cmd)
|
||||||
|
{
|
||||||
|
const char *from = NULL;
|
||||||
|
bool ret = false;
|
||||||
|
char *buffer;
|
||||||
|
char *result = NULL;
|
||||||
|
char **list = NULL;
|
||||||
|
unsigned int flags = 0;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
xmlDocPtr xml = NULL;
|
||||||
|
xmlNodePtr *node_list = NULL;
|
||||||
|
xmlXPathContextPtr ctxt = NULL;
|
||||||
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
size_t i;
|
||||||
|
virshControlPtr priv = ctl->privData;
|
||||||
|
|
||||||
|
if (vshCommandOptBool(cmd, "features"))
|
||||||
|
flags |= VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES;
|
||||||
|
if (vshCommandOptBool(cmd, "migratable"))
|
||||||
|
flags |= VIR_CONNECT_BASELINE_CPU_MIGRATABLE;
|
||||||
|
|
||||||
|
if (vshCommandOptStringReq(ctl, cmd, "file", &from) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (virFileReadAll(from, VSH_MAX_XML_FILE, &buffer) < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* add a separate container around the xml */
|
||||||
|
virBufferStrcat(&buf, "<container>", buffer, "</container>", NULL);
|
||||||
|
if (virBufferError(&buf))
|
||||||
|
goto no_memory;
|
||||||
|
|
||||||
|
VIR_FREE(buffer);
|
||||||
|
buffer = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
|
|
||||||
|
if (!(xml = virXMLParseStringCtxt(buffer, from, &ctxt)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((count = virXPathNodeSet("//cpu[not(ancestor::cpus)]",
|
||||||
|
ctxt, &node_list)) == -1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (count == 0) {
|
||||||
|
vshError(ctl, _("No host CPU specified in '%s'"), from);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
list = vshCalloc(ctl, count, sizeof(const char *));
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
if (!(list[i] = virXMLNodeToString(xml, node_list[i]))) {
|
||||||
|
vshSaveLibvirtError();
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = virConnectBaselineCPU(priv->conn,
|
||||||
|
(const char **)list, count, flags);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
vshPrint(ctl, "%s", result);
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
xmlXPathFreeContext(ctxt);
|
||||||
|
xmlFreeDoc(xml);
|
||||||
|
VIR_FREE(result);
|
||||||
|
if (list != NULL && count > 0) {
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
VIR_FREE(list[i]);
|
||||||
|
}
|
||||||
|
VIR_FREE(list);
|
||||||
|
VIR_FREE(buffer);
|
||||||
|
VIR_FREE(node_list);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
no_memory:
|
||||||
|
vshError(ctl, "%s", _("Out of memory"));
|
||||||
|
ret = false;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "cpu-models" command
|
* "cpu-models" command
|
||||||
*/
|
*/
|
||||||
|
@ -1393,6 +1605,18 @@ const vshCmdDef hostAndHypervisorCmds[] = {
|
||||||
.info = info_capabilities,
|
.info = info_capabilities,
|
||||||
.flags = 0
|
.flags = 0
|
||||||
},
|
},
|
||||||
|
{.name = "cpu-baseline",
|
||||||
|
.handler = cmdCPUBaseline,
|
||||||
|
.opts = opts_cpu_baseline,
|
||||||
|
.info = info_cpu_baseline,
|
||||||
|
.flags = 0
|
||||||
|
},
|
||||||
|
{.name = "cpu-compare",
|
||||||
|
.handler = cmdCPUCompare,
|
||||||
|
.opts = opts_cpu_compare,
|
||||||
|
.info = info_cpu_compare,
|
||||||
|
.flags = 0
|
||||||
|
},
|
||||||
{.name = "cpu-models",
|
{.name = "cpu-models",
|
||||||
.handler = cmdCPUModelNames,
|
.handler = cmdCPUModelNames,
|
||||||
.opts = opts_cpu_models,
|
.opts = opts_cpu_models,
|
||||||
|
|
Loading…
Reference in New Issue