mirror of
https://github.com/GNS3/gns3-server.git
synced 2024-12-22 14:12:29 +00:00
Merge pull request #1148 from GNS3/fix_include_images
This fix the images always included in portable project
This commit is contained in:
commit
2e68c90e25
@ -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'
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user