]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
parallels: delete old networks in prlsdkDoApplyConfig before adding new ones
authorMaxim Nestratov <mnestratov@parallels.com>
Mon, 6 Apr 2015 15:53:47 +0000 (18:53 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 8 Apr 2015 08:22:39 +0000 (10:22 +0200)
In order to change an existing domain we delete all existing devices and add
new from scratch. In case of network devices we should also delete corresponding
virtual networks (if any) before removing actual devices from xml. In the patch,
we do it by extending prlsdkDoApplyConfig with a new parameter, which stands for
old xml, and calling prlsdkDelNet every time old xml is specified.

Signed-off-by: Maxim Nestratov <mnestratov@parallels.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/parallels/parallels_sdk.c

index c36b772c3c38af96d2246e01c0bfa530031ddda7..334b45a30227356e2cd98bbe29b47c58072fc7b2 100644 (file)
@@ -2935,7 +2935,8 @@ prlsdkAddFS(PRL_HANDLE sdkdom, virDomainFSDefPtr fs)
 static int
 prlsdkDoApplyConfig(virConnectPtr conn,
                     PRL_HANDLE sdkdom,
-                    virDomainDefPtr def)
+                    virDomainDefPtr def,
+                    virDomainDefPtr olddef)
 {
     PRL_RESULT pret;
     size_t i;
@@ -2997,6 +2998,16 @@ prlsdkDoApplyConfig(virConnectPtr conn,
     if (prlsdkRemoveBootDevices(sdkdom) < 0)
         goto error;
 
+    if (olddef) {
+        for (i = 0; i < olddef->nnets; i++)
+            prlsdkDelNet(conn->privateData, olddef->nets[i]);
+    }
+
+    for (i = 0; i < def->nnets; i++) {
+        if (prlsdkAddNet(sdkdom, conn->privateData, def->nets[i]) < 0)
+           goto error;
+    }
+
     if (prlsdkApplyGraphicsParams(sdkdom, def) < 0)
         goto error;
 
@@ -3008,11 +3019,6 @@ prlsdkDoApplyConfig(virConnectPtr conn,
             goto error;
     }
 
-    for (i = 0; i < def->nnets; i++) {
-        if (prlsdkAddNet(sdkdom, conn->privateData, def->nets[i]) < 0)
-           goto error;
-    }
-
     for (i = 0; i < def->ndisks; i++) {
         bool bootDisk = false;
 
@@ -3060,7 +3066,7 @@ prlsdkApplyConfig(virConnectPtr conn,
     if (PRL_FAILED(waitJob(job, privconn->jobTimeout)))
         return -1;
 
-    ret = prlsdkDoApplyConfig(conn, sdkdom, new);
+    ret = prlsdkDoApplyConfig(conn, sdkdom, new, dom->def);
 
     if (ret == 0) {
         job = PrlVm_CommitEx(sdkdom, PVCF_DETACH_HDD_BUNDLE);
@@ -3100,7 +3106,7 @@ prlsdkCreateVm(virConnectPtr conn, virDomainDefPtr def)
     pret = PrlVmCfg_SetOfflineManagementEnabled(sdkdom, 0);
     prlsdkCheckRetGoto(pret, cleanup);
 
-    ret = prlsdkDoApplyConfig(conn, sdkdom, def);
+    ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
     if (ret)
         goto cleanup;
 
@@ -3162,7 +3168,7 @@ prlsdkCreateCt(virConnectPtr conn, virDomainDefPtr def)
 
     }
 
-    ret = prlsdkDoApplyConfig(conn, sdkdom, def);
+    ret = prlsdkDoApplyConfig(conn, sdkdom, def, NULL);
     if (ret)
         goto cleanup;