diff --git a/gns3server/config.py b/gns3server/config.py index f2ef0353..4dfefbcf 100644 --- a/gns3server/config.py +++ b/gns3server/config.py @@ -122,6 +122,17 @@ class Config(object): return self._config["DEFAULT"] return self._config[section] + def set_section_config(self, section, content): + """ + Set a specific configuration section. It's not + dumped on the disk. + + :param section: Section name + :param content: A dictonary with section content + """ + + self._config[section] = content + @staticmethod def instance(): """ diff --git a/gns3server/modules/project.py b/gns3server/modules/project.py index aceb2a2b..e6de01c5 100644 --- a/gns3server/modules/project.py +++ b/gns3server/modules/project.py @@ -44,11 +44,11 @@ class Project: raise aiohttp.web.HTTPBadRequest(text="{} is not a valid UUID".format(uuid)) self._uuid = uuid + config = Config.instance().get_section_config("Server") self._location = location if location is None: - self._location = tempfile.mkdtemp() + self._location = config.get("project_directory", self._get_default_project_directory()) else: - config = Config.instance().get_section_config("Server") if config.get("local", False) is False: raise aiohttp.web.HTTPForbidden(text="You are not allowed to modifiy the project directory location") @@ -61,6 +61,19 @@ class Project: except OSError as e: raise aiohttp.web.HTTPInternalServerError(text="Could not create project directory: {}".format(e)) + def _get_default_project_directory(self): + """ + Return the default location for the project directory + depending of the operating system + """ + + path = os.path.normpath(os.path.expanduser("~/GNS3/projects")) + try: + os.makedirs(path, exist_ok=True) + except OSError as e: + raise aiohttp.web.HTTPInternalServerError(text="Could not create project directory: {}".format(e)) + return path + @property def uuid(self): diff --git a/tests/conftest.py b/tests/conftest.py index 1a80a456..41682bb3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -18,7 +18,11 @@ import pytest import socket import asyncio +import tempfile +import shutil from aiohttp import web + +from gns3server.config import Config from gns3server.web.route import Route # TODO: get rid of * from gns3server.handlers import * @@ -100,3 +104,17 @@ def free_console_port(request, port_manager): # the test do whatever the test want port_manager.release_console_port(port) return port + + +@pytest.yield_fixture(autouse=True) +def run_around_tests(): + tmppath = tempfile.mkdtemp() + + config = Config.instance() + server_section = config.get_section_config("Server") + server_section["project_directory"] = tmppath + config.set_section_config("Server", server_section) + + yield + + shutil.rmtree(tmppath) diff --git a/tests/modules/test_project.py b/tests/modules/test_project.py index bc93b04c..ee20d306 100644 --- a/tests/modules/test_project.py +++ b/tests/modules/test_project.py @@ -130,3 +130,11 @@ def test_project_close_temporary_project(manager): assert os.path.exists(directory) project.close() assert os.path.exists(directory) is False + + +def test_get_default_project_directory(): + + project = Project() + path = os.path.normpath(os.path.expanduser("~/GNS3/projects")) + assert project._get_default_project_directory() == path + assert os.path.exists(path)