[Libvirt-cim] [PATCH 03/15] vlan extension - CIM model - add class VESSSD
Chip Vincent
cvincent at linux.vnet.ibm.com
Fri Dec 23 19:52:28 UTC 2011
Organization and formatting looks good.
On 12/07/2011 04:24 AM, Wayne Xia wrote:
> This patch added class the Net_VirtualEthernetSwitchSystemSettingData.
>
> Signed-off-by: Wayne Xia<xiawenc at linux.vnet.ibm.com>
> ---
> schema/VirtualEthernetSwitchSystemSettingData.mof | 27 ++
> ...ualEthernetSwitchSystemSettingData.registration | 3 +
> src/Virt_VESSSD.c | 372 ++++++++++++++++++++
> src/Virt_VESSSD.h | 39 ++
> 4 files changed, 441 insertions(+), 0 deletions(-)
> create mode 100644 schema/VirtualEthernetSwitchSystemSettingData.mof
> create mode 100644 schema/VirtualEthernetSwitchSystemSettingData.registration
> create mode 100644 src/Virt_VESSSD.c
> create mode 100644 src/Virt_VESSSD.h
>
> diff --git a/schema/VirtualEthernetSwitchSystemSettingData.mof b/schema/VirtualEthernetSwitchSystemSettingData.mof
> new file mode 100644
> index 0000000..81ef22a
> --- /dev/null
> +++ b/schema/VirtualEthernetSwitchSystemSettingData.mof
> @@ -0,0 +1,27 @@
> +// Copyright IBM Corp. 2007
> +
> +
> +/* fix me: the libvirt-cim lacks parent class
> + "VirtualEthernetSwitchSettingData" defined in DSP1050 */
> +[Description (
> + "A class derived from Virt_VirtualEthernetSystemSettingData to represent "
> + "the config of ."),
> + Provider("cmpi::Virt_VESSSD")
> +]
> +class Net_VirtualEthernetSwitchSystemSettingData : CIM_VirtualSystemSettingData
> +{
> +
> + [Description ("Virtual Switch System type number")]
> + string VirtualSystemType;
> +
> + string AssociatedResourcePool;
> +
> + uint16 VLAN_Connection[];
> +
> + uint16 MaxNumAddress;
> +
> + uint16 EVBMode;
> +
> + uint16 STP;
> +
> +};
> diff --git a/schema/VirtualEthernetSwitchSystemSettingData.registration b/schema/VirtualEthernetSwitchSystemSettingData.registration
> new file mode 100644
> index 0000000..14bfc30
> --- /dev/null
> +++ b/schema/VirtualEthernetSwitchSystemSettingData.registration
> @@ -0,0 +1,3 @@
> +# Copyright IBM Corp. 2011
> +# Classname Namespace ProviderName ProviderModule ProviderTypes
> +Net_VirtualEthernetSwitchSystemSettingData root/virt Virt_VESSSD Virt_VESSSD instance
> diff --git a/src/Virt_VESSSD.c b/src/Virt_VESSSD.c
> new file mode 100644
> index 0000000..71627da
> --- /dev/null
> +++ b/src/Virt_VESSSD.c
> @@ -0,0 +1,372 @@
> +/*
> + * Copyright IBM Corp. 2011
> + *
> + * Authors:
> + * Wenchao Xia<xiawenc at cn.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<string.h>
> +
> +#include<cmpidt.h>
> +#include<cmpift.h>
> +#include<cmpimacs.h>
> +
> +#include<libcmpiutil/libcmpiutil.h>
> +#include<libcmpiutil/std_instance.h>
> +
> +#include "cs_util.h"
> +#include "misc_util.h"
> +#include "device_parsing.h"
> +
> +#include "Virt_VirtualEthernetSwitchSystem.h"
> +#include "Virt_VESSSD.h"
> +#include "network_model.h"
> +
> +static const CMPIBroker *_BROKER;
> +
> +static int set_primary_for_vesssd(const char *prefix, const CMPIBroker *broker,
> + EthIface *piface, CMPIInstance *instance)
> +{
> + char *name, *vesssd_name;
> + int asret;
> +
> + if (piface->name == NULL) {
> + return 0;
> + }
> +
> + CMSetProperty(instance, "VirtualSystemType",
> + (CMPIValue *)"DMTF:VirtualEthernetSwitch", CMPI_chars);
> +
> + name = get_switch_name_from_iface(piface->name);
> + asret = asprintf(&vesssd_name, "%s:%s", prefix, name);
> +
> + CMSetProperty(instance, "InstanceID",
> + (CMPIValue *)vesssd_name, CMPI_chars);
> + CMSetProperty(instance, "ElementName",
> + (CMPIValue *)name, CMPI_chars);
> + CMSetProperty(instance, "VirtualSystemIdentifier",
> + (CMPIValue *)name, CMPI_chars);
> + CMSetProperty(instance, "VirtualSystemType",
> + (CMPIValue *)prefix, CMPI_chars);
> +
> +
> +
> + free(vesssd_name);
> + SAFE_FREE(name);
> +
> + return 1;
> +}
> +
> +static int set_secondary_for_vesssd(const CMPIBroker *broker, EthIface *piface,
> + CMPIInstance *instance)
> +{
> + if (piface->eth_type == ETH_TYPE_BRIDGE) {
> + CMSetProperty(instance, "STP",
> + (CMPIValue *)&piface->pbr_prop->STP, CMPI_uint16);
> + }
> +
> + /* TODO add VLAN id discovery */
> + return 1;
> +}
> +
> +/* Populate an instance with information from a switch */
> +static CMPIStatus set_properties(const CMPIBroker *broker,
> + EthIface *piface,
> + const char *prefix,
> + CMPIInstance *instance)
> +{
> + CMPIStatus s = {CMPI_RC_ERR_FAILED, NULL};
> + char *errstr;
> +
> + if (!set_primary_for_vesssd(prefix, broker, piface, instance)) {
> + errstr = "failed to set primary properties for instance.";
> + CU_DEBUG("%s, iface name %s.", errstr, piface->name);
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + errstr);
> + goto out;
> + }
> + if (!set_secondary_for_vesssd(broker, piface, instance)) {
> + errstr = "failed to set secondary properties for instance.";
> + CU_DEBUG("%s, iface name %s.", errstr, piface->name);
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + errstr);
> + goto out;
> + }
> +
> + cu_statusf(broker,&s,
> + CMPI_RC_OK,
> + "");
> +
> + out:
> + return s;
> +}
> +
> +static CMPIStatus instance_from_vesssd(const CMPIBroker *broker,
> + const CMPIObjectPath *reference,
> + EthIface *piface,
> + CMPIInstance **_inst)
> +{
> + CMPIStatus s = {CMPI_RC_OK, NULL};
> + CMPIInstance *inst = NULL;
> +
> + inst = get_typed_instance(broker,
> + NETWORK_CLASS_PREFIX,
> + "VirtualEthernetSwitchSystemSettingData",
> + NAMESPACE(reference));
> + if (inst == NULL) {
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + "Unable to init SwitchSystem instance");
> + goto out;
> + }
> +
> + s = set_properties(broker,
> + piface,
> + VESSD_SYSTEM_PREFIX,
> + inst);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + *_inst = inst;
> +
> + out:
> + return s;
> +}
> +
> +CMPIStatus enum_vesssd(const CMPIBroker *broker,
> + const CMPIObjectPath *reference,
> + struct inst_list *plist)
> +{
> + CMPIStatus s = {CMPI_RC_OK, NULL};
> + EthIfacesList ifaces_list;
> + int ret, i;
> + char *errstr;
> +
> + eth_ifaceslist_init(&ifaces_list);
> +
> + ret = get_host_ifaces(&ifaces_list,
> + eth_iface_filter_cim_switch, NULL);
> +
> + if (ret != 1) {
> + errstr = get_host_iface_error_reason(ret);
> + CU_DEBUG("error num %d returned, reason %s.", ret, errstr);
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + errstr);
> + goto out;
> + }
> +
> + i = 0;
> + while (i< ifaces_list.count) {
> + CMPIInstance *inst = NULL;
> +
> + s = instance_from_vesssd(broker,
> + reference,
> + ifaces_list.pifaces[i],
> +&inst);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + inst_list_add(plist, inst);
> + i++;
> + }
> +
> + out:
> + eth_ifaceslist_uninit(&ifaces_list);
> +
> + return s;
> +}
> +
> +static CMPIStatus return_enum_vesssd(const CMPIBroker *broker,
> + const CMPIObjectPath *reference,
> + const CMPIResult *results,
> + bool names_only)
> +{
> + struct inst_list list;
> + CMPIStatus s = {CMPI_RC_OK, NULL};
> + inst_list_init(&list);
> +
> + s = enum_vesssd(broker, reference,&list);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + if (names_only) {
> + cu_return_instance_names(results,&list);
> + } else {
> + cu_return_instances(results,&list);
> + }
> + out:
> + inst_list_free(&list);
> + return s;
> +}
> +
> +CMPIStatus get_vesssd_by_name(const CMPIBroker *broker,
> + const char *name,
> + const CMPIObjectPath *reference,
> + CMPIInstance **_inst)
> +{
> + CMPIStatus s = {CMPI_RC_OK, NULL};
> + CMPIInstance *inst = NULL;
> + char *eth_name = NULL;
> + char *errstr;
> + int ret;
> + EthIfacesList ifaces_list;
> +
> + eth_ifaceslist_init(&ifaces_list);
> +
> + eth_name = get_iface_name_from_switch(name);
> + if (eth_name == NULL) {
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + "failed to convert switch_name");
> + CU_DEBUG("switch name %s failed to convert.", name);
> + goto out;
> + }
> +
> + ret = get_host_ifaces(&ifaces_list,
> + eth_iface_filter_cim_switch_for_name, eth_name);
> +
> + if (ret != 1) {
> + errstr = get_host_iface_error_reason(ret);
> + CU_DEBUG("error num %d returned, reason %s.", ret, errstr);
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + errstr);
> + goto out;
> + }
> + if (ifaces_list.count != 1) {
> + errstr = "expected switch not found.";
> + CU_DEBUG("%s\n", errstr);
> + eth_ifaceslist_print(&ifaces_list);
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_FAILED,
> + errstr);
> + goto out;
> + }
> +
> + s = instance_from_vesssd(broker,
> + reference,
> + ifaces_list.pifaces[0],
> +&inst);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + *_inst = inst;
> +
> + out:
> + eth_ifaceslist_uninit(&ifaces_list);
> + SAFE_FREE(eth_name);
> + return s;
> +}
> +
> +CMPIStatus get_vesssd_by_ref(const CMPIBroker *broker,
> + const CMPIObjectPath *reference,
> + CMPIInstance **_inst)
> +{
> + CMPIStatus s = {CMPI_RC_OK, NULL};
> + CMPIInstance *inst = NULL;
> + char *name = NULL;
> +
> + if ((!parse_instanceid(reference, NULL,&name)) || (name == NULL)) {
> + cu_statusf(broker,&s,
> + CMPI_RC_ERR_NOT_FOUND,
> + "No such instance (InstanceID)");
> + goto out;
> + }
> +
> + s = get_vesssd_by_name(broker, name, reference,&inst);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + s = cu_validate_ref(broker, reference, inst);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + *_inst = inst;
> +
> + out:
> + free(name);
> +
> + return s;
> +}
> +
> +static CMPIStatus EnumInstanceNames(CMPIInstanceMI *self,
> + const CMPIContext *context,
> + const CMPIResult *results,
> + const CMPIObjectPath *reference)
> +{
> + return return_enum_vesssd(_BROKER, reference, results, true);
> +}
> +
> +static CMPIStatus EnumInstances(CMPIInstanceMI *self,
> + const CMPIContext *context,
> + const CMPIResult *results,
> + const CMPIObjectPath *reference,
> + const char **properties)
> +{
> + return return_enum_vesssd(_BROKER, reference, results, false);
> +}
> +
> +static CMPIStatus GetInstance(CMPIInstanceMI *self,
> + const CMPIContext *context,
> + const CMPIResult *results,
> + const CMPIObjectPath *reference,
> + const char **properties)
> +{
> + CMPIStatus s;
> + CMPIInstance *inst = NULL;
> +
> + s = get_vesssd_by_ref(_BROKER, reference,&inst);
> + if (s.rc != CMPI_RC_OK) {
> + goto out;
> + }
> +
> + CMReturnInstance(results, inst);
> +
> + out:
> + return s;
> +}
> +
> +DEFAULT_CI();
> +DEFAULT_MI();
> +DEFAULT_DI();
> +DEFAULT_EQ();
> +DEFAULT_INST_CLEANUP();
> +
> +STD_InstanceMIStub(,
> + Virt_VESSSD,
> + _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:
> + */
> diff --git a/src/Virt_VESSSD.h b/src/Virt_VESSSD.h
> new file mode 100644
> index 0000000..5105057
> --- /dev/null
> +++ b/src/Virt_VESSSD.h
> @@ -0,0 +1,39 @@
> +/*
> + * Copyright IBM Corp. 2011
> + *
> + * Authors:
> + * Wenchao Xia<xiawenc at cn.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
> + */
> +#ifndef __VIRT_VESSSD_H
> +#define __VIRT_VESSSD_H
> +
> +
> +CMPIStatus enum_vesssd(const CMPIBroker *broker,
> + const CMPIObjectPath *reference,
> + struct inst_list *plist);
> +
> +CMPIStatus get_vesssd_by_ref(const CMPIBroker *broker,
> + const CMPIObjectPath *reference,
> + CMPIInstance **_inst);
> +
> +CMPIStatus get_vesssd_by_name(const CMPIBroker *broker,
> + const char *name,
> + const CMPIObjectPath *reference,
> + CMPIInstance **_inst);
> +
> +
> +#endif
--
Chip Vincent
Open Virtualization
IBM Linux Technology Center
cvincent at linux.vnet.ibm.com
More information about the Libvirt-cim
mailing list