diff --git a/gns3server/controller/__init__.py b/gns3server/controller/__init__.py index bd10c27a..e449ed75 100644 --- a/gns3server/controller/__init__.py +++ b/gns3server/controller/__init__.py @@ -89,6 +89,23 @@ class Controller: for c in data["computes"]: yield from self.add_compute(**c) + # Preload the list of projects from disk + server_config = Config.instance().get_section_config("Server") + projects_path = os.path.expanduser(server_config.get("projects_path", "~/GNS3/projects")) + try: + for project_path in os.listdir(projects_path): + project_dir = os.path.join(projects_path, project_path) + if os.path.isdir(project_dir): + for file in os.listdir(project_dir): + if file.endswith(".gns3"): + try: + yield from self.load_project(os.path.join(project_dir, file), load=False) + except aiohttp.web_exceptions.HTTPConflict: + pass # Skip not compatible projects + except OSError as e: + log.error(str(e)) + + def is_enabled(self): """ :returns: whether the current instance is the controller @@ -187,11 +204,12 @@ class Controller: del self._projects[project.id] @asyncio.coroutine - def load_project(self, path): + def load_project(self, path, load=True): """ Load a project from a .gns3 :param path: Path of the .gns3 + :param load: Load the topology """ topo_data = load_topology(path) topology = topo_data.pop("topology") @@ -199,8 +217,9 @@ class Controller: topo_data.pop("revision") topo_data.pop("type") - project = yield from self.add_project(path=os.path.dirname(path), **topo_data) - yield from project.load() + project = yield from self.add_project(path=os.path.dirname(path), status="closed", **topo_data) + if load: + yield from project.load() @property def projects(self): diff --git a/gns3server/controller/project.py b/gns3server/controller/project.py index 696b8603..f524addf 100644 --- a/gns3server/controller/project.py +++ b/gns3server/controller/project.py @@ -40,12 +40,14 @@ class Project: :param project_id: force project identifier (None by default auto generate an UUID) :param path: path of the project. (None use the standard directory) + :param status: Status of the project (opened / closed) """ - def __init__(self, name=None, project_id=None, path=None, controller=None): + def __init__(self, name=None, project_id=None, path=None, controller=None, status="opened"): self._controller = controller self._name = name + self._status = status if project_id is None: self._id = str(uuid4()) else: @@ -82,6 +84,10 @@ class Project: def path(self): return self._path + @property + def status(self): + return self._status + @path.setter def path(self, path): check_path_allowed(path) @@ -355,5 +361,6 @@ class Project: return { "name": self._name, "project_id": self._id, - "path": self._path + "path": self._path, + "status": "opened" } diff --git a/gns3server/schemas/project.py b/gns3server/schemas/project.py index e6462182..9988d453 100644 --- a/gns3server/schemas/project.py +++ b/gns3server/schemas/project.py @@ -81,6 +81,10 @@ PROJECT_OBJECT_SCHEMA = { "description": "Project directory", "type": ["string", "null"], "minLength": 1 + }, + "status": { + "description": "Project status Read only", + "enum": ["opened", "closed"] } }, "additionalProperties": False, diff --git a/gns3server/templates/controller.html b/gns3server/templates/controller.html index 632cdade..225eeda1 100644 --- a/gns3server/templates/controller.html +++ b/gns3server/templates/controller.html @@ -7,11 +7,12 @@ The purpose of this page is to help for GNS3 debug. This can be dropped in futur GNS3 versions. -

Opened projects

+

Projects

- + @@ -19,6 +20,7 @@ in futur GNS3 versions. + diff --git a/tests/controller/test_project.py b/tests/controller/test_project.py index 70fd0909..54420c1f 100644 --- a/tests/controller/test_project.py +++ b/tests/controller/test_project.py @@ -43,7 +43,7 @@ def test_affect_uuid(): def test_json(tmpdir): p = Project() - assert p.__json__() == {"name": p.name, "project_id": p.id, "path": p.path} + assert p.__json__() == {"name": p.name, "project_id": p.id, "path": p.path, "status": "opened"} def test_path(tmpdir):
NameID + IDStatus Nodes Links
{{project.name}} {{project.id}}{{project.status}} {{project.nodes|length}} {{project.links|length}}