On Tue, Sep 25, 2012 at 19:00:04 +0100, Daniel P. Berrange wrote: > From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> > > Add a new qemuMonitorGetCPUDefinitions() method to support invocation > of the 'query-cpu-definitions' JSON monitor command. No HMP equivalent > is required, since this will only be present for QEMU >= 1.2 > > Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> > --- > src/qemu/qemu_monitor.c | 21 +++++++++++++ > src/qemu/qemu_monitor.h | 4 +++ > src/qemu/qemu_monitor_json.c | 75 ++++++++++++++++++++++++++++++++++++++++++++ > src/qemu/qemu_monitor_json.h | 4 +++ > tests/qemumonitorjsontest.c | 63 +++++++++++++++++++++++++++++++++++++ > 5 files changed, 167 insertions(+) > > diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c > index 581fe41..45bb32e 100644 > --- a/src/qemu/qemu_monitor.c > +++ b/src/qemu/qemu_monitor.c > @@ -3051,3 +3051,24 @@ void qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine) > VIR_FREE(machine->alias); > VIR_FREE(machine); > } > + > +int qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon, > + char ***cpus) > +{ > + VIR_DEBUG("mon=%p cpus=%p", > + mon, cpus); > + > + if (!mon) { > + virReportError(VIR_ERR_INVALID_ARG, "%s", > + _("monitor must not be NULL")); > + return -1; > + } > + > + if (!mon->json) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("JSON monitor is required")); > + return -1; > + } > + > + return qemuMonitorJSONGetCPUDefinitions(mon, cpus); > +} Hmm, this starts to be pretty boring. I guess we should come up with a macro or something that would save us from copying the same code over and over when adding new monitor commands. Anyway, this does not need to be solved by this capabilities series. ... > diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c > index ad095b1..1346441 100644 > --- a/tests/qemumonitorjsontest.c > +++ b/tests/qemumonitorjsontest.c > @@ -290,6 +290,68 @@ testQemuMonitorJSONGetMachines(const void *data) > CHECK(1, "pc-1.1", false, null); > CHECK(2, "pc-1.2", true, "pc"); > > +#undef CHECK Since you added this #undef CHECK twice in this patch, one of them should rather go into the previous patch. > + ret = 0; > + > +cleanup: > + qemuMonitorTestFree(test); > + return ret; > +} > + > + > +static int > +testQemuMonitorJSONGetCPUDefinitions(const void *data) > +{ > + virCapsPtr caps = (virCapsPtr)data; > + qemuMonitorTestPtr test = qemuMonitorTestNew(true, caps); > + int ret = -1; > + char **cpus = NULL; > + int ncpus; > + > + if (!test) > + return -1; > + > + if (qemuMonitorTestAddItem(test, "query-cpu-definitions", > + "{ " > + " \"return\": [ " > + " { " > + " \"name\": \"qemu64\" " > + " }, " > + " { " > + " \"name\": \"Opteron_G4\" " > + " }, " > + " { " > + " \"name\": \"Westmere\" " > + " } " > + " ]" > + "}") < 0) > + goto cleanup; > + > + if ((ncpus = qemuMonitorGetCPUDefinitions(qemuMonitorTestGetMonitor(test), > + &cpus)) < 0) > + goto cleanup; > + > + if (ncpus != 3) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + "ncpus %d is not 3", ncpus); > + goto cleanup; > + } > + > +#define CHECK(i, wantname) \ > + do { \ > + if (STRNEQ(cpus[i], (wantname))) { \ > + virReportError(VIR_ERR_INTERNAL_ERROR, \ > + "name %s is not %s", \ > + cpus[i], (wantname)); \ > + goto cleanup; \ > + } \ > + } while (0) > + > + CHECK(0, "qemu64"); > + CHECK(1, "Opteron_G4"); > + CHECK(2, "Westmere"); > + > +#undef CHECK > ret = 0; > > cleanup: > @@ -319,6 +381,7 @@ mymain(void) > DO_TEST(GetStatus); > DO_TEST(GetVersion); > DO_TEST(GetMachines); > + DO_TEST(GetCPUDefinitions); > > virCapabilitiesFree(caps); > ACK Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list