
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