1
0
mirror of https://github.com/GNS3/gns3-server synced 2024-12-25 16:28:11 +00:00

Fix project import to work with FastAPI.

This commit is contained in:
grossmj 2020-10-19 22:39:30 +10:30
parent 5653a8afb6
commit 25494ca098
3 changed files with 22 additions and 26 deletions

View File

@ -29,12 +29,13 @@ import time
import logging
log = logging.getLogger()
from fastapi import APIRouter, Depends, Request, Body, HTTPException, status, WebSocket, WebSocketDisconnect
from fastapi import APIRouter, Depends, Request, Body, Query, HTTPException, status, WebSocket, WebSocketDisconnect
from fastapi.encoders import jsonable_encoder
from fastapi.responses import StreamingResponse, FileResponse
from websockets.exceptions import ConnectionClosed, WebSocketException
from typing import List
from typing import List, Optional
from uuid import UUID
from pathlib import Path
from gns3server.endpoints.schemas.common import ErrorMessage
from gns3server.endpoints import schemas
@ -307,20 +308,16 @@ async def export_project(project: Project = Depends(dep_project),
status_code=status.HTTP_201_CREATED,
response_model=schemas.Project,
responses=responses)
async def import_project(project_id: UUID, request: Request):
async def import_project(project_id: UUID, request: Request, path: Optional[Path] = None, name: Optional[str] = None):
"""
Import a project from a portable archive.
"""
controller = Controller.instance()
config = Config.instance()
if config.get_section_config("Server").getboolean("local", False) is False:
if not config.get_section_config("Server").getboolean("local", False):
raise ControllerForbiddenError("The server is not local")
#FIXME: broken
path = None
name = "test"
# We write the content to a temporary location and after we extract it all.
# It could be more optimal to stream this but it is not implemented in Python.
try:

View File

@ -259,6 +259,7 @@ def run_around_tests(monkeypatch, config, port_manager):#port_manager, controlle
config.set("Server", "appliances_path", os.path.join(tmppath, 'appliances'))
config.set("Server", "ubridge_path", os.path.join(tmppath, 'bin', 'ubridge'))
config.set("Server", "auth", False)
config.set("Server", "local", True)
# Prevent executions of the VM if we forgot to mock something
config.set("VirtualBox", "vboxmanage_path", tmppath)

View File

@ -21,10 +21,8 @@ import pytest
import zipfile
import json
from fastapi.testclient import TestClient
from unittest.mock import patch, MagicMock
from tests.utils import asyncio_patch
from gns3server.app import app
@pytest.fixture
@ -362,22 +360,22 @@ async def test_write_and_get_file_with_leading_slashes_in_filename(controller_ap
assert response.content == b"world"
# @pytest.mark.asyncio
# async def test_import(controller_api, tmpdir, controller):
#
# with zipfile.ZipFile(str(tmpdir / "test.zip"), 'w') as myzip:
# myzip.writestr("project.gns3", b'{"project_id": "c6992992-ac72-47dc-833b-54aa334bcd05", "version": "2.0.0", "name": "test"}')
# myzip.writestr("demo", b"hello")
#
# project_id = str(uuid.uuid4())
# with open(str(tmpdir / "test.zip"), "rb") as f:
# response = await controller_api.post("/projects/{project_id}/import".format(project_id=project_id), body=f.read(), raw=True)
# assert response.status_code == 201
#
# project = controller.get_project(project_id)
# with open(os.path.join(project.path, "demo")) as f:
# content = f.read()
# assert content == "hello"
@pytest.mark.asyncio
async def test_import(controller_api, tmpdir, controller):
with zipfile.ZipFile(str(tmpdir / "test.zip"), 'w') as myzip:
myzip.writestr("project.gns3", b'{"project_id": "c6992992-ac72-47dc-833b-54aa334bcd05", "version": "2.0.0", "name": "test"}')
myzip.writestr("demo", b"hello")
project_id = str(uuid.uuid4())
with open(str(tmpdir / "test.zip"), "rb") as f:
response = await controller_api.post("/projects/{project_id}/import".format(project_id=project_id), body=f.read(), raw=True)
assert response.status_code == 201
project = controller.get_project(project_id)
with open(os.path.join(project.path, "demo")) as f:
content = f.read()
assert content == "hello"
@pytest.mark.asyncio