summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Privoznik <mprivozn@redhat.com>2015-09-22 16:52:03 +0200
committerMichal Privoznik <mprivozn@redhat.com>2015-09-24 10:52:37 +0200
commit37405b910907bd1ad338fb0d6a967bfd23529cf6 (patch)
treeb244c25385427f01a9442386de4b46abed0b3260
parent3824c19df8b5170aacf5c728d251213e77a46aae (diff)
downloadlibvirt-37405b910907bd1ad338fb0d6a967bfd23529cf6.tar.gz
virDomainCreateXML: Don't remove persistent domains on error
https://bugzilla.redhat.com/show_bug.cgi?id=871452 Okay, so we allow users to 'virsh create' an already existing domain, providing completely different XML than the one stored in Libvirt. Well, as long as name and UUID matches. However, in some drivers the code that handles errors unconditionally removes the domain that failed to start even though the domain might have been persistent. Fortunately, the domain is removed just from the internal list of domains and the config file is kept around. Steps to reproduce: 1) virsh dumpxml $dom > /tmp/dom.xml 2) change XML so that it is still parse-able but won't boot, e.g. change guest agent path to /foo/bar 3) virsh create /tmp/dom.xml 4) virsh dumpxml $dom 5) Observe "No such domain" error Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
-rw-r--r--src/lxc/lxc_driver.c6
-rw-r--r--src/qemu/qemu_driver.c6
-rw-r--r--src/test/test_driver.c7
-rw-r--r--src/uml/uml_driver.c7
-rw-r--r--src/vmware/vmware_driver.c6
5 files changed, 22 insertions, 10 deletions
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index a9f0005f55..e5e6c5abe5 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -1239,8 +1239,10 @@ lxcDomainCreateXMLWithFiles(virConnectPtr conn,
(flags & VIR_DOMAIN_START_AUTODESTROY),
VIR_DOMAIN_RUNNING_BOOTED) < 0) {
virDomainAuditStart(vm, "booted", false);
- virDomainObjListRemove(driver->domains, vm);
- vm = NULL;
+ if (!vm->persistent) {
+ virDomainObjListRemove(driver->domains, vm);
+ vm = NULL;
+ }
goto cleanup;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2387cf3f96..30d2d988e1 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1752,7 +1752,8 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn,
def = NULL;
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) {
- qemuDomainRemoveInactive(driver, vm);
+ if (!vm->persistent)
+ qemuDomainRemoveInactive(driver, vm);
goto cleanup;
}
@@ -1762,7 +1763,8 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn,
start_flags) < 0) {
virDomainAuditStart(vm, "booted", false);
qemuDomainObjEndJob(driver, vm);
- qemuDomainRemoveInactive(driver, vm);
+ if (!vm->persistent)
+ qemuDomainRemoveInactive(driver, vm);
goto cleanup;
}
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index d11cda1f72..b40b0799de 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -1621,8 +1621,13 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
goto cleanup;
def = NULL;
- if (testDomainStartState(privconn, dom, VIR_DOMAIN_RUNNING_BOOTED) < 0)
+ if (testDomainStartState(privconn, dom, VIR_DOMAIN_RUNNING_BOOTED) < 0) {
+ if (!dom->persistent) {
+ virDomainObjListRemove(privconn->domains, dom);
+ dom = NULL;
+ }
goto cleanup;
+ }
event = virDomainEventLifecycleNewFromObj(dom,
VIR_DOMAIN_EVENT_STARTED,
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 2b61f73aff..d4b03b39e4 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -1623,9 +1623,10 @@ static virDomainPtr umlDomainCreateXML(virConnectPtr conn, const char *xml,
if (umlStartVMDaemon(conn, driver, vm,
(flags & VIR_DOMAIN_START_AUTODESTROY)) < 0) {
virDomainAuditStart(vm, "booted", false);
- virDomainObjListRemove(driver->domains,
- vm);
- vm = NULL;
+ if (!vm->persistent) {
+ virDomainObjListRemove(driver->domains, vm);
+ vm = NULL;
+ }
goto cleanup;
}
virDomainAuditStart(vm, "booted", true);
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
index e228aaa584..152af398fc 100644
--- a/src/vmware/vmware_driver.c
+++ b/src/vmware/vmware_driver.c
@@ -716,8 +716,10 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml,
vmdef = NULL;
if (vmwareStartVM(driver, vm) < 0) {
- virDomainObjListRemove(driver->domains, vm);
- vm = NULL;
+ if (!vm->persistent) {
+ virDomainObjListRemove(driver->domains, vm);
+ vm = NULL;
+ }
goto cleanup;
}