[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] ESX: Add routines to interface driver



Thanks Daniel for sharing the link. I got the idea and will try to adhere to the standards. 
 
One observation I want to share about "make check", with a fresh branch I see one failure:
-----
      .....!!!!!!...!!!!!!!!!!!!!!!!!!!!!!!!!  39  FAIL
FAIL: libvirtdconftest
TEST: capabilityschematest

.
.
.
=======================================
1 of 63 tests failed
Please report to libvir-list redhat com
=======================================
make[2]: *** [check-TESTS] Error 1
make[2]: Leaving directory `/home/abohra/libvirt_untouched/libvirt/tests'
make[1]: *** [check-am] Error 2
make[1]: Leaving directory `/home/abohra/libvirt_untouched/libvirt/tests'
make: *** [check-recursive] Error 1

---------------------
 
The branch with my patch also reports the same result, I have a feeling that this failure  may not be because of my commit, but I will double check everything (so far in my test bed I can see new added functions working properly).

About the make syntax-check, I will update with the modifications.
 
Thanks!
Ata

 
> Date: Mon, 9 Jul 2012 11:21:04 +0800
> From: veillard redhat com
> To: ata husain hotmail com
> CC: libvir-list redhat com
> Subject: Re: [libvirt] [PATCH] ESX: Add routines to interface driver
>
> On Sun, Jul 08, 2012 at 11:36:47AM -0700, Ata Bohra wrote:
> > From: Ata E Husain <ata husain hotmail com>
> >
> > Includes most of the dirver routines except DefineXML, I am working on it and will update patch for it soon.
>
> typo s/dirver/driver/
>
> I guess you didn't really understand the reason why Doug asked you to
> go though git-send-email
>
> That part of the message is what will be recorded permanently in the
> git patch database and is supposed to explain why that patch is needed
> and how it does it. Comment about future patches are not supposed to
> go there, but explanation of why that patch is there, its function.
>
> I would suggest reading some of the rants from the kernel guys
> about why they get grumpy when receiving patches, this can be
> educational and even fun at times :-) For example James Bottomley
> https://events.linuxfoundation.org/images/stories/pdf/lcjp2012_bottomley.pdf
> around page 17 or one of the presentations from Greg Kroah-Hartman
> (but it's better to watch them than read them ;-)
>
> > diff --git a/src/esx/esx_interface_driver.c b/src/esx/esx_interface_driver.c
> > index 5713137..4feadc2 100644
> > --- a/src/esx/esx_interface_driver.c
> > +++ b/src/esx/esx_interface_driver.c
> > @@ -23,6 +23,10 @@
> > */
> >
> > #include <config.h>
> > +#include <sys/socket.h>
> > +#include <netinet/in.h>
> > +#include <arpa/inet.h>
> > +#include <libxml/parser.h>
> >
> > #include "internal.h"
> > #include "util.h"
> > @@ -34,10 +38,10 @@
> > #include "esx_vi.h"
> > #include "esx_vi_methods.h"
> > #include "esx_util.h"
> > +#include "interface_conf.h"
> >
> > #define VIR_FROM_THIS VIR_FROM_ESX
> > -
> > -
> > +#define XML_CAST (const xmlChar*)
> >
> > static virDrvOpenStatus
> > esxInterfaceOpen(virConnectPtr conn,
> > @@ -67,10 +71,565 @@ esxInterfaceClose(virConnectPtr conn)
> >
> >
> >
> > +static int
> > +esxNumOfInterfaces(virConnectPtr conn)
> > +{
> > + esxPrivate *priv = conn->interfacePrivateData;
> > + esxVI_HostVirtualNic *virtualNicList = NULL;
> > + const esxVI_HostVirtualNic *virtualNic = NULL;
> > + int count = 0;
> > +
> > + if (esxVI_EnsureSession(priv->primary) < 0 ||
> > + esxVI_LookupVirtualNicList(priv->primary, &virtualNicList) < 0) {
> > + goto cleanup;
> > + }
> > +
> > + if (virtualNicList == NULL) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not retrieve vNic List"));
> > +
> > + goto cleanup;
> > + }
> > +
> > + for (virtualNic = virtualNicList;
> > + virtualNic != NULL;
> > + virtualNic = virtualNic->_next) {
> > + count++;
> > + }
> > +
> > +cleanup:
> > + esxVI_HostVirtualNic_Free(&virtualNicList);
> > +
> > + return count;
> > +}
> > +
> > +
> > +
> > +static int
> > +esxNumOfDefinedInterfaces(virConnectPtr conn)
> > +{
> > + conn->interfacePrivateData = NULL;
> > +
> > + // ESX interfaces are always active
> > + return 0;
> > +}
> > +
> > +
> > +
> > +static int
> > +esxListInterfaces(virConnectPtr conn, char **names, int maxnames)
> > +{
> > + esxPrivate *priv = conn->interfacePrivateData;
> > + esxVI_HostVirtualNic *virtualNicList = NULL;
> > + const esxVI_HostVirtualNic *virtualNic = NULL;
> > + int result = -1;
> > + int i = 0;
> > +
> > + if (esxVI_EnsureSession(priv->primary) < 0 ||
> > + esxVI_LookupVirtualNicList(priv->primary,
> > + &virtualNicList) < 0) {
> > + goto cleanup;
> > + }
> > +
> > + if (virtualNicList == NULL) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not retrieve vNIC List"));
> > + goto cleanup;
> > + }
> > +
> > + for (i= 0, virtualNic = virtualNicList;
> > + virtualNic != NULL && i < maxnames;
> > + ++i, virtualNic = virtualNic->_next) {
> > + names[i] = strdup(virtualNic->device);
> > +
> > + if (names[i] == NULL) {
> > + for(;i >=0;--i) {
> > + VIR_FREE(names[i]);
> > + }
> > + virReportOOMError();
> > + goto cleanup;
> > + }
> > + }
> > +
> > + result = i;
> > + cleanup:
> > + esxVI_HostVirtualNic_Free(&virtualNicList);
> > +
> > + return result;
> > +}
> > +
> > +
> > +
> > +static int
> > +esxListDefinedInterfaces(virConnectPtr conn, char **names, int maxnames)
> > +{
> > + conn->interfacePrivateData = NULL;
> > + *names = NULL;
> > +
> > + /* keeps compiler happy */
> > + VIR_DEBUG("Max Interfaces: %d", maxnames);
> > + /* ESX interfaces are always active */
> > + return 0;
> > +}
> > +
> > +
> > +
> > +static virInterfacePtr
> > +esxInterfaceLookupByName(virConnectPtr conn, const char *name)
> > +{
> > + esxPrivate *priv = conn->interfacePrivateData;
> > + esxVI_HostVirtualNic *virtualNicList = NULL;
> > + const esxVI_HostVirtualNic *virtualNic = NULL;
> > + virInterfacePtr ret = NULL;
> > +
> > + if (esxVI_EnsureSession(priv->primary) < 0 ||
> > + esxVI_LookupVirtualNicList(priv->primary,
> > + &virtualNicList) < 0) {
> > + goto cleanup;
> > + }
> > +
> > + if (virtualNicList == 0) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not retrieve vNIC List"));
> > + goto cleanup;
> > + }
> > +
> > +
> > + for(virtualNic = virtualNicList;
> > + virtualNic != NULL;
> > + virtualNic = virtualNic->_next) {
> > + if (STREQ(virtualNic->device, name)) {
> > + if (virtualNic->spec == NULL ||
> > + virtualNic->spec->mac == NULL) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Malformed HostVirtualNicSpec"));
> > + goto cleanup;
> > + }
> > +
> > + ret = virGetInterface(conn, virtualNic->device, virtualNic->spec->mac);
> > + break;
> > + }
> > + }
> > +
> > + cleanup:
> > + esxVI_HostVirtualNic_Free(&virtualNicList);
> > +
> > + return ret;
> > +}
> > +
> > +
> > +
> > +static virInterfacePtr
> > +esxInterfaceLookupByMACString(virConnectPtr conn, const char *mac)
> > +{
> > + esxPrivate *priv = conn->interfacePrivateData;
> > + esxVI_HostVirtualNic *virtualNicList = NULL;
> > + const esxVI_HostVirtualNic *virtualNic = NULL;
> > + virInterfacePtr ret = NULL;
> > +
> > + if (esxVI_EnsureSession(priv->primary) < 0 ||
> > + esxVI_LookupVirtualNicList(priv->primary,
> > + &virtualNicList) < 0) {
> > + goto cleanup;
> > + }
> > +
> > + if (virtualNicList == 0) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not retrieve vNIC List"));
> > + goto cleanup;
> > + }
> > +
> > +
> > + for(virtualNic = virtualNicList;
> > + virtualNic != NULL;
> > + virtualNic = virtualNic->_next) {
> > + if (virtualNic->spec == NULL ||
> > + virtualNic->spec->mac == NULL) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Malformed HostVirtualNicSpec"));
> > + goto cleanup;
> > + }
> > +
> > + if (STREQ(virtualNic->spec->mac, mac)) {
> > + ret =
> > + virGetInterface(conn, virtualNic->device, virtualNic->spec->mac);
> > + break;
> > + }
> > + }
> > +
> > + cleanup:
> > + esxVI_HostVirtualNic_Free(&virtualNicList);
> > +
> > + return ret;
> > +}
> > +
> > +
> > +/**
> > + * Generates native XML descritpor for a given interface.
> > + * For instance:
> > + * <interface type="bridge" name="%s">
> > + * <start mode="onboot"/>"
> > + * <mtu size="%d"/>"
> > + * <mac address="%s"/>
> > + * <protocol family="ipv4">
> > + * <dhcp/>
> > + * <ip address="%s" prefix="%d"/>
> > + * <route gateway="%s"/>
> > + * </protocol>
> > + * <bridge stp="off">
> > + * <interface type="ethernet" name="%s">
> > + * <mac address="%s"/>
> > + * </interface>
> > + * </bridge>
> > + * </interface>
> > + */
> > +static char*
> > +esxGetNativeInterfaceXMLDesc(const esxVI_HostVirtualNic *virtualNic,
> > + const esxVI_HostIpRouteConfig *ipRouteConfig,
> > + const esxVI_PhysicalNic *physicalNicList,
> > + const unsigned int flags)
> > +{
> > + const esxVI_PhysicalNic *physicalNic = NULL;
> > + xmlDocPtr doc = NULL;
> > + xmlNodePtr root = NULL;
> > + xmlNodePtr startNode = NULL;
> > + xmlNodePtr mtuNode = NULL;
> > + xmlNodePtr protocolNode = NULL;
> > + xmlNodePtr bridgeNode = NULL;
> > + xmlNodePtr dhcpNode = NULL;
> > + xmlChar *xmlbuff = NULL;
> > + int use_static = 0;
> > + struct in_addr addr;
> > + uint32_t host_addr = 0;
> > + int zero_count = 0;
> > + int masklen = 0;
> > + int i = 0;
> > + virBuffer item = VIR_BUFFER_INITIALIZER;
> > + int bufferSize = 0;
> > + char *ret = NULL;
> > +
> > + if (VIR_INTERFACE_XML_INACTIVE & flags) {
> > + use_static = 1;
> > + }
> > +
> > + doc = xmlNewDoc(XML_CAST "1.0");
> > + root = xmlNewDocNode(doc, NULL, XML_CAST "interface", NULL);
> > +
> > + xmlNewProp(root, XML_CAST "type", XML_CAST "bridge");
> > + xmlNewProp(root, XML_CAST "name", XML_CAST virtualNic->device);
> > + xmlDocSetRootElement(doc, root);
> > +
> > + /* define boot start mode */
> > + startNode = xmlNewChild(root, NULL, XML_CAST "start", NULL);
> > + xmlNewProp(startNode, XML_CAST "mode", XML_CAST "onboot");
> > +
> > + /* append mtu value */
> > + mtuNode = xmlNewChild(root, NULL, XML_CAST "mtu", NULL);
> > + virBufferAsprintf(&item, "%d",virtualNic->spec->mtu &&
> > + virtualNic->spec->mtu->value ?
> > + virtualNic->spec->mtu->value :
> > + 1500);
> > + const char *mtustr = virBufferContentAndReset(&item);
> > + if (mtustr == NULL) {
> > + virReportOOMError();
> > + goto cleanup;
> > + }
> > + xmlNewProp(mtuNode, XML_CAST "size", XML_CAST mtustr);
> > +
> > + /* append mac address field */
> > + if (!use_static && virtualNic->spec->mac) {
> > + xmlNodePtr mac_node = xmlNewChild(root, NULL, XML_CAST "mac", NULL);
> > + xmlNewProp(mac_node, XML_CAST "address",
> > + XML_CAST virtualNic->spec->mac);
> > + }
> > +
> > + /* TODO - Handle VLAN (via portgroup?) */
> > + if (virtualNic->spec->ip->subnetMask &&
> > + *virtualNic->spec->ip->subnetMask &&
> > + inet_aton(virtualNic->spec->ip->subnetMask, &addr) == 0) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Error parsing netmask"));
> > + goto cleanup;
> > + }
> > +
> > + host_addr = ntohl(addr.s_addr);
> > + /* Calculate masklen */
> > + for (i = 0; i < 32; ++i) {
> > + if (host_addr & 0x01) {
> > + break;
> > + }
> > + zero_count++;
> > + host_addr >>= 1;
> > + }
> > + masklen = 32 - zero_count;
> > +
> > + /* append protocol field */
> > + /* TODO - Add IPv6 Support */
> > + protocolNode = xmlNewChild(root, NULL, XML_CAST "protocol", NULL);
> > + xmlNewProp(protocolNode, XML_CAST "family", XML_CAST "ipv4");
> > + if (virtualNic->spec->ip->dhcp == 1) {
> > + dhcpNode = xmlNewChild(protocolNode, NULL, XML_CAST "dhcp", NULL);
> > + /* avoids compiler warning */
> > + VIR_DEBUG("dhcpNode name: %s", (char *)dhcpNode->name);
> > + }
> > +
> > + if (virtualNic->spec->ip->dhcp != 1 || !use_static) {
> > + if (virtualNic->spec->ip->ipAddress &&
> > + *virtualNic->spec->ip->ipAddress) {
> > + xmlNodePtr ipAddrNode =
> > + xmlNewChild(protocolNode, NULL, XML_CAST "ip", NULL);
> > + xmlNewProp(ipAddrNode, XML_CAST "address", XML_CAST
> > + virtualNic->spec->ip->ipAddress);
> > +
> > + virBufferAsprintf(&item, "%d", masklen);
> > + const char *maskstr = virBufferContentAndReset(&item);
> > + if (maskstr == NULL) {
> > + virReportOOMError();
> > + goto cleanup;
> > + }
> > + xmlNewProp(ipAddrNode, XML_CAST "prefix", XML_CAST maskstr);
> > +
> > + xmlNodePtr routeNode =
> > + xmlNewChild(protocolNode, NULL, XML_CAST "route", NULL);
> > + xmlNewProp(routeNode, XML_CAST "gateway",
> > + XML_CAST ipRouteConfig->defaultGateway);
> > + }
> > + }
> > +
> > + /* Add bridge information */
> > + bridgeNode = xmlNewChild(root, NULL, XML_CAST "bridge", NULL);
> > + xmlNewProp(bridgeNode, XML_CAST "stp", XML_CAST "off");
> > +
> > + for (physicalNic = physicalNicList;
> > + physicalNic != NULL;
> > + physicalNic = physicalNic->_next) {
> > + xmlNodePtr bridgeIfaceNode =
> > + xmlNewChild(bridgeNode, NULL, XML_CAST "interface", NULL);
> > + xmlNewProp(bridgeIfaceNode, XML_CAST "type", XML_CAST "ethernet");
> > + xmlNewProp(bridgeIfaceNode, XML_CAST "name",
> > + XML_CAST physicalNic->device);
> > +
> > + xmlNodePtr bridgeIfaceMacNode =
> > + xmlNewChild(bridgeIfaceNode, NULL, XML_CAST "mac", NULL);
> > + xmlNewProp(bridgeIfaceMacNode, XML_CAST "address",
> > + XML_CAST physicalNic->mac);
> > + }
> > +
> > + xmlDocDumpFormatMemory(doc, &xmlbuff, &bufferSize, 1);
> > + if (xmlbuff == NULL) {
> > + virReportOOMError();
> > + goto cleanup;
> > + }
> > +
> > + ret = strdup((char *)xmlbuff);
> > + if (ret == NULL) {
> > + virReportOOMError();
> > + goto cleanup;
> > + }
> > +
> > + cleanup:
> > + VIR_FREE(mtustr);
> > + if (xmlbuff != NULL) {
> > + xmlFree(xmlbuff);
> > + }
>
> That should not pass "make syntax-check" did you run that on your
> tree ? xmlFree will check for NULL no need to double the test.
> also none of the xmlNew... function are checked for return error,
> that should probably be added, they are allocating memory and they
> can fail.
>
> > + xmlFreeDoc(doc);
> > +
> > + return ret;
> > +}
> > +
> > +
> > +
> > +static char*
> > +esxInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags)
> > +{
> > + esxPrivate *priv = iface->conn->interfacePrivateData;
> > + esxVI_HostVirtualNic *virtualNicList = NULL;
> > + esxVI_HostVirtualNic *virtualNic = NULL;
> > + esxVI_PhysicalNic *physicalNicList = NULL;
> > + esxVI_PhysicalNic *matchingPhysicalNicList = NULL;
> > + esxVI_HostIpRouteConfig *ipRouteConfig = NULL;
> > + esxVI_HostPortGroup *portGroupList = NULL;
> > + esxVI_HostVirtualSwitch *virtualSwitchList = NULL;
> > + esxVI_String *propertyNameList = NULL;
> > + esxVI_ObjectContent *hostSystem = NULL;
> > + esxVI_DynamicProperty *dynamicProperty = NULL;
> > + virInterfaceDefPtr def = NULL;
> > + char *xmlstr = NULL;
> > + char *ret = NULL;
> > +
> > + if (esxVI_EnsureSession(priv->primary) < 0 ||
> > + esxVI_String_AppendValueListToList(&propertyNameList,
> > + "config.network.vnic\0"
> > + "config.network.ipRouteConfig\0"
> > + "config.network.vswitch\0"
> > + "config.network.pnic\0"
> > + "config.network.portgroup\0") < 0 ||
> > + esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,
> > + &hostSystem) < 0) {
> > + goto cleanup;
> > + }
> > +
> > + for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL;
> > + dynamicProperty = dynamicProperty->_next) {
> > + if (STREQ(dynamicProperty->name, "config.network.vnic")) {
> > + if (esxVI_HostVirtualNic_CastListFromAnyType(dynamicProperty->val,
> > + &virtualNicList)
> > + < 0) {
> > + goto cleanup;
> > + }
> > + } else if (STREQ(dynamicProperty->name, "config.network.ipRouteConfig")) {
> > + if (esxVI_HostIpRouteConfig_CastFromAnyType(dynamicProperty->val,
> > + &ipRouteConfig)) {
> > + goto cleanup;
> > + }
> > + } else if (STREQ(dynamicProperty->name, "config.network.vswitch")) {
> > + if (esxVI_HostVirtualSwitch_CastListFromAnyType
> > + (dynamicProperty->val, &virtualSwitchList) < 0) {
> > + goto cleanup;
> > + }
> > + } else if (STREQ(dynamicProperty->name, "config.network.pnic")) {
> > + if (esxVI_PhysicalNic_CastListFromAnyType(dynamicProperty->val,
> > + &physicalNicList)
> > + < 0) {
> > + goto cleanup;
> > + }
> > + } else if (STREQ(dynamicProperty->name, "config.network.portgroup")) {
> > + if (esxVI_HostPortGroup_CastListFromAnyType(dynamicProperty->val,
> > + &portGroupList)
> > + < 0) {
> > + goto cleanup;
> > + }
> > + } else {
> > + VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
> > + }
> > + }
> > +
> > + if (!virtualNicList ||
> > + !ipRouteConfig ||
> > + !virtualSwitchList ||
> > + !portGroupList) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Unable to retrieve network parameters"));
> > +
> > + goto cleanup;
> > + }
> > +
> > + for (virtualNic = virtualNicList;
> > + virtualNic != NULL;
> > + virtualNic = virtualNic->_next) {
> > + if (STREQ(virtualNic->device, iface->name)) {
> > + break;
> > + }
> > + }
> > +
> > + if (virtualNic == NULL) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not find Interface"));
> > + goto cleanup;
> > + }
> > +
> > + if (esxVI_LookupPhysicalNicFromPortGroup(virtualNic->portgroup,
> > + portGroupList,
> > + virtualSwitchList,
> > + physicalNicList,
> > + &matchingPhysicalNicList) < 0) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("No Physical NIC found matching Virtual NIC's portgroup"));
> > + goto cleanup;
> > + }
> > +
> > + /* create a xml descriptor and parse it using virInterfaceDefParseString */
> > + xmlstr = esxGetNativeInterfaceXMLDesc(virtualNic,
> > + ipRouteConfig,
> > + matchingPhysicalNicList,
> > + flags);
> > + if (xmlstr == NULL) {
> > + goto cleanup;
> > + }
> > +
> > + def = virInterfaceDefParseString(xmlstr);
> > + if (!def) {
> > + goto cleanup;
> > + }
> > +
> > + ret = virInterfaceDefFormat(def);
> > + if (!ret) {
> > + goto cleanup;
> > + }
> > +
> > + cleanup:
> > + esxVI_HostVirtualNic_Free(&virtualNicList);
> > + esxVI_PhysicalNic_Free(&physicalNicList);
> > + esxVI_PhysicalNic_Free(&matchingPhysicalNicList);
> > + esxVI_HostPortGroup_Free(&portGroupList);
> > + esxVI_HostVirtualSwitch_Free(&virtualSwitchList);
> > + esxVI_HostIpRouteConfig_Free(&ipRouteConfig);
> > + esxVI_ObjectContent_Free(&hostSystem);
> > + esxVI_String_Free(&propertyNameList);
> > + virInterfaceDefFree(def);
> > + VIR_FREE(xmlstr);
> > +
> > + return ret;
> > +}
> > +
> > +
> > +
> > +static int
> > +esxInterfaceUndefine(virInterfacePtr iface)
> > +{
> > + esxPrivate *priv = iface->conn->interfacePrivateData;
> > +
> > + if (esxVI_RemoveVirtualNic(
> > + priv->primary,
> > + priv->primary->hostSystem->configManager->networkSystem,
> > + iface->name) < 0) {
> > + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Error deleting interface"));
> > + return -1;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > +
> > +
> > +static int
> > +esxInterfaceCreate(virInterfacePtr iface, unsigned int flags)
> > +{
> > + iface->conn->interfacePrivateData = NULL;
> > +
> > + virCheckFlags(0, -1);
> > +
> > + /* ESX interfaces are always active */
> > + return 0;
> > +}
> > +
> > +
> > +static int
> > +esxInterfaceDestroy(virInterfacePtr iface, unsigned int flags)
> > +{
> > + iface->conn->privateData = NULL;
> > +
> > + virCheckFlags(0, -1);
> > +
> > + /* ESX does not support deactivating interfaces */
> > + return 1;
> > +}
> > +
> > static virInterfaceDriver esxInterfaceDriver = {
> > .name = "ESX",
> > - .open = esxInterfaceOpen, /* 0.7.6 */
> > - .close = esxInterfaceClose, /* 0.7.6 */
> > + .open = esxInterfaceOpen, /* 0.7.6 */
> > + .close = esxInterfaceClose, /* 0.7.6 */
> > + .numOfInterfaces = esxNumOfInterfaces, /* 0.9.x */
> > + .numOfDefinedInterfaces = esxNumOfDefinedInterfaces, /* 0.9.x */
> > + .listInterfaces = esxListInterfaces, /* 0.9.x */
> > + .listDefinedInterfaces = esxListDefinedInterfaces, /* 0.9.x */
> > + .interfaceLookupByName = esxInterfaceLookupByName, /* 0.9.x */
> > + .interfaceLookupByMACString = esxInterfaceLookupByMACString, /* 0.9.x */
> > + .interfaceGetXMLDesc = esxInterfaceGetXMLDesc, /* 0.9.x */
> > + .interfaceUndefine = esxInterfaceUndefine, /* 0.9.x */
> > + .interfaceCreate = esxInterfaceCreate, /* 0.9.x */
> > + .interfaceDestroy = esxInterfaceDestroy, /* 0.9.x */
> > };
> >
> >
> > diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
> > index 5b5ab69..df9f8df 100644
> > --- a/src/esx/esx_vi.c
> > +++ b/src/esx/esx_vi.c
> > @@ -4414,4 +4414,134 @@ esxVI_LookupManagedObjectHelper(esxVI_Context *ctx,
> >
> >
> >
> > +int
> > +esxVI_LookupVirtualNicList(esxVI_Context* ctx,
> > + esxVI_HostVirtualNic** virtualNicList)
> > +{
> > + int result = -1;
> > + esxVI_String *propertyNameList = NULL;
> > + esxVI_DynamicProperty *dynamicProperty = NULL;
> > + esxVI_ObjectContent* hostSystem = NULL;
> > +
> > + if (esxVI_String_AppendValueListToList(
> > + &propertyNameList, "config.network.vnic\0") < 0 ||
> > + esxVI_LookupHostSystemProperties(ctx, propertyNameList, &hostSystem) < 0) {
> > + goto cleanup;
> > + }
> > +
> > + if (hostSystem == NULL) {
> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not retrieve the HostSystem object"));
> > +
> > + goto cleanup;
> > + }
> > +
> > + for (dynamicProperty = hostSystem->propSet;
> > + dynamicProperty != NULL;
> > + dynamicProperty = dynamicProperty->_next) {
> > + if (STREQ(dynamicProperty->name, "config.network.vnic")) {
> > + if (esxVI_HostVirtualNic_CastListFromAnyType(dynamicProperty->val,
> > + virtualNicList) < 0) {
> > + goto cleanup;
> > + }
> > + break;
> > + } else {
> > + VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
> > + }
> > + }
> > +
> > + result = 0;
> > +
> > +cleanup:
> > + esxVI_String_Free(&propertyNameList);
> > + esxVI_ObjectContent_Free(&hostSystem);
> > +
> > + return result;
> > +}
> > +
> > +
> > +
> > +int
> > +esxVI_LookupPhysicalNicFromPortGroup(
> > + const char *portgroup,
> > + const esxVI_HostPortGroup *portGroupList,
> > + const esxVI_HostVirtualSwitch *virtualSwitchList,
> > + const esxVI_PhysicalNic *physicalNicList,
> > + esxVI_PhysicalNic **ret_physicalNicList)
> > +{
> > + int result = -1;
> > + const esxVI_HostPortGroup *portGroup = NULL;
> > + const esxVI_HostVirtualSwitch *virtualSwitch = NULL;
> > + esxVI_PhysicalNic *matchingPhysicalNicList = NULL;
> > + const esxVI_PhysicalNic *physicalNic = NULL;
> > + esxVI_PhysicalNic *tempPhysicalNic = NULL;
> > + const esxVI_String *pnicKey = NULL;
> > +
> > + if (portgroup == NULL) {
> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("No Portgroup found!"));
> > + goto cleanup;
> > + }
> > +
> > + /* Go through all the port groups to find the one that matches. */
> > + for (portGroup = portGroupList;
> > + portGroup != NULL;
> > + portGroup = portGroup->_next) {
> > + if (STREQ(portGroup->spec->name, portgroup)) {
> > + break;
> > + }
> > + }
> > +
> > + if (portGroup == NULL) {
> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not find Host port group"));
> > + goto cleanup;
> > + }
> > +
> > + /* Go through all the virtual switches to find the one that matches */
> > + for (virtualSwitch = virtualSwitchList;
> > + virtualSwitch != NULL;
> > + virtualSwitch = virtualSwitch->_next) {
> > + if (STREQ(portGroup->spec->vswitchName, virtualSwitch->name)) {
> > + break;
> > + }
> > + }
> > +
> > + if (virtualSwitch == NULL) {
> > + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("Could not find Virtual Switch"));
> > + goto cleanup;
> > + }
> > +
> > + /* Go through all physical nics */
> > + for (pnicKey = virtualSwitch->pnic;
> > + pnicKey != NULL;
> > + pnicKey = pnicKey->_next) {
> > + /* O(n^2), but probably faster than a hash due to small N */
> > + for (physicalNic = physicalNicList;
> > + physicalNic != NULL;
> > + physicalNic = physicalNic->_next) {
> > +
> > + if (STREQ(pnicKey->value, physicalNic->key)) {
> > + if (esxVI_PhysicalNic_DeepCopy(&tempPhysicalNic,
> > + (esxVI_PhysicalNic *)physicalNic) < 0 ||
> > + esxVI_PhysicalNic_AppendToList(&matchingPhysicalNicList,
> > + tempPhysicalNic) < 0) {
> > + goto cleanup;
> > + }
> > + tempPhysicalNic = NULL;
> > + }
> > + }
> > + }
> > +
> > + *ret_physicalNicList = matchingPhysicalNicList;
> > + matchingPhysicalNicList = NULL; /* no cleanup needed */
> > + tempPhysicalNic = NULL; /* no cleanup needed */
> > + result = 0;
> > + cleanup:
> > + esxVI_PhysicalNic_Free(&matchingPhysicalNicList);
> > + esxVI_PhysicalNic_Free(&tempPhysicalNic);
> > + return result;
> > +}
> > +
> > #include "esx_vi.generated.c"
> > diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
> > index 78d3986..11bc52e 100644
> > --- a/src/esx/esx_vi.h
> > +++ b/src/esx/esx_vi.h
> > @@ -487,6 +487,16 @@ int esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo,
> >
> > int esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductVersion productVersion);
> >
> > +int esxVI_LookupVirtualNicList(esxVI_Context* ctx,
> > + esxVI_HostVirtualNic** virtualNicList);
> > +
> > +int esxVI_LookupPhysicalNicFromPortGroup(
> > + const char *portgroup,
> > + const esxVI_HostPortGroup *portGroupList,
> > + const esxVI_HostVirtualSwitch *virtualSwitchList,
> > + const esxVI_PhysicalNic *physicalNicList,
> > + esxVI_PhysicalNic **ret_physicalNicList);
> > +
> > # include "esx_vi.generated.h"
> >
> > #endif /* __ESX_VI_H__ */
> > diff --git a/src/esx/esx_vi_generator.input b/src/esx/esx_vi_generator.input
> > index 1a67a8c..b99fee6 100644
> > --- a/src/esx/esx_vi_generator.input
> > +++ b/src/esx/esx_vi_generator.input
> > @@ -57,6 +57,29 @@ enum AutoStartWaitHeartbeatSetting
> > systemDefault
> > end
> >
> > +enum HostConfigChangeOperation
> > + add
> > + edit
> > + remove
> > +end
> > +
> > +enum HostIpConfigIpV6AdressStatus
> > + deprecated
> > + duplicate
> > + inaccessible
> > + invalid
> > + preferred
> > + tentative
> > + unknown
> > +end
> > +
> > +enum HostIpConfigV6AdressConfigType
> > + dhcp
> > + linklayer
> > + manual
> > + other
> > + random
> > +end
> >
> > enum ManagedEntityStatus
> > gray
> > @@ -89,6 +112,12 @@ enum PerfSummaryType
> > none
> > end
> >
> > +enum PortGroupConnecteeType
> > + host
> > + systemManagement
> > + unknown
> > + virtualMachine
> > +end
> >
> > enum PropertyChangeOp
> > add
> > @@ -197,6 +226,12 @@ object DeviceBackedVirtualDiskSpec extends VirtualDiskSpec
> > String device r
> > end
> >
> > +object DistributedVirtualSwitchPortConnection
> > + Int connectionCookie o
> > + String portgroupKey o
> > + String portKey o
> > + String switchUuid r
> > +end
> >
> > object DynamicProperty
> > String name r
> > @@ -316,6 +351,34 @@ object HostFileSystemVolume
> > Long capacity r
> > end
> >
> > +object HostIpConfig
> > + Boolean dhcp r
> > + String ipAddress o
> > + HostIpConfigIpV6AddressConfiguration ipV6Config o
> > + String subnetMask o
> > +end
> > +
> > +object HostIpConfigIpV6Address
> > + String dadState o
> > + String ipAddress r
> > + DateTime lifetime o
> > + String operation o
> > + String origin o
> > + Int prefixLength r
> > +end
> > +
> > +object HostIpConfigIpV6AddressConfiguration
> > + Boolean autoConfigurationEnabled o
> > + Boolean dhcpV6Enabled o
> > + HostIpConfigIpV6Address ipV6Address ol
> > +end
> > +
> > +object HostIpRouteConfig
> > + String defaultGateway o
> > + String gatewayDevice o
> > + String ipV6DefaultGateway o
> > + String ipV6GatewayDevice o
> > +end
> >
> > object HostMountInfo
> > String path o
> > @@ -331,11 +394,134 @@ object HostNasVolume extends HostFileSystemVolume
> > end
> >
> >
> > +object HostNicTeamingPolicy
> > + HostNicFailureCriteria failureCriteria o
> > + HostNicOrderPolicy nicOrder o
> > + Boolean notifySwitches o
> > + String policy o
> > + Boolean reversePolicy o
> > + Boolean rollingOrder o
> > +end
> > +
> > +object HostNetOffloadCapabilities
> > + Boolean csumOffload o
> > + Boolean tcpSegmentation o
> > + Boolean zeroCopyXmit o
> > +end
> > +
> > +object HostNetworkSecurityPolicy
> > + Boolean allowPromiscuous o
> > + Boolean forgedTransmits o
> > + Boolean macChanges o
> > +end
> > +
> > +object HostNetworkPolicy
> > + HostNicTeamingPolicy nicTeaming o
> > + HostNetOffloadCapabilities offloadPolicy o
> > + HostNetworkSecurityPolicy security o
> > + HostNetworkTrafficShapingPolicy shapingPolicy o
> > +end
> > +
> > +object HostNetworkTrafficShapingPolicy
> > + Long averageBandwidth o
> > + Long burstLong o
> > + Boolean enabled o
> > + Long peakBandwidth o
> > +end
> > +
> > +object HostNicFailureCriteria
> > + String checkSpeed o
> > + Int speed o
> > + Boolean checkDuplex o
> > + Boolean fullDuplex o
> > + Boolean checkErrorPercent o
> > + Int percentage o
> > + Boolean checkBeacon o
> > +end
> > +
> > +object HostNicOrderPolicy
> > + String activeNic ol
> > + String standbyNic ol
> > +end
> > +
> > +object HostPortGroup
> > + String key r
> > + HostPortGroupPort port ol
> > + String vswitch r
> > + HostNetworkPolicy computedPolicy r
> > + HostPortGroupSpec spec r
> > +end
> > +
> > +object HostPortGroupPort
> > + String key o
> > + String mac ol
> > + String type r
> > +end
> > +
> > +object HostPortGroupSpec
> > + String name r
> > + HostNetworkPolicy policy r
> > + Int vlanId r
> > + String vswitchName r
> > +end
> > +
> > object HostScsiDiskPartition
> > String diskName r
> > Int partition r
> > end
> >
> > +object HostVirtualNic
> > + String device r
> > + String key r
> > + String port o
> > + String portgroup r
> > + HostVirtualNicSpec spec r
> > +end
> > +
> > +object HostVirtualNicSpec
> > + DistributedVirtualSwitchPortConnection distributedVirtualPort o
> > + HostIpConfig ip o
> > + String mac o
> > + Int mtu o
> > + String portgroup o
> > + Boolean tsoEnabled o
> > +end
> > +
> > +
> > +object HostVirtualSwitch
> > + String key r
> > + Int mtu o
> > + String name r
> > + Int numPorts r
> > + Int numPortsAvailable r
> > + String pnic ol
> > + String portgroup ol
> > + HostVirtualSwitchSpec spec r
> > +end
> > +
> > +object HostVirtualSwitchBridge
> > +end
> > +
> > +object HostVirtualSwitchAutoBridge extends HostVirtualSwitchBridge
> > + String excludedNicDevice ol
> > +end
> > +
> > +object HostVirtualSwitchBeaconBridge extends HostVirtualSwitchBridge
> > + Int interval r
> > +end
> > +
> > +object HostVirtualSwitchBondBridge extends HostVirtualSwitchBridge
> > + HostVirtualSwitchBeaconBridge beacon o
> > + LinkDiscoveryProtocolConfig linkDiscoveryProtocolConfig o
> > + String nicDevice rl
> > +end
> > +
> > +object HostVirtualSwitchSpec
> > + HostVirtualSwitchBridge bridge o
> > + Int mtu o
> > + Int numPorts r
> > + HostNetworkPolicy policy o
> > +end
> >
> > object HostVmfsVolume extends HostFileSystemVolume
> > Int blockSizeMb r
> > @@ -355,6 +541,10 @@ end
> > object IsoImageFileQuery extends FileQuery
> > end
> >
> > +object LinkDiscoveryProtocolConfig
> > + String operation r
> > + String protocol r
> > +end
> >
> > object LocalDatastoreInfo extends DatastoreInfo
> > String path o
> > @@ -398,6 +588,10 @@ object OptionType
> > Boolean valueIsReadonly o
> > end
> >
> > +object OptionValue
> > + String key r
> > + AnyType value r
> > +end
> >
> > object PerfCounterInfo
> > Int key r
> > @@ -454,6 +648,27 @@ object PerfSampleInfo
> > Int interval r
> > end
> >
> > +object PhysicalNic
> > + String device r
> > + String driver o
> > + String key o
> > + PhysicalNicInfo linkSpeed o
> > + String mac r
> > + String pci r
> > + PhysicalNicSpec spec r
> > + PhysicalNicInfo validLinkSpecification ol
> > + Boolean wakeOnLanSupported r
> > +end
> > +
> > +object PhysicalNicInfo
> > + Boolean duplex r
> > + Int speedMb r
> > +end
> > +
> > +object PhysicalNicSpec
> > + HostIpConfig ip o
> > + PhysicalNicInfo linkSpeed o
> > +end
> >
> > object PropertyChange
> > String name r
> > @@ -490,7 +705,6 @@ object ResourceAllocationInfo
> > Long overheadLimit o
> > end
> >
> > -
> > object ResourcePoolResourceUsage
> > Long reservationUsed r
> > Long reservationUsedForVm r
> > @@ -954,6 +1168,10 @@ method RemoveSnapshot_Task returns ManagedObjectReference r
> > Boolean removeChildren r
> > end
> >
> > +method RemoveVirtualNic
> > + ManagedObjectReference _this r
> > + String device r
> > +end
> >
> > method RetrieveProperties returns ObjectContent ol
> > ManagedObjectReference _this:propertyCollector r
> > @@ -1002,6 +1220,16 @@ method UnregisterVM
> > ManagedObjectReference _this r
> > end
> >
> > +method UpdateIpRouteConfig
> > + ManagedObjectReference _this r
> > + HostIpRouteConfig config r
> > +end
> > +
> > +method UpdateVirtualNic
> > + ManagedObjectReference _this r
> > + String device r
> > + HostVirtualNicSpec nic r
> > +end
> >
> > method WaitForUpdates returns UpdateSet r
> > ManagedObjectReference _this:propertyCollector r
> > diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
> > index 8a128df..787a28c 100755
> > --- a/src/esx/esx_vi_generator.py
> > +++ b/src/esx/esx_vi_generator.py
> > @@ -371,8 +371,12 @@ class Property(Member):
> > % self.name
> > elif self.occurrence in [OCCURRENCE__REQUIRED_LIST,
> > OCCURRENCE__OPTIONAL_LIST]:
> > - return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(%s, %s)\n" \
> > - % (self.type, self.name)
> > + if self.type == "String":
> > + return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_STRING_LIST(%s, %s)\n" \
> > + % (self.type, self.name)
> > + else:
> > + return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(%s, %s)\n" \
> > + % (self.type, self.name)
> > elif self.type == "String":
> > return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, %s)\n" \
> > % self.name
> > @@ -1505,7 +1509,10 @@ predefined_objects = ["AnyType",
> >
> > additional_enum_features = { "ManagedEntityStatus" : Enum.FEATURE__ANY_TYPE,
> > "TaskInfoState" : Enum.FEATURE__ANY_TYPE,
> > - "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE }
> > + "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE ,
> > + "HostIpConfigIpV6AdressStatus" : Enum.FEATURE__ANY_TYPE,
> > + "HostIpConfigV6AdressConfigType" : Enum.FEATURE__ANY_TYPE,
> > + "PortGroupConnecteeType" : Enum.FEATURE__ANY_TYPE }
> >
> > additional_object_features = { "AutoStartDefaults" : Object.FEATURE__ANY_TYPE,
> > "AutoStartPowerInfo" : Object.FEATURE__ANY_TYPE,
> > @@ -1519,8 +1526,31 @@ additional_object_features = { "AutoStartDefaults" : Object.FEATURE__AN
> > Object.FEATURE__ANY_TYPE,
> > "HostDatastoreBrowserSearchResults" : Object.FEATURE__LIST |
> > Object.FEATURE__ANY_TYPE,
> > + "HostIpConfig" : Object.FEATURE__DEEP_COPY,
> > + "HostIpRouteConfig" : Object.FEATURE__ANY_TYPE,
> > + "HostIpConfigIpV6Address" : Object.FEATURE__LIST |
> > + Object.FEATURE__ANY_TYPE |
> > + Object.FEATURE__DEEP_COPY,
> > + "HostIpConfigIpV6AddressConfiguration" : Object.FEATURE__DEEP_COPY,
> > + "HostPortGroup" : Object.FEATURE__LIST |
> > + Object.FEATURE__ANY_TYPE,
> > + "HostVirtualNic" : Object.FEATURE__ANY_TYPE |
> > + Object.FEATURE__LIST,
> > + "HostVirtualSwitch" : Object.FEATURE__ANY_TYPE |
> > + Object.FEATURE__LIST,
> > + "KeyValue" : Object.FEATURE__ANY_TYPE,
> > "ManagedObjectReference" : Object.FEATURE__ANY_TYPE,
> > + "PhysicalNic" : Object.FEATURE__LIST |
> > + Object.FEATURE__ANY_TYPE |
> > + Object.FEATURE__DEEP_COPY,
> > "ObjectContent" : Object.FEATURE__DEEP_COPY,
> > + "OptionValue" : Object.FEATURE__ANY_TYPE |
> > + Object.FEATURE__LIST,
> > + "PhysicalNic" : Object.FEATURE__LIST |
> > + Object.FEATURE__ANY_TYPE |
> > + Object.FEATURE__DEEP_COPY,
> > + "PhysicalNicSpec" : Object.FEATURE__DEEP_COPY,
> > + "PhysicalNicLinkInfo" : Object.FEATURE__LIST,
> > "ResourcePoolResourceUsage" : Object.FEATURE__ANY_TYPE,
> > "ServiceContent" : Object.FEATURE__DESERIALIZE,
> > "SharesInfo" : Object.FEATURE__ANY_TYPE,
> > diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c
> > index bcc310f..f23af8d 100644
> > --- a/src/esx/esx_vi_types.c
> > +++ b/src/esx/esx_vi_types.c
> > @@ -475,7 +475,23 @@
> > continue; \
> > }
> >
> > -
> > +#define ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_STRING_LIST(_type, _name) \
> > + if (xmlStrEqual(childNode->name, BAD_CAST #_name)) { \
> > + char *value = NULL; \
> > + \
> > + if (esxVI_String_DeserializeValue(childNode, &value) < 0 || \
> > + value == NULL) { \
> > + goto failure; \
> > + } \
> > + \
> > + if (esxVI_##_type##_AppendValueToList(&(*ptrptr)->_name, \
> > + value) < 0) { \
> > + VIR_FREE(value); \
> > + goto failure; \
> > + } \
> > + \
> > + continue; \
> > + }
> >
> > /*
> > * A required property must be != 0 (NULL for pointers, "undefined" == 0 for
> > --
> > 1.7.9.5
>
> I think one more pass is needed at this, please make sure you
> run make check and make syntax-check on the tree before submitting
> your patch,
>
> thanks !
>
> Daniel
>
> --
> Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
> daniel veillard com | Rpmfind RPM search engine http://rpmfind.net/
> http://veillard.com/ | virtualization library http://libvirt.org/

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]