Hi,

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

Tomas
>From 9fb51e0167fe99186d5404490770ed5b8f3cfe2b Mon Sep 17 00:00:00 2001
From: Tomas Babej <tba...@redhat.com>
Date: Mon, 8 Apr 2013 14:09:16 +0200
Subject: [PATCH] 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
---
 install/tools/ipa-replica-manage                    | 15 ++++++++++++---
 ipaserver/install/plugins/fix_replica_agreements.py | 15 ++++++++++++---
 ipaserver/install/replication.py                    |  9 ++-------
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/install/tools/ipa-replica-manage b/install/tools/ipa-replica-manage
index 636529caaeca222c09d94d3e5539002fcd3139a9..b6261f0c5b34ba26da705d051b600c3e43ed1f44 100755
--- a/install/tools/ipa-replica-manage
+++ b/install/tools/ipa-replica-manage
@@ -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
diff --git a/ipaserver/install/plugins/fix_replica_agreements.py b/ipaserver/install/plugins/fix_replica_agreements.py
index 472e50217e36152ee04133b11db19ee435efd4ba..7ad5081742eb28d41be9f7f0b7700ef27abcf96b 100644
--- a/ipaserver/install/plugins/fix_replica_agreements.py
+++ b/ipaserver/install/plugins/fix_replica_agreements.py
@@ -44,20 +44,29 @@ 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:
+
+        replicas = repl.find_replication_agreements()
+        ipa_replicas = repl.find_ipa_replication_agreements()
+
+        self.log.debug("Found %d agreement(s)", len(replicas))
+
+        for replica in replicas:
             self.log.debug(replica.single_value('description', None))
 
             self._update_attr(repl, replica,
                 'nsDS5ReplicatedAttributeList',
                 replication.EXCLUDES, template=EXCLUDE_TEMPLATE)
+
+        for replica in ipa_replicas:
+            self.log.debug(replica.single_value('description', None))
+
             self._update_attr(repl, replica,
                 'nsDS5ReplicatedAttributeListTotal',
                 replication.TOTAL_EXCLUDES, template=EXCLUDE_TEMPLATE)
             self._update_attr(repl, replica,
                 'nsds5ReplicaStripAttrs', replication.STRIP_ATTRS)
 
+
         self.log.debug("Done updating agreements")
 
         return (False, False, [])  # No restart, no apply now, no updates
diff --git a/ipaserver/install/replication.py b/ipaserver/install/replication.py
index c1ca0aaa6e8217d66b3b5044b0103c755df6bfe5..adb26a83628c7a3a15412432407c03d4f825bc07 100644
--- a/ipaserver/install/replication.py
+++ b/ipaserver/install/replication.py
@@ -306,20 +306,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):
         """
-- 
1.8.1.4

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to