Project status (opened / closed)

This commit is contained in:
Julien Duponchelle 2016-06-14 23:08:30 +02:00
parent 0569480953
commit 524f8991bc
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
5 changed files with 40 additions and 8 deletions

View File

@ -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,7 +217,8 @@ class Controller:
topo_data.pop("revision")
topo_data.pop("type")
project = yield from self.add_project(path=os.path.dirname(path), **topo_data)
project = yield from self.add_project(path=os.path.dirname(path), status="closed", **topo_data)
if load:
yield from project.load()
@property

View File

@ -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"
}

View File

@ -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,

View File

@ -7,11 +7,12 @@
The purpose of this page is to help for GNS3 debug. This can be dropped
in futur GNS3 versions.
<h2>Opened projects</h2>
<h2>Projects</h2>
<table border="1">
<tr>
<th>Name</th>
<th>ID</td>
<th>ID</th>
<th>Status</th>
<th>Nodes</th>
<th>Links</th>
</tr>
@ -19,6 +20,7 @@ in futur GNS3 versions.
<tr>
<td><a href="/projects/{{project.id}}">{{project.name}}</a></td>
<td><a href="/projects/{{project.id}}">{{project.id}}</a></td>
<td>{{project.status}}</td>
<td>{{project.nodes|length}}</td>
<td>{{project.links|length}}</td>
</tr>

View File

@ -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):