# HG changeset patch
# User Kaitlin Rupert <karupert(a)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(a)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