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

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 d22d1017657020582d30018b67887f3df8fb82fd 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 | 41 ++++++++++++++++++++++++++++++++++
 3 files changed, 65 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..c4b830e
--- /dev/null
+++ b/ipatests/test_ipapython/test_dnssec.py
@@ -0,0 +1,41 @@
+#
+# Copyright (C) 2016  FreeIPA Contributors see COPYING for license
+#
+"""
+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