def test_tags():
    context = Context("http://dontcare", requests_session=Mock())
    username = password = "******"
    lab = Lab("laboratory", 1, context, username, password, auto_sync=0)
    node_a = lab.add_node_local("0", "node A", "nd", "im", "cfg", 0, 0)
    node_b = lab.add_node_local("1", "node B", "nd", "im", "cfg", 0, 0)
    node_c = lab.add_node_local("2", "node C", "nd", "im", "cfg", 0, 0)
    node_d = lab.add_node_local("3", "node D", "nd", "im", "cfg", 0, 0)
    assert len(node_a.tags()) == 0
    node_a.add_tag("Core")
    node_a.add_tag("Europe")
    node_a.add_tag("Test")
    assert len(node_a.tags()) == 3
    node_a.add_tag("Europe")
    assert len(node_a.tags()) == 3
    node_a.remove_tag("Test")
    assert len(node_a.tags()) == 2

    node_b.add_tag("Core")
    node_c.add_tag("Core")
    node_d.add_tag("Europe")

    core = lab.find_nodes_by_tag("Core")
    assert len(core) == 3

    europe = lab.find_nodes_by_tag("Europe")
    assert len(europe) == 2
def test_find_by_label():

    context = Context("http://dontcare", requests_session=Mock())
    username = password = "******"
    lab = Lab("laboratory", 1, context, username, password, auto_sync=0)

    lab.add_node_local("n0", "server-a", "nd", "im", "cfg", 0, 0)
    lab.add_node_local("n1", "server-b", "nd", "im", "cfg", 0, 0)
    lab.add_node_local("n2", "server-c", "nd", "im", "cfg", 0, 0)
    lab.add_node_local("n3", "server-d", "nd", "im", "cfg", 0, 0)

    node = lab.get_node_by_label("server-a")
    assert node.id == "n0"

    with pytest.raises(NodeNotFound) as exc:
        node = lab.get_node_by_label("does-not-exist")
        print(exc)
        assert node is None
def test_next_free_interface():
    context = Context("http://dontcare", requests_session=Mock())
    username = password = "******"
    lab = Lab("laboratory", 1, context, username, password, auto_sync=0)
    node_a = lab.add_node_local("0", "node A", "nd", "im", "cfg", 0, 0)
    node_b = lab.add_node_local("1", "node B", "nd", "im", "cfg", 1, 1)

    nf = node_a.next_available_interface()
    assert nf is None

    i1 = lab.create_interface_local("0", "iface 0", node_a, "slot 0")
    nf = node_a.next_available_interface()
    assert i1 == nf

    i2 = lab.create_interface_local("4", "iface 4", node_b, "slot 4")
    lab.create_link_local(i1, i2, "0")

    nf = node_a.next_available_interface()
    assert nf is None
def test_topology_creation_and_removal():
    context = Context("http://dontcare", requests_session=Mock())
    username = password = "******"
    lab = Lab("laboratory", 1, context, username, password, auto_sync=0)
    node_a = lab.add_node_local("0", "node A", "nd", "im", "cfg", 0, 0)
    node_b = lab.add_node_local("1", "node B", "nd", "im", "cfg", 1, 1)
    node_c = lab.add_node_local("2", "node C", "nd", "im", "cfg", 2, 2)
    i1 = lab.create_interface_local("0", "iface A", node_a, "slot A")
    i2 = lab.create_interface_local("1", "iface B1", node_b, "slot B1")
    i3 = lab.create_interface_local("2", "iface B2", node_b, "slot B2")
    i4 = lab.create_interface_local("3", "iface C", node_c, "slot C")

    lnk1 = lab.create_link_local(i1, i2, "0")
    lnk2 = lab.create_link_local(i3, i4, "1")

    assert sorted([node_b, node_c, node_a]) == [node_a, node_b, node_c]
    assert sorted([i4, i2, i3, i1]) == [i1, i2, i3, i4]
    assert sorted([lnk2, lnk1]) == [lnk1, lnk2]

    assert set(lab.nodes()) == {node_a, node_b, node_c}
    assert lab.statistics == {"nodes": 3, "links": 2, "interfaces": 4}
    assert node_a.degree() == 1
    assert node_b.degree() == 2
    assert node_c.degree() == 1

    assert node_a.links() == [lnk1]
    assert sorted(node_b.links()) == [lnk1, lnk2]
    assert node_c.links() == [lnk2]

    assert i1.degree() == 1
    assert i2.degree() == 1
    assert i3.degree() == 1
    assert i4.degree() == 1

    assert i1.peer_interfaces() == {i2}
    assert i2.peer_interfaces() == {i1}
    assert i3.peer_interfaces() == {i4}
    assert i4.peer_interfaces() == {i3}

    assert i1.peer_nodes() == {node_b}
    assert i2.peer_nodes() == {node_a}
    assert i3.peer_nodes() == {node_c}
    assert i4.peer_nodes() == {node_b}

    assert lnk1.nodes == (node_a, node_b)
    assert lnk1.interfaces == (i1, i2)
    assert lnk2.nodes == (node_b, node_c)
    assert lnk2.interfaces == (i3, i4)

    lab.remove_link(lnk2)
    assert lab.statistics == {"nodes": 3, "links": 1, "interfaces": 4}

    lab.remove_node(node_b)
    assert lab.statistics == {"nodes": 2, "links": 0, "interfaces": 2}

    lab.remove_interface(i4)
    assert lab.statistics == {"nodes": 2, "links": 0, "interfaces": 1}

    lab.remove_interface(i1)
    assert lab.statistics == {"nodes": 2, "links": 0, "interfaces": 0}

    lab.remove_node(node_a)
    assert lab.statistics == {"nodes": 1, "links": 0, "interfaces": 0}

    lab.remove_node(node_c)
    assert lab.statistics == {"nodes": 0, "links": 0, "interfaces": 0}