[Libvirt-cim] [PATCH 1 of 2] (#2) Add parent_device_pool() which returns the parent pool for a given device type

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Mon May 11 17:59:10 UTC 2009


# HG changeset patch
# User Kaitlin Rupert <karupert at us.ibm.com>
# Date 1240877148 25200
# Node ID aa703f18b57160b88feef4c02df05a926709966e
# Parent  570c3507c7b2c3e55680e9a70f4889accb9a1cf7
(#2) Add parent_device_pool() which returns the parent pool for a given device type

-Updates from 1 to 2:
  -Add debug statement is enum_pools() fails or returns no instances

Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>

diff -r 570c3507c7b2 -r aa703f18b571 src/Virt_DevicePool.c
--- a/src/Virt_DevicePool.c	Tue May 05 18:08:58 2009 -0700
+++ b/src/Virt_DevicePool.c	Mon Apr 27 17:05:48 2009 -0700
@@ -77,7 +77,7 @@
                 goto out;
         }
 
-        pools[count].tag = strdup("Parent");
+        pools[count].tag = strdup("0");
         pools[count].path = NULL;
         pools[count].primordial = true;
         count++;
@@ -1234,6 +1234,45 @@
         return _get_pools(broker, reference, type, NULL, list);
 }
 
+CMPIInstance *parent_device_pool(const CMPIBroker *broker,
+                                 const CMPIObjectPath *reference,
+                                 uint16_t type,
+                                 CMPIStatus *s)
+{
+        CMPIInstance *inst = NULL;
+        const char *id = NULL;
+
+        if (type == CIM_RES_TYPE_MEM) {
+                id = "MemoryPool/0";
+        } else if (type == CIM_RES_TYPE_PROC) {
+                id = "ProcessorPool/0";
+        } else if (type == CIM_RES_TYPE_DISK) {
+                id = "DiskPool/0";
+        } else if (type == CIM_RES_TYPE_NET) {
+                id = "NetworkPool/0";
+        } else if (type == CIM_RES_TYPE_GRAPHICS) {
+                id = "GraphicsPool/0";
+        } else if (type == CIM_RES_TYPE_INPUT) {
+                id = "InputPool/0";
+        } else {
+                cu_statusf(broker, s,
+                           CMPI_RC_ERR_INVALID_PARAMETER,
+                           "No such device type `%s'", type);
+                goto out;
+        }
+
+        *s = get_pool_by_name(broker, reference, id, &inst);
+        if (inst == NULL) {
+                cu_statusf(broker, s,
+                           CMPI_RC_ERR_FAILED,
+                           "No default pool found for type %hi", type);
+        }
+
+ out:
+
+        return inst;
+}
+
 CMPIInstance *default_device_pool(const CMPIBroker *broker,
                                   const CMPIObjectPath *reference,
                                   uint16_t type,
@@ -1241,44 +1280,43 @@
 {
         CMPIInstance *inst = NULL;
         struct inst_list list;
+        bool val;
 
-        inst_list_init(&list);
+        if ((type == CIM_RES_TYPE_DISK) || (type == CIM_RES_TYPE_NET)) {
+                int i = 0;
+                CMPIrc rc;
 
-        if (type == CIM_RES_TYPE_MEM) {
-                *s = get_pool_by_name(broker, reference, "MemoryPool/0", &inst);
-        } else if (type == CIM_RES_TYPE_PROC) {
-                *s = get_pool_by_name(broker, reference, "ProcessorPool/0", &inst);
-        } else if (type == CIM_RES_TYPE_DISK) {
+                inst_list_init(&list);
+
                 *s = enum_pools(broker, reference, type, &list);
-                if ((s->rc == CMPI_RC_OK) && (list.cur > 0))
-                        inst = list.list[0];
-        } else if (type == CIM_RES_TYPE_NET) {
-                *s = enum_pools(broker, reference, type, &list);
-                if ((s->rc == CMPI_RC_OK) && (list.cur > 0))
-                        inst = list.list[0];
-        } else if (type == CIM_RES_TYPE_GRAPHICS) {
-                *s = get_pool_by_name(broker, 
-                                      reference, 
-                                      "GraphicsPool/0", 
-                                      &inst);
-        } else if (type == CIM_RES_TYPE_INPUT) {
-                *s = get_pool_by_name(broker, 
-                                      reference, 
-                                      "InputPool/0", 
-                                      &inst);
+                if ((s->rc != CMPI_RC_OK) || (list.cur <= 0)) {
+                        CU_DEBUG("Unable to enum pools to get parent pool");
+                        goto out;
+                }
+
+                for (i = 0; i < list.cur; i++) {
+                        rc = cu_get_bool_prop(list.list[i], 
+                                              "Primordial", 
+                                              &val);
+                        if ((rc != CMPI_RC_OK) || (val))
+                                continue;
+
+                        inst = list.list[i];
+                        break;
+                }
+
+                inst_list_free(&list);
+
+                if (inst == NULL) {
+                        cu_statusf(broker, s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "No default pool found for type %hi", type);
+                }
         } else {
-                cu_statusf(broker, s,
-                           CMPI_RC_ERR_INVALID_PARAMETER,
-                           "No such device type `%s'", type);
+                inst = parent_device_pool(broker, reference, type, s);
         }
 
-        inst_list_free(&list);
-
-        if (inst == NULL) {
-                cu_statusf(broker, s,
-                           CMPI_RC_ERR_FAILED,
-                           "No default pool found for type %hi", type);
-        }
+ out:
 
         return inst;
 }
diff -r 570c3507c7b2 -r aa703f18b571 src/Virt_DevicePool.h
--- a/src/Virt_DevicePool.h	Tue May 05 18:08:58 2009 -0700
+++ b/src/Virt_DevicePool.h	Mon Apr 27 17:05:48 2009 -0700
@@ -106,6 +106,20 @@
                             CMPIInstance **_inst);
 
 /**
+ * Get the parent pool for a given device type
+ *
+ * @param broker A pointer to the current broker
+ * @param ref The object path containing namespace and prefix info
+ * @param type The device type in question
+ * @param status The returned status
+ * @returns Parent pool instance
+ */
+CMPIInstance *parent_device_pool(const CMPIBroker *broker,
+                                 const CMPIObjectPath *reference,
+                                 uint16_t type,
+                                 CMPIStatus *s);
+
+/**
  * Get the default pool for a given device type
  *
  * @param broker A pointer to the current broker




More information about the Libvirt-cim mailing list