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

Richard Maciel rmaciel at linux.vnet.ibm.com
Fri May 8 20:39:20 UTC 2009


Kaitlin Rupert wrote:
> # 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)

Same problem here. Use a CU_DEBUG to register in the log that 
enum_devices actually failed

> +                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)
Add CU_DEBUG notification here
> +                        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)
Add CU_DEBUG notification here
> +                        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 @@
Add CU_DEBUG notification here
>                  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)
Add CU_DEBUG notification here
>                  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
>  };
> 
> 
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim


-- 
Richard Maciel, MSc
IBM Linux Technology Center
rmaciel at linux.vnet.ibm.com




More information about the Libvirt-cim mailing list