[Libvirt-cim] [PATCH] Fix VSMS.RemoveResources() to take references instead of EOs

Dan Smith danms at us.ibm.com
Wed Dec 12 18:22:21 UTC 2007


# HG changeset patch
# User Dan Smith <danms at us.ibm.com>
# Date 1197487329 28800
# Node ID 59eb8770d96a71707804f26aec48ae76531b005e
# Parent  b6c16e5a2a347b1e6a6fe314864865a9c6152532
Fix VSMS.RemoveResources() to take references instead of EOs

This just adds a filter function that converts the references into
instances.  It could be more efficient, but I think that allowing all
of the resource operations to remain largely identical (as they did before)
is worth the small amount of overhead here.

Also added REF2STR() macro to misc_util.h.  I do this a lot, mostly
while testing, but it seems valid to have such a macro so we can start
printing out more useful error messages with ease.

Signed-off-by: Dan Smith <danms at us.ibm.com>

diff -r b6c16e5a2a34 -r 59eb8770d96a libxkutil/misc_util.h
--- a/libxkutil/misc_util.h	Wed Dec 12 09:42:09 2007 -0800
+++ b/libxkutil/misc_util.h	Wed Dec 12 11:22:09 2007 -0800
@@ -129,6 +129,8 @@ CMPIInstance *make_reference(const CMPIB
                                       assoc);                           \
         }
 
+#define REF2STR(r) CMGetCharPtr(CMObjectPathToString(r, NULL))
+
 /*
  * Local Variables:
  * mode: C
diff -r b6c16e5a2a34 -r 59eb8770d96a src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c	Wed Dec 12 09:42:09 2007 -0800
+++ b/src/Virt_VirtualSystemManagementService.c	Wed Dec 12 11:22:09 2007 -0800
@@ -947,6 +947,59 @@ static CMPIStatus update_resource_settin
         return s;
 }
 
+static CMPIStatus rasd_refs_to_insts(const CMPIContext *ctx,
+                                     const CMPIObjectPath *reference,
+                                     CMPIArray *arr,
+                                     struct inst_list *list)
+{
+        CMPIStatus s;
+        int i;
+        int c;
+
+        c = CMGetArrayCount(arr, &s);
+        if (s.rc != CMPI_RC_OK)
+                return s;
+
+        for (i = 0; i < c; i++) {
+                CMPIData d;
+                CMPIObjectPath *ref;
+                CMPIInstance *inst;
+                const char *id;
+                uint16_t type;
+
+                d = CMGetArrayElementAt(arr, i, &s);
+                ref = d.value.ref;
+                if (s.rc != CMPI_RC_OK) {
+                        CU_DEBUG("Unable to get ResourceSettings[%i]", i);
+                        continue;
+                }
+
+                if (cu_get_str_path(ref, "InstanceID", &id) != CMPI_RC_OK) {
+                        CU_DEBUG("Unable to get InstanceID of `%s'",
+                                 REF2STR(ref));
+                        continue;
+                }
+
+                if (rasd_type_from_classname(CLASSNAME(ref), &type) !=
+                    CMPI_RC_OK) {
+                        CU_DEBUG("Unable to get type of `%s'",
+                                 REF2STR(ref));
+                        continue;
+                }
+
+                inst = get_rasd_instance(ctx, reference, _BROKER, id, type);
+                if (inst != NULL)
+                        inst_list_add(list, inst);
+                else
+                        CU_DEBUG("Failed to get instance for `%s'",
+                                 REF2STR(ref));
+        }
+
+        CMSetStatus(&s, CMPI_RC_OK);
+
+        return s;
+}
+
 static CMPIStatus add_resource_settings(CMPIMethodMI *self,
                                         const CMPIContext *context,
                                         const CMPIResult *results,
@@ -974,7 +1027,32 @@ static CMPIStatus rm_resource_settings(C
                                        const CMPIArgs *argsin,
                                        CMPIArgs *argsout)
 {
-        return update_resource_settings(reference, argsin, resource_del);
+        /* The RemoveResources case is different from either Add or
+         * Modify, because it takes references instead of instances
+         */
+
+        CMPIArray *arr;
+        CMPIStatus s;
+        struct inst_list list;
+
+        inst_list_init(&list);
+
+        if (cu_get_array_arg(argsin, "ResourceSettings", &arr) != CMPI_RC_OK) {
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Missing ResourceSettings");
+                goto out;
+        }
+
+        s = rasd_refs_to_insts(context, reference, arr, &list);
+        if (s.rc != CMPI_RC_OK)
+                goto out;
+
+        s = _update_resource_settings(reference, &list, resource_del);
+ out:
+        inst_list_free(&list);
+
+        return s;
 }
 
 static struct method_handler DefineSystem = {
@@ -1023,7 +1101,7 @@ static struct method_handler RemoveResou
 static struct method_handler RemoveResourceSettings = {
         .name = "RemoveResourceSettings",
         .handler = rm_resource_settings,
-        .args = {{"ResourceSettings", CMPI_stringA},
+        .args = {{"ResourceSettings", CMPI_refA},
                  ARG_END
         }
 };




More information about the Libvirt-cim mailing list