<html><body>
<p><tt># HG changeset patch<br>
# User snmishra@us.ibm.com<br>
# Date 1252601888 25200<br>
# Node ID c3163e536ea95f2b846eca4ca2a3cefd4ae6a4a7<br>
# Parent  234141bf7f0368531c884334b1da5b94cc038758<br>
Virt_VirtualSystemManagementService updated to add support for resource indication provider.<br>
<br>
Signed-off-by: Sharad Misrha <snmishra@us.ibm.com><br>
<br>
diff -r 234141bf7f03 -r c3163e536ea9 src/Virt_VirtualSystemManagementService.c<br>
--- a/src/Virt_VirtualSystemManagementService.c          Thu Sep 03 12:52:47 2009 -0700<br>
+++ b/src/Virt_VirtualSystemManagementService.c          Thu Sep 10 09:58:08 2009 -0700<br>
@@ -63,6 +63,9 @@<br>
 #define BRIDGE_TYPE "bridge"<br>
 #define NETWORK_TYPE "network"<br>
 #define USER_TYPE "user"<br>
+#define CREATED "ResourceAllocationSettingDataCreatedIndication"<br>
+#define DELETED "ResourceAllocationSettingDataDeletedIndication"<br>
+#define MODIFIED "ResourceAllocationSettingDataModifiedIndication"<br>
 <br>
 const static CMPIBroker *_BROKER;<br>
 <br>
@@ -442,7 +445,7 @@<br>
         ret = cu_get_str_prop(inst, "VirtualSystemIdentifier", &val);<br>
         if (ret != CMPI_RC_OK)<br>
                 goto out;<br>
-<br>
+        <br>
         free(domain->name);<br>
         domain->name = strdup(val);<br>
 <br>
@@ -1416,7 +1419,69 @@<br>
         return s;<br>
 }<br>
 <br>
-static CMPIInstance *create_system(CMPIInstance *vssd,<br>
+static CMPIStatus raise_rasd_indication(const CMPIContext *context,<br>
+                                        const char *base_type,<br>
+                                        CMPIInstance *prev_inst,<br>
+                                        const CMPIObjectPath *ref,<br>
+                                        struct inst_list *list)<br>
+{<br>
+        char *type;<br>
+        CMPIStatus s = {CMPI_RC_OK, NULL};<br>
+        CMPIInstance *instc = NULL;<br>
+        CMPIInstance *ind = NULL;<br>
+        CMPIObjectPath *op = NULL;<br>
+        int i;<br>
+<br>
+        CU_DEBUG("raise_rasd_indication");<br>
+<br>
+        type = get_typed_class(CLASSNAME(ref), base_type);<br>
+        ind = get_typed_instance(_BROKER, <br>
+                                 CLASSNAME(ref), <br>
+                                 base_type, <br>
+                                 NAMESPACE(ref));<br>
+        if (ind == NULL)  {<br>
+                CU_DEBUG("Failed to get indication instance");<br>
+                s.rc = CMPI_RC_ERR_FAILED;<br>
+                goto out;<br>
+        }<br>
+        <br>
+        /* PreviousInstance is set only for modify case. */<br>
+        if (prev_inst != NULL)<br>
+                CMSetProperty(ind, <br>
+                              "PreviousInstance", <br>
+                              (CMPIValue *)&prev_inst, <br>
+                              CMPI_instance);<br>
+<br>
+        for (i=0; i < list->cur; i++) {<br>
+                instc = list->list[i];<br>
+                op = CMGetObjectPath(instc, NULL);<br>
+                CMPIString *str = CMGetClassName(op, NULL);<br>
+<br>
+                CU_DEBUG("class name is %s\n", CMGetCharsPtr(str, NULL));<br>
+<br>
+                CMSetProperty(ind, <br>
+                              "SourceInstance", <br>
+                              (CMPIValue *)&instc, <br>
+                              CMPI_instance);<br>
+                set_source_inst_props(_BROKER, context, ref, ind);<br>
+<br>
+                s = stdi_raise_indication(_BROKER, <br>
+                                          context, <br>
+                                          type, <br>
+                                          NAMESPACE(ref), <br>
+                                          ind);<br>
+        }<br>
+<br>
+out:<br>
+        free(type);<br>
+        return s;<br>
+<br>
+}<br>
+<br>
+<br>
+<br>
+static CMPIInstance *create_system(const CMPIContext *context,<br>
+                                   CMPIInstance *vssd,<br>
                                    CMPIArray *resources,<br>
                                    const CMPIObjectPath *ref,<br>
                                    const CMPIObjectPath *refconf,<br>
@@ -1427,6 +1492,9 @@<br>
         const char *msg = NULL;<br>
         virConnectPtr conn = NULL;<br>
         virDomainPtr dom = NULL;<br>
+        struct inst_list list;<br>
+        const char *props[] = {NULL};<br>
 <br>
         struct domain *domain = NULL;<br>
 <br>
+        inst_list_init(&list);<br>
@@ -1477,18 +1544,40 @@<br>
         CU_DEBUG("System XML:\n%s", xml);<br>
 <br>
         inst = connect_and_create(xml, ref, s);<br>
-        if (inst != NULL)<br>
+        if (inst != NULL) {<br>
                 update_dominfo(domain, CLASSNAME(ref));<br>
+<br>
+                *s = enum_rasds(_BROKER, <br>
+                                ref, <br>
+                                domain->name, <br>
+                                CIM_RES_TYPE_ALL, <br>
+                                props, <br>
+                                &list);<br>
+<br>
+                if (s->rc != CMPI_RC_OK) {<br>
+                        CU_DEBUG("Failed to enumerate rasd\n");<br>
+                        goto out;<br>
+                }<br>
+<br>
+                raise_rasd_indication(context,<br>
+                                      CREATED,<br>
+                                      NULL, <br>
+                                      ref, <br>
+                                      &list);<br>
+        }<br>
+<br>
 <br>
  out:<br>
         cleanup_dominfo(&domain);<br>
         free(xml);<br>
         virDomainFree(dom);<br>
         virConnectClose(conn);<br>
+        inst_list_free(&list);<br>
 <br>
         return inst;<br>
 }<br>
 <br>
+<br>
 static bool trigger_indication(const CMPIContext *context,<br>
                                const char *base_type,<br>
                                const CMPIObjectPath *ref)<br>
@@ -1530,7 +1620,7 @@<br>
         if (s.rc != CMPI_RC_OK)<br>
                 goto out;<br>
 <br>
-        sys = create_system(vssd, res, reference, refconf, &s);<br>
+        sys = create_system(context, vssd, res, reference, refconf, &s);<br>
         if (sys == NULL)<br>
                 goto out;<br>
 <br>
@@ -1564,12 +1654,15 @@<br>
         CMPIObjectPath *sys;<br>
         virConnectPtr conn = NULL;<br>
         virDomainPtr dom = NULL;<br>
+        struct inst_list list;<br>
+        const char *props[] = {NULL};<br>
 <br>
+        inst_list_init(&list);<br>
         conn = connect_by_classname(_BROKER,<br>
                                     CLASSNAME(reference),<br>
                                     &status);<br>
         if (conn == NULL) {<br>
-                rc = -1;<br>
+                rc = IM_RC_NOT_SUPPORTED;<br>
                 goto error;<br>
         }<br>
 <br>
@@ -1580,6 +1672,18 @@<br>
         if (dom_name == NULL)<br>
                 goto error;<br>
 <br>
+        status = enum_rasds(_BROKER, <br>
+                            reference, <br>
+                            dom_name, <br>
+                            CIM_RES_TYPE_ALL, <br>
+                            props, <br>
+                            &list);<br>
+<br>
+        if (status.rc != CMPI_RC_OK) {<br>
+                CU_DEBUG("Failed to enumerate rasd");<br>
+                goto error;<br>
+        }<br>
+<br>
         dom = virDomainLookupByName(conn, dom_name);<br>
         if (dom == NULL) {<br>
                 CU_DEBUG("No such domain `%s'", dom_name);<br>
@@ -1605,11 +1710,17 @@<br>
 <br>
 error:<br>
         if (rc == IM_RC_SYS_NOT_FOUND)<br>
-                virt_set_status(_BROKER, &status,<br>
+                virt_set_status(_BROKER, <br>
+                                &status,<br>
                                 CMPI_RC_ERR_NOT_FOUND,<br>
                                 conn,<br>
                                 "Referenced domain `%s' does not exist", <br>
                                 dom_name);<br>
+        else if (rc == IM_RC_NOT_SUPPORTED)<br>
+                virt_set_status(_BROKER, &status,<br>
+                                CMPI_RC_ERR_NOT_FOUND,<br>
+                                conn,<br>
+                                "Unable to raise resource indication");<br>
         else if (rc == IM_RC_FAILED)<br>
                 virt_set_status(_BROKER, &status,<br>
                                 CMPI_RC_ERR_NOT_FOUND,<br>
@@ -1617,6 +1728,7 @@<br>
                                 "Unable to retrieve domain name");<br>
         else if (rc == IM_RC_OK) {<br>
                 status = (CMPIStatus){CMPI_RC_OK, NULL};<br>
+                raise_rasd_indication(context, DELETED, NULL, reference, &list);<br>
                 trigger_indication(context,<br>
                                    "ComputerSystemDeletedIndication",<br>
                                    reference);<br>
@@ -1625,7 +1737,7 @@<br>
         virDomainFree(dom);<br>
         virConnectClose(conn);<br>
         CMReturnData(results, &rc, CMPI_uint32);<br>
-<br>
+        inst_list_free(&list);<br>
         return status;<br>
 }<br>
 <br>
@@ -2071,7 +2183,8 @@<br>
         return s;<br>
 }<br>
 <br>
-static CMPIStatus _update_resources_for(const CMPIObjectPath *ref,<br>
+static CMPIStatus _update_resources_for(const CMPIContext *context,<br>
+                                        const CMPIObjectPath *ref,<br>
                                         virDomainPtr dom,<br>
                                         const char *devid,<br>
                                         CMPIInstance *rasd,<br>
@@ -2081,7 +2194,14 @@<br>
         struct domain *dominfo = NULL;<br>
         uint16_t type;<br>
         char *xml = NULL;<br>
+        char *indication = NULL;<br>
         CMPIObjectPath *op;<br>
+        struct inst_list list;<br>
+        CMPIInstance  *prev_inst = NULL;<br>
+        const char *props[] = {NULL};<br>
+        const char *inst_id;<br>
+        int i, ret;<br>
 <br>
+        inst_list_init(&list);<br>
         if (!get_dominfo(dom, &dominfo)) {<br>
                 virt_set_status(_BROKER, &s,<br>
@@ -2106,6 +2225,7 @@<br>
                 goto out;<br>
         }<br>
 <br>
+<br>
         s = func(dominfo, rasd, type, devid, NAMESPACE(ref));<br>
         if (s.rc != CMPI_RC_OK) {<br>
                 CU_DEBUG("Resource transform function failed");<br>
@@ -2116,6 +2236,54 @@<br>
         if (xml != NULL) {<br>
                 CU_DEBUG("New XML:\n%s", xml);<br>
                 connect_and_create(xml, ref, &s);<br>
+<br>
+                if (func == &resource_add) {<br>
+                        indication = strdup(CREATED);<br>
+                }<br>
+                else if (func == &resource_del) {<br>
+                        indication = strdup(DELETED);<br>
+                }<br>
+                else {<br>
+                        indication = strdup(MODIFIED);<br>
+<br>
+                        s = enum_rasds(_BROKER, <br>
+                                       ref, <br>
+                                       dominfo->name, <br>
+                                       type, <br>
+                                       props, <br>
+                                       &list);<br>
+                        if (s.rc != CMPI_RC_OK) {<br>
+                                CU_DEBUG("Failed to enumerate rasd");<br>
+                                goto out;<br>
+                        }<br>
+<br>
+                        for(i=0; i < list.cur; i++) {<br>
+                                prev_inst = list.list[i];<br>
+                                ret = cu_get_str_prop(prev_inst, <br>
+                                                      "InstanceID", <br>
+                                                      &inst_id);<br>
+<br>
+                                if (ret != CMPI_RC_OK) <br>
+                                        continue;<br>
+<br>
+                                if (STREQ(inst_id, <br>
+                                          get_fq_devid(dominfo->name, <br>
+                                                       (char *)devid)))<br>
+                                        break;<br>
+                        }<br>
+<br>
+                }<br>
+<br>
+                inst_list_init(&list);<br>
+                if (inst_list_add(&list, rasd) == 0) {<br>
+                        CU_DEBUG("Unable to add RASD instance to the list\n");<br>
+                        goto out;<br>
+                }<br>
+                raise_rasd_indication(context, <br>
+                                      indication, <br>
+                                      prev_inst, <br>
+                                      ref, <br>
+                                      &list);<br>
         } else {<br>
                 cu_statusf(_BROKER, &s,<br>
                            CMPI_RC_ERR_FAILED,<br>
@@ -2125,6 +2294,8 @@<br>
  out:<br>
         cleanup_dominfo(&dominfo);<br>
         free(xml);<br>
+        free(indication);<br>
+        inst_list_free(&list);<br>
 <br>
         return s;<br>
 }<br>
@@ -2153,7 +2324,8 @@<br>
         return s;<br>
 }<br>
 <br>
-static CMPIStatus _update_resource_settings(const CMPIObjectPath *ref,<br>
+static CMPIStatus _update_resource_settings(const CMPIContext *context,<br>
+                                            const CMPIObjectPath *ref,<br>
                                             const char *domain,<br>
                                             CMPIArray *resources,<br>
                                             const CMPIResult *results,<br>
@@ -2208,9 +2380,14 @@<br>
                         goto end;<br>
                 }<br>
 <br>
-                s = _update_resources_for(ref, dom, devid, inst, func);<br>
+                s = _update_resources_for(context, <br>
+                                          ref, <br>
+                                          dom, <br>
+                                          devid, <br>
+                                          inst, <br>
+                                          func);<br>
 <br>
-        end:<br>
+ end:<br>
                 free(name);<br>
                 free(devid);<br>
                 virDomainFree(dom);<br>
@@ -2310,7 +2487,9 @@<br>
                 return s;<br>
         }<br>
 <br>
-        if (cu_get_ref_arg(argsin, "AffectedConfiguration", &sys) != CMPI_RC_OK) {<br>
+        if (cu_get_ref_arg(argsin, <br>
+                           "AffectedConfiguration", <br>
+                           &sys) != CMPI_RC_OK) {<br>
                 cu_statusf(_BROKER, &s,<br>
                            CMPI_RC_ERR_INVALID_PARAMETER,<br>
                            "Missing AffectedConfiguration parameter");<br>
@@ -2324,11 +2503,13 @@<br>
                 return s;<br>
         }<br>
 <br>
-        s = _update_resource_settings(reference,<br>
+        s = _update_resource_settings(context,<br>
+                                      reference,<br>
                                       domain,<br>
                                       arr,<br>
                                       results,<br>
                                       resource_add);<br>
+                <br>
         free(domain);<br>
 <br>
         return s;<br>
@@ -2351,7 +2532,8 @@<br>
                 return s;<br>
         }<br>
 <br>
-        return _update_resource_settings(reference,<br>
+        return _update_resource_settings(context,<br>
+                                         reference,<br>
                                          NULL,<br>
                                          arr,<br>
                                          results,<br>
@@ -2384,7 +2566,8 @@<br>
         if (s.rc != CMPI_RC_OK)<br>
                 goto out;<br>
 <br>
-        s = _update_resource_settings(reference,<br>
+        s = _update_resource_settings(context,<br>
+                                      reference,<br>
                                       NULL,<br>
                                       resource_arr,<br>
                                       results,<br>
</tt></body></html>