def test_get_relative_image_path(qemu, tmpdir, config): os.makedirs(str(tmpdir / "images1" / "QEMU")) os.makedirs(str(tmpdir / "images1" / "VBOX")) path1 = force_unix_path(str(tmpdir / "images1" / "test1.bin")) open(path1, 'w+').close() path2 = force_unix_path(str(tmpdir / "images1" / "QEMU" / "test2.bin")) open(path2, 'w+').close() os.makedirs(str(tmpdir / "images2")) path3 = force_unix_path(str(tmpdir / "images2" / "test3.bin")) open(path3, 'w+').close() path4 = force_unix_path(str(tmpdir / "test4.bin")) open(path4, 'w+').close() # The user use an image of another emulator we return the full path path5 = force_unix_path(str(tmpdir / "images1" / "VBOX" / "test5.bin")) open(path5, 'w+').close() config.set_section_config("Server", { "images_path": str(tmpdir / "images1"), "additional_images_path": str(tmpdir / "images2"), "local": True }) assert qemu.get_relative_image_path(path1) == "test1.bin" assert qemu.get_relative_image_path("test1.bin") == "test1.bin" assert qemu.get_relative_image_path(path2) == "test2.bin" assert qemu.get_relative_image_path("test2.bin") == "test2.bin" assert qemu.get_relative_image_path("../test1.bin") == "test1.bin" assert qemu.get_relative_image_path("test3.bin") == "test3.bin" assert qemu.get_relative_image_path(path4) == path4 assert qemu.get_relative_image_path(path5) == path5
def test_get_abs_image_additional_image_paths(qemu, tmpdir, config): 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)) config.set_section_config( "Server", { "images_path": str(tmpdir / "images1"), "additional_images_path": "/tmp/null24564;{}".format(str(tmpdir / "images2")), "local": False }) assert qemu.get_abs_image_path("test1.bin") == path1 assert qemu.get_abs_image_path("test2.bin") == path2 # Absolute path assert qemu.get_abs_image_path(str(path2)) == path2 with pytest.raises(ImageMissingError): qemu.get_abs_image_path("test4.bin")
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] == force_unix_path(str(tmpdir / "images1" / "QEMU")) assert res[1] == force_unix_path(str(tmpdir / "images2")) assert res[2] == force_unix_path(str(tmpdir / "images1")) assert len(res) == 3
def test_get_abs_image_path_non_local(qemu, tmpdir): path1 = tmpdir / "images" / "QEMU" / "test1.bin" path1.write("1", ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "private" / "QEMU" / "test2.bin" path2.write("1", ensure=True) path2 = force_unix_path(str(path2)) # If non local we can't use path outside images directory with patch("gns3server.config.Config.get_section_config", return_value={ "images_path": str(tmpdir / "images"), "local": False }): assert qemu.get_abs_image_path(path1) == path1 with pytest.raises(VMError): qemu.get_abs_image_path(path2) with pytest.raises(VMError): qemu.get_abs_image_path("C:\\test2.bin") with patch("gns3server.config.Config.get_section_config", return_value={ "images_path": str(tmpdir / "images"), "local": True }): assert qemu.get_abs_image_path(path2) == path2
def test_get_abs_image_path_non_local(qemu, tmpdir, config): path1 = tmpdir / "images" / "QEMU" / "test1.bin" path1.write("1", ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "private" / "QEMU" / "test2.bin" path2.write("1", ensure=True) path2 = force_unix_path(str(path2)) # If non local we can't use path outside images directory config.set_section_config("Server", { "images_path": str(tmpdir / "images"), "local": False }) assert qemu.get_abs_image_path(path1) == path1 with pytest.raises(NodeError): qemu.get_abs_image_path(path2) with pytest.raises(NodeError): qemu.get_abs_image_path("C:\\test2.bin") config.set_section_config("Server", { "images_path": str(tmpdir / "images"), "local": True }) assert qemu.get_abs_image_path(path2) == path2
def test_hdd_disk_image(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) vm.hdd_disk_image = str(tmpdir / "test") assert vm.hdd_disk_image == force_unix_path(str(tmpdir / "test")) vm.hdd_disk_image = "test" assert vm.hdd_disk_image == force_unix_path(str(tmpdir / "QEMU" / "test"))
def test_initrd(vm, images_dir): open(os.path.join(images_dir, "test1"), "w+").close() vm.initrd = os.path.join(images_dir, "test1") assert vm.initrd == force_unix_path(os.path.join(images_dir, "test1")) open(os.path.join(images_dir, "QEMU", "test2"), "w+").close() vm.initrd = "test2" assert vm.initrd == force_unix_path(os.path.join(images_dir, "QEMU", "test2"))
def test_hdd_disk_image(vm, images_dir): open(os.path.join(images_dir, "test1"), "w+").close() vm.hdd_disk_image = os.path.join(images_dir, "test1") assert vm.hdd_disk_image == force_unix_path(os.path.join(images_dir, "test1")) open(os.path.join(images_dir, "QEMU", "test2"), "w+").close() vm.hdd_disk_image = "test2" assert vm.hdd_disk_image == force_unix_path(os.path.join(images_dir, "QEMU", "test2"))
def test_initrd(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) with patch("gns3server.modules.project.Project.emit") as mock: vm.initrd = str(tmpdir / "test") assert vm.initrd == force_unix_path(str(tmpdir / "test")) vm.initrd = "test" assert vm.initrd == force_unix_path(str(tmpdir / "QEMU" / "test")) assert not mock.called
def test_initrd_asa(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) with patch("gns3server.modules.project.Project.emit") as mock: vm.initrd = str(tmpdir / "asa842-initrd.gz") assert vm.initrd == force_unix_path(str(tmpdir / "asa842-initrd.gz")) vm.initrd = "asa842-initrd.gz" assert vm.initrd == force_unix_path(str(tmpdir / "QEMU" / "asa842-initrd.gz")) assert mock.called
def test_get_abs_image_path(qemu, tmpdir, config): os.makedirs(str(tmpdir / "QEMU")) path1 = force_unix_path(str(tmpdir / "test1.bin")) open(path1, 'w+').close() path2 = force_unix_path(str(tmpdir / "QEMU" / "test2.bin")) open(path2, 'w+').close() config.set_section_config("Server", {"images_path": str(tmpdir)}) assert qemu.get_abs_image_path(path1) == path1 assert qemu.get_abs_image_path("test1.bin") == path1 assert qemu.get_abs_image_path(path2) == path2 assert qemu.get_abs_image_path("test2.bin") == path2 assert qemu.get_abs_image_path("../test1.bin") == path1
def test_get_abs_image_path(qemu, tmpdir): os.makedirs(str(tmpdir / "QEMU")) path1 = force_unix_path(str(tmpdir / "test1.bin")) open(path1, 'w+').close() path2 = force_unix_path(str(tmpdir / "QEMU" / "test2.bin")) open(path2, 'w+').close() with patch("gns3server.config.Config.get_section_config", return_value={"images_path": str(tmpdir)}): assert qemu.get_abs_image_path(path1) == path1 assert qemu.get_abs_image_path("test1.bin") == path1 assert qemu.get_abs_image_path(path2) == path2 assert qemu.get_abs_image_path("test2.bin") == path2 assert qemu.get_abs_image_path("../test1.bin") == path1
def test_initrd_asa(vm, images_dir): with patch("gns3server.compute.project.Project.emit") as mock: open(os.path.join(images_dir, "asa842-initrd.gz"), "w+").close() vm.initrd = os.path.join(images_dir, "asa842-initrd.gz") assert vm.initrd == force_unix_path(os.path.join(images_dir, "asa842-initrd.gz")) assert mock.called
def test_list_images_recursives(loop, qemu, tmpdir): fake_images = ["a.qcow2", "b.qcow2", ".blu.qcow2", "a.qcow2.md5sum"] for image in fake_images: with open(str(tmpdir / image), "w+") as f: f.write("1") os.makedirs(str(tmpdir / "c")) fake_images = ["c.qcow2", "c.qcow2.md5sum"] for image in fake_images: with open(str(tmpdir / "c" / image), "w+") as f: f.write("1") with patch("gns3server.utils.images.default_images_directory", return_value=str(tmpdir)): assert loop.run_until_complete(qemu.list_images()) == [{ "filename": "a.qcow2", "path": "a.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1 }, { "filename": "b.qcow2", "path": "b.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1 }, { "filename": "c.qcow2", "path": force_unix_path(os.path.sep.join(["c", "c.qcow2"])), "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1 }]
def post_file(request, response): project = yield from Controller.instance().get_loaded_project( request.match_info["project_id"]) node = project.get_node(request.match_info["node_id"]) path = request.match_info["path"] path = force_unix_path(path) # Raise error if user try to escape if path[0] == ".": raise aiohttp.web.HTTPForbidden() node_type = node.node_type path = "/project-files/{}/{}/{}".format(node_type, node.id, path) data = yield from request.content.read() yield from node.compute.http_query( "POST", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), data=data, timeout=None, raw=True) response.set_status(201)
async def get_file(request, response): project = await Controller.instance().get_loaded_project( request.match_info["project_id"]) node = project.get_node(request.match_info["node_id"]) path = request.match_info["path"] path = force_unix_path(path) # Raise error if user try to escape if path[0] == ".": raise aiohttp.web.HTTPForbidden() node_type = node.node_type path = "/project-files/{}/{}/{}".format(node_type, node.id, path) res = await node.compute.http_query( "GET", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), timeout=None, raw=True) response.set_status(200) response.content_type = "application/octet-stream" response.enable_chunked_encoding() await response.prepare(request) await response.write(res.body)
def test_get_abs_image_recursive_ova(qemu, tmpdir, config): path1 = tmpdir / "images1" / "QEMU" / "demo" / "test.ova" / "test1.bin" path1.write("1", ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "images1" / "QEMU" / "test.ova" / "test2.bin" path2.write("1", ensure=True) path2 = force_unix_path(str(path2)) config.set_section_config("Server", { "images_path": str(tmpdir / "images1"), "local": False}) assert qemu.get_abs_image_path("test.ova/test1.bin") == path1 assert qemu.get_abs_image_path("test.ova/test2.bin") == path2 # Absolute path assert qemu.get_abs_image_path(str(path1)) == path1
def test_hda_disk_image_ova(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) vm.hda_disk_image = "test.ovf/test.vmdk" assert vm.hda_disk_image == force_unix_path( str(tmpdir / "QEMU" / "test.ovf" / "test.vmdk"))
def test_hda_disk_image_ova(vm, images_dir): os.makedirs(os.path.join(images_dir, "QEMU", "test.ovf")) open(os.path.join(images_dir, "QEMU", "test.ovf", "test.vmdk"), "w+").close() vm.hda_disk_image = "test.ovf/test.vmdk" assert vm.hda_disk_image == force_unix_path( os.path.join(images_dir, "QEMU", "test.ovf", "test.vmdk"))
def test_get_abs_image_path_non_local(qemu, tmpdir): path1 = tmpdir / "images" / "QEMU" / "test1.bin" path1.write("1", ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "private" / "QEMU" / "test2.bin" path2.write("1", ensure=True) path2 = force_unix_path(str(path2)) # If non local we can't use path outside images directory with patch("gns3server.config.Config.get_section_config", return_value={"images_path": str(tmpdir / "images"), "local": False}): assert qemu.get_abs_image_path(path1) == path1 with pytest.raises(VMError): qemu.get_abs_image_path(path2) with pytest.raises(VMError): qemu.get_abs_image_path("C:\\test2.bin") with patch("gns3server.config.Config.get_section_config", return_value={"images_path": str(tmpdir / "images"), "local": True}): assert qemu.get_abs_image_path(path2) == path2
def test_get_abs_image_path_non_local(qemu, tmpdir, config): path1 = tmpdir / "images" / "QEMU" / "test1.bin" path1.write("1", ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "private" / "QEMU" / "test2.bin" path2.write("1", ensure=True) path2 = force_unix_path(str(path2)) # If non local we can't use path outside images directory config.set_section_config("Server", {"images_path": str(tmpdir / "images"), "local": False}) assert qemu.get_abs_image_path(path1) == path1 with pytest.raises(NodeError): qemu.get_abs_image_path(path2) with pytest.raises(NodeError): qemu.get_abs_image_path("C:\\test2.bin") config.set_section_config("Server", {"images_path": str(tmpdir / "images"), "local": True}) assert qemu.get_abs_image_path(path2) == path2
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] == force_unix_path(str(tmpdir / "images1" / "QEMU")) assert res[1] == force_unix_path(str(tmpdir / "images2")) assert res[2] == force_unix_path(str(tmpdir / "images1")) assert len(res) == 3
def test_get_abs_image_additional_image_paths(qemu, tmpdir, config): 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)) config.set_section_config("Server", { "images_path": str(tmpdir / "images1"), "additional_images_path": "/tmp/null24564;{}".format(str(tmpdir / "images2")), "local": False}) assert qemu.get_abs_image_path("test1.bin") == path1 assert qemu.get_abs_image_path("test2.bin") == path2 # Absolute path assert qemu.get_abs_image_path(str(path2)) == path2 with pytest.raises(ImageMissingError): qemu.get_abs_image_path("test4.bin")
async def post_file(request, response): project = await Controller.instance().get_loaded_project(request.match_info["project_id"]) node = project.get_node(request.match_info["node_id"]) path = request.match_info["path"] path = force_unix_path(path) # Raise error if user try to escape if path[0] == ".": raise aiohttp.web.HTTPForbidden() node_type = node.node_type path = "/project-files/{}/{}/{}".format(node_type, node.id, path) data = await request.content.read() #FIXME: are we handling timeout or large files correctly? await node.compute.http_query("POST", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), data=data, timeout=None, raw=True) response.set_status(201)
def test_list_images_recursives(loop, qemu, tmpdir): fake_images = ["a.qcow2", "b.qcow2", ".blu.qcow2", "a.qcow2.md5sum"] for image in fake_images: with open(str(tmpdir / image), "w+") as f: f.write("1") os.makedirs(str(tmpdir / "c")) fake_images = ["c.qcow2", "c.qcow2.md5sum"] for image in fake_images: with open(str(tmpdir / "c" / image), "w+") as f: f.write("1") with patch("gns3server.utils.images.default_images_directory", return_value=str(tmpdir)): assert sorted(loop.run_until_complete(qemu.list_images()), key=lambda k: k['filename']) == [ {"filename": "a.qcow2", "path": "a.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}, {"filename": "b.qcow2", "path": "b.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}, {"filename": "c.qcow2", "path": force_unix_path(os.path.sep.join(["c", "c.qcow2"])), "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1} ]
async def get_file(request, response): project = await Controller.instance().get_loaded_project(request.match_info["project_id"]) node = project.get_node(request.match_info["node_id"]) path = request.match_info["path"] path = force_unix_path(path) # Raise error if user try to escape if path[0] == ".": raise aiohttp.web.HTTPForbidden() node_type = node.node_type path = "/project-files/{}/{}/{}".format(node_type, node.id, path) res = await node.compute.http_query("GET", "/projects/{project_id}/files{path}".format(project_id=project.id, path=path), timeout=None, raw=True) response.set_status(200) response.content_type = "application/octet-stream" response.enable_chunked_encoding() await response.prepare(request) await response.write(res.body)
async def test_list_images_recursives(qemu, tmpdir): tmp_images_dir = os.path.join(tmpdir, "images") os.makedirs(tmp_images_dir, exist_ok=True) fake_images = ["a.qcow2", "b.qcow2", ".blu.qcow2", "a.qcow2.md5sum"] for image in fake_images: with open(os.path.join(tmp_images_dir, image), "w+") as f: f.write("1") os.makedirs(os.path.join(tmp_images_dir, "c")) fake_images = ["c.qcow2", "c.qcow2.md5sum"] for image in fake_images: with open(os.path.join(tmp_images_dir, "c", image), "w+") as f: f.write("1") with patch("gns3server.utils.images.default_images_directory", return_value=str(tmp_images_dir)): assert sorted(await qemu.list_images(), key=lambda k: k['filename']) == [ {"filename": "a.qcow2", "path": "a.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}, {"filename": "b.qcow2", "path": "b.qcow2", "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1}, {"filename": "c.qcow2", "path": force_unix_path(os.path.sep.join(["c", "c.qcow2"])), "md5sum": "c4ca4238a0b923820dcc509a6f75849b", "filesize": 1} ]
def test_force_unix_path(): assert force_unix_path("a/b") == "a/b" assert force_unix_path("a\\b") == "a/b" assert force_unix_path("a\\b\\..\\c") == "a/c"
def test_hda_disk_image_ova(vm, tmpdir): vm.manager.config.set("Server", "images_path", str(tmpdir)) vm.hda_disk_image = "test.ovf/test.vmdk" assert vm.hda_disk_image == force_unix_path(str(tmpdir / "QEMU" / "test.ovf" / "test.vmdk"))
def test_list_images(tmpdir): path1 = tmpdir / "images1" / "IOS" / "test1.image" path1.write(b'\x7fELF\x01\x02\x01', ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "images2" / "test2.image" path2.write(b'\x7fELF\x01\x02\x01', ensure=True) path2 = force_unix_path(str(path2)) # Invalid image because not a valid elf file path = tmpdir / "images2" / "test_invalid.image" path.write(b'NOTANELF', ensure=True) if sys.platform.startswith("linux"): path3 = tmpdir / "images1" / "IOU" / "test3.bin" path3.write(b'\x7fELF\x01\x02\x01', ensure=True) path3 = force_unix_path(str(path3)) path4 = tmpdir / "images1" / "QEMU" / "test4.qcow2" path4.write("1", ensure=True) path4 = force_unix_path(str(path4)) path5 = tmpdir / "images1" / "QEMU" / "test4.qcow2.md5sum" path5.write("1", ensure=True) path5 = force_unix_path(str(path5)) with patch("gns3server.config.Config.get_section_config", return_value={ "images_path": str(tmpdir / "images1"), "additional_images_path": "/tmp/null24564;{}".format(str(tmpdir / "images2")), "local": False }): assert list_images("dynamips") == [{ 'filename': 'test1.image', 'filesize': 7, 'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e', 'path': 'test1.image' }, { 'filename': 'test2.image', 'filesize': 7, 'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e', 'path': str(path2) }] if sys.platform.startswith("linux"): assert list_images("iou") == [{ 'filename': 'test3.bin', 'filesize': 7, 'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e', 'path': 'test3.bin' }] assert list_images("qemu") == [{ 'filename': 'test4.qcow2', 'filesize': 1, 'md5sum': 'c4ca4238a0b923820dcc509a6f75849b', 'path': 'test4.qcow2' }]
def test_hda_disk_image_ova(vm, images_dir): os.makedirs(os.path.join(images_dir, "QEMU", "test.ovf")) open(os.path.join(images_dir, "QEMU", "test.ovf", "test.vmdk"), "w+").close() vm.hda_disk_image = "test.ovf/test.vmdk" assert vm.hda_disk_image == force_unix_path(os.path.join(images_dir, "QEMU", "test.ovf", "test.vmdk"))
def test_list_images(tmpdir): path1 = tmpdir / "images1" / "IOS" / "test1.image" path1.write(b'\x7fELF\x01\x02\x01', ensure=True) path1 = force_unix_path(str(path1)) path2 = tmpdir / "images2" / "test2.image" path2.write(b'\x7fELF\x01\x02\x01', ensure=True) path2 = force_unix_path(str(path2)) # Invalid image because not a valid elf file path = tmpdir / "images2" / "test_invalid.image" path.write(b'NOTANELF', ensure=True) if sys.platform.startswith("linux"): path3 = tmpdir / "images1" / "IOU" / "test3.bin" path3.write(b'\x7fELF\x01\x02\x01', ensure=True) path3 = force_unix_path(str(path3)) path4 = tmpdir / "images1" / "QEMU" / "test4.qcow2" path4.write("1", ensure=True) path4 = force_unix_path(str(path4)) path5 = tmpdir / "images1" / "QEMU" / "test4.qcow2.md5sum" path5.write("1", ensure=True) path5 = force_unix_path(str(path5)) with patch("gns3server.config.Config.get_section_config", return_value={ "images_path": str(tmpdir / "images1"), "additional_images_path": "/tmp/null24564;{}".format(str(tmpdir / "images2")), "local": False}): assert list_images("dynamips") == [ { 'filename': 'test1.image', 'filesize': 7, 'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e', 'path': 'test1.image' }, { 'filename': 'test2.image', 'filesize': 7, 'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e', 'path': str(path2) } ] if sys.platform.startswith("linux"): assert list_images("iou") == [ { 'filename': 'test3.bin', 'filesize': 7, 'md5sum': 'b0d5aa897d937aced5a6b1046e8f7e2e', 'path': 'test3.bin' } ] assert list_images("qemu") == [ { 'filename': 'test4.qcow2', 'filesize': 1, 'md5sum': 'c4ca4238a0b923820dcc509a6f75849b', 'path': 'test4.qcow2' } ]