[libvirt] [PATCH 3/5] test: Implement node device driver.

Cole Robinson crobinso at redhat.com
Fri Oct 2 16:05:03 UTC 2009


Add a simple 'computer' device for the default driver. Only implement
the basic calls, no creation or destroy happening.

Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/test/test_driver.c |  253 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 253 insertions(+), 0 deletions(-)

diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index f57c92a..2a413ee 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -46,6 +46,7 @@
 #include "domain_event.h"
 #include "event.h"
 #include "storage_conf.h"
+#include "node_device_conf.h"
 #include "xml.h"
 #include "threads.h"
 #include "logging.h"
@@ -75,6 +76,7 @@ struct _testConn {
     virNetworkObjList networks;
     virInterfaceObjList ifaces;
     virStoragePoolObjList pools;
+    virNodeDeviceObjList devs;
     int numCells;
     testCell cells[MAX_CELLS];
 
@@ -223,6 +225,24 @@ static const char *defaultPoolXML =
 "  </target>"
 "</pool>";
 
+static const char *defaultNodeXML =
+"<device>"
+"  <name>computer</name>"
+"  <capability type='system'>"
+"    <hardware>"
+"      <vendor>Libvirt</vendor>"
+"      <version>Test driver</version>"
+"      <serial>123456</serial>"
+"      <uuid>11111111-2222-3333-4444-555555555555</uuid>"
+"    </hardware>"
+"    <firmware>"
+"      <vendor>Libvirt</vendor>"
+"      <version>Test Driver</version>"
+"      <release_date>01/22/2007</release_date>"
+"    </firmware>"
+"  </capability>"
+"</device>";
+
 static const unsigned long long defaultPoolCap = (100 * 1024 * 1024 * 1024ull);
 static const unsigned long long defaultPoolAlloc = 0;
 
@@ -295,6 +315,8 @@ static int testOpenDefault(virConnectPtr conn) {
     virInterfaceObjPtr interfaceobj = NULL;
     virStoragePoolDefPtr pooldef = NULL;
     virStoragePoolObjPtr poolobj = NULL;
+    virNodeDeviceDefPtr nodedef = NULL;
+    virNodeDeviceObjPtr nodeobj = NULL;
 
     if (VIR_ALLOC(privconn) < 0) {
         virReportOOMError(conn);
@@ -382,6 +404,16 @@ static int testOpenDefault(virConnectPtr conn) {
     poolobj->active = 1;
     virStoragePoolObjUnlock(poolobj);
 
+    /* Init default node device */
+    if (!(nodedef = virNodeDeviceDefParseString(conn, defaultNodeXML, 0)))
+        goto error;
+    if (!(nodeobj = virNodeDeviceAssignDef(conn, &privconn->devs,
+                                           nodedef))) {
+        virNodeDeviceDefFree(nodedef);
+        goto error;
+    }
+    virNodeDeviceObjUnlock(nodeobj);
+
     testDriverUnlock(privconn);
 
     return VIR_DRV_OPEN_SUCCESS;
@@ -391,6 +423,7 @@ error:
     virNetworkObjListFree(&privconn->networks);
     virInterfaceObjListFree(&privconn->ifaces);
     virStoragePoolObjListFree(&privconn->pools);
+    virNodeDeviceObjListFree(&privconn->devs);
     virCapabilitiesFree(privconn->caps);
     testDriverUnlock(privconn);
     conn->privateData = NULL;
@@ -4072,6 +4105,7 @@ cleanup:
 }
 
 
+/* Node device implementations */
 static virDrvOpenStatus testDevMonOpen(virConnectPtr conn,
                                        virConnectAuthPtr auth ATTRIBUTE_UNUSED,
                                        int flags ATTRIBUTE_UNUSED) {
@@ -4087,8 +4121,217 @@ static int testDevMonClose(virConnectPtr conn) {
     return 0;
 }
 
+static int
+testNodeNumOfDevices(virConnectPtr conn,
+                     const char *cap,
+                     unsigned int flags ATTRIBUTE_UNUSED)
+{
+    testConnPtr driver = conn->privateData;
+    int ndevs = 0;
+    unsigned int i;
+
+    testDriverLock(driver);
+    for (i = 0; i < driver->devs.count; i++)
+        if ((cap == NULL) ||
+            virNodeDeviceHasCap(driver->devs.objs[i], cap))
+            ++ndevs;
+    testDriverUnlock(driver);
+
+    return ndevs;
+}
+
+static int
+testNodeListDevices(virConnectPtr conn,
+                    const char *cap,
+                    char **const names,
+                    int maxnames,
+                    unsigned int flags ATTRIBUTE_UNUSED)
+{
+    testConnPtr driver = conn->privateData;
+    int ndevs = 0;
+    unsigned int i;
+
+    testDriverLock(driver);
+    for (i = 0; i < driver->devs.count && ndevs < maxnames; i++) {
+        virNodeDeviceObjLock(driver->devs.objs[i]);
+        if (cap == NULL ||
+            virNodeDeviceHasCap(driver->devs.objs[i], cap)) {
+            if ((names[ndevs++] = strdup(driver->devs.objs[i]->def->name)) == NULL) {
+                virNodeDeviceObjUnlock(driver->devs.objs[i]);
+                goto failure;
+            }
+        }
+        virNodeDeviceObjUnlock(driver->devs.objs[i]);
+    }
+    testDriverUnlock(driver);
+
+    return ndevs;
+
+ failure:
+    testDriverUnlock(driver);
+    --ndevs;
+    while (--ndevs >= 0)
+        VIR_FREE(names[ndevs]);
+    return -1;
+}
+
+static virNodeDevicePtr
+testNodeDeviceLookupByName(virConnectPtr conn, const char *name)
+{
+    testConnPtr driver = conn->privateData;
+    virNodeDeviceObjPtr obj;
+    virNodeDevicePtr ret = NULL;
+
+    testDriverLock(driver);
+    obj = virNodeDeviceFindByName(&driver->devs, name);
+    testDriverUnlock(driver);
+
+    if (!obj) {
+        virNodeDeviceReportError(conn, VIR_ERR_NO_NODE_DEVICE, NULL);
+        goto cleanup;
+    }
+
+    ret = virGetNodeDevice(conn, name);
+
+cleanup:
+    if (obj)
+        virNodeDeviceObjUnlock(obj);
+    return ret;
+}
+
+static char *
+testNodeDeviceDumpXML(virNodeDevicePtr dev,
+                      unsigned int flags ATTRIBUTE_UNUSED)
+{
+    testConnPtr driver = dev->conn->privateData;
+    virNodeDeviceObjPtr obj;
+    char *ret = NULL;
+
+    testDriverLock(driver);
+    obj = virNodeDeviceFindByName(&driver->devs, dev->name);
+    testDriverUnlock(driver);
+
+    if (!obj) {
+        virNodeDeviceReportError(dev->conn, VIR_ERR_NO_NODE_DEVICE,
+                                _("no node device with matching name '%s'"),
+                                 dev->name);
+        goto cleanup;
+    }
+
+    ret = virNodeDeviceDefFormat(dev->conn, obj->def);
+
+cleanup:
+    if (obj)
+        virNodeDeviceObjUnlock(obj);
+    return ret;
+}
+
+static char *
+testNodeDeviceGetParent(virNodeDevicePtr dev)
+{
+    testConnPtr driver = dev->conn->privateData;
+    virNodeDeviceObjPtr obj;
+    char *ret = NULL;
+
+    testDriverLock(driver);
+    obj = virNodeDeviceFindByName(&driver->devs, dev->name);
+    testDriverUnlock(driver);
+
+    if (!obj) {
+        virNodeDeviceReportError(dev->conn, VIR_ERR_NO_NODE_DEVICE,
+                                _("no node device with matching name '%s'"),
+                                 dev->name);
+        goto cleanup;
+    }
+
+    if (obj->def->parent) {
+        ret = strdup(obj->def->parent);
+        if (!ret)
+            virReportOOMError(dev->conn);
+    } else {
+        virNodeDeviceReportError(dev->conn, VIR_ERR_INTERNAL_ERROR,
+                                 "%s", _("no parent for this device"));
+    }
+
+cleanup:
+    if (obj)
+        virNodeDeviceObjUnlock(obj);
+    return ret;
+}
+
 
 static int
+testNodeDeviceNumOfCaps(virNodeDevicePtr dev)
+{
+    testConnPtr driver = dev->conn->privateData;
+    virNodeDeviceObjPtr obj;
+    virNodeDevCapsDefPtr caps;
+    int ncaps = 0;
+    int ret = -1;
+
+    testDriverLock(driver);
+    obj = virNodeDeviceFindByName(&driver->devs, dev->name);
+    testDriverUnlock(driver);
+
+    if (!obj) {
+        virNodeDeviceReportError(dev->conn, VIR_ERR_NO_NODE_DEVICE,
+                                _("no node device with matching name '%s'"),
+                                 dev->name);
+        goto cleanup;
+    }
+
+    for (caps = obj->def->caps; caps; caps = caps->next)
+        ++ncaps;
+    ret = ncaps;
+
+cleanup:
+    if (obj)
+        virNodeDeviceObjUnlock(obj);
+    return ret;
+}
+
+
+static int
+testNodeDeviceListCaps(virNodeDevicePtr dev, char **const names, int maxnames)
+{
+    testConnPtr driver = dev->conn->privateData;
+    virNodeDeviceObjPtr obj;
+    virNodeDevCapsDefPtr caps;
+    int ncaps = 0;
+    int ret = -1;
+
+    testDriverLock(driver);
+    obj = virNodeDeviceFindByName(&driver->devs, dev->name);
+    testDriverUnlock(driver);
+
+    if (!obj) {
+        virNodeDeviceReportError(dev->conn, VIR_ERR_NO_NODE_DEVICE,
+                                _("no node device with matching name '%s'"),
+                                 dev->name);
+        goto cleanup;
+    }
+
+    for (caps = obj->def->caps; caps && ncaps < maxnames; caps = caps->next) {
+        names[ncaps] = strdup(virNodeDevCapTypeToString(caps->type));
+        if (names[ncaps++] == NULL)
+            goto cleanup;
+    }
+    ret = ncaps;
+
+cleanup:
+    if (obj)
+        virNodeDeviceObjUnlock(obj);
+    if (ret == -1) {
+        --ncaps;
+        while (--ncaps >= 0)
+            VIR_FREE(names[ncaps]);
+    }
+    return ret;
+}
+
+
+/* Domain event implementations */
+static int
 testDomainEventRegister (virConnectPtr conn,
                          virConnectDomainEventCallback callback,
                          void *opaque,
@@ -4352,6 +4595,16 @@ static virDeviceMonitor testDevMonitor = {
     .name = "Test",
     .open = testDevMonOpen,
     .close = testDevMonClose,
+
+    .numOfDevices = testNodeNumOfDevices,
+    .listDevices = testNodeListDevices,
+    .deviceLookupByName = testNodeDeviceLookupByName,
+    .deviceDumpXML = testNodeDeviceDumpXML,
+    .deviceGetParent = testNodeDeviceGetParent,
+    .deviceNumOfCaps = testNodeDeviceNumOfCaps,
+    .deviceListCaps = testNodeDeviceListCaps,
+    //.deviceCreateXML = nodeDeviceCreateXML;
+    //.deviceDestroy = nodeDeviceDestroy;
 };
 
 static virSecretDriver testSecretDriver = {
-- 
1.6.5.rc2




More information about the libvir-list mailing list