[PATCH] Query switch to find its vsi capabilities

# HG changeset patch # User Sharad Mishra <snmishra@us.ibm.com> # Date 1299082247 28800 # Node ID 134137bc4f2505fc3576b312b8ef2c63a510fa68 # Parent 432922275bea75a769cf058209bdb81198f3b360 Query switch to find its vsi capabilities. This patch adds a new 'SwitchService' provider that will query the switch to check if it supports VSI. Signed-off-by: Sharad Mishra <snmishra@us.ibm.com> diff -r 432922275bea -r 134137bc4f25 Makefile.am --- a/Makefile.am Fri Jan 21 15:59:27 2011 -0500 +++ b/Makefile.am Wed Mar 02 08:10:47 2011 -0800 @@ -28,6 +28,7 @@ schema/ElementConformsToProfile.mof \ schema/ComputerSystemIndication.mof \ schema/ResourceAllocationSettingDataIndication.mof \ + schema/SwitchService.mof \ schema/ComputerSystemMigrationIndication.mof \ schema/Virt_ResourceAllocationSettingData.mof \ schema/ResourceAllocationSettingData.mof \ @@ -108,6 +109,7 @@ schema/HostedResourcePool.registration \ schema/ComputerSystemIndication.registration \ schema/ResourceAllocationSettingDataIndication.registration \ + schema/SwitchService.registration \ schema/ComputerSystemMigrationIndication.registration \ schema/ResourceAllocationSettingData.registration \ schema/ResourcePoolConfigurationService.registration \ diff -r 432922275bea -r 134137bc4f25 schema/SwitchService.mof --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/SwitchService.mof Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,27 @@ +// Copyright IBM Corp. 2011 + +[Provider("cmpi::Virt_SwitchService")] +class Xen_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + +[Provider("cmpi::Virt_SwitchService")] +class KVM_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + +[Provider("cmpi::Virt_SwitchService")] +class LXC_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + + diff -r 432922275bea -r 134137bc4f25 schema/SwitchService.registration --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/SwitchService.registration Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,6 @@ +# Copyright IBM Corp. 2011 +# Classname Namespace ProviderName ProviderModule ProviderTypes +Xen_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance +KVM_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance +LXC_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance + diff -r 432922275bea -r 134137bc4f25 src/Makefile.am --- a/src/Makefile.am Fri Jan 21 15:59:27 2011 -0500 +++ b/src/Makefile.am Wed Mar 02 08:10:47 2011 -0800 @@ -49,6 +49,7 @@ libVirt_SystemDevice.la \ libVirt_ComputerSystemIndication.la \ libVirt_ResourceAllocationSettingDataIndication.la \ + libVirt_SwitchService.la \ libVirt_ComputerSystemMigrationIndication.la \ libVirt_VirtualSystemManagementCapabilities.la \ libVirt_AllocationCapabilities.la \ @@ -91,6 +92,10 @@ libVirt_ResourceAllocationSettingDataIndication_la_SOURCES = Virt_ResourceAllocationSettingDataIndication.c libVirt_ResourceAllocationSettingDataIndication_la_LIBADD = -lVirt_ComputerSystem +libVirt_SwitchService_la_DEPENDENCIES = libVirt_ComputerSystem.la +libVirt_SwitchService_la_SOURCES = Virt_SwitchService.c +libVirt_SwitchService_la_LIBADD = -lVirt_ComputerSystem + libVirt_ComputerSystemMigrationIndication_la_DEPENDENCIES = libVirt_ComputerSystem.la libVirt_ComputerSystemMigrationIndication_la_SOURCES = Virt_ComputerSystemMigrationIndication.c libVirt_ComputerSystemMigrationIndication_la_LIBADD = -lVirt_ComputerSystem diff -r 432922275bea -r 134137bc4f25 src/Virt_SwitchService.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Virt_SwitchService.c Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,297 @@ +/* + * Copyright IBM Corp. 2011 + * + * Authors: + * Sharad Mishra <snmishra@us.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 + */ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdbool.h> +#include <errno.h> + +#include <cmpidt.h> +#include <cmpift.h> +#include <cmpimacs.h> + +#include <libcmpiutil/libcmpiutil.h> +#include <libcmpiutil/std_instance.h> + +#include "misc_util.h" +#include "config.h" + +#define MAX_LEN 512 +#define CMD "/sbin/ifconfig -a | /bin/grep eth | /bin/awk '{print$1}'" + +const static CMPIBroker *_BROKER; + +static CMPIStatus check_vsi_support(char *command) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + char buff[MAX_LEN]; + FILE *stream = NULL; + const char *searchStr[] = {" supported forwarding mode: " + "(0x40) reflective relay", + " supported capabilities: " + "(0x07) RTE ECP VDP"}; + int matched = 0; + + // Run lldptool command to find vsi support. + stream = popen(command, "r"); + if (stream == NULL) { + CU_DEBUG("Failed to open pipe to read vsi support"); + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to open pipe"); + goto out; + } + + // Read the output of the command. + while (fgets(buff, MAX_LEN, stream) != NULL) { + int i = 0; + while (searchStr[i] != NULL) { + int len = strlen(searchStr[i]); + /* Read value which is stored in 'buff' has newline + at the end, we remove it for comparison. */ + if (strncmp(buff, searchStr[i], (len - 1)) == 0) { + /* 'matched' flag is incremented each time + we find that read string (output of lldptool + command) and searchStrings are same. */ + matched++; + break; + } + i++; + } + /* All the search strings were found in the output of this + command. */ + if (matched == 2) { + cu_statusf(_BROKER, &s, CMPI_RC_OK, "VSI supported"); + goto out;; + } + } + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_NOT_FOUND, + "No VSI Support found"); + + out: + pclose(stream); + return s; +} + +static char **run_command(char *func, int *len, CMPIStatus *s) { + + char buff[MAX_LEN]; + FILE *stream = NULL; + char **arr = NULL; + char *string = NULL; + int i = 0; + + // run the command. + stream = popen(func, "r"); + if (stream == NULL) { + CU_DEBUG("Failed to open pipe to run command"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to open pipe"); + return NULL; + } + + // read output of command. + while (fgets(buff, MAX_LEN, stream) != NULL) { + int len = strlen(buff) - 1; + char **tmp_list = NULL; + + // dynamically increase size as more interfaces are found. + tmp_list = (char **)realloc(arr, + (i + 1) * + sizeof(char *)); + if (tmp_list == NULL) { + CU_DEBUG("Failed to allocate memory"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to realloc"); + return NULL; + } + + arr = tmp_list; + + string = calloc(len, sizeof(char)); + if (string == NULL) { + CU_DEBUG("Failed to allocate memory"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to calloc"); + return NULL; + } + strncpy(string, buff, len); + arr[i] = string; + i++; + } + + pclose(stream); + *len = i; + return arr; +} + +static CMPIStatus get_switchservice(const CMPIObjectPath *reference, + CMPIInstance **_inst, + const CMPIBroker *broker, + const CMPIContext *context, + bool is_get_inst) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst = NULL; + virConnectPtr conn = NULL; + bool vsi = false; + int count = 0; + int i; + char **if_list; + char cmd[MAX_LEN]; + + *_inst = NULL; + conn = connect_by_classname(broker, CLASSNAME(reference), &s); + if (conn == NULL) { + if (is_get_inst) + cu_statusf(broker, &s, + CMPI_RC_ERR_NOT_FOUND, + "No such instance"); + + return s; + } + + inst = get_typed_instance(broker, + pfx_from_conn(conn), + "SwitchService", + NAMESPACE(reference)); + + if (inst == NULL) { + CU_DEBUG("Failed to get typed instance"); + cu_statusf(broker, &s, + CMPI_RC_ERR_FAILED, + "Failed to create instance"); + goto out; + } + + CMSetProperty(inst, "Name", + (CMPIValue *)"Switch Virtualization Capabilities", + CMPI_chars); + + if_list = run_command(CMD, &count, &s); + if (if_list == 0) { + CU_DEBUG("Failed to get network interfaces"); + cu_statusf(broker, &s, + CMPI_RC_ERR_FAILED, + "Failed to get network interfaces"); + goto out; + } + + CU_DEBUG("Found %d interfaces", count); + + + for (i=0; i<count; i++) { + sprintf(cmd, "lldptool -i %s -t -V evbcfg", if_list[i]); + CU_DEBUG("running command %s ...", cmd); + s = check_vsi_support(cmd); + if (s.rc == CMPI_RC_OK) { + vsi = true; + break; + } + else + vsi = false; + } + + CMSetProperty(inst, "IsVSISupported", (CMPIValue *)&vsi, CMPI_boolean); + s.rc = CMPI_RC_OK; + + out: + virConnectClose(conn); + *_inst = inst; + + return s; + +} + +static CMPIStatus return_switchservice(const CMPIContext *context, + const CMPIObjectPath *reference, + const CMPIResult *results, + bool name_only, + bool is_get_inst) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst; + + s = get_switchservice(reference, &inst, _BROKER, context, is_get_inst); + if (s.rc != CMPI_RC_OK || inst == NULL) + goto out; + + if (name_only) + cu_return_instance_name(results, inst); + else + CMReturnInstance(results, inst); + out: + return s; +} + +static CMPIStatus EnumInstanceNames(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref) +{ + return return_switchservice(context, ref, results, true, false); +} + +static CMPIStatus EnumInstances(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref, + const char **properties) +{ + + return return_switchservice(context, ref, results, false, false); +} + +static CMPIStatus GetInstance(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref, + const char **properties) +{ + return return_switchservice(context, ref, results, false, true); +} + +DEFAULT_CI(); +DEFAULT_MI(); +DEFAULT_DI(); +DEFAULT_EQ(); +DEFAULT_INST_CLEANUP(); + +STD_InstanceMIStub(, + Virt_SwitchService, + _BROKER, + libvirt_cim_init()); + +/* + * Local Variables: + * mode: C + * c-set-style: "K&R" + * tab-width: 8 + * c-basic-offset: 8 + * indent-tabs-mode: nil + * End: + */ +

+1. I have not tested since I don't have the hardware. BTW, is there a cimtest update coming for this function? On 03/02/2011 11:24 AM, Sharad Mishra wrote:
# HG changeset patch # User Sharad Mishra<snmishra@us.ibm.com> # Date 1299082247 28800 # Node ID 134137bc4f2505fc3576b312b8ef2c63a510fa68 # Parent 432922275bea75a769cf058209bdb81198f3b360 Query switch to find its vsi capabilities.
This patch adds a new 'SwitchService' provider that will query the switch to check if it supports VSI.
Signed-off-by: Sharad Mishra<snmishra@us.ibm.com>
diff -r 432922275bea -r 134137bc4f25 Makefile.am --- a/Makefile.am Fri Jan 21 15:59:27 2011 -0500 +++ b/Makefile.am Wed Mar 02 08:10:47 2011 -0800 @@ -28,6 +28,7 @@ schema/ElementConformsToProfile.mof \ schema/ComputerSystemIndication.mof \ schema/ResourceAllocationSettingDataIndication.mof \ + schema/SwitchService.mof \ schema/ComputerSystemMigrationIndication.mof \ schema/Virt_ResourceAllocationSettingData.mof \ schema/ResourceAllocationSettingData.mof \ @@ -108,6 +109,7 @@ schema/HostedResourcePool.registration \ schema/ComputerSystemIndication.registration \ schema/ResourceAllocationSettingDataIndication.registration \ + schema/SwitchService.registration \ schema/ComputerSystemMigrationIndication.registration \ schema/ResourceAllocationSettingData.registration \ schema/ResourcePoolConfigurationService.registration \ diff -r 432922275bea -r 134137bc4f25 schema/SwitchService.mof --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/SwitchService.mof Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,27 @@ +// Copyright IBM Corp. 2011 + +[Provider("cmpi::Virt_SwitchService")] +class Xen_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + +[Provider("cmpi::Virt_SwitchService")] +class KVM_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + +[Provider("cmpi::Virt_SwitchService")] +class LXC_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + + diff -r 432922275bea -r 134137bc4f25 schema/SwitchService.registration --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/SwitchService.registration Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,6 @@ +# Copyright IBM Corp. 2011 +# Classname Namespace ProviderName ProviderModule ProviderTypes +Xen_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance +KVM_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance +LXC_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance + diff -r 432922275bea -r 134137bc4f25 src/Makefile.am --- a/src/Makefile.am Fri Jan 21 15:59:27 2011 -0500 +++ b/src/Makefile.am Wed Mar 02 08:10:47 2011 -0800 @@ -49,6 +49,7 @@ libVirt_SystemDevice.la \ libVirt_ComputerSystemIndication.la \ libVirt_ResourceAllocationSettingDataIndication.la \ + libVirt_SwitchService.la \ libVirt_ComputerSystemMigrationIndication.la \ libVirt_VirtualSystemManagementCapabilities.la \ libVirt_AllocationCapabilities.la \ @@ -91,6 +92,10 @@ libVirt_ResourceAllocationSettingDataIndication_la_SOURCES = Virt_ResourceAllocationSettingDataIndication.c libVirt_ResourceAllocationSettingDataIndication_la_LIBADD = -lVirt_ComputerSystem
+libVirt_SwitchService_la_DEPENDENCIES = libVirt_ComputerSystem.la +libVirt_SwitchService_la_SOURCES = Virt_SwitchService.c +libVirt_SwitchService_la_LIBADD = -lVirt_ComputerSystem + libVirt_ComputerSystemMigrationIndication_la_DEPENDENCIES = libVirt_ComputerSystem.la libVirt_ComputerSystemMigrationIndication_la_SOURCES = Virt_ComputerSystemMigrationIndication.c libVirt_ComputerSystemMigrationIndication_la_LIBADD = -lVirt_ComputerSystem diff -r 432922275bea -r 134137bc4f25 src/Virt_SwitchService.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Virt_SwitchService.c Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,297 @@ +/* + * Copyright IBM Corp. 2011 + * + * Authors: + * Sharad Mishra<snmishra@us.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 + */ +#include<stdio.h> +#include<stdlib.h> +#include<unistd.h> +#include<string.h> +#include<stdbool.h> +#include<errno.h> + +#include<cmpidt.h> +#include<cmpift.h> +#include<cmpimacs.h> + +#include<libcmpiutil/libcmpiutil.h> +#include<libcmpiutil/std_instance.h> + +#include "misc_util.h" +#include "config.h" + +#define MAX_LEN 512 +#define CMD "/sbin/ifconfig -a | /bin/grep eth | /bin/awk '{print$1}'" + +const static CMPIBroker *_BROKER; + +static CMPIStatus check_vsi_support(char *command) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + char buff[MAX_LEN]; + FILE *stream = NULL; + const char *searchStr[] = {" supported forwarding mode: " + "(0x40) reflective relay", + " supported capabilities: " + "(0x07) RTE ECP VDP"}; + int matched = 0; + + // Run lldptool command to find vsi support. + stream = popen(command, "r"); + if (stream == NULL) { + CU_DEBUG("Failed to open pipe to read vsi support"); + cu_statusf(_BROKER,&s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to open pipe"); + goto out; + } + + // Read the output of the command. + while (fgets(buff, MAX_LEN, stream) != NULL) { + int i = 0; + while (searchStr[i] != NULL) { + int len = strlen(searchStr[i]); + /* Read value which is stored in 'buff' has newline + at the end, we remove it for comparison. */ + if (strncmp(buff, searchStr[i], (len - 1)) == 0) { + /* 'matched' flag is incremented each time + we find that read string (output of lldptool + command) and searchStrings are same. */ + matched++; + break; + } + i++; + } + /* All the search strings were found in the output of this + command. */ + if (matched == 2) { + cu_statusf(_BROKER,&s, CMPI_RC_OK, "VSI supported"); + goto out;; + } + } + cu_statusf(_BROKER,&s, + CMPI_RC_ERR_NOT_FOUND, + "No VSI Support found"); + + out: + pclose(stream); + return s; +} + +static char **run_command(char *func, int *len, CMPIStatus *s) { + + char buff[MAX_LEN]; + FILE *stream = NULL; + char **arr = NULL; + char *string = NULL; + int i = 0; + + // run the command. + stream = popen(func, "r"); + if (stream == NULL) { + CU_DEBUG("Failed to open pipe to run command"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to open pipe"); + return NULL; + } + + // read output of command. + while (fgets(buff, MAX_LEN, stream) != NULL) { + int len = strlen(buff) - 1; + char **tmp_list = NULL; + + // dynamically increase size as more interfaces are found. + tmp_list = (char **)realloc(arr, + (i + 1) * + sizeof(char *)); + if (tmp_list == NULL) { + CU_DEBUG("Failed to allocate memory"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to realloc"); + return NULL; + } + + arr = tmp_list; + + string = calloc(len, sizeof(char)); + if (string == NULL) { + CU_DEBUG("Failed to allocate memory"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to calloc"); + return NULL; + } + strncpy(string, buff, len); + arr[i] = string; + i++; + } + + pclose(stream); + *len = i; + return arr; +} + +static CMPIStatus get_switchservice(const CMPIObjectPath *reference, + CMPIInstance **_inst, + const CMPIBroker *broker, + const CMPIContext *context, + bool is_get_inst) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst = NULL; + virConnectPtr conn = NULL; + bool vsi = false; + int count = 0; + int i; + char **if_list; + char cmd[MAX_LEN]; + + *_inst = NULL; + conn = connect_by_classname(broker, CLASSNAME(reference),&s); + if (conn == NULL) { + if (is_get_inst) + cu_statusf(broker,&s, + CMPI_RC_ERR_NOT_FOUND, + "No such instance"); + + return s; + } + + inst = get_typed_instance(broker, + pfx_from_conn(conn), + "SwitchService", + NAMESPACE(reference)); + + if (inst == NULL) { + CU_DEBUG("Failed to get typed instance"); + cu_statusf(broker,&s, + CMPI_RC_ERR_FAILED, + "Failed to create instance"); + goto out; + } + + CMSetProperty(inst, "Name", + (CMPIValue *)"Switch Virtualization Capabilities", + CMPI_chars); + + if_list = run_command(CMD,&count,&s); + if (if_list == 0) { + CU_DEBUG("Failed to get network interfaces"); + cu_statusf(broker,&s, + CMPI_RC_ERR_FAILED, + "Failed to get network interfaces"); + goto out; + } + + CU_DEBUG("Found %d interfaces", count); + + + for (i=0; i<count; i++) { + sprintf(cmd, "lldptool -i %s -t -V evbcfg", if_list[i]); + CU_DEBUG("running command %s ...", cmd); + s = check_vsi_support(cmd); + if (s.rc == CMPI_RC_OK) { + vsi = true; + break; + } + else + vsi = false; + } + + CMSetProperty(inst, "IsVSISupported", (CMPIValue *)&vsi, CMPI_boolean); + s.rc = CMPI_RC_OK; + + out: + virConnectClose(conn); + *_inst = inst; + + return s; + +} + +static CMPIStatus return_switchservice(const CMPIContext *context, + const CMPIObjectPath *reference, + const CMPIResult *results, + bool name_only, + bool is_get_inst) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst; + + s = get_switchservice(reference,&inst, _BROKER, context, is_get_inst); + if (s.rc != CMPI_RC_OK || inst == NULL) + goto out; + + if (name_only) + cu_return_instance_name(results, inst); + else + CMReturnInstance(results, inst); + out: + return s; +} + +static CMPIStatus EnumInstanceNames(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref) +{ + return return_switchservice(context, ref, results, true, false); +} + +static CMPIStatus EnumInstances(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref, + const char **properties) +{ + + return return_switchservice(context, ref, results, false, false); +} + +static CMPIStatus GetInstance(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref, + const char **properties) +{ + return return_switchservice(context, ref, results, false, true); +} + +DEFAULT_CI(); +DEFAULT_MI(); +DEFAULT_DI(); +DEFAULT_EQ(); +DEFAULT_INST_CLEANUP(); + +STD_InstanceMIStub(, + Virt_SwitchService, + _BROKER, + libvirt_cim_init()); + +/* + * Local Variables: + * mode: C + * c-set-style: "K&R" + * tab-width: 8 + * c-basic-offset: 8 + * indent-tabs-mode: nil + * End: + */ +
_______________________________________________ Libvirt-cim mailing list Libvirt-cim@redhat.com https://www.redhat.com/mailman/listinfo/libvirt-cim
-- Chip Vincent Open Virtualization IBM Linux Technology Center cvincent@linux.vnet.ibm.com

Chip Vincent <cvincent@linux.vnet.ibm.com> 03/04/11 04:48 PM
Please respond to cvincent@linux.vnet.ibm.com
To
List for discussion and development of libvirt CIM <libvirt-cim@redhat.com>
cc
Sharad Mishra/Beaverton/IBM@IBMUS
Subject
Re: [Libvirt-cim] [PATCH] Query switch to find its vsi capabilities
+1. I have not tested since I don't have the hardware. BTW, is there a cimtest update coming for this function?
On 03/02/2011 11:24 AM, Sharad Mishra wrote:
# HG changeset patch # User Sharad Mishra<snmishra@us.ibm.com> # Date 1299082247 28800 # Node ID 134137bc4f2505fc3576b312b8ef2c63a510fa68 # Parent 432922275bea75a769cf058209bdb81198f3b360 Query switch to find its vsi capabilities.
This patch adds a new 'SwitchService' provider that will query the switch to check if it supports VSI.
Signed-off-by: Sharad Mishra<snmishra@us.ibm.com>
diff -r 432922275bea -r 134137bc4f25 Makefile.am --- a/Makefile.am Fri Jan 21 15:59:27 2011 -0500 +++ b/Makefile.am Wed Mar 02 08:10:47 2011 -0800 @@ -28,6 +28,7 @@ schema/ElementConformsToProfile.mof \ schema/ComputerSystemIndication.mof \ schema/ResourceAllocationSettingDataIndication.mof \ + schema/SwitchService.mof \ schema/ComputerSystemMigrationIndication.mof \ schema/Virt_ResourceAllocationSettingData.mof \ schema/ResourceAllocationSettingData.mof \ @@ -108,6 +109,7 @@ schema/HostedResourcePool.registration \ schema/ComputerSystemIndication.registration \ schema/ResourceAllocationSettingDataIndication.registration \ + schema/SwitchService.registration \ schema/ComputerSystemMigrationIndication.registration \ schema/ResourceAllocationSettingData.registration \ schema/ResourcePoolConfigurationService.registration \ diff -r 432922275bea -r 134137bc4f25 schema/SwitchService.mof --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/SwitchService.mof Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,27 @@ +// Copyright IBM Corp. 2011 + +[Provider("cmpi::Virt_SwitchService")] +class Xen_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + +[Provider("cmpi::Virt_SwitchService")] +class KVM_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + +[Provider("cmpi::Virt_SwitchService")] +class LXC_SwitchService : CIM_SwitchService +{ + [Description("Flag to determine if VSI is supported on the switch")] + boolean IsVSISupported; + +}; + + diff -r 432922275bea -r 134137bc4f25 schema/SwitchService.registration --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/SwitchService.registration Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,6 @@ +# Copyright IBM Corp. 2011 +# Classname Namespace ProviderName ProviderModule ProviderTypes +Xen_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance +KVM_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance +LXC_SwitchService root/virt Virt_SwitchService Virt_SwitchService instance + diff -r 432922275bea -r 134137bc4f25 src/Makefile.am --- a/src/Makefile.am Fri Jan 21 15:59:27 2011 -0500 +++ b/src/Makefile.am Wed Mar 02 08:10:47 2011 -0800 @@ -49,6 +49,7 @@ libVirt_SystemDevice.la \ libVirt_ComputerSystemIndication.la \
+ libVirt_SwitchService.la \ libVirt_ComputerSystemMigrationIndication.la \ libVirt_VirtualSystemManagementCapabilities.la \ libVirt_AllocationCapabilities.la \ @@ -91,6 +92,10 @@ libVirt_ResourceAllocationSettingDataIndication_la_SOURCES = Virt_ResourceAllocationSettingDataIndication.c libVirt_ResourceAllocationSettingDataIndication_la_LIBADD = - lVirt_ComputerSystem
+libVirt_SwitchService_la_DEPENDENCIES = libVirt_ComputerSystem.la +libVirt_SwitchService_la_SOURCES = Virt_SwitchService.c +libVirt_SwitchService_la_LIBADD = -lVirt_ComputerSystem + libVirt_ComputerSystemMigrationIndication_la_DEPENDENCIES =
libVirt_ResourceAllocationSettingDataIndication.la \ libVirt_ComputerSystem.la
libVirt_ComputerSystemMigrationIndication_la_SOURCES = Virt_ComputerSystemMigrationIndication.c libVirt_ComputerSystemMigrationIndication_la_LIBADD = - lVirt_ComputerSystem diff -r 432922275bea -r 134137bc4f25 src/Virt_SwitchService.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Virt_SwitchService.c Wed Mar 02 08:10:47 2011 -0800 @@ -0,0 +1,297 @@ +/* + * Copyright IBM Corp. 2011 + * + * Authors: + * Sharad Mishra<snmishra@us.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 + */ +#include<stdio.h> +#include<stdlib.h> +#include<unistd.h> +#include<string.h> +#include<stdbool.h> +#include<errno.h> + +#include<cmpidt.h> +#include<cmpift.h> +#include<cmpimacs.h> + +#include<libcmpiutil/libcmpiutil.h> +#include<libcmpiutil/std_instance.h> + +#include "misc_util.h" +#include "config.h" + +#define MAX_LEN 512 +#define CMD "/sbin/ifconfig -a | /bin/grep eth | /bin/awk '{print$1}'" + +const static CMPIBroker *_BROKER; + +static CMPIStatus check_vsi_support(char *command) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + char buff[MAX_LEN]; + FILE *stream = NULL; + const char *searchStr[] = {" supported forwarding mode: " + "(0x40) reflective relay", + " supported capabilities: " + "(0x07) RTE ECP VDP"}; + int matched = 0; + + // Run lldptool command to find vsi support. + stream = popen(command, "r"); + if (stream == NULL) { + CU_DEBUG("Failed to open pipe to read vsi support"); + cu_statusf(_BROKER,&s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to open pipe"); + goto out; + } + + // Read the output of the command. + while (fgets(buff, MAX_LEN, stream) != NULL) { + int i = 0; + while (searchStr[i] != NULL) { + int len = strlen(searchStr[i]); + /* Read value which is stored in 'buff' has newline + at the end, we remove it for comparison. */ + if (strncmp(buff, searchStr[i], (len - 1)) ==
+ /* 'matched' flag is incremented each time + we find that read string (output of lldptool + command) and searchStrings are same. */ + matched++; + break; + } + i++; + } + /* All the search strings were found in the output of
+ command. */ + if (matched == 2) { + cu_statusf(_BROKER,&s, CMPI_RC_OK, "VSI supported"); + goto out;; + } + } + cu_statusf(_BROKER,&s, + CMPI_RC_ERR_NOT_FOUND, + "No VSI Support found"); + + out: + pclose(stream); + return s; +} + +static char **run_command(char *func, int *len, CMPIStatus *s) { + + char buff[MAX_LEN]; + FILE *stream = NULL; + char **arr = NULL; + char *string = NULL; + int i = 0; + + // run the command. + stream = popen(func, "r"); + if (stream == NULL) { + CU_DEBUG("Failed to open pipe to run command"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to open pipe"); + return NULL; + } + + // read output of command. + while (fgets(buff, MAX_LEN, stream) != NULL) { + int len = strlen(buff) - 1; + char **tmp_list = NULL; + + // dynamically increase size as more interfaces are found. + tmp_list = (char **)realloc(arr, + (i + 1) * + sizeof(char *)); + if (tmp_list == NULL) { + CU_DEBUG("Failed to allocate memory"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to realloc"); + return NULL; + } + + arr = tmp_list; + + string = calloc(len, sizeof(char)); + if (string == NULL) { + CU_DEBUG("Failed to allocate memory"); + cu_statusf(_BROKER, s, + CMPI_RC_ERR_NOT_FOUND, + "Failed to calloc"); + return NULL; + } + strncpy(string, buff, len); + arr[i] = string; + i++; + } + + pclose(stream); + *len = i; + return arr; +} + +static CMPIStatus get_switchservice(const CMPIObjectPath *reference, + CMPIInstance **_inst, + const CMPIBroker *broker, + const CMPIContext *context, + bool is_get_inst) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst = NULL; + virConnectPtr conn = NULL; + bool vsi = false; + int count = 0; + int i; + char **if_list; + char cmd[MAX_LEN]; + + *_inst = NULL; + conn = connect_by_classname(broker, CLASSNAME(reference),&s); + if (conn == NULL) { + if (is_get_inst) + cu_statusf(broker,&s, + CMPI_RC_ERR_NOT_FOUND, + "No such instance"); + + return s; + } + + inst = get_typed_instance(broker, + pfx_from_conn(conn), + "SwitchService", + NAMESPACE(reference)); + + if (inst == NULL) { + CU_DEBUG("Failed to get typed instance"); + cu_statusf(broker,&s, + CMPI_RC_ERR_FAILED, + "Failed to create instance"); + goto out; + } + + CMSetProperty(inst, "Name", + (CMPIValue *)"Switch Virtualization Capabilities", + CMPI_chars); + + if_list = run_command(CMD,&count,&s); + if (if_list == 0) { + CU_DEBUG("Failed to get network interfaces"); + cu_statusf(broker,&s, + CMPI_RC_ERR_FAILED, + "Failed to get network interfaces"); + goto out; + } + + CU_DEBUG("Found %d interfaces", count); + + + for (i=0; i<count; i++) { + sprintf(cmd, "lldptool -i %s -t -V evbcfg", if_list [i]); + CU_DEBUG("running command %s ...", cmd); + s = check_vsi_support(cmd); + if (s.rc == CMPI_RC_OK) { + vsi = true; + break; + } + else + vsi = false; + } + + CMSetProperty(inst, "IsVSISupported", (CMPIValue *)&vsi, CMPI_boolean); + s.rc = CMPI_RC_OK; + + out: + virConnectClose(conn); + *_inst = inst; + + return s; + +} + +static CMPIStatus return_switchservice(const CMPIContext *context, + const CMPIObjectPath *reference, + const CMPIResult *results, + bool name_only, + bool is_get_inst) +{ + CMPIStatus s = {CMPI_RC_OK, NULL}; + CMPIInstance *inst; + + s = get_switchservice(reference,&inst, _BROKER, context, is_get_inst); + if (s.rc != CMPI_RC_OK || inst == NULL) + goto out; + + if (name_only) + cu_return_instance_name(results, inst); + else + CMReturnInstance(results, inst); + out: + return s; +} + +static CMPIStatus EnumInstanceNames(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref) +{ + return return_switchservice(context, ref, results, true, false); +} + +static CMPIStatus EnumInstances(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref, + const char **properties) +{ + + return return_switchservice(context, ref, results, false, false); +} + +static CMPIStatus GetInstance(CMPIInstanceMI *self, + const CMPIContext *context, + const CMPIResult *results, + const CMPIObjectPath *ref, + const char **properties) +{ + return return_switchservice(context, ref, results, false,
I have tested it. There is no cimtest coming as this can be tested by wbemcli or any cim browser. I am still exploring and may decide to write a cimtest. For now, it is just wbemcli. -Sharad Chip Vincent <cvincent@linux.vnet.ibm.com> wrote on 03/04/2011 04:48:46 PM: 0) { this true);
+} + +DEFAULT_CI(); +DEFAULT_MI(); +DEFAULT_DI(); +DEFAULT_EQ(); +DEFAULT_INST_CLEANUP(); + +STD_InstanceMIStub(, + Virt_SwitchService, + _BROKER, + libvirt_cim_init()); + +/* + * Local Variables: + * mode: C + * c-set-style: "K&R" + * tab-width: 8 + * c-basic-offset: 8 + * indent-tabs-mode: nil + * End: + */ +
_______________________________________________ Libvirt-cim mailing list Libvirt-cim@redhat.com https://www.redhat.com/mailman/listinfo/libvirt-cim
-- Chip Vincent Open Virtualization IBM Linux Technology Center cvincent@linux.vnet.ibm.com
participants (2)
-
Chip Vincent
-
Sharad Mishra