diff --git a/gns3server/modules/iou/iou_vm.py b/gns3server/modules/iou/iou_vm.py index 36e2e7c0..0ccbf376 100644 --- a/gns3server/modules/iou/iou_vm.py +++ b/gns3server/modules/iou/iou_vm.py @@ -345,6 +345,10 @@ class IOUVM(BaseVM): Checks for a valid IOU key in the iourc file (paranoid mode). """ + license_check = self._manager.config.get_section_config("IOU").getboolean("license_check", False) + if license_check: + return + config = configparser.ConfigParser() try: with open(self.iourc_path) as f: @@ -401,10 +405,7 @@ class IOUVM(BaseVM): if iourc_path and not os.path.isfile(iourc_path): raise IOUError("A valid iourc file is necessary to start IOU") - license_check = self._manager.config.get_section_config("IOU").getboolean("license_check", False) - if license_check: - yield from self._check_iou_licence() - + yield from self._check_iou_licence() iouyap_path = self.iouyap_path if not iouyap_path or not os.path.isfile(iouyap_path): raise IOUError("iouyap is necessary to start IOU") diff --git a/gns3server/modules/virtualbox/virtualbox_vm.py b/gns3server/modules/virtualbox/virtualbox_vm.py index d8c29afe..83dc86d3 100644 --- a/gns3server/modules/virtualbox/virtualbox_vm.py +++ b/gns3server/modules/virtualbox/virtualbox_vm.py @@ -155,7 +155,8 @@ class VirtualBoxVM(BaseVM): yield from self.set_adapters(self._adapters) vm_info = yield from self._get_vm_info() - self._ram = int(vm_info["memory"]) + if "memory" in vm_info: + self._ram = int(vm_info["memory"]) @asyncio.coroutine def start(self): diff --git a/gns3server/schemas/project.py b/gns3server/schemas/project.py index 38bea4c0..3e9dfa6d 100644 --- a/gns3server/schemas/project.py +++ b/gns3server/schemas/project.py @@ -53,7 +53,7 @@ PROJECT_UPDATE_SCHEMA = { "properties": { "name": { "description": "Project name", - "type": "string", + "type": ["string", "null"], "minLength": 1 }, "temporary": { diff --git a/tests/handlers/api/test_project.py b/tests/handlers/api/test_project.py index 659c78a8..cd0bc419 100644 --- a/tests/handlers/api/test_project.py +++ b/tests/handlers/api/test_project.py @@ -25,44 +25,49 @@ from tests.utils import asyncio_patch def test_create_project_with_path(server, tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): - response = server.post("/projects", {"path": str(tmpdir)}) + with patch("gns3server.modules.project.Project.is_local", return_value=True): + response = server.post("/projects", {"name": "test", "path": str(tmpdir)}) assert response.status == 201 assert response.json["path"] == str(tmpdir) + assert response.json["name"] == "test" def test_create_project_without_dir(server): - query = {} + query = {"name": "test"} response = server.post("/projects", query, example=True) assert response.status == 201 assert response.json["project_id"] is not None assert response.json["temporary"] is False + assert response.json["name"] == "test" def test_create_temporary_project(server): - query = {"temporary": True} + query = {"name": "test", "temporary": True} response = server.post("/projects", query) assert response.status == 201 assert response.json["project_id"] is not None assert response.json["temporary"] is True + assert response.json["name"] == "test" def test_create_project_with_uuid(server): - query = {"project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"} + query = {"name": "test", "project_id": "00010203-0405-0607-0809-0a0b0c0d0e0f"} response = server.post("/projects", query) assert response.status == 201 assert response.json["project_id"] == "00010203-0405-0607-0809-0a0b0c0d0e0f" + assert response.json["name"] == "test" def test_show_project(server): - query = {"project_id": "00010203-0405-0607-0809-0a0b0c0d0e02", "temporary": False} + query = {"name": "test", "project_id": "00010203-0405-0607-0809-0a0b0c0d0e02", "temporary": False} response = server.post("/projects", query) assert response.status == 201 response = server.get("/projects/00010203-0405-0607-0809-0a0b0c0d0e02", example=True) - assert len(response.json.keys()) == 4 + assert len(response.json.keys()) == 5 assert len(response.json["location"]) > 0 assert response.json["project_id"] == "00010203-0405-0607-0809-0a0b0c0d0e02" assert response.json["temporary"] is False + assert response.json["name"] == "test" def test_show_project_invalid_uuid(server): @@ -71,10 +76,10 @@ def test_show_project_invalid_uuid(server): def test_update_temporary_project(server): - query = {"temporary": True} + query = {"name": "test", "temporary": True} response = server.post("/projects", query) assert response.status == 201 - query = {"temporary": False} + query = {"name": "test", "temporary": False} response = server.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 200 assert response.json["temporary"] is False @@ -82,21 +87,23 @@ def test_update_temporary_project(server): def test_update_path_project(server, tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): - response = server.post("/projects", {}) + with patch("gns3server.modules.project.Project.is_local", return_value=True): + response = server.post("/projects", {"name": "first_name"}) assert response.status == 201 - query = {"path": str(tmpdir)} + assert response.json["name"] == "first_name" + query = {"name": "second_name", "path": str(tmpdir)} response = server.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 200 assert response.json["path"] == str(tmpdir) + assert response.json["name"] == "second_name" def test_update_path_project_non_local(server, tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": False}): - response = server.post("/projects", {}) + with patch("gns3server.modules.project.Project.is_local", return_value=False): + response = server.post("/projects", {"name": "first_name"}) assert response.status == 201 - query = {"path": str(tmpdir)} + query = {"name": "second_name", "path": str(tmpdir)} response = server.put("/projects/{project_id}".format(project_id=response.json["project_id"]), query, example=True) assert response.status == 403 diff --git a/tests/modules/dynamips/test_dynamips_router.py b/tests/modules/dynamips/test_dynamips_router.py index 48b76536..de5fb99d 100644 --- a/tests/modules/dynamips/test_dynamips_router.py +++ b/tests/modules/dynamips/test_dynamips_router.py @@ -44,10 +44,7 @@ def test_router(project, manager): def test_router_invalid_dynamips_path(project, manager, loop): - config = configparser.ConfigParser() - config.add_section("Dynamips") - config.set("Dynamips", "dynamips_path", "/bin/test_fake") - with patch("gns3server.config.Config", return_value=config): + with patch("gns3server.config.Config.get_section_config", return_value={"dynamips_path": "/bin/test_fake"}): with pytest.raises(DynamipsError): router = Router("test", "00010203-0405-0607-0809-0a0b0c0d0e0e", project, manager) loop.run_until_complete(asyncio.async(router.create())) diff --git a/tests/modules/iou/test_iou_vm.py b/tests/modules/iou/test_iou_vm.py index ced8f49c..a6ab2ab6 100644 --- a/tests/modules/iou/test_iou_vm.py +++ b/tests/modules/iou/test_iou_vm.py @@ -85,11 +85,12 @@ def test_vm_invalid_iouyap_path(project, manager, loop): def test_start(loop, vm, monkeypatch): with patch("gns3server.modules.iou.iou_vm.IOUVM._check_requirements", return_value=True): - with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_ioucon", return_value=True): - with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_iouyap", return_value=True): - with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()): - loop.run_until_complete(asyncio.async(vm.start())) - assert vm.is_running() + with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._check_iou_licence", return_value=True): + with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_ioucon", return_value=True): + with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_iouyap", return_value=True): + with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()): + loop.run_until_complete(asyncio.async(vm.start())) + assert vm.is_running() def test_start_with_iourc(loop, vm, monkeypatch, tmpdir): @@ -100,13 +101,14 @@ def test_start_with_iourc(loop, vm, monkeypatch, tmpdir): with patch("gns3server.config.Config.get_section_config", return_value={"iourc_path": fake_file, "iouyap_path": vm.iouyap_path}): with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._check_requirements", return_value=True): - with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_ioucon", return_value=True): - with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_iouyap", return_value=True): - with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()) as exec_mock: - loop.run_until_complete(asyncio.async(vm.start())) - assert vm.is_running() - arsgs, kwargs = exec_mock.call_args - assert kwargs["env"]["IOURC"] == fake_file + with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._check_iou_licence", return_value=True): + with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_ioucon", return_value=True): + with asyncio_patch("gns3server.modules.iou.iou_vm.IOUVM._start_iouyap", return_value=True): + with asyncio_patch("asyncio.create_subprocess_exec", return_value=MagicMock()) as exec_mock: + loop.run_until_complete(asyncio.async(vm.start())) + assert vm.is_running() + arsgs, kwargs = exec_mock.call_args + assert kwargs["env"]["IOURC"] == fake_file def test_rename_nvram_file(loop, vm, monkeypatch): diff --git a/tests/modules/test_manager.py b/tests/modules/test_manager.py index 5efa1e33..81a2ddf0 100644 --- a/tests/modules/test_manager.py +++ b/tests/modules/test_manager.py @@ -60,7 +60,7 @@ def test_create_vm_new_topology_without_uuid(loop, project, port_manager): def test_create_vm_old_topology(loop, project, tmpdir, port_manager): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): + with patch("gns3server.modules.project.Project.is_local", return_value=True): # Create an old topology directory project_dir = str(tmpdir / "testold") vm_dir = os.path.join(project_dir, "testold-files", "vpcs", "pc-1") diff --git a/tests/modules/test_project.py b/tests/modules/test_project.py index 7fdaf487..60ec1765 100644 --- a/tests/modules/test_project.py +++ b/tests/modules/test_project.py @@ -20,7 +20,6 @@ import os import asyncio import pytest import aiohttp -import shutil from uuid import uuid4 from unittest.mock import patch @@ -51,7 +50,7 @@ def test_affect_uuid(): def test_path(tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): + with patch("gns3server.modules.project.Project.is_local", return_value=True): p = Project(location=str(tmpdir)) assert p.path == os.path.join(str(tmpdir), p.id) assert os.path.exists(os.path.join(str(tmpdir), p.id)) @@ -60,14 +59,14 @@ def test_path(tmpdir): def test_init_path(tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): + with patch("gns3server.modules.project.Project.is_local", return_value=True): p = Project(path=str(tmpdir)) assert p.path == str(tmpdir) def test_changing_path_temporary_flag(tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): + with patch("gns3server.modules.project.Project.is_local", return_value=True): p = Project(temporary=True) assert os.path.exists(p.path) assert os.path.exists(os.path.join(p.path, ".gns3_temporary")) @@ -96,13 +95,13 @@ def test_remove_temporary_flag(): def test_changing_location_not_allowed(tmpdir): - with patch("gns3server.config.Config.get_section_config", return_value={"local": False}): + with patch("gns3server.modules.project.Project.is_local", return_value=False): with pytest.raises(aiohttp.web.HTTPForbidden): p = Project(location=str(tmpdir)) def test_changing_path_not_allowed(tmpdir): - with patch("gns3server.config.Config.getboolean", return_value=False): + with patch("gns3server.modules.project.Project.is_local", return_value=False): with pytest.raises(aiohttp.web.HTTPForbidden): p = Project() p.path = str(tmpdir) @@ -110,11 +109,11 @@ def test_changing_path_not_allowed(tmpdir): def test_json(tmpdir): p = Project() - assert p.__json__() == {"location": p.location, "path": p.path, "project_id": p.id, "temporary": False} + assert p.__json__() == {"name": p.name, "location": p.location, "path": p.path, "project_id": p.id, "temporary": False} def test_vm_working_directory(tmpdir, vm): - with patch("gns3server.config.Config.get_section_config", return_value={"local": True}): + with patch("gns3server.modules.project.Project.is_local", return_value=True): p = Project(location=str(tmpdir)) assert p.vm_working_directory(vm) == os.path.join(str(tmpdir), p.id, 'project-files', vm.module_name, vm.id) assert os.path.exists(p.vm_working_directory(vm))