On 12/01/2014 03:40 AM, John Ferlan wrote:
>
>
> On 11/20/2014 09:46 PM, Josh Stone wrote:
>> This adds a new "localOnly" attribute on the domain element of the
>> network xml. With this set to "yes", DNS requests under that domain
>> will only be resolved by libvirt's dnsmasq, never forwarded upstream.
>>
>> This was how it worked before commit f69a6b987d616, and I found that
>> functionality useful. For example, I have my host's NetworkManager
>> dnsmasq configured to forward that domain to libvirt's dnsmasq, so I can
>> easily resolve guest names from outside. But if libvirt's dnsmasq
>> doesn't know a name and forwards it to the host, I'd get an endless
>> forwarding loop. Now I can set localOnly="yes" to prevent the loop.
>>
>> Signed-off-by: Josh Stone <[email protected]>
>> Cc: Laine Stump <[email protected]>
>
> Depending on how you proceed with Martin's comments...
>
>> ---
>> docs/formatnetwork.html.in | 12 +++++++++++-
>> docs/schemas/network.rng | 3 +++
>> src/conf/network_conf.c | 5 +++++
>> src/conf/network_conf.h | 1 +
>> src/network/bridge_driver.c | 5 +++++
>> .../networkxml2confdata/nat-network-dns-local-domain.conf | 14
>> ++++++++++++++
>> tests/networkxml2confdata/nat-network-dns-local-domain.xml | 9 +++++++++
>> tests/networkxml2conftest.c | 1 +
>> 8 files changed, 49 insertions(+), 1 deletion(-)
>> create mode 100644
>> tests/networkxml2confdata/nat-network-dns-local-domain.conf
>> create mode 100644
>> tests/networkxml2confdata/nat-network-dns-local-domain.xml
>>
>> diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
>> index dc438aee8622..defcdba00930 100644
>> --- a/docs/formatnetwork.html.in
>> +++ b/docs/formatnetwork.html.in
>> @@ -82,7 +82,7 @@
>> <pre>
>> ...
>> <bridge name="virbr0" stp="on" delay="5"/>
>> - <domain name="example.com"/>
>> + <domain name="example.com" localOnly="no"/>
>> <forward mode="nat" dev="eth0"/>
>> ...</pre>
>>
>> @@ -113,6 +113,16 @@
>> a <code><forward></code> mode of "nat" or "route" (or an
>> isolated network with no <code><forward></code>
>> element). <span class="since">Since 0.4.5</span>
>> +
>> + <p>
>> + If the optional <code>localOnly</code> attribute on the
>> + <code>domain</code> element is "yes", then DNS requests under
>> + this domain will only be resolved by the virtual network's own
>> + DNS server - they will not be forwarded to the host's upstream
>> + DNS server. If <code>localOnly</code> is "no", and by
>> + default, unresolved requests <b>will</b> be forwarded.
>> + <span class="since">Since 1.2.11</span>
>> + </p>
>> </dd>
>> <dt><code>forward</code></dt>
>> <dd>Inclusion of the <code>forward</code> element indicates that
>> diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
>> index 4546f8037580..a1da28092375 100644
>> --- a/docs/schemas/network.rng
>> +++ b/docs/schemas/network.rng
>> @@ -225,6 +225,9 @@
>> <optional>
>> <element name="domain">
>> <attribute name="name"><ref name="dnsName"/></attribute>
>> + <optional>
>> + <attribute name="localOnly"><ref name="virYesNo"/></attribute>
>> + </optional>
>> </element>
>> </optional>
>>
>> diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
>> index 067334e87cb0..61451c39805f 100644
>> --- a/src/conf/network_conf.c
>> +++ b/src/conf/network_conf.c
>> @@ -2083,6 +2083,11 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
>>
>> /* Parse network domain information */
>> def->domain = virXPathString("string(./domain[1]/@name)", ctxt);
>> + tmp = virXPathString("string(./domain[1]/@localOnly)", ctxt);
>> + if (tmp) {
>> + def->domain_local = STRCASEEQ(tmp, "yes");
>> + VIR_FREE(tmp);
>> + }
>
> This should use virTristateBoolTypeFromString like other yes/no processing.
Ok, I just didn't see any really consistent way to parse these.
STRCASEEQ was just simple and also used elsewhere, for @default and
@managed, but maybe those aren't tristate.
> Also how do you save in the XML what you've read in (hint: Format*
> function)? Perhaps look at 'forwardPlainNames' for an example of
> Tristate and find all the places it touches. Something is a Tristate
> when it's optional, can be yes or no, and has a default...
Ah, I missed Format, thanks. I'll update with forwardPlainNames as a
template, if the other subthread concludes localOnly is still useful.
>> if ((bandwidthNode = virXPathNode("./bandwidth", ctxt)) != NULL &&
>> (def->bandwidth = virNetDevBandwidthParse(bandwidthNode, -1)) ==
>> NULL)
>> diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
>> index 660cd2d10cd1..6308a7dcfbf7 100644
>> --- a/src/conf/network_conf.h
>> +++ b/src/conf/network_conf.h
>> @@ -232,6 +232,7 @@ struct _virNetworkDef {
>>
>> char *bridge; /* Name of bridge device */
>> char *domain;
>> + bool domain_local; /* Choose not to forward dns for this domain */
>
> This would then be:
>
> int domain_local; /* enum virTristateBool */
>
>
>> unsigned long delay; /* Bridge forward delay (ms) */
>> bool stp; /* Spanning tree protocol */
>> virMacAddr mac; /* mac address of bridge device */
>> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
>> index 6cb421c52850..dfa375d3aa72 100644
>> --- a/src/network/bridge_driver.c
>> +++ b/src/network/bridge_driver.c
>> @@ -912,6 +912,11 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
>> }
>>
>> if (network->def->domain) {
>> + if (network->def->domain_local) {
>
> This would then check using == VIR_TRISTATE_BOOL_YES
>
>> + virBufferAsprintf(&configbuf,
>> + "local=/%s/\n",
>> + network->def->domain);
>> + }
>> virBufferAsprintf(&configbuf,
>> "domain=%s\n"
>> "expand-hosts\n",
>> diff --git a/tests/networkxml2confdata/nat-network-dns-local-domain.conf
>> b/tests/networkxml2confdata/nat-network-dns-local-domain.conf
>> new file mode 100644
>> index 000000000000..5f41b9186cbc
>> --- /dev/null
>> +++ b/tests/networkxml2confdata/nat-network-dns-local-domain.conf
>> @@ -0,0 +1,14 @@
>> +##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
>> +##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
>> +## virsh net-edit default
>> +## or other application using the libvirt API.
>> +##
>> +## dnsmasq conf file created by libvirt
>> +strict-order
>> +local=/example.com/
>> +domain=example.com
>> +expand-hosts
>> +except-interface=lo
>> +bind-dynamic
>> +interface=virbr0
>> +addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
>> diff --git a/tests/networkxml2confdata/nat-network-dns-local-domain.xml
>> b/tests/networkxml2confdata/nat-network-dns-local-domain.xml
>> new file mode 100644
>> index 000000000000..a92d71f1f2f6
>> --- /dev/null
>> +++ b/tests/networkxml2confdata/nat-network-dns-local-domain.xml
>> @@ -0,0 +1,9 @@
>> +<network>
>> + <name>default</name>
>> + <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9c</uuid>
>> + <forward dev='eth0' mode='nat'/>
>> + <bridge name='virbr0' stp='on' delay='0' />
>> + <domain name='example.com' localOnly='yes'/>
>> + <ip address='192.168.122.1' netmask='255.255.255.0'>
>> + </ip>
>> +</network>
>> diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c
>> index 4f1d9345ffe4..d2aa8c62cfcd 100644
>> --- a/tests/networkxml2conftest.c
>> +++ b/tests/networkxml2conftest.c
>> @@ -146,6 +146,7 @@ mymain(void)
>> DO_TEST("nat-network-dns-hosts", full);
>> DO_TEST("nat-network-dns-forward-plain", full);
>> DO_TEST("nat-network-dns-forwarders", full);
>> + DO_TEST("nat-network-dns-local-domain", full);
>> DO_TEST("dhcp6-network", dhcpv6);
>> DO_TEST("dhcp6-nat-network", dhcpv6);
>> DO_TEST("dhcp6host-routed-network", dhcpv6);
>>
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list