Auto upload missing images

This commit is contained in:
Julien Duponchelle committed 2016-06-07 19:38:01 +02:00
1 parent 972cbd0594
commit 08e482004f
15 files changed
+194 -65

No files matched your search

-22
View File
@@ -88,28 +88,6 @@ def test_create_node_old_topology(loop, project, tmpdir, vpcs):
assert f.read() == "1"
def test_images_directories(qemu, tmpdir):
path1 = tmpdir / "images1" / "QEMU" / "test1.bin"
path1.write("1", ensure=True)
path1 = force_unix_path(str(path1))
path2 = tmpdir / "images2" / "test2.bin"
path2.write("1", ensure=True)
path2 = force_unix_path(str(path2))
with patch("gns3server.config.Config.get_section_config", return_value={
"images_path": str(tmpdir / "images1"),
"additional_images_path": "/tmp/null24564:{}".format(tmpdir / "images2"),
"local": False}):
# /tmp/null24564 is ignored because doesn't exists
res = qemu.images_directories()
assert res[0] == str(tmpdir / "images1" / "QEMU")
assert res[1] == str(tmpdir / "images2")
assert res[2] == str(tmpdir / "images1")
assert len(res) == 3
def test_get_abs_image_path(qemu, tmpdir):
os.makedirs(str(tmpdir / "QEMU"))
path1 = force_unix_path(str(tmpdir / "test1.bin"))
+13 -3
View File
@@ -23,7 +23,7 @@ import asyncio
from unittest.mock import patch, MagicMock
from gns3server.controller.project import Project
from gns3server.controller.compute import Compute, ComputeError
from gns3server.controller.compute import Compute, ComputeError, ComputeConflict
from gns3server.version import __version__
from tests.utils import asyncio_patch, AsyncioMagicMock
@@ -139,9 +139,19 @@ def test_compute_httpQueryNotConnectedNonGNS3Server2(compute, async_run):
def test_compute_httpQueryError(compute, async_run):
response = MagicMock()
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
response.status = 409
response.status = 404
with pytest.raises(aiohttp.web.HTTPConflict):
with pytest.raises(aiohttp.web.HTTPNotFound):
async_run(compute.post("/projects", {"a": "b"}))
def test_compute_httpQueryConflictError(compute, async_run):
response = MagicMock()
with asyncio_patch("aiohttp.ClientSession.request", return_value=response) as mock:
response.status = 409
response.read = AsyncioMagicMock(return_value=b'{"message": "Test"}')
with pytest.raises(ComputeConflict):
async_run(compute.post("/projects", {"a": "b"}))
+38 -2
View File
@@ -18,7 +18,8 @@
import pytest
import uuid
import asyncio
from unittest.mock import MagicMock
import os
from unittest.mock import MagicMock, ANY
from tests.utils import AsyncioMagicMock
@@ -77,7 +78,7 @@ def test_create(node, compute, project, async_run):
response.json = {"console": 2048}
compute.post = AsyncioMagicMock(return_value=response)
async_run(node.create())
assert async_run(node.create()) is True
data = {
"console": 2048,
"console_type": "vnc",
@@ -90,6 +91,28 @@ def test_create(node, compute, project, async_run):
assert node._properties == {"startup_script": "echo test"}
def test_create_image_missing(node, compute, project, async_run):
node._console = 2048
node.__calls = 0
@asyncio.coroutine
def resp(*args, **kwargs):
node.__calls += 1
response = MagicMock()
if node.__calls == 1:
response.status = 409
response.json = {"image": "linux.img", "exception": "ImageMissingError"}
else:
response.status = 200
return response
compute.post = AsyncioMagicMock(side_effect=resp)
node._upload_missing_image = AsyncioMagicMock(return_value=True)
assert async_run(node.create()) is True
node._upload_missing_image.called is True
def test_update(node, compute, project, async_run):
response = MagicMock()
response.json = {"console": 2048}
@@ -193,3 +216,16 @@ def test_dynamips_idlepc_proposals(node, async_run, compute):
async_run(node.dynamips_idlepc_proposals())
compute.get.assert_called_with("/projects/{}/dynamips/nodes/{}/idlepc_proposals".format(node.project.id, node.id), timeout=240)
def test_upload_missing_image(compute, controller, async_run, images_dir):
project = Project(str(uuid.uuid4()), controller=controller)
node = Node(project, compute,
name="demo",
node_id=str(uuid.uuid4()),
node_type="qemu",
properties={"hda_disk_image": "linux.img"})
open(os.path.join(images_dir, "linux.img"), 'w+').close()
assert async_run(node._upload_missing_image("qemu", "linux.img")) is True
compute.post.assert_called_with("/qemu/images/linux.img", data=ANY, timeout=None)
+4 -1
View File
@@ -70,7 +70,10 @@ class AsyncioMagicMock(unittest.mock.MagicMock):
Magic mock returning coroutine
"""
def __init__(self, return_value=None, **kwargs):
def __init__(self, return_value=None, return_values=None, **kwargs):
"""
:return_values: Array of return value at each call will return the next
"""
if return_value:
future = asyncio.Future()
future.set_result(return_value)
+26 -1
View File
@@ -16,8 +16,33 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
from unittest.mock import patch
from gns3server.utils.images import md5sum, remove_checksum
from gns3server.utils import force_unix_path
from gns3server.utils.images import md5sum, remove_checksum, images_directories
def test_images_directories(tmpdir):
path1 = tmpdir / "images1" / "QEMU" / "test1.bin"
path1.write("1", ensure=True)
path1 = force_unix_path(str(path1))
path2 = tmpdir / "images2" / "test2.bin"
path2.write("1", ensure=True)
path2 = force_unix_path(str(path2))
with patch("gns3server.config.Config.get_section_config", return_value={
"images_path": str(tmpdir / "images1"),
"additional_images_path": "/tmp/null24564:{}".format(tmpdir / "images2"),
"local": False}):
# /tmp/null24564 is ignored because doesn't exists
res = images_directories("qemu")
assert res[0] == str(tmpdir / "images1" / "QEMU")
assert res[1] == str(tmpdir / "images2")
assert res[2] == str(tmpdir / "images1")
assert len(res) == 3
def test_md5sum(tmpdir):
+2
View File
@@ -19,7 +19,9 @@ import os
import pytest
import aiohttp
from gns3server.utils.path import check_path_allowed, get_default_project_directory
from gns3server.utils import force_unix_path
def test_check_path_allowed(config, tmpdir):