URL: https://github.com/freeipa/freeipa/pull/241
Author: tiran
 Title: #241: Port ipapython.dnssec.odsmgr to xml.etree
Action: opened

PR body:
"""
The module ipapython.dnssec.odsmgr is the only module in ipalib,
ipaclient, ipapython and ipaplatform that uses lxml.etree.

https://fedorahosted.org/freeipa/ticket/6469

Signed-off-by: Christian Heimes <chei...@redhat.com>
"""

To pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/241/head:pr241
git checkout pr241
From 973b700f120d4e9e24e6bfec2c974caa2d3dc914 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Tue, 15 Nov 2016 12:57:13 +0100
Subject: [PATCH] Port ipapython.dnssec.odsmgr to xml.etree

The module ipapython.dnssec.odsmgr is the only module in ipalib,
ipaclient, ipapython and ipaplatform that uses lxml.etree.

https://fedorahosted.org/freeipa/ticket/6469

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 freeipa.spec.in                        |  3 +-
 ipapython/dnssec/odsmgr.py             | 38 ++++++++++++++---------
 ipatests/test_ipapython/test_dnssec.py | 56 ++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 17 deletions(-)
 create mode 100644 ipatests/test_ipapython/test_dnssec.py

diff --git a/freeipa.spec.in b/freeipa.spec.in
index 7dbbf87..c7aeb52 100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -248,6 +248,7 @@ Requires: %{name}-server-common = %{version}-%{release}
 Requires: %{name}-common = %{version}-%{release}
 Requires: python2-ipaclient = %{version}-%{release}
 Requires: python-ldap >= 2.4.15
+Requires: python-lxml
 Requires: python-gssapi >= 1.1.2
 Requires: python-sssdconfig
 Requires: python-pyasn1
@@ -509,7 +510,6 @@ Requires: keyutils
 Requires: pyOpenSSL
 Requires: python-nss >= 0.16
 Requires: python-cryptography >= 0.9
-Requires: python-lxml
 Requires: python-netaddr
 Requires: python-libipa_hbac
 Requires: python-qrcode-core >= 5.0.0
@@ -559,7 +559,6 @@ Requires: keyutils
 Requires: python3-pyOpenSSL
 Requires: python3-nss >= 0.16
 Requires: python3-cryptography
-Requires: python3-lxml
 Requires: python3-netaddr
 Requires: python3-libipa_hbac
 Requires: python3-qrcode-core >= 5.0.0
diff --git a/ipapython/dnssec/odsmgr.py b/ipapython/dnssec/odsmgr.py
index fb6d696..0308408 100644
--- a/ipapython/dnssec/odsmgr.py
+++ b/ipapython/dnssec/odsmgr.py
@@ -3,8 +3,11 @@
 # Copyright (C) 2014  FreeIPA Contributors see COPYING for license
 #
 
-from lxml import etree
 import dns.name
+try:
+    from xml.etree import cElementTree as etree
+except ImportError:
+    from xml.etree import ElementTree as etree
 
 from ipapython import ipa_log_manager, ipautil
 
@@ -59,13 +62,15 @@ class ODSZoneListReader(ZoneListReader):
     """One-shot parser for ODS zonelist.xml."""
     def __init__(self, zonelist_text):
         super(ODSZoneListReader, self).__init__()
-        xml = etree.fromstring(zonelist_text)
-        self._parse_zonelist(xml)
+        root = etree.fromstring(zonelist_text)
+        self._parse_zonelist(root)
 
-    def _parse_zonelist(self, xml):
+    def _parse_zonelist(self, root):
         """iterate over Zone elements with attribute 'name' and
         add IPA zones to self.zones"""
-        for zone_xml in xml.xpath('/ZoneList/Zone[@name]'):
+        if not root.tag == 'ZoneList':
+            raise ValueError(root.tag)
+        for zone_xml in root.findall('./Zone[@name]'):
             name, zid = self._parse_ipa_zone(zone_xml)
             self._add_zone(name, zid)
 
@@ -79,16 +84,19 @@ def _parse_ipa_zone(self, zone_xml):
             tuple (zone name, ID)
         """
         name = zone_xml.get('name')
-        in_adapters = zone_xml.xpath(
-            'Adapters/Input/Adapter[@type="File" '
-            'and starts-with(text(), "%s")]' % ENTRYUUID_PREFIX)
-        assert len(in_adapters) == 1, 'only IPA zones are supported: %s' \
-            % etree.tostring(zone_xml)
-
-        path = in_adapters[0].text
-        # strip prefix from path
-        zid = path[ENTRYUUID_PREFIX_LEN:]
-        return (name, zid)
+        zids = []
+        for in_adapter in zone_xml.findall(
+                './Adapters/Input/Adapter[@type="File"]'):
+            path = in_adapter.text
+            if path.startswith(ENTRYUUID_PREFIX):
+                # strip prefix from path
+                zids.append(path[ENTRYUUID_PREFIX_LEN:])
+
+        if len(zids) != 1:
+            raise ValueError('only IPA zones are supported: {}'.format(
+                etree.tostring(zone_xml)))
+
+        return name, zids[0]
 
 
 class LDAPZoneListReader(ZoneListReader):
diff --git a/ipatests/test_ipapython/test_dnssec.py b/ipatests/test_ipapython/test_dnssec.py
new file mode 100644
index 0000000..d28a760
--- /dev/null
+++ b/ipatests/test_ipapython/test_dnssec.py
@@ -0,0 +1,56 @@
+# encoding: utf-8
+
+# Authors:
+#   Christian Heimes <chei...@redhat.com>
+#
+# Copyright (C) 2016  Red Hat
+# see file 'COPYING' for use and warranty information
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+Test the `ipapython/dnssec` package.
+"""
+import dns.name
+
+from ipapython.dnssec.odsmgr import ODSZoneListReader
+
+ZONELIST_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<ZoneList>
+  <Zone name="ipa.example">
+    <Policy>default</Policy>
+    <Adapters>
+      <Input>
+        <Adapter type="File">/var/lib/ipa/dns/zone/entryUUID/12345</Adapter>
+      </Input>
+      <Output>
+        <Adapter type="File">/var/lib/ipa/dns/zone/entryUUID/12345</Adapter>
+      </Output>
+    </Adapters>
+  </Zone>
+</ZoneList>
+"""
+
+def test_ods_zonelist_reader():
+    uuid = '12345'
+    name = dns.name.from_text('ipa.example.')
+
+    reader = ODSZoneListReader("<ZoneList/>")
+    assert reader.mapping == {}
+    assert reader.names == set()
+    assert reader.uuids == set()
+
+    reader = ODSZoneListReader(ZONELIST_XML)
+    assert reader.mapping == {uuid: name}
+    assert reader.names == {name}
+    assert reader.uuids == {uuid}
-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to