def expand(G_in): """ Expands out graph products. G is the source "backbone" graph. H_x is the "PoP template" graphs """ graph_unwrapped = ank_utils.unwrap_graph(G_in) G = graph_unwrapped.copy() ank.set_node_default(G_in, G_in) template_names = set(node.pop_template for node in G_in) template_names.discard("None") template_names.discard(None) if not len(template_names): log.debug("No PoP templates set") return # no templates set # Load these templates templates = {} for template in template_names: template_filename = os.path.join("pop_templates", "%s.graphml" % template) try: pop_graph = autonetkit.load.graphml.load_graphml( template_filename ) #TODO: pass in properties eg edge type = physical except Exception, e: log.warning("Unable to load pop template %s: %s" % (template, e)) return pop_graph = pop_graph.to_undirected( ) # Undirected for now TODO: document this templates[template] = pop_graph
def expand(G_in): """ Expands out graph products. G is the source "backbone" graph. H_x is the "PoP template" graphs """ graph_unwrapped = ank_utils.unwrap_graph(G_in) G = graph_unwrapped.copy() ank.set_node_default(G_in, G_in) template_names = set(node.pop_template for node in G_in) template_names.discard("None") template_names.discard(None) if not len(template_names): log.debug("No PoP templates set") return # no templates set # Load these templates templates = {} for template in template_names: template_filename = os.path.join("pop_templates", "%s.graphml" % template) try: pop_graph = autonetkit.load.graphml.load_graphml(template_filename) #TODO: pass in properties eg edge type = physical except Exception, e: log.warning("Unable to load pop template %s: %s" % (template, e)) return pop_graph = pop_graph.to_undirected() # Undirected for now TODO: document this templates[template] = pop_graph
def apply_design_rules(anm): """Applies appropriate design rules to ANM""" g_in = anm['input'] build_phy(anm) g_phy = anm['phy'] from autonetkit.design.osi_layers import (build_layer2, build_layer2_broadcast, build_layer3) build_layer2(anm) build_layer2_broadcast(anm) build_layer3(anm) build_l3_connectivity(anm) check_server_asns(anm) from autonetkit.design.mpls import build_vrf build_vrf(anm) # do before to add loopbacks before ip allocations from autonetkit.design.ip import build_ip, build_ipv4, build_ipv6 # TODO: replace this with layer2 overlay topology creation build_ip(anm) # ip infrastructure topology address_family = g_in.data.address_family or "v4" # default is v4 # TODO: can remove the infrastructure now create g_ip seperately if address_family == "None": log.info("IP addressing disabled, disabling routing protocol ", "configuration") anm['phy'].data.enable_routing = False if address_family == "None": log.info("IP addressing disabled, skipping IPv4") anm.add_overlay("ipv4") # create empty so rest of code follows g_phy.update(g_phy, use_ipv4=False) elif address_family in ("v4", "dual_stack"): build_ipv4(anm, infrastructure=True) g_phy.update(g_phy, use_ipv4=True) elif address_family == "v6": # Allocate v4 loopbacks for router ids build_ipv4(anm, infrastructure=False) g_phy.update(g_phy, use_ipv4=False) # TODO: Create collision domain overlay for ip addressing - l2 overlay? if address_family == "None": log.info("IP addressing disabled, not allocating IPv6") anm.add_overlay("ipv6") # create empty so rest of code follows g_phy.update(g_phy, use_ipv6=False) elif address_family in ("v6", "dual_stack"): build_ipv6(anm) g_phy.update(g_phy, use_ipv6=True) else: anm.add_overlay("ipv6") # placeholder for compiler logic default_igp = g_in.data.igp or "ospf" ank_utils.set_node_default(g_in, igp=default_igp) ank_utils.copy_attr_from(g_in, g_phy, "include_csr") try: from autonetkit_cisco import build_network as cisco_build_network except ImportError, e: log.debug("Unable to load autonetkit_cisco %s" % e)
def expand(G_in): """ Expands out graph products. G is the source "backbone" graph. H_x is the "PoP template" graphs """ graph_unwrapped = ank_utils.unwrap_graph(G_in) G = graph_unwrapped.copy() ank.set_node_default(G_in, G_in) template_names = set(node.pop_template for node in G_in) template_names.remove(None) if not len(template_names): return # no templates set # Load these templates templates = {} for template in template_names: print "TEMplate is", template template_filename = os.path.join("pop_templates", "%s.graphml" % template) pop_graph = ank.load_graphml(template_filename) #TODO: pass in properties eg edge type = physical pop_graph = pop_graph.to_undirected() # Undirected for now TODO: document this templates[template] = pop_graph # construct new graph G_out = nx.Graph() #TODO: what about bidirectional graphs? G_out.add_nodes_from(expand_nodes(G, templates)) G_out.add_edges_from(intra_pop_links(G, templates)) G_out.add_edges_from(inter_pop_links(G, templates)) for s, t in G_out.edges(): G_out[s][t]['type'] = 'physical' # ensure copied across # Update properties based on co-ordinates for node in G_out: u, v = node template = G.node[u]['pop_template'] u_properties = dict(G.node[u]) v_properties = dict(templates[template].node[v]) # create copy to append with x = float(u_properties.get('x')) + float(v_properties.get('x')) y = float(u_properties.get('y')) + float(v_properties.get('y')) asn = u_properties['asn'] u_properties.update(v_properties) u_properties['x'] = x u_properties['y'] = y u_properties['label'] = "%s_%s" % (v, u) u_properties['id'] = "%s_%s" % (v, u) u_properties['pop'] = u u_properties['asn'] = asn # restore, don't inherit from pop del u_properties['pop_template'] G_out.node[node] = u_properties nx.relabel_nodes(G_out, dict( ((u, v), "%s_%s" % (v, u)) for (u, v) in G_out), copy = False) #TODO: set edge_ids for s, t in G_out.edges(): G_out[s][t]['edge_id'] = "%s_%s" % (s, t) G_in._replace_graph(G_out) return
def apply_design_rules(anm): """Applies appropriate design rules to ANM""" g_in = anm['input'] build_phy(anm) g_phy = anm['phy'] build_l3_connectivity(anm) check_server_asns(anm) from autonetkit.design.mpls import build_vrf build_vrf(anm) # need to do before to add loopbacks before ip allocations from autonetkit.design.ip import build_ip, build_ipv4, build_ipv6 #TODO: replace this with layer2 overlay topology creation build_ip(anm) # ip infrastructure topology #TODO: set defaults at the start, rather than inline, ie set g_in.data.address_family then use later address_family = g_in.data.address_family or "v4" # default is v4 #TODO: can remove the infrastructure now create g_ip seperately if address_family == "None": log.info( "IP addressing disabled, disabling routing protocol configuration") anm['phy'].data.enable_routing = False if address_family == "None": log.info("IP addressing disabled, skipping IPv4") anm.add_overlay("ipv4") # create empty so rest of code follows through g_phy.update(g_phy, use_ipv4=False) elif address_family in ("v4", "dual_stack"): build_ipv4(anm, infrastructure=True) g_phy.update(g_phy, use_ipv4=True) elif address_family == "v6": # Allocate v4 loopbacks for router ids build_ipv4(anm, infrastructure=False) g_phy.update(g_phy, use_ipv4=False) #TODO: Create a collision domain overlay for ip addressing - l2 overlay? if address_family == "None": log.info("IP addressing disabled, not allocating IPv6") anm.add_overlay("ipv6") # create empty so rest of code follows through g_phy.update(g_phy, use_ipv6=False) elif address_family in ("v6", "dual_stack"): build_ipv6(anm) g_phy.update(g_phy, use_ipv6=True) else: anm.add_overlay("ipv6") # placeholder for compiler logic default_igp = g_in.data.igp or "ospf" ank_utils.set_node_default(g_in, igp=default_igp) ank_utils.copy_attr_from(g_in, g_phy, "include_csr") try: from autonetkit_cisco import build_network as cisco_build_network except ImportError, e: log.debug("Unable to load autonetkit_cisco %s" % e)
def build_phy(anm): """Build physical overlay""" g_in = anm['input'] g_phy = anm['phy'] g_phy.data.enable_routing = g_in.data.enable_routing if g_phy.data.enable_routing is None: g_in.data.enable_routing = True # default if not set g_phy.add_nodes_from(g_in, retain=[ 'label', 'update', 'device_type', 'asn', 'specified_int_names', 'device_subtype', 'platform', 'host', 'syntax' ]) if g_in.data.Creator == "Topology Zoo Toolset": ank_utils.copy_attr_from(g_in, g_phy, "Network") ank_utils.set_node_default(g_phy, Network=None) g_phy.add_edges_from(g_in.edges(type="physical")) # TODO: make this automatic if adding to the physical graph? if g_in.data.Creator == "VIRL": g_phy.data.mgmt_interfaces_enabled = g_in.data.mgmt_interfaces_enabled # TODO: remove this code now allocated externally g_phy.data.mgmt_address_start = g_in.data.mgmt_address_start g_phy.data.mgmt_address_end = g_in.data.mgmt_address_end g_phy.data.mgmt_prefixlen = g_in.data.mgmt_prefixlen g_phy.data.mgmt_prefixlen = g_in.data.mgmt_prefixlen ank_utils.copy_attr_from(g_in, g_phy, "use_cdp") ank_utils.copy_attr_from(g_in, g_phy, "use_onepk") ank_utils.copy_attr_from(g_in, g_phy, "label_full") ank_utils.copy_attr_from(g_in, g_phy, "indices") ank_utils.copy_attr_from(g_in, g_phy, "dont_configure_static_routing") ank_utils.copy_attr_from(g_in, g_phy, "server_username") ank_utils.copy_attr_from(g_in, g_phy, "server_ssh_key") ank_utils.set_node_default(g_phy, use_ipv4=False, use_ipv6=False) ank_utils.copy_attr_from(g_in, g_phy, "custom_config_global", dst_attr="custom_config") for node in g_phy: if node['input'].custom_config_loopback_zero: lo_zero_config = node['input'].custom_config_loopback_zero node.loopback_zero.custom_config = lo_zero_config custom_config_phy_ints = node['input'].custom_config_phy_ints for interface in node: if custom_config_phy_ints: interface.custom_config = custom_config_phy_ints specified_id = interface['input'].get("specified_id") if specified_id: interface.specified_id = specified_id # map across remove_parallel_switch_links(anm)
def build_phy(anm): """Build physical overlay""" g_in = anm['input'] g_phy = anm['phy'] g_phy.data.enable_routing = g_in.data.enable_routing if g_phy.data.enable_routing is None: g_in.data.enable_routing = True # default if not set g_phy.add_nodes_from(g_in, retain=['label', 'update', 'device_type', 'asn', 'specified_int_names', 'device_subtype', 'platform', 'host', 'syntax']) if g_in.data.Creator == "Topology Zoo Toolset": ank_utils.copy_attr_from(g_in, g_phy, "Network") ank_utils.set_node_default(g_phy, Network=None) g_phy.add_edges_from(g_in.edges(type="physical")) # TODO: make this automatic if adding to the physical graph? if g_in.data.Creator == "VIRL": g_phy.data.mgmt_interfaces_enabled = g_in.data.mgmt_interfaces_enabled # TODO: remove this code now allocated externally g_phy.data.mgmt_address_start = g_in.data.mgmt_address_start g_phy.data.mgmt_address_end = g_in.data.mgmt_address_end g_phy.data.mgmt_prefixlen = g_in.data.mgmt_prefixlen g_phy.data.mgmt_prefixlen = g_in.data.mgmt_prefixlen ank_utils.copy_attr_from(g_in, g_phy, "use_cdp") ank_utils.copy_attr_from(g_in, g_phy, "use_onepk") ank_utils.copy_attr_from(g_in, g_phy, "label_full") ank_utils.copy_attr_from(g_in, g_phy, "indices") ank_utils.copy_attr_from(g_in, g_phy, "dont_configure_static_routing") ank_utils.copy_attr_from(g_in, g_phy, "server_username") ank_utils.copy_attr_from(g_in, g_phy, "server_ssh_key") ank_utils.set_node_default(g_phy, use_ipv4=False, use_ipv6=False) ank_utils.copy_attr_from(g_in, g_phy, "custom_config_global", dst_attr="custom_config") g_phy.allocate_interfaces() for node in g_phy: if node['input'].custom_config_loopback_zero: lo_zero_config = node['input'].custom_config_loopback_zero node.loopback_zero.custom_config = lo_zero_config custom_config_phy_ints = node['input'].custom_config_phy_ints for interface in node: if custom_config_phy_ints: interface.custom_config = custom_config_phy_ints specified_id = interface['input'].get("specified_id") if specified_id: interface.specified_id = specified_id # map across remove_parallel_switch_links(anm)
def build_phy(anm): """Build physical overlay""" g_in = anm['input'] g_phy = anm['phy'] g_phy.data.enable_routing = g_in.data.enable_routing if g_in.data.mgmt_block: g_phy.data['mgmt_block'] = g_in.data['mgmt_block'] if g_in.data.vpcid_block: g_phy.data['vpcid_block'] = g_in.data['vpcid_block'] if g_phy.data.enable_routing is None: g_in.data.enable_routing = True # default if not set g_phy.add_nodes_from(g_in, retain=['label', 'update', 'device_type', 'devsubtype', 'asn', 'specified_int_names', 'x', 'y', 'device_subtype', 'platform', 'host', 'syntax', 'profile', 'syslog']) if g_in.data.Creator == "Topology Zoo Toolset": ank_utils.copy_attr_from(g_in, g_phy, "Network") ank_utils.set_node_default(g_phy, Network=None) g_phy.add_edges_from(g_in.edges(type="physical")) # TODO: make this automatic if adding to the physical graph? ank_utils.set_node_default(g_phy, use_ipv4=False, use_ipv6=False) ank_utils.copy_attr_from(g_in, g_phy, "custom_config_global", dst_attr="custom_config") for node in g_phy: if node['input'].custom_config_loopback_zero: lo_zero_config = node['input'].custom_config_loopback_zero node.loopback_zero.custom_config = lo_zero_config custom_config_phy_ints = node['input'].custom_config_phy_ints for interface in node: if custom_config_phy_ints: interface.custom_config = custom_config_phy_ints specified_id = interface['input'].get("specified_id") if specified_id: interface.specified_id = specified_id # map across #TODO: tidy this code up for node in g_phy: for interface in node: remote_edges = interface.edges() if len(remote_edges): interface.description = 'to %s' \ % remote_edges[0].dst.label
def build_phy(anm): """Build physical overlay""" g_in = anm['input'] g_phy = anm['phy'] g_phy.data.enable_routing = g_in.data.enable_routing if g_phy.data.enable_routing is None: g_in.data.enable_routing = True # default if not set g_phy.add_nodes_from(g_in, retain=[ 'label', 'update', 'device_type', 'asn', 'specified_int_names', 'x', 'y', 'device_subtype', 'platform', 'host', 'syntax' ]) if g_in.data.Creator == "Topology Zoo Toolset": ank_utils.copy_attr_from(g_in, g_phy, "Network") ank_utils.set_node_default(g_phy, Network=None) g_phy.add_edges_from(g_in.edges(type="physical")) # TODO: make this automatic if adding to the physical graph? ank_utils.set_node_default(g_phy, use_ipv4=False, use_ipv6=False) ank_utils.copy_attr_from(g_in, g_phy, "custom_config_global", dst_attr="custom_config") for node in g_phy: if node['input'].custom_config_loopback_zero: lo_zero_config = node['input'].custom_config_loopback_zero node.loopback_zero.custom_config = lo_zero_config custom_config_phy_ints = node['input'].custom_config_phy_ints for interface in node: if custom_config_phy_ints: interface.custom_config = custom_config_phy_ints specified_id = interface['input'].get("specified_id") if specified_id: interface.specified_id = specified_id # map across #TODO: tidy this code up for node in g_phy: for interface in node: remote_edges = interface.edges() if len(remote_edges): interface.description = 'to %s' \ % remote_edges[0].dst.label
def build_phy(anm): """Build physical overlay""" g_in = anm['input'] g_phy = anm['phy'] g_phy.data.enable_routing = g_in.data.enable_routing if g_phy.data.enable_routing is None: g_in.data.enable_routing = True # default if not set g_phy.add_nodes_from(g_in, retain=['label', 'update', 'device_type', 'asn', 'specified_int_names', 'x', 'y', 'device_subtype', 'platform', 'host', 'syntax']) if g_in.data.Creator == "Topology Zoo Toolset": ank_utils.copy_attr_from(g_in, g_phy, "Network") ank_utils.set_node_default(g_phy, Network=None) g_phy.add_edges_from(g_in.edges(type="physical")) # TODO: make this automatic if adding to the physical graph? ank_utils.set_node_default(g_phy, use_ipv4=False, use_ipv6=False) ank_utils.copy_attr_from(g_in, g_phy, "custom_config_global", dst_attr="custom_config") for node in g_phy: if node['input'].custom_config_loopback_zero: lo_zero_config = node['input'].custom_config_loopback_zero node.loopback_zero.custom_config = lo_zero_config custom_config_phy_ints = node['input'].custom_config_phy_ints for interface in node: if custom_config_phy_ints: interface.custom_config = custom_config_phy_ints specified_id = interface['input'].get("specified_id") if specified_id: interface.specified_id = specified_id # map across remove_parallel_switch_links(anm)
def build_phy(anm): """Build physical overlay""" g_in = anm["input"] g_phy = anm["phy"] if g_in.data.enable_routing is not None: g_phy.data.enable_routing = g_in.data.enable_routing if g_in.data.mgmt_block: g_phy.data["mgmt_block"] = g_in.data["mgmt_block"] if g_in.data.ignite: g_phy.data["ignite"] = g_in.data["ignite"] if g_in.data.pc_only is not None: g_phy.data["pc_only"] = g_in.data["pc_only"] if g_in.data.vpcid_block: g_phy.data["vpcid_block"] = g_in.data["vpcid_block"] if g_in.data.vxlan_global_config: g_phy.data["vxlan_global_config"] = g_in.data["vxlan_global_config"] if g_phy.data.enable_routing is None: g_in.data.enable_routing = True # default if not set g_phy.add_nodes_from( g_in, retain=[ "name", "label", "update", "device_type", "devsubtype", "asn", "specified_int_names", "x", "y", "device_subtype", "platform", "host", "syntax", "profile", "syslog", "vpc-peer", "vxlan_vni_configured", ], ) if g_in.data.Creator == "Topology Zoo Toolset": ank_utils.copy_attr_from(g_in, g_phy, "Network") ank_utils.set_node_default(g_phy, Network=None) g_phy.add_edges_from(g_in.edges(type="physical"), retain=["link_type"]) # TODO: make this automatic if adding to the physical graph? ank_utils.set_node_default(g_phy, use_ipv4=False, use_ipv6=False) ank_utils.copy_attr_from(g_in, g_phy, "custom_config_global", dst_attr="custom_config") for node in g_phy: if node["input"].custom_config_loopback_zero: lo_zero_config = node["input"].custom_config_loopback_zero node.loopback_zero.custom_config = lo_zero_config custom_config_phy_ints = node["input"].custom_config_phy_ints for interface in node: if custom_config_phy_ints: interface.custom_config = custom_config_phy_ints specified_id = interface["input"].get("specified_id") if specified_id: interface.specified_id = specified_id # map across # TODO: tidy this code up for node in g_phy: for interface in node: remote_edges = interface.edges() if len(remote_edges): interface.description = "to %s" % remote_edges[0].dst.label
g_phy.update(g_phy, use_ipv4=False) # TODO: Create collision domain overlay for ip addressing - l2 overlay? if address_family == "None": log.info("IP addressing disabled, not allocating IPv6") anm.add_overlay("ipv6") # create empty so rest of code follows g_phy.update(g_phy, use_ipv6=False) elif address_family in ("v6", "dual_stack"): build_ipv6(anm) g_phy.update(g_phy, use_ipv6=True) else: anm.add_overlay("ipv6") # placeholder for compiler logic assign_loopback_ip_pool(anm) # default_igp = g_in.data.igp or "ospf" default_igp = g_in.data.igp ank_utils.set_node_default(g_in, igp=default_igp) ank_utils.copy_attr_from(g_in, g_phy, "igp") ank_utils.copy_attr_from(g_in, g_phy, "include_csr") try: from autonetkit_cisco import build_network as cisco_build_network except ImportError, error: log.debug("Unable to load autonetkit_cisco %s" % error) else: cisco_build_network.pre_design(anm) # log.info("Building IGP") from autonetkit.design.igp import build_igp build_igp(anm)
build_ipv4(anm, infrastructure=False) g_phy.update(g_phy, use_ipv4=False) # TODO: Create collision domain overlay for ip addressing - l2 overlay? if address_family == "None": log.info("IP addressing disabled, not allocating IPv6") anm.add_overlay("ipv6") # create empty so rest of code follows g_phy.update(g_phy, use_ipv6=False) elif address_family in ("v6", "dual_stack"): build_ipv6(anm) g_phy.update(g_phy, use_ipv6=True) else: anm.add_overlay("ipv6") # placeholder for compiler logic default_igp = g_in.data.igp or "ospf" ank_utils.set_node_default(g_in, igp=default_igp) ank_utils.copy_attr_from(g_in, g_phy, "igp") ank_utils.copy_attr_from(g_in, g_phy, "include_csr") try: from autonetkit_cisco import build_network as cisco_build_network except ImportError, error: log.debug("Unable to load autonetkit_cisco %s" % error) else: cisco_build_network.pre_design(anm) # log.info("Building IGP") from autonetkit.design.igp import build_igp build_igp(anm)