]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_process: introduce qemuProcessCreatePretendCmd
authorPavel Hrdina <phrdina@redhat.com>
Tue, 22 Mar 2016 12:17:27 +0000 (13:17 +0100)
committerPavel Hrdina <phrdina@redhat.com>
Tue, 22 Mar 2016 14:15:48 +0000 (15:15 +0100)
This will skip few steps from qemuProcessStart in order to create only
qemu CMD.  Use a VIR_QEMU_PROCESS_START_PRETEND for all the qemuProcess*
functions called by this one to not modify or check host.

This new function will be used later on for XMLToNative API and also for
qemuxml2argvtest to make sure that both API and test uses the same code
as qemuProcessStart.

We need also update qemuProcessInit to wrap few lines of code with check
that VIR_QEMU_PROCESS_START_PRETEND that makes sense only for
qemuProcessStart.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
src/qemu/qemu_process.c
src/qemu/qemu_process.h

index f7110cd81c57723d50359036ae228808bc1690d9..fa05b2c831b32093789a0e0490c3d2062eb62d2e 100644 (file)
@@ -4480,6 +4480,10 @@ qemuProcessStartValidate(virQEMUDriverPtr driver,
  * Prepares the domain up to the point when priv->qemuCaps is initialized. The
  * function calls qemuProcessStop when needed.
  *
+ * Flag VIR_QEMU_PROCESS_START_PRETEND tells, that we don't want to actually
+ * start the domain but create a valid qemu command.  If some code shouldn't be
+ * executed in this case, make sure to check this flag.
+ *
  * Returns 0 on success, -1 on error.
  */
 int
@@ -4529,18 +4533,20 @@ qemuProcessInit(virQEMUDriverPtr driver,
     if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm, true) < 0)
         goto stop;
 
-    vm->def->id = qemuDriverAllocateID(driver);
-    qemuDomainSetFakeReboot(driver, vm, false);
-    virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_STARTING_UP);
+    if (!(flags & VIR_QEMU_PROCESS_START_PRETEND)) {
+        vm->def->id = qemuDriverAllocateID(driver);
+        qemuDomainSetFakeReboot(driver, vm, false);
+        virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, VIR_DOMAIN_PAUSED_STARTING_UP);
 
-    if (virAtomicIntInc(&driver->nactive) == 1 && driver->inhibitCallback)
-        driver->inhibitCallback(true, driver->inhibitOpaque);
+        if (virAtomicIntInc(&driver->nactive) == 1 && driver->inhibitCallback)
+            driver->inhibitCallback(true, driver->inhibitOpaque);
 
-    /* Run an early hook to set-up missing devices */
-    if (qemuProcessStartHook(driver, vm,
-                             VIR_HOOK_QEMU_OP_PREPARE,
-                             VIR_HOOK_SUBOP_BEGIN) < 0)
-        goto stop;
+        /* Run an early hook to set-up missing devices */
+        if (qemuProcessStartHook(driver, vm,
+                                 VIR_HOOK_QEMU_OP_PREPARE,
+                                 VIR_HOOK_SUBOP_BEGIN) < 0)
+            goto stop;
+    }
 
     if (qemuDomainSetPrivatePaths(&priv->libDir,
                                   &priv->channelTargetDir,
@@ -5539,6 +5545,56 @@ qemuProcessStart(virConnectPtr conn,
 }
 
 
+virCommandPtr
+qemuProcessCreatePretendCmd(virConnectPtr conn,
+                            virQEMUDriverPtr driver,
+                            virDomainObjPtr vm,
+                            const char *migrateURI,
+                            bool forceFips,
+                            bool standalone,
+                            unsigned int flags)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virCommandPtr cmd = NULL;
+
+    virCheckFlagsGoto(VIR_QEMU_PROCESS_START_COLD |
+                      VIR_QEMU_PROCESS_START_PAUSED |
+                      VIR_QEMU_PROCESS_START_AUTODESTROY, cleanup);
+
+    flags |= VIR_QEMU_PROCESS_START_PRETEND;
+
+    if (qemuProcessInit(driver, vm, QEMU_ASYNC_JOB_NONE, !!migrateURI,
+                        false, flags) < 0)
+        goto cleanup;
+
+    if (qemuProcessPrepareDomain(conn, driver, vm, flags) < 0)
+        goto cleanup;
+
+    VIR_DEBUG("Building emulator command line");
+    cmd = qemuBuildCommandLine(conn,
+                               driver,
+                               NULL,
+                               vm->def,
+                               priv->monConfig,
+                               priv->monJSON,
+                               priv->qemuCaps,
+                               migrateURI,
+                               NULL,
+                               VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
+                               &buildCommandLineCallbacks,
+                               standalone,
+                               forceFips ? true : qemuCheckFips(),
+                               priv->autoNodeset,
+                               NULL,
+                               NULL,
+                               priv->libDir,
+                               priv->channelTargetDir);
+
+ cleanup:
+    return cmd;
+}
+
+
 int
 qemuProcessKill(virDomainObjPtr vm, unsigned int flags)
 {
index 48200478e98aa718477f31cb89ae5933d1811ab7..d5f50f2a674161cc0c2dd9c5720f045eb879da9b 100644 (file)
@@ -81,6 +81,13 @@ int qemuProcessStart(virConnectPtr conn,
                      virNetDevVPortProfileOp vmop,
                      unsigned int flags);
 
+virCommandPtr qemuProcessCreatePretendCmd(virConnectPtr conn,
+                                          virQEMUDriverPtr driver,
+                                          virDomainObjPtr vm,
+                                          const char *migrateURI,
+                                          bool forceFips,
+                                          bool standalone,
+                                          unsigned int flags);
 
 int qemuProcessStartValidate(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,