diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index b665529e..9bc7f6b6 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -217,7 +217,10 @@ class Controller: topo_data.pop("revision") topo_data.pop("type") - project = yield from self.add_project(path=os.path.dirname(path), status="closed", filename=os.path.basename(path), **topo_data) + if topo_data["project_id"] in self._projects: + project = self._projects[topo_data["project_id"]] + else: + project = yield from self.add_project(path=os.path.dirname(path), status="closed", filename=os.path.basename(path), **topo_data) if load: yield from project.open() return project diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 1dc2efdb..92a50c35 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -337,6 +337,9 @@ class Project: """ Load topology elements """ + if self._status == "opened": + return + self.reset() path = self._topology_file() if os.path.exists(path): diff --git a/tests/conftest.py b/tests/conftest.py index d9703cee..7231ae27 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -242,6 +242,16 @@ def images_dir(config): return path +@pytest.fixture +def projects_dir(config): + """ + Get the location of images + """ + path = config.get_section_config("Server").get("projects_path") + os.makedirs(path, exist_ok=True) + return path + + @pytest.yield_fixture def darwin_platform(): """ diff --git a/tests/controller/test_controller.py b/tests/controller/test_controller.py index 34caa19c..6010280f 100644 --- a/tests/controller/test_controller.py +++ b/tests/controller/test_controller.py @@ -68,6 +68,17 @@ def test_load(controller, controller_config_path, async_run): } +def test_load_projects(controller, projects_dir, async_run): + controller.save() + + os.makedirs(os.path.join(projects_dir, "project1")) + with open(os.path.join(projects_dir, "project1", "project1.gns3"), "w+") as f: + f.write("") + with asyncio_patch("gns3server.controller.Controller.load_project") as mock_load_project: + async_run(controller.load()) + mock_load_project.assert_called_with(os.path.join(projects_dir, "project1", "project1.gns3"), load=False) + + def test_isEnabled(controller): Config.instance().set("Server", "controller", False) assert not controller.is_enabled() @@ -254,3 +265,9 @@ def test_load_project(controller, async_run, tmpdir): node1 = project.get_node("50d66d7b-0dd7-4e9f-b720-6eb621ae6543") assert node1.name == "PC1" + + # Reload the same project should do nothing + with asyncio_patch("gns3server.controller.Controller.add_project") as mock_add_project: + project = async_run(controller.load_project(str(tmpdir / "test.gns3"))) + assert not mock_add_project.called +