[libvirt] [PATCH 05/11] Convert Xen domain start/migration APIs to use virDomainDefPtr

Jim Fehlig jfehlig at suse.com
Mon May 20 17:40:34 UTC 2013


I finally have some time to continue reviewing this series...

Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> Introduce use of a virDomainDefPtr in the domain migrate &
> start APIs to simplify introduction of ACL security checks.
>   

Not really the 'start' API, but GetXMLDesc, Define, and Undefine. Should
those be part of the lifecycle changes made in patch 2?

> The virDomainPtr cannot be safely used, since the app
> may have supplied mis-matching name/uuid/id fields. eg
> the name points to domain X, while the uuid points to
> domain Y. Resolving the virDomainPtr to a virDomainDefPtr
> ensures a consistent name/uuid/id set.
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/xen/xen_driver.c    | 127 ++++++++++++++++++++++++++++++++----------------
>  src/xen/xend_internal.c |  71 +++++++++------------------
>  src/xen/xend_internal.h |  22 ++++++---
>  src/xen/xm_internal.c   |  49 ++++++++-----------
>  src/xen/xm_internal.h   |   7 +--
>  5 files changed, 148 insertions(+), 128 deletions(-)
>
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 89b038c..8b7dec9 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1294,18 +1294,31 @@ static char *
>  xenUnifiedDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> +    virDomainDefPtr minidef = NULL;
> +    virDomainDefPtr def = NULL;
> +    char *ret = NULL;
> +
> +    if (!(minidef = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
>  
>      if (dom->id < 0 && priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> -        return xenXMDomainGetXMLDesc(dom, flags);
> +        def = xenXMDomainGetXMLDesc(dom->conn, minidef);
>      } else {
> -        char *cpus, *res;
> +        char *cpus;
>          xenUnifiedLock(priv);
>          cpus = xenDomainUsedCpus(dom);
>          xenUnifiedUnlock(priv);
> -        res = xenDaemonDomainGetXMLDesc(dom, flags, cpus);
> +        def = xenDaemonDomainGetXMLDesc(dom->conn, minidef, cpus);
>          VIR_FREE(cpus);
> -        return res;
>      }
> +
> +    if (def)
> +        ret = virDomainDefFormat(def, flags);
> +
> +cleanup:
> +    virDomainDefFree(def);
> +    virDomainDefFree(minidef);
> +    return ret;
>  }
>  
>  
> @@ -1438,10 +1451,21 @@ xenUnifiedDomainMigratePerform(virDomainPtr dom,
>                                 const char *dname,
>                                 unsigned long resource)
>  {
> +    virDomainDefPtr def = NULL;
> +    int ret = -1;
> +
>      virCheckFlags(XEN_MIGRATION_FLAGS, -1);
>  
> -    return xenDaemonDomainMigratePerform(dom, cookie, cookielen, uri,
> -                                         flags, dname, resource);
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
> +    ret = xenDaemonDomainMigratePerform(dom->conn, def,
> +                                        cookie, cookielen, uri,
> +                                        flags, dname, resource);
> +
> +cleanup:
> +    virDomainDefFree(def);
> +    return ret;
>  }
>  
>  static virDomainPtr
> @@ -1452,45 +1476,37 @@ xenUnifiedDomainMigrateFinish(virConnectPtr dconn,
>                                const char *uri ATTRIBUTE_UNUSED,
>                                unsigned long flags)
>  {
> -    virDomainPtr dom = NULL;
> -    char *domain_xml = NULL;
> -    virDomainPtr dom_new = NULL;
> +    xenUnifiedPrivatePtr priv = dconn->privateData;
> +    virDomainPtr ret = NULL;
> +    virDomainDefPtr minidef = NULL;
> +    virDomainDefPtr def = NULL;
>  
>      virCheckFlags(XEN_MIGRATION_FLAGS, NULL);
>  
> -    if (!(dom = xenUnifiedDomainLookupByName(dconn, dname)))
> -        return NULL;
> +    if (!(minidef = xenGetDomainDefForName(dconn, dname)))
> +        goto cleanup;
>  
>      if (flags & VIR_MIGRATE_PERSIST_DEST) {
> -        domain_xml = xenDaemonDomainGetXMLDesc(dom, 0, NULL);
> -        if (! domain_xml) {
> -            virReportError(VIR_ERR_MIGRATE_PERSIST_FAILED,
> -                           "%s", _("failed to get XML representation of migrated domain"));
> -            goto error;
> -        }
> +        if (!(def = xenDaemonDomainGetXMLDesc(dconn, minidef, NULL)))
> +            goto cleanup;
>  
> -        dom_new = xenDaemonDomainDefineXML(dconn, domain_xml);
> -        if (! dom_new) {
> -            virReportError(VIR_ERR_MIGRATE_PERSIST_FAILED,
> -                           "%s", _("failed to define domain on destination host"));
> -            goto error;
> +        if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> +            if (xenXMDomainDefineXML(dconn, def) < 0)
> +                goto cleanup;
> +        } else {
> +            if (xenDaemonDomainDefineXML(dconn, def) < 0)
> +                goto cleanup;
>          }
> -
> -        /* Free additional reference added by Define */
> -        virDomainFree(dom_new);
>      }
>  
> -    VIR_FREE(domain_xml);
> -
> -    return dom;
> -
> +    ret = virGetDomain(dconn, minidef->name, minidef->uuid);
> +    if (ret)
> +        ret->id = minidef->id;
>  
> -error:
> -    virDomainFree(dom);
> -
> -    VIR_FREE(domain_xml);
> -
> -    return NULL;
> +cleanup:
> +    virDomainDefFree(def);
> +    virDomainDefFree(minidef);
> +    return ret;
>  }
>  
>  static int
> @@ -1565,23 +1581,52 @@ static virDomainPtr
>  xenUnifiedDomainDefineXML(virConnectPtr conn, const char *xml)
>  {
>      xenUnifiedPrivatePtr priv = conn->privateData;
> +    virDomainDefPtr def = NULL;
> +    virDomainPtr ret = NULL;
>  
> -    if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> -        return xenXMDomainDefineXML(conn, xml);
> -    else
> -        return xenDaemonDomainDefineXML(conn, xml);
> +    if (!(def = virDomainDefParseString(xml, priv->caps, priv->xmlopt,
> +                                        1 << VIR_DOMAIN_VIRT_XEN,
> +                                        VIR_DOMAIN_XML_INACTIVE)))
> +        goto cleanup;
> +
> +    if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
> +        if (xenXMDomainDefineXML(conn, def) < 0)
> +            goto cleanup;
> +        def = NULL; /* XM driver owns it now */
> +    } else {
> +        if (xenDaemonDomainDefineXML(conn, def) < 0)
> +            goto cleanup;
> +    }
> +
> +    ret = virGetDomain(conn, def->name, def->uuid);
> +    if (ret)
> +        ret->id = -1;
> +
> +cleanup:
> +    virDomainDefFree(def);
> +    return ret;
>  }
>  
>  static int
>  xenUnifiedDomainUndefineFlags(virDomainPtr dom, unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv = dom->conn->privateData;
> +    virDomainDefPtr def = NULL;
> +    int ret = -1;
>  
>      virCheckFlags(0, -1);
> +
> +    if (!(def = xenGetDomainDefForDom(dom)))
> +        goto cleanup;
> +
>      if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4)
> -        return xenXMDomainUndefine(dom);
> +        ret = xenXMDomainUndefine(dom->conn, def);
>      else
> -        return xenDaemonDomainUndefine(dom);
> +        ret = xenDaemonDomainUndefine(dom->conn, def);
> +
> +cleanup:
> +    virDomainDefFree(def);
> +    return ret;
>  }
>  
>  static int
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 9555b33..77c4dec 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -1604,7 +1604,6 @@ cleanup:
>  /**
>   * xenDaemonDomainGetXMLDesc:
>   * @domain: a domain object
> - * @flags: potential dump flags
>   * @cpus: list of cpu the domain is pinned to.
>   *
>   * Provide an XML description of the domain.
> @@ -1612,27 +1611,15 @@ cleanup:
>   * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
>   *         the caller must free() the returned value.
>   */
>   

Comments for this function need updated, e.g. the domain parameter no
longer exists and it now returns a virtDomainDefPtr.

> -char *
> -xenDaemonDomainGetXMLDesc(virDomainPtr domain,
> -                          unsigned int flags,
> +virDomainDefPtr
> +xenDaemonDomainGetXMLDesc(virConnectPtr conn,
> +                          virDomainDefPtr minidef,
>                            const char *cpus)
>  {
> -    virDomainDefPtr def;
> -    char *xml;
> -
> -    /* Flags checked by virDomainDefFormat */
> -
> -    if (!(def = xenDaemonDomainFetch(domain->conn,
> -                                     domain->id,
> -                                     domain->name,
> -                                     cpus)))
> -        return NULL;
> -
> -    xml = virDomainDefFormat(def, flags);
> -
> -    virDomainDefFree(def);
> -
> -    return xml;
> +    return xenDaemonDomainFetch(conn,
> +                                minidef->id,
> +                                minidef->name,
> +                                cpus);
>  }
>  
>  
> @@ -2657,7 +2644,8 @@ xenDaemonDomainMigratePrepare(virConnectPtr dconn ATTRIBUTE_UNUSED,
>  }
>  
>  int
> -xenDaemonDomainMigratePerform(virDomainPtr domain,
> +xenDaemonDomainMigratePerform(virConnectPtr conn,
> +                              virDomainDefPtr def,
>                                const char *cookie ATTRIBUTE_UNUSED,
>                                int cookielen ATTRIBUTE_UNUSED,
>                                const char *uri,
> @@ -2801,7 +2789,7 @@ xenDaemonDomainMigratePerform(virDomainPtr domain,
>       * to our advantage since all parameters supported and required
>       * by current xend can be included without breaking older xend.
>       */
> -    ret = xend_op(domain->conn, domain->name,
> +    ret = xend_op(conn, def->name,
>                    "op", "migrate",
>                    "destination", hostname,
>                    "live", live,
> @@ -2814,34 +2802,24 @@ xenDaemonDomainMigratePerform(virDomainPtr domain,
>      VIR_FREE(hostname);
>  
>      if (ret == 0 && undefined_source)
> -        xenDaemonDomainUndefine(domain);
> +        xenDaemonDomainUndefine(conn, def);
>  
>      VIR_DEBUG("migration done");
>  
>      return ret;
>  }
>  
> -virDomainPtr
> -xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc)
> +int
> +xenDaemonDomainDefineXML(virConnectPtr conn, virDomainDefPtr def)
>   

xenDaemonDomainGetXMLDesc and xenDaemonDomainDefineXML are poorly named
now that they don't return or accept XML, but that's a super nit :).

>  {
> -    int ret;
> +    int ret = -1;
>      char *sexpr;
> -    virDomainPtr dom;
>      xenUnifiedPrivatePtr priv = conn->privateData;
> -    virDomainDefPtr def;
> -
> -    if (!(def = virDomainDefParseString(xmlDesc, priv->caps, priv->xmlopt,
> -                                        1 << VIR_DOMAIN_VIRT_XEN,
> -                                        VIR_DOMAIN_XML_INACTIVE))) {
> -        virReportError(VIR_ERR_XML_ERROR,
> -                       "%s", _("failed to parse domain description"));
> -        return NULL;
> -    }
>  
>      if (!(sexpr = xenFormatSxpr(conn, def, priv->xendConfigVersion))) {
>          virReportError(VIR_ERR_XML_ERROR,
>                         "%s", _("failed to build sexpr"));
> -        goto error;
> +        goto cleanup;
>      }
>  
>      ret = xend_op(conn, "", "op", "new", "config", sexpr, NULL);
> @@ -2849,20 +2827,15 @@ xenDaemonDomainDefineXML(virConnectPtr conn, const char *xmlDesc)
>      if (ret != 0) {
>          virReportError(VIR_ERR_XEN_CALL,
>                         _("Failed to create inactive domain %s"), def->name);
> -        goto error;
> +        goto cleanup;
>      }
>  
> -    dom = virDomainLookupByName(conn, def->name);
> -    if (dom == NULL) {
> -        goto error;
> -    }
> -    virDomainDefFree(def);
> -    return dom;
> +    ret = 0;
>  
> -  error:
> -    virDomainDefFree(def);
> -    return NULL;
> +cleanup:
> +    return ret;
>  }
> +
>  int
>  xenDaemonDomainCreate(virConnectPtr conn,
>                        virDomainDefPtr def)
> @@ -2882,9 +2855,9 @@ xenDaemonDomainCreate(virConnectPtr conn,
>  }
>  
>  int
> -xenDaemonDomainUndefine(virDomainPtr domain)
> +xenDaemonDomainUndefine(virConnectPtr conn, virDomainDefPtr def)
>  {
> -    return xend_op(domain->conn, domain->name, "op", "delete", NULL);
> +    return xend_op(conn, def->name, "op", "delete", NULL);
>  }
>  
>  /**
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index 01d321f..1284db3 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -111,8 +111,9 @@ int xenDaemonDomainGetState(virConnectPtr conn,
>                              virDomainDefPtr def,
>                              int *state,
>                              int *reason);
> -char *xenDaemonDomainGetXMLDesc(virDomainPtr domain, unsigned int flags,
> -                                const char *cpus);
> +virDomainDefPtr xenDaemonDomainGetXMLDesc(virConnectPtr conn,
> +                                          virDomainDefPtr def,
> +                                          const char *cpus);
>  unsigned long long xenDaemonDomainGetMaxMemory(virConnectPtr conn,
>                                                 virDomainDefPtr def);
>  char **xenDaemonListDomainsOld(virConnectPtr xend);
> @@ -132,10 +133,12 @@ int xenDaemonDetachDeviceFlags(virDomainPtr domain,
>                                 const char *xml,
>                                 unsigned int flags);
>  
> -virDomainPtr xenDaemonDomainDefineXML(virConnectPtr xend, const char *sexpr);
> +int xenDaemonDomainDefineXML(virConnectPtr conn,
> +                             virDomainDefPtr def);
>  int xenDaemonDomainCreate(virConnectPtr conn,
>                            virDomainDefPtr def);
> -int xenDaemonDomainUndefine(virDomainPtr domain);
> +int xenDaemonDomainUndefine(virConnectPtr conn,
> +                            virDomainDefPtr def);
>   

These still fit on one line, but this whole files has inconsistent use
of whitespace.

>  
>  int	xenDaemonDomainSetVcpus		(virDomainPtr domain,
>                                           unsigned int vcpus);
> @@ -163,8 +166,15 @@ int xenDaemonDomainSetAutostart          (virDomainPtr domain,
>  virDomainPtr xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc);
>  virDomainDefPtr xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
>  virDomainDefPtr xenDaemonLookupByName(virConnectPtr conn, const char *domname);
> -int xenDaemonDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname, unsigned long resource);
> -int xenDaemonDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long resource);
> +int xenDaemonDomainMigratePrepare (virConnectPtr dconn,
> +                                   char **cookie, int *cookielen,
> +                                   const char *uri_in, char **uri_out,
> +                                   unsigned long flags, const char *dname, unsigned long resource);
> +int xenDaemonDomainMigratePerform (virConnectPtr conn,
> +                                   virDomainDefPtr def,
> +                                   const char *cookie, int cookielen,
> +                                   const char *uri, unsigned long flags,
> +                                   const char *dname, unsigned long resource);
>  
>  int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
>  
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index 6c884d9..79f773d 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -500,28 +500,29 @@ error:
>   * Turn a config record into a lump of XML describing the
>   * domain, suitable for later feeding for virDomainCreateXML
>   */
> -char *
> -xenXMDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
> +virDomainDefPtr
> +xenXMDomainGetXMLDesc(virConnectPtr conn,
> +                      virDomainDefPtr def)
>   

Still fits on one line.

>  {
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> +    xenUnifiedPrivatePtr priv = conn->privateData;
>      const char *filename;
>      xenXMConfCachePtr entry;
> -    char *ret = NULL;
> +    virDomainDefPtr ret = NULL;
>  
>      /* Flags checked by virDomainDefFormat */
>  
> -    if (domain->id != -1)
> -        return NULL;
> -
>      xenUnifiedLock(priv);
>  
> -    if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
> +    if (!(filename = virHashLookup(priv->nameConfigMap, def->name)))
>          goto cleanup;
>  
>      if (!(entry = virHashLookup(priv->configCache, filename)))
>          goto cleanup;
>  
> -    ret = virDomainDefFormat(entry->def, flags);
> +    ret = virDomainDefCopy(entry->def,
> +                           priv->caps,
> +                           priv->xmlopt,
> +                           false);
>  
>  cleanup:
>      xenUnifiedUnlock(priv);
> @@ -945,13 +946,11 @@ xenXMDomainCreate(virConnectPtr conn,
>   * Create a config file for a domain, based on an XML
>   * document describing its config
>   */
> -virDomainPtr
> -xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
> +int
> +xenXMDomainDefineXML(virConnectPtr conn, virDomainDefPtr def)
>  {
> -    virDomainPtr ret;
>      char *filename = NULL;
>      const char *oldfilename;
> -    virDomainDefPtr def = NULL;
>      virConfPtr conf = NULL;
>      xenXMConfCachePtr entry = NULL;
>      xenUnifiedPrivatePtr priv = conn->privateData;
> @@ -960,14 +959,7 @@ xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
>  
>      if (!xenInotifyActive(conn) && xenXMConfigCacheRefresh(conn) < 0) {
>          xenUnifiedUnlock(priv);
> -        return NULL;
> -    }
> -
> -    if (!(def = virDomainDefParseString(xml, priv->caps, priv->xmlopt,
> -                                        1 << VIR_DOMAIN_VIRT_XEN,
> -                                        VIR_DOMAIN_XML_INACTIVE))) {
> -        xenUnifiedUnlock(priv);
> -        return NULL;
> +        return -1;
>      }
>  
>      if (!(conf = xenFormatXM(conn, def, priv->xendConfigVersion)))
> @@ -1061,10 +1053,9 @@ xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
>          goto error;
>      }
>  
> -    ret = virGetDomain(conn, def->name, def->uuid);
>      xenUnifiedUnlock(priv);
>      VIR_FREE(filename);
> -    return ret;
> +    return 0;
>  
>   error:
>      VIR_FREE(filename);
> @@ -1072,25 +1063,25 @@ xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
>          VIR_FREE(entry->filename);
>      VIR_FREE(entry);
>      virConfFree(conf);
> -    virDomainDefFree(def);
>      xenUnifiedUnlock(priv);
> -    return NULL;
> +    return -1;
>  }
>  
>  /*
>   * Delete a domain from disk
>   */
>  int
> -xenXMDomainUndefine(virDomainPtr domain)
> +xenXMDomainUndefine(virConnectPtr conn,
> +                    virDomainDefPtr def)
>   

Still fits on one line.

>  {
> -    xenUnifiedPrivatePtr priv = domain->conn->privateData;
> +    xenUnifiedPrivatePtr priv = conn->privateData;
>      const char *filename;
>      xenXMConfCachePtr entry;
>      int ret = -1;
>  
>      xenUnifiedLock(priv);
>  
> -    if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
> +    if (!(filename = virHashLookup(priv->nameConfigMap, def->name)))
>          goto cleanup;
>  
>      if (!(entry = virHashLookup(priv->configCache, filename)))
> @@ -1100,7 +1091,7 @@ xenXMDomainUndefine(virDomainPtr domain)
>          goto cleanup;
>  
>      /* Remove the name -> filename mapping */
> -    if (virHashRemoveEntry(priv->nameConfigMap, domain->name) < 0)
> +    if (virHashRemoveEntry(priv->nameConfigMap, def->name) < 0)
>          goto cleanup;
>  
>      /* Remove the config record itself */
> diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
> index 0521625..5a434b9 100644
> --- a/src/xen/xm_internal.h
> +++ b/src/xen/xm_internal.h
> @@ -44,7 +44,8 @@ int xenXMDomainGetState(virConnectPtr conn,
>                          virDomainDefPtr def,
>                          int *state,
>                          int *reason);
> -char *xenXMDomainGetXMLDesc(virDomainPtr domain, unsigned int flags);
> +virDomainDefPtr xenXMDomainGetXMLDesc(virConnectPtr conn,
> +                                      virDomainDefPtr def);
>   

This still squeezes into one line too.

Regards,
Jim

>  int xenXMDomainSetMemory(virConnectPtr conn,
>                           virDomainDefPtr def,
>                           unsigned long memory);
> @@ -67,8 +68,8 @@ int xenXMNumOfDefinedDomains(virConnectPtr conn);
>  
>  int xenXMDomainCreate(virConnectPtr conn,
>                        virDomainDefPtr def);
> -virDomainPtr xenXMDomainDefineXML(virConnectPtr con, const char *xml);
> -int xenXMDomainUndefine(virDomainPtr domain);
> +int xenXMDomainDefineXML(virConnectPtr con, virDomainDefPtr def);
> +int xenXMDomainUndefine(virConnectPtr conn, virDomainDefPtr def);
>  
>  int xenXMDomainBlockPeek (virDomainPtr dom, const char *path, unsigned long long offset, size_t size, void *buffer);
>  
>   




More information about the libvir-list mailing list