KCC: Don't pretend to "load_all_transports"
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Wed, 10 Jun 2015 05:12:51 +0000 (17:12 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 12 Jun 2015 04:57:15 +0000 (06:57 +0200)
Samba doesn't do SMTP, so nor does Samba KCC. Because we were
following the spec, we have had special cases for non-IP transports
in numerous places. This removes a few more of those.

The gains are a loss of complexity and the removal of untestable code.

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>
Conflicts:
python/samba/kcc/__init__.py

python/samba/kcc/__init__.py
python/samba/kcc/graph.py

index 90e1a6aa218e6761e47bc75b12805d866926cd42..a8450edf2e4edf2e100246078e855d4423979f5f 100644 (file)
@@ -108,7 +108,6 @@ class KCC(object):
         """
         self.part_table = {}    # partition objects
         self.site_table = {}
-        self.transport_table = {}
         self.ip_transport = None
         self.sitelink_table = {}
         self.dsa_by_dnstr = {}
@@ -143,7 +142,7 @@ class KCC(object):
         self.debug = debug
         self.dot_file_dir = dot_file_dir
 
-    def load_all_transports(self):
+    def load_ip_transport(self):
         """Loads the inter-site transport objects for Sites
 
         :return: None
@@ -164,8 +163,6 @@ class KCC(object):
             transport = Transport(dnstr)
 
             transport.load_transport(self.samdb)
-            self.transport_table.setdefault(str(transport.guid),
-                                            transport)
             if transport.name == 'IP':
                 self.ip_transport = transport
             elif transport.name == 'SMTP':
@@ -1072,8 +1069,9 @@ class KCC(object):
         # No documentation for this however, ntdsapi.h appears to have:
         # NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED = 0x00001000
         bridges_required = self.my_site.site_options & 0x00001002 == 0
+        transport_guid = str(self.ip_transport.guid)
 
-        g = setup_graph(part, self.site_table, self.transport_table,
+        g = setup_graph(part, self.site_table, transport_guid,
                         self.sitelink_table, bridges_required)
 
         if self.verify or self.dot_file_dir is not None:
@@ -1141,7 +1139,12 @@ class KCC(object):
         """
         bhs = []
 
-        DEBUG_FN("get_all_bridgeheads: %s" % transport.name)
+        if transport.name != "IP":
+            raise KCCError("get_all_bridgeheads has run into a "
+                           "non-IP transport! %r"
+                           % (transport.name,))
+
+        DEBUG_FN("get_all_bridgeheads")
         DEBUG_FN(site.rw_dsa_table)
         for dsa in site.rw_dsa_table.values():
 
@@ -1183,27 +1186,6 @@ class KCC(object):
                 if not dsa.is_minimum_behavior(dsdb.DS_DOMAIN_FUNCTION_2008):
                     continue
 
-            # IF t!name != "IP" and the parent object of dc has no value for
-            # the attribute specified by t!transportAddressAttribute
-            #     Skip dc
-            if transport.name != "IP":
-                # MS tech specification says we retrieve the named
-                # attribute in "transportAddressAttribute" from the parent
-                # of the DSA object
-                try:
-                    attrs = [transport.address_attr]
-
-                    res = self.samdb.search(base=pdnstr, scope=ldb.SCOPE_BASE,
-                                            attrs=attrs)
-                except ldb.LdbError, (enum, estr):
-                    continue
-
-                msg = res[0]
-                if transport.address_attr not in msg:
-                    continue
-                #XXX nastr is NEVER USED. It will be removed.
-                nastr = str(msg[transport.address_attr][0])
-
             # IF BridgeheadDCFailed(dc!objectGUID, detectFailedDCs) = TRUE
             #     Skip dc
             if self.is_bridgehead_failed(dsa, detect_failed):
@@ -1554,29 +1536,23 @@ class KCC(object):
         vertex.accept_red_red = []
         vertex.accept_black = []
         found_failed = False
-        for t_guid, transport in self.transport_table.items():
-            if transport.name != 'IP':
-                #XXX well this is cheating a bit
-                DEBUG_FN("ignoring a transport named %r" % transport.name)
-                continue
 
-            if vertex not in graph.connected_vertices:
-                continue
+        if vertex in graph.connected_vertices:
+            t_guid = str(self.ip_transport.guid)
 
-            partial_replica_okay = vertex.is_black()
-            bh = self.get_bridgehead(vertex.site, vertex.part, transport,
-                                     partial_replica_okay, detect_failed)
+            bh = self.get_bridgehead(vertex.site, vertex.part,
+                                     self.ip_transport,
+                                     vertex.is_black(), detect_failed)
             if bh is None:
                 if vertex.site.is_rodc_site():
                     vertex.accept_red_red.append(t_guid)
                 else:
                     found_failed = True
-                continue
-
-            vertex.accept_red_red.append(t_guid)
-            vertex.accept_black.append(t_guid)
+            else:
+                vertex.accept_red_red.append(t_guid)
+                vertex.accept_black.append(t_guid)
 
-        # Add additional transport to allow another run of Dijkstra
+        # Add additional transport to ensure another run of Dijkstra
         vertex.accept_red_red.append("EDGE_TYPE_ALL")
         vertex.accept_black.append("EDGE_TYPE_ALL")
 
@@ -2374,7 +2350,7 @@ class KCC(object):
 
         self.load_all_sites()
         self.load_all_partitions()
-        self.load_all_transports()
+        self.load_ip_transport()
         self.load_all_sitelinks()
         dsas = []
         for site in self.site_table.values():
@@ -2465,7 +2441,7 @@ class KCC(object):
 
             self.load_all_sites()
             self.load_all_partitions()
-            self.load_all_transports()
+            self.load_ip_transport()
             self.load_all_sitelinks()
 
             if self.verify or self.dot_file_dir is not None:
index e586b6022cf0a9035bb5d6b810828aa005985fd5..9b7a11541ba3de2bed93825f73fa4d8b890c9c7f 100644 (file)
@@ -507,7 +507,7 @@ def add_out_edge(graph, output_edges, e):
     v2.edges.append(ee)
 
 
-def setup_graph(part, site_table, transport_table, sitelink_table,
+def setup_graph(part, site_table, transport_guid, sitelink_table,
                 bridges_required):
     """Set up a GRAPH, populated with a VERTEX for each site
     object, a MULTIEDGE for each siteLink object, and a
@@ -529,30 +529,25 @@ def setup_graph(part, site_table, transport_table, sitelink_table,
         guid_vertices.append(vertex)
 
     connected_vertices = set()
-    for transport_guid, transport in transport_table.items():
-        # Currently only ever "IP"
-        if transport.name != 'IP':
-            DEBUG_FN("setup_graph is ignoring transport %s" %
-                     transport.name)
-            continue
-        for site_link_dn, site_link in sitelink_table.items():
-            new_edge = create_edge(transport_guid, site_link,
-                                   guid_to_vertex)
-            connected_vertices.update(new_edge.vertices)
-            g.edges.add(new_edge)
-
-        # If 'Bridge all site links' is enabled and Win2k3 bridges required
-        # is not set
-        # NTDSTRANSPORT_OPT_BRIDGES_REQUIRED 0x00000002
-        # No documentation for this however, ntdsapi.h appears to have:
-        # NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED = 0x00001000
-        if bridges_required:
-            g.edge_set.add(create_auto_edge_set(g, transport_guid))
-        else:
-            # TODO get all site link bridges
-            for site_link_bridge in []:
-                g.edge_set.add(create_edge_set(g, transport_guid,
-                                               site_link_bridge))
+
+    for site_link_dn, site_link in sitelink_table.items():
+        new_edge = create_edge(transport_guid, site_link,
+                               guid_to_vertex)
+        connected_vertices.update(new_edge.vertices)
+        g.edges.add(new_edge)
+
+    # If 'Bridge all site links' is enabled and Win2k3 bridges required
+    # is not set
+    # NTDSTRANSPORT_OPT_BRIDGES_REQUIRED 0x00000002
+    # No documentation for this however, ntdsapi.h appears to have:
+    # NTDSSETTINGS_OPT_W2K3_BRIDGES_REQUIRED = 0x00001000
+    if bridges_required:
+        g.edge_set.add(create_auto_edge_set(g, transport_guid))
+    else:
+        # TODO get all site link bridges
+        for site_link_bridge in []:
+            g.edge_set.add(create_edge_set(g, transport_guid,
+                                           site_link_bridge))
 
     g.connected_vertices = connected_vertices