[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