Re: [libvirt] [PATCH 4/5] network: wire up dnsmasq option xmlns

2019-07-18 Thread Ján Tomko

On Sun, Jul 14, 2019 at 08:04:00PM -0400, Cole Robinson wrote:

This maps to XML like:

 
   ...
   
 
 
   
 

To dnsmasq config options

 ...
 foo=bar
 cname=*.foo.example.com,master.example.com

Signed-off-by: Cole Robinson 
---
docs/schemas/network.rng  |  11 ++
src/network/bridge_driver.c   | 130 +-
src/network/bridge_driver.h   |  12 ++
tests/Makefile.am |  14 +-
.../networkxml2confdata/dnsmasq-options.conf  |  18 +++
tests/networkxml2confdata/dnsmasq-options.xml |  15 ++
tests/networkxml2conftest.c   |   8 +-
tests/networkxml2xmlin/dnsmasq-options.xml|  15 ++
tests/networkxml2xmlout/dnsmasq-options.xml   |  17 +++
tests/networkxml2xmltest.c|  11 +-
10 files changed, 239 insertions(+), 12 deletions(-)
create mode 100644 tests/networkxml2confdata/dnsmasq-options.conf
create mode 100644 tests/networkxml2confdata/dnsmasq-options.xml
create mode 100644 tests/networkxml2xmlin/dnsmasq-options.xml
create mode 100644 tests/networkxml2xmlout/dnsmasq-options.xml

+static int
+networkDnsmasqDefNamespaceParse(xmlXPathContextPtr ctxt,
+void **data)
+{
+networkDnsmasqXmlNsDefPtr nsdata = NULL;
+int ret = -1;
+
+if (xmlXPathRegisterNs(ctxt, BAD_CAST "dnsmasq",
+   BAD_CAST DNSMASQ_NAMESPACE_HREF) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("Failed to register xml namespace '%s'"),
+   DNSMASQ_NAMESPACE_HREF);
+return -1;
+}


This breaks the build on Debian in Jenkins and Ubuntu 18 on travis:
https://ci.centos.org/view/libvirt/job/libvirt-build/systems=libvirt-debian-9/663/console
https://travis-ci.org/libvirt/libvirt/jobs/560399203

Jano

+
+if (VIR_ALLOC(nsdata) < 0)
+return -1;
+
+if (networkDnsmasqDefNamespaceParseOptions(nsdata, ctxt))
+goto cleanup;
+
+if (nsdata->noptions > 0)
+VIR_STEAL_PTR(*data, nsdata);
+
+ret = 0;
+
+ cleanup:
+networkDnsmasqDefNamespaceFree(nsdata);
+return ret;
+}


signature.asc
Description: PGP signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 4/5] network: wire up dnsmasq option xmlns

2019-07-14 Thread Cole Robinson
This maps to XML like:

  
...

  
  

  

To dnsmasq config options

  ...
  foo=bar
  cname=*.foo.example.com,master.example.com

Signed-off-by: Cole Robinson 
---
 docs/schemas/network.rng  |  11 ++
 src/network/bridge_driver.c   | 130 +-
 src/network/bridge_driver.h   |  12 ++
 tests/Makefile.am |  14 +-
 .../networkxml2confdata/dnsmasq-options.conf  |  18 +++
 tests/networkxml2confdata/dnsmasq-options.xml |  15 ++
 tests/networkxml2conftest.c   |   8 +-
 tests/networkxml2xmlin/dnsmasq-options.xml|  15 ++
 tests/networkxml2xmlout/dnsmasq-options.xml   |  17 +++
 tests/networkxml2xmltest.c|  11 +-
 10 files changed, 239 insertions(+), 12 deletions(-)
 create mode 100644 tests/networkxml2confdata/dnsmasq-options.conf
 create mode 100644 tests/networkxml2confdata/dnsmasq-options.xml
 create mode 100644 tests/networkxml2xmlin/dnsmasq-options.xml
 create mode 100644 tests/networkxml2xmlout/dnsmasq-options.xml

diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 2a6e3358fd..56937d6a4e 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -405,6 +405,17 @@
 
   
 
+
+  
+  
+http://libvirt.org/schemas/network/dnsmasq/1.0;>
+  
+
+  
+
+  
+
+  
   
 
   
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 1a4d6e7f7b..41fa89a4af 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -69,6 +69,8 @@
 #include "virjson.h"
 #include "virnetworkportdef.h"
 
+#include 
+
 #define VIR_FROM_THIS VIR_FROM_NETWORK
 #define MAX_BRIDGE_ID 256
 
@@ -83,6 +85,8 @@
 
 VIR_LOG_INIT("network.bridge_driver");
 
+#define DNSMASQ_NAMESPACE_HREF "http://libvirt.org/schemas/network/dnsmasq/1.0;
+
 static virNetworkDriverStatePtr network_driver;
 
 
@@ -136,10 +140,126 @@ networkDnsmasqCapsRefresh(virNetworkDriverStatePtr 
driver)
 return 0;
 }
 
-static virNetworkXMLOptionPtr
+
+static void
+networkDnsmasqDefNamespaceFree(void *nsdata)
+{
+networkDnsmasqXmlNsDefPtr def = nsdata;
+if (!def)
+return;
+
+virStringListFreeCount(def->options, def->noptions);
+
+VIR_FREE(def);
+}
+
+
+static int
+networkDnsmasqDefNamespaceParseOptions(networkDnsmasqXmlNsDefPtr nsdef,
+   xmlXPathContextPtr ctxt)
+{
+VIR_AUTOFREE(xmlNodePtr *) nodes = NULL;
+ssize_t nnodes;
+size_t i;
+
+if ((nnodes = virXPathNodeSet("./dnsmasq:options/dnsmasq:option",
+  ctxt, )) < 0)
+return -1;
+
+if (nnodes == 0)
+return 0;
+
+if (VIR_ALLOC_N(nsdef->options, nnodes) < 0)
+return -1;
+
+for (i = 0; i < nnodes; i++) {
+if (!(nsdef->options[nsdef->noptions++] = virXMLPropString(nodes[i], 
"value"))) {
+virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+   _("No dnsmasq options value specified"));
+return -1;
+}
+}
+
+return 0;
+}
+
+
+static int
+networkDnsmasqDefNamespaceParse(xmlXPathContextPtr ctxt,
+void **data)
+{
+networkDnsmasqXmlNsDefPtr nsdata = NULL;
+int ret = -1;
+
+if (xmlXPathRegisterNs(ctxt, BAD_CAST "dnsmasq",
+   BAD_CAST DNSMASQ_NAMESPACE_HREF) < 0) {
+virReportError(VIR_ERR_INTERNAL_ERROR,
+   _("Failed to register xml namespace '%s'"),
+   DNSMASQ_NAMESPACE_HREF);
+return -1;
+}
+
+if (VIR_ALLOC(nsdata) < 0)
+return -1;
+
+if (networkDnsmasqDefNamespaceParseOptions(nsdata, ctxt))
+goto cleanup;
+
+if (nsdata->noptions > 0)
+VIR_STEAL_PTR(*data, nsdata);
+
+ret = 0;
+
+ cleanup:
+networkDnsmasqDefNamespaceFree(nsdata);
+return ret;
+}
+
+
+static int
+networkDnsmasqDefNamespaceFormatXML(virBufferPtr buf,
+void *nsdata)
+{
+networkDnsmasqXmlNsDefPtr def = nsdata;
+size_t i;
+
+if (!def->noptions)
+return 0;
+
+virBufferAddLit(buf, "\n");
+virBufferAdjustIndent(buf, 2);
+
+for (i = 0; i < def->noptions; i++) {
+virBufferEscapeString(buf, "\n",
+  def->options[i]);
+}
+
+virBufferAdjustIndent(buf, -2);
+virBufferAddLit(buf, "\n");
+
+return 0;
+}
+
+
+static const char *
+networkDnsmasqDefNamespaceHref(void)
+{
+return "xmlns:dnsmasq='" DNSMASQ_NAMESPACE_HREF "'";
+}
+
+
+virNetworkXMLNamespace networkDnsmasqXMLNamespace = {
+.parse = networkDnsmasqDefNamespaceParse,
+.free = networkDnsmasqDefNamespaceFree,
+.format = networkDnsmasqDefNamespaceFormatXML,
+.href = networkDnsmasqDefNamespaceHref,
+};
+
+
+virNetworkXMLOptionPtr
 networkDnsmasqCreateXMLConf(void)
 {
-return