[libvirt] [PATCH 19/21] virsh: Use extensible migration APIs
Michal Privoznik
mprivozn at redhat.com
Thu Jun 20 08:39:22 UTC 2013
On 18.06.2013 16:06, Jiri Denemark wrote:
> ---
> tools/virsh-domain.c | 77 ++++++++++++++++++++++++++++++++++++----------------
> 1 file changed, 54 insertions(+), 23 deletions(-)
>
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 7f9b9e3..2226b5c 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -8345,15 +8345,15 @@ doMigrate(void *opaque)
> char ret = '1';
> virDomainPtr dom = NULL;
> const char *desturi = NULL;
> - const char *migrateuri = NULL;
> - const char *dname = NULL;
> + const char *opt = NULL;
> unsigned int flags = 0;
> vshCtrlData *data = opaque;
> vshControl *ctl = data->ctl;
> const vshCmd *cmd = data->cmd;
> - const char *xmlfile = NULL;
> - char *xml = NULL;
> sigset_t sigmask, oldsigmask;
> + virTypedParameterPtr params = NULL;
> + int nparams = 0;
> + int maxparams = 0;
>
> sigemptyset(&sigmask);
> sigaddset(&sigmask, SIGINT);
> @@ -8363,11 +8363,40 @@ doMigrate(void *opaque)
> if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
> goto out;
>
> - if (vshCommandOptStringReq(ctl, cmd, "desturi", &desturi) < 0 ||
> - vshCommandOptStringReq(ctl, cmd, "migrateuri", &migrateuri) < 0 ||
> - vshCommandOptStringReq(ctl, cmd, "dname", &dname) < 0 ||
> - vshCommandOptStringReq(ctl, cmd, "xml", &xmlfile) < 0)
> + if (vshCommandOptStringReq(ctl, cmd, "desturi", &desturi) < 0)
> + goto out;
> +
> + if (vshCommandOptStringReq(ctl, cmd, "migrateuri", &opt) < 0)
> + goto out;
> + else if (opt &&
You can just drop these 'else' and hence make the code more readable.
> + virTypedParamsAddString(¶ms, &nparams, &maxparams,
> + VIR_MIGRATE_PARAM_URI, opt) < 0)
> + goto save_error;
> +
> + if (vshCommandOptStringReq(ctl, cmd, "dname", &opt) < 0)
> goto out;
> + else if (opt &&
> + virTypedParamsAddString(¶ms, &nparams, &maxparams,
> + VIR_MIGRATE_PARAM_DEST_NAME, opt) < 0)
> + goto save_error;
> +
> + if (vshCommandOptStringReq(ctl, cmd, "xml", &opt) < 0) {
> + goto out;
> + } else if (opt) {
> + char *xml;
> +
> + if (virFileReadAll(opt, 1024 * 1024, &xml) < 0) {
> + vshError(ctl, _("cannot read file '%s'"), opt);
> + goto save_error;
'save_error' is not on the list of allowed labels
(http://libvirt.org/hacking.html#goto) but it makes sense here.
> + }
> +
> + if (virTypedParamsAddString(¶ms, &nparams, &maxparams,
> + VIR_MIGRATE_PARAM_DEST_XML, xml) < 0) {
> + VIR_FREE(xml);
> + goto save_error;
> + }
> + VIR_FREE(xml);
> + }
>
> if (vshCommandOptBool(cmd, "live"))
> flags |= VIR_MIGRATE_LIVE;
> @@ -8406,23 +8435,19 @@ doMigrate(void *opaque)
> if (vshCommandOptBool(cmd, "abort-on-error"))
> flags |= VIR_MIGRATE_ABORT_ON_ERROR;
>
> - if (xmlfile &&
> - virFileReadAll(xmlfile, 8192, &xml) < 0) {
> - vshError(ctl, _("file '%s' doesn't exist"), xmlfile);
> - goto out;
> - }
> -
> if ((flags & VIR_MIGRATE_PEER2PEER) ||
> vshCommandOptBool(cmd, "direct")) {
>
> /* migrateuri doesn't make sense for tunnelled migration */
> - if (flags & VIR_MIGRATE_TUNNELLED && migrateuri != NULL) {
> - vshError(ctl, "%s", _("migrate: Unexpected migrateuri for peer2peer/direct migration"));
> + if (flags & VIR_MIGRATE_TUNNELLED &&
> + virTypedParamsGetString(params, nparams,
> + VIR_MIGRATE_PARAM_URI, NULL) == 1) {
> + vshError(ctl, "%s", _("migrate: Unexpected migrateuri for "
> + "peer2peer/direct migration"));
> goto out;
> }
>
> - if (virDomainMigrateToURI2(dom, desturi, migrateuri,
> - xml, flags, dname, 0) == 0)
> + if (virDomainMigrateToURI3(dom, desturi, params, nparams, flags) == 0)
> ret = '0';
> } else {
> /* For traditional live migration, connect to the destination host directly. */
> @@ -8430,10 +8455,10 @@ doMigrate(void *opaque)
> virDomainPtr ddom = NULL;
>
> dconn = virConnectOpenAuth(desturi, virConnectAuthPtrDefault, 0);
> - if (!dconn) goto out;
> + if (!dconn)
> + goto out;
>
> - ddom = virDomainMigrate2(dom, dconn, xml, flags, dname, migrateuri, 0);
> - if (ddom) {
> + if ((ddom = virDomainMigrate3(dom, dconn, params, nparams, flags))) {
> virDomainFree(ddom);
> ret = '0';
> }
> @@ -8443,9 +8468,15 @@ doMigrate(void *opaque)
> out:
> pthread_sigmask(SIG_SETMASK, &oldsigmask, NULL);
> out_sig:
> - if (dom) virDomainFree(dom);
> - VIR_FREE(xml);
> + virTypedParamsFree(params, nparams);
> + if (dom)
> + virDomainFree(dom);
> ignore_value(safewrite(data->writefd, &ret, sizeof(ret)));
> + return;
> +
> +save_error:
> + vshSaveLibvirtError();
> + goto out;
> }
>
> static void
>
More information about the libvir-list
mailing list