Complete type annotations for API endpoints.

This commit is contained in:
grossmj committed 2021-04-18 15:40:38 +09:30
1 parent cefab8d362
commit 9404c00411
35 files changed
+730 -414

No files matched your search

@@ -19,13 +19,13 @@ API routes for appliances.
"""
from fastapi import APIRouter
from typing import Optional
from typing import Optional, List
router = APIRouter()
@router.get("")
async def get_appliances(update: Optional[bool] = None, symbol_theme: Optional[str] = "Classic"):
async def get_appliances(update: Optional[bool] = None, symbol_theme: Optional[str] = "Classic") -> List[dict]:
"""
Return all appliances known by the controller.
"""
+6 -6
View File
@@ -93,7 +93,7 @@ async def update_compute(
@router.delete("/{compute_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_compute(
compute_id: Union[str, UUID], computes_repo: ComputesRepository = Depends(get_repository(ComputesRepository))
):
) -> None:
"""
Delete a compute from the controller.
"""
@@ -102,7 +102,7 @@ async def delete_compute(
@router.get("/{compute_id}/{emulator}/images")
async def get_images(compute_id: Union[str, UUID], emulator: str):
async def get_images(compute_id: Union[str, UUID], emulator: str) -> List[str]:
"""
Return the list of images available on a compute for a given emulator type.
"""
@@ -113,7 +113,7 @@ async def get_images(compute_id: Union[str, UUID], emulator: str):
@router.get("/{compute_id}/{emulator}/{endpoint_path:path}")
async def forward_get(compute_id: Union[str, UUID], emulator: str, endpoint_path: str):
async def forward_get(compute_id: Union[str, UUID], emulator: str, endpoint_path: str) -> dict:
"""
Forward a GET request to a compute.
Read the full compute API documentation for available routes.
@@ -125,7 +125,7 @@ async def forward_get(compute_id: Union[str, UUID], emulator: str, endpoint_path
@router.post("/{compute_id}/{emulator}/{endpoint_path:path}")
async def forward_post(compute_id: Union[str, UUID], emulator: str, endpoint_path: str, compute_data: dict):
async def forward_post(compute_id: Union[str, UUID], emulator: str, endpoint_path: str, compute_data: dict) -> dict:
"""
Forward a POST request to a compute.
Read the full compute API documentation for available routes.
@@ -136,7 +136,7 @@ async def forward_post(compute_id: Union[str, UUID], emulator: str, endpoint_pat
@router.put("/{compute_id}/{emulator}/{endpoint_path:path}")
async def forward_put(compute_id: Union[str, UUID], emulator: str, endpoint_path: str, compute_data: dict):
async def forward_put(compute_id: Union[str, UUID], emulator: str, endpoint_path: str, compute_data: dict) -> dict:
"""
Forward a PUT request to a compute.
Read the full compute API documentation for available routes.
@@ -147,7 +147,7 @@ async def forward_put(compute_id: Union[str, UUID], emulator: str, endpoint_path
@router.post("/{compute_id}/auto_idlepc")
async def autoidlepc(compute_id: Union[str, UUID], auto_idle_pc: schemas.AutoIdlePC):
async def autoidlepc(compute_id: Union[str, UUID], auto_idle_pc: schemas.AutoIdlePC) -> str:
"""
Find a suitable Idle-PC value for a given IOS image. This may take a few minutes.
"""
@@ -20,6 +20,7 @@ import os
from fastapi import APIRouter, status
from fastapi.encoders import jsonable_encoder
from typing import List
from gns3server.config import Config
from gns3server.controller import Controller
@@ -40,7 +41,7 @@ router = APIRouter()
status_code=status.HTTP_204_NO_CONTENT,
responses={403: {"model": schemas.ErrorMessage, "description": "Server shutdown not allowed"}},
)
async def shutdown():
async def shutdown() -> None:
"""
Shutdown the local server
"""
@@ -71,7 +72,7 @@ async def shutdown():
@router.get("/version", response_model=schemas.Version)
def get_version():
def get_version() -> dict:
"""
Return the server version number.
"""
@@ -86,7 +87,7 @@ def get_version():
response_model_exclude_defaults=True,
responses={409: {"model": schemas.ErrorMessage, "description": "Invalid version"}},
)
def check_version(version: schemas.Version):
def check_version(version: schemas.Version) -> dict:
"""
Check if version is the same as the server.
@@ -102,7 +103,7 @@ def check_version(version: schemas.Version):
@router.get("/iou_license", response_model=schemas.IOULicense)
def get_iou_license():
def get_iou_license() -> schemas.IOULicense:
"""
Return the IOU license settings
"""
@@ -111,7 +112,7 @@ def get_iou_license():
@router.put("/iou_license", status_code=status.HTTP_201_CREATED, response_model=schemas.IOULicense)
async def update_iou_license(iou_license: schemas.IOULicense):
async def update_iou_license(iou_license: schemas.IOULicense) -> schemas.IOULicense:
"""
Update the IOU license settings.
"""
@@ -124,7 +125,7 @@ async def update_iou_license(iou_license: schemas.IOULicense):
@router.get("/statistics")
async def statistics():
async def statistics() -> List[dict]:
"""
Return server statistics.
"""
+5 -5
View File
@@ -32,7 +32,7 @@ router = APIRouter(responses=responses)
@router.get("", response_model=List[schemas.Drawing], response_model_exclude_unset=True)
async def get_drawings(project_id: UUID):
async def get_drawings(project_id: UUID) -> List[schemas.Drawing]:
"""
Return the list of all drawings for a given project.
"""
@@ -42,7 +42,7 @@ async def get_drawings(project_id: UUID):
@router.post("", status_code=status.HTTP_201_CREATED, response_model=schemas.Drawing)
async def create_drawing(project_id: UUID, drawing_data: schemas.Drawing):
async def create_drawing(project_id: UUID, drawing_data: schemas.Drawing) -> schemas.Drawing:
"""
Create a new drawing.
"""
@@ -53,7 +53,7 @@ async def create_drawing(project_id: UUID, drawing_data: schemas.Drawing):
@router.get("/{drawing_id}", response_model=schemas.Drawing, response_model_exclude_unset=True)
async def get_drawing(project_id: UUID, drawing_id: UUID):
async def get_drawing(project_id: UUID, drawing_id: UUID) -> schemas.Drawing:
"""
Return a drawing.
"""
@@ -64,7 +64,7 @@ async def get_drawing(project_id: UUID, drawing_id: UUID):
@router.put("/{drawing_id}", response_model=schemas.Drawing, response_model_exclude_unset=True)
async def update_drawing(project_id: UUID, drawing_id: UUID, drawing_data: schemas.Drawing):
async def update_drawing(project_id: UUID, drawing_id: UUID, drawing_data: schemas.Drawing) -> schemas.Drawing:
"""
Update a drawing.
"""
@@ -76,7 +76,7 @@ async def update_drawing(project_id: UUID, drawing_id: UUID, drawing_data: schem
@router.delete("/{drawing_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_drawing(project_id: UUID, drawing_id: UUID):
async def delete_drawing(project_id: UUID, drawing_id: UUID) -> None:
"""
Delete a drawing.
"""
+5 -4
View File
@@ -21,6 +21,7 @@ API routes for managing the GNS3 VM.
from fastapi import APIRouter
from fastapi.encoders import jsonable_encoder
from typing import List
from gns3server.controller import Controller
from gns3server import schemas
@@ -29,7 +30,7 @@ router = APIRouter()
@router.get("/engines")
async def get_engines():
async def get_engines() -> List[dict]:
"""
Return the list of supported engines for the GNS3VM.
"""
@@ -39,7 +40,7 @@ async def get_engines():
@router.get("/engines/{engine}/vms")
async def get_vms(engine: str):
async def get_vms(engine: str) -> List[dict]:
"""
Return all the available VMs for a specific virtualization engine.
"""
@@ -49,7 +50,7 @@ async def get_vms(engine: str):
@router.get("", response_model=schemas.GNS3VM)
async def get_gns3vm_settings():
async def get_gns3vm_settings() -> schemas.GNS3VM:
"""
Return the GNS3 VM settings.
"""
@@ -58,7 +59,7 @@ async def get_gns3vm_settings():
@router.put("", response_model=schemas.GNS3VM, response_model_exclude_unset=True)
async def update_gns3vm_settings(gns3vm_data: schemas.GNS3VM):
async def update_gns3vm_settings(gns3vm_data: schemas.GNS3VM) -> schemas.GNS3VM:
"""
Update the GNS3 VM settings.
"""
+11 -11
View File
@@ -42,7 +42,7 @@ responses = {404: {"model": schemas.ErrorMessage, "description": "Could not find
router = APIRouter(responses=responses)
async def dep_link(project_id: UUID, link_id: UUID):
async def dep_link(project_id: UUID, link_id: UUID) -> Link:
"""
Dependency to retrieve a link.
"""
@@ -53,7 +53,7 @@ async def dep_link(project_id: UUID, link_id: UUID):
@router.get("", response_model=List[schemas.Link], response_model_exclude_unset=True)
async def get_links(project_id: UUID):
async def get_links(project_id: UUID) -> List[schemas.Link]:
"""
Return all links for a given project.
"""
@@ -71,7 +71,7 @@ async def get_links(project_id: UUID):
409: {"model": schemas.ErrorMessage, "description": "Could not create link"},
},
)
async def create_link(project_id: UUID, link_data: schemas.LinkCreate):
async def create_link(project_id: UUID, link_data: schemas.LinkCreate) -> schemas.Link:
"""
Create a new link.
"""
@@ -98,7 +98,7 @@ async def create_link(project_id: UUID, link_data: schemas.LinkCreate):
@router.get("/{link_id}/available_filters")
async def get_filters(link: Link = Depends(dep_link)):
async def get_filters(link: Link = Depends(dep_link)) -> List[dict]:
"""
Return all filters available for a given link.
"""
@@ -107,7 +107,7 @@ async def get_filters(link: Link = Depends(dep_link)):
@router.get("/{link_id}", response_model=schemas.Link, response_model_exclude_unset=True)
async def get_link(link: Link = Depends(dep_link)):
async def get_link(link: Link = Depends(dep_link)) -> schemas.Link:
"""
Return a link.
"""
@@ -116,7 +116,7 @@ async def get_link(link: Link = Depends(dep_link)):
@router.put("/{link_id}", response_model=schemas.Link, response_model_exclude_unset=True)
async def update_link(link_data: schemas.LinkUpdate, link: Link = Depends(dep_link)):
async def update_link(link_data: schemas.LinkUpdate, link: Link = Depends(dep_link)) -> schemas.Link:
"""
Update a link.
"""
@@ -132,7 +132,7 @@ async def update_link(link_data: schemas.LinkUpdate, link: Link = Depends(dep_li
@router.delete("/{link_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_link(project_id: UUID, link: Link = Depends(dep_link)):
async def delete_link(project_id: UUID, link: Link = Depends(dep_link)) -> None:
"""
Delete a link.
"""
@@ -142,7 +142,7 @@ async def delete_link(project_id: UUID, link: Link = Depends(dep_link)):
@router.post("/{link_id}/reset", response_model=schemas.Link)
async def reset_link(link: Link = Depends(dep_link)):
async def reset_link(link: Link = Depends(dep_link)) -> schemas.Link:
"""
Reset a link.
"""
@@ -152,7 +152,7 @@ async def reset_link(link: Link = Depends(dep_link)):
@router.post("/{link_id}/capture/start", status_code=status.HTTP_201_CREATED, response_model=schemas.Link)
async def start_capture(capture_data: dict, link: Link = Depends(dep_link)):
async def start_capture(capture_data: dict, link: Link = Depends(dep_link)) -> schemas.Link:
"""
Start packet capture on the link.
"""
@@ -165,7 +165,7 @@ async def start_capture(capture_data: dict, link: Link = Depends(dep_link)):
@router.post("/{link_id}/capture/stop", status_code=status.HTTP_204_NO_CONTENT)
async def stop_capture(link: Link = Depends(dep_link)):
async def stop_capture(link: Link = Depends(dep_link)) -> None:
"""
Stop packet capture on the link.
"""
@@ -174,7 +174,7 @@ async def stop_capture(link: Link = Depends(dep_link)):
@router.get("/{link_id}/capture/stream")
async def stream_pcap(request: Request, link: Link = Depends(dep_link)):
async def stream_pcap(request: Request, link: Link = Depends(dep_link)) -> StreamingResponse:
"""
Stream the PCAP capture file from compute.
"""
+26 -26
View File
@@ -81,7 +81,7 @@ responses = {404: {"model": schemas.ErrorMessage, "description": "Could not find
router = APIRouter(route_class=NodeConcurrency, responses=responses)
async def dep_project(project_id: UUID):
async def dep_project(project_id: UUID) -> Project:
"""
Dependency to retrieve a project.
"""
@@ -90,7 +90,7 @@ async def dep_project(project_id: UUID):
return project
async def dep_node(node_id: UUID, project: Project = Depends(dep_project)):
async def dep_node(node_id: UUID, project: Project = Depends(dep_project)) -> None:
"""
Dependency to retrieve a node.
"""
@@ -108,7 +108,7 @@ async def dep_node(node_id: UUID, project: Project = Depends(dep_project)):
409: {"model": schemas.ErrorMessage, "description": "Could not create node"},
},
)
async def create_node(node_data: schemas.NodeCreate, project: Project = Depends(dep_project)):
async def create_node(node_data: schemas.NodeCreate, project: Project = Depends(dep_project)) -> schemas.Node:
"""
Create a new node.
"""
@@ -121,7 +121,7 @@ async def create_node(node_data: schemas.NodeCreate, project: Project = Depends(
@router.get("", response_model=List[schemas.Node], response_model_exclude_unset=True)
async def get_nodes(project: Project = Depends(dep_project)):
async def get_nodes(project: Project = Depends(dep_project)) -> List[schemas.Node]:
"""
Return all nodes belonging to a given project.
"""
@@ -130,7 +130,7 @@ async def get_nodes(project: Project = Depends(dep_project)):
@router.post("/start", status_code=status.HTTP_204_NO_CONTENT)
async def start_all_nodes(project: Project = Depends(dep_project)):
async def start_all_nodes(project: Project = Depends(dep_project)) -> None:
"""
Start all nodes belonging to a given project.
"""
@@ -139,7 +139,7 @@ async def start_all_nodes(project: Project = Depends(dep_project)):
@router.post("/stop", status_code=status.HTTP_204_NO_CONTENT)
async def stop_all_nodes(project: Project = Depends(dep_project)):
async def stop_all_nodes(project: Project = Depends(dep_project)) -> None:
"""
Stop all nodes belonging to a given project.
"""
@@ -148,7 +148,7 @@ async def stop_all_nodes(project: Project = Depends(dep_project)):
@router.post("/suspend", status_code=status.HTTP_204_NO_CONTENT)
async def suspend_all_nodes(project: Project = Depends(dep_project)):
async def suspend_all_nodes(project: Project = Depends(dep_project)) -> None:
"""
Suspend all nodes belonging to a given project.
"""
@@ -157,7 +157,7 @@ async def suspend_all_nodes(project: Project = Depends(dep_project)):
@router.post("/reload", status_code=status.HTTP_204_NO_CONTENT)
async def reload_all_nodes(project: Project = Depends(dep_project)):
async def reload_all_nodes(project: Project = Depends(dep_project)) -> None:
"""
Reload all nodes belonging to a given project.
"""
@@ -167,7 +167,7 @@ async def reload_all_nodes(project: Project = Depends(dep_project)):
@router.get("/{node_id}", response_model=schemas.Node)
def get_node(node: Node = Depends(dep_node)):
def get_node(node: Node = Depends(dep_node)) -> schemas.Node:
"""
Return a node from a given project.
"""
@@ -176,7 +176,7 @@ def get_node(node: Node = Depends(dep_node)):
@router.put("/{node_id}", response_model=schemas.Node, response_model_exclude_unset=True)
async def update_node(node_data: schemas.NodeUpdate, node: Node = Depends(dep_node)):
async def update_node(node_data: schemas.NodeUpdate, node: Node = Depends(dep_node)) -> schemas.Node:
"""
Update a node.
"""
@@ -197,7 +197,7 @@ async def update_node(node_data: schemas.NodeUpdate, node: Node = Depends(dep_no
status_code=status.HTTP_204_NO_CONTENT,
responses={**responses, 409: {"model": schemas.ErrorMessage, "description": "Cannot delete node"}},
)
async def delete_node(node_id: UUID, project: Project = Depends(dep_project)):
async def delete_node(node_id: UUID, project: Project = Depends(dep_project)) -> None:
"""
Delete a node from a project.
"""
@@ -206,7 +206,7 @@ async def delete_node(node_id: UUID, project: Project = Depends(dep_project)):
@router.post("/{node_id}/duplicate", response_model=schemas.Node, status_code=status.HTTP_201_CREATED)
async def duplicate_node(duplicate_data: schemas.NodeDuplicate, node: Node = Depends(dep_node)):
async def duplicate_node(duplicate_data: schemas.NodeDuplicate, node: Node = Depends(dep_node)) -> schemas.Node:
"""
Duplicate a node.
"""
@@ -216,7 +216,7 @@ async def duplicate_node(duplicate_data: schemas.NodeDuplicate, node: Node = Dep
@router.post("/{node_id}/start", status_code=status.HTTP_204_NO_CONTENT)
async def start_node(start_data: dict, node: Node = Depends(dep_node)):
async def start_node(start_data: dict, node: Node = Depends(dep_node)) -> None:
"""
Start a node.
"""
@@ -225,7 +225,7 @@ async def start_node(start_data: dict, node: Node = Depends(dep_node)):
@router.post("/{node_id}/stop", status_code=status.HTTP_204_NO_CONTENT)
async def stop_node(node: Node = Depends(dep_node)):
async def stop_node(node: Node = Depends(dep_node)) -> None:
"""
Stop a node.
"""
@@ -234,7 +234,7 @@ async def stop_node(node: Node = Depends(dep_node)):
@router.post("/{node_id}/suspend", status_code=status.HTTP_204_NO_CONTENT)
async def suspend_node(node: Node = Depends(dep_node)):
async def suspend_node(node: Node = Depends(dep_node)) -> None:
"""
Suspend a node.
"""
@@ -243,7 +243,7 @@ async def suspend_node(node: Node = Depends(dep_node)):
@router.post("/{node_id}/reload", status_code=status.HTTP_204_NO_CONTENT)
async def reload_node(node: Node = Depends(dep_node)):
async def reload_node(node: Node = Depends(dep_node)) -> None:
"""
Reload a node.
"""
@@ -252,7 +252,7 @@ async def reload_node(node: Node = Depends(dep_node)):
@router.get("/{node_id}/links", response_model=List[schemas.Link], response_model_exclude_unset=True)
async def get_node_links(node: Node = Depends(dep_node)):
async def get_node_links(node: Node = Depends(dep_node)) -> List[schemas.Link]:
"""
Return all the links connected to a node.
"""
@@ -264,7 +264,7 @@ async def get_node_links(node: Node = Depends(dep_node)):
@router.get("/{node_id}/dynamips/auto_idlepc")
async def auto_idlepc(node: Node = Depends(dep_node)):
async def auto_idlepc(node: Node = Depends(dep_node)) -> str:
"""
Compute an Idle-PC value for a Dynamips node
"""
@@ -273,7 +273,7 @@ async def auto_idlepc(node: Node = Depends(dep_node)):
@router.get("/{node_id}/dynamips/idlepc_proposals")
async def idlepc_proposals(node: Node = Depends(dep_node)):
async def idlepc_proposals(node: Node = Depends(dep_node)) -> List[str]:
"""
Compute a list of potential idle-pc values for a Dynamips node
"""
@@ -281,8 +281,8 @@ async def idlepc_proposals(node: Node = Depends(dep_node)):
return await node.dynamips_idlepc_proposals()
@router.post("/{node_id}/resize_disk", status_code=status.HTTP_201_CREATED)
async def resize_disk(resize_data: dict, node: Node = Depends(dep_node)):
@router.post("/{node_id}/resize_disk", status_code=status.HTTP_204_NO_CONTENT)
async def resize_disk(resize_data: dict, node: Node = Depends(dep_node)) -> None:
"""
Resize a disk image.
"""
@@ -290,7 +290,7 @@ async def resize_disk(resize_data: dict, node: Node = Depends(dep_node)):
@router.get("/{node_id}/files/{file_path:path}")
async def get_file(file_path: str, node: Node = Depends(dep_node)):
async def get_file(file_path: str, node: Node = Depends(dep_node)) -> Response:
"""
Return a file in the node directory
"""
@@ -309,7 +309,7 @@ async def get_file(file_path: str, node: Node = Depends(dep_node)):
@router.post("/{node_id}/files/{file_path:path}", status_code=status.HTTP_201_CREATED)
async def post_file(file_path: str, request: Request, node: Node = Depends(dep_node)):
async def post_file(file_path: str, request: Request, node: Node = Depends(dep_node)) -> dict:
"""
Write a file in the node directory.
"""
@@ -329,7 +329,7 @@ async def post_file(file_path: str, request: Request, node: Node = Depends(dep_n
@router.websocket("/{node_id}/console/ws")
async def ws_console(websocket: WebSocket, node: Node = Depends(dep_node)):
async def ws_console(websocket: WebSocket, node: Node = Depends(dep_node)) -> None:
"""
WebSocket console.
"""
@@ -377,7 +377,7 @@ async def ws_console(websocket: WebSocket, node: Node = Depends(dep_node)):
@router.post("/console/reset", status_code=status.HTTP_204_NO_CONTENT)
async def reset_console_all_nodes(project: Project = Depends(dep_project)):
async def reset_console_all_nodes(project: Project = Depends(dep_project)) -> None:
"""
Reset console for all nodes belonging to the project.
"""
@@ -386,6 +386,6 @@ async def reset_console_all_nodes(project: Project = Depends(dep_project)):
@router.post("/{node_id}/console/reset", status_code=status.HTTP_204_NO_CONTENT)
async def console_reset(node: Node = Depends(dep_node)):
async def console_reset(node: Node = Depends(dep_node)) -> None:
await node.post("/console/reset") # , request.json)
@@ -32,7 +32,7 @@ router = APIRouter()
@router.get("")
async def http_notification():
async def http_notification() -> StreamingResponse:
"""
Receive controller notifications about the controller from HTTP stream.
"""
@@ -47,7 +47,7 @@ async def http_notification():
@router.websocket("/ws")
async def notification_ws(websocket: WebSocket):
async def notification_ws(websocket: WebSocket) -> None:
"""
Receive project notifications about the controller from WebSocket.
"""
+28 -17
View File
@@ -51,7 +51,7 @@ responses = {404: {"model": schemas.ErrorMessage, "description": "Could not find
router = APIRouter(responses=responses)
def dep_project(project_id: UUID):
def dep_project(project_id: UUID) -> Project:
"""
Dependency to retrieve a project.
"""
@@ -64,7 +64,7 @@ CHUNK_SIZE = 1024 * 8 # 8KB
@router.get("", response_model=List[schemas.Project], response_model_exclude_unset=True)
def get_projects():
def get_projects() -> List[schemas.Project]:
"""
Return all projects.
"""
@@ -80,7 +80,7 @@ def get_projects():
response_model_exclude_unset=True,
responses={409: {"model": schemas.ErrorMessage, "description": "Could not create project"}},
)
async def create_project(project_data: schemas.ProjectCreate):
async def create_project(project_data: schemas.ProjectCreate) -> schemas.Project:
"""
Create a new project.
"""
@@ -91,7 +91,7 @@ async def create_project(project_data: schemas.ProjectCreate):
@router.get("/{project_id}", response_model=schemas.Project)
def get_project(project: Project = Depends(dep_project)):
def get_project(project: Project = Depends(dep_project)) -> schemas.Project:
"""
Return a project.
"""
@@ -100,7 +100,10 @@ def get_project(project: Project = Depends(dep_project)):
@router.put("/{project_id}", response_model=schemas.Project, response_model_exclude_unset=True)
async def update_project(project_data: schemas.ProjectUpdate, project: Project = Depends(dep_project)):
async def update_project(
project_data: schemas.ProjectUpdate,
project: Project = Depends(dep_project)
) -> schemas.Project:
"""
Update a project.
"""
@@ -110,7 +113,7 @@ async def update_project(project_data: schemas.ProjectUpdate, project: Project =
@router.delete("/{project_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_project(project: Project = Depends(dep_project)):
async def delete_project(project: Project = Depends(dep_project)) -> None:
"""
Delete a project.
"""
@@ -121,7 +124,7 @@ async def delete_project(project: Project = Depends(dep_project)):
@router.get("/{project_id}/stats")
def get_project_stats(project: Project = Depends(dep_project)):
def get_project_stats(project: Project = Depends(dep_project)) -> dict:
"""
Return a project statistics.
"""
@@ -134,7 +137,7 @@ def get_project_stats(project: Project = Depends(dep_project)):
status_code=status.HTTP_204_NO_CONTENT,
responses={**responses, 409: {"model": schemas.ErrorMessage, "description": "Could not close project"}},
)
async def close_project(project: Project = Depends(dep_project)):
async def close_project(project: Project = Depends(dep_project)) -> None:
"""
Close a project.
"""
@@ -148,7 +151,7 @@ async def close_project(project: Project = Depends(dep_project)):
response_model=schemas.Project,
responses={**responses, 409: {"model": schemas.ErrorMessage, "description": "Could not open project"}},
)
async def open_project(project: Project = Depends(dep_project)):
async def open_project(project: Project = Depends(dep_project)) -> schemas.Project:
"""
Open a project.
"""
@@ -163,7 +166,7 @@ async def open_project(project: Project = Depends(dep_project)):
response_model=schemas.Project,
responses={**responses, 409: {"model": schemas.ErrorMessage, "description": "Could not load project"}},
)
async def load_project(path: str = Body(..., embed=True)):
async def load_project(path: str = Body(..., embed=True)) -> schemas.Project:
"""
Load a project (local server only).
"""
@@ -180,7 +183,7 @@ async def load_project(path: str = Body(..., embed=True)):
@router.get("/{project_id}/notifications")
async def notification(project_id: UUID):
async def notification(project_id: UUID) -> StreamingResponse:
"""
Receive project notifications about the controller from HTTP stream.
"""
@@ -211,7 +214,7 @@ async def notification(project_id: UUID):
@router.websocket("/{project_id}/notifications/ws")
async def notification_ws(project_id: UUID, websocket: WebSocket):
async def notification_ws(project_id: UUID, websocket: WebSocket) -> None:
"""
Receive project notifications about the controller from WebSocket.
"""
@@ -248,7 +251,7 @@ async def export_project(
include_images: bool = False,
reset_mac_addresses: bool = False,
compression: str = "zip",
):
) -> StreamingResponse:
"""
Export a project as a portable archive.
"""
@@ -294,7 +297,12 @@ async def export_project(
@router.post("/{project_id}/import", status_code=status.HTTP_201_CREATED, response_model=schemas.Project)
async def import_project(project_id: UUID, request: Request, path: Optional[Path] = None, name: Optional[str] = None):
async def import_project(
project_id: UUID,
request: Request,
path: Optional[Path] = None,
name: Optional[str] = None
) -> schemas.Project:
"""
Import a project from a portable archive.
"""
@@ -332,7 +340,10 @@ async def import_project(project_id: UUID, request: Request, path: Optional[Path
response_model=schemas.Project,
responses={**responses, 409: {"model": schemas.ErrorMessage, "description": "Could not duplicate project"}},
)
async def duplicate_project(project_data: schemas.ProjectDuplicate, project: Project = Depends(dep_project)):
async def duplicate_project(
project_data: schemas.ProjectDuplicate,
project: Project = Depends(dep_project)
) -> schemas.Project:
"""
Duplicate a project.
"""
@@ -352,7 +363,7 @@ async def duplicate_project(project_data: schemas.ProjectDuplicate, project: Pro
@router.get("/{project_id}/files/{file_path:path}")
async def get_file(file_path: str, project: Project = Depends(dep_project)):
async def get_file(file_path: str, project: Project = Depends(dep_project)) -> FileResponse:
"""
Return a file from a project.
"""
@@ -371,7 +382,7 @@ async def get_file(file_path: str, project: Project = Depends(dep_project)):
@router.post("/{project_id}/files/{file_path:path}", status_code=status.HTTP_204_NO_CONTENT)
async def write_file(file_path: str, request: Request, project: Project = Depends(dep_project)):
async def write_file(file_path: str, request: Request, project: Project = Depends(dep_project)) -> None:
"""
Write a file from a project.
"""
@@ -36,7 +36,7 @@ responses = {404: {"model": schemas.ErrorMessage, "description": "Could not find
router = APIRouter(responses=responses)
def dep_project(project_id: UUID):
def dep_project(project_id: UUID) -> Project:
"""
Dependency to retrieve a project.
"""
@@ -46,7 +46,10 @@ def dep_project(project_id: UUID):
@router.post("", status_code=status.HTTP_201_CREATED, response_model=schemas.Snapshot)
async def create_snapshot(snapshot_data: schemas.SnapshotCreate, project: Project = Depends(dep_project)):
async def create_snapshot(
snapshot_data: schemas.SnapshotCreate,
project: Project = Depends(dep_project)
) -> schemas.Snapshot:
"""
Create a new snapshot of a project.
"""
@@ -56,7 +59,7 @@ async def create_snapshot(snapshot_data: schemas.SnapshotCreate, project: Projec
@router.get("", response_model=List[schemas.Snapshot], response_model_exclude_unset=True)
def get_snapshots(project: Project = Depends(dep_project)):
def get_snapshots(project: Project = Depends(dep_project)) -> List[schemas.Snapshot]:
"""
Return all snapshots belonging to a given project.
"""
@@ -66,7 +69,7 @@ def get_snapshots(project: Project = Depends(dep_project)):
@router.delete("/{snapshot_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_snapshot(snapshot_id: UUID, project: Project = Depends(dep_project)):
async def delete_snapshot(snapshot_id: UUID, project: Project = Depends(dep_project)) -> None:
"""
Delete a snapshot.
"""
@@ -75,7 +78,7 @@ async def delete_snapshot(snapshot_id: UUID, project: Project = Depends(dep_proj
@router.post("/{snapshot_id}/restore", status_code=status.HTTP_201_CREATED, response_model=schemas.Project)
async def restore_snapshot(snapshot_id: UUID, project: Project = Depends(dep_project)):
async def restore_snapshot(snapshot_id: UUID, project: Project = Depends(dep_project)) -> schemas.Project:
"""
Restore a snapshot.
"""
+6 -5
View File
@@ -23,6 +23,7 @@ import os
from fastapi import APIRouter, Request, status
from fastapi.responses import FileResponse
from typing import List
from gns3server.controller import Controller
from gns3server import schemas
@@ -37,7 +38,7 @@ router = APIRouter()
@router.get("")
def get_symbols():
def get_symbols() -> List[str]:
controller = Controller.instance()
return controller.symbols.list()
@@ -46,7 +47,7 @@ def get_symbols():
@router.get(
"/{symbol_id:path}/raw", responses={404: {"model": schemas.ErrorMessage, "description": "Could not find symbol"}}
)
async def get_symbol(symbol_id: str):
async def get_symbol(symbol_id: str) -> FileResponse:
"""
Download a symbol file.
"""
@@ -63,7 +64,7 @@ async def get_symbol(symbol_id: str):
"/{symbol_id:path}/dimensions",
responses={404: {"model": schemas.ErrorMessage, "description": "Could not find symbol"}},
)
async def get_symbol_dimensions(symbol_id: str):
async def get_symbol_dimensions(symbol_id: str) -> dict:
"""
Get a symbol dimensions.
"""
@@ -78,7 +79,7 @@ async def get_symbol_dimensions(symbol_id: str):
@router.post("/{symbol_id:path}/raw", status_code=status.HTTP_204_NO_CONTENT)
async def upload_symbol(symbol_id: str, request: Request):
async def upload_symbol(symbol_id: str, request: Request) -> None:
"""
Upload a symbol file.
"""
@@ -97,7 +98,7 @@ async def upload_symbol(symbol_id: str, request: Request):
@router.get("/default_symbols")
def get_default_symbols():
def get_default_symbols() -> dict:
"""
Return all default symbols.
"""
@@ -44,7 +44,7 @@ router = APIRouter(responses=responses)
async def create_template(
template_create: schemas.TemplateCreate,
templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository)),
) -> dict:
) -> schemas.Template:
"""
Create a new template.
"""
@@ -58,7 +58,7 @@ async def get_template(
request: Request,
response: Response,
templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository)),
) -> dict:
) -> schemas.Template:
"""
Return a template.
"""
@@ -79,7 +79,7 @@ async def update_template(
template_id: UUID,
template_update: schemas.TemplateUpdate,
templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository)),
) -> dict:
) -> schemas.Template:
"""
Update a template.
"""
@@ -104,7 +104,7 @@ async def delete_template(
@router.get("/templates", response_model=List[schemas.Template], response_model_exclude_unset=True)
async def get_templates(
templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository)),
) -> List[dict]:
) -> List[schemas.Template]:
"""
Return all templates.
"""
@@ -115,7 +115,7 @@ async def get_templates(
@router.post("/templates/{template_id}/duplicate", response_model=schemas.Template, status_code=status.HTTP_201_CREATED)
async def duplicate_template(
template_id: UUID, templates_repo: TemplatesRepository = Depends(get_repository(TemplatesRepository))
) -> dict:
) -> schemas.Template:
"""
Duplicate a template.
"""