[libvirt] [PATCH 2/2] add default migrate uri in definition file

Daniel P. Berrange berrange at redhat.com
Tue Apr 15 11:04:22 UTC 2014


On Tue, Apr 15, 2014 at 06:31:09PM +0800, Chen Fan wrote:
> Current virsh migrate command require specfying migration URI with
> command option.
> 
> Here is current step.
> 1) If user specifies --migrateuri on virsh migrate command, then the command
>    transfers the data to specified host.
> 2) If --migrateuri is not specified, the command transfers the data to host
>    whose name is resolved by DNS or /etc/hosts.
> 
>    but we are able to use virsh migrate command more usefull.
>    User can specify a constant destination by definition file.
>    if user want to specify other temporary destination, command option
>    is good for it.
> 
> Signed-off-by: Chen Fan <chen.fan.fnst at cn.fujitsu.com>
> ---
>  daemon/remote.c              | 11 ++++++++++-
>  src/driver.h                 |  1 +
>  src/libvirt.c                | 12 +++++++++++-
>  src/libvirt.conf             |  7 +++++++
>  src/libvirt_internal.h       |  1 +
>  src/qemu/qemu_driver.c       | 37 ++++++++++++++++++++++++++++++++++---
>  src/remote/remote_driver.c   | 13 +++++++++++++
>  src/remote/remote_protocol.x |  1 +
>  8 files changed, 78 insertions(+), 5 deletions(-)
> 
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 8476961..693f460 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -5331,6 +5331,7 @@ remoteDispatchDomainMigrateBegin3Params(virNetServerPtr server ATTRIBUTE_UNUSED,
>      int nparams = 0;
>      char *cookieout = NULL;
>      int cookieoutlen = 0;
> +    char **uri_out = NULL;
>      int rv = -1;
>      struct daemonClientPrivate *priv =
>          virNetServerClientGetPrivateData(client);
> @@ -5355,21 +5356,29 @@ remoteDispatchDomainMigrateBegin3Params(virNetServerPtr server ATTRIBUTE_UNUSED,
>                                                      0, &nparams)))
>          goto cleanup;
>  
> +    /* Wacky world of XDR ... */
> +    if (VIR_ALLOC(uri_out) < 0)
> +        goto cleanup;
> +
>      if (!(xml = virDomainMigrateBegin3Params(dom, params, nparams,
>                                               &cookieout, &cookieoutlen,
> +                                             uri_out,
>                                               args->flags)))
>          goto cleanup;
>  
>      ret->cookie_out.cookie_out_len = cookieoutlen;
>      ret->cookie_out.cookie_out_val = cookieout;
> +    ret->uri_out = !*uri_out ? NULL : uri_out;
>      ret->xml = xml;
>  
>      rv = 0;
>  
>   cleanup:
>      virTypedParamsFree(params, nparams);
> -    if (rv < 0)
> +    if (rv < 0) {
>          virNetMessageSaveError(rerr);
> +        VIR_FREE(uri_out);
> +     }
>      if (dom)
>          virDomainFree(dom);
>      return rv;
> diff --git a/src/driver.h b/src/driver.h
> index e66fc7a..738ab3a 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -1094,6 +1094,7 @@ typedef char *
>                                     int nparams,
>                                     char **cookieout,
>                                     int *cookieoutlen,
> +                                   char **uri_out,
>                                     unsigned int flags);
>  
>  typedef int
> diff --git a/src/libvirt.c b/src/libvirt.c
> index f8d5240..257adbd 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -4738,7 +4738,7 @@ virDomainMigrateVersion3Full(virDomainPtr domain,
>      VIR_DEBUG("Begin3 %p", domain->conn);
>      if (useParams) {
>          dom_xml = domain->conn->driver->domainMigrateBegin3Params
> -            (domain, params, nparams, &cookieout, &cookieoutlen,
> +            (domain, params, nparams, &cookieout, &cookieoutlen, &uri_out,
>               flags | protection);
>      } else {
>          dom_xml = domain->conn->driver->domainMigrateBegin3
> @@ -4748,6 +4748,14 @@ virDomainMigrateVersion3Full(virDomainPtr domain,
>      if (!dom_xml)
>          goto done;
>  
> +    /* Does domainMigrateBegin3Params() change URI? */
> +    if (uri_out) {
> +        if (virTypedParamsReplaceString(&params, &nparams,
> +                                        VIR_MIGRATE_PARAM_URI,
> +                                        uri_out) < 0)
> +            goto done;
> +    }
> +
>      if (useParams) {
>          /* If source is new enough to support extensible migration parameters,
>           * it's certainly new enough to support virDomainGetState. */
> @@ -6778,6 +6786,7 @@ virDomainMigrateBegin3Params(virDomainPtr domain,
>                               int nparams,
>                               char **cookieout,
>                               int *cookieoutlen,
> +                             char **uri_out,
>                               unsigned int flags)
>  {
>      virConnectPtr conn;
> @@ -6798,6 +6807,7 @@ virDomainMigrateBegin3Params(virDomainPtr domain,
>          char *xml;
>          xml = conn->driver->domainMigrateBegin3Params(domain, params, nparams,
>                                                        cookieout, cookieoutlen,
> +                                                      uri_out,
>                                                        flags);
>          VIR_DEBUG("xml %s", NULLSTR(xml));
>          if (!xml)
> diff --git a/src/libvirt.conf b/src/libvirt.conf
> index 016cd24..9cef343 100644
> --- a/src/libvirt.conf
> +++ b/src/libvirt.conf
> @@ -16,3 +16,10 @@
>  # driver when no URI is supplied by the application.
>  
>  #uri_default = "qemu:///system"
> +
> +#
> +# This can be used to provide the default migrate URI when
> +# migrate to target host. if migrate URI had been specified
> +# in command line, this URI was ignored.
> +
> +#uri_migrate = "tcp://dest-uri-example"

This is a client side configuration file...

> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 1d08951..c82fbca 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c


> +
> +    if (!uri_in) {
> +        if (virConnectGetConfigFile(&conf) < 0) {
> +            goto cleanup;
> +        }
> +
> +        if ((value = virConfGetValue(conf, "uri_migrate"))) {
> +            if (value->type != VIR_CONF_STRING) {
> +                VIR_WARN("Expected a string for 'uri_migrate' config parameter");
> +            } else {
> +                if (VIR_STRDUP(*uri_out, value->str) < 0)
> +                    goto cleanup;
> +            }
> +        }
> +        virConfFree(conf);

...which you're attempting to read from the server side.

> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index ed7dde6..3df59da 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -6970,6 +6970,7 @@ remoteDomainMigrateBegin3Params(virDomainPtr domain,
>                                  int nparams,
>                                  char **cookieout,
>                                  int *cookieoutlen,
> +                                char **uri_out,
>                                  unsigned int flags)
>  {
>      char *rv = NULL;
> @@ -7017,15 +7018,27 @@ remoteDomainMigrateBegin3Params(virDomainPtr domain,
>          *cookieoutlen = ret.cookie_out.cookie_out_len;
>      }
>  
> +    if (ret.uri_out) {
> +        if (!uri_out) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                           _("caller ignores uri_out"));
> +            goto error;
> +        }
> +        *uri_out = *ret.uri_out; /* Caller frees. */
> +    }
> +
>      rv = ret.xml; /* caller frees */
>  
>   cleanup:
>      remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
> +    VIR_FREE(ret.uri_out);
>      remoteDriverUnlock(priv);
>      return rv;
>  
>   error:
>      VIR_FREE(ret.cookie_out.cookie_out_val);
> +    if (ret.uri_out)
> +        VIR_FREE(*ret.uri_out);
>      goto cleanup;
>  }
>  
> diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
> index 6c445cc..202a0eb 100644
> --- a/src/remote/remote_protocol.x
> +++ b/src/remote/remote_protocol.x
> @@ -2860,6 +2860,7 @@ struct remote_domain_migrate_begin3_params_args {
>  
>  struct remote_domain_migrate_begin3_params_ret {
>      opaque cookie_out<REMOTE_MIGRATE_COOKIE_MAX>;
> +    remote_string uri_out;
>      remote_nonnull_string xml;
>  };

NACK, this breaks wire protocol compatibility. Changing any existing
APIs is absolutely forbidden.


IMHO the idea of storing the 'migration_uri' parameter in a configuration
file is just plain wrong. This value is inherantly associated with the
host that you're migrating to. So if you set 'migration_uri' to one host
in the config, but then invoke virDomainMigrate with a virConnectPtr that
is associated with a different host, this just crashes and burns. 

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list