[Libvir] [QEMU 1/3] hook up driver methods for inactive domains
Daniel P. Berrange
berrange at redhat.com
Sun Aug 27 23:17:46 UTC 2006
Attaching the patch this time :-)
Dan.
On Mon, Aug 28, 2006 at 12:15:40AM +0100, Daniel P. Berrange wrote:
>
> The attached patch prepares the driver method API to support inactive
> domains. The following methods are hooked up:
>
> * virConnectListDefinedDomains
> * virConnectNumOfDefinedDomains
> * virDomainDefineXML
> * virDomainUndefine
> * virDomainCreate
>
> It sets all existing drivers to have NULL in these fields.
>
> The existing code in virDomainDefineXML was ripped out since it was found
> to be more trouble than it was worth - the backend driver needed to repeat
> most of the logic anyway - so better just to delegate the whole lot.
>
> Regards,
> Dan.
> --
> |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
> |=- Perl modules: http://search.cpan.org/~danberr/ -=|
> |=- Projects: http://freshmeat.net/~danielpb/ -=|
> |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
>
> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
-------------- next part --------------
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/include/libvirt/libvirt.h libvirt-new/include/libvirt/libvirt.h
--- libvirt-orig/include/libvirt/libvirt.h 2006-08-27 18:25:35.000000000 -0400
+++ libvirt-new/include/libvirt/libvirt.h 2006-08-27 18:25:25.000000000 -0400
@@ -297,7 +297,8 @@
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);
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/include/libvirt/libvirt.h.in libvirt-new/include/libvirt/libvirt.h.in
--- libvirt-orig/include/libvirt/libvirt.h.in 2006-08-16 13:58:23.000000000 -0400
+++ libvirt-new/include/libvirt/libvirt.h.in 2006-08-27 17:11:08.000000000 -0400
@@ -297,7 +297,8 @@
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);
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/driver.h libvirt-new/src/driver.h
--- libvirt-orig/src/driver.h 2006-08-09 11:21:16.000000000 -0400
+++ libvirt-new/src/driver.h 2006-08-27 17:05:39.000000000 -0400
@@ -107,7 +108,18 @@
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);
@@ -168,6 +180,11 @@
virDrvDomainPinVcpu domainPinVcpu;
virDrvDomainGetVcpus domainGetVcpus;
virDrvDomainDumpXML domainDumpXML;
+ virDrvListDefinedDomains listDefinedDomains;
+ virDrvNumOfDefinedDomains numOfDefinedDomains;
+ virDrvDomainCreate domainCreate;
+ virDrvDomainDefineXML domainDefineXML;
+ virDrvDomainUndefine domainUndefine;
};
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/libvirt.c libvirt-new/src/libvirt.c
--- libvirt-orig/src/libvirt.c 2006-08-16 12:29:46.000000000 -0400
+++ libvirt-new/src/libvirt.c 2006-08-27 17:05:39.000000000 -0400
@@ -1533,10 +1536,7 @@
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__);
@@ -1551,72 +1551,16 @@
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);
}
@@ -1630,23 +1574,62 @@
*/
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);
}
/**
@@ -1662,8 +1645,30 @@
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);
}
/**
@@ -1677,16 +1682,31 @@
*/
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);
}
/**
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/libvirt_sym.version libvirt-new/src/libvirt_sym.version
--- libvirt-orig/src/libvirt_sym.version 2006-08-04 06:41:05.000000000 -0400
+++ libvirt-new/src/libvirt_sym.version 2006-08-27 17:05:39.000000000 -0400
@@ -33,7 +33,9 @@
virDomainShutdown;
virDomainReboot;
virDomainSuspend;
- virDomainUndefine;
+ virConnectListDefinedDomains;
+ virConnectNumOfDefinedDomains;
+ virDomainUndefine;
virGetVersion;
virCopyLastError;
virConnSetErrorFunc;
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/proxy_internal.c libvirt-new/src/proxy_internal.c
--- libvirt-orig/src/proxy_internal.c 2006-08-16 13:58:23.000000000 -0400
+++ libvirt-new/src/proxy_internal.c 2006-08-27 17:05:39.000000000 -0400
@@ -77,6 +77,11 @@
NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */
xenProxyDomainDumpXML, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/**
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/test.c libvirt-new/src/test.c
--- libvirt-orig/src/test.c 2006-08-16 13:58:23.000000000 -0400
+++ libvirt-new/src/test.c 2006-08-27 17:05:39.000000000 -0400
@@ -58,6 +58,11 @@
NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */
testDomainDumpXML, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/* Amount of time it takes to shutdown */
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/xend_internal.c libvirt-new/src/xend_internal.c
--- libvirt-orig/src/xend_internal.c 2006-08-26 11:30:44.000000000 -0400
+++ libvirt-new/src/xend_internal.c 2006-08-27 17:05:39.000000000 -0400
@@ -88,6 +88,11 @@
xenDaemonDomainPinVcpu, /* domainPinVcpu */
xenDaemonDomainGetVcpus, /* domainGetVcpus */
xenDaemonDomainDumpXML, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/**
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/xen_internal.c libvirt-new/src/xen_internal.c
--- libvirt-orig/src/xen_internal.c 2006-08-09 11:21:16.000000000 -0400
+++ libvirt-new/src/xen_internal.c 2006-08-27 17:06:37.000000000 -0400
@@ -94,6 +94,11 @@
xenHypervisorPinVcpu, /* domainPinVcpu */
xenHypervisorGetVcpus, /* domainGetVcpus */
NULL, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
#endif /* !PROXY */
diff --exclude docs --exclude .deps --exclude CVS -ruN libvirt-orig/src/xs_internal.c libvirt-new/src/xs_internal.c
--- libvirt-orig/src/xs_internal.c 2006-08-24 11:05:19.000000000 -0400
+++ libvirt-new/src/xs_internal.c 2006-08-27 17:05:39.000000000 -0400
@@ -70,6 +70,11 @@
NULL, /* domainPinVcpu */
NULL, /* domainGetVcpus */
NULL, /* domainDumpXML */
+ NULL, /* listDefinedDomains */
+ NULL, /* numOfDefinedDomains */
+ NULL, /* domainCreate */
+ NULL, /* domainDefineXML */
+ NULL, /* domainUndefine */
};
/**
More information about the libvir-list
mailing list