Check topology schema when loading/saving it

Fix #583
This commit is contained in:
Julien Duponchelle committed 2016-07-11 15:36:52 +02:00
1 parent 1f2ce48fc8
commit 91ec61b88d
18 files changed
+183 -58

No files matched your search

+2
View File
@@ -43,6 +43,8 @@ class Node:
:param kwargs: Node properties
"""
assert node_type
if node_id is None:
self._id = str(uuid.uuid4())
else:
+2 -3
View File
@@ -47,6 +47,7 @@ class Project:
def __init__(self, name=None, project_id=None, path=None, controller=None, status="opened", filename=None):
self._controller = controller
assert name is not None
self._name = name
self._status = status
if project_id is None:
@@ -62,9 +63,7 @@ class Project:
path = os.path.join(get_default_project_directory(), self._id)
self.path = path
if filename is None and name is None:
self._filename = "project.gns3"
elif filename is not None:
if filename is not None:
self._filename = filename
else:
self._filename = self.name + ".gns3"
+19 -2
View File
@@ -16,13 +16,30 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import json
import jsonschema
import aiohttp
from ..version import __version__
from ..schemas.topology import TOPOLOGY_SCHEMA
import logging
log = logging.getLogger(__name__)
GNS3_FILE_FORMAT_REVISION = 5
def _check_topology_schema(topo):
try:
jsonschema.validate(topo, TOPOLOGY_SCHEMA)
except jsonschema.ValidationError as e:
error = "Invalid data in topology file: {} in schema: {}".format(
e.message,
json.dumps(e.schema))
log.critical(error)
raise aiohttp.web.HTTPConflict(text=error)
def project_to_topology(project):
"""
:return: A dictionnary with the topology ready to dump to a .gns3
@@ -52,7 +69,7 @@ def project_to_topology(project):
for compute in computes:
if hasattr(compute, "__json__"):
data["topology"]["computes"].append(compute.__json__(topology_dump=True))
#TODO: check JSON schema
_check_topology_schema(data)
return data
@@ -65,7 +82,7 @@ def load_topology(path):
topo = json.load(f)
except OSError as e:
raise aiohttp.web.HTTPConflict(text="Could not load topology {}: {}".format(path, str(e)))
#TODO: Check JSON schema
if topo["revision"] < GNS3_FILE_FORMAT_REVISION:
raise aiohttp.web.HTTPConflict(text="Old GNS3 project are not yet supported")
_check_topology_schema(topo)
return topo