Merge pull request #1148 from GNS3/fix_include_images

This fix the images always included in portable project
This commit is contained in:
Jeremy Grossmann 2017-07-26 23:14:15 +08:00 committed by GitHub
commit 2e68c90e25
3 changed files with 84 additions and 6 deletions

View File

@ -284,7 +284,9 @@ class ProjectHandler:
try: try:
with tempfile.TemporaryDirectory() as tmp_dir: with tempfile.TemporaryDirectory() as tmp_dir:
datas = yield from export_project(project, tmp_dir, include_images=bool(request.get("include_images", "0"))) datas = yield from export_project(
project, tmp_dir,
include_images=bool(int(request.query.get("include_images", "0"))))
# We need to do that now because export could failed and raise an HTTP error # We need to do that now because export could failed and raise an HTTP error
# that why response start need to be the later possible # that why response start need to be the later possible
response.content_type = 'application/gns3project' response.content_type = 'application/gns3project'

View File

@ -64,6 +64,10 @@ def test_export(tmpdir, project, async_run):
path = project.path path = project.path
os.makedirs(os.path.join(path, "vm-1", "dynamips")) os.makedirs(os.path.join(path, "vm-1", "dynamips"))
os.makedirs(str(tmpdir / "IOS"))
with open(str(tmpdir / "IOS" / "test.image"), "w+") as f:
f.write("AAA")
# The .gns3 should be renamed project.gns3 in order to simplify import # The .gns3 should be renamed project.gns3 in order to simplify import
with open(os.path.join(path, "test.gns3"), 'w+') as f: with open(os.path.join(path, "test.gns3"), 'w+') as f:
data = { data = {
@ -80,7 +84,10 @@ def test_export(tmpdir, project, async_run):
"nodes": [ "nodes": [
{ {
"compute_id": "6b7149c8-7d6e-4ca0-ab6b-daa8ab567be0", "compute_id": "6b7149c8-7d6e-4ca0-ab6b-daa8ab567be0",
"node_type": "vpcs" "node_type": "dynamips",
"properties": {
"image": "test.image"
}
} }
] ]
} }
@ -95,7 +102,8 @@ def test_export(tmpdir, project, async_run):
with open(os.path.join(path, "project-files", "snapshots", "test"), 'w+') as f: with open(os.path.join(path, "project-files", "snapshots", "test"), 'w+') as f:
f.write("WORLD") f.write("WORLD")
z = async_run(export_project(project, str(tmpdir))) with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),):
z = async_run(export_project(project, str(tmpdir), include_images=False))
with open(str(tmpdir / 'zipfile.zip'), 'wb') as f: with open(str(tmpdir / 'zipfile.zip'), 'wb') as f:
for data in z: for data in z:
@ -111,6 +119,8 @@ def test_export(tmpdir, project, async_run):
assert 'project-files/snapshots/test' not in myzip.namelist() assert 'project-files/snapshots/test' not in myzip.namelist()
assert 'vm-1/dynamips/test_log.txt' not in myzip.namelist() assert 'vm-1/dynamips/test_log.txt' not in myzip.namelist()
assert 'images/IOS/test.image' not in myzip.namelist()
with myzip.open("project.gns3") as myfile: with myzip.open("project.gns3") as myfile:
topo = json.loads(myfile.read().decode())["topology"] topo = json.loads(myfile.read().decode())["topology"]
assert topo["nodes"][0]["compute_id"] == "local" # All node should have compute_id local after export assert topo["nodes"][0]["compute_id"] == "local" # All node should have compute_id local after export

View File

@ -28,7 +28,7 @@ import zipfile
import json import json
from unittest.mock import patch from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch from tests.utils import asyncio_patch
from gns3server.handlers.api.controller.project_handler import ProjectHandler from gns3server.handlers.api.controller.project_handler import ProjectHandler
@ -170,13 +170,34 @@ def test_notification_ws(http_controller, controller, project, async_run):
assert project.status == "opened" assert project.status == "opened"
def test_export(http_controller, tmpdir, loop, project): def test_export_with_images(http_controller, tmpdir, loop, project):
project.dump = MagicMock()
os.makedirs(project.path, exist_ok=True) os.makedirs(project.path, exist_ok=True)
with open(os.path.join(project.path, 'a'), 'w+') as f: with open(os.path.join(project.path, 'a'), 'w+') as f:
f.write('hello') f.write('hello')
response = http_controller.get("/projects/{project_id}/export".format(project_id=project.id), raw=True) os.makedirs(str(tmpdir / "IOS"))
with open(str(tmpdir / "IOS" / "test.image"), "w+") as f:
f.write("AAA")
topology = {
"topology": {
"nodes": [
{
"properties": {
"image": "test.image"
},
"node_type": "dynamips"
}
]
}
}
with open(os.path.join(project.path, "test.gns3"), 'w+') as f:
json.dump(topology, f)
with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),):
response = http_controller.get("/projects/{project_id}/export?include_images=1".format(project_id=project.id), raw=True)
assert response.status == 200 assert response.status == 200
assert response.headers['CONTENT-TYPE'] == 'application/gns3project' assert response.headers['CONTENT-TYPE'] == 'application/gns3project'
assert response.headers['CONTENT-DISPOSITION'] == 'attachment; filename="{}.gns3project"'.format(project.name) assert response.headers['CONTENT-DISPOSITION'] == 'attachment; filename="{}.gns3project"'.format(project.name)
@ -188,6 +209,51 @@ def test_export(http_controller, tmpdir, loop, project):
with myzip.open("a") as myfile: with myzip.open("a") as myfile:
content = myfile.read() content = myfile.read()
assert content == b"hello" assert content == b"hello"
myzip.getinfo("images/IOS/test.image")
def test_export_without_images(http_controller, tmpdir, loop, project):
project.dump = MagicMock()
os.makedirs(project.path, exist_ok=True)
with open(os.path.join(project.path, 'a'), 'w+') as f:
f.write('hello')
os.makedirs(str(tmpdir / "IOS"))
with open(str(tmpdir / "IOS" / "test.image"), "w+") as f:
f.write("AAA")
topology = {
"topology": {
"nodes": [
{
"properties": {
"image": "test.image"
},
"node_type": "dynamips"
}
]
}
}
with open(os.path.join(project.path, "test.gns3"), 'w+') as f:
json.dump(topology, f)
with patch("gns3server.compute.Dynamips.get_images_directory", return_value=str(tmpdir / "IOS"),):
response = http_controller.get("/projects/{project_id}/export?include_images=0".format(project_id=project.id), raw=True)
assert response.status == 200
assert response.headers['CONTENT-TYPE'] == 'application/gns3project'
assert response.headers['CONTENT-DISPOSITION'] == 'attachment; filename="{}.gns3project"'.format(project.name)
with open(str(tmpdir / 'project.zip'), 'wb+') as f:
f.write(response.body)
with zipfile.ZipFile(str(tmpdir / 'project.zip')) as myzip:
with myzip.open("a") as myfile:
content = myfile.read()
assert content == b"hello"
# Image should not exported
with pytest.raises(KeyError):
myzip.getinfo("images/IOS/test.image")
def test_get_file(http_controller, tmpdir, loop, project): def test_get_file(http_controller, tmpdir, loop, project):