Remove IPAdmin.get_dns_sorted_by_length

A simple sort(key=len) is simpler both implementation-wise and
semantics-wise.

Part of the work for: https://fedorahosted.org/freeipa/ticket/2660
This commit is contained in:
Petr Viktorin 2013-01-21 07:03:33 -05:00 committed by Martin Kosek
parent 607ff478f5
commit b69f6983e4
3 changed files with 12 additions and 54 deletions

View File

@ -299,12 +299,10 @@ def del_link(realm, replica1, replica2, dirman_passwd, force=False):
dn = DN(('cn', replica2), ('cn', 'replicas'), ('cn', 'ipa'), ('cn', 'etc'),
ipautil.realm_to_suffix(realm))
entries = repl1.conn.getList(dn, ldap.SCOPE_SUBTREE)
if len(entries) != 0:
dnset = repl1.conn.get_dns_sorted_by_length(entries,
reverse=True)
for dns in dnset:
for dn in dns:
repl1.conn.deleteEntry(dn)
if entries:
entries.sort(key=len, reverse=True)
for dn in entries:
repl1.conn.deleteEntry(dn)
except Exception, e:
print "Error deleting winsync replica shared info: %s" % convert_error(e)

View File

@ -1066,12 +1066,10 @@ class ReplicationManager(object):
filter='(krbprincipalname=*/%s@%s)' % (replica, realm)
entries = self.conn.getList(self.suffix, ldap.SCOPE_SUBTREE,
filterstr=filter)
if len(entries) != 0:
dnset = self.conn.get_dns_sorted_by_length(entries,
reverse=True)
for dns in dnset:
for dn in dns:
self.conn.deleteEntry(dn)
if entries:
entries.sort(key=len, reverse=True)
for dn in entries:
self.conn.deleteEntry(dn)
except errors.NotFound:
pass
except Exception, e:
@ -1109,12 +1107,10 @@ class ReplicationManager(object):
try:
dn = DN(('cn', replica), ('cn', 'masters'), ('cn', 'ipa'), ('cn', 'etc'), self.suffix)
entries = self.conn.getList(dn, ldap.SCOPE_SUBTREE)
if len(entries) != 0:
dnset = self.conn.get_dns_sorted_by_length(entries,
reverse=True)
for dns in dnset:
for dn in dns:
self.conn.deleteEntry(dn)
if entries:
entries.sort(key=len, reverse=True)
for dn in entries:
self.conn.deleteEntry(dn)
except errors.NotFound:
pass
except Exception, e:

View File

@ -1794,42 +1794,6 @@ class IPAdmin(LDAPConnection):
else: break
return (done, exitCode)
def get_dns_sorted_by_length(self, entries, reverse=False):
"""
Sorts a list of entries [(dn, entry_attrs)] based on their DN.
Entries within the same node are not sorted in any meaningful way.
If Reverse is set to True, leaf entries are returned first. This is
useful to perform recursive deletes where you need to delete entries
starting from the leafs and go up to delete nodes only when all its
leafs are removed.
Returns a list of list of dn's. Every dn in the dn list has
the same number of RDN's. The outer list is sorted according
to the number of RDN's in each inner list.
Example:
[['cn=bob', cn=tom], ['cn=bob,ou=people', cn=tom,ou=people]]
dn's in list[0] have 1 RDN
dn's in list[1] have 2 RDN's
"""
res = dict()
for e in entries:
dn = e.dn
assert isinstance(dn, DN)
rdn_count = len(dn)
rdn_count_list = res.setdefault(rdn_count, [])
if dn not in rdn_count_list:
rdn_count_list.append(dn)
keys = res.keys()
keys.sort(reverse=reverse)
return map(res.get, keys)
def __getattr__(self, attrname):
# This makes IPAdmin classes look like IPASimpleLDAPObjects
# FIXME: for backwards compatibility only