[PATCH v2] Implement DNS SRV record into the bridge driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,
this is the second version of my patch to the bridge driver and
libvirt XML file to include support for the SRV records in the DNS.
The syntax is based on DNSMasq man page and tests for both xml2xml
and xml2argv were added as well.

Differences between v1 and v2:
- A minor rewrite of integer parsing functionality
- Extend tests to test with both minimal and full set of attributes
- Check for service name length implemented

Signed-off-by: Michal Novotny <minovotn@xxxxxxxxxx>
Signed-off-by: Michal Novotny <mignov@xxxxxxxxx>
---
 docs/formatnetwork.html.in                         |   12 ++
 docs/schemas/network.rng                           |   26 ++++
 src/conf/network_conf.c                            |  130 +++++++++++++++++++-
 src/conf/network_conf.h                            |   16 +++
 src/network/bridge_driver.c                        |   43 +++++++
 .../nat-network-dns-srv-record-minimal.argv        |    1 +
 .../nat-network-dns-srv-record-minimal.xml         |   26 ++++
 .../nat-network-dns-srv-record.argv                |    1 +
 .../nat-network-dns-srv-record.xml                 |   26 ++++
 tests/networkxml2argvtest.c                        |    2 +
 .../nat-network-dns-srv-record-minimal.xml         |   26 ++++
 .../nat-network-dns-srv-record.xml                 |   26 ++++
 .../nat-network-dns-srv-record-minimal.xml         |   26 ++++
 .../nat-network-dns-srv-record.xml                 |   26 ++++
 tests/networkxml2xmltest.c                         |    2 +
 tests/schematestutils.sh                           |    4 +
 16 files changed, 391 insertions(+), 2 deletions(-)
 create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
 create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml
 create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record.argv
 create mode 100644 tests/networkxml2argvdata/nat-network-dns-srv-record.xml
 create mode 100644 tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml
 create mode 100644 tests/networkxml2xmlin/nat-network-dns-srv-record.xml
 create mode 100644 tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
 create mode 100644 tests/networkxml2xmlout/nat-network-dns-srv-record.xml

diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
index 99031d0..51b1581 100644
--- a/docs/formatnetwork.html.in
+++ b/docs/formatnetwork.html.in
@@ -342,6 +342,7 @@
         &lt;mac address='00:16:3E:5D:C7:9E'/&gt;
         &lt;dns&gt;
           &lt;txt name="example" value="example value" /&gt;
+          &lt;srv service="name" protocol="tcp" domain="test-domain-name" target="." port="1024" priority="10" weight="10"/&gt;
         &lt;/dns&gt;
         &lt;ip address="192.168.122.1" netmask="255.255.255.0"&gt;
           &lt;dhcp&gt;
@@ -390,6 +391,17 @@
             <span class="since">Since 0.9.3</span>
           </dd>
         </dl>
+        <dl>
+          <dt><code>srv</code></dt>
+          <dd>The <code>dns</code> element can have also 0 or more <code>srv</code>
+            record elements. Each <code>srv</code> record element defines a DNS SRV record
+            and has 2 mandatory and 5 optional attributes. The mandatory attributes
+            are service name and protocol (tcp, udp) and the optional attributes are
+            target, port, priority, weight and domain as defined in DNS server SRV
+            RFC (RFC 2782).
+            <span class="since">Since 0.9.5</span>
+          </dd>
+        </dl>
       </dd>
       <dt><code>ip</code></dt>
       <dd>The <code>address</code> attribute defines an IPv4 address in
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 1c44471..dae2799 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -138,6 +138,19 @@
                 </element>
               </zeroOrMore>
               <zeroOrMore>
+                <element name="srv">
+                  <attribute name="service"><text/></attribute>
+                  <attribute name="protocol"><ref name="protocol"/></attribute>
+                  <optional>
+                    <attribute name="domain"><ref name="dnsName"/></attribute>
+                    <attribute name="target"><text/></attribute>
+                    <attribute name="port"><ref name="unsignedShort"/></attribute>
+                    <attribute name="priority"><ref name="unsignedShort"/></attribute>
+                    <attribute name="weight"><ref name="unsignedShort"/></attribute>
+                  </optional>
+                </element>
+              </zeroOrMore>
+              <zeroOrMore>
                 <element name="host">
                   <attribute name="ip"><ref name="ipv4Addr"/></attribute>
                   <oneOrMore>
@@ -206,6 +219,19 @@
     </element>
   </define>
 
+  <define name='unsignedShort'>
+    <data type='integer'>
+      <param name="minInclusive">0</param>
+      <param name="maxInclusive">65535</param>
+    </data>
+  </define>
+
+  <define name='protocol'>
+    <data type='string'>
+      <param name='pattern'>(tcp)|(udp)</param>
+    </data>
+  </define>
+
   <define name='addr-family'>
     <data type='string'>
       <param name="pattern">(ipv4)|(ipv6)</param>
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index b11c482..517c4d6 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -137,6 +137,15 @@ static void virNetworkDNSDefFree(virNetworkDNSDefPtr def)
             }
             VIR_FREE(def->hosts);
         }
+        if (def->nsrvrecords) {
+            while (def->nsrvrecords--) {
+              VIR_FREE(def->srvrecords[def->nsrvrecords].domain);
+              VIR_FREE(def->srvrecords[def->nsrvrecords].service);
+              VIR_FREE(def->srvrecords[def->nsrvrecords].protocol);
+              VIR_FREE(def->srvrecords[def->nsrvrecords].target);
+            }
+            VIR_FREE(def->srvrecords);
+        }
         VIR_FREE(def);
     }
 }
@@ -552,8 +561,99 @@ error:
 }
 
 static int
+virNetworkDNSSrvDefParseXML(virNetworkDNSDefPtr def,
+                            xmlNodePtr cur,
+                            xmlXPathContextPtr ctxt)
+{
+    char *domain;
+    char *service;
+    char *protocol;
+    char *target;
+    int port;
+    int priority;
+    int weight;
+    int ret = 0;
+    char xpath[1024] = { 0 };
+
+    if (!(service = virXMLPropString(cur, "service"))) {
+        virNetworkReportError(VIR_ERR_XML_DETAIL,
+                              "%s", _("Missing required service attribute in dns srv record"));
+        goto error;
+    }
+
+    if (strlen(service) > DNS_RECORD_LENGTH_SRV) {
+        virNetworkReportError(VIR_ERR_XML_DETAIL,
+                              "%s", _("Service name is too long, limit is %d bytes"), DNS_RECORD_LENGTH_SRV);
+        goto error;
+    }
+
+    if (!(protocol = virXMLPropString(cur, "protocol"))) {
+        virNetworkReportError(VIR_ERR_XML_DETAIL,
+                              _("Missing required protocol attribute in dns srv record '%s'"), service);
+        goto error;
+    }
+
+    /* Check whether protocol value is the supported one */
+    if (STRNEQ(protocol, "tcp") && (STRNEQ(protocol, "udp"))) {
+        virNetworkReportError(VIR_ERR_XML_DETAIL,
+                              _("Invalid protocol attribute value '%s'"), protocol);
+        goto error;
+    }
+
+    if (VIR_REALLOC_N(def->srvrecords, def->nsrvrecords + 1) < 0) {
+        virReportOOMError();
+        goto error;
+    }
+
+    def->srvrecords[def->nsrvrecords].service = service;
+    def->srvrecords[def->nsrvrecords].protocol = protocol;
+    def->srvrecords[def->nsrvrecords].domain = NULL;
+    def->srvrecords[def->nsrvrecords].target = NULL;
+    def->srvrecords[def->nsrvrecords].port = 0;
+    def->srvrecords[def->nsrvrecords].priority = 0;
+    def->srvrecords[def->nsrvrecords].weight = 0;
+
+    /* Following attributes are optional but we had to make sure their NULL above */
+    if ((target = virXMLPropString(cur, "target")) && (domain = virXMLPropString(cur, "domain"))) {
+        snprintf(xpath, sizeof(xpath), "string(//network/dns/srv[@service='%s']/@port)", service);
+        if (virXPathInt(xpath, ctxt, &port))
+            def->srvrecords[def->nsrvrecords].port = port;
+
+        snprintf(xpath, sizeof(xpath), "string(//network/dns/srv[@service='%s']/@priority)", service);
+        if (virXPathInt(xpath, ctxt, &priority))
+            def->srvrecords[def->nsrvrecords].priority = priority;
+
+        snprintf(xpath, sizeof(xpath), "string(//network/dns/srv[@service='%s']/@weight)", service);
+        if (virXPathInt(xpath, ctxt, &weight))
+            def->srvrecords[def->nsrvrecords].weight = weight;
+
+        def->srvrecords[def->nsrvrecords].domain = domain;
+        def->srvrecords[def->nsrvrecords].target = target;
+        def->srvrecords[def->nsrvrecords].port = port;
+        def->srvrecords[def->nsrvrecords].priority = priority;
+        def->srvrecords[def->nsrvrecords].weight = weight;
+    }
+
+    def->nsrvrecords++;
+
+    goto cleanup;
+
+error:
+    VIR_FREE(domain);
+    VIR_FREE(service);
+    VIR_FREE(protocol);
+    VIR_FREE(target);
+
+    ret = 1;
+
+cleanup:
+    return ret;
+}
+
+static int
 virNetworkDNSDefParseXML(virNetworkDNSDefPtr *dnsdef,
-                         xmlNodePtr node)
+                         xmlNodePtr node,
+                         xmlXPathContextPtr ctxt)
 {
     xmlNodePtr cur;
     int ret = -1;
@@ -598,6 +698,11 @@ virNetworkDNSDefParseXML(virNetworkDNSDefPtr *dnsdef,
             name = NULL;
             value = NULL;
         } else if (cur->type == XML_ELEMENT_NODE &&
+            xmlStrEqual(cur->name, BAD_CAST "srv")) {
+            ret = virNetworkDNSSrvDefParseXML(def, cur, ctxt);
+            if (ret < 0)
+                goto error;
+        } else if (cur->type == XML_ELEMENT_NODE &&
             xmlStrEqual(cur->name, BAD_CAST "host")) {
             ret = virNetworkDNSHostsDefParseXML(def, cur);
             if (ret < 0)
@@ -888,7 +993,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 
     dnsNode = virXPathNode("./dns", ctxt);
     if (dnsNode != NULL) {
-        if (virNetworkDNSDefParseXML(&def->dns, dnsNode) < 0)
+        if (virNetworkDNSDefParseXML(&def->dns, dnsNode, ctxt) < 0)
             goto error;
     }
 
@@ -1147,6 +1252,27 @@ virNetworkDNSDefFormat(virBufferPtr buf,
                               def->txtrecords[i].value);
     }
 
+    for (i = 0 ; i < def->nsrvrecords ; i++) {
+        if (def->srvrecords[i].service && def->srvrecords[i].protocol) {
+            virBufferAsprintf(buf, "    <srv service='%s' protocol='%s' ",
+                                  def->srvrecords[i].service,
+                                  def->srvrecords[i].protocol);
+
+            if (def->srvrecords[i].domain)
+                virBufferAsprintf(buf, "domain='%s' ", def->srvrecords[i].domain);
+            if (def->srvrecords[i].target)
+                virBufferAsprintf(buf, "target='%s' ", def->srvrecords[i].target);
+            if (def->srvrecords[i].port)
+                virBufferAsprintf(buf, "port='%d' ", def->srvrecords[i].port);
+            if (def->srvrecords[i].priority)
+                virBufferAsprintf(buf, "priority='%d' ", def->srvrecords[i].priority);
+            if (def->srvrecords[i].weight)
+                virBufferAsprintf(buf, "weight='%d' ", def->srvrecords[i].weight);
+
+            virBufferAsprintf(buf, "/>\n");
+        }
+    }
+
     if (def->nhosts) {
         int ii, j;
 
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index 869085e..5f05a3a 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -24,6 +24,8 @@
 #ifndef __NETWORK_CONF_H__
 # define __NETWORK_CONF_H__
 
+#define DNS_RECORD_LENGTH_SRV  (512 - 30)  /* Limit minus overhead as mentioned in RFC-2782 */
+
 # include <libxml/parser.h>
 # include <libxml/tree.h>
 # include <libxml/xpath.h>
@@ -67,6 +69,18 @@ struct _virNetworkDNSTxtRecordsDef {
     char *value;
 };
 
+typedef struct _virNetworkDNSSrvRecordsDef virNetworkDNSSrvRecordsDef;
+typedef virNetworkDNSSrvRecordsDef *virNetworkDNSSrvRecordsDefPtr;
+struct _virNetworkDNSSrvRecordsDef {
+    char *domain;
+    char *service;
+    char *protocol;
+    char *target;
+    int port;
+    int priority;
+    int weight;
+};
+
 struct _virNetworkDNSHostsDef {
     virSocketAddr ip;
     int nnames;
@@ -80,6 +94,8 @@ struct _virNetworkDNSDef {
     virNetworkDNSTxtRecordsDefPtr txtrecords;
     unsigned int nhosts;
     virNetworkDNSHostsDefPtr hosts;
+    unsigned int nsrvrecords;
+    virNetworkDNSSrvRecordsDefPtr srvrecords;
 };
 
 typedef struct _virNetworkDNSDef *virNetworkDNSDefPtr;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index c90db63..f4d952f 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -559,6 +559,49 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
             virCommandAddArgPair(cmd, "--txt-record", record);
             VIR_FREE(record);
         }
+
+        for (i = 0; i < dns->nsrvrecords; i++) {
+            char *record = NULL;
+            char *recordPort = NULL;
+            char *recordPriority = NULL;
+            char *recordWeight = NULL;
+
+            if (dns->srvrecords[i].service && dns->srvrecords[i].protocol) {
+                if (dns->srvrecords[i].port) {
+                    if (virAsprintf(&recordPort, "%d", dns->srvrecords[i].port) < 0) {
+                        virReportOOMError();
+                        goto cleanup;
+                    }
+                }
+                if (dns->srvrecords[i].priority) {
+                    if (virAsprintf(&recordPriority, "%d", dns->srvrecords[i].priority) < 0) {
+                        virReportOOMError();
+                        goto cleanup;
+                    }
+                }
+                if (dns->srvrecords[i].weight) {
+                    if (virAsprintf(&recordWeight, "%d", dns->srvrecords[i].weight) < 0) {
+                        virReportOOMError();
+                        goto cleanup;
+                    }
+                }
+
+                if (virAsprintf(&record, "%s.%s.%s,%s,%s,%s,%s",
+                                dns->srvrecords[i].service,
+                                dns->srvrecords[i].protocol,
+                                dns->srvrecords[i].domain   ? dns->srvrecords[i].domain : "",
+                                dns->srvrecords[i].target   ? dns->srvrecords[i].target : "",
+                                recordPort                  ? recordPort                : "",
+                                recordPriority              ? recordPriority            : "",
+                                recordWeight                ? recordWeight              : "") < 0) {
+                    virReportOOMError();
+                    goto cleanup;
+                }
+
+                virCommandAddArgPair(cmd, "--srv-host", record);
+                VIR_FREE(record);
+            }
+        }
     }
 
     /*
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
new file mode 100644
index 0000000..174f751
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= --except-interface lo --srv-host=name.tcp.,,,, --listen-address 192.168.122.1 --listen-address 192.168.123.1 --listen-address 2001:db8:ac10:fe01::1 --listen-address 2001:db8:ac10:fd01::1 --listen-address 10.24.10.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override --dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml
new file mode 100644
index 0000000..e9b7680
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <dns>
+    <srv service='name' protocol='tcp' />
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
new file mode 100644
index 0000000..2ea9809
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= --except-interface lo --srv-host=name.tcp.test-domain-name,.,1024,10,10 --listen-address 192.168.122.1 --listen-address 192.168.123.1 --listen-address 2001:db8:ac10:fe01::1 --listen-address 2001:db8:ac10:fd01::1 --listen-address 10.24.10.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override --dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record.xml b/tests/networkxml2argvdata/nat-network-dns-srv-record.xml
new file mode 100644
index 0000000..4be85b5
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <dns>
+    <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10' />
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvtest.c b/tests/networkxml2argvtest.c
index 4a11d6f..2dd9b7f 100644
--- a/tests/networkxml2argvtest.c
+++ b/tests/networkxml2argvtest.c
@@ -120,6 +120,8 @@ mymain(void)
     DO_TEST("netboot-network");
     DO_TEST("netboot-proxy-network");
     DO_TEST("nat-network-dns-txt-record");
+    DO_TEST("nat-network-dns-srv-record");
+    DO_TEST("nat-network-dns-srv-record-minimal");
     DO_TEST("nat-network-dns-hosts");
 
     return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
diff --git a/tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml b/tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml
new file mode 100644
index 0000000..e9b7680
--- /dev/null
+++ b/tests/networkxml2xmlin/nat-network-dns-srv-record-minimal.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <dns>
+    <srv service='name' protocol='tcp' />
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2xmlin/nat-network-dns-srv-record.xml b/tests/networkxml2xmlin/nat-network-dns-srv-record.xml
new file mode 100644
index 0000000..4be85b5
--- /dev/null
+++ b/tests/networkxml2xmlin/nat-network-dns-srv-record.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <dns>
+    <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10' />
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml b/tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
new file mode 100644
index 0000000..e9b7680
--- /dev/null
+++ b/tests/networkxml2xmlout/nat-network-dns-srv-record-minimal.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <dns>
+    <srv service='name' protocol='tcp' />
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2xmlout/nat-network-dns-srv-record.xml b/tests/networkxml2xmlout/nat-network-dns-srv-record.xml
new file mode 100644
index 0000000..4be85b5
--- /dev/null
+++ b/tests/networkxml2xmlout/nat-network-dns-srv-record.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <dns>
+    <srv service='name' protocol='tcp' domain='test-domain-name' target='.' port='1024' priority='10' weight='10' />
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c
index 5cdbedb..b9f6546 100644
--- a/tests/networkxml2xmltest.c
+++ b/tests/networkxml2xmltest.c
@@ -87,6 +87,8 @@ mymain(void)
     DO_TEST("netboot-network");
     DO_TEST("netboot-proxy-network");
     DO_TEST("nat-network-dns-txt-record");
+    DO_TEST("nat-network-dns-srv-record");
+    DO_TEST("nat-network-dns-srv-record-minimal");
     DO_TEST("nat-network-dns-hosts");
     DO_TEST("8021Qbh-net");
     DO_TEST("direct-net");
diff --git a/tests/schematestutils.sh b/tests/schematestutils.sh
index f2b3b50..5fe85ce 100644
--- a/tests/schematestutils.sh
+++ b/tests/schematestutils.sh
@@ -20,6 +20,10 @@ do
     result=`$cmd 2>&1`
     ret=$?
 
+    if test "$ret" != "0"; then
+        xmllint --relaxng $SCHEMA $xml
+    fi
+
     test_result $n $(basename $(dirname $xml))"/"$(basename $xml) $ret
     if test "$verbose" = "1" && test $ret != 0 ; then
         printf '%s\n' "$cmd" "$result"
-- 
1.7.4.4

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]