[PATCH 0 of 3] #2 Fix AC GetInstance() error

Update: sfcb seg faults if no instance is found but the provider returns a success. Add a fix so that if an instance isn't found, and error is returned. AC GetInstance() currently returns an error. This patchset fixes that error and also cleans up some left over functions.

# HG changeset patch # User Kaitlin Rupert <karupert@us.ibm.com> # Date 1198002754 28800 # Node ID b85641f03ae2507e894311f9b31d197b5acc5a39 # Parent d6cf74b64c720d65da17bdac2604f7d0f1d31f7e 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@us.ibm.com> diff -r d6cf74b64c72 -r b85641f03ae2 src/Virt_AllocationCapabilities.c --- a/src/Virt_AllocationCapabilities.c Mon Dec 17 10:23:40 2007 -0800 +++ b/src/Virt_AllocationCapabilities.c Tue Dec 18 10:32:34 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,18 @@ 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))) { + inst_id = NULL; + continue; + } + s = ac_from_pool(broker, ref, device_pool_list.list[i], &alloc_cap_inst); @@ -172,6 +187,16 @@ 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 (id && !inst_id) { + cu_statusf(broker, &s, + CMPI_RC_ERR_NOT_FOUND, + "Requested Object could not be found."); + goto out; } if (names_only) @@ -192,7 +217,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 +240,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 +249,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();

# HG changeset patch # User Kaitlin Rupert <karupert@us.ibm.com> # Date 1197677158 28800 # Node ID d26b589173d37b0b619a9a8bc31d714bf5ed8e84 # Parent b85641f03ae2507e894311f9b31d197b5acc5a39 Clean up unneeded functions in AC. Now that GetInstance is calling alloc_cap_instances(), get_alloc_cap() and return_alloc_cap() are no longer needed. This removes the need for Virt_AllocationCapabilities.h Also clean up lengthy function calls. Signed-off-by: Kaitlin Rupert <karupert@us.ibm.com> diff -r b85641f03ae2 -r d26b589173d3 src/Virt_AllocationCapabilities.c --- a/src/Virt_AllocationCapabilities.c Tue Dec 18 10:32:34 2007 -0800 +++ b/src/Virt_AllocationCapabilities.c Fri Dec 14 16:05:58 2007 -0800 @@ -31,66 +31,9 @@ #include "misc_util.h" -#include "Virt_AllocationCapabilities.h" -#include "Virt_RASD.h" #include "Virt_DevicePool.h" const static CMPIBroker *_BROKER; - -CMPIStatus get_alloc_cap(const CMPIBroker *broker, - const CMPIObjectPath *ref, - CMPIInstance **inst) -{ - CMPIStatus s = {CMPI_RC_OK, NULL}; - char *inst_id; - uint16_t type; - int ret; - - *inst = get_typed_instance(broker, - CLASSNAME(ref), - "AllocationCapabilities", - NAMESPACE(ref)); - - if (rasd_type_from_classname(CLASSNAME(ref), &type) != CMPI_RC_OK) { - cu_statusf(broker, &s, - CMPI_RC_ERR_FAILED, - "Could not get ResourceType"); - goto out; - } - - ret = asprintf(&inst_id, "%hi/%s", type, "0"); - if (ret == -1) { - cu_statusf(broker, &s, - CMPI_RC_ERR_FAILED, - "Could not get InstanceID"); - goto out; - } - - CMSetProperty(*inst, "InstanceID", inst_id, CMPI_chars); - CMSetProperty(*inst, "ResourceType", &type, CMPI_uint16); - - out: - return s; -} - -static CMPIStatus return_alloc_cap(const CMPIObjectPath *ref, - const CMPIResult *results, - int names_only) -{ - CMPIStatus s = {CMPI_RC_OK, NULL}; - CMPIInstance *inst = NULL; - - s = get_alloc_cap(_BROKER, ref, &inst); - if (s.rc != CMPI_RC_OK) - goto out; - - if (names_only) - cu_return_instance_name(results, inst); - else - CMReturnInstance(results, inst); - out: - return s; -} static CMPIStatus ac_from_pool(const CMPIBroker *broker, const CMPIObjectPath *ref, @@ -240,7 +183,12 @@ static CMPIStatus EnumInstanceNames(CMPI const CMPIResult *results, const CMPIObjectPath *reference) { - return alloc_cap_instances(_BROKER, reference, results, true, NULL, NULL); + return alloc_cap_instances(_BROKER, + reference, + results, + true, + NULL, + NULL); } static CMPIStatus EnumInstances(CMPIInstanceMI *self, @@ -249,7 +197,12 @@ static CMPIStatus EnumInstances(CMPIInst const CMPIObjectPath *reference, const char **properties) { - return alloc_cap_instances(_BROKER, reference, results, false, properties, NULL); + return alloc_cap_instances(_BROKER, + reference, + results, + false, + properties, + NULL); } DEFAULT_CI(); diff -r b85641f03ae2 -r d26b589173d3 src/Virt_AllocationCapabilities.h --- a/src/Virt_AllocationCapabilities.h Tue Dec 18 10:32:34 2007 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright IBM Corp. 2007 - * - * Authors: - * Jay Gagnon <grendel@linux.vnet.ibm.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -CMPIStatus get_alloc_cap(const CMPIBroker *broker, - const CMPIObjectPath *ref, - CMPIInstance **inst); -/* - * Local Variables: - * mode: C - * c-set-style: "K&R" - * tab-width: 8 - * c-basic-offset: 8 - * indent-tabs-mode: nil - * End: - */

# HG changeset patch # User Kaitlin Rupert <karupert@us.ibm.com> # Date 1197677598 28800 # Node ID a1a748c19a322652edb654c488d4c69603af4f23 # Parent d26b589173d37b0b619a9a8bc31d714bf5ed8e84 AC no longer needs libVirt_RASD. This cleans up the AC build dependencies. Signed-off-by: Kaitlin Rupert <karupert@us.ibm.com> diff -r d26b589173d3 -r a1a748c19a32 src/Makefile.am --- a/src/Makefile.am Fri Dec 14 16:05:58 2007 -0800 +++ b/src/Makefile.am Fri Dec 14 16:13:18 2007 -0800 @@ -2,7 +2,6 @@ SUBDIRS = tests SUBDIRS = tests noinst_HEADERS = profiles.h svpc_types.h \ - Virt_AllocationCapabilities.h \ Virt_ComputerSystem.h \ Virt_ComputerSystemIndication.h \ Virt_Device.h \ @@ -98,9 +97,9 @@ libVirt_ElementCapabilities_la_LIBADD = -lVirt_HostSystem \ -lVirt_VSMigrationCapabilities -libVirt_AllocationCapabilities_la_DEPENDENCIES = libVirt_RASD.la libVirt_DevicePool.la +libVirt_AllocationCapabilities_la_DEPENDENCIES = libVirt_DevicePool.la libVirt_AllocationCapabilities_la_SOURCES = Virt_AllocationCapabilities.c -libVirt_AllocationCapabilities_la_LIBADD = -lVirt_RASD -lVirt_DevicePool +libVirt_AllocationCapabilities_la_LIBADD = -lVirt_DevicePool libVirt_SettingsDefineCapabilities_la_DEPENDENCIES = libVirt_RASD.la libVirt_DevicePool.la libVirt_SettingsDefineCapabilities_la_SOURCES = Virt_SettingsDefineCapabilities.c
participants (1)
-
Kaitlin Rupert