[PATCH] Add ConcreteComponent with NetworkPool support

# HG changeset patch # User Dan Smith <danms@us.ibm.com> # Date 1219353207 25200 # Node ID 5f3be2816c7c7128d8bc6fc4aee5cadc4a9fa338 # Parent 90ac6766de08cb6f0beca7f7c4cba35331ac83a5 Add ConcreteComponent with NetworkPool support This adds the ConcreteComponent association, and hooks it up to NetworkPool for now. If you have sblim-cmpi-network on your system, this references the Linux_EthernetPort instance exposed by SBLIM for the bridge device associated with the network pool. Note that port_to_netpool() is untested and won't get called by the CIMOM because we're not registering this association in root/cimv2. I don't think it makes much sense for us to do that to support this backwards, so I'm content to leave this as kinda broken until someone comes up with a better idea, or complains. Signed-off-by: Dan Smith <danms@us.ibm.com> diff -r 90ac6766de08 -r 5f3be2816c7c Makefile.am --- a/Makefile.am Wed Aug 20 15:33:36 2008 -0700 +++ b/Makefile.am Thu Aug 21 14:13:27 2008 -0700 @@ -41,7 +41,8 @@ schema/VSMigrationService.mof \ schema/VSMigrationSettingData.mof \ schema/VirtualSystemSnapshotService.mof \ - schema/VirtualSystemSnapshotServiceCapabilities.mof + schema/VirtualSystemSnapshotServiceCapabilities.mof \ + schema/ConcreteComponent.mof INTEROP_MOFS = \ schema/ComputerSystem.mof \ @@ -88,7 +89,8 @@ schema/ElementConformsToProfile.registration \ schema/VSMigrationSettingData.registration \ schema/VirtualSystemSnapshotService.registration \ - schema/VirtualSystemSnapshotServiceCapabilities.registration + schema/VirtualSystemSnapshotServiceCapabilities.registration \ + schema/ConcreteComponent.registration INTEROP_REGS = \ schema/RegisteredProfile.registration \ diff -r 90ac6766de08 -r 5f3be2816c7c schema/ConcreteComponent.mof --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/ConcreteComponent.mof Thu Aug 21 14:13:27 2008 -0700 @@ -0,0 +1,5 @@ +// Copyright IBM Corp. 2008 + +class Xen_ConcreteComponent : CIM_ConcreteComponent { }; +class KVM_ConcreteComponent : CIM_ConcreteComponent { }; +class LXC_ConcreteComponent : CIM_ConcreteComponent { }; diff -r 90ac6766de08 -r 5f3be2816c7c schema/ConcreteComponent.registration --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/ConcreteComponent.registration Thu Aug 21 14:13:27 2008 -0700 @@ -0,0 +1,5 @@ +# Copyright IBM Corp. 2008 +# Classname Namespace ProviderName ProviderModule ProviderTypes +Xen_ConcreteComponent root/virt Virt_ConcreteComponent Virt_ConcreteComponent association +KVM_ConcreteComponent root/virt Virt_ConcreteComponent Virt_ConcreteComponent association +KVM_ConcreteComponent root/virt Virt_ConcreteComponent Virt_ConcreteComponent association diff -r 90ac6766de08 -r 5f3be2816c7c src/Makefile.am --- a/src/Makefile.am Wed Aug 20 15:33:36 2008 -0700 +++ b/src/Makefile.am Thu Aug 21 14:13:27 2008 -0700 @@ -64,7 +64,8 @@ libVirt_ResourceAllocationFromPool.la \ libVirt_ElementAllocatedFromPool.la \ libVirt_HostedService.la \ - libVirt_ElementSettingData.la + libVirt_ElementSettingData.la \ + libVirt_ConcreteComponent.la libVirt_ComputerSystem_la_SOURCES = Virt_ComputerSystem.c libVirt_ComputerSystem_la_DEPENDENCIES = libVirt_VirtualSystemSnapshotService.la @@ -186,3 +187,7 @@ libVirt_VirtualSystemSnapshotServiceCapabilities_la_DEPENDENCIES = libVirt_VirtualSystemSnapshotServiceCapabilities_la_SOURCES = Virt_VirtualSystemSnapshotServiceCapabilities.c libVirt_VirtualSystemSnapshotServiceCapabilities_la_LIBADD = + +libVirt_ConcreteComponent_la_DEPENDENCIES = libVirt_HostSystem.la +libVirt_ConcreteComponent_la_SOURCES = Virt_ConcreteComponent.c +libVirt_ConcreteComponent_la_LIBADD = -lVirt_HostSystem diff -r 90ac6766de08 -r 5f3be2816c7c src/Virt_ConcreteComponent.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Virt_ConcreteComponent.c Thu Aug 21 14:13:27 2008 -0700 @@ -0,0 +1,243 @@ +/* + * Copyright IBM Corp. 2007 + * + * Authors: + * Dan Smith <danms@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 <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <stdbool.h> + +#include <libvirt/libvirt.h> + +#include "cmpidt.h" +#include "cmpift.h" +#include "cmpimacs.h" + +#include <libcmpiutil/libcmpiutil.h> +#include <libcmpiutil/std_association.h> +#include "misc_util.h" + +#include "Virt_HostSystem.h" +#include "Virt_DevicePool.h" + +const static CMPIBroker *_BROKER; + +static char *bridge_from_netpool(virConnectPtr conn, + const char *poolid) +{ + char *netname = NULL; + char *bridge = NULL; + virNetworkPtr net = NULL; + + netname = name_from_pool_id(poolid); + if (netname == NULL) { + CU_DEBUG("Unable to parse network pool id: %s", poolid); + goto out; + } + + net = virNetworkLookupByName(conn, netname); + if (net == NULL) { + CU_DEBUG("Unable to find network %s", netname); + goto out; + } + + bridge = virNetworkGetBridgeName(net); + out: + free(netname); + virNetworkFree(net); + + return bridge; +} + +static CMPIInstance *get_bridge_instance(const CMPIContext *context, + const CMPIObjectPath *ref, + const char *bridge, + CMPIStatus *s) +{ + CMPIObjectPath *path; + CMPIInstance *inst = NULL; + const char *cn = "Linux_EthernetPort"; + const char *sys = NULL; + const char *syscc = NULL; + + *s = get_host_system_properties(&sys, &syscc, ref, _BROKER, context); + if (s->rc != CMPI_RC_OK) + goto out; + + path = CMNewObjectPath(_BROKER, "root/cimv2", cn, s); + if ((path == NULL) || (s->rc != CMPI_RC_OK)) + goto out; + + CMAddKey(path, "CreationClassName", cn, CMPI_chars); + CMAddKey(path, "SystemName", sys, CMPI_chars); + CMAddKey(path, "SystemCreationClassName", syscc, CMPI_chars); + CMAddKey(path, "DeviceID", bridge, CMPI_chars); + + inst = CBGetInstance(_BROKER, context, path, NULL, s); + out: + return inst; +} + +static CMPIStatus netpool_to_port(const CMPIObjectPath *ref, + struct std_assoc_info *info, + struct inst_list *list) +{ + virConnectPtr conn = NULL; + CMPIStatus s; + const char *poolid; + char *bridge = NULL; + CMPIInstance *inst; + + conn = connect_by_classname(_BROKER, CLASSNAME(ref), &s); + if (conn == NULL) + return s; + + if (cu_get_str_path(ref, "InstanceID", &poolid) != CMPI_RC_OK) { + CU_DEBUG("Failed to get InstanceID from NetworkPool"); + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_FAILED, + "Missing InstanceID in NetworkPool"); + goto out; + } + + bridge = bridge_from_netpool(conn, poolid); + if (bridge == NULL) { + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_NOT_FOUND, + "NetworkPool not found"); + goto out; + } + + inst = get_bridge_instance(info->context, ref, bridge, &s); + if (inst != NULL) + inst_list_add(list, inst); + + out: + free(bridge); + virConnectClose(conn); + + return s; +} + +static CMPIStatus port_to_netpool(const CMPIObjectPath *ref, + struct std_assoc_info *info, + struct inst_list *list) +{ + CMPIStatus s; + const char *device; + virConnectPtr conn = NULL; + CMPIInstance *inst = NULL; + char *id = NULL; + + if (cu_get_str_path(ref, "DeviceID", &device) != CMPI_RC_OK) { + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_FAILED, + "Missing DeviceID from EthernetPort"); + return s; + } + + conn = connect_by_classname(_BROKER, CLASSNAME(ref), &s); + if (conn == NULL) + return s; + + if (asprintf(&id, "NetworkPool/%s", device) == -1) { + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_FAILED, + "Unable to format NetworkPool ID"); + goto out; + } + + s = get_pool_by_name(_BROKER, ref, id, &inst); + if ((inst != NULL) && (s.rc == CMPI_RC_OK)) + inst_list_add(list, inst); + out: + free(id); + virConnectClose(conn); + + return s; +} + +LIBVIRT_CIM_DEFAULT_MAKEREF() + +static char *GroupComponent[] = { + "Xen_NetworkPool", + "KVM_NetworkPool", + "LXC_NetworkPool", + NULL +}; + +static char *PartComponent[] = { + "Linux_EthernetPort", + NULL, +}; + +static char *assoc_classname[] = { + "Xen_ConcreteComponent", + "KVM_ConcreteComponent", + "LXC_ConcreteComponent", + NULL +}; + +static struct std_assoc _netpool_to_port = { + .source_class = (char **)&GroupComponent, + .source_prop = "GroupComponent", + + .target_class = (char **)&PartComponent, + .target_prop = "PartComponent", + + .assoc_class = (char **)&assoc_classname, + + .handler = netpool_to_port, + .make_ref = make_ref +}; + +static struct std_assoc _port_to_netpool = { + .source_class = (char **)&PartComponent, + .source_prop = "PartComponent", + + .target_class = (char **)&GroupComponent, + .target_prop = "GroupComponent", + + .assoc_class = (char **)&assoc_classname, + + .handler = port_to_netpool, + .make_ref = make_ref +}; + +static struct std_assoc *handlers[] = { + &_netpool_to_port, + &_port_to_netpool, + NULL +}; + +STDA_AssocMIStub(, + Virt_ConcreteComponent, + _BROKER, + libvirt_cim_init(), + handlers); + +/* + * Local Variables: + * mode: C + * c-set-style: "K&R" + * tab-width: 8 + * c-basic-offset: 8 + * indent-tabs-mode: nil + * End: + */
participants (1)
-
Dan Smith