From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> Unconditionally invoke the xenHypervisorLookupDomainByID, xenHypervisorLookupDomainByUUID or xenDaemonLookupByName for looking up domains. Fallback to xenXMDomainLookupByUUID and xenXMDomainLookupByName for legacy XenD without inactive domain support Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx> --- src/xen/xen_driver.c | 99 +++++++++++-------------------------------------- src/xen/xend_internal.c | 89 -------------------------------------------- src/xen/xend_internal.h | 14 ------- src/xen/xs_internal.c | 62 ------------------------------- src/xen/xs_internal.h | 2 - 5 files changed, 22 insertions(+), 244 deletions(-) diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 82058b7..080045c 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -601,38 +601,17 @@ xenUnifiedDomainCreateXML(virConnectPtr conn, return xenDaemonCreateXML(conn, xmlDesc); } -/* Assumption made in underlying drivers: - * If the domain is "not found" and there is no other error, then - * the Lookup* functions return a NULL but do not set virterror. - */ static virDomainPtr xenUnifiedDomainLookupByID(virConnectPtr conn, int id) { - xenUnifiedPrivatePtr priv = conn->privateData; - virDomainPtr ret; + virDomainPtr ret = NULL; - /* Reset any connection-level errors in virterror first, in case - * there is one hanging around from a previous call. - */ - virConnResetLastError(conn); + ret = xenHypervisorLookupDomainByID(conn, id); - /* Try hypervisor/xenstore combo. */ - if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) { - ret = xenHypervisorLookupDomainByID(conn, id); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } - - /* Try xend. */ - if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) { - ret = xenDaemonLookupByID(conn, id); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } + if (!ret && virGetLastError() == NULL) + virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__); - /* Not found. */ - virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__); - return NULL; + return ret; } static virDomainPtr @@ -642,35 +621,20 @@ xenUnifiedDomainLookupByUUID(virConnectPtr conn, xenUnifiedPrivatePtr priv = conn->privateData; virDomainPtr ret; - /* Reset any connection-level errors in virterror first, in case - * there is one hanging around from a previous call. - */ - virConnResetLastError(conn); - - /* Try hypervisor/xenstore combo. */ - if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) { - ret = xenHypervisorLookupDomainByUUID(conn, uuid); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } - - /* Try xend. */ - if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) { - ret = xenDaemonLookupByUUID(conn, uuid); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } + ret = xenHypervisorLookupDomainByUUID(conn, uuid); /* Try XM for inactive domains. */ - if (priv->opened[XEN_UNIFIED_XM_OFFSET]) { - ret = xenXMDomainLookupByUUID(conn, uuid); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; + if (!ret) { + if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3) + ret = xenXMDomainLookupByUUID(conn, uuid); + else + return xenDaemonLookupByUUID(conn, uuid); } - /* Not found. */ - virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__); - return NULL; + if (!ret && virGetLastError() == NULL) + virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__); + + return ret; } static virDomainPtr @@ -680,35 +644,16 @@ xenUnifiedDomainLookupByName(virConnectPtr conn, xenUnifiedPrivatePtr priv = conn->privateData; virDomainPtr ret; - /* Reset any connection-level errors in virterror first, in case - * there is one hanging around from a previous call. - */ - virConnResetLastError(conn); - - /* Try xend. */ - if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) { - ret = xenDaemonLookupByName(conn, name); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } - - /* Try xenstore for inactive domains. */ - if (priv->opened[XEN_UNIFIED_XS_OFFSET]) { - ret = xenStoreLookupByName(conn, name); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } + ret = xenDaemonLookupByName(conn, name); /* Try XM for inactive domains. */ - if (priv->opened[XEN_UNIFIED_XM_OFFSET]) { + if (priv->xendConfigVersion <= XEND_CONFIG_VERSION_3_0_3) ret = xenXMDomainLookupByName(conn, name); - if (ret || conn->err.code != VIR_ERR_OK) - return ret; - } - /* Not found. */ - virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__); - return NULL; + if (!ret && virGetLastError() == NULL) + virReportError(VIR_ERR_NO_DOMAIN, __FUNCTION__); + + return ret; } @@ -719,7 +664,7 @@ xenUnifiedDomainIsActive(virDomainPtr dom) int ret = -1; /* ID field in dom may be outdated, so re-lookup */ - currdom = xenUnifiedDomainLookupByUUID(dom->conn, dom->uuid); + currdom = xenHypervisorLookupDomainByUUID(dom->conn, dom->uuid); if (currdom) { ret = currdom->id == -1 ? 0 : 1; diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 2e6a47e..4ad30fa 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -855,63 +855,6 @@ xenDaemonDomainLookupByName_ids(virConnectPtr xend, } -/** - * xenDaemonDomainLookupByID: - * @xend: A xend instance - * @id: The id of the domain - * @name: return value for the name if not NULL - * @uuid: return value for the UUID if not NULL - * - * This method looks up the name of a domain based on its id - * - * Returns the 0 on success; -1 (with errno) on error - */ -int -xenDaemonDomainLookupByID(virConnectPtr xend, - int id, - char **domname, - unsigned char *uuid) -{ - const char *name = NULL; - struct sexpr *root; - - memset(uuid, 0, VIR_UUID_BUFLEN); - - root = sexpr_get(xend, "/xend/domain/%d?detail=1", id); - if (root == NULL) - goto error; - - name = sexpr_node(root, "domain/name"); - if (name == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("domain information incomplete, missing name")); - goto error; - } - if (domname) { - *domname = strdup(name); - if (*domname == NULL) { - virReportOOMError(); - goto error; - } - } - - if (sexpr_uuid(uuid, root, "domain/uuid") < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("domain information incomplete, missing uuid")); - goto error; - } - - sexpr_free(root); - return 0; - -error: - sexpr_free(root); - if (domname) - VIR_FREE(*domname); - return -1; -} - - static int xend_detect_config_version(virConnectPtr conn) { @@ -1863,38 +1806,6 @@ xenDaemonNodeGetTopology(virConnectPtr conn, virCapsPtr caps) /** - * xenDaemonLookupByID: - * @conn: pointer to the hypervisor connection - * @id: the domain ID number - * - * Try to find a domain based on the hypervisor ID number - * - * Returns a new domain object or NULL in case of failure - */ -virDomainPtr -xenDaemonLookupByID(virConnectPtr conn, int id) -{ - char *name = NULL; - unsigned char uuid[VIR_UUID_BUFLEN]; - virDomainPtr ret; - - if (xenDaemonDomainLookupByID(conn, id, &name, uuid) < 0) { - goto error; - } - - ret = virGetDomain(conn, name, uuid); - if (ret == NULL) goto error; - - ret->id = id; - VIR_FREE(name); - return ret; - - error: - VIR_FREE(name); - return NULL; -} - -/** * xenDaemonDomainSetVcpusFlags: * @domain: pointer to domain object * @nvcpus: the new number of virtual CPUs for this domain diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h index 5f82f04..e8713a7 100644 --- a/src/xen/xend_internal.h +++ b/src/xen/xend_internal.h @@ -69,19 +69,6 @@ int xenDaemonDomainLookupByName_ids(virConnectPtr xend, const char *name, unsigned char *uuid); -/** - * \brief Lookup the name of a domain - * \param xend A xend instance - * \param id The id of the domain - * \param name pointer to store a copy of the name - * \param uuid pointer to store a copy of the uuid - * - * This method looks up the name/uuid of a domain - */ -int xenDaemonDomainLookupByID(virConnectPtr xend, - int id, - char **name, unsigned char *uuid); - virDomainDefPtr xenDaemonDomainFetch(virConnectPtr xend, @@ -153,7 +140,6 @@ extern struct xenUnifiedDriver xenDaemonDriver; int xenDaemonInit (void); virDomainPtr xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc); -virDomainPtr xenDaemonLookupByID(virConnectPtr conn, int id); virDomainPtr xenDaemonLookupByUUID(virConnectPtr conn, const unsigned char *uuid); virDomainPtr 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); diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c index dbb4ae4..7926535 100644 --- a/src/xen/xs_internal.c +++ b/src/xen/xs_internal.c @@ -580,68 +580,6 @@ xenStoreListDomains(virConnectPtr conn, int *ids, int maxids) return ret; } -/** - * xenStoreLookupByName: - * @conn: A xend instance - * @name: The name of the domain - * - * Try to lookup a domain on the Xen Store based on its name. - * - * Returns a new domain object or NULL in case of failure - */ -virDomainPtr -xenStoreLookupByName(virConnectPtr conn, const char *name) -{ - virDomainPtr ret = NULL; - unsigned int num, i, len; - long id = -1; - char **idlist = NULL, *endptr; - char prop[200], *tmp; - int found = 0; - struct xend_domain *xenddomain = NULL; - xenUnifiedPrivatePtr priv = conn->privateData; - - if (priv->xshandle == NULL) - return NULL; - - idlist = xs_directory(priv->xshandle, 0, "/local/domain", &num); - if (idlist == NULL) - goto done; - - for (i = 0; i < num; i++) { - id = strtol(idlist[i], &endptr, 10); - if ((endptr == idlist[i]) || (*endptr != 0)) { - goto done; - } -#if 0 - if (virConnectCheckStoreID(conn, (int) id) < 0) - continue; -#endif - snprintf(prop, 199, "/local/domain/%s/name", idlist[i]); - prop[199] = 0; - tmp = xs_read(priv->xshandle, 0, prop, &len); - if (tmp != NULL) { - found = STREQ(name, tmp); - VIR_FREE(tmp); - if (found) - break; - } - } - if (!found) - goto done; - - ret = virGetDomain(conn, name, NULL); - if (ret == NULL) - goto done; - - ret->id = id; - -done: - VIR_FREE(xenddomain); - VIR_FREE(idlist); - - return ret; -} /** * xenStoreDomainShutdown: diff --git a/src/xen/xs_internal.h b/src/xen/xs_internal.h index 29f0165..fc7798d 100644 --- a/src/xen/xs_internal.h +++ b/src/xen/xs_internal.h @@ -43,8 +43,6 @@ int xenStoreNumOfDomains (virConnectPtr conn); int xenStoreListDomains (virConnectPtr conn, int *ids, int maxids); -virDomainPtr xenStoreLookupByName(virConnectPtr conn, - const char *name); unsigned long xenStoreGetMaxMemory (virDomainPtr domain); int xenStoreDomainSetMemory (virDomainPtr domain, unsigned long memory); -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list