Added driver backends for ListDefinedDomains, NumOfDefinedDomains, DomainStart, DomainDefineXML, DomainUndefine & hooked up all related infrastructure

This commit is contained in:
Daniel P. Berrange 2006-08-30 14:21:03 +00:00
parent c0b1a946a6
commit 25726a0ff4
11 changed files with 161 additions and 86 deletions

View File

@ -1,3 +1,16 @@
Tue Aug 29 23:48:43 CEST 2006 Daniel Veillard <veillard@redhat.com>
* src/driver.h: Defined new driver entry points for ListDefinedDomains,
NumOfDefinedDomains, DomainStart, DomainUndefine, DomainDefineXML.
* src/xen_internal.c, src/xend_internal.c, src/xs_internal.h,
src/test.c, src/proxy_internal.c: Added NULL entries for new driver
backend APIs.
* src/libvirt.c: Hook up new driver entry points to corresponding
public API.
* src/libvirt_sym.version: Added virConnectNumOfDefinedDomains and
previously missing virConnectListDefinedDomains
* include/libvirt/libvirt.h: Added virConnectNumOfDefinedDomains
Tue Aug 29 23:48:43 CEST 2006 Daniel Veillard <veillard@redhat.com> Tue Aug 29 23:48:43 CEST 2006 Daniel Veillard <veillard@redhat.com>
* src/conf.c: add missing entry point virConfGetValue() * src/conf.c: add missing entry point virConfGetValue()
@ -17,10 +30,10 @@ Tue Aug 29 13:14:20 EDT 2006 Daniel Berrange <berrange@redhat.com>
* src/xend_internal.c: Add handling of HTTP 500 error code * src/xend_internal.c: Add handling of HTTP 500 error code
which can be returned by XenD do indicate failure error when which can be returned by XenD do indicate failure error when
performing the requested operation (Identified by Pete Vetere). performing the requested operation (Identified by Pete Vetere).
Tue Aug 29 15:41:46 CEST 2006 Daniel Veillard <veillard@redhat.com> Tue Aug 29 15:41:46 CEST 2006 Daniel Veillard <veillard@redhat.com>
* python/libvir.c: Pete Vetere pointed out a bug in string cast * python/libvir.c: Pete Vetere pointed out a bug in string cast
when handling errors in Python when handling errors in Python
Sat Aug 26 16:36:15 CEST 2006 Daniel Veillard <veillard@redhat.com> Sat Aug 26 16:36:15 CEST 2006 Daniel Veillard <veillard@redhat.com>

View File

@ -297,7 +297,8 @@ char * virDomainGetXMLDesc (virDomainPtr domain,
virDomainPtr virDomainDefineXML (virConnectPtr conn, virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml); const char *xml);
int virDomainUndefine (virDomainPtr domain); int virDomainUndefine (virDomainPtr domain);
int virConnectListDefinedDomains(virConnectPtr conn, int virConnectNumOfDefinedDomains (virConnectPtr conn);
int virConnectListDefinedDomains (virConnectPtr conn,
const char **names, const char **names,
int maxnames); int maxnames);
int virDomainCreate (virDomainPtr domain); int virDomainCreate (virDomainPtr domain);

View File

@ -297,7 +297,8 @@ char * virDomainGetXMLDesc (virDomainPtr domain,
virDomainPtr virDomainDefineXML (virConnectPtr conn, virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml); const char *xml);
int virDomainUndefine (virDomainPtr domain); int virDomainUndefine (virDomainPtr domain);
int virConnectListDefinedDomains(virConnectPtr conn, int virConnectNumOfDefinedDomains (virConnectPtr conn);
int virConnectListDefinedDomains (virConnectPtr conn,
const char **names, const char **names,
int maxnames); int maxnames);
int virDomainCreate (virDomainPtr domain); int virDomainCreate (virDomainPtr domain);

View File

@ -107,7 +107,18 @@ typedef int
typedef char * typedef char *
(*virDrvDomainDumpXML) (virDomainPtr dom, (*virDrvDomainDumpXML) (virDomainPtr dom,
int flags); int flags);
typedef int
(*virDrvListDefinedDomains) (virConnectPtr conn,
const char **names,
int maxnames);
typedef int
(*virDrvNumOfDefinedDomains) (virConnectPtr conn);
typedef int
(*virDrvDomainCreate) (virDomainPtr dom);
typedef virDomainPtr
(*virDrvDomainDefineXML)(virConnectPtr conn, const char *xml);
typedef int
(*virDrvDomainUndefine) (virDomainPtr dom);
typedef int typedef int
(*virDrvDomainSetVcpus) (virDomainPtr domain, (*virDrvDomainSetVcpus) (virDomainPtr domain,
unsigned int nvcpus); unsigned int nvcpus);
@ -168,6 +179,11 @@ struct _virDriver {
virDrvDomainPinVcpu domainPinVcpu; virDrvDomainPinVcpu domainPinVcpu;
virDrvDomainGetVcpus domainGetVcpus; virDrvDomainGetVcpus domainGetVcpus;
virDrvDomainDumpXML domainDumpXML; virDrvDomainDumpXML domainDumpXML;
virDrvListDefinedDomains listDefinedDomains;
virDrvNumOfDefinedDomains numOfDefinedDomains;
virDrvDomainCreate domainCreate;
virDrvDomainDefineXML domainDefineXML;
virDrvDomainUndefine domainUndefine;
}; };

View File

@ -1533,10 +1533,7 @@ virNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info) {
virDomainPtr virDomainPtr
virDomainDefineXML(virConnectPtr conn, const char *xml) { virDomainDefineXML(virConnectPtr conn, const char *xml) {
virDomainPtr ret = NULL; virDomainPtr ret = NULL;
const char *name = NULL; int i;
xmlDocPtr doc = NULL;
xmlXPathObjectPtr obj = NULL;
xmlXPathContextPtr ctxt = NULL;
if (!VIR_IS_CONNECT(conn)) { if (!VIR_IS_CONNECT(conn)) {
virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__); virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
@ -1551,72 +1548,16 @@ virDomainDefineXML(virConnectPtr conn, const char *xml) {
return (NULL); return (NULL);
} }
/* /* Go though the driver registered entry points */
* Check the XML description is at least well formed and extract the for (i = 0;i < conn->nb_drivers;i++) {
* name. if ((conn->drivers[i] != NULL) &&
* TODO: a full validation based on RNG for example should be done there (conn->drivers[i]->domainDefineXML != NULL)) {
*/ ret = conn->drivers[i]->domainDefineXML(conn, xml);
doc = xmlReadMemory(xml, strlen(xml), "domain_define.xml", NULL, 0); if (ret)
if (doc == NULL) { return(ret);
virLibConnError(conn, VIR_ERR_XML_ERROR, __FUNCTION__); }
goto done;
} }
ctxt = xmlXPathNewContext(doc);
if (ctxt == NULL) {
goto done;
}
obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt);
if ((obj == NULL) || (obj->type != XPATH_STRING) ||
(obj->stringval == NULL) || (obj->stringval[0] == 0)) {
virLibConnError(conn, VIR_ERR_NO_NAME, xml);
goto done;
}
name = (const char *) obj->stringval;
/*
* Now look it up in the domain pool and check it's not an already run
* domain.
*/
ret = virGetDomain(conn, name, NULL);
if (ret == NULL) {
goto done;
}
/*
* TODO: the lifecycle of domains, especially predefined ones need to be
* explicitely written down
*/
if (ret->handle != -1) {
virLibConnError(conn, VIR_ERR_DOM_EXIST, name);
virFreeDomain(conn, ret);
ret = NULL;
goto done;
}
if ((ret->uses > 1) && (!(ret->flags & DOMAIN_IS_DEFINED))) {
virLibConnError(conn, VIR_ERR_DOM_EXIST, name);
virFreeDomain(conn, ret);
ret = NULL;
goto done;
}
ret->flags |= DOMAIN_IS_DEFINED;
if (ret->xml != NULL) {
free(ret->xml);
}
ret->xml = strdup(xml);
if (ret->xml == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
virFreeDomain(conn, ret);
ret = NULL;
goto done;
}
/* TODO shall we keep a list of defined domains there ? */
done:
if (obj != NULL)
xmlXPathFreeObject(obj);
if (ctxt != NULL)
xmlXPathFreeContext(ctxt);
if (doc != NULL)
xmlFreeDoc(doc);
return(ret); return(ret);
} }
@ -1630,23 +1571,62 @@ done:
*/ */
int int
virDomainUndefine(virDomainPtr domain) { virDomainUndefine(virDomainPtr domain) {
int ret; int ret, i;
virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
if (domain->conn->flags & VIR_CONNECT_RO) { conn = domain->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__); virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
return (-1); return (-1);
} }
/* TODO shall we keep a list of defined domains there ? */ /* Go though the driver registered entry points */
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainUndefine != NULL)) {
ret = conn->drivers[i]->domainUndefine(domain);
if (ret >= 0)
return(ret);
}
}
ret = virFreeDomain(domain->conn, domain); return(-1);
if (ret < 0) }
return(-1);
return(0); /**
* virConnectNumOfDefinedDomains:
* @conn: pointer to the hypervisor connection
*
* Provides the number of active domains.
*
* Returns the number of domain found or -1 in case of error
*/
int
virConnectNumOfDefinedDomains(virConnectPtr conn)
{
int ret = -1;
int i;
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
return (-1);
}
/* Go though the driver registered entry points */
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->numOfDefinedDomains != NULL)) {
ret = conn->drivers[i]->numOfDefinedDomains(conn);
if (ret >= 0)
return(ret);
}
}
return(-1);
} }
/** /**
@ -1662,8 +1642,30 @@ virDomainUndefine(virDomainPtr domain) {
int int
virConnectListDefinedDomains(virConnectPtr conn, const char **names, virConnectListDefinedDomains(virConnectPtr conn, const char **names,
int maxnames) { int maxnames) {
TODO int ret = -1;
return(-1); int i;
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
return (-1);
}
if ((names == NULL) || (maxnames <= 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
return (-1);
}
/* Go though the driver registered entry points */
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->listDefinedDomains != NULL)) {
ret = conn->drivers[i]->listDefinedDomains(conn, names, maxnames);
if (ret >= 0)
return(ret);
}
}
return (-1);
} }
/** /**
@ -1677,16 +1679,31 @@ virConnectListDefinedDomains(virConnectPtr conn, const char **names,
*/ */
int int
virDomainCreate(virDomainPtr domain) { virDomainCreate(virDomainPtr domain) {
int i, ret = -1;
virConnectPtr conn;
if (domain == NULL) {
TODO
return (-1);
}
if (!VIR_IS_CONNECTED_DOMAIN(domain)) { if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__); virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
return (-1); return (-1);
} }
if (domain->conn->flags & VIR_CONNECT_RO) { conn = domain->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__); virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
return (-1); return (-1);
} }
return(-1);
for (i = 0;i < conn->nb_drivers;i++) {
if ((conn->drivers[i] != NULL) &&
(conn->drivers[i]->domainCreate != NULL)) {
ret = conn->drivers[i]->domainCreate(domain);
if (ret == 0)
return(ret);
}
}
return(ret);
} }
/** /**

View File

@ -33,7 +33,9 @@
virDomainShutdown; virDomainShutdown;
virDomainReboot; virDomainReboot;
virDomainSuspend; virDomainSuspend;
virDomainUndefine; virConnectListDefinedDomains;
virConnectNumOfDefinedDomains;
virDomainUndefine;
virGetVersion; virGetVersion;
virCopyLastError; virCopyLastError;
virConnSetErrorFunc; virConnSetErrorFunc;

View File

@ -77,6 +77,11 @@ static virDriver xenProxyDriver = {
NULL, /* domainPinVcpu */ NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */ NULL, /* domainGetVcpus */
xenProxyDomainDumpXML, /* domainDumpXML */ xenProxyDomainDumpXML, /* domainDumpXML */
NULL, /* listDefinedDomains */
NULL, /* numOfDefinedDomains */
NULL, /* domainCreate */
NULL, /* domainDefineXML */
NULL, /* domainUndefine */
}; };
/** /**

View File

@ -58,6 +58,11 @@ static virDriver testDriver = {
NULL, /* domainPinVcpu */ NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */ NULL, /* domainGetVcpus */
testDomainDumpXML, /* domainDumpXML */ testDomainDumpXML, /* domainDumpXML */
NULL, /* listDefinedDomains */
NULL, /* numOfDefinedDomains */
NULL, /* domainCreate */
NULL, /* domainDefineXML */
NULL, /* domainUndefine */
}; };
/* Amount of time it takes to shutdown */ /* Amount of time it takes to shutdown */

View File

@ -94,6 +94,11 @@ static virDriver xenHypervisorDriver = {
xenHypervisorPinVcpu, /* domainPinVcpu */ xenHypervisorPinVcpu, /* domainPinVcpu */
xenHypervisorGetVcpus, /* domainGetVcpus */ xenHypervisorGetVcpus, /* domainGetVcpus */
NULL, /* domainDumpXML */ NULL, /* domainDumpXML */
NULL, /* listDefinedDomains */
NULL, /* numOfDefinedDomains */
NULL, /* domainCreate */
NULL, /* domainDefineXML */
NULL, /* domainUndefine */
}; };
#endif /* !PROXY */ #endif /* !PROXY */

View File

@ -88,6 +88,11 @@ static virDriver xenDaemonDriver = {
xenDaemonDomainPinVcpu, /* domainPinVcpu */ xenDaemonDomainPinVcpu, /* domainPinVcpu */
xenDaemonDomainGetVcpus, /* domainGetVcpus */ xenDaemonDomainGetVcpus, /* domainGetVcpus */
xenDaemonDomainDumpXML, /* domainDumpXML */ xenDaemonDomainDumpXML, /* domainDumpXML */
NULL, /* listDefinedDomains */
NULL, /* numOfDefinedDomains */
NULL, /* domainCreate */
NULL, /* domainDefineXML */
NULL, /* domainUndefine */
}; };
/** /**

View File

@ -70,6 +70,11 @@ static virDriver xenStoreDriver = {
NULL, /* domainPinVcpu */ NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */ NULL, /* domainGetVcpus */
NULL, /* domainDumpXML */ NULL, /* domainDumpXML */
NULL, /* listDefinedDomains */
NULL, /* numOfDefinedDomains */
NULL, /* domainCreate */
NULL, /* domainDefineXML */
NULL, /* domainUndefine */
}; };
/** /**