def stop_capture(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) port_number = int(request.match_info["port_number"]) yield from vm.stop_capture(port_number) response.set_status(204)
def test_start(loop, vm, async_run): process = MagicMock() process.returncode = None with NotificationManager.instance().queue() as queue: async_run(queue.get(0)) # Ping with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.start_wrap_console"): nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) async_run(vm.port_add_nio_binding(0, nio)) loop.run_until_complete(asyncio.async(vm.start())) assert mock_exec.call_args[0] == (vm._vpcs_path(), '-p', str(vm._internal_console_port), '-m', '1', '-i', '1', '-F', '-R', '-s', ANY, '-c', ANY, '-t', '127.0.0.1') assert vm.is_running() assert vm.command_line == ' '.join(mock_exec.call_args[0]) (action, event, kwargs) = async_run(queue.get(0)) assert action == "node.updated" assert event == vm
def test_reload(loop, vm, async_run): process = MagicMock() # Wait process kill success future = asyncio.Future() future.set_result(True) process.wait.return_value = future process.returncode = None with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.start_wrap_console"): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process): nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) async_run(vm.port_add_nio_binding(0, nio)) async_run(vm.start()) assert vm.is_running() with asyncio_patch("gns3server.utils.asyncio.wait_for_process_termination"): async_run(vm.reload()) assert vm.is_running() is True if sys.platform.startswith("win"): process.send_signal.assert_called_with(1) else: process.terminate.assert_called_with()
async def start(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) await vm.start() response.json(vm)
def test_start_0_6_1(loop, vm, async_run): """ Version 0.6.1 doesn't have the -R options. It's not require because GNS3 provide a patch for this. """ process = MagicMock() process.returncode = None vm._vpcs_version = parse_version("0.6.1") with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.start_wrap_console"): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) async_run(vm.port_add_nio_binding(0, nio)) async_run(vm.start()) assert mock_exec.call_args[0] == (vm._vpcs_path(), '-p', str(vm._internal_console_port), '-m', '1', '-i', '1', '-F', '-s', ANY, '-c', ANY, '-t', '127.0.0.1') assert vm.is_running()
def test_stop(loop, vm, async_run): process = MagicMock() # Wait process kill success future = asyncio.Future() future.set_result(True) process.wait.return_value = future process.returncode = None with NotificationManager.instance().queue() as queue: with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch("gns3server.compute.vpcs.vpcs_vm.VPCSVM.start_wrap_console"): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process): nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) async_run(vm.port_add_nio_binding(0, nio)) async_run(vm.start()) assert vm.is_running() with asyncio_patch("gns3server.utils.asyncio.wait_for_process_termination"): loop.run_until_complete(asyncio.async(vm.stop())) assert vm.is_running() is False if sys.platform.startswith("win"): process.send_signal.assert_called_with(1) else: process.terminate.assert_called_with() async_run(queue.get(0)) # Ping async_run(queue.get(0)) # Started (action, event, kwargs) = async_run(queue.get(0)) assert action == "node.updated" assert event == vm
async def stream_pcap_file(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) port_number = int(request.match_info["port_number"]) nio = vm.get_nio(port_number) await vpcs_manager.stream_pcap_file(nio, vm.project.id, request, response)
async def reload(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) await vm.reload() response.set_status(204)
def stop(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) yield from vm.stop() response.set_status(204)
async def delete_nio(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) port_number = int(request.match_info["port_number"]) await vm.port_remove_nio_binding(port_number) response.set_status(204)
async def test_start_0_6_1(vm): """ Version 0.6.1 doesn't have the -R options. It's not require because GNS3 provide a patch for this. """ process = MagicMock() process.returncode = None vm._vpcs_version = parse_version("0.6.1") with asyncio_patch( "gns3server.compute.vpcs.vpcs_vm.VPCSVM._check_requirements", return_value=True): with asyncio_patch( "gns3server.compute.vpcs.vpcs_vm.VPCSVM.start_wrap_console"): with asyncio_patch("asyncio.create_subprocess_exec", return_value=process) as mock_exec: nio = VPCS.instance().create_nio({ "type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1", "filters": {} }) await vm.port_add_nio_binding(0, nio) await vm.start() assert mock_exec.call_args[0] == ( vm._vpcs_path(), '-p', str(vm._internal_console_port), '-m', '1', '-i', '1', '-F', '-s', ANY, '-c', ANY, '-t', '127.0.0.1') assert vm.is_running()
def start_capture(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) port_number = int(request.match_info["port_number"]) pcap_file_path = os.path.join(vm.project.capture_working_directory(), request.json["capture_file_name"]) yield from vm.start_capture(port_number, pcap_file_path) response.json({"pcap_file_path": pcap_file_path})
def update(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) vm.name = request.json.get("name", vm.name) vm.console = request.json.get("console", vm.console) vm.updated() response.json(vm)
def duplicate(request, response): new_node = yield from VPCS.instance().duplicate_node( request.match_info["node_id"], request.json["destination_node_id"] ) response.set_status(201) response.json(new_node)
def test_add_nio_binding_udp(vm, async_run): nio = VPCS.instance().create_nio({ "type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1" }) async_run(vm.port_add_nio_binding(0, nio)) assert nio.lport == 4242
def create(request, response): vpcs = VPCS.instance() vm = yield from vpcs.create_node(request.json["name"], request.match_info["project_id"], request.json.get("node_id"), console=request.json.get("console"), startup_script=request.json.get("startup_script")) response.set_status(201) response.json(vm)
def test_add_nio_binding_tap(vm, ethernet_device): with patch( "gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): nio = VPCS.instance().create_nio({ "type": "nio_tap", "tap_device": ethernet_device }) vm.port_add_nio_binding(0, nio) assert nio.tap_device == ethernet_device
def test_port_remove_nio_binding(vm): nio = VPCS.instance().create_nio({ "type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1" }) vm.port_add_nio_binding(0, nio) vm.port_remove_nio_binding(0) assert vm._ethernet_adapter.ports[0] is None
def update_nio(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) nio = vm.ethernet_adapter.get_nio(int(request.match_info["port_number"])) if "filters" in request.json and nio: nio.filters = request.json["filters"] yield from vm.port_update_nio_binding(int(request.match_info["port_number"]), nio) response.set_status(201) response.json(request.json)
def test_get_mac_id_no_id_available(loop, project, port_manager): # Cleanup the VPCS object VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager with pytest.raises(VPCSError): for i in range(0, 256): node_id = str(uuid.uuid4()) loop.run_until_complete(vpcs.create_node("PC {}".format(i), project.id, node_id)) assert vpcs.get_mac_id(node_id) == i
async def test_add_nio_binding_udp(vm): nio = VPCS.instance().create_nio({ "type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1", "filters": {} }) await vm.port_add_nio_binding(0, nio) assert nio.lport == 4242
def create_nio(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) nio_type = request.json["type"] if nio_type not in ("nio_udp", "nio_tap"): raise HTTPConflict(text="NIO of type {} is not supported".format(nio_type)) nio = vpcs_manager.create_nio(request.json) yield from vm.port_add_nio_binding(int(request.match_info["port_number"]), nio) response.set_status(201) response.json(nio)
def test_get_mac_id_no_id_available(loop, project, port_manager): # Cleanup the VPCS object VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager with pytest.raises(VPCSError): for i in range(0, 256): node_id = str(uuid.uuid4()) loop.run_until_complete( vpcs.create_node("PC {}".format(i), project.id, node_id)) assert vpcs.get_mac_id(node_id) == i
async def update_nio(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) port_number = int(request.match_info["port_number"]) nio = vm.get_nio(port_number) if "filters" in request.json: nio.filters = request.json["filters"] await vm.port_update_nio_binding(port_number, nio) response.set_status(201) response.json(request.json)
def test_get_mac_id_multiple_project(loop, port_manager): # Cleanup the VPCS object VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager vm1_id = str(uuid.uuid4()) vm2_id = str(uuid.uuid4()) vm3_id = str(uuid.uuid4()) project1 = ProjectManager.instance().create_project(project_id=str(uuid.uuid4())) project2 = ProjectManager.instance().create_project(project_id=str(uuid.uuid4())) loop.run_until_complete(vpcs.create_node("PC 1", project1.id, vm1_id)) loop.run_until_complete(vpcs.create_node("PC 2", project1.id, vm2_id)) loop.run_until_complete(vpcs.create_node("PC 2", project2.id, vm3_id)) assert vpcs.get_mac_id(vm1_id) == 0 assert vpcs.get_mac_id(vm2_id) == 1 assert vpcs.get_mac_id(vm3_id) == 0
def test_get_mac_id(loop, project, port_manager): # Cleanup the VPCS object VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager vm1_id = str(uuid.uuid4()) vm2_id = str(uuid.uuid4()) vm3_id = str(uuid.uuid4()) loop.run_until_complete(vpcs.create_node("PC 1", project.id, vm1_id)) loop.run_until_complete(vpcs.create_node("PC 2", project.id, vm2_id)) assert vpcs.get_mac_id(vm1_id) == 0 assert vpcs.get_mac_id(vm1_id) == 0 assert vpcs.get_mac_id(vm2_id) == 1 loop.run_until_complete(vpcs.delete_node(vm1_id)) loop.run_until_complete(vpcs.create_node("PC 3", project.id, vm3_id)) assert vpcs.get_mac_id(vm3_id) == 0
async def test_get_mac_id(compute_project, port_manager): # Cleanup the VPCS object VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager vm1_id = str(uuid.uuid4()) vm2_id = str(uuid.uuid4()) vm3_id = str(uuid.uuid4()) await vpcs.create_node("PC 1", compute_project.id, vm1_id) await vpcs.create_node("PC 2", compute_project.id, vm2_id) assert vpcs.get_mac_id(vm1_id) == 0 assert vpcs.get_mac_id(vm1_id) == 0 assert vpcs.get_mac_id(vm2_id) == 1 await vpcs.delete_node(vm1_id) await vpcs.create_node("PC 3", compute_project.id, vm3_id) assert vpcs.get_mac_id(vm3_id) == 0
def test_get_mac_id_multiple_project(loop, port_manager): # Cleanup the VPCS object VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager vm1_id = str(uuid.uuid4()) vm2_id = str(uuid.uuid4()) vm3_id = str(uuid.uuid4()) project1 = ProjectManager.instance().create_project( project_id=str(uuid.uuid4())) project2 = ProjectManager.instance().create_project( project_id=str(uuid.uuid4())) loop.run_until_complete(vpcs.create_node("PC 1", project1.id, vm1_id)) loop.run_until_complete(vpcs.create_node("PC 2", project1.id, vm2_id)) loop.run_until_complete(vpcs.create_node("PC 2", project2.id, vm3_id)) assert vpcs.get_mac_id(vm1_id) == 0 assert vpcs.get_mac_id(vm2_id) == 1 assert vpcs.get_mac_id(vm3_id) == 0
def suspend(request, response): vpcs_manager = VPCS.instance() vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) response.set_status(204)
def test_add_nio_binding_tap(vm, ethernet_device, loop): with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): nio = VPCS.instance().create_nio({"type": "nio_tap", "tap_device": ethernet_device}) loop.run_until_complete(asyncio.ensure_future(vm.port_add_nio_binding(0, nio))) assert nio.tap_device == ethernet_device
def test_port_remove_nio_binding(vm, loop): nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) loop.run_until_complete(asyncio.ensure_future(vm.port_add_nio_binding(0, nio))) loop.run_until_complete(asyncio.ensure_future(vm.port_remove_nio_binding(0))) assert vm._ethernet_adapter.ports[0] is None
def delete(request, response): yield from VPCS.instance().delete_node(request.match_info["node_id"]) response.set_status(204)
def show(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) response.json(vm)
def test_add_nio_binding_tap(vm, ethernet_device): with patch("gns3server.compute.base_manager.BaseManager.has_privileged_access", return_value=True): nio = VPCS.instance().create_nio({"type": "nio_tap", "tap_device": ethernet_device}) vm.port_add_nio_binding(0, nio) assert nio.tap_device == ethernet_device
def test_add_nio_binding_udp(vm, async_run): nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) async_run(vm.port_add_nio_binding(0, nio)) assert nio.lport == 4242
async def manager(loop, port_manager): m = VPCS.instance() m.port_manager = port_manager return m
async def stop(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) await vm.stop() response.set_status(204)
def manager(port_manager): m = VPCS.instance() m.port_manager = port_manager return m
def reload(request, response): vpcs_manager = VPCS.instance() vm = vpcs_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"]) yield from vm.reload() response.set_status(204)
def test_port_remove_nio_binding(vm): nio = VPCS.instance().create_nio({"type": "nio_udp", "lport": 4242, "rport": 4243, "rhost": "127.0.0.1"}) vm.port_add_nio_binding(0, nio) vm.port_remove_nio_binding(0) assert vm._ethernet_adapter.ports[0] is None
def vpcs(port_manager): VPCS._instance = None vpcs = VPCS.instance() vpcs.port_manager = port_manager return vpcs