KCC: colour dot graph vertices as well as edges
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Fri, 27 Mar 2015 02:37:17 +0000 (15:37 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 29 May 2015 04:58:27 +0000 (06:58 +0200)
It's quicker to see who is RODC.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/graph_utils.py
source4/scripting/bin/samba_kcc

index 5d2bdaa9c4af07af3c033830ac725c4a53b356f1..9e97c62092ba6030baea59a25b74b689a6ef3119 100644 (file)
@@ -42,7 +42,7 @@ REV_RED = "\033[01;41m"
 
 def write_dot_file(basename, edge_list, vertices=None, label=None, destdir=None,
                    reformat_labels=True, directed=False, debug=None, edge_colors=None,
-                   edge_labels=None):
+                   edge_labels=None, vertex_colors=None):
     from tempfile import NamedTemporaryFile
     if label:
         basename += '_' + label.translate(None, ', ') #fix DN, guid labels
@@ -53,10 +53,11 @@ def write_dot_file(basename, edge_list, vertices=None, label=None, destdir=None,
     print >>f, '%s %s {' % ('digraph' if directed else 'graph', graphname)
     print >>f, 'label="%s";\nfontsize=20;' % (label or graphname)
     if vertices:
-        for v in vertices:
+        for i, v in enumerate(vertices):
             if reformat_labels:
                 v = v.replace(',', '\\n')
-            print >>f, '"%s";' % (v,)
+            vc = ('color="%s"' % vertex_colors[i]) if vertex_colors else ''
+            print >>f, '"%s" [%s];' % (v, vc)
 
     for i, edge in enumerate(edge_list):
         a, b = edge
@@ -302,7 +303,7 @@ def verify_graph(title, edges, vertices=None, directed=False, properties=(), fat
 def verify_and_dot(basename, edges, vertices=None, label=None, destdir=None,
                    reformat_labels=True, directed=False, properties=(), fatal=True,
                    debug=None, verify=True, dot_files=False, edge_colors=None,
-                   edge_labels=None):
+                   edge_labels=None, vertex_colors=None):
 
     title = '%s %s' % (basename, label or '')
     if verify:
@@ -311,7 +312,8 @@ def verify_and_dot(basename, edges, vertices=None, label=None, destdir=None,
     if dot_files:
         write_dot_file(basename, edges, vertices=vertices, label=label, destdir=destdir,
                        reformat_labels=reformat_labels, directed=directed, debug=debug,
-                       edge_colors=edge_colors, edge_labels=edge_labels)
+                       edge_colors=edge_colors, edge_labels=edge_labels,
+                       vertex_colors=vertex_colors)
 
 def list_verify_tests():
     for k, v in sorted(globals().items()):
index 29691c5f6965abdf1cdaf3f482301f71cae1c019..67ed1bc13049c1e95d3c4cfd1ccf86bfff8fdaf1 100755 (executable)
@@ -2441,21 +2441,27 @@ class KCC(object):
 
         dot_edges = []
         dot_vertices = []
-        colours = []
-        for site in self.site_table.values():
-            for dsa in site.dsa_table.values():
-                dot_vertices.append(dsa.dsa_dnstr)
-                for con in dsa.connect_table.values():
-                    if con.is_rodc_topology():
-                        colours.append('red')
-                    else:
-                        colours.append('blue')
-                    dot_edges.append((con.from_dnstr, dsa.dsa_dnstr))
+        edge_colours = []
+        vertex_colours = []
+
+        for dsa in self.dsa_by_dnstr.values():
+            dot_vertices.append(dsa.dsa_dnstr)
+            if dsa.is_ro():
+                vertex_colours.append('#cc0000')
+            else:
+                vertex_colours.append('#0000cc')
+            for con in dsa.connect_table.values():
+                if con.is_rodc_topology():
+                    edge_colours.append('red')
+                else:
+                    edge_colours.append('blue')
+                dot_edges.append((con.from_dnstr, dsa.dsa_dnstr))
 
         verify_and_dot(basename, dot_edges, vertices=dot_vertices,
                        label=self.my_dsa_dnstr, properties=verify_properties,
                        debug=DEBUG, verify=verify, dot_files=plot,
-                       directed=True, edge_colors=colours)
+                       directed=True, edge_colors=edge_colours,
+                       vertex_colors=vertex_colours)
 
 
     def run(self, dburl, lp, creds, forced_local_dsa=None,
@@ -2942,6 +2948,7 @@ def test_all_reps_from(lp, creds):
     dot_edges = []
     dot_vertices = []
     colours = []
+    vertex_colours = []
 
     for dsa in dsas:
         kcc = KCC()
@@ -2962,6 +2969,10 @@ def test_all_reps_from(lp, creds):
 
         for site in kcc.site_table.values():
             for dsa in site.dsa_table.values():
+                if dsa.is_ro():
+                    vertex_colours.append('#cc0000')
+                else:
+                    vertex_colours.append('#0000cc')
                 dot_vertices.append(dsa.dsa_dnstr)
                 for con in dsa.connect_table.values():
                     if con.is_rodc_topology():
@@ -2970,16 +2981,17 @@ def test_all_reps_from(lp, creds):
                         colours.append('blue')
                     dot_edges.append((con.from_dnstr, dsa.dsa_dnstr))
 
+    verify_and_dot('all-dsa-connections', dot_edges, vertices=dot_vertices,
+                   label="all dsa NTDSConnections", properties=(),
+                   debug=DEBUG, verify=opts.verify, dot_files=opts.dot_files,
+                   directed=True, edge_colors=colours, vertex_colors=vertex_colours)
+
     for name, rep_parts in (('needed', needed_parts), ('current', current_parts)):
         for part, edges in rep_parts.items():
             verify_and_dot('repsFrom_%s_all_%s' % (name, part), edges, directed=True, label=part,
                            properties=(), debug=DEBUG, verify=opts.verify,
                            dot_files=opts.dot_files)
 
-    verify_and_dot('all-dsa-connections', dot_edges, vertices=dot_vertices,
-                   label="all dsa NTDSConnections", properties=(),
-                   debug=DEBUG, verify=opts.verify, dot_files=opts.dot_files,
-                   directed=True, edge_colors=colours)
 
 
 logger = logging.getLogger("samba_kcc")