[Libvirt-cim] [PATCH 1 of 3] AC GetInstance() fails with a "Could not get ResourceType" error

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Sat Dec 15 00:14:12 UTC 2007


# HG changeset patch
# User Kaitlin Rupert <karupert at us.ibm.com>
# Date 1197677154 28800
# Node ID 889611ecea877bb54fad494ece56b2e7fac2b98e
# Parent  86999a1e8fac6f6cee5ca62a4005ca37759713ff
AC GetInstance() fails with a "Could not get ResourceType" error.

GetInstance() was calling return_alloc_cap(), which in turn called rasd_type_from_classname().  rasd_type_from_classname() is expecting the classname to be one of the supported RASD type classnames, but this doesn't match the AC classname.

Instead, GetInstance() should only return an instance if the supplied InstanceID matches one of the existing instances.  alloc_cap_instances() should be modified to take a InstanceID argument.

Failing query:
wbemcli gi 'http://localhost/root/virt:Xen_AllocationCapabilities.InstanceID="ProcessorPool/0"'

Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>

diff -r 86999a1e8fac -r 889611ecea87 src/Virt_AllocationCapabilities.c
--- a/src/Virt_AllocationCapabilities.c	Wed Dec 12 17:22:06 2007 -0800
+++ b/src/Virt_AllocationCapabilities.c	Fri Dec 14 16:05:54 2007 -0800
@@ -20,6 +20,7 @@
  */
 #include <stdlib.h>
 #include <unistd.h>
+#include <string.h>
 
 #include <cmpidt.h>
 #include <cmpift.h>
@@ -131,7 +132,8 @@ static CMPIStatus alloc_cap_instances(co
                                       const CMPIObjectPath *ref,
                                       const CMPIResult *results,
                                       bool names_only,
-                                      const char **properties)
+                                      const char **properties,
+                                      const char *id)
 {
         int i;
         virConnectPtr conn = NULL;
@@ -139,6 +141,7 @@ static CMPIStatus alloc_cap_instances(co
         struct inst_list alloc_cap_list;
         struct inst_list device_pool_list;
         CMPIStatus s = {CMPI_RC_OK, NULL};
+        const char *inst_id;
 
         CU_DEBUG("In alloc_cap_instances()");
 
@@ -165,6 +168,16 @@ static CMPIStatus alloc_cap_instances(co
         }
 
         for (i = 0; i < device_pool_list.cur; i++) {
+                if (cu_get_str_prop(device_pool_list.list[i],
+                                    "InstanceID", &inst_id) != CMPI_RC_OK) {
+                        cu_statusf(broker, &s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "Error fetching device pool InstanceID");
+                        goto out;
+                }
+                if (id && (!STREQ(inst_id, id)))
+                        continue;
+
                 s = ac_from_pool(broker, ref, 
                                  device_pool_list.list[i], 
                                  &alloc_cap_inst);
@@ -172,6 +185,9 @@ static CMPIStatus alloc_cap_instances(co
                         goto out;
 
                 inst_list_add(&alloc_cap_list, alloc_cap_inst);
+
+                if (id && (STREQ(inst_id, id)))
+                        break;
         }
 
         if (names_only)
@@ -192,7 +208,22 @@ static CMPIStatus GetInstance(CMPIInstan
                               const CMPIObjectPath *reference,
                               const char **properties)
 {
-        return return_alloc_cap(reference, results, 0);
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        const char* id;
+
+        if (cu_get_str_path(reference, "InstanceID", &id) != CMPI_RC_OK) {
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "No InstanceID specified");
+                return s;
+        }
+
+        return alloc_cap_instances(_BROKER,
+                                   reference,
+                                   results,
+                                   false,
+                                   properties,
+                                   id);
 }
 
 static CMPIStatus EnumInstanceNames(CMPIInstanceMI *self,
@@ -200,7 +231,7 @@ static CMPIStatus EnumInstanceNames(CMPI
                                     const CMPIResult *results,
                                     const CMPIObjectPath *reference)
 {
-        return alloc_cap_instances(_BROKER, reference, results, true, NULL);
+        return alloc_cap_instances(_BROKER, reference, results, true, NULL, NULL);
 }
 
 static CMPIStatus EnumInstances(CMPIInstanceMI *self,
@@ -209,7 +240,7 @@ static CMPIStatus EnumInstances(CMPIInst
                                 const CMPIObjectPath *reference,
                                 const char **properties)
 {
-        return alloc_cap_instances(_BROKER, reference, results, false, properties);
+        return alloc_cap_instances(_BROKER, reference, results, false, properties, NULL);
 }
 
 DEFAULT_CI();




More information about the Libvirt-cim mailing list