]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Added driver backends for ListDefinedDomains, NumOfDefinedDomains, DomainStart, Domai...
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 30 Aug 2006 14:21:03 +0000 (14:21 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 30 Aug 2006 14:21:03 +0000 (14:21 +0000)
ChangeLog
include/libvirt/libvirt.h
include/libvirt/libvirt.h.in
src/driver.h
src/libvirt.c
src/libvirt_sym.version
src/proxy_internal.c
src/test.c
src/xen_internal.c
src/xend_internal.c
src/xs_internal.c

index 0512442604e7bf9b52ff58a03d7765f046dfcec9..09e0ab33bd6cdeba56b761675e12374fc0d8886f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
        * 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
        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>
index a125f8fbbe0fbfaf8cc6875f7ae9a131ec122ebb..3012995f347a1a53d0b6b8c9b23f9047b9fa093b 100644 (file)
@@ -297,7 +297,8 @@ char *                      virDomainGetXMLDesc     (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);
index c7a8fc26ce1a745fe8f8a2c6e383d87d836153e7..9e9a8b57d59277d44d3014d5549b15ecb3606077 100644 (file)
@@ -297,7 +297,8 @@ char *                      virDomainGetXMLDesc     (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);
index 260914ecbcb348ac33653549088e38d4aabce2eb..627121f03e205b41ae2a47b0e81f70f75385261e 100644 (file)
@@ -107,7 +107,18 @@ typedef int
 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 +179,11 @@ struct _virDriver {
        virDrvDomainPinVcpu             domainPinVcpu;
        virDrvDomainGetVcpus            domainGetVcpus;
        virDrvDomainDumpXML             domainDumpXML;
+       virDrvListDefinedDomains        listDefinedDomains;
+       virDrvNumOfDefinedDomains       numOfDefinedDomains;
+       virDrvDomainCreate              domainCreate;
+       virDrvDomainDefineXML           domainDefineXML;
+       virDrvDomainUndefine            domainUndefine;
 };
 
 
index b4e363eadb4f78dd5ce63cbf405f904db4ddb2e6..93e22bd1bd60698207740ca74142687deed3fe94 100644 (file)
@@ -1533,10 +1533,7 @@ virNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info) {
 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 +1548,16 @@ virDomainDefineXML(virConnectPtr conn, const char *xml) {
         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 +1571,62 @@ done:
  */
 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 +1642,30 @@ virDomainUndefine(virDomainPtr domain) {
 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 +1679,31 @@ virConnectListDefinedDomains(virConnectPtr conn, const char **names,
  */
 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);
 }
 
 /**
index e29ce78b9d8d0b624014eb5e4fede21d11eb04b5..13c743905d8895f6dfbddff88fd5814d57e86821 100644 (file)
@@ -33,7 +33,9 @@
        virDomainShutdown;
        virDomainReboot;
        virDomainSuspend;
-        virDomainUndefine;
+       virConnectListDefinedDomains;
+       virConnectNumOfDefinedDomains;
+       virDomainUndefine;
        virGetVersion;
        virCopyLastError;
        virConnSetErrorFunc;
index 419fbd6a6d4a4a0c559124ce4a43ca45b4330967..15f21fcd3eb7491ee10db15c1afb5e77e537cfd2 100644 (file)
@@ -77,6 +77,11 @@ static virDriver xenProxyDriver = {
     NULL, /* domainPinVcpu */
     NULL, /* domainGetVcpus */
     xenProxyDomainDumpXML, /* domainDumpXML */
+    NULL, /* listDefinedDomains */
+    NULL, /* numOfDefinedDomains */
+    NULL, /* domainCreate */
+    NULL, /* domainDefineXML */
+    NULL, /* domainUndefine */
 };
 
 /**
index af165f8dfb0563d987685bfe406e30efceed55bc..1ab03e4d47bd17d29ba205361c10cbd73c55eae5 100644 (file)
@@ -58,6 +58,11 @@ static virDriver testDriver = {
   NULL, /* domainPinVcpu */
   NULL, /* domainGetVcpus */
   testDomainDumpXML, /* domainDumpXML */
+  NULL, /* listDefinedDomains */
+  NULL, /* numOfDefinedDomains */
+  NULL, /* domainCreate */
+  NULL, /* domainDefineXML */
+  NULL, /* domainUndefine */
 };
 
 /* Amount of time it takes to shutdown */
index afde550423648832b1217ed1a60fa6d235274b0b..7a85d9cf12e01c73df3f5183af1b22a12d617b4d 100644 (file)
@@ -94,6 +94,11 @@ static virDriver xenHypervisorDriver = {
     xenHypervisorPinVcpu, /* domainPinVcpu */
     xenHypervisorGetVcpus, /* domainGetVcpus */
     NULL, /* domainDumpXML */
+    NULL, /* listDefinedDomains */
+    NULL, /* numOfDefinedDomains */
+    NULL, /* domainCreate */
+    NULL, /* domainDefineXML */
+    NULL, /* domainUndefine */
 };
 #endif /* !PROXY */
 
index 71a509eb0095754c56ca21dda758b64df21a8f07..ce3580b8cd39714c0c5aa5501e184d4e224cbff3 100644 (file)
@@ -88,6 +88,11 @@ static virDriver xenDaemonDriver = {
     xenDaemonDomainPinVcpu, /* domainPinVcpu */
     xenDaemonDomainGetVcpus, /* domainGetVcpus */
     xenDaemonDomainDumpXML, /* domainDumpXML */
+    NULL, /* listDefinedDomains */
+    NULL, /* numOfDefinedDomains */
+    NULL, /* domainCreate */
+    NULL, /* domainDefineXML */
+    NULL, /* domainUndefine */
 };
 
 /**
index 241cb7f7635ed4f7a878575b935fec3da45ff654..66b998e3cfdef67e9e0674b9adb0ffe5769ae149 100644 (file)
@@ -70,6 +70,11 @@ static virDriver xenStoreDriver = {
     NULL, /* domainPinVcpu */
     NULL, /* domainGetVcpus */
     NULL, /* domainDumpXML */
+    NULL, /* listDefinedDomains */
+    NULL, /* numOfDefinedDomains */
+    NULL, /* domainCreate */
+    NULL, /* domainDefineXML */
+    NULL, /* domainUndefine */
 };
 
 /**