[Libvirt-cim] [PATCH 2 of 2] EAFP between parent and child pools

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Thu May 7 00:37:06 UTC 2009


# HG changeset patch
# User Kaitlin Rupert <karupert at us.ibm.com>
# Date 1240877148 25200
# Node ID 5608b9455cd32fccbc324cd540c509d7230a113f
# Parent  e132a8e94381d218d39eb2fffc94b27a438abb32
EAFP between parent and child pools.

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

diff -r e132a8e94381 -r 5608b9455cd3 src/Virt_ElementAllocatedFromPool.c
--- a/src/Virt_ElementAllocatedFromPool.c	Mon Apr 27 17:05:48 2009 -0700
+++ b/src/Virt_ElementAllocatedFromPool.c	Mon Apr 27 17:05:48 2009 -0700
@@ -89,18 +89,27 @@
         free(poolid);
 
         return s;
+
 }
 
-static int filter_by_pool(struct inst_list *dest,
-                          struct inst_list *src,
-                          const uint16_t type,
-                          const char *_poolid)
+static CMPIStatus get_dev_from_pool(const CMPIObjectPath *ref,
+                                    const uint16_t type,
+                                    const char *_poolid,
+                                    struct inst_list *list)
 {
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        char *poolid = NULL;
+        struct inst_list tmp;
         int i;
-        char *poolid = NULL;
 
-        for (i = 0; i < src->cur; i++) {
-                CMPIInstance *inst = src->list[i];
+        inst_list_init(&tmp);
+
+        s = enum_devices(_BROKER, ref, NULL, type, &tmp);
+        if (s.rc != CMPI_RC_OK)
+                goto out;
+
+        for (i = 0; i < tmp.cur; i++) {
+                CMPIInstance *inst = tmp.list[i];
                 const char *cn = NULL;
                 const char *dev_id = NULL;
 
@@ -112,21 +121,76 @@
 
                 poolid = pool_member_of(_BROKER, cn, type, dev_id);
                 if (poolid && STREQ(poolid, _poolid))
-                        inst_list_add(dest, inst);
+                        inst_list_add(list, inst);
         }
 
-        return dest->cur;
+        inst_list_free(&tmp);
+
+ out:
+
+        return s;
 }
 
-static CMPIStatus pool_to_vdev(const CMPIObjectPath *ref,
-                               struct std_assoc_info *info,
-                               struct inst_list *list)
+static CMPIStatus get_pools(const CMPIObjectPath *ref,
+                            const uint16_t type,
+                            const char *poolid,
+                            CMPIInstance *pool_inst,
+                            struct inst_list *list)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIInstance *pool = NULL;
+        bool val;
+
+        if (cu_get_bool_prop(pool_inst, "Primordial", &val) != CMPI_RC_OK) {
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Unable to determine pool type");
+                goto out;
+        }
+
+        /* If Primordial is true, the pool is a parent pool. Need to return
+           all other pools.  Otherwise, just return the parent pool. */
+        if (val) {
+                struct inst_list tmp;
+                int i;
+
+                inst_list_init(&tmp);
+
+                s = enum_pools(_BROKER, ref, type, &tmp);
+                if (s.rc != CMPI_RC_OK)
+                        goto out;
+
+                for (i = 0; i < tmp.cur; i++) {
+                        CMPIInstance *inst = tmp.list[i];
+                        const char *id = NULL;
+
+                        cu_get_str_prop(inst, "InstanceID", &id);
+
+                        if (!STREQC(id, poolid))
+                                inst_list_add(list, inst);
+                }
+
+                inst_list_free(&tmp);
+        } else {
+                pool = parent_device_pool(_BROKER, ref, type, &s);
+                if (s.rc != CMPI_RC_OK)
+                        goto out;
+
+                inst_list_add(list, pool);
+        }
+
+ out:
+        return s;
+}
+
+static CMPIStatus pool_to_vdev_or_pool(const CMPIObjectPath *ref,
+                                       struct std_assoc_info *info,
+                                       struct inst_list *list)
 {
         const char *poolid;
         CMPIStatus s = {CMPI_RC_OK, NULL};
         uint16_t type;
         CMPIInstance *inst = NULL;
-        struct inst_list tmp;
 
         if (!match_hypervisor_prefix(ref, info))
                 return s;
@@ -150,15 +214,11 @@
                 goto out;
         }
 
-        inst_list_init(&tmp);
-
-        s = enum_devices(_BROKER, ref, NULL, type, &tmp);
+        s = get_dev_from_pool(ref, type, poolid, list);
         if (s.rc != CMPI_RC_OK)
                 goto out;
 
-        filter_by_pool(list, &tmp, type, poolid);
-
-        inst_list_free(&tmp);
+        s = get_pools(ref, type, poolid, inst, list);
 
  out:
         return s;
@@ -166,7 +226,7 @@
 
 LIBVIRT_CIM_DEFAULT_MAKEREF()
 
-static char* antecedent[] = {
+static char* pool[] = {
         "Xen_ProcessorPool",
         "Xen_MemoryPool",
         "Xen_NetworkPool",
@@ -188,7 +248,7 @@
         NULL
 };
 
-static char* dependent[] = {
+static char* device[] = {
         "Xen_Processor",
         "Xen_Memory",
         "Xen_NetworkPort",
@@ -210,6 +270,46 @@
         NULL
 };
 
+static char* device_or_pool[] = {
+        "Xen_Processor",
+        "Xen_Memory",
+        "Xen_NetworkPort",
+        "Xen_LogicalDisk",
+        "Xen_DisplayController",
+        "Xen_PointingDevice",
+        "KVM_Processor",
+        "KVM_Memory",
+        "KVM_NetworkPort",
+        "KVM_LogicalDisk",
+        "KVM_DisplayController",
+        "KVM_PointingDevice",
+        "LXC_Processor",
+        "LXC_Memory",
+        "LXC_NetworkPort",
+        "LXC_LogicalDisk",
+        "LXC_DisplayController",
+        "LXC_PointingDevice",
+        "Xen_ProcessorPool",
+        "Xen_MemoryPool",
+        "Xen_NetworkPool",
+        "Xen_DiskPool",
+        "Xen_GraphicsPool",
+        "Xen_InputPool",
+        "KVM_ProcessorPool",
+        "KVM_MemoryPool",
+        "KVM_NetworkPool",
+        "KVM_DiskPool",
+        "KVM_GraphicsPool",
+        "KVM_InputPool",
+        "LXC_ProcessorPool",
+        "LXC_MemoryPool",
+        "LXC_NetworkPool",
+        "LXC_DiskPool",
+        "LXC_GraphicsPool",
+        "LXC_InputPool",
+        NULL
+};
+
 static char* assoc_classname[] = {
         "Xen_ElementAllocatedFromPool",
         "KVM_ElementAllocatedFromPool",
@@ -218,10 +318,10 @@
 };
 
 static struct std_assoc _vdev_to_pool = {
-        .source_class = (char**)&dependent,
+        .source_class = (char**)&device,
         .source_prop = "Dependent",
 
-        .target_class = (char**)&antecedent,
+        .target_class = (char**)&pool,
         .target_prop = "Antecedent",
 
         .assoc_class = (char**)&assoc_classname,
@@ -230,22 +330,22 @@
         .make_ref = make_ref
 };
 
-static struct std_assoc _pool_to_vdev = {
-        .source_class = (char**)&antecedent,
+static struct std_assoc _pool_to_vdev_or_pool = {
+        .source_class = (char**)&pool,
         .source_prop = "Antecedent",
 
-        .target_class = (char**)&dependent,
+        .target_class = (char**)&device_or_pool,
         .target_prop = "Dependent",
 
         .assoc_class = (char**)&assoc_classname,
 
-        .handler = pool_to_vdev,
+        .handler = pool_to_vdev_or_pool,
         .make_ref = make_ref
 };
 
 static struct std_assoc *handlers[] = {
         &_vdev_to_pool,
-        &_pool_to_vdev,
+        &_pool_to_vdev_or_pool,
         NULL
 };
 




More information about the Libvirt-cim mailing list