From 9ff3ad90582cd4eb3a8e45c942bacda2ede9032a Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 15 Oct 2020 14:39:16 +0200 Subject: [PATCH] qemuProcessCreatePretendCmd: Split up preparation and command building Host preparation steps which are deliberately skipped when pretend-creating a commandline are normally executed after VM object preparation. In the test code we are faking some of the host preparation steps, but we were doing that prior to the call to qemuProcessPrepareDomain embedded in qemuProcessCreatePretendCmd. By splitting up qemuProcessCreatePretendCmd into two functions we can ensure that the ordering of the prepare steps stays consistent. Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 9 ++++++--- src/qemu/qemu_process.c | 42 +++++++++++++++++++++++++--------------- src/qemu/qemu_process.h | 19 +++++++++++------- tests/qemuxml2argvtest.c | 11 +++++++---- 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 825bdd9119..f07a27d525 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6451,9 +6451,12 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, vm->def->nets[i] = newNet; } - if (!(cmd = qemuProcessCreatePretendCmd(driver, vm, NULL, - qemuCheckFips(), true, false, - VIR_QEMU_PROCESS_START_COLD))) + if (qemuProcessCreatePretendCmdPrepare(driver, vm, NULL, true, + VIR_QEMU_PROCESS_START_COLD) < 0) + goto cleanup; + + if (!(cmd = qemuProcessCreatePretendCmdBuild(driver, vm, NULL, + qemuCheckFips(), true, false))) goto cleanup; ret = virCommandToString(cmd, false); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 6422881a33..1f504011cb 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7290,35 +7290,45 @@ qemuProcessStart(virConnectPtr conn, } -virCommandPtr -qemuProcessCreatePretendCmd(virQEMUDriverPtr driver, - virDomainObjPtr vm, - const char *migrateURI, - bool enableFips, - bool standalone, - bool jsonPropsValidation, - unsigned int flags) +int +qemuProcessCreatePretendCmdPrepare(virQEMUDriverPtr driver, + virDomainObjPtr vm, + const char *migrateURI, + bool standalone, + unsigned int flags) { - unsigned int buildflags = 0; - virCheckFlags(VIR_QEMU_PROCESS_START_COLD | VIR_QEMU_PROCESS_START_PAUSED | - VIR_QEMU_PROCESS_START_AUTODESTROY, NULL); + VIR_QEMU_PROCESS_START_AUTODESTROY, -1); flags |= VIR_QEMU_PROCESS_START_PRETEND; flags |= VIR_QEMU_PROCESS_START_NEW; if (standalone) flags |= VIR_QEMU_PROCESS_START_STANDALONE; - if (jsonPropsValidation) - buildflags = QEMU_BUILD_COMMANDLINE_VALIDATE_KEEP_JSON; - if (qemuProcessInit(driver, vm, NULL, QEMU_ASYNC_JOB_NONE, !!migrateURI, flags) < 0) - return NULL; + return -1; if (qemuProcessPrepareDomain(driver, vm, flags) < 0) - return NULL; + return -1; + + return 0; +} + + +virCommandPtr +qemuProcessCreatePretendCmdBuild(virQEMUDriverPtr driver, + virDomainObjPtr vm, + const char *migrateURI, + bool enableFips, + bool standalone, + bool jsonPropsValidation) +{ + unsigned int buildflags = 0; + + if (jsonPropsValidation) + buildflags = QEMU_BUILD_COMMANDLINE_VALIDATE_KEEP_JSON; VIR_DEBUG("Building emulator command line"); return qemuBuildCommandLine(driver, diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index dbd989c321..830b2b23d6 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -96,13 +96,18 @@ int qemuProcessStart(virConnectPtr conn, virNetDevVPortProfileOp vmop, unsigned int flags); -virCommandPtr qemuProcessCreatePretendCmd(virQEMUDriverPtr driver, - virDomainObjPtr vm, - const char *migrateURI, - bool enableFips, - bool standalone, - bool jsonPropsValidation, - unsigned int flags); +int qemuProcessCreatePretendCmdPrepare(virQEMUDriverPtr driver, + virDomainObjPtr vm, + const char *migrateURI, + bool standalone, + unsigned int flags); + +virCommandPtr qemuProcessCreatePretendCmdBuild(virQEMUDriverPtr driver, + virDomainObjPtr vm, + const char *migrateURI, + bool enableFips, + bool standalone, + bool jsonPropsValidation); int qemuProcessInit(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 092e80e9c0..8cab2da626 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -401,6 +401,10 @@ testCompareXMLToArgvCreateArgs(virQEMUDriverPtr drv, { size_t i; + if (qemuProcessCreatePretendCmdPrepare(drv, vm, migrateURI, false, + VIR_QEMU_PROCESS_START_COLD) < 0) + return NULL; + for (i = 0; i < vm->def->nhostdevs; i++) { virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i]; @@ -466,10 +470,9 @@ testCompareXMLToArgvCreateArgs(virQEMUDriverPtr drv, } } - return qemuProcessCreatePretendCmd(drv, vm, migrateURI, - (flags & FLAG_FIPS), false, - jsonPropsValidation, - VIR_QEMU_PROCESS_START_COLD); + return qemuProcessCreatePretendCmdBuild(drv, vm, migrateURI, + (flags & FLAG_FIPS), false, + jsonPropsValidation); }