[libvirt] [PATCH 3/9] Don't force dconn to be NULL in virDomainMigrate

Daniel P. Berrange berrange at redhat.com
Mon Oct 5 11:44:50 UTC 2009


The code for tunnelled migration wierdly required the app to pass
a  NULL 'dconn' parameter, only to have to use virConnectOpen
itself shortly thereafter to get a 'dconn' object. Remove this
bogus check & require the app to always pas 'dconn' as before

* src/libvirt.c: Require 'dconn' for virDomainMigrate calls again
  and remove call to virConnectOpen
---
 src/libvirt.c |   79 +++++++++++++++-----------------------------------------
 1 files changed, 21 insertions(+), 58 deletions(-)

diff --git a/src/libvirt.c b/src/libvirt.c
index 2839273..952b699 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -3058,35 +3058,12 @@ virDomainMigrateVersion2 (virDomainPtr domain,
  */
 static virDomainPtr
 virDomainMigrateTunnelled(virDomainPtr domain,
+                          virConnectPtr dconn,
                           unsigned long flags,
                           const char *dname,
                           const char *uri,
                           unsigned long bandwidth)
 {
-    virConnectPtr dconn;
-    virDomainPtr ddomain = NULL;
-
-    if (uri == NULL) {
-        /* if you are doing a secure migration, you *must* also pass a uri */
-        virLibConnError(domain->conn, VIR_ERR_INVALID_ARG,
-                        _("requested TUNNELLED migration, but no URI passed"));
-        return NULL;
-    }
-
-    if (domain->conn->flags & VIR_CONNECT_RO) {
-        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
-        return NULL;
-    }
-
-    /* FIXME: do we even need this check?  In theory, V1 of the protocol
-     * should be able to do tunnelled migration as well
-     */
-    if (!VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
-                                  VIR_DRV_FEATURE_MIGRATION_V2)) {
-        virLibConnError(domain->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
-        return NULL;
-    }
-
     /* Perform the migration.  The driver isn't supposed to return
      * until the migration is complete.
      */
@@ -3094,18 +3071,7 @@ virDomainMigrateTunnelled(virDomainPtr domain,
         (domain, NULL, 0, uri, flags, dname, bandwidth) == -1)
         return NULL;
 
-    dconn = virConnectOpen(uri);
-    if (dconn == NULL)
-        /* FIXME: this is pretty crappy; as far as we know, the migration has
-         * now succeeded, but we can't connect back to the other side
-         */
-        return NULL;
-
-    ddomain = virDomainLookupByName(dconn, dname ? dname : domain->name);
-
-    virConnectClose(dconn);
-
-    return ddomain;
+    return virDomainLookupByName(dconn, dname ? dname : domain->name);
 }
 
 /**
@@ -3182,32 +3148,29 @@ virDomainMigrate (virDomainPtr domain,
         goto error;
     }
 
+    /* Now checkout the destination */
+    if (!VIR_IS_CONNECT(dconn)) {
+        virLibConnError(domain->conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
+        goto error;
+    }
+    if (dconn->flags & VIR_CONNECT_RO) {
+        /* NB, deliberately report error against source object, not dest */
+        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+
     if (flags & VIR_MIGRATE_TUNNELLED) {
-        /* tunnelled migration is more or less a completely different migration
-         * protocol.  dconn has to be NULL, uri has to be set, and the flow
-         * of logic is completely different.  Hence, here we split off from
-         * the main migration flow and use a separate function.
-         */
-        if (dconn != NULL) {
-            virLibConnError(domain->conn, VIR_ERR_INVALID_ARG,
-                            _("requested TUNNELLED migration, but non-NULL dconn"));
-            goto error;
+        char *dstURI = NULL;
+        if (uri == NULL) {
+            dstURI = virConnectGetURI(dconn);
+            if (!uri)
+                return NULL;
         }
 
-        ddomain = virDomainMigrateTunnelled(domain, flags, dname, uri, bandwidth);
-    }
-    else {
-        /* Now checkout the destination */
-        if (!VIR_IS_CONNECT(dconn)) {
-            virLibConnError(domain->conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
-            goto error;
-        }
-        if (dconn->flags & VIR_CONNECT_RO) {
-            /* NB, deliberately report error against source object, not dest */
-            virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
-            goto error;
-        }
+        ddomain = virDomainMigrateTunnelled(domain, dconn, flags, dname, uri ? uri : dstURI, bandwidth);
 
+        VIR_FREE(dstURI);
+    } else {
         /* Check that migration is supported by both drivers. */
         if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
                                      VIR_DRV_FEATURE_MIGRATION_V1) &&
-- 
1.6.2.5




More information about the libvir-list mailing list