示例#1
0
def test_basic_topology(tmpdir, async_run, controller):
    project = Project(name="Test", controller=controller)
    compute = Compute("my_compute", controller)
    compute.http_query = MagicMock()

    with asyncio_patch("gns3server.controller.node.Node.create"):
        node1 = async_run(
            project.add_node(compute,
                             "Node 1",
                             str(uuid.uuid4()),
                             node_type="qemu"))
        node2 = async_run(
            project.add_node(compute,
                             "Node 2",
                             str(uuid.uuid4()),
                             node_type="qemu"))

    link = async_run(project.add_link())
    async_run(link.add_node(node1, 0, 0))
    with asyncio_patch("gns3server.controller.udp_link.UDPLink.create"
                       ) as mock_udp_create:
        async_run(link.add_node(node2, 0, 0))

    drawing = async_run(project.add_drawing(svg="<svg></svg>"))

    topo = project_to_topology(project)
    assert len(topo["topology"]["nodes"]) == 2
    assert node1.__json__(topology_dump=True) in topo["topology"]["nodes"]
    assert topo["topology"]["links"][0] == link.__json__(topology_dump=True)
    assert topo["topology"]["computes"][0] == compute.__json__(
        topology_dump=True)
    assert topo["topology"]["drawings"][0] == drawing.__json__(
        topology_dump=True)
示例#2
0
def test_delete_node_delete_link(async_run, controller):
    """
    Delete a node delete all the node connected
    """
    compute = MagicMock()
    project = Project(controller=controller, name="Test")
    project.emit_notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(
        project.add_node(compute,
                         "test",
                         None,
                         node_type="vpcs",
                         properties={"startup_config": "test.cfg"}))

    link = async_run(project.add_link())
    async_run(link.add_node(node, 0, 0))

    async_run(project.delete_node(node.id))
    assert node.id not in project._nodes
    assert link.id not in project._links

    compute.delete.assert_any_call('/projects/{}/vpcs/nodes/{}'.format(
        project.id, node.id))
    project.emit_notification.assert_any_call("node.deleted", node.__json__())
    project.emit_notification.assert_any_call("link.deleted", link.__json__())
示例#3
0
def test_delete_node(async_run, controller):
    """
    For a local server we send the project path
    """
    compute = MagicMock()
    project = Project(controller=controller, name="Test")
    project.emit_notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(
        project.add_node(compute,
                         "test",
                         None,
                         node_type="vpcs",
                         properties={"startup_config": "test.cfg"}))
    assert node.id in project._nodes
    async_run(project.delete_node(node.id))
    assert node.id not in project._nodes

    compute.delete.assert_any_call('/projects/{}/vpcs/nodes/{}'.format(
        project.id, node.id))
    project.emit_notification.assert_any_call("node.deleted", node.__json__())
示例#4
0
def test_add_node_non_local(async_run, controller):
    """
    For a non local server we do not send the project path
    """
    compute = MagicMock()
    compute.id = "remote"
    project = Project(controller=controller, name="Test")
    project.emit_notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(
        project.add_node(compute,
                         "test",
                         None,
                         node_type="vpcs",
                         properties={"startup_script": "test.cfg"}))

    compute.post.assert_any_call('/projects',
                                 data={
                                     "name": project._name,
                                     "project_id": project._id
                                 })
    compute.post.assert_any_call('/projects/{}/vpcs/nodes'.format(project.id),
                                 data={
                                     'node_id': node.id,
                                     'startup_script': 'test.cfg',
                                     'name': 'test'
                                 },
                                 timeout=1200)
    assert compute in project._project_created_on_compute
    project.emit_notification.assert_any_call("node.created", node.__json__())
示例#5
0
def test_add_node_non_local(async_run, controller):
    """
    For a non local server we do not send the project path
    """
    compute = MagicMock()
    compute.id = "remote"
    project = Project(controller=controller, name="Test")
    controller._notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_script": "test.cfg"}))

    compute.post.assert_any_call('/projects', data={
        "name": project._name,
        "project_id": project._id
    })
    compute.post.assert_any_call('/projects/{}/vpcs/nodes'.format(project.id),
                                 data={'node_id': node.id,
                                       'startup_script': 'test.cfg',
                                       'name': 'test'},
                                 timeout=1200)
    assert compute in project._project_created_on_compute
    controller.notification.emit.assert_any_call("node.created", node.__json__())
示例#6
0
def test_create_iou_on_multiple_node(async_run, controller):
    """
    Due to mac address collision you can't create an IOU node
    on two different server
    """
    compute = MagicMock()
    compute.id = "remote"

    compute2 = MagicMock()
    compute2.id = "remote2"

    project = Project(controller=controller, name="Test")

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node1 = async_run(project.add_node(compute, "test", None, node_type="iou"))
    with pytest.raises(aiohttp.web_exceptions.HTTPConflict):
        async_run(project.add_node(compute2, "test2", None, node_type="iou"))
示例#7
0
def test_get_node(async_run, controller):
    compute = MagicMock()
    project = Project(controller=controller, name="Test")

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    vm = async_run(project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_config": "test.cfg"}))
    assert project.get_node(vm.id) == vm

    with pytest.raises(aiohttp.web_exceptions.HTTPNotFound):
        project.get_node("test")

    # Raise an error if the project is not opened
    async_run(project.close())
    with pytest.raises(aiohttp.web.HTTPForbidden):
        project.get_node(vm.id)
示例#8
0
def test_get_node(async_run, controller):
    compute = MagicMock()
    project = Project(controller=controller, name="Test")

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    vm = async_run(project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_config": "test.cfg"}))
    assert project.get_node(vm.id) == vm

    with pytest.raises(aiohttp.web_exceptions.HTTPNotFound):
        project.get_node("test")

    # Raise an error if the project is not opened
    async_run(project.close())
    with pytest.raises(aiohttp.web.HTTPForbidden):
        project.get_node(vm.id)
示例#9
0
def test_delete_node(async_run, controller):
    """
    For a local server we send the project path
    """
    compute = MagicMock()
    project = Project(controller=controller, name="Test")
    controller._notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_config": "test.cfg"}))
    assert node.id in project._nodes
    async_run(project.delete_node(node.id))
    assert node.id not in project._nodes

    compute.delete.assert_any_call('/projects/{}/vpcs/nodes/{}'.format(project.id, node.id))
    controller.notification.emit.assert_any_call("node.deleted", node.__json__())
示例#10
0
def test_list_nodes(async_run, controller):
    compute = MagicMock()
    project = Project(controller=controller, name="Test")

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    vm = async_run(
        project.add_node(compute,
                         "test",
                         None,
                         node_type="vpcs",
                         properties={"startup_config": "test.cfg"}))
    assert len(project.nodes) == 1
    assert isinstance(project.nodes, dict)

    async_run(project.close())
    assert len(project.nodes) == 1
    assert isinstance(project.nodes, dict)
示例#11
0
def test_basic_topology(tmpdir, async_run, controller):
    project = Project(name="Test", controller=controller)
    compute = Compute("my_compute", controller)
    compute.http_query = MagicMock()

    with asyncio_patch("gns3server.controller.node.Node.create"):
        node1 = async_run(project.add_node(compute, "Node 1", str(uuid.uuid4()), node_type="qemu"))
        node2 = async_run(project.add_node(compute, "Node 2", str(uuid.uuid4()), node_type="qemu"))

    link = async_run(project.add_link())
    async_run(link.add_node(node1, 0, 0))
    with asyncio_patch("gns3server.controller.udp_link.UDPLink.create") as mock_udp_create:
        async_run(link.add_node(node2, 0, 0))

    drawing = async_run(project.add_drawing(svg="<svg></svg>"))

    topo = project_to_topology(project)
    assert len(topo["topology"]["nodes"]) == 2
    assert node1.__json__(topology_dump=True) in topo["topology"]["nodes"]
    assert topo["topology"]["links"][0] == link.__json__(topology_dump=True)
    assert topo["topology"]["computes"][0] == compute.__json__(topology_dump=True)
    assert topo["topology"]["drawings"][0] == drawing.__json__(topology_dump=True)
示例#12
0
def test_delete_locked_node(async_run, controller):
    """
    For a local server we send the project path
    """
    compute = MagicMock()
    project = Project(controller=controller, name="Test")
    project.emit_notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(
        project.add_node(compute,
                         "test",
                         None,
                         node_type="vpcs",
                         properties={"startup_config": "test.cfg"}))
    assert node.id in project._nodes
    node.locked = True
    with pytest.raises(aiohttp.web_exceptions.HTTPConflict):
        async_run(project.delete_node(node.id))
示例#13
0
def test_delete_node_delete_link(async_run, controller):
    """
    Delete a node delete all the node connected
    """
    compute = MagicMock()
    project = Project(controller=controller, name="Test")
    controller._notification = MagicMock()

    response = MagicMock()
    response.json = {"console": 2048}
    compute.post = AsyncioMagicMock(return_value=response)

    node = async_run(project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_config": "test.cfg"}))

    link = async_run(project.add_link())
    async_run(link.add_node(node, 0, 0))

    async_run(project.delete_node(node.id))
    assert node.id not in project._nodes
    assert link.id not in project._links

    compute.delete.assert_any_call('/projects/{}/vpcs/nodes/{}'.format(project.id, node.id))
    controller.notification.emit.assert_any_call("node.deleted", node.__json__())
    controller.notification.emit.assert_any_call("link.deleted", link.__json__())