def build_network(input_filename): anm = AbstractNetworkModel() input_graph = ank.load_graphml(input_filename) G_in = anm.add_overlay("input", input_graph) ank.set_node_default(G_in, G_in, platform="netkit") ank.set_node_default(G_in, G_in, host="nectar1") graph_product.expand(G_in) if len(ank.unique_attr(G_in, "asn")) > 1: # Multiple ASNs set, use label format device.asn anm.set_node_label(".as", ['label', 'pop', 'asn']) # set syntax for routers according to platform G_in.update(G_in.nodes("is_router", platform = "junosphere"), syntax="junos") G_in.update(G_in.nodes("is_router", platform = "dynagen"), syntax="ios") G_in.update(G_in.nodes("is_router", platform = "netkit"), syntax="quagga") G_graphics = anm.add_overlay("graphics") # plotting data G_graphics.add_nodes_from(G_in, retain=['x', 'y', 'device_type', 'device_subtype', 'asn']) build_phy(anm) build_ip(anm) build_ospf(anm) build_bgp(anm) return anm
def initialise(input_graph): anm = autonetkit.anm.AbstractNetworkModel() input_undirected = nx.Graph(input_graph) g_in = anm.add_overlay("input", graph=input_undirected) anm.add_overlay("input_directed", graph=input_graph, directed=True) # set defaults if not g_in.data.specified_int_names: # if not specified then automatically assign interface names g_in.data.specified_int_names = False import autonetkit.plugins.graph_product as graph_product graph_product.expand(g_in) # apply graph products if relevant expand_fqdn = False # TODO: make this set from config and also in the input file if expand_fqdn and len(ank_utils.unique_attr(g_in, "asn")) > 1: # Multiple ASNs set, use label format device.asn anm.set_node_label(".", ['label', 'pop', 'asn']) g_in.update(g_in.nodes("is_router", platform="junosphere"), syntax="junos") g_in.update(g_in.nodes("is_router", platform="dynagen"), syntax="ios") g_in.update(g_in.nodes("is_router", platform="netkit"), syntax="quagga") g_in.update(g_in.nodes("is_server", platform="netkit"), syntax="quagga") g_graphics = anm.add_overlay("graphics") # plotting data g_graphics.add_nodes_from( g_in, retain=['x', 'y', 'device_type', 'device_subtype', 'pop', 'asn']) return anm
def initialise(input_graph): anm = autonetkit.anm.AbstractNetworkModel() input_undirected = nx.Graph(input_graph) g_in = anm.add_overlay("input", graph=input_undirected) anm.add_overlay("input_directed", graph=input_graph, directed=True) # set defaults if not g_in.data.specified_int_names: # if not specified then automatically assign interface names g_in.data.specified_int_names = False import autonetkit.plugins.graph_product as graph_product graph_product.expand(g_in) # apply graph products if relevant expand_fqdn = False # TODO: make this set from config and also in the input file if expand_fqdn and len(ank_utils.unique_attr(g_in, "asn")) > 1: # Multiple ASNs set, use label format device.asn anm.set_node_label(".", ['label', 'pop', 'asn']) g_in.update( g_in.nodes("is_router", platform="junosphere"), syntax="junos") g_in.update(g_in.nodes("is_router", platform="dynagen"), syntax="ios") g_in.update(g_in.nodes("is_router", platform="netkit"), syntax="quagga") g_in.update(g_in.nodes("is_server", platform="netkit"), syntax="quagga") g_graphics = anm.add_overlay("graphics") # plotting data g_graphics.add_nodes_from(g_in, retain=['x', 'y', 'device_type', 'device_subtype', 'pop', 'asn']) return anm
def build(input_graph): """Main function to build network overlay topologies""" anm = autonetkit.anm.AbstractNetworkModel() input_undirected = nx.Graph(input_graph) g_in = anm.add_overlay("input", graph=input_undirected) anm.add_overlay("input_directed", graph=input_graph, directed=True) # set defaults if not g_in.data.specified_int_names: # if not specified then automatically assign interface names g_in.data.specified_int_names = False import autonetkit.plugins.graph_product as graph_product graph_product.expand(g_in) # apply graph products if relevant expand_fqdn = False # TODO: make this set from config and also in the input file if expand_fqdn and len(ank_utils.unique_attr(g_in, "asn")) > 1: # Multiple ASNs set, use label format device.asn anm.set_node_label(".", ["label", "pop", "asn"]) g_in.update(g_in.nodes("is_router", platform="junosphere"), syntax="junos") g_in.update(g_in.nodes("is_router", platform="dynagen"), syntax="ios") g_in.update(g_in.nodes("is_router", platform="netkit"), syntax="quagga") g_graphics = anm.add_overlay("graphics") # plotting data g_graphics.add_nodes_from(g_in, retain=["x", "y", "device_type", "device_subtype", "pop", "asn"]) build_phy(anm) autonetkit.update_http(anm) g_phy = anm["phy"] build_vrf(anm) # need to do before to add loopbacks before ip allocations build_ip(anm) # ip infrastructure topology autonetkit.update_http(anm) 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 in ("v4", "dual_stack"): build_ipv4(anm, infrastructure=True) g_phy.update(g_phy, use_ipv4=True) else: build_ipv4(anm, infrastructure=False) # TODO: Create a collision domain overlay for ip addressing - l2 overlay? if address_family in ("v6", "dual_stack"): build_ipv6(anm) g_phy.update(g_phy, use_ipv6=True) default_igp = g_in.data.igp or "ospf" non_igp_nodes = [n for n in g_in if not n.igp] # TODO: should this be modifying g_in? g_in.update(non_igp_nodes, igp=default_igp) # store igp onto each node anm.add_overlay("ospf") anm.add_overlay("isis") ank_utils.copy_attr_from(g_in, g_phy, "include_csr") build_ospf(anm) build_isis(anm) build_bgp(anm) autonetkit.update_http(anm) return anm
def build(input_graph): """Main function to build network overlay topologies""" anm = autonetkit.anm.AbstractNetworkModel() input_undirected = nx.Graph(input_graph) g_in = anm.add_overlay("input", graph=input_undirected) anm.add_overlay("input_directed", graph=input_graph, directed=True) # set defaults if not g_in.data.specified_int_names: # if not specified then automatically assign interface names g_in.data.specified_int_names = False import autonetkit.plugins.graph_product as graph_product graph_product.expand(g_in) # apply graph products if relevant expand_fqdn = False # TODO: make this set from config and also in the input file if expand_fqdn and len(ank_utils.unique_attr(g_in, "asn")) > 1: # Multiple ASNs set, use label format device.asn anm.set_node_label(".", ['label', 'pop', 'asn']) g_in.update( g_in.nodes("is_router", platform="junosphere"), syntax="junos") g_in.update(g_in.nodes("is_router", platform="dynagen"), syntax="ios") g_in.update(g_in.nodes("is_router", platform="netkit"), syntax="quagga") g_graphics = anm.add_overlay("graphics") # plotting data g_graphics.add_nodes_from(g_in, retain=['x', 'y', 'device_type', 'device_subtype', 'pop', 'asn']) build_phy(anm) autonetkit.update_http(anm) g_phy = anm['phy'] build_vrf(anm) address_family = g_in.data.address_family or "v4" allocate_ipv4_infrastructure = False if address_family in ("v4", "dual_stack"): allocate_ipv4_infrastructure = True build_ipv4(anm, infrastructure=allocate_ipv4_infrastructure) #TODO: Create a collision domain overlay for ip addressing - l2 overlay? allocate_ipv6 = False if address_family in ("v6", "dual_stack"): allocate_ipv6 = True build_ipv4(anm, infrastructure=True) build_ip6(anm) for node in g_phy: node.use_ipv4 = allocate_ipv4_infrastructure node.use_ipv6 = allocate_ipv6 default_igp = g_in.data.igp or "ospf" non_igp_nodes = [n for n in g_in if not node.igp] g_in.update(non_igp_nodes, igp=default_igp) anm.add_overlay("ospf") anm.add_overlay("isis") ank_utils.copy_attr_from(g_in, g_phy, "include_csr") build_ospf(anm) build_isis(anm) build_bgp(anm) autonetkit.update_http(anm) return anm
def build(input_graph_string, timestamp): #TODO: move this out of main console wrapper anm = autonetkit.anm.AbstractNetworkModel() try: input_graph = graphml.load_graphml(input_graph_string) except autonetkit.exception.AnkIncorrectFileFormat: # try a different reader try: from autonetkit_cisco import load as cisco_load except ImportError: return # module not present (development module) input_graph = cisco_load.load(input_graph_string) # add local deployment host settings['General']['deploy'] = True settings['Deploy Hosts']['internal'] = { 'cisco': { 'deploy': True, }, } #TODO: make this more explicit than overloading add_overlay - make it load_graph or something similar #TODO: may need to revisit the collapse to a single directed graph: may need to consider link type, eg physical, when reducing directed to undirected graph #Note: this may also require stripping edge specific information, such as IP addressing that only applies in one direction for a directed edge input_undirected = nx.Graph(input_graph) for node in input_graph: #del input_graph.node[node]['router config'] #del input_graph.node[node]['device_subtype'] pass #nx.write_graphml(input_graph, "output.graphml") G_in = anm.add_overlay("input", graph = input_undirected) G_in_directed = anm.add_overlay("input_directed", graph = input_graph, directed = True) # set defaults if not G_in.data.specified_int_names: G_in.data.specified_int_names = False # if not specified then automatically assign interface names import autonetkit.plugins.graph_product as graph_product graph_product.expand(G_in) # apply graph products if relevant expand_fqdn = False #TODO: make this set from config and also in the input file if expand_fqdn and len(ank.unique_attr(G_in, "asn")) > 1: # Multiple ASNs set, use label format device.asn anm.set_node_label(".", ['label', 'pop', 'asn']) #TODO: remove, used for demo on nectar #for node in G_in: #node.platform = "netkit" #node.host = "nectar1" #G_in.data.igp = "ospf" # set syntax for routers according to platform #TODO: make these defaults G_in.update(G_in.nodes("is_router", platform = "junosphere"), syntax="junos") G_in.update(G_in.nodes("is_router", platform = "dynagen"), syntax="ios") G_in.update(G_in.nodes("is_router", platform = "netkit"), syntax="quagga") #G_in.update(G_in.nodes("is_router", platform = "cisco"), syntax="ios2") G_graphics = anm.add_overlay("graphics") # plotting data G_graphics.add_nodes_from(G_in, retain=['x', 'y', 'device_type', 'device_subtype', 'pop', 'asn']) build_phy(anm) #update_messaging(anm) #build_conn(anm) build_ip(anm) build_ip6(anm) igp = G_in.data.igp or "ospf" #TODO: make default template driven #TODO: make the global igp be set on each node - this way can also support different IGPs per router # Add overlays even if not used: simplifies compiler where can check for presence in overlay (if blank not present, don't configure ospf etc) anm.add_overlay("ospf") anm.add_overlay("isis") G_phy = anm['phy'] ank.copy_attr_from(G_in, G_phy, "include_csr") #TODO: find more elegant passing method from input to compiler if igp == "ospf": build_ospf(anm) if igp == "isis": build_isis(anm) build_bgp(anm) #TODO: provide an ANM wide function that allocates interfaces #TODO: work out why some interfaces in bgp graph in vis have node data.... for node in G_phy: for interface in node: interface.speed = 102 return anm