[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