diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index e985d22ec4..e7db7fe2be 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/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 a/src/qemu/qemu.conf b/src/qemu/qemu.conf index 42f812dc25..18ce2a8490 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -450,12 +450,19 @@ #seccomp_sandbox = 1 - # 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 a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 400c99ca51..f273056d31 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -576,6 +576,7 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, GET_VALUE_LONG("seccomp_sandbox", cfg->seccompSandbox); + GET_VALUE_STR("migration_host", cfg->migrateHost); GET_VALUE_STR("migration_address", cfg->migrationAddress); GET_VALUE_BOOL("log_timestamp", cfg->logTimestamp); diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 5d2983af3a..78b08e55c8 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 f0df1a6044..d6271fb57a 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2640,6 +2640,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, " @@ -2653,8 +2655,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 @@ -2664,8 +2667,17 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver, if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) goto cleanup; - if ((hostname = virGetHostname()) == NULL) - goto cleanup; + if (migrateHost != NULL) { + if (virSocketAddrIsNumeric(migrateHost) && + virSocketAddrParse(NULL, migrateHost, AF_UNSPEC) < 0) + goto cleanup; + + 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", @@ -2747,6 +2759,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver, cleanup: virURIFree(uri); VIR_FREE(hostname); + virObjectUnref(cfg); if (ret != 0) { VIR_FREE(*uri_out); if (autoPort) diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qemu.aug.in index 30a425793e..7796acc1d8 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/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" }