<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>