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(a)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" }