[libvirt] [PATCH v5] migration: add support for migrateURI configuration

Jiri Denemark jdenemar at redhat.com
Tue May 20 08:00:52 UTC 2014


s/migrateURI/migrateHost/ in Subject.

On Tue, May 20, 2014 at 14:08:05 +0800, Chen Fan wrote:
> For now, we set the migration URI via command line '--migrate_uri' or
> construct the URI by looking up the dest host's hostname which could be
> solved by DNS automatically.
> 
> But in cases the dest host have two or more NICs to reach, we may need to
> send the migration data over a specific NIC which is different from the
> automatically resloved one for some reason like performance, security, etc.
> thus we must explicitly specify the migrateuri in command line everytime,
> but it is too troublesome if there are many such hosts(and don't forget
> virt-manager).
> 
> This patch adds a configuration file option on dest host to save the
> default value set which can be specified to a migration hostname or
> one of this host's addresses used for transferring data, thus user doesn't
> boring to specify it in command line everytime.
> 
> Signed-off-by: Chen Fan <chen.fan.fnst at cn.fujitsu.com>
> ---
> 
> v4-v5: using "migrate_host" instead of "migrate_uri" configuration.

Yeah, that's the best solution which I wanted to suggest in a discussion
on v4 but I failed to actually send that email. Fortunately, Daniel
suggested the same :-) Although I'd call it "migration_host" to be
consistent with existing migration_address, migration_port_min, and
migration_port_max.

> 
>  src/qemu/qemu.conf        |  7 ++++++-
>  src/qemu/qemu_conf.c      |  1 +
>  src/qemu/qemu_conf.h      |  1 +
>  src/qemu/qemu_migration.c | 25 +++++++++++++++++++++----
>  4 files changed, 29 insertions(+), 5 deletions(-)

src/qemu/libvirtd_qemu.aug and src/qemu/test_libvirtd_qemu.aug.in also
need to be updated with the new configuration option.

> 
> diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
> index f0e802f..421efc4 100644
> --- a/src/qemu/qemu.conf
> +++ b/src/qemu/qemu.conf
> @@ -449,7 +449,12 @@
>  #
>  #seccomp_sandbox = 1
>  
> -
> +# Override the migration hostname for transfering the migration data. By
> +# default, the migrate hostname is set to the host's configured hostname.
> +# This can be used to override the default value set by a migration
> +# hostname or an IP address of the host machine. both IPv4 and IPv6
> +# addresses are accepted.
> +#migrate_host = "localhost"

How about:

# The default hostname or IP address which will be used by a migration
# source for transferring migration data to this host.  The migration
# source has to be able to resolve this hostname and connect to it so
# setting "localhost" will not work.  By default, the host's configured
# hostname is used.
#migration_host = "host.example.com"

>  
>  # Override the listen address for all incoming migrations. Defaults to
>  # 0.0.0.0, or :: if both host and qemu are capable of IPv6.
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index 198ee2f..391fc57 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -574,6 +574,7 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
>  
>      GET_VALUE_LONG("seccomp_sandbox", cfg->seccompSandbox);
>  
> +    GET_VALUE_STR("migrate_host", cfg->migrateHost);

s/migrate_host/migration_host/

>      GET_VALUE_STR("migration_address", cfg->migrationAddress);
>  
>      ret = 0;
> diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
> index a36ea63..8e872b9 100644
> --- a/src/qemu/qemu_conf.h
> +++ b/src/qemu/qemu_conf.h
> @@ -163,6 +163,7 @@ struct _virQEMUDriverConfig {
>  
>      int seccompSandbox;
>  
> +    char *migrateHost;
>      /* The default for -incoming */
>      char *migrationAddress;
>      int migrationPortMin;
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index a9f7fea..963d1ef 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -2639,6 +2639,8 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>      int ret = -1;
>      virURIPtr uri = NULL;
>      bool well_formed_uri = true;
> +    virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> +    const char *migrateHost = cfg->migrateHost;
>  
>      VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
>                "cookieout=%p, cookieoutlen=%p, uri_in=%s, uri_out=%p, "
> @@ -2652,8 +2654,9 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>      /* The URI passed in may be NULL or a string "tcp://somehostname:port".
>       *
>       * If the URI passed in is NULL then we allocate a port number
> -     * from our pool of port numbers and return a URI of
> -     * "tcp://ourhostname:port".
> +     * from our pool of port numbers, and if the migrateHost is configured,
> +     * we return a URI of "tcp://migrateHost:port", otherwise return a URI
> +     * of "tcp://ourhostname:port".
>       *
>       * If the URI passed in is not NULL then we try to parse out the
>       * port number and use that (note that the hostname is assumed
> @@ -2663,8 +2666,21 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>          if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0)
>              goto cleanup;
>  
> -        if ((hostname = virGetHostname()) == NULL)
> -            goto cleanup;
> +        if (migrateHost != NULL) {
> +            if (virSocketAddrIsNumeric(migrateHost)) {
> +                /* migrateHost is numeric IPv4 or IPv6 */
> +                if (virSocketAddrParse(NULL, migrateHost, AF_UNSPEC) < 0)
> +                    goto cleanup;
> +            } else {
> +                /* migrateHost is a hostname */
> +            }

I think

    if (virSocketAddrIsNumeric(migrateHost) &&
        virSocketAddrParse(NULL, migrateHost, AF_UNSPEC) < 0)
        goto cleanup;

is self-explaining.

> +
> +           if (VIR_STRDUP(hostname, migrateHost) < 0)
> +                goto cleanup;
> +        } else {
> +            if ((hostname = virGetHostname()) == NULL)
> +                goto cleanup;
> +        }
>  
>          if (STRPREFIX(hostname, "localhost")) {
>              virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -2746,6 +2762,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>   cleanup:
>      virURIFree(uri);
>      VIR_FREE(hostname);
> +    virObjectUnref(cfg);
>      if (ret != 0) {
>          VIR_FREE(*uri_out);
>          if (autoPort)

That said, I suggest to squash in the attached patch.

Jirka


diff --git i/src/qemu/libvirtd_qemu.aug w/src/qemu/libvirtd_qemu.aug
index e985d22..e7db7fe 100644
--- i/src/qemu/libvirtd_qemu.aug
+++ w/src/qemu/libvirtd_qemu.aug
@@ -84,6 +84,7 @@ module Libvirtd_qemu =
    let network_entry = str_entry "migration_address"
                  | int_entry "migration_port_min"
                  | int_entry "migration_port_max"
+                 | str_entry "migration_host"
 
    let log_entry = bool_entry "log_timestamp"
 
diff --git i/src/qemu/qemu.conf w/src/qemu/qemu.conf
index e9c2402..18ce2a8 100644
--- i/src/qemu/qemu.conf
+++ w/src/qemu/qemu.conf
@@ -449,18 +449,20 @@
 #
 #seccomp_sandbox = 1
 
-# Override the migration hostname for transfering the migration data. By
-# default, the migrate hostname is set to the host's configured hostname.
-# This can be used to override the default value set by a migration
-# hostname or an IP address of the host machine. both IPv4 and IPv6
-# addresses are accepted.
-#migrate_host = "localhost"
 
 # Override the listen address for all incoming migrations. Defaults to
 # 0.0.0.0, or :: if both host and qemu are capable of IPv6.
 #migration_address = "127.0.0.1"
 
 
+# The default hostname or IP address which will be used by a migration
+# source for transferring migration data to this host.  The migration
+# source has to be able to resolve this hostname and connect to it so
+# setting "localhost" will not work.  By default, the host's configured
+# hostname is used.
+#migration_host = "host.example.com"
+
+
 # Override the port range used for incoming migrations.
 #
 # Minimum must be greater than 0, however when QEMU is not running as root,
diff --git i/src/qemu/qemu_conf.c w/src/qemu/qemu_conf.c
index 65807ea..f273056 100644
--- i/src/qemu/qemu_conf.c
+++ w/src/qemu/qemu_conf.c
@@ -576,7 +576,7 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
 
     GET_VALUE_LONG("seccomp_sandbox", cfg->seccompSandbox);
 
-    GET_VALUE_STR("migrate_host", cfg->migrateHost);
+    GET_VALUE_STR("migration_host", cfg->migrateHost);
     GET_VALUE_STR("migration_address", cfg->migrationAddress);
 
     GET_VALUE_BOOL("log_timestamp", cfg->logTimestamp);
diff --git i/src/qemu/qemu_migration.c w/src/qemu/qemu_migration.c
index bca6585..d6271fb 100644
--- i/src/qemu/qemu_migration.c
+++ w/src/qemu/qemu_migration.c
@@ -2668,13 +2668,9 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
             goto cleanup;
 
         if (migrateHost != NULL) {
-            if (virSocketAddrIsNumeric(migrateHost)) {
-                /* migrateHost is numeric IPv4 or IPv6 */
-                if (virSocketAddrParse(NULL, migrateHost, AF_UNSPEC) < 0)
-                    goto cleanup;
-            } else {
-                /* migrateHost is a hostname */
-            }
+            if (virSocketAddrIsNumeric(migrateHost) &&
+                virSocketAddrParse(NULL, migrateHost, AF_UNSPEC) < 0)
+                goto cleanup;
 
            if (VIR_STRDUP(hostname, migrateHost) < 0)
                 goto cleanup;
diff --git i/src/qemu/test_libvirtd_qemu.aug.in w/src/qemu/test_libvirtd_qemu.aug.in
index 30a4257..7796acc 100644
--- i/src/qemu/test_libvirtd_qemu.aug.in
+++ w/src/qemu/test_libvirtd_qemu.aug.in
@@ -70,6 +70,7 @@ module Test_libvirtd_qemu =
 { "keepalive_count" = "5" }
 { "seccomp_sandbox" = "1" }
 { "migration_address" = "127.0.0.1" }
+{ "migration_host" = "host.example.com" }
 { "migration_port_min" = "49152" }
 { "migration_port_max" = "49215" }
 { "log_timestamp" = "0" }




More information about the libvir-list mailing list