1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-12-26 00:38:10 +00:00

Disallow export of running topologies

This commit is contained in:
Julien Duponchelle 2016-07-21 09:45:02 +02:00
parent e557ccd078
commit 14f6bd60fb
No known key found for this signature in database
GPG Key ID: CE8B29639E07F5E8
2 changed files with 63 additions and 2 deletions

View File

@ -438,6 +438,11 @@ class Project:
:returns: ZipStream object :returns: ZipStream object
""" """
# To avoid issue with data not saved we disallow the export of a running topologie
if self.is_running():
raise aiohttp.web.HTTPConflict(text="Running topology could not be exported")
z = zipstream.ZipFile() z = zipstream.ZipFile()
# First we process the .gns3 in order to be sure we don't have an error # First we process the .gns3 in order to be sure we don't have an error
@ -522,12 +527,20 @@ class Project:
else: else:
path = os.path.join(img_directory, image) path = os.path.join(img_directory, image)
# FIXME: av
if os.path.exists(path): if os.path.exists(path):
arcname = os.path.join("images", directory, os.path.basename(image)) arcname = os.path.join("images", directory, os.path.basename(image))
z.write(path, arcname) z.write(path, arcname)
break break
def is_running(self):
"""
If a node is started or paused return True
"""
for node in self._nodes.values():
if node.status != "stopped":
return True
return False
def dump(self): def dump(self):
""" """
Dump topology to disk Dump topology to disk

View File

@ -36,6 +36,19 @@ def project(controller):
return Project(controller=controller, name="Test") return Project(controller=controller, name="Test")
@pytest.fixture
def node(controller, project, async_run):
compute = MagicMock()
compute.id = "local"
response = MagicMock()
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
node = async_run(project.add_node(compute, "test", None, node_type="vpcs", properties={"startup_config": "test.cfg"}))
return node
def test_affect_uuid(): def test_affect_uuid():
p = Project(name="Test") p = Project(name="Test")
assert len(p.id) == 36 assert len(p.id) == 36
@ -351,9 +364,34 @@ def test_export(tmpdir, project):
assert 'vm-1/dynamips/test_log.txt' not in myzip.namelist() assert 'vm-1/dynamips/test_log.txt' not in myzip.namelist()
def test_export_disallow_running(tmpdir, project, node):
"""
Dissallow export when a node is running
"""
path = project.path
topology = {
"topology": {
"nodes": [
{
"node_type": "dynamips"
}
]
}
}
with open(os.path.join(path, "test.gns3"), 'w+') as f:
json.dump(topology, f)
node._status = "started"
with pytest.raises(aiohttp.web.HTTPConflict):
z = project.export()
def test_export_disallow_some_type(tmpdir, project): def test_export_disallow_some_type(tmpdir, project):
""" """
Fix absolute image path Dissalow export for some node type
""" """
path = project.path path = project.path
@ -444,3 +482,13 @@ def test_export_with_images(tmpdir, project):
with zipfile.ZipFile(str(tmpdir / 'zipfile.zip')) as myzip: with zipfile.ZipFile(str(tmpdir / 'zipfile.zip')) as myzip:
myzip.getinfo("images/IOS/test.image") myzip.getinfo("images/IOS/test.image")
def test_is_running(project, async_run, node):
"""
If a node is started or paused return True
"""
assert project.is_running() is False
node._status = "started"
assert project.is_running() is True