[libvirt] [PATCH] migration: add option to set target ndb server port

Maxim Nestratov mnestratov at virtuozzo.com
Fri Jan 29 15:18:18 UTC 2016


13.01.2016 14:01, Nikolay Shirokovskiy пишет:
> Current libvirt + qemu pair lacks secure migrations in case of
> VMs with non-shared disks. The only option to migrate securely
> natively is to use tunneled mode and some kind of secure
> destination URI. But tunelled mode does not support non-shared
> disks.
>
> The other way to make migration secure is to organize a tunnel
> by external means. This is possible in case of shared disks
> migration thru use of proper combination of destination URI,
> migration URI and VIR_MIGRATE_PARAM_LISTEN_ADDRESS migration
> param. But again this is not possible in case of non shared disks
> migration as we have no option to control target nbd server port.
> But fixing this much more simplier that supporting non-shared
> disks in tunneled mode.
>
> So this patch adds option to set target ndb port.
>
> Finally all qemu migration connections will be secured AFAIK but
> even in this case this patch could be convinient if one wants
> all migration traffic be put in a single connection.
> ---
>   include/libvirt/libvirt-domain.h |  10 +++
>   src/qemu/qemu_driver.c           |  25 ++++---
>   src/qemu/qemu_migration.c        | 138 +++++++++++++++++++++++++++------------
>   src/qemu/qemu_migration.h        |   3 +
>   tools/virsh-domain.c             |  12 ++++
>   tools/virsh.pod                  |   5 +-
>   6 files changed, 141 insertions(+), 52 deletions(-)
>
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index d26faa5..e577f26 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -757,6 +757,16 @@ typedef enum {
>    */
>   # define VIR_MIGRATE_PARAM_MIGRATE_DISKS    "migrate_disks"
>   
> +/**
> + * VIR_MIGRATE_PARAM_NBD_PORT:
> + *
> + * virDomainMigrate* params field: port that destination nbd server should use
> + * for incoming disks migration. Type is VIR_TYPED_PARAM_INT. If set to 0 or
> + * omitted, libvirt will choose a suitable default. At the moment this is only
> + * supported by the QEMU driver.
> + */
> +# define VIR_MIGRATE_PARAM_NBD_PORT    "nbd_port"
> +
>   /* Domain migration. */
>   virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn,
>                                  unsigned long flags, const char *dname,
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 8ccf68b..4d00ba4 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -12082,7 +12082,7 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
>       ret = qemuMigrationPrepareDirect(driver, dconn,
>                                        NULL, 0, NULL, NULL, /* No cookies */
>                                        uri_in, uri_out,
> -                                     &def, origname, NULL, 0, NULL, flags);
> +                                     &def, origname, NULL, 0, NULL, 0, flags);
>   
>    cleanup:
>       VIR_FREE(origname);
> @@ -12135,7 +12135,7 @@ qemuDomainMigratePerform(virDomainPtr dom,
>        * Consume any cookie we were able to decode though
>        */
>       ret = qemuMigrationPerform(driver, dom->conn, vm,
> -                               NULL, dconnuri, uri, NULL, NULL, 0, NULL,
> +                               NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0,
>                                  cookie, cookielen,
>                                  NULL, NULL, /* No output cookies in v2 */
>                                  flags, dname, resource, false);
> @@ -12308,7 +12308,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
>                                        cookiein, cookieinlen,
>                                        cookieout, cookieoutlen,
>                                        uri_in, uri_out,
> -                                     &def, origname, NULL, 0, NULL, flags);
> +                                     &def, origname, NULL, 0, NULL, 0, flags);
>   
>    cleanup:
>       VIR_FREE(origname);
> @@ -12334,6 +12334,7 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
>       const char *dname = NULL;
>       const char *uri_in = NULL;
>       const char *listenAddress = cfg->migrationAddress;
> +    int nbdPort = 0;
>       int nmigrate_disks;
>       const char **migrate_disks = NULL;
>       char *origname = NULL;
> @@ -12354,7 +12355,10 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
>                                   &uri_in) < 0 ||
>           virTypedParamsGetString(params, nparams,
>                                   VIR_MIGRATE_PARAM_LISTEN_ADDRESS,
> -                                &listenAddress) < 0)
> +                                &listenAddress) < 0 ||
> +        virTypedParamsGetInt(params, nparams,
> +                                VIR_MIGRATE_PARAM_NBD_PORT,
> +                                &nbdPort) < 0)
>           goto cleanup;
>   
>       nmigrate_disks = virTypedParamsGetStringList(params, nparams,
> @@ -12385,7 +12389,8 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
>                                        cookieout, cookieoutlen,
>                                        uri_in, uri_out,
>                                        &def, origname, listenAddress,
> -                                     nmigrate_disks, migrate_disks, flags);
> +                                     nmigrate_disks, migrate_disks,
> +                                     nbdPort, flags);
>   
>    cleanup:
>       VIR_FREE(migrate_disks);
> @@ -12519,7 +12524,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
>       }
>   
>       return qemuMigrationPerform(driver, dom->conn, vm, xmlin,
> -                                dconnuri, uri, NULL, NULL, 0, NULL,
> +                                dconnuri, uri, NULL, NULL, 0, NULL, 0,
>                                   cookiein, cookieinlen,
>                                   cookieout, cookieoutlen,
>                                   flags, dname, resource, true);
> @@ -12546,6 +12551,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
>       int nmigrate_disks;
>       const char **migrate_disks = NULL;
>       unsigned long long bandwidth = 0;
> +    int nbdPort;
>       int ret = -1;
>   
>       virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
> @@ -12569,7 +12575,10 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
>                                   &graphicsuri) < 0 ||
>           virTypedParamsGetString(params, nparams,
>                                   VIR_MIGRATE_PARAM_LISTEN_ADDRESS,
> -                                &listenAddress) < 0)
> +                                &listenAddress) < 0 ||
> +        virTypedParamsGetInt(params, nparams,
> +                                VIR_MIGRATE_PARAM_NBD_PORT,
> +                                &nbdPort) < 0)
>           goto cleanup;
>   
>       nmigrate_disks = virTypedParamsGetStringList(params, nparams,
> @@ -12589,7 +12598,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom,
>   
>       ret = qemuMigrationPerform(driver, dom->conn, vm, dom_xml,
>                                  dconnuri, uri, graphicsuri, listenAddress,
> -                               nmigrate_disks, migrate_disks,
> +                               nmigrate_disks, migrate_disks, nbdPort,
>                                  cookiein, cookieinlen, cookieout, cookieoutlen,
>                                  flags, dname, bandwidth, true);
>    cleanup:
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 51e7125..362da0f 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1709,7 +1709,8 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
>                               virDomainObjPtr vm,
>                               const char *listenAddr,
>                               size_t nmigrate_disks,
> -                            const char **migrate_disks)
> +                            const char **migrate_disks,
> +                            int nbdPort)
>   {
>       int ret = -1;
>       qemuDomainObjPrivatePtr priv = vm->privateData;
> @@ -1717,6 +1718,12 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
>       char *diskAlias = NULL;
>       size_t i;
>   
> +    if (nbdPort < 0 || nbdPort > USHRT_MAX) {
> +        virReportError(VIR_ERR_INVALID_ARG, "%s",
> +                       _("nbd port must be in range 0-65535"));
> +        return -1;
> +    }
> +
>       for (i = 0; i < vm->def->ndisks; i++) {
>           virDomainDiskDefPtr disk = vm->def->disks[i];
>   
> @@ -1733,10 +1740,15 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
>                                              QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
>               goto cleanup;
>   
> -        if (!port &&
> -            ((virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) ||
> -             (qemuMonitorNBDServerStart(priv->mon, listenAddr, port) < 0))) {
> -            goto exit_monitor;
> +        if (port == 0) {
> +            if (nbdPort)
> +                port = nbdPort;
> +            else
> +                if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0)
> +                    goto exit_monitor;
> +
> +            if (qemuMonitorNBDServerStart(priv->mon, listenAddr, port) < 0)
> +                goto exit_monitor;
>           }
>   
>           if (qemuMonitorNBDServerAdd(priv->mon, diskAlias, true) < 0)
> @@ -1750,7 +1762,8 @@ qemuMigrationStartNBDServer(virQEMUDriverPtr driver,
>   
>    cleanup:
>       VIR_FREE(diskAlias);
> -    if (ret < 0)
> +    // second clause means port is autoselected
> +    if (ret < 0 && nbdPort == 0)
>           virPortAllocatorRelease(driver->migrationPorts, port);
>       return ret;
>   
> @@ -2062,6 +2075,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>                            virDomainObjPtr vm,
>                            qemuMigrationCookiePtr mig,
>                            const char *host,
> +                         int nbdPort,
>                            unsigned long speed,
>                            unsigned int *migrate_flags,
>                            size_t nmigrate_disks,
> @@ -2081,6 +2095,12 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>   
>       VIR_DEBUG("Starting drive mirrors for domain %s", vm->def->name);
>   
> +    if (nbdPort != mig->nbd->port) {
> +            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                           _("target qemu does not support setting nbd port"));
> +        return -1;
> +    }
> +
>       /* steal NBD port and thus prevent its propagation back to destination */
>       port = mig->nbd->port;
>       mig->nbd->port = 0;
> @@ -3402,6 +3422,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>                           const char *listenAddress,
>                           size_t nmigrate_disks,
>                           const char **migrate_disks,
> +                        int nbdPort,
>                           unsigned long flags)
>   {
>       virDomainObjPtr vm = NULL;
> @@ -3601,7 +3622,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>           flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC) &&
>           virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NBD_SERVER)) {
>           if (qemuMigrationStartNBDServer(driver, vm, incoming->address,
> -                                        nmigrate_disks, migrate_disks) < 0) {
> +                                        nmigrate_disks, migrate_disks,
> +                                        nbdPort) < 0) {
>               goto stopjob;
>           }
>           cookieFlags |= QEMU_MIGRATION_COOKIE_NBD;
> @@ -3653,6 +3675,10 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>   
>       if (autoPort)
>           priv->migrationPort = port;
> +    // in this case port is autoselected and we don't need to manage it anymore
> +    // after cookie is baked
> +    if (nbdPort != 0)
> +        priv->nbdPort = 0;
>       ret = 0;
>   
>    cleanup:
> @@ -3664,7 +3690,10 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>           /* priv is set right after vm is added to the list of domains
>            * and there is no 'goto cleanup;' in the middle of those */
>           VIR_FREE(priv->origname);
> -        virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
> +        // release if port is auto selected which is not the case if
> +        // it is given in parameters
> +        if (nbdPort == 0)
> +            virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
>           priv->nbdPort = 0;
>           qemuDomainRemoveInactive(driver, vm);
>       }
> @@ -3721,7 +3750,7 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
>   
>       ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
>                                     cookieout, cookieoutlen, def, origname,
> -                                  st, NULL, 0, false, NULL, 0, NULL, flags);
> +                                  st, NULL, 0, false, NULL, 0, NULL, 0, flags);
>       return ret;
>   }
>   
> @@ -3763,6 +3792,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>                              const char *listenAddress,
>                              size_t nmigrate_disks,
>                              const char **migrate_disks,
> +                           int nbdPort,
>                              unsigned long flags)
>   {
>       unsigned short port = 0;
> @@ -3776,11 +3806,11 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>       VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
>                 "cookieout=%p, cookieoutlen=%p, uri_in=%s, uri_out=%p, "
>                 "def=%p, origname=%s, listenAddress=%s, "
> -              "nmigrate_disks=%zu, migrate_disks=%p, flags=%lx",
> +              "nmigrate_disks=%zu, migrate_disks=%p, nbdPort=%d, flags=%lx",
>                 driver, dconn, NULLSTR(cookiein), cookieinlen,
>                 cookieout, cookieoutlen, NULLSTR(uri_in), uri_out,
>                 *def, origname, NULLSTR(listenAddress),
> -              nmigrate_disks, migrate_disks, flags);
> +              nmigrate_disks, migrate_disks, nbdPort, flags);
>   
>       *uri_out = NULL;
>   
> @@ -3885,7 +3915,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>                                     cookieout, cookieoutlen, def, origname,
>                                     NULL, uri ? uri->scheme : "tcp",
>                                     port, autoPort, listenAddress,
> -                                  nmigrate_disks, migrate_disks, flags);
> +                                  nmigrate_disks, migrate_disks, nbdPort, flags);
>    cleanup:
>       virURIFree(uri);
>       VIR_FREE(hostname);
> @@ -4365,7 +4395,8 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>                    virConnectPtr dconn,
>                    const char *graphicsuri,
>                    size_t nmigrate_disks,
> -                 const char **migrate_disks)
> +                 const char **migrate_disks,
> +                 int nbdPort)
>   {
>       int ret = -1;
>       unsigned int migrate_flags = QEMU_MONITOR_MIGRATE_BACKGROUND;
> @@ -4383,11 +4414,11 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>       VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
>                 "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu, "
>                 "spec=%p (dest=%d, fwd=%d), dconn=%p, graphicsuri=%s, "
> -              "nmigrate_disks=%zu, migrate_disks=%p",
> +              "nmigrate_disks=%zu, migrate_disks=%p, nbdPort=%d",
>                 driver, vm, NULLSTR(cookiein), cookieinlen,
>                 cookieout, cookieoutlen, flags, resource,
>                 spec, spec->destType, spec->fwdType, dconn,
> -              NULLSTR(graphicsuri), nmigrate_disks, migrate_disks);
> +              NULLSTR(graphicsuri), nmigrate_disks, migrate_disks, nbdPort);
>   
>       if (flags & VIR_MIGRATE_NON_SHARED_DISK) {
>           migrate_flags |= QEMU_MONITOR_MIGRATE_NON_SHARED_DISK;
> @@ -4425,6 +4456,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>               /* This will update migrate_flags on success */
>               if (qemuMigrationDriveMirror(driver, vm, mig,
>                                            spec->dest.host.name,
> +                                         nbdPort,
>                                            migrate_speed,
>                                            &migrate_flags,
>                                            nmigrate_disks,
> @@ -4661,7 +4693,8 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
>                              virConnectPtr dconn,
>                              const char *graphicsuri,
>                              size_t nmigrate_disks,
> -                           const char **migrate_disks)
> +                           const char **migrate_disks,
> +                           int nbdPort)
>   {
>       qemuDomainObjPrivatePtr priv = vm->privateData;
>       virURIPtr uribits = NULL;
> @@ -4670,10 +4703,11 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
>   
>       VIR_DEBUG("driver=%p, vm=%p, uri=%s, cookiein=%s, cookieinlen=%d, "
>                 "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu, "
> -              "graphicsuri=%s, nmigrate_disks=%zu migrate_disks=%p",
> +              "graphicsuri=%s, nmigrate_disks=%zu, migrate_disks=%p, "
> +              "nbdPort=%d",
>                 driver, vm, uri, NULLSTR(cookiein), cookieinlen,
>                 cookieout, cookieoutlen, flags, resource,
> -              NULLSTR(graphicsuri), nmigrate_disks, migrate_disks);
> +              NULLSTR(graphicsuri), nmigrate_disks, migrate_disks, nbdPort);
>   
>       if (!(uribits = qemuMigrationParseURI(uri, NULL)))
>           return -1;
> @@ -4711,7 +4745,8 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
>   
>       ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
>                              cookieoutlen, flags, resource, &spec, dconn,
> -                           graphicsuri, nmigrate_disks, migrate_disks);
> +                           graphicsuri, nmigrate_disks, migrate_disks,
> +                           nbdPort);
>   
>       if (spec.destType == MIGRATION_DEST_FD)
>           VIR_FORCE_CLOSE(spec.dest.fd.qemu);
> @@ -4735,7 +4770,8 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
>                              virConnectPtr dconn,
>                              const char *graphicsuri,
>                              size_t nmigrate_disks,
> -                           const char **migrate_disks)
> +                           const char **migrate_disks,
> +                           int nbdPort)
>   {
>       virNetSocketPtr sock = NULL;
>       int ret = -1;
> @@ -4745,10 +4781,12 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
>   
>       VIR_DEBUG("driver=%p, vm=%p, st=%p, cookiein=%s, cookieinlen=%d, "
>                 "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu, "
> -              "graphicsuri=%s, nmigrate_disks=%zu, migrate_disks=%p",
> +              "graphicsuri=%s, nmigrate_disks=%zu, migrate_disks=%p, "
> +              "nbdPort=%d",
>                 driver, vm, st, NULLSTR(cookiein), cookieinlen,
>                 cookieout, cookieoutlen, flags, resource,
> -              NULLSTR(graphicsuri), nmigrate_disks, migrate_disks);
> +              NULLSTR(graphicsuri), nmigrate_disks, migrate_disks,
> +              nbdPort);
>   
>       spec.fwdType = MIGRATION_FWD_STREAM;
>       spec.fwd.stream = st;
> @@ -4772,7 +4810,8 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
>   
>       ret = qemuMigrationRun(driver, vm, cookiein, cookieinlen, cookieout,
>                              cookieoutlen, flags, resource, &spec, dconn,
> -                           graphicsuri, nmigrate_disks, migrate_disks);
> +                           graphicsuri, nmigrate_disks, migrate_disks,
> +                           nbdPort);
>   
>    cleanup:
>       if (spec.destType == MIGRATION_DEST_FD) {
> @@ -4883,12 +4922,12 @@ static int doPeer2PeerMigrate2(virQEMUDriverPtr driver,
>           ret = doTunnelMigrate(driver, vm, st,
>                                 NULL, 0, NULL, NULL,
>                                 flags, resource, dconn,
> -                              NULL, 0, NULL);
> +                              NULL, 0, NULL, 0);
>       else
>           ret = doNativeMigrate(driver, vm, uri_out,
>                                 cookie, cookielen,
>                                 NULL, NULL, /* No out cookie with v2 migration */
> -                              flags, resource, dconn, NULL, 0, NULL);
> +                              flags, resource, dconn, NULL, 0, NULL, 0);
>   
>       /* Perform failed. Make sure Finish doesn't overwrite the error */
>       if (ret < 0)
> @@ -4952,6 +4991,7 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
>                       const char *listenAddress,
>                       size_t nmigrate_disks,
>                       const char **migrate_disks,
> +                    int nbdPort,
>                       unsigned long long bandwidth,
>                       bool useParams,
>                       unsigned long flags)
> @@ -4975,11 +5015,11 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
>   
>       VIR_DEBUG("driver=%p, sconn=%p, dconn=%p, dconnuri=%s, vm=%p, xmlin=%s, "
>                 "dname=%s, uri=%s, graphicsuri=%s, listenAddress=%s, "
> -              "nmigrate_disks=%zu, migrate_disks=%p, bandwidth=%llu, "
> -              "useParams=%d, flags=%lx",
> +              "nmigrate_disks=%zu, migrate_disks=%p, nbdPort=%d, "
> +              "bandwidth=%llu, useParams=%d, flags=%lx",
>                 driver, sconn, dconn, NULLSTR(dconnuri), vm, NULLSTR(xmlin),
>                 NULLSTR(dname), NULLSTR(uri), NULLSTR(graphicsuri),
> -              NULLSTR(listenAddress), nmigrate_disks, migrate_disks,
> +              NULLSTR(listenAddress), nmigrate_disks, migrate_disks, nbdPort,
>                 bandwidth, useParams, flags);
>   
>       /* Unlike the virDomainMigrateVersion3 counterpart, we don't need
> @@ -5029,6 +5069,11 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
>                                           VIR_MIGRATE_PARAM_MIGRATE_DISKS,
>                                           migrate_disks[i]) < 0)
>                   goto cleanup;
> +        if (nbdPort &&
> +            virTypedParamsAddInt(&params, &nparams, &maxparams,
> +                                    VIR_MIGRATE_PARAM_NBD_PORT,
> +                                    nbdPort) < 0)
> +                goto cleanup;
>       }
>   
>       if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED)
> @@ -5114,13 +5159,13 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver,
>                                 cookiein, cookieinlen,
>                                 &cookieout, &cookieoutlen,
>                                 flags, bandwidth, dconn, graphicsuri,
> -                              nmigrate_disks, migrate_disks);
> +                              nmigrate_disks, migrate_disks, nbdPort);
>       } else {
>           ret = doNativeMigrate(driver, vm, uri,
>                                 cookiein, cookieinlen,
>                                 &cookieout, &cookieoutlen,
>                                 flags, bandwidth, dconn, graphicsuri,
> -                              nmigrate_disks, migrate_disks);
> +                              nmigrate_disks, migrate_disks, nbdPort);
>       }
>   
>       /* Perform failed. Make sure Finish doesn't overwrite the error */
> @@ -5295,6 +5340,7 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
>                                 const char *listenAddress,
>                                 size_t nmigrate_disks,
>                                 const char **migrate_disks,
> +                              int nbdPort,
>                                 unsigned long flags,
>                                 const char *dname,
>                                 unsigned long resource,
> @@ -5310,10 +5356,12 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
>   
>       VIR_DEBUG("driver=%p, sconn=%p, vm=%p, xmlin=%s, dconnuri=%s, uri=%s, "
>                 "graphicsuri=%s, listenAddress=%s, nmigrate_disks=%zu, "
> -              "migrate_disks=%p, flags=%lx, dname=%s, resource=%lu",
> +              "migrate_disks=%p, nbdPort=%d, flags=%lx, dname=%s, "
> +              "resource=%lu",
>                 driver, sconn, vm, NULLSTR(xmlin), NULLSTR(dconnuri),
>                 NULLSTR(uri), NULLSTR(graphicsuri), NULLSTR(listenAddress),
> -              nmigrate_disks, migrate_disks, flags, NULLSTR(dname), resource);
> +              nmigrate_disks, migrate_disks, nbdPort, flags, NULLSTR(dname),
> +              resource);
>   
>       if (flags & VIR_MIGRATE_TUNNELLED && uri) {
>           virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> @@ -5408,8 +5456,8 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver,
>       if (*v3proto) {
>           ret = doPeer2PeerMigrate3(driver, sconn, dconn, dconnuri, vm, xmlin,
>                                     dname, uri, graphicsuri, listenAddress,
> -                                  nmigrate_disks, migrate_disks, resource,
> -                                  useParams, flags);
> +                                  nmigrate_disks, migrate_disks, nbdPort,
> +                                  resource, useParams, flags);
>       } else {
>           ret = doPeer2PeerMigrate2(driver, sconn, dconn, vm,
>                                     dconnuri, flags, dname, resource);
> @@ -5446,6 +5494,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
>                           const char *listenAddress,
>                           size_t nmigrate_disks,
>                           const char **migrate_disks,
> +                        int nbdPort,
>                           const char *cookiein,
>                           int cookieinlen,
>                           char **cookieout,
> @@ -5481,13 +5530,13 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
>       if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
>           ret = doPeer2PeerMigrate(driver, conn, vm, xmlin,
>                                    dconnuri, uri, graphicsuri, listenAddress,
> -                                 nmigrate_disks, migrate_disks,
> +                                 nmigrate_disks, migrate_disks, nbdPort,
>                                    flags, dname, resource, &v3proto);
>       } else {
>           qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PERFORM2);
>           ret = doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
>                                 cookieout, cookieoutlen,
> -                              flags, resource, NULL, NULL, 0, NULL);
> +                              flags, resource, NULL, NULL, 0, NULL, 0);
>       }
>       if (ret < 0)
>           goto endjob;
> @@ -5547,6 +5596,7 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver,
>                             const char *graphicsuri,
>                             size_t nmigrate_disks,
>                             const char **migrate_disks,
> +                          int nbdPort,
>                             const char *cookiein,
>                             int cookieinlen,
>                             char **cookieout,
> @@ -5572,7 +5622,7 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver,
>       ret = doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
>                             cookieout, cookieoutlen,
>                             flags, resource, NULL, graphicsuri,
> -                          nmigrate_disks, migrate_disks);
> +                          nmigrate_disks, migrate_disks, nbdPort);
>   
>       if (ret < 0) {
>           if (qemuMigrationRestoreDomainState(conn, vm)) {
> @@ -5614,6 +5664,7 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
>                        const char *listenAddress,
>                        size_t nmigrate_disks,
>                        const char **migrate_disks,
> +                     int nbdPort,
>                        const char *cookiein,
>                        int cookieinlen,
>                        char **cookieout,
> @@ -5625,13 +5676,14 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
>   {
>       VIR_DEBUG("driver=%p, conn=%p, vm=%p, xmlin=%s, dconnuri=%s, "
>                 "uri=%s, graphicsuri=%s, listenAddress=%s, "
> -              "nmigrate_disks=%zu, migrate_disks=%p, "
> +              "nmigrate_disks=%zu, migrate_disks=%p, nbdPort=%d, "
>                 "cookiein=%s, cookieinlen=%d, cookieout=%p, cookieoutlen=%p, "
>                 "flags=%lx, dname=%s, resource=%lu, v3proto=%d",
>                 driver, conn, vm, NULLSTR(xmlin), NULLSTR(dconnuri),
>                 NULLSTR(uri), NULLSTR(graphicsuri), NULLSTR(listenAddress),
> -              nmigrate_disks, migrate_disks, NULLSTR(cookiein), cookieinlen,
> -              cookieout, cookieoutlen, flags, NULLSTR(dname), resource, v3proto);
> +              nmigrate_disks, migrate_disks, nbdPort,
> +              NULLSTR(cookiein), cookieinlen, cookieout, cookieoutlen,
> +              flags, NULLSTR(dname), resource, v3proto);
>   
>       if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
>           if (cookieinlen) {
> @@ -5642,7 +5694,7 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
>   
>           return qemuMigrationPerformJob(driver, conn, vm, xmlin, dconnuri, uri,
>                                          graphicsuri, listenAddress,
> -                                       nmigrate_disks, migrate_disks,
> +                                       nmigrate_disks, migrate_disks, nbdPort,
>                                          cookiein, cookieinlen,
>                                          cookieout, cookieoutlen,
>                                          flags, dname, resource, v3proto);
> @@ -5656,14 +5708,14 @@ qemuMigrationPerform(virQEMUDriverPtr driver,
>           if (v3proto) {
>               return qemuMigrationPerformPhase(driver, conn, vm, uri,
>                                                graphicsuri,
> -                                             nmigrate_disks, migrate_disks,
> +                                             nmigrate_disks, migrate_disks, nbdPort,
>                                                cookiein, cookieinlen,
>                                                cookieout, cookieoutlen,
>                                                flags, resource);
>           } else {
>               return qemuMigrationPerformJob(driver, conn, vm, xmlin, NULL,
>                                              uri, graphicsuri, listenAddress,
> -                                           nmigrate_disks, migrate_disks,
> +                                           nmigrate_disks, migrate_disks, nbdPort,
>                                              cookiein, cookieinlen,
>                                              cookieout, cookieoutlen, flags,
>                                              dname, resource, v3proto);
> diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
> index 2445e13..2796361 100644
> --- a/src/qemu/qemu_migration.h
> +++ b/src/qemu/qemu_migration.h
> @@ -51,6 +51,7 @@
>       VIR_MIGRATE_PARAM_BANDWIDTH,        VIR_TYPED_PARAM_ULLONG,   \
>       VIR_MIGRATE_PARAM_GRAPHICS_URI,     VIR_TYPED_PARAM_STRING,   \
>       VIR_MIGRATE_PARAM_LISTEN_ADDRESS,   VIR_TYPED_PARAM_STRING,   \
> +    VIR_MIGRATE_PARAM_NBD_PORT,         VIR_TYPED_PARAM_INT,      \
>       VIR_MIGRATE_PARAM_MIGRATE_DISKS,    VIR_TYPED_PARAM_STRING |  \
>                                           VIR_TYPED_PARAM_MULTIPLE, \
>       NULL
> @@ -134,6 +135,7 @@ int qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
>                                  const char *listenAddress,
>                                  size_t nmigrate_disks,
>                                  const char **migrate_disks,
> +                               int nbdPort,
>                                  unsigned long flags);
>   
>   int qemuMigrationPerform(virQEMUDriverPtr driver,
> @@ -146,6 +148,7 @@ int qemuMigrationPerform(virQEMUDriverPtr driver,
>                            const char *listenAddress,
>                            size_t nmigrate_disks,
>                            const char **migrate_disks,
> +                         int nbdPort,
>                            const char *cookiein,
>                            int cookieinlen,
>                            char **cookieout,
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index d239ba8..54c9fd0 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -9651,6 +9651,10 @@ static const vshCmdOptDef opts_migrate[] = {
>        .type = VSH_OT_STRING,
>        .help = N_("comma separated list of disks to be migrated")
>       },
> +    {.name = "nbd-port",
> +     .type = VSH_OT_INT,
> +     .help = N_("port to use by target nbd server")
> +    },
>       {.name = NULL}
>   };
>   
> @@ -9661,6 +9665,7 @@ doMigrate(void *opaque)
>       virDomainPtr dom = NULL;
>       const char *desturi = NULL;
>       const char *opt = NULL;
> +    int optInt = 0;
>       unsigned int flags = 0;
>       virshCtrlData *data = opaque;
>       vshControl *ctl = data->ctl;
> @@ -9703,6 +9708,13 @@ doMigrate(void *opaque)
>                                   VIR_MIGRATE_PARAM_LISTEN_ADDRESS, opt) < 0)
>           goto save_error;
>   
> +    if (vshCommandOptInt(ctl, cmd, "nbd-port", &optInt) < 0)
> +        goto out;
> +    if (optInt &&
> +        virTypedParamsAddInt(&params, &nparams, &maxparams,
> +                             VIR_MIGRATE_PARAM_NBD_PORT, optInt) < 0)
> +        goto save_error;
> +
>       if (vshCommandOptStringReq(ctl, cmd, "dname", &opt) < 0)
>           goto out;
>       if (opt &&
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index e830c59..c0c4e81 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -1532,7 +1532,7 @@ to the I<uri> namespace is displayed instead of being modified.
>   [I<--compressed>] [I<--abort-on-error>] [I<--auto-converge>]
>   I<domain> I<desturi> [I<migrateuri>] [I<graphicsuri>] [I<listen-address>]
>   [I<dname>] [I<--timeout> B<seconds>] [I<--xml> B<file>]
> -[I<--migrate-disks> B<disk-list>]
> +[I<--migrate-disks> B<disk-list>] [I<--nbd-port> B<port>]
>   
>   Migrate domain to another host.  Add I<--live> for live migration; <--p2p>
>   for peer-2-peer migration; I<--direct> for direct migration; or I<--tunnelled>
> @@ -1659,6 +1659,9 @@ addresses are accepted as well as hostnames (the resolving is done on
>   destination). Some hypervisors do not support this feature and will return an
>   error if this parameter is used.
>   
> +Optional I<nbd-port> sets the port that hypervisor on destination side should
> +bind to for incoming nbd traffic. Currently it is supported only by qemu.
> +
>   =item B<migrate-setmaxdowntime> I<domain> I<downtime>
>   
>   Set maximum tolerable downtime for a domain which is being live-migrated to
You should use /**/ commens rather than //
Otherwise looks OK. ACK.




More information about the libvir-list mailing list