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 15845502b8c7b1d89a6c7d1e6ef3d9e52b7c8375 Mon Sep 17 00:00:00 2001 From: Christian Heimes <[email protected]> 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 <[email protected]> --- freeipa.spec.in | 3 +- ipapython/dnssec/odsmgr.py | 38 +++++++++++++--------- ipatests/.cache/v/cache/lastfailed | 1 + ipatests/test_ipapython/test_dnssec.py | 58 ++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 ipatests/.cache/v/cache/lastfailed 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/.cache/v/cache/lastfailed b/ipatests/.cache/v/cache/lastfailed new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/ipatests/.cache/v/cache/lastfailed @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/ipatests/test_ipapython/test_dnssec.py b/ipatests/test_ipapython/test_dnssec.py new file mode 100644 index 0000000..1904e84 --- /dev/null +++ b/ipatests/test_ipapython/test_dnssec.py @@ -0,0 +1,58 @@ +# encoding: utf-8 + +# Authors: +# Christian Heimes <[email protected]> +# +# 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
