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.
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/conf/domain_conf.c | 11 ++++++++---
src/conf/domain_conf.h | 3 ++-
src/lxc/lxc_driver.c | 2 +-
src/qemu/qemu_driver.c | 13 ++++++++-----
src/test/test_driver.c | 2 +-
src/uml/uml_driver.c | 2 +-
6 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e5b89a2..5b1c907 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1002,17 +1002,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)
@@ -1047,7 +1052,7 @@ virDomainDefPtr
virDomainObjGetPersistentDef(virCapsPtr caps,
virDomainObjPtr domain)
{
- if (virDomainObjSetDefTransient(caps, domain) < 0)
+ if (virDomainObjSetDefTransient(caps, domain, false) < 0)
return NULL;
if (domain->newDef)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 81409f8..3da26e9 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1125,7 +1125,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);
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index eb58086..5eaccf8 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -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;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3745cce..a56b2f4 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -2631,6 +2631,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)
@@ -2924,11 +2932,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);
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ddff160..6550832 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -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;
}
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 92b5153..dbceb40 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -891,7 +891,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);
--
1.7.3.2