[libvirt] [PATCH v2 2/3] utilities for supporting midonet virtualports

Antoni Segura Puimedon toni at midokura.com
Thu Feb 19 16:30:57 UTC 2015


On Thu, Feb 19, 2015 at 4:22 PM, Laine Stump <laine at laine.org> wrote:

> On 02/17/2015 09:42 PM, Antoni Segura Puimedon wrote:
> > Adds the port type definitions and methods that will be used to bind
> > interfaces to the Midonet virtual ports.
> >
> > virtnetdevmidonet.c adds the way to bind and unbind the ports by
> > calling into the Midonet Host Agent control command line (installed
> > with the midolman package).
>
> Thinking a bit more about the organization of the patches - I think this
> patch needs to be 1 (since the parser/formatter changes will use the new
> enum values, then the patch with schema/docs and changes to
> parser/formatter (i.e. conf directory) should be 2, then the one that
> ties it all together would be 3.
>

Makes sense. Thanks.

>
> >
> > Signed-off-by: Antoni Segura Puimedon <toni+libvirt at midokura.com>
> > ---
> >  configure.ac                     |  4 ++
> >  src/Makefile.am                  |  1 +
> >  src/libvirt_private.syms         |  5 +++
> >  src/util/virnetdevmidonet.c      | 97
> ++++++++++++++++++++++++++++++++++++++++
> >  src/util/virnetdevmidonet.h      | 37 +++++++++++++++
> >  src/util/virnetdevvportprofile.c |  1 +
> >  src/util/virnetdevvportprofile.h |  3 +-
> >  7 files changed, 147 insertions(+), 1 deletion(-)
> >  create mode 100644 src/util/virnetdevmidonet.c
> >  create mode 100644 src/util/virnetdevmidonet.h
> >
> > diff --git a/configure.ac b/configure.ac
> > index b3e99e7..ddffbb2 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -425,6 +425,8 @@ AC_PATH_PROG([MODPROBE], [modprobe], [modprobe],
> >       [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
> >  AC_PATH_PROG([RMMOD], [rmmod], [rmmod],
> >       [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
> > +AC_PATH_PROG([MMCTL], [mm-ctl], [mm-ctl],
> > +     [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
> >  AC_PATH_PROG([OVSVSCTL], [ovs-vsctl], [ovs-vsctl],
> >       [/sbin:/usr/sbin:/usr/local/sbin:$PATH])
> >  AC_PATH_PROG([SCRUB], [scrub], [scrub],
> > @@ -440,6 +442,8 @@ AC_DEFINE_UNQUOTED([RADVD],["$RADVD"],
> >          [Location or name of the radvd program])
> >  AC_DEFINE_UNQUOTED([TC],["$TC"],
> >          [Location or name of the tc program (see iproute2)])
> > +AC_DEFINE_UNQUOTED([MMCTL],["$MMCTL"],
> > +        [Location or name of the mm-ctl program])
> >  AC_DEFINE_UNQUOTED([OVSVSCTL],["$OVSVSCTL"],
> >          [Location or name of the ovs-vsctl program])
> >
> > diff --git a/src/Makefile.am b/src/Makefile.am
> > index b41c6d4..23d3f93 100644
> > --- a/src/Makefile.am
> > +++ b/src/Makefile.am
> > @@ -129,6 +129,7 @@ UTIL_SOURCES =
>               \
> >               util/virnetdevbandwidth.h util/virnetdevbandwidth.c \
> >               util/virnetdevbridge.h util/virnetdevbridge.c   \
> >               util/virnetdevmacvlan.c util/virnetdevmacvlan.h \
> > +             util/virnetdevmidonet.h util/virnetdevmidonet.c \
> >               util/virnetdevopenvswitch.h util/virnetdevopenvswitch.c \
> >               util/virnetdevtap.h util/virnetdevtap.c         \
> >               util/virnetdevveth.h util/virnetdevveth.c       \
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index 46a1613..0938cdc 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -1738,6 +1738,11 @@ virNetDevMacVLanRestartWithVPortProfile;
> >  virNetDevMacVLanVPortProfileRegisterCallback;
> >
> >
> > +# util/virnetdevmidonet.h
> > +virNetDevMidonetBindPort;
> > +virNetDevMidonetUnbindPort;
> > +
> > +
> >  # util/virnetdevopenvswitch.h
> >  virNetDevOpenvswitchAddPort;
> >  virNetDevOpenvswitchGetMigrateData;
> > diff --git a/src/util/virnetdevmidonet.c b/src/util/virnetdevmidonet.c
> > new file mode 100644
> > index 0000000..57fb636
> > --- /dev/null
> > +++ b/src/util/virnetdevmidonet.c
> > @@ -0,0 +1,97 @@
> > +/*
> > + * Copyright (C) 2015 Midokura, Sarl.
> > + *
> > + * 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, see
> > + * <http://www.gnu.org/licenses/>.
> > + *
> > + * Authors:
> > + *     Antoni Segura Puimedon <toni at midokura.com>
> > + */
> > +
> > +#include <config.h>
> > +
> > +#include "virnetdevmidonet.h"
> > +#include "vircommand.h"
> > +#include "viralloc.h"
> > +#include "virerror.h"
> > +#include "viruuid.h"
> > +
> > +#define VIR_FROM_THIS VIR_FROM_NONE
> > +
> > +/**
> > + * virNetDevMidonetBindPort:
> > + * @ifname: the network interface name
> > + * @virtualport: the midonet specific fields
> > + *
> > + * Bind an interface to a Midonet virtual port
> > + *
> > + * Returns 0 in case of success or -1 in case of failure.
> > + */
> > +int virNetDevMidonetBindPort(const char *ifname,
> > +                                virNetDevVPortProfilePtr virtualport)
> > +{
> > +    int ret = -1;
> > +    virCommandPtr cmd = NULL;
> > +    char virtportuuid[VIR_UUID_STRING_BUFLEN];
> > +
> > +    virUUIDFormat(virtualport->interfaceID, virtportuuid);
> > +
> > +    cmd = virCommandNew(MMCTL);
> > +
> > +    virCommandAddArgList(cmd, "--bind-port", virtportuuid, ifname,
> NULL);
> > +
> > +    if (virCommandRun(cmd, NULL) < 0) {
> > +        virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                       _("Unable to bind port %s to the virtual port
> %s"),
> > +                       ifname, virtportuuid);
> > +        goto cleanup;
> > +    }
> > +
> > +    ret = 0;
> > + cleanup:
> > +    virCommandFree(cmd);
> > +    return ret;
> > +}
> > +
> > +/**
> > + * virNetDevMidonetUnbindPort:
> > + * @virtualport: the midonet specific fields
> > + *
> > + * Unbinds a virtual port from the host
> > + *
> > + * Returns 0 in case of success or -1 in case of failure.
> > + */
> > +int virNetDevMidonetUnbindPort(virNetDevVPortProfilePtr virtualport)
> > +{
> > +    int ret = -1;
> > +    virCommandPtr cmd = NULL;
> > +    char virtportuuid[VIR_UUID_STRING_BUFLEN];
> > +
> > +    virUUIDFormat(virtualport->interfaceID, virtportuuid);
> > +
> > +    cmd = virCommandNew(MMCTL);
> > +    virCommandAddArgList(cmd, "--unbind-port", virtportuuid, NULL);
> > +
> > +    if (virCommandRun(cmd, NULL) < 0) {
> > +        virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                       _("Unable to unbind the virtual port %s from
> Midonet"),
> > +                       virtportuuid);
> > +        goto cleanup;
> > +    }
> > +
> > +    ret = 0;
> > + cleanup:
> > +    virCommandFree(cmd);
> > +    return ret;
> > +}
> > diff --git a/src/util/virnetdevmidonet.h b/src/util/virnetdevmidonet.h
> > new file mode 100644
> > index 0000000..b8dbeac
> > --- /dev/null
> > +++ b/src/util/virnetdevmidonet.h
> > @@ -0,0 +1,37 @@
> > +/*
> > + * Copyright (C) 2015 Midokura Sarl.
> > +
> > + * 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, see
> > + * <http://www.gnu.org/licenses/>.
> > + *
> > + * Authors:
> > + *     Antoni Segura Puimedon <toni at midokura.com
> > + */
> > +
> > +#ifndef __VIR_NETDEV_MIDONET_H__
> > +# define __VIR_NETDEV_MIDONET_H__
> > +
> > +# include "internal.h"
> > +# include "virnetdevvportprofile.h"
> > +
> > +
> > +int virNetDevMidonetBindPort(const char *ifname,
> > +                             virNetDevVPortProfilePtr virtualport)
> > +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
> > +
> > +int virNetDevMidonetUnbindPort(virNetDevVPortProfilePtr virtualport)
> > +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
> > +
> > +#endif /* __VIR_NETDEV_MIDONET_H__ */
> > +
> > diff --git a/src/util/virnetdevvportprofile.c
> b/src/util/virnetdevvportprofile.c
> > index 6ee20d3..921c6aa 100644
> > --- a/src/util/virnetdevvportprofile.c
> > +++ b/src/util/virnetdevvportprofile.c
> > @@ -33,6 +33,7 @@ VIR_ENUM_IMPL(virNetDevVPort,
> VIR_NETDEV_VPORT_PROFILE_LAST,
> >                "none",
> >                "802.1Qbg",
> >                "802.1Qbh",
> > +              "midonet",
> >                "openvswitch")
>
> I'm curious why you added the new enum in the middle rather than at the
> end. Was it to reduce the number of lines in the diff?


No. Something sillier than that. I just went by alphabetic order :P
I'll add it at the end.


> We usually add
> new values at the end of the list. Everything *should* work when adding
> to the middle, but superstition causes me to anticipate bugs cause by
> some idiot using a hard-coded value, or storing the enum somewhere as an
> integer, or other assorted bad things.
>

Understood. I'' put new enum things at the end from now on.


>
>
> >
> >  VIR_ENUM_IMPL(virNetDevVPortProfileOp, VIR_NETDEV_VPORT_PROFILE_OP_LAST,
> > diff --git a/src/util/virnetdevvportprofile.h
> b/src/util/virnetdevvportprofile.h
> > index ad063c5..7c00350 100644
> > --- a/src/util/virnetdevvportprofile.h
> > +++ b/src/util/virnetdevvportprofile.h
> > @@ -34,6 +34,7 @@ enum virNetDevVPortProfile {
> >      VIR_NETDEV_VPORT_PROFILE_NONE,
> >      VIR_NETDEV_VPORT_PROFILE_8021QBG,
> >      VIR_NETDEV_VPORT_PROFILE_8021QBH,
> > +    VIR_NETDEV_VPORT_PROFILE_MIDONET,
> >      VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH,
> >
> >      VIR_NETDEV_VPORT_PROFILE_LAST,
> > @@ -73,7 +74,7 @@ struct _virNetDevVPortProfile {
> >      /* this is a null-terminated character string */
> >      char          profileID[LIBVIRT_IFLA_VF_PORT_PROFILE_MAX];
> >
> > -    /* this member is used when virtPortType == openvswitch */
> > +    /* this member is used when virtPortType == openvswitch|midonet */
> >      unsigned char interfaceID[VIR_UUID_BUFLEN];
> >      bool          interfaceID_specified;
> >      /* NB - if virtPortType == NONE, any/all of the items could be used
> */
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150219/aa2e07c3/attachment-0001.htm>


More information about the libvir-list mailing list