+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>
* src/conf.c: add missing entry point virConfGetValue()
* src/xend_internal.c: Add handling of HTTP 500 error code
which can be returned by XenD do indicate failure error when
performing the requested operation (Identified by Pete Vetere).
-
+
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
Sat Aug 26 16:36:15 CEST 2006 Daniel Veillard <veillard@redhat.com>
virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml);
int virDomainUndefine (virDomainPtr domain);
-int virConnectListDefinedDomains(virConnectPtr conn,
+int virConnectNumOfDefinedDomains (virConnectPtr conn);
+int virConnectListDefinedDomains (virConnectPtr conn,
const char **names,
int maxnames);
int virDomainCreate (virDomainPtr domain);
virDomainPtr virDomainDefineXML (virConnectPtr conn,
const char *xml);
int virDomainUndefine (virDomainPtr domain);
-int virConnectListDefinedDomains(virConnectPtr conn,
+int virConnectNumOfDefinedDomains (virConnectPtr conn);
+int virConnectListDefinedDomains (virConnectPtr conn,
const char **names,
int maxnames);
int virDomainCreate (virDomainPtr domain);
typedef char *
(*virDrvDomainDumpXML) (virDomainPtr dom,
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
(*virDrvDomainSetVcpus) (virDomainPtr domain,
unsigned int nvcpus);
virDrvDomainPinVcpu domainPinVcpu;
virDrvDomainGetVcpus domainGetVcpus;
virDrvDomainDumpXML domainDumpXML;
+ virDrvListDefinedDomains listDefinedDomains;
+ virDrvNumOfDefinedDomains numOfDefinedDomains;
+ virDrvDomainCreate domainCreate;
+ virDrvDomainDefineXML domainDefineXML;
+ virDrvDomainUndefine domainUndefine;
};
virDomainPtr
virDomainDefineXML(virConnectPtr conn, const char *xml) {
virDomainPtr ret = NULL;
- const char *name = NULL;
- xmlDocPtr doc = NULL;
- xmlXPathObjectPtr obj = NULL;
- xmlXPathContextPtr ctxt = NULL;
+ int i;
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
return (NULL);
}
- /*
- * Check the XML description is at least well formed and extract the
- * name.
- * TODO: a full validation based on RNG for example should be done there
- */
- doc = xmlReadMemory(xml, strlen(xml), "domain_define.xml", NULL, 0);
- if (doc == NULL) {
- 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;
+ /* Go though the driver registered entry points */
+ for (i = 0;i < conn->nb_drivers;i++) {
+ if ((conn->drivers[i] != NULL) &&
+ (conn->drivers[i]->domainDefineXML != NULL)) {
+ ret = conn->drivers[i]->domainDefineXML(conn, xml);
+ if (ret)
+ return(ret);
+ }
}
- 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);
}
*/
int
virDomainUndefine(virDomainPtr domain) {
- int ret;
+ int ret, i;
+ virConnectPtr conn;
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
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__);
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);
- if (ret < 0)
- return(-1);
- return(0);
+ return(-1);
+}
+
+/**
+ * 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);
}
/**
int
virConnectListDefinedDomains(virConnectPtr conn, const char **names,
int maxnames) {
- TODO
- return(-1);
+ int ret = -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);
}
/**
*/
int
virDomainCreate(virDomainPtr domain) {
-
+ int i, ret = -1;
+ virConnectPtr conn;
+ if (domain == NULL) {
+ TODO
+ return (-1);
+ }
if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
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__);
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);
}
/**
virDomainShutdown;
virDomainReboot;
virDomainSuspend;
- virDomainUndefine;
+ virConnectListDefinedDomains;
+ virConnectNumOfDefinedDomains;
+ virDomainUndefine;
virGetVersion;
virCopyLastError;
virConnSetErrorFunc;
NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */
xenProxyDomainDumpXML, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/**
NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */
testDomainDumpXML, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/* Amount of time it takes to shutdown */
xenHypervisorPinVcpu, /* domainPinVcpu */
xenHypervisorGetVcpus, /* domainGetVcpus */
NULL, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
#endif /* !PROXY */
xenDaemonDomainPinVcpu, /* domainPinVcpu */
xenDaemonDomainGetVcpus, /* domainGetVcpus */
xenDaemonDomainDumpXML, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/**
NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */
NULL, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/**