[libvirt] [PATCH 1/3] vz: delete domains when undefine is called

Maxim Nestratov mnestratov at virtuozzo.com
Tue Dec 22 15:29:38 UTC 2015


Currently vz driver unregisters domains when undefine is called,
which is wrong because it contradicts with expected behavior.
All vz domains are persistent, which means that when one is
defined a new bundle directory containing meta data is created.
Undefining domains in a way we do now leaves those directories
undeleted, which prevents subsequent define call for the same
domain xml. I.e. the following sequence define->undefine->define
doesn't work now.
The patch fixes the problem by calling PrlVm_Delete instead of
PrlVm_Unreg detaching all disks prior actually doing this to
prevent images deletion.

Signed-off-by: Maxim Nestratov <mnestratov at virtuozzo.com>
---
 src/vz/vz_sdk.c | 45 ++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 44 insertions(+), 1 deletion(-)

diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 2b031c9..12c8be9 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -3718,6 +3718,46 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
     return ret;
 }
 
+/**
+ * prlsdkDetachDomainHardDisks:
+ *
+ * @sdkdom: domain handle
+ *
+ * Returns 0 if hard disks were successfully detached or not detected.
+ */
+static int
+prlsdkDetachDomainHardDisks(PRL_HANDLE sdkdom)
+{
+    int ret = -1;
+    PRL_RESULT pret;
+    PRL_UINT32 hddCount;
+    PRL_UINT32 i;
+    PRL_HANDLE job;
+
+    job = PrlVm_BeginEdit(sdkdom);
+    if (PRL_FAILED(waitJob(job)))
+        goto cleanup;
+
+    pret = PrlVmCfg_GetHardDisksCount(sdkdom, &hddCount);
+    prlsdkCheckRetGoto(pret, cleanup);
+
+    for (i = 0; i < hddCount; ++i) {
+        ret = prlsdkDelDisk(sdkdom, i);
+        if (ret)
+            goto cleanup;
+    }
+
+    job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE);
+    if (PRL_FAILED(waitJob(job)))
+        ret = -1;
+
+ cleanup:
+
+    return ret;
+}
+
+
+
 int
 prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom)
 {
@@ -3728,7 +3768,10 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom)
     for (i = 0; i < dom->def->nnets; i++)
         prlsdkCleanupBridgedNet(privconn, dom->def->nets[i]);
 
-    job = PrlVm_Unreg(privdom->sdkdom);
+    if (prlsdkDetachDomainHardDisks(privdom->sdkdom))
+        return -1;
+
+    job = PrlVm_Delete(privdom->sdkdom, PRL_INVALID_HANDLE);
     if (PRL_FAILED(waitJob(job)))
         return -1;
 
-- 
2.4.3




More information about the libvir-list mailing list