[libvirt] [PATCH v2 6/6] parallels: fix virDomainDefineXML for domain in saved state

Dmitry Guryanov dguryanov at parallels.com
Thu Mar 19 12:37:47 UTC 2015


PCS doesn't store domain config in managed save state file.
It's forbidden to change config for VMs in this state.
It's possible to change config for containers, but after
restoring domain will have that new config, not a config,
which domain had at the moment of virDomainManagedSave.

So we need to handle this case differently from other states.
Let's forbid this operation, if config is changed and if it's
not changed - just do nothing.

Openstack/nova calls virDomainDefineXML on resume with
current domain config, so we can't forbid this operation
in managed save state.

Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
---
 src/parallels/parallels_driver.c | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index 9bbb970..391e927 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -723,11 +723,35 @@ parallelsDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int
         if (!olddom)
             goto cleanup;
     } else {
-        if (prlsdkApplyConfig(conn, olddom, def))
-            goto cleanup;
+        int state, reason;
+
+        state = virDomainObjGetState(olddom, &reason);
+
+        if (state == VIR_DOMAIN_SHUTOFF &&
+            reason == VIR_DOMAIN_SHUTOFF_SAVED) {
+
+            /* PCS doesn't store domain config in managed save state file.
+             * It's forbidden to change config for VMs in this state.
+             * It's possible to change config for containers, but after
+             * restoring domain will have that new config, not a config,
+             * which domain had at the moment of virDomainManagedSave.
+             *
+             * So forbid this operation, if config is changed. If it's
+             * not changed - just do nothing. */
+
+            if (!virDomainDefCheckABIStability(olddom->def, def)) {
+                virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
+                               _("Can't change domain configuration "
+                                 "in managed save state"));
+                goto cleanup;
+            }
+        } else {
+            if (prlsdkApplyConfig(conn, olddom, def))
+                goto cleanup;
 
-        if (prlsdkUpdateDomain(privconn, olddom))
-            goto cleanup;
+            if (prlsdkUpdateDomain(privconn, olddom))
+                goto cleanup;
+        }
     }
 
     retdom = virGetDomain(conn, def->name, def->uuid);
-- 
2.1.0




More information about the libvir-list mailing list