[Libvirt-cim] [PATCH] Fix AllocationCapabilities to make EnumInstances and EnumInstanceNames work

Jay Gagnon grendel at linux.vnet.ibm.com
Mon Nov 19 21:17:21 UTC 2007


# HG changeset patch
# User Jay Gagnon <grendel at linux.vnet.ibm.com>
# Date 1195510519 18000
# Node ID 9e000f9f9096cad7a40b1221b467fe99efc4b93f
# Parent  79f43a4ffc38d7227e17432b971639ae20f6f6ed
Fix AllocationCapabilities to make EnumInstances and EnumInstanceNames work.
I don't have a ton of experience with instance providers, so this might require a little extra scrutiny as I'm sure there are several rookie mistakes.

Signed-off-by: Jay Gagnon <grendel at linux.vnet.ibm.com>

diff -r 79f43a4ffc38 -r 9e000f9f9096 src/Makefile.am
--- a/src/Makefile.am	Mon Nov 19 16:19:06 2007 -0500
+++ b/src/Makefile.am	Mon Nov 19 17:15:19 2007 -0500
@@ -91,9 +91,9 @@ libVirt_ElementCapabilities_la_LIBADD = 
                                         -lVirt_ComputerSystem \
                                         -lVirt_HostSystem
 
-libVirt_AllocationCapabilities_la_DEPENDENCIES = libVirt_RASD.la
+libVirt_AllocationCapabilities_la_DEPENDENCIES = libVirt_RASD.la libVirt_DevicePool.la
 libVirt_AllocationCapabilities_la_SOURCES = Virt_AllocationCapabilities.c
-libVirt_AllocationCapabilities_la_LIBADD = -lVirt_RASD
+libVirt_AllocationCapabilities_la_LIBADD = -lVirt_RASD -lVirt_DevicePool
 
 libVirt_SettingsDefineCapabilities_la_DEPENDENCIES = libVirt_RASD.la libVirt_DevicePool.la
 libVirt_SettingsDefineCapabilities_la_SOURCES = Virt_SettingsDefineCapabilities.c
diff -r 79f43a4ffc38 -r 9e000f9f9096 src/Virt_AllocationCapabilities.c
--- a/src/Virt_AllocationCapabilities.c	Mon Nov 19 16:19:06 2007 -0500
+++ b/src/Virt_AllocationCapabilities.c	Mon Nov 19 17:15:19 2007 -0500
@@ -32,6 +32,7 @@
 
 #include "Virt_AllocationCapabilities.h"
 #include "Virt_RASD.h"
+#include "Virt_DevicePool.h"
 
 const static CMPIBroker *_BROKER;
 
@@ -83,6 +84,88 @@ static CMPIStatus return_alloc_cap(const
         else
                 CMReturnInstance(results, inst);
  out:
+        return s;
+}
+
+static CMPIStatus alloc_cap_instances(const CMPIBroker *broker,
+                                      const CMPIObjectPath *ref,
+                                      const CMPIResult *results,
+                                      bool names_only,
+                                      const char **properties)
+{
+        int i;
+        virConnectPtr conn;
+        CMPIInstance *inst;
+        struct inst_list alloc_cap_list;
+        struct inst_list device_pool_list;
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+
+        CU_DEBUG("In alloc_cap_instances()");
+
+        inst_list_init(&device_pool_list);
+        inst_list_init(&alloc_cap_list);
+
+        if (!provider_is_responsible(broker, ref, &s))
+                goto out;
+
+        conn = lv_connect(_BROKER, &s);
+        if (conn == NULL)
+                goto out;
+
+        for (i = 0; device_pool_names[i]; i++) {
+                s = get_pool_by_type(broker,
+                                     conn,
+                                     device_pool_names[i],
+                                     NAMESPACE(ref),
+                                     &device_pool_list);
+                if (s.rc != CMPI_RC_OK) {
+                        cu_statusf(broker, &s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "Error fetching device pools");
+                        goto out;
+                }
+        }
+
+        for (i = 0; i < device_pool_list.cur; i++) {
+                inst = get_typed_instance(broker,
+                                          "AllocationCapabilities",
+                                          NAMESPACE(ref));
+                if (inst == NULL) {
+                        cu_statusf(broker, &s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "Could not get alloc_cap instance");
+                        goto out;
+                }
+
+                s = cu_copy_prop(broker, device_pool_list.list[i], inst, 
+                                 "InstanceID", NULL);
+                if (s.rc != CMPI_RC_OK) {
+                        cu_statusf(broker, &s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "Error copying InstanceID");
+                        goto out;
+                }
+                
+                s = cu_copy_prop(broker, device_pool_list.list[i], inst, 
+                                 "ResourceType", NULL);
+                if (s.rc != CMPI_RC_OK) {
+                        cu_statusf(broker, &s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "Error copying InstanceID");
+                        goto out;
+                }
+                
+                inst_list_add(&alloc_cap_list, inst);
+        }
+
+        if (names_only)
+                cu_return_instance_names(results, &alloc_cap_list);
+        else
+                cu_return_instances(results, &alloc_cap_list);
+
+ out:
+        inst_list_free(&alloc_cap_list);
+        inst_list_free(&device_pool_list);
         return s;
 }
 
@@ -95,8 +178,23 @@ static CMPIStatus GetInstance(CMPIInstan
         return return_alloc_cap(reference, results, 0);
 }
 
-DEFAULT_EI();
-DEFAULT_EIN();
+static CMPIStatus EnumInstanceNames(CMPIInstanceMI *self,
+                                    const CMPIContext *context,
+                                    const CMPIResult *results,
+                                    const CMPIObjectPath *reference)
+{
+        return alloc_cap_instances(_BROKER, reference, results, true, NULL);
+}
+
+static CMPIStatus EnumInstances(CMPIInstanceMI *self,
+                                const CMPIContext *context,
+                                const CMPIResult *results,
+                                const CMPIObjectPath *reference,
+                                const char **properties)
+{
+        return alloc_cap_instances(_BROKER, reference, results, false, properties);
+}
+
 DEFAULT_CI();
 DEFAULT_MI();
 DEFAULT_DI();




More information about the Libvirt-cim mailing list