Replace the char **result output parameter with a virCPUCompareResult return value in qemuMonitorJSONGetCPUModelComparison() and its public wrapper qemuMonitorGetCPUModelComparison(). Move the result string to enum mapping (identical/superset/subset/incompatible) into the monitor layer and remove it from qemuConnectCPUModelComparison() in qemu_driver.c. Unknown result strings are reported as errors. The existing unit test is updated to use the new return value and extended with cases for all four result strings (identical, superset, subset, incompatible). Signed-off-by: Rorie Reyes <rreyes@linux.ibm.com> --- src/qemu/qemu_driver.c | 16 ++++----- src/qemu/qemu_monitor.c | 9 +++-- src/qemu/qemu_monitor.h | 5 ++- src/qemu/qemu_monitor_json.c | 34 +++++++++++------- src/qemu/qemu_monitor_json.h | 5 ++- tests/qemumonitorjsontest.c | 67 +++++++++++++++++++++++++++++------- 6 files changed, 90 insertions(+), 46 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5922065897..2500b6fb50 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12128,7 +12128,7 @@ qemuConnectCPUModelComparison(virQEMUCaps *qemuCaps, bool failIncompatible) { g_autoptr(qemuProcessQMP) proc = NULL; - g_autofree char *result = NULL; + virCPUCompareResult result; if (!(proc = qemuProcessQMPNew(virQEMUCapsGetBinary(qemuCaps), libDir, runUid, runGid, false))) @@ -12137,21 +12137,17 @@ qemuConnectCPUModelComparison(virQEMUCaps *qemuCaps, if (qemuProcessQMPStart(proc) < 0) return VIR_CPU_COMPARE_ERROR; - if (qemuMonitorGetCPUModelComparison(proc->mon, cpu_a, cpu_b, &result) < 0) - return VIR_CPU_COMPARE_ERROR; - - if (STREQ(result, "identical")) - return VIR_CPU_COMPARE_IDENTICAL; + result = qemuMonitorGetCPUModelComparison(proc->mon, cpu_a, cpu_b); - if (STREQ(result, "superset")) - return VIR_CPU_COMPARE_SUPERSET; + if (result == VIR_CPU_COMPARE_ERROR) + return VIR_CPU_COMPARE_ERROR; - if (failIncompatible) { + if (failIncompatible && result == VIR_CPU_COMPARE_INCOMPATIBLE) { virReportError(VIR_ERR_CPU_INCOMPATIBLE, NULL); return VIR_CPU_COMPARE_ERROR; } - return VIR_CPU_COMPARE_INCOMPATIBLE; + return result; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 7d1b9a0bfd..265890922f 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3326,17 +3326,16 @@ qemuMonitorGetCPUModelBaseline(qemuMonitor *mon, } -int +virCPUCompareResult qemuMonitorGetCPUModelComparison(qemuMonitor *mon, virCPUDef *cpu_a, - virCPUDef *cpu_b, - char **result) + virCPUDef *cpu_b) { VIR_DEBUG("cpu_a=%p cpu_b=%p", cpu_a, cpu_b); - QEMU_CHECK_MONITOR(mon); + QEMU_CHECK_MONITOR_FULL(mon, return VIR_CPU_COMPARE_ERROR); - return qemuMonitorJSONGetCPUModelComparison(mon, cpu_a, cpu_b, result); + return qemuMonitorJSONGetCPUModelComparison(mon, cpu_a, cpu_b); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index f711c001fb..c94cfc2b35 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1483,11 +1483,10 @@ qemuMonitorGetCPUModelBaseline(qemuMonitor *mon, virCPUDef *cpu_b, qemuMonitorCPUModelInfo **baseline); -int +virCPUCompareResult qemuMonitorGetCPUModelComparison(qemuMonitor *mon, virCPUDef *cpu_a, - virCPUDef *cpu_b, - char **result); + virCPUDef *cpu_b); qemuMonitorCPUModelInfo * qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 29c42f7dd5..a8932af43c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5686,45 +5686,55 @@ qemuMonitorJSONGetCPUModelBaseline(qemuMonitor *mon, } -int +virCPUCompareResult qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon, virCPUDef *cpu_a, - virCPUDef *cpu_b, - char **result) + virCPUDef *cpu_b) { g_autoptr(virJSONValue) model_a = NULL; g_autoptr(virJSONValue) model_b = NULL; g_autoptr(virJSONValue) cmd = NULL; g_autoptr(virJSONValue) reply = NULL; - const char *data_result; + const char *result; virJSONValue *data; if (!(model_a = qemuMonitorJSONMakeCPUModel(cpu_a, true, false)) || !(model_b = qemuMonitorJSONMakeCPUModel(cpu_b, true, false))) - return -1; + return VIR_CPU_COMPARE_ERROR; if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-model-comparison", "a:modela", &model_a, "a:modelb", &model_b, NULL))) - return -1; + return VIR_CPU_COMPARE_ERROR; if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) - return -1; + return VIR_CPU_COMPARE_ERROR; if (qemuMonitorJSONCheckError(cmd, reply) < 0) - return -1; + return VIR_CPU_COMPARE_ERROR; data = virJSONValueObjectGetObject(reply, "return"); - if (!(data_result = virJSONValueObjectGetString(data, "result"))) { + if (!(result = virJSONValueObjectGetString(data, "result"))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("query-cpu-model-comparison reply data was missing 'result'")); - return -1; + return VIR_CPU_COMPARE_ERROR; } - *result = g_strdup(data_result); - return 0; + if (STREQ(result, "identical")) + return VIR_CPU_COMPARE_IDENTICAL; + + if (STREQ(result, "superset")) + return VIR_CPU_COMPARE_SUPERSET; + + if (STREQ(result, "subset") || STREQ(result, "incompatible")) + return VIR_CPU_COMPARE_INCOMPATIBLE; + + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown query-cpu-model-comparison result: '%1$s'"), + result); + return VIR_CPU_COMPARE_ERROR; } diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 63eded7ecb..e5d3d5d99e 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -439,11 +439,10 @@ qemuMonitorJSONGetCPUModelBaseline(qemuMonitor *mon, qemuMonitorCPUModelInfo **baseline) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); -int +virCPUCompareResult qemuMonitorJSONGetCPUModelComparison(qemuMonitor *mon, virCPUDef *cpu_a, - virCPUDef *cpu_b, - char **result) + virCPUDef *cpu_b) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); GHashTable * diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index a38d63c22c..b00d4512d1 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2647,26 +2647,67 @@ testQemuMonitorJSONqemuMonitorJSONGetCPUModelComparison(const void *opaque) g_autoptr(qemuMonitorTest) test = NULL; g_autoptr(virCPUDef) cpu_a = virCPUDefNew(); g_autoptr(virCPUDef) cpu_b = virCPUDefNew(); - g_autofree char *result = NULL; + + cpu_a->model = g_strdup("cpu_a"); + cpu_b->model = g_strdup("cpu_b"); if (!(test = qemuMonitorTestNewSchema(data->xmlopt, data->schema))) return -1; - if (qemuMonitorTestAddItem(test, "query-cpu-model-comparison", - "{\"return\":{\"result\":\"test\"}}") < 0) - return -1; + /* identical */ + { + if (qemuMonitorTestAddItem(test, "query-cpu-model-comparison", + "{\"return\":{\"result\":\"identical\"}}") < 0) + return -1; - cpu_a->model = g_strdup("cpu_a"); - cpu_b->model = g_strdup("cpu_b"); + if (qemuMonitorJSONGetCPUModelComparison(qemuMonitorTestGetMonitor(test), + cpu_a, cpu_b) != VIR_CPU_COMPARE_IDENTICAL) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "unexpected result for 'identical'"); + return -1; + } + } - if (qemuMonitorJSONGetCPUModelComparison(qemuMonitorTestGetMonitor(test), - cpu_a, cpu_b, &result) < 0) - return -1; + /* superset */ + { + if (qemuMonitorTestAddItem(test, "query-cpu-model-comparison", + "{\"return\":{\"result\":\"superset\"}}") < 0) + return -1; - if (!result || STRNEQ(result, "test")) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - "Compare result not set"); - return -1; + if (qemuMonitorJSONGetCPUModelComparison(qemuMonitorTestGetMonitor(test), + cpu_a, cpu_b) != VIR_CPU_COMPARE_SUPERSET) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "unexpected result for 'superset'"); + return -1; + } + } + + /* subset */ + { + if (qemuMonitorTestAddItem(test, "query-cpu-model-comparison", + "{\"return\":{\"result\":\"subset\"}}") < 0) + return -1; + + if (qemuMonitorJSONGetCPUModelComparison(qemuMonitorTestGetMonitor(test), + cpu_a, cpu_b) != VIR_CPU_COMPARE_INCOMPATIBLE) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "unexpected result for 'subset'"); + return -1; + } + } + + /* incompatible */ + { + if (qemuMonitorTestAddItem(test, "query-cpu-model-comparison", + "{\"return\":{\"result\":\"incompatible\"}}") < 0) + return -1; + + if (qemuMonitorJSONGetCPUModelComparison(qemuMonitorTestGetMonitor(test), + cpu_a, cpu_b) != VIR_CPU_COMPARE_INCOMPATIBLE) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "unexpected result for 'incompatible'"); + return -1; + } } return 0; -- 2.48.1