On 12.08.2016 04:41, Laine Stump wrote: > If you define a libvirt virtual network with one or more IP addresses, > it starts up an instance of dnsmasq. It's always been possible to > avoid dnsmasq's dhcp server (simply don't include a <dhcp> element), > but until now it wasn't possible to avoid having the DNS server > listening; even if the network has no <dns> element, it is started > using default settings. > > This patch adds a new attribute to <dns>: enable='yes|no'. For > backward compatibility, it defaults to 'yes', but if you don't want a > DNS server created for the network, you can simply add: > > <dns enable='no'/> > > to the network configuration, and next time the network is started > there will be no dns server created (if there is dhcp configuration, > dnsmasq will be started with "port=0" which disables the DNS server; > if there is no dhcp configuration, dnsmasq won't be started at all). > --- > docs/formatnetwork.html.in | 12 ++ > docs/schemas/network.rng | 5 + > src/conf/network_conf.c | 36 ++++- > src/conf/network_conf.h | 1 + > src/network/bridge_driver.c | 146 ++++++++++++--------- > .../networkxml2confdata/routed-network-no-dns.conf | 11 ++ > .../networkxml2confdata/routed-network-no-dns.xml | 10 ++ > tests/networkxml2conftest.c | 1 + > tests/networkxml2xmlin/routed-network-no-dns.xml | 10 ++ > tests/networkxml2xmlout/routed-network-no-dns.xml | 12 ++ > tests/networkxml2xmltest.c | 1 + > 11 files changed, 179 insertions(+), 66 deletions(-) > create mode 100644 tests/networkxml2confdata/routed-network-no-dns.conf > create mode 100644 tests/networkxml2confdata/routed-network-no-dns.xml > create mode 100644 tests/networkxml2xmlin/routed-network-no-dns.xml > create mode 100644 tests/networkxml2xmlout/routed-network-no-dns.xml > > diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in > index 12d1bed..e103dd7 100644 > --- a/docs/formatnetwork.html.in > +++ b/docs/formatnetwork.html.in > @@ -886,6 +886,18 @@ > server <span class="since">Since 0.9.3</span>. > > <p> > + The dns element can have an optional <code>enable</code> > + attribute <span class="since">Since 2.2.0</span>. > + If <code>enable</code> is "no", then no DNS server will be > + setup by libvirt for this network (and any other > + configuration in <code><dns></code> will be ignored). > + If <code>enable</code> is "yes" or unspecified (including > + the complete absence of any <code><dns></code> > + element) then a DNS server will be setup by libvirt to > + listen on all IP addresses specified in the network's > + configuration. > + </p> Le sigh. I wish that we could just disable dns if the tag is not present in the nework XML. But we can't do that, can we? > + <p> > The dns element > can have an optional <code>forwardPlainNames</code> > attribute <span class="since">Since 1.1.2</span>. > diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c > index 6820bde..490574f 100644 > --- a/src/conf/network_conf.c > +++ b/src/conf/network_conf.c > @@ -1335,6 +1335,7 @@ virNetworkDNSDefParseXML(const char *networkName, > xmlNodePtr *txtNodes = NULL; > xmlNodePtr *fwdNodes = NULL; > char *forwardPlainNames = NULL; > + char *enable = NULL; > int nhosts, nsrvs, ntxts, nfwds; > size_t i; > int ret = -1; > @@ -1342,6 +1343,18 @@ virNetworkDNSDefParseXML(const char *networkName, > > ctxt->node = node; > > + enable = virXPathString("string(./@enable)", ctxt); > + if (enable) { > + def->enable = virTristateBoolTypeFromString(enable); > + if (def->enable <= 0) { > + virReportError(VIR_ERR_XML_ERROR, > + _("Invalid dns enable setting '%s' " > + "in network '%s'"), > + enable, networkName); > + goto cleanup; > + } > + } > + > forwardPlainNames = virXPathString("string(./@forwardPlainNames)", ctxt); > if (forwardPlainNames) { > def->forwardPlainNames = virTristateBoolTypeFromString(forwardPlainNames); > @@ -1440,6 +1453,7 @@ virNetworkDNSDefParseXML(const char *networkName, > > ret = 0; > cleanup: > + VIR_FREE(enable); > VIR_FREE(forwardPlainNames); > VIR_FREE(fwdNodes); > VIR_FREE(hostNodes); > @@ -2496,12 +2510,22 @@ virNetworkDNSDefFormat(virBufferPtr buf, > { > size_t i, j; > > - if (!(def->forwardPlainNames || def->nfwds || def->nhosts || > + if (!(def->enable || def->forwardPlainNames || def->nfwds || def->nhosts || > def->nsrvs || def->ntxts)) > return 0; > > virBufferAddLit(buf, "<dns"); > - /* default to "yes", but don't format it in the XML */ > + if (def->enable) { > + const char *fwd = virTristateBoolTypeToString(def->enable); > + > + if (!fwd) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("Unknown enable type %d in network"), > + def->enable); > + return -1; I don't think check is needed. We've validated the forward mode when parsing the XML. Also, I think that we need slightly different approach here. I mean, for "<dns enable='no'/>" case we just want to put that string into XML and nothing more. With this code I'm able to get the following which makes not much sense to me: <dns enable='no'> <txt name='example' value='example value'/> </dns> > + } > + virBufferAsprintf(buf, " enable='%s'", fwd); > + } > if (def->forwardPlainNames) { > const char *fwd = virTristateBoolTypeToString(def->forwardPlainNames); > The rest of the patch looks okay. ACK if you fix the XML formatting issue. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list