URL: https://github.com/freeipa/freeipa/pull/5313
Author: fcami
 Title: #5313: Gracefully handle Nsds5replicalastupdateend's absence
Action: opened

PR body:
"""
https://pagure.io/freeipa/issue/8605

    ipa-replica-manage: handle missing attributes
    If nsds5replicalastupdateend is not yet present,
    ipa-replica-manage will backtrace as it tries to retrieve that
    attribute unconditionally.
    Gracefully handle that situation.

    ipa-replica-manage: always display nsds5replicalastinitstatus
    If nsds5replicalastinitstatus is none, the status is not displayed.
    Always displaying the last init status is more useful to the end-user.

    ipalib/util.py: add print_replication_status

    ipa-csreplica-manage, ipa-replica-manage: refactor

"""

To pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/5313/head:pr5313
git checkout pr5313
From 97e013bd3febdf9b2b2e9a22564c0c7e86b58e34 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Cami?= <fc...@redhat.com>
Date: Tue, 1 Dec 2020 14:50:17 +0200
Subject: [PATCH 1/4] ipa-replica-manage: always display
 nsds5replicalastinitstatus
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

If nsds5replicalastinitstatus is none, the status is not displayed.
Always displaying the last init status is more useful to the end-user.

Related: https://pagure.io/freeipa/issue/8605
Signed-off-by: François Cami <fc...@redhat.com>
---
 install/tools/ipa-replica-manage.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/install/tools/ipa-replica-manage.in b/install/tools/ipa-replica-manage.in
index a29c550d204..1486ada4265 100644
--- a/install/tools/ipa-replica-manage.in
+++ b/install/tools/ipa-replica-manage.in
@@ -238,8 +238,8 @@ def list_replicas(realm, host, replica, dirman_passwd, verbose, nolookup=False):
 
         if verbose:
             initstatus = entry.single_value.get('nsds5replicalastinitstatus')
+            print("  last init status: %s" % initstatus)
             if initstatus is not None:
-                print("  last init status: %s" % initstatus)
                 print("  last init ended: %s" % str(
                     ipautil.parse_generalized_time(
                         entry.single_value['nsds5replicalastinitend'])))

From 7c985d146f6d5b53e09f3aee9f1c072ac0af0617 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Cami?= <fc...@redhat.com>
Date: Tue, 1 Dec 2020 15:00:24 +0200
Subject: [PATCH 2/4] ipa-replica-manage: handle missing attributes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

If nsds5replicalastupdateend is not yet present,
ipa-replica-manage will backtrace as it tries to retrieve that
attribute unconditionally.
Gracefully handle that situation.

Fixes: https://pagure.io/freeipa/issue/8605
Signed-off-by: François Cami <fc...@redhat.com>
---
 install/tools/ipa-replica-manage.in | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/install/tools/ipa-replica-manage.in b/install/tools/ipa-replica-manage.in
index 1486ada4265..2a77a404d83 100644
--- a/install/tools/ipa-replica-manage.in
+++ b/install/tools/ipa-replica-manage.in
@@ -242,12 +242,18 @@ def list_replicas(realm, host, replica, dirman_passwd, verbose, nolookup=False):
             if initstatus is not None:
                 print("  last init ended: %s" % str(
                     ipautil.parse_generalized_time(
-                        entry.single_value['nsds5replicalastinitend'])))
-            print("  last update status: %s" % entry.single_value.get(
-                'nsds5replicalastupdatestatus'))
-            print("  last update ended: %s" % str(
-                ipautil.parse_generalized_time(
-                    entry.single_value['nsds5replicalastupdateend'])))
+                        entry.single_value['nsds5replicalastinitend']))
+                    )
+            updatestatus = entry.single_value.get(
+                    'nsds5replicalastupdatestatus'
+            )
+            print("  last update status: %s" % updatestatus)
+            if updatestatus is not None:
+                print("  last update ended: %s" % str(
+                    ipautil.parse_generalized_time(
+                        entry.single_value['nsds5replicalastupdateend']
+                    ))
+                )
 
 
 def del_link(realm, replica1, replica2, dirman_passwd, force=False):

From bd9feafde9a335a715288728cac55d46a1d64ea9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Cami?= <fc...@redhat.com>
Date: Wed, 2 Dec 2020 12:12:11 +0100
Subject: [PATCH 3/4] ipalib/util.py: add print_replication_status
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: François Cami <fc...@redhat.com>
---
 ipalib/util.py | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/ipalib/util.py b/ipalib/util.py
index e3a510fc7a3..3791c1f0365 100644
--- a/ipalib/util.py
+++ b/ipalib/util.py
@@ -65,6 +65,7 @@
 from ipalib.text import _
 from ipaplatform.constants import constants
 from ipaplatform.paths import paths
+from ipapython import ipautil
 from ipapython.ssh import SSHPublicKey
 from ipapython.dn import DN, RDN
 from ipapython.dnsutil import (
@@ -1029,6 +1030,31 @@ def has_managed_topology(api):
     return domainlevel > DOMAIN_LEVEL_0
 
 
+def print_replication_status(entry, verbose, ent_type=None):
+    """Pretty print nsds5replicalastinitstatus, nsds5replicalastinitend,
+    nsds5replicalastupdatestatus, nsds5replicalastupdateend for a
+    replication agreement.
+    """
+
+    if verbose:
+        initstatus = entry.single_value.get('nsds5replicalastinitstatus')
+        print("  last init status: %s" % initstatus)
+        if initstatus is not None:
+            print("  last init ended: %s" % str(
+                ipautil.parse_generalized_time(
+                    entry.single_value['nsds5replicalastinitend'])))
+        updatestatus = entry.single_value.get(
+            'nsds5replicalastupdatestatus'
+        )
+        print("  last update status: %s" % updatestatus)
+        if updatestatus is not None:
+            print("  last update ended: %s" % str(
+                ipautil.parse_generalized_time(
+                    entry.single_value['nsds5replicalastupdateend']
+                ))
+            )
+
+
 class classproperty:
     __slots__ = ('__doc__', 'fget')
 

From 2a34c4854e60d8c73c678daa6afb69d3413a7750 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Cami?= <fc...@redhat.com>
Date: Wed, 2 Dec 2020 12:21:30 +0100
Subject: [PATCH 4/4] ipa-csreplica-manage, ipa-replica-manage: refactor
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Related: https://pagure.io/freeipa/issue/8605
Signed-off-by: François Cami <fc...@redhat.com>
---
 install/tools/ipa-csreplica-manage.in | 16 ++--------------
 install/tools/ipa-replica-manage.in   | 23 +++--------------------
 2 files changed, 5 insertions(+), 34 deletions(-)

diff --git a/install/tools/ipa-csreplica-manage.in b/install/tools/ipa-csreplica-manage.in
index 5faed5a8418..1d6178391fd 100644
--- a/install/tools/ipa-csreplica-manage.in
+++ b/install/tools/ipa-csreplica-manage.in
@@ -31,7 +31,7 @@ from ipaserver.install import (replication, installutils, bindinstance,
     cainstance)
 from ipalib import api, errors
 from ipalib.constants import FQDN
-from ipalib.util import has_managed_topology
+from ipalib.util import has_managed_topology, print_replication_status
 from ipapython import ipautil, ipaldap, version
 from ipapython.admintool import ScriptError
 from ipapython.dn import DN
@@ -133,19 +133,7 @@ def list_replicas(realm, host, replica, dirman_passwd, verbose):
 
     for entry in entries:
         print('%s' % entry.single_value.get('nsds5replicahost'))
-
-        if verbose:
-            initstatus = entry.single_value.get('nsds5replicalastinitstatus')
-            if initstatus is not None:
-                print("  last init status: %s" % initstatus)
-                print("  last init ended: %s" % str(
-                    ipautil.parse_generalized_time(
-                        entry.single_value['nsds5replicalastinitend'])))
-            print("  last update status: %s" % entry.single_value.get(
-                'nsds5replicalastupdatestatus'))
-            print("  last update ended: %s" % str(
-                ipautil.parse_generalized_time(
-                    entry.single_value['nsds5replicalastupdateend'])))
+        print_replication_status(entry, verbose)
 
 
 def del_link(realm, replica1, replica2, dirman_passwd, force=False):
diff --git a/install/tools/ipa-replica-manage.in b/install/tools/ipa-replica-manage.in
index 2a77a404d83..237927ee87c 100644
--- a/install/tools/ipa-replica-manage.in
+++ b/install/tools/ipa-replica-manage.in
@@ -39,7 +39,8 @@ from ipaserver.install import opendnssecinstance, dnskeysyncinstance
 from ipapython import version, ipaldap
 from ipalib import api, errors
 from ipalib.constants import FQDN
-from ipalib.util import has_managed_topology, verify_host_resolvable
+from ipalib.util import
+    has_managed_topology, print_replication_status, verify_host_resolvable
 from ipapython.ipa_log_manager import standard_logging_setup
 from ipapython.dn import DN
 from ipapython.config import IPAOptionParser
@@ -235,25 +236,7 @@ def list_replicas(realm, host, replica, dirman_passwd, verbose, nolookup=False):
 
     for entry in entries:
         print('%s: %s' % (entry.single_value.get('nsds5replicahost'), ent_type))
-
-        if verbose:
-            initstatus = entry.single_value.get('nsds5replicalastinitstatus')
-            print("  last init status: %s" % initstatus)
-            if initstatus is not None:
-                print("  last init ended: %s" % str(
-                    ipautil.parse_generalized_time(
-                        entry.single_value['nsds5replicalastinitend']))
-                    )
-            updatestatus = entry.single_value.get(
-                    'nsds5replicalastupdatestatus'
-            )
-            print("  last update status: %s" % updatestatus)
-            if updatestatus is not None:
-                print("  last update ended: %s" % str(
-                    ipautil.parse_generalized_time(
-                        entry.single_value['nsds5replicalastupdateend']
-                    ))
-                )
+        print_replication_status(entry, ent_type, verbose)
 
 
 def del_link(realm, replica1, replica2, dirman_passwd, force=False):
_______________________________________________
FreeIPA-devel mailing list -- freeipa-devel@lists.fedorahosted.org
To unsubscribe send an email to freeipa-devel-le...@lists.fedorahosted.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedorahosted.org/archives/list/freeipa-devel@lists.fedorahosted.org

Reply via email to