Update only selected attributes for winsync agreement

Trying to insert nsDS5ReplicatedAttributeListTotal and
nsds5ReplicaStripAttrs to winsync agreements caused upgrade errors.
With this patch, these attributes are skipped for winsync agreements.

Made find_ipa_replication_agreements() in replication.py more
corresponding to find_replication_agreements. It returns list of
entries instead of unicode strings now.

https://fedorahosted.org/freeipa/ticket/3522
This commit is contained in:
Tomas Babej 2013-04-08 14:09:16 +02:00 committed by Rob Crittenden
parent a730b6e7b5
commit fe3ba33d26
5 changed files with 33 additions and 17 deletions

View File

@ -262,7 +262,9 @@ def del_master(realm, hostname, options):
# server not up, just remove it from this server
replica_names = [options.host]
else:
replica_names = delrepl.find_ipa_replication_agreements()
replica_entries = delrepl.find_ipa_replication_agreements()
replica_names = [rep.single_value('nsds5replicahost', None)
for rep in replica_entries]
# 5. Remove each agreement
for r in replica_names:

View File

@ -518,7 +518,10 @@ def check_last_link(delrepl, realm, dirman_passwd, force):
returns: hostname of orphaned server or None
"""
replica_names = delrepl.find_ipa_replication_agreements()
replica_entries = delrepl.find_ipa_replication_agreements()
replica_names = [rep.single_value('nsds5replicahost', None)
for rep in replica_entries]
orphaned = []
# Connect to each remote server and see what agreements it has
@ -531,7 +534,11 @@ def check_last_link(delrepl, realm, dirman_passwd, force):
if not force and not ipautil.user_input("Continue to delete?", False):
sys.exit("Aborted")
continue
names = repl.find_ipa_replication_agreements()
entries = repl.find_ipa_replication_agreements()
names = [rep.single_value('nsds5replicahost', None)
for rep in entries]
if len(names) == 1 and names[0] == delrepl.hostname:
orphaned.append(replica)
@ -611,7 +618,9 @@ def del_master(realm, hostname, options):
pass
else:
# Get list of agreements.
replica_names = delrepl.find_ipa_replication_agreements()
replica_entries = delrepl.find_ipa_replication_agreements()
replica_names = [rep.single_value('nsds5replicahost', None)
for rep in replica_entries]
else:
# WINSYNC replica, delete agreement from current host
winsync = True

View File

@ -373,7 +373,10 @@ class Restore(admintool.AdminTool):
services_cns = [s.single_value('cn') for s in services]
hosts = repl.find_ipa_replication_agreements()
host_entries = repl.find_ipa_replication_agreements()
hosts = [rep.single_value('nsds5replicahost', None)
for rep in host_entries]
for host in hosts:
self.log.info('Disabling replication agreement on %s to %s' % (master, host))
repl.disable_agreement(host)
@ -385,7 +388,9 @@ class Restore(admintool.AdminTool):
except Exception, e:
self.log.critical("Unable to disable agreement on %s: %s" % (master, e))
hosts = repl.find_ipa_replication_agreements()
host_entries = repl.find_ipa_replication_agreements()
hosts = [rep.single_value('nsds5replicahost', None)
for rep in host_entries]
for host in hosts:
self.log.info('Disabling CA replication agreement on %s to %s' % (master, host))
repl.hostnames = [master, host]

View File

@ -34,7 +34,8 @@ class update_replica_attribute_lists(PreUpdate):
has all the required attributes so that we don't cause replication
storms.
"""
order=MIDDLE
order = MIDDLE
def execute(self, **options):
# We need an IPAdmin connection to the backend
@ -44,9 +45,13 @@ class update_replica_attribute_lists(PreUpdate):
repl = replication.ReplicationManager(api.env.realm, api.env.host,
None, conn=conn)
entries = repl.find_replication_agreements()
self.log.debug("Found %d agreement(s)", len(entries))
for replica in entries:
# We need to update only IPA replica agreements, not winsync
ipa_replicas = repl.find_ipa_replication_agreements()
self.log.debug("Found %d agreement(s)", len(ipa_replicas))
for replica in ipa_replicas:
self.log.debug(replica.single_value('description', None))
self._update_attr(repl, replica,

View File

@ -307,20 +307,15 @@ class ReplicationManager(object):
Return the list of hosts we have replication agreements.
"""
res = []
filt = self.get_agreement_filter(IPA_REPLICA)
try:
ents = self.conn.get_entries(
DN(('cn', 'mapping tree'), ('cn', 'config')),
ldap.SCOPE_SUBTREE, filt)
except errors.NotFound:
return res
ents = []
for ent in ents:
res.append(ent.single_value('nsds5replicahost', None))
return res
return ents
def get_replication_agreement(self, hostname):
"""