"""
self.part_table = {} # partition objects
self.site_table = {}
- self.transport_table = {}
self.ip_transport = None
self.sitelink_table = {}
self.dsa_by_dnstr = {}
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
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':
# 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:
"""
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():
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):
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")
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():
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:
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
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