[libvirt] [PATCH] Share the code and schemas for domain and network route definitions
Cedric Bosdonnat
cbosdonnat at suse.com
Mon Jan 12 11:54:20 UTC 2015
Hi Michal,
On Mon, 2015-01-12 at 11:47 +0100, Michal Privoznik wrote:
> On 09.01.2015 17:47, Cédric Bosdonnat wrote:
> > Made the network configuration schemas and codes for the route element reusable.
> > Created networkcommon_conf.[ch] files containing pieces to be used in both domain
> > and network configurations.
> >
> > Replaced the brand new domain route configuration by the network one. Note that it
> > now forces the destination address to be defined, even if the user wants to define
> > the default gateway.
> > ---
> > docs/formatdomain.html.in | 14 +-
> > docs/schemas/basictypes.rng | 2 +-
> > docs/schemas/domaincommon.rng | 29 +-
> > docs/schemas/network.rng | 20 +-
> > docs/schemas/networkcommon.rng | 22 ++
> > po/POTFILES.in | 1 +
> > src/Makefile.am | 3 +-
> > src/conf/domain_conf.c | 117 ++------
> > src/conf/domain_conf.h | 14 +-
> > src/conf/network_conf.c | 284 +-----------------
> > src/conf/network_conf.h | 20 +-
> > src/conf/networkcommon_conf.c | 337 ++++++++++++++++++++++
> > src/conf/networkcommon_conf.h | 76 +++++
> > src/libvirt_private.syms | 7 +
> > src/lxc/lxc_container.c | 22 +-
> > src/lxc/lxc_native.c | 26 +-
> > tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml | 4 +-
> > tests/lxcconf2xmldata/lxcconf2xml-simple.xml | 4 +-
> > tests/lxcxml2xmldata/lxc-hostdev.xml | 4 +-
> > tests/lxcxml2xmldata/lxc-idmap.xml | 4 +-
> > 20 files changed, 542 insertions(+), 468 deletions(-)
> > create mode 100644 src/conf/networkcommon_conf.c
> > create mode 100644 src/conf/networkcommon_conf.h
> >
>
> I've always felt that what's shared in RNG should share parser/formatter
> in the code too.
Yes, this is the beginning: there surely is more to move into those new
files that isn't related to routes.
> > diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng
> > index 9ddd92b..efc9da4 100644
> > --- a/docs/schemas/basictypes.rng
> > +++ b/docs/schemas/basictypes.rng
> > @@ -174,7 +174,7 @@
> > <define name="ipv6Addr">
> > <data type="string">
> > <!-- To understand this better, take apart the toplevel "|"s -->
> > -<param name="pattern">(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(([0-9A-Fa-f]{1,4}:){0,5}:(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(::([0-9A-Fa-f]{1,4}:){0,5}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)</param>
> > +<param name="pattern">(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(([0-9A-Fa-f]{1,4}:){0,5}:(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|(::([0-9A-Fa-f]{1,4}:){0,5}(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9]))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([1-9][0-9])|([0-9])))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)|(::)</param>
>
> My brain is just too small to go through this on Monday morning.
To help you, it just adds |(::) at the end to include the default '::'
notation.
> > </data>
> > </define>
> >
>
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 57e99e6..8e34fd6 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -3,6 +3,7 @@
> > *
> > * Copyright (C) 2006-2014 Red Hat, Inc.
> > * Copyright (C) 2006-2008 Daniel P. Berrange
> > + * Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
> > *
> > * This library is free software; you can redistribute it and/or
> > * modify it under the terms of the GNU Lesser General Public
> > @@ -1475,11 +1476,13 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
> > VIR_FREE(def->ips[i]);
> > VIR_FREE(def->ips);
> >
> > - for (i = 0; i < def->nroutes; i++)
> > + for (i = 0; i < def->nroutes; i++) {
> > + virNetworkRouteDefClear(def->routes[i]);
> > VIR_FREE(def->routes[i]);
>
> This code snippet repeats itself in a few places too. Looks like
> virNetworkRouteDefFree() which encapsulates the two comes handy.
Yes, I feel that something needs to be done for that too.
> > + }
> > VIR_FREE(def->routes);
> >
> > - virDomainDeviceInfoClear(&def->info);
> > + virDomainDeviceInfoClear(&def->info);
> >
> > VIR_FREE(def->filter);
> > virNWFilterHashTableFree(def->filterparams);
>
> > static void
> > virDomainNetRoutesFormat(virBufferPtr buf,
> > - virDomainNetRouteDefPtr *routes,
> > + virNetworkRouteDefPtr *routes,
> > size_t nroutes)
> > {
> > size_t i;
> >
> > for (i = 0; i < nroutes; i++) {
> > - virDomainNetRouteDefPtr route = routes[i];
> > - const char *familyStr = NULL;
> > - char *via = virSocketAddrFormat(&route->via);
> > - char *to = NULL;
> > -
> > - if (VIR_SOCKET_ADDR_IS_FAMILY(&route->via, AF_INET6))
> > - familyStr = "ipv6";
> > - else if (VIR_SOCKET_ADDR_IS_FAMILY(&route->via, AF_INET))
> > - familyStr = "ipv4";
> > - virBufferAsprintf(buf, "<route family='%s' via='%s'", familyStr, via);
> > -
> > - if (VIR_SOCKET_ADDR_VALID(&route->to)) {
> > - to = virSocketAddrFormat(&route->to);
> > - virBufferAsprintf(buf, " address='%s'", to);
> > - }
> > -
> > - if (route->prefix > 0)
> > - virBufferAsprintf(buf, " prefix='%d'", route->prefix);
> > -
> > - virBufferAddLit(buf, "/>\n");
> > + virNetworkRouteDefPtr route = routes[i];
> > + virNetworkRouteDefFormat(buf, route);
>
> Or just user routes[i] directly.
Oh indeed.
> > }
> > }
> >
>
> > diff --git a/src/conf/networkcommon_conf.c b/src/conf/networkcommon_conf.c
> > new file mode 100644
> > index 0000000..da80c0f
> > --- /dev/null
> > +++ b/src/conf/networkcommon_conf.c
>
> > +int
> > +virNetworkRouteDefFormat(virBufferPtr buf,
> > + const virNetworkRouteDef *def)
> > +{
> > + int result = -1;
> > +
> > + virBufferAddLit(buf, "<route");
> > +
> > + if (def->family)
> > + virBufferAsprintf(buf, " family='%s'", def->family);
> > + if (VIR_SOCKET_ADDR_VALID(&def->address)) {
> > + char *addr = virSocketAddrFormat(&def->address);
> > +
> > + if (!addr)
> > + goto error;
> > + virBufferAsprintf(buf, " address='%s'", addr);
> > + VIR_FREE(addr);
> > + }
> > + if (VIR_SOCKET_ADDR_VALID(&def->netmask)) {
> > + char *addr = virSocketAddrFormat(&def->netmask);
> > +
> > + if (!addr)
> > + goto error;
> > + virBufferAsprintf(buf, " netmask='%s'", addr);
> > + VIR_FREE(addr);
> > + }
> > + if (def->has_prefix)
> > + virBufferAsprintf(buf, " prefix='%u'", def->prefix);
> > + if (VIR_SOCKET_ADDR_VALID(&def->gateway)) {
>
> I know you've copied the preexisting code, but since this kind of check
> is done in virNetworkRouteDefCreate() - is it needed here too? It
> doesn't hurt anything (but performance, which we don't care about that
> much). I'm just curious.
Indeed, that one may not be needed.
> > + char *addr = virSocketAddrFormat(&def->gateway);
> > + if (!addr)
> > + goto error;
> > + virBufferAsprintf(buf, " gateway='%s'", addr);
> > + VIR_FREE(addr);
> > + }
> > + if (def->has_metric && def->metric > 0)
> > + virBufferAsprintf(buf, " metric='%u'", def->metric);
> > + virBufferAddLit(buf, "/>\n");
> > +
> > + result = 0;
> > + error:
> > + return result;
> > +}
>
> > diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
> > index d7cd1d5..dd99bbb 100644
> > --- a/src/lxc/lxc_native.c
> > +++ b/src/lxc/lxc_native.c
> > @@ -2,7 +2,7 @@
> > * lxc_native.c: LXC native configuration import
> > *
> > * Copyright (c) 2014 Red Hat, Inc.
> > - * Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
> > + * Copyright (c) 2013-2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
>
> Technically speaking this should be 2013,2015 but who cares, right? :)
Well, that was previously erroneous, since I hacked on it last year but
wasn't mentioned in the header... but yeah, who cares ;)
> > *
> > * This library is free software; you can redistribute it and/or
> > * modify it under the terms of the GNU Lesser General Public
>
>
> ACK
I'll do the changes before pushing.
--
Cedric
More information about the libvir-list
mailing list