]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Set domain def transient at beginning of startup process
authorCole Robinson <crobinso@redhat.com>
Wed, 12 Jan 2011 06:04:33 +0000 (01:04 -0500)
committerCole Robinson <crobinso@redhat.com>
Fri, 21 Jan 2011 21:03:03 +0000 (16:03 -0500)
This will allow us to record transient runtime state in vm->def, like
default VNC parameters. Accomplish this by adding an extra 'live' parameter
to SetDefTransient, with similar semantics to the 'live' flag for
AssignDef.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/lxc/lxc_driver.c
src/qemu/qemu_driver.c
src/test/test_driver.c
src/uml/uml_driver.c

index 645767e9a24141fabb4e705552c09b20e153c403..54813130875323b8c53bae1d175f6679f843accd 100644 (file)
@@ -1016,17 +1016,22 @@ virDomainObjPtr virDomainAssignDef(virCapsPtr caps,
  *
  * @param caps pointer to capabilities info
  * @param domain domain object pointer
+ * @param live if true, run this operation even for an inactive domain.
+ *   this allows freely updated domain->def with runtime defaults before
+ *   starting the VM, which will be discarded on VM shutdown. Any cleanup
+ *   paths need to be sure to handle newDef if the domain is never started.
  * @return 0 on success, -1 on failure
  */
 int
 virDomainObjSetDefTransient(virCapsPtr caps,
-                            virDomainObjPtr domain)
+                            virDomainObjPtr domain,
+                            bool live)
 {
     int ret = -1;
     char *xml = NULL;
     virDomainDefPtr newDef = NULL;
 
-    if (!virDomainObjIsActive(domain))
+    if (!virDomainObjIsActive(domain) && !live)
         return 0;
 
     if (!domain->persistent)
@@ -1061,7 +1066,7 @@ virDomainDefPtr
 virDomainObjGetPersistentDef(virCapsPtr caps,
                              virDomainObjPtr domain)
 {
-    if (virDomainObjSetDefTransient(caps, domain) < 0)
+    if (virDomainObjSetDefTransient(caps, domain, false) < 0)
         return NULL;
 
     if (domain->newDef)
index cf7bdc0c08d22cbdf3a7bdc182113bfe644b2430..409a2fe784c29c46eae27633f924cfb4ed1e17c2 100644 (file)
@@ -1139,7 +1139,8 @@ void virDomainObjAssignDef(virDomainObjPtr domain,
                            const virDomainDefPtr def,
                            bool live);
 int virDomainObjSetDefTransient(virCapsPtr caps,
-                                virDomainObjPtr domain);
+                                virDomainObjPtr domain,
+                                bool live);
 virDomainDefPtr
 virDomainObjGetPersistentDef(virCapsPtr caps,
                              virDomainObjPtr domain);
index df693ec6822be6158c51b9c4bf3abc4bda24e86b..2e8a84567a948cd1bf33edf129244e2f555f48db 100644 (file)
@@ -1555,7 +1555,7 @@ static int lxcVmStart(virConnectPtr conn,
     if (virDomainSaveConfig(driver->stateDir, vm->def) < 0)
         goto cleanup;
 
-    if (virDomainObjSetDefTransient(driver->caps, vm) < 0)
+    if (virDomainObjSetDefTransient(driver->caps, vm, false) < 0)
         goto cleanup;
 
     rc = 0;
index 5206b6045f6f7fb6e5f2a6dfc6fe4f7153c9b9bc..5a4466453b260f1352bc2d15c737076ece3568a8 100644 (file)
@@ -2633,6 +2633,14 @@ static int qemudStartVMDaemon(virConnectPtr conn,
         return -1;
     }
 
+    /* Do this upfront, so any part of the startup process can add
+     * runtime state to vm->def that won't be persisted. This let's us
+     * report implicit runtime defaults in the XML, like vnc listen/socket
+     */
+    DEBUG0("Setting current domain def as transient");
+    if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0)
+        goto cleanup;
+
     /* Must be run before security labelling */
     DEBUG0("Preparing host devices");
     if (qemuPrepareHostDevices(driver, vm->def) < 0)
@@ -2923,11 +2931,6 @@ static int qemudStartVMDaemon(virConnectPtr conn,
     if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
         goto cleanup;
 
-    /* Do this last, since it depends on domain being active */
-    DEBUG0("Setting running domain def as transient");
-    if (virDomainObjSetDefTransient(driver->caps, vm) < 0)
-        goto cleanup;
-
     virCommandFree(cmd);
     VIR_FORCE_CLOSE(logfile);
 
index 7b077803b4b96b28ee1a9c9181578acf854dda5d..caf823bb6967f3fe2c64b42d8166286eb4b8e7bc 100644 (file)
@@ -487,7 +487,7 @@ testDomainStartState(virConnectPtr conn,
     dom->state = VIR_DOMAIN_RUNNING;
     dom->def->id = privconn->nextDomID++;
 
-    if (virDomainObjSetDefTransient(privconn->caps, dom) < 0) {
+    if (virDomainObjSetDefTransient(privconn->caps, dom, false) < 0) {
         goto cleanup;
     }
 
index ef2a5b6244d2ba8c78009db7f8c92e76f9631008..d248b453cc0b53c167a63a20460dacc711b7fccd 100644 (file)
@@ -887,7 +887,7 @@ static int umlStartVMDaemon(virConnectPtr conn,
     if (ret < 0)
         goto cleanup;
 
-    ret = virDomainObjSetDefTransient(driver->caps, vm);
+    ret = virDomainObjSetDefTransient(driver->caps, vm, false);
 cleanup:
     virCommandFree(cmd);