summaryrefslogtreecommitdiffstats
path: root/ipalib/util.py
diff options
context:
space:
mode:
authorPetr Vobornik <pvoborni@redhat.com>2015-06-17 13:33:24 +0200
committerPetr Vobornik <pvoborni@redhat.com>2015-06-29 17:11:08 +0200
commit659b88b8205ef403aa9162453472e4731d93d13b (patch)
tree0ce64c9147f4f29fcb6c641fdd6ec933dc67f759 /ipalib/util.py
parentdcb6916a3b0601e33b08e12aeb25357efed6812b (diff)
downloadfreeipa-659b88b8205ef403aa9162453472e4731d93d13b.tar.gz
freeipa-659b88b8205ef403aa9162453472e4731d93d13b.tar.xz
freeipa-659b88b8205ef403aa9162453472e4731d93d13b.zip
topology: check topology in ipa-replica-manage del
ipa-replica-manage del now: - checks the whole current topology(before deletion), reports issues - simulates deletion of server and checks the topology again, reports issues Asks admin if he wants to continue with the deletion if any errors are found. https://fedorahosted.org/freeipa/ticket/4302 Reviewed-By: David Kupka <dkupka@redhat.com>
Diffstat (limited to 'ipalib/util.py')
-rw-r--r--ipalib/util.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/ipalib/util.py b/ipalib/util.py
index 44478a2d1..75797229b 100644
--- a/ipalib/util.py
+++ b/ipalib/util.py
@@ -42,6 +42,7 @@ from ipalib.text import _
from ipapython.ssh import SSHPublicKey
from ipapython.dn import DN, RDN
from ipapython.dnsutil import DNSName
+from ipapython.graph import Graph
def json_serialize(obj):
@@ -780,3 +781,53 @@ def validate_idna_domain(value):
if error:
raise ValueError(error)
+
+
+def create_topology_graph(masters, segments):
+ """
+ Create an oriented graph from topology defined by masters and segments.
+
+ :param masters
+ :param segments
+ :returns: Graph
+ """
+ graph = Graph()
+
+ for m in masters:
+ graph.add_vertex(m['cn'][0])
+
+ for s in segments:
+ direction = s['iparepltoposegmentdirection'][0]
+ left = s['iparepltoposegmentleftnode'][0]
+ right = s['iparepltoposegmentrightnode'][0]
+ try:
+ if direction == u'both':
+ graph.add_edge(left, right)
+ graph.add_edge(right, left)
+ elif direction == u'left-right':
+ graph.add_edge(left, right)
+ elif direction == u'right-left':
+ graph.add_edge(right, left)
+ except ValueError: # ignore segments with deleted master
+ pass
+
+ return graph
+
+
+def get_topology_connection_errors(graph):
+ """
+ Traverse graph from each master and find out which masters are not
+ reachable.
+
+ :param graph: topology graph where vertices are masters
+ :returns: list of errors, error is: (master, visited, not_visited)
+ """
+ connect_errors = []
+ master_cns = list(graph.vertices)
+ master_cns.sort()
+ for m in master_cns:
+ visited = graph.bfs(m)
+ not_visited = graph.vertices - visited
+ if not_visited:
+ connect_errors.append((m, list(visited), list(not_visited)))
+ return connect_errors