[Libvirt-cim] [PATCH 4 of 6] Support for resource indication was added to Virt_VirtualSystemManagementService

Richard Maciel rmaciel at linux.vnet.ibm.com
Mon Sep 14 17:12:48 UTC 2009


On 09/11/2009 01:50 PM, Sharad Mishra wrote:
> # HG changeset patch
> # User snmishra at us.ibm.com
> # Date 1252684847 25200
> # Node ID dd96ae8f1ec71af57012fcb37932d6a7b1f270fa
> # Parent  74607c71855e6baeeb49bbc134b773acc39675fb
> Support for resource indication was added to Virt_VirtualSystemManagementService
>
> Code added to call resource indication when resources are added or deleted or modified.
>
> Signed-off-by: Sharad Mishra<snmishra at us.ibm.com>
>
> diff -r 74607c71855e -r dd96ae8f1ec7 src/Virt_VirtualSystemManagementService.c
> --- a/src/Virt_VirtualSystemManagementService.c	Fri Sep 11 09:00:47 2009 -0700
> +++ b/src/Virt_VirtualSystemManagementService.c	Fri Sep 11 09:00:47 2009 -0700
> @@ -63,6 +63,9 @@
>   #define BRIDGE_TYPE "bridge"
>   #define NETWORK_TYPE "network"
>   #define USER_TYPE "user"
> +#define CREATED "ResourceAllocationSettingDataCreatedIndication"
> +#define DELETED "ResourceAllocationSettingDataDeletedIndication"
> +#define MODIFIED "ResourceAllocationSettingDataModifiedIndication"
>
>   const static CMPIBroker *_BROKER;
>
> @@ -442,7 +445,7 @@
>           ret = cu_get_str_prop(inst, "VirtualSystemIdentifier",&val);
>           if (ret != CMPI_RC_OK)
>                   goto out;
> -
> +

Don't add or remove spaces from the code if you don't need to change it.

>           free(domain->name);
>           domain->name = strdup(val);
>
> @@ -1416,7 +1419,69 @@
>           return s;
>   }
>
> -static CMPIInstance *create_system(CMPIInstance *vssd,
> +static CMPIStatus raise_rasd_indication(const CMPIContext *context,
> +                                        const char *base_type,
> +                                        CMPIInstance *prev_inst,
> +                                        const CMPIObjectPath *ref,
> +                                        struct inst_list *list)
> +{
> +        char *type;
> +        CMPIStatus s = {CMPI_RC_OK, NULL};
> +        CMPIInstance *instc = NULL;
> +        CMPIInstance *ind = NULL;
> +        CMPIObjectPath *op = NULL;
> +        int i;
> +
> +        CU_DEBUG("raise_rasd_indication");
> +
> +        type = get_typed_class(CLASSNAME(ref), base_type);
> +        ind = get_typed_instance(_BROKER,
> +                                 CLASSNAME(ref),
> +                                 base_type,
> +                                 NAMESPACE(ref));
> +        if (ind == NULL)  {
> +                CU_DEBUG("Failed to get indication instance");
> +                s.rc = CMPI_RC_ERR_FAILED;
> +                goto out;
> +        }
> +
> +        /* PreviousInstance is set only for modify case. */
> +        if (prev_inst != NULL)
> +                CMSetProperty(ind,
> +                              "PreviousInstance",
> +                              (CMPIValue *)&prev_inst,
> +                              CMPI_instance);
> +
> +        for (i=0; i<  list->cur; i++) {
> +                instc = list->list[i];
> +                op = CMGetObjectPath(instc, NULL);
> +                CMPIString *str = CMGetClassName(op, NULL);
> +
> +                CU_DEBUG("class name is %s\n", CMGetCharsPtr(str, NULL));
> +
> +                CMSetProperty(ind,
> +                              "SourceInstance",
> +                              (CMPIValue *)&instc,
> +                              CMPI_instance);
> +                set_source_inst_props(_BROKER, context, ref, ind);
> +
> +                s = stdi_raise_indication(_BROKER,
> +                                          context,
> +                                          type,
> +                                          NAMESPACE(ref),
> +                                          ind);
> +        }
> +
> +out:

Our code style uses a single horizontal space before a label.

> +        free(type);
> +        return s;
> +
> +}
> +
> +
> +

Our code style uses a single vertical space to separate a functions


> +static CMPIInstance *create_system(const CMPIContext *context,
> +                                   CMPIInstance *vssd,
>                                      CMPIArray *resources,
>                                      const CMPIObjectPath *ref,
>                                      const CMPIObjectPath *refconf,
> @@ -1427,9 +1492,13 @@
>           const char *msg = NULL;
>           virConnectPtr conn = NULL;
>           virDomainPtr dom = NULL;
> +        struct inst_list list;
> +        const char *props[] = {NULL};
>
>           struct domain *domain = NULL;
>
> +        inst_list_init(&list);
> +
>           if (refconf != NULL) {
>                   *s = get_reference_domain(&domain, ref, refconf);
>                   if (s->rc != CMPI_RC_OK)
> @@ -1477,18 +1546,40 @@
>           CU_DEBUG("System XML:\n%s", xml);
>
>           inst = connect_and_create(xml, ref, s);
> -        if (inst != NULL)
> +        if (inst != NULL) {
>                   update_dominfo(domain, CLASSNAME(ref));
>
> +                *s = enum_rasds(_BROKER,
> +                                ref,
> +                                domain->name,
> +                                CIM_RES_TYPE_ALL,
> +                                props,
> +&list);
> +
> +                if (s->rc != CMPI_RC_OK) {
> +                        CU_DEBUG("Failed to enumerate rasd\n");
> +                        goto out;
> +                }
> +
> +                raise_rasd_indication(context,
> +                                      CREATED,
> +                                      NULL,
> +                                      ref,
> +&list);
> +        }
> +
> +
>    out:
>           cleanup_dominfo(&domain);
>           free(xml);
>           virDomainFree(dom);
>           virConnectClose(conn);
> +        inst_list_free(&list);
>
>           return inst;
>   }
>
> +

Remove this space

>   static bool trigger_indication(const CMPIContext *context,
>                                  const char *base_type,
>                                  const CMPIObjectPath *ref)
> @@ -1530,7 +1621,7 @@
>           if (s.rc != CMPI_RC_OK)
>                   goto out;
>
> -        sys = create_system(vssd, res, reference, refconf,&s);
> +        sys = create_system(context, vssd, res, reference, refconf,&s);
>           if (sys == NULL)
>                   goto out;
>
> @@ -1564,12 +1655,15 @@
>           CMPIObjectPath *sys;
>           virConnectPtr conn = NULL;
>           virDomainPtr dom = NULL;
> +        struct inst_list list;
> +        const char *props[] = {NULL};
>
> +        inst_list_init(&list);
>           conn = connect_by_classname(_BROKER,
>                                       CLASSNAME(reference),
>                                       &status);
>           if (conn == NULL) {
> -                rc = -1;
> +                rc = IM_RC_NOT_SUPPORTED;
>                   goto error;
>           }
>
> @@ -1580,6 +1674,18 @@
>           if (dom_name == NULL)
>                   goto error;
>
> +        status = enum_rasds(_BROKER,
> +                            reference,
> +                            dom_name,
> +                            CIM_RES_TYPE_ALL,
> +                            props,
> +&list);
> +
> +        if (status.rc != CMPI_RC_OK) {
> +                CU_DEBUG("Failed to enumerate rasd");
> +                goto error;
> +        }
> +
>           dom = virDomainLookupByName(conn, dom_name);
>           if (dom == NULL) {
>                   CU_DEBUG("No such domain `%s'", dom_name);
> @@ -1605,11 +1711,17 @@
>
>   error:
>           if (rc == IM_RC_SYS_NOT_FOUND)
> -                virt_set_status(_BROKER,&status,
> +                virt_set_status(_BROKER,
> +&status,
>                                   CMPI_RC_ERR_NOT_FOUND,
>                                   conn,
>                                   "Referenced domain `%s' does not exist",
>                                   dom_name);
> +        else if (rc == IM_RC_NOT_SUPPORTED)
> +                virt_set_status(_BROKER,&status,
> +                                CMPI_RC_ERR_NOT_FOUND,
> +                                conn,
> +                                "Unable to raise resource indication");
>           else if (rc == IM_RC_FAILED)
>                   virt_set_status(_BROKER,&status,
>                                   CMPI_RC_ERR_NOT_FOUND,
> @@ -1617,6 +1729,7 @@
>                                   "Unable to retrieve domain name");
>           else if (rc == IM_RC_OK) {
>                   status = (CMPIStatus){CMPI_RC_OK, NULL};
> +                raise_rasd_indication(context, DELETED, NULL, reference,&list);
>                   trigger_indication(context,
>                                      "ComputerSystemDeletedIndication",
>                                      reference);
> @@ -1625,7 +1738,7 @@
>           virDomainFree(dom);
>           virConnectClose(conn);
>           CMReturnData(results,&rc, CMPI_uint32);
> -
> +        inst_list_free(&list);
>           return status;
>   }
>
> @@ -2071,7 +2184,8 @@
>           return s;
>   }
>
> -static CMPIStatus _update_resources_for(const CMPIObjectPath *ref,
> +static CMPIStatus _update_resources_for(const CMPIContext *context,
> +                                        const CMPIObjectPath *ref,
>                                           virDomainPtr dom,
>                                           const char *devid,
>                                           CMPIInstance *rasd,
> @@ -2081,8 +2195,15 @@
>           struct domain *dominfo = NULL;
>           uint16_t type;
>           char *xml = NULL;
> +        char *indication = NULL;
>           CMPIObjectPath *op;
> +        struct inst_list list;
> +        CMPIInstance  *prev_inst = NULL;
> +        const char *props[] = {NULL};
> +        const char *inst_id;
> +        int i, ret;
>
> +        inst_list_init(&list);
>           if (!get_dominfo(dom,&dominfo)) {
>                   virt_set_status(_BROKER,&s,
>                                   CMPI_RC_ERR_FAILED,
> @@ -2106,6 +2227,7 @@
>                   goto out;
>           }
>
> +

Remove this vertical space

>           s = func(dominfo, rasd, type, devid, NAMESPACE(ref));
>           if (s.rc != CMPI_RC_OK) {
>                   CU_DEBUG("Resource transform function failed");
> @@ -2116,6 +2238,54 @@
>           if (xml != NULL) {
>                   CU_DEBUG("New XML:\n%s", xml);
>                   connect_and_create(xml, ref,&s);
> +
> +                if (func ==&resource_add) {
> +                        indication = strdup(CREATED);
> +                }
> +                else if (func ==&resource_del) {
> +                        indication = strdup(DELETED);
> +                }
> +                else {
> +                        indication = strdup(MODIFIED);
> +
> +                        s = enum_rasds(_BROKER,
> +                                       ref,
> +                                       dominfo->name,
> +                                       type,
> +                                       props,
> +&list);
> +                        if (s.rc != CMPI_RC_OK) {
> +                                CU_DEBUG("Failed to enumerate rasd");
> +                                goto out;
> +                        }
> +
> +                        for(i=0; i<  list.cur; i++) {
> +                                prev_inst = list.list[i];
> +                                ret = cu_get_str_prop(prev_inst,
> +                                                      "InstanceID",
> +&inst_id);
> +
> +                                if (ret != CMPI_RC_OK)

If it fails and you can't leave, at least print a debug message before 
ignoring the error.

> +                                        continue;
> +
> +                                if (STREQ(inst_id,
> +                                          get_fq_devid(dominfo->name,
> +                                                       (char *)devid)))
> +                                        break;
> +                        }
> +
> +                }
> +
> +                inst_list_init(&list);
> +                if (inst_list_add(&list, rasd) == 0) {
> +                        CU_DEBUG("Unable to add RASD instance to the list\n");
> +                        goto out;
> +                }
> +                raise_rasd_indication(context,
> +                                      indication,
> +                                      prev_inst,
> +                                      ref,
> +&list);
>           } else {
>                   cu_statusf(_BROKER,&s,
>                              CMPI_RC_ERR_FAILED,
> @@ -2125,6 +2295,8 @@
>    out:
>           cleanup_dominfo(&dominfo);
>           free(xml);
> +        free(indication);
> +        inst_list_free(&list);
>
>           return s;
>   }
> @@ -2153,7 +2325,8 @@
>           return s;
>   }
>
> -static CMPIStatus _update_resource_settings(const CMPIObjectPath *ref,
> +static CMPIStatus _update_resource_settings(const CMPIContext *context,
> +                                            const CMPIObjectPath *ref,
>                                               const char *domain,
>                                               CMPIArray *resources,
>                                               const CMPIResult *results,
> @@ -2208,9 +2381,14 @@
>                           goto end;
>                   }
>
> -                s = _update_resources_for(ref, dom, devid, inst, func);
> +                s = _update_resources_for(context,
> +                                          ref,
> +                                          dom,
> +                                          devid,
> +                                          inst,
> +                                          func);
>
> -        end:
> + end:
>                   free(name);
>                   free(devid);
>                   virDomainFree(dom);
> @@ -2310,7 +2488,9 @@
>                   return s;
>           }
>
> -        if (cu_get_ref_arg(argsin, "AffectedConfiguration",&sys) != CMPI_RC_OK) {
> +        if (cu_get_ref_arg(argsin,
> +                           "AffectedConfiguration",
> +&sys) != CMPI_RC_OK) {
>                   cu_statusf(_BROKER,&s,
>                              CMPI_RC_ERR_INVALID_PARAMETER,
>                              "Missing AffectedConfiguration parameter");
> @@ -2324,11 +2504,13 @@
>                   return s;
>           }
>
> -        s = _update_resource_settings(reference,
> +        s = _update_resource_settings(context,
> +                                      reference,
>                                         domain,
>                                         arr,
>                                         results,
>                                         resource_add);
> +
>           free(domain);
>
>           return s;
> @@ -2351,7 +2533,8 @@
>                   return s;
>           }
>
> -        return _update_resource_settings(reference,
> +        return _update_resource_settings(context,
> +                                         reference,
>                                            NULL,
>                                            arr,
>                                            results,
> @@ -2384,7 +2567,8 @@
>           if (s.rc != CMPI_RC_OK)
>                   goto out;
>
> -        s = _update_resource_settings(reference,
> +        s = _update_resource_settings(context,
> +                                      reference,
>                                         NULL,
>                                         resource_arr,
>                                         results,
>
> _______________________________________________
> 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