Esempio n. 1
0
def build_anm(topology_name):
    print "Building anm for %s" % topology_name
    dirname, filename = os.path.split(os.path.abspath(__file__))
    input_filename = os.path.join(dirname, "%s.graphml" % topology_name)

    anm = autonetkit.NetworkModel()
    input_graph = graphml.load_graphml(input_filename)

    import autonetkit.build_network as build_network
    anm = build_network.initialise(input_graph)
    anm = build_network.apply_design_rules(anm)
    return anm
Esempio n. 2
0
def test():


    automated = True # whether to open ksdiff, log to file...
    if __name__ == "__main__":
        automated = False

    dirname, filename = os.path.split(os.path.abspath(__file__))

    anm =  autonetkit.NetworkModel()
    input_file = os.path.join(dirname, "small_internet.graphml")
    input_graph = graphml.load_graphml(input_file)

    import autonetkit.build_network as build_network
    anm = build_network.initialise(input_graph)
    anm = build_network.apply_design_rules(anm)
    anm.save()
    anm_restored =  autonetkit.NetworkModel()
    anm_restored.restore_latest()
    g_phy_original = anm['phy']
    g_phy_restored = anm_restored['phy']
    assert(all(n in g_phy_restored for n in g_phy_original))

    #TODO: do more extensive deep check of parameters

    import autonetkit.workflow as workflow
    render_hostname = "localhost"

    nidb = workflow.create_nidb(anm)
    import autonetkit.compilers.platform.netkit as pl_netkit
    nk_compiler = pl_netkit.NetkitCompiler(nidb, anm, render_hostname)
    nk_compiler.compile()

    nidb.save()
    nidb_restored =  autonetkit.DeviceModel()
    nidb_restored.restore_latest()
    assert(all(n in nidb_restored for n in nidb))

    # cleanup
    shutil.rmtree("versions")
Esempio n. 3
0
def four_chain():
    """Returns anm with  input and physical as house graph"""
    import autonetkit
    anm = autonetkit.NetworkModel()

    g_in = anm.add_overlay("input")

    router_ids = ["r1", "r2", "r3", "r4"]
    g_in.add_nodes_from(router_ids)

    g_in.update(device_type="router")
    g_in.update(asn=1)

    positions = {
        'r1': (101, 250),
        'r2': (100, 500),
        'r3': (100, 750),
        'r4': (100, 1000)
    }
    for node in g_in:
        node.x = positions[node][0]
        node.y = positions[node][1]
        eth0 = node.add_interface("eth0")
        eth0.speed = 100

    # node->node edges
    input_edges = [("r1", "r2"), ("r2", "r4"), ("r3", "r4")]
    input_interface_edges = [(g_in.node(src).interface(1),
                              g_in.node(dst).interface(1))
                             for src, dst in input_edges]
    g_in.add_edges_from(input_interface_edges)

    g_phy = anm['phy']
    g_phy.add_nodes_from(g_in, retain=["device_type", "x", "y", "asn"])
    g_phy.add_edges_from(g_in.edges())

    return anm
Esempio n. 4
0
def test():

    anm = autonetkit.NetworkModel()
    g_phy = anm['phy']
    g_phy.add_nodes_from(["r1", "r2", "r3", "r4", "r5"])
    for node in g_phy:
        node.device_type = "router"

    g_phy.node("r1").x = 100
    g_phy.node("r1").y = 100
    g_phy.node("r2").x = 250
    g_phy.node("r2").y = 250
    g_phy.node("r3").x = 100
    g_phy.node("r3").y = 300
    g_phy.node("r4").x = 600
    g_phy.node("r4").y = 600
    g_phy.node("r5").x = 600
    g_phy.node("r5").y = 300

    g_phy.add_edges_from(([("r1", "r2")]))
    g_phy.add_edges_from(([("r1", "r3")]))
    #g_phy.add_edges_from(([("r2", "r3")]))
    #g_phy.add_edges_from(([("r2", "r4")]))
    #g_phy.add_edges_from(([("r4", "r3")]))
    #g_phy.add_edges_from(([("r4", "r5")]))

    g_simple = anm.add_overlay("simple")
    g_simple.add_nodes_from(g_phy)
    g_simple.add_edges_from(([("r1", "r2")]))
    g_simple.add_edges_from(([("r4", "r3")]))

    g_me = anm.add_overlay("multi", multi_edge=True)
    graph = g_me._graph

    g_me.add_nodes_from(g_phy)

    # add two edges
    g_me.add_edges_from(([("r1", "r2")]))
    g_me.add_edges_from(([("r1", "r2")]))
    g_me.add_edges_from(([("r1", "r2")]))
    g_me.add_edges_from(([("r1", "r2")]))
    g_me.add_edges_from(([("r1", "r2")]))
    g_me.add_edges_from(([("r1", "r3")]))
    g_me.add_edges_from(([("r2", "r3")]))
    g_me.add_edges_from(([("r2", "r3")]))

    r1 = g_me.node("r1")

    for index, edge in enumerate(g_me.edges()):
        #print index, edge
        edge.index = "i_%s" % index

    for edge in r1.edges():
        #print edge, edge.index
        pass
    """
    e1 = r1.edges()[0]
    e1a = g_me.edge(e1)
    assert(e1 == e1a)
    e2 = r1.edges()[1]
    assert(e1 != e2)
    #TODO: check why neq != also returns true for e1 != e1a
    """

    #print g_me.edge("r1", "r2", 0).index
    #print g_me.edge("r1", "r2", 1).index

    print "edges"
    for edge in g_me.edges():
        print edge

    out_of_order = [g_me.edge("r1", "r2", x) for x in [4, 1, 3, 2, 0]]
    #print [e.index for e in out_of_order]
    in_order = sorted(out_of_order)
    #print in_order
    #print [e.index for e in in_order]

    # test adding to another mutli edge graph
    print "adding"
    g_me2 = anm.add_overlay("multi2", multi_edge=True)
    g_me2.add_nodes_from(g_me)
    print "add", len(g_me.edges())
    g_me2.add_edges_from(g_me.edges(), retain="index")
    for edge in g_me2.edges():
        print edge, edge.index

    # examine underlying nx structure

    #print graph
    #print type(graph)

    for u, v, k in graph.edges(keys=True):
        pass
        #print u, v, k
        #print graph[u][v][k].items()
        #graph[u][v][k]['test'] = 123

    g_dir = anm.add_overlay("dir", directed=True)
    g_dir.add_nodes_from(g_phy)
    g_dir.add_edges_from(([("r1", "r2")]))
    g_dir.add_edges_from(([("r2", "r1")]))
    g_dir.add_edges_from(([("r1", "r3")]))

    g_dir_multi = anm.add_overlay("dir_multi", directed=True, multi_edge=True)
    g_dir_multi.add_nodes_from(g_phy)
    g_dir_multi.add_edges_from(([("r1", "r2")]))
    g_dir_multi.add_edges_from(([("r1", "r2")]))
    g_dir_multi.add_edges_from(([("r1", "r2")]))
    g_dir_multi.add_edges_from(([("r1", "r2")]))
    g_dir_multi.add_edges_from(([("r2", "r1")]))
    g_dir_multi.add_edges_from(([("r2", "r1")]))
    g_dir_multi.add_edges_from(([("r2", "r1")]))
    g_dir_multi.add_edges_from(([("r2", "r1")]))
    g_dir_multi.add_edges_from(([("r2", "r1")]))
    g_dir_multi.add_edges_from(([("r1", "r3")]))

    for index, edge in enumerate(g_dir_multi.edges()):
        #print index, edge
        edge.index = "i_%s" % index

    from networkx.readwrite import json_graph
    import json
    data = json_graph.node_link_data(graph)
    with open("multi.json", "w") as fh:
        fh.write(json.dumps(data, indent=2))

    autonetkit.update_http(anm)
Esempio n. 5
0
def test():
    log.info("Testing ANM")

    anm = autonetkit.NetworkModel()

    g_in = anm.add_overlay("input")

    router_ids = ["r1", "r2", "r3", "r4", "r5"]
    g_in.add_nodes_from(router_ids)

    g_in.update(device_type="router")
    g_in.update(asn=1)

    positions = {
        'r3': (107, 250),
        'r5': (380, 290),
        'r1': (22, 50),
        'r2': (377, 9),
        'r4': (571, 229)
    }
    for node in g_in:
        node.x = positions[node][0]
        node.y = positions[node][1]
        eth0 = node.add_interface("eth0")
        eth0.speed = 100

    # node->node edges
    input_edges = [("r1", "r2"), ("r2", "r4"), ("r3", "r4"), ("r3", "r5"),
                   ("r1", "r3")]
    input_interface_edges = [(g_in.node(src).interface(1),
                              g_in.node(dst).interface(1))
                             for src, dst in input_edges]
    g_in.add_edges_from(input_interface_edges)

    g_phy = anm['phy']
    g_phy.add_nodes_from(g_in, retain=["device_type", "x", "y", "asn"])
    g_phy.add_edges_from(g_in.edges())

    g_test = anm.add_overlay("test")
    g_test.add_node("test_node")

    # test interfaces
    for node in g_phy:
        pass

    test_node = g_phy.node("r1")

    #TODO: assert here
    node_interfaces = list(test_node.interfaces())
    # test equality
    #TODO: check why == uses eq() but != doesn't...
    assert (not node_interfaces[0] == node_interfaces[1])

    print list(test_node.interfaces())
    for i in test_node.interfaces():
        print i, i.dump()

    print[i.description for i in sorted(node_interfaces)]

    assert ([i.description
             for i in sorted(node_interfaces)] == ['loopback', 'eth0'])

    for interface in test_node:
        # test exists
        assert (interface is not None)
        # test __nonzero__
        assert (interface)
        set_value = 123
        interface.test = set_value
        get_value = interface.test
        assert (set_value == get_value
                )  # TODO: could check is indeed same object reference

    loopback0 = test_node.interface(0)
    assert (not loopback0.is_bound)
    assert (loopback0.is_loopback)
    assert (not loopback0.is_physical)
    assert (loopback0.is_loopback_zero)

    #TODO: need to add more loopbacks to test
    print loopback0
    assert (str(loopback0) == "loopback.r1")

    eth0 = test_node.interface(1)
    assert (eth0.is_bound)
    assert (not eth0.is_loopback)
    assert (not eth0.is_loopback_zero)
    assert (eth0.is_physical)

    assert (eth0.phy == eth0)  # should be itself as phy overlay

    #print eth0.dump()

    #Cross-layer access
    assert (eth0['input'] is not None)

    assert (sorted(eth0.neighbors()) == [
        g_phy.node("r2").interface(1),
        g_phy.node("r3").interface(1)
    ])

    # access non existent overlay
    #TODO: decide if worth trying to assert the logged item
    eth0["non_existent_overlay"]
    # Need to test cross-layer interface access to phy

    #test accessing overlay for node that doesnt exist in that overlay
    test_overlay_node = g_test.node("test_node")
    test_overlay_interface = test_overlay_node.add_interface()
    test_overlay_interface['phy']

    #Want to assertRaises

    # Test edges
    autonetkit.update_http(anm)
    test_edge = g_in.edge("r1", "r2")
    assert (test_edge is not None)

    # test overlays

    # test ANM
    test_node = g_phy.node("r1")
    assert (test_node.asn == 1)
    assert (test_node.device_type == "router")
    #TODO: also need to test for servers
    assert (test_node.is_l3device())
    assert (test_node.is_router())
    assert (not test_node.is_switch())
    assert (not test_node.is_server())
    assert (str(sorted(list(test_node.neighbors()))) == "[r2, r3]")
    assert (str(sorted(list(
        test_node.neighbor_interfaces()))) == "[eth0.r2, eth0.r3]")
    # Test getting from another overlay
    assert (test_node['input'].asn == 1)

    assert (str(sorted(g_phy.nodes())) == "[r1, r2, r3, r4, r5]")

    assert (test_node.label == "r1")
    """
    g_in.update("r4", asn = 2)
    g_in.update(["r1", "r2", "r3"], asn = 1)

    test = g_in.node("r5")

    """
    # More graph level tests
    #TODO: need to allow searching for interface by .interface("eth1", "r1")

    #TODO: need to provide remove_nodes_from

    test_node = g_phy.node("r1")
    search_int = list(test_node.interfaces())[0]
    result_int = g_phy.interface(search_int)
    assert (search_int == result_int)

    search_int = list(test_node.interfaces())[1]
    result_int = g_phy.interface(search_int)
    assert (search_int == result_int)

    assert (g_phy.node("r1").degree() == 2)
    assert (g_phy.node("r3").degree() == 3)

    g_phy.add_edge("r1", "r4")
    assert (g_phy.edge("r1", "r4") is not None)

    edges_to_remove = g_phy.edge("r1", "r4")
    #TODO: remove_edges_from needs to support single/list
    g_phy.remove_edges_from([edges_to_remove])
    assert (g_phy.edge("r1", "r4") is None)

    src_int = g_phy.node("r1").add_interface("eth1")
    dst_int = g_phy.node("r5").add_interface("eth1")
    g_phy.add_edges_from([(src_int, dst_int)])
    edge = g_phy.edge("r1", "r5")
    assert ((edge.src_int, edge.dst_int) == (src_int, dst_int))

    edge_a1 = g_phy.edge("r1", "r2")
    edge_a2 = g_phy.edge("r1", "r2")
    assert (edge_a1 == edge_a2)
    edge_b = g_phy.edge("r1", "r2")
    assert (edge_a1 != edge_b)

    # compare to string
    assert (edge_a1 == ("r1", "r2"))
    assert (edge_a1 != ("r1", "r3"))

    assert (bool(edge_a1) is True)  #exists
    edge_non_existent = g_phy.edge("r1", "r8")
    #TODO: need to document API to check exists/doesn't exist for nodes, edges, interfaces, graphs,....
    assert (bool(edge_non_existent) is False)  #doesn't exist

    # add node
    #TODO: better handling of nodes with no x,y, asn, etc in jsonify
    r6 = g_phy.add_node("r6")
    assert (r6 in g_phy)
    del g_phy[r6]
    assert (r6 not in g_phy)

    # graph data
    g_phy.data.test = 123
    assert (g_phy.data.test == 123)
    assert (g_phy.data['test'] == 123)

    # test adding a node with not attributes for jsonify

    #TODO: test for directed graph

    autonetkit.update_http(anm)
Esempio n. 6
0
import autonetkit
import autonetkit.log as log


anm = autonetkit.NetworkModel()
g_phy = anm.add_overlay("phy")
for index in range(5):
    node_id = "r_%s" % index
    g_phy.add_node(node_id)

print g_phy.nodes()
for node in g_phy:
    print node
    print node._ports
    for interface in range(3):
        node.add_interface()

sw = g_phy.add_node("sw1")
sw.device_type = "switch"

for node in g_phy:
    for iface in node:
        g_phy.add_edge(sw, iface)
        print sw.edges()


for edge in g_phy.edges():
    print edge._ports
Esempio n. 7
0
def test():
	automated = True # whether to open ksdiff, log to file...
	if __name__ == "__main__":
	    automated = False

	dirname, filename = os.path.split(os.path.abspath(__file__))
	parent_dir = os.path.abspath(os.path.join(dirname, os.pardir))

	anm =  autonetkit.NetworkModel()
	input_file = os.path.join(parent_dir, "small_internet.graphml")
	input_graph = graphml.load_graphml(input_file)

	import autonetkit.build_network as build_network
	anm = build_network.initialise(input_graph)
	anm = build_network.apply_design_rules(anm)



	try:
		from websocket import create_connection
	except ImportError:
		print "websocket-client package not installed"
	else:
		autonetkit.update_http(anm)

		ws = create_connection("ws://localhost:8000/ws")
		ws.send("overlay_list")
		result =  ws.recv()
		expected = '{"overlay_list": ["bgp", "ebgp", "ebgp_v4", "ebgp_v6", "eigrp", graphics", "ibgp_v4", "ibgp_v6", "ibgp_vpn_v4", "input", "input_directed", "ip", "ipv4", "ipv6", "isis", "l3_conn", "ospf", "phy", "vrf"]}'
		assert(result == expected)

		overlay_id = "phy"
		ws.send("overlay_id=" + overlay_id)
		result =  ws.recv()
		with open(os.path.join(dirname, "expected_phy.json"), "r") as fh:
			expected = fh.read()

		assert(result == expected)
		ws.close()

		import autonetkit.console_script as console_script
		render_hostname = "localhost"

		nidb = console_script.create_nidb(anm)
		nidb._graph.graph['timestamp'] = "123456"

		import autonetkit.compilers.platform.netkit as pl_netkit
		nk_compiler = pl_netkit.NetkitCompiler(nidb, anm, render_hostname)
		nk_compiler.compile()
		autonetkit.update_http(anm, nidb)

		ws = create_connection("ws://localhost:8000/ws")
		ws.send("overlay_list")
		result =  ws.recv()
		expected = '{"overlay_list": ["bgp", "ebgp", "ebgp_v4", "ebgp_v6", "eigrp", graphics", "ibgp_v4", "ibgp_v6", "ibgp_vpn_v4", "input", "input_directed", "ip", "ipv4", "ipv6", "isis", "l3_conn", "nidb", "ospf", "phy", "vrf"]}'
		assert(result == expected)

		overlay_id = "nidb"
		ws.send("overlay_id=" + overlay_id)
		result =  ws.recv()
		with open(os.path.join(dirname, "expected_nidb.json"), "r") as fh:
			expected = fh.read()

		assert(result == expected)
		ws.close()