smoke check error handling for create vm
All checks were successful
checks-impure / test (pull_request) Successful in 13s
checks / test (pull_request) Successful in 1m22s

This commit is contained in:
Johannes Kirschbauer 2023-10-03 11:43:06 +02:00
parent 16f44900a3
commit c40a7bf3fb
Signed by: hsjobeki
GPG Key ID: F62ED8B8BF204685
2 changed files with 21 additions and 9 deletions

View File

@ -12,26 +12,29 @@ from .utils import run_cmd
router = APIRouter()
@router.get("/api/flake/attrs")
async def inspect_flake_attrs(url: str) -> FlakeAttrResponse:
async def get_attrs(url: str) -> list[str]:
cmd = nix_flake_show(url)
stdout = await run_cmd(cmd)
data: dict[str,dict] = {}
data: dict[str, dict] = {}
try:
data = json.loads(stdout)
except JSONDecodeError:
raise HTTPException(status_code=422, detail=f"Could not load flake.")
raise HTTPException(status_code=422, detail="Could not load flake.")
nixos_configs = data.get("nixosConfigurations",{})
nixos_configs = data.get("nixosConfigurations", {})
flake_attrs = list(nixos_configs.keys())
if not flake_attrs:
raise HTTPException(status_code=422, detail="No entry or no attribute: nixosConfigurations")
raise HTTPException(
status_code=422, detail="No entry or no attribute: nixosConfigurations"
)
return flake_attrs
return FlakeAttrResponse(flake_attrs=flake_attrs)
@router.get("/api/flake/attrs")
async def inspect_flake_attrs(url: str) -> FlakeAttrResponse:
return FlakeAttrResponse(flake_attrs=await get_attrs(url))
@router.get("/api/flake")

View File

@ -3,9 +3,12 @@ import logging
from typing import Annotated, Iterator
from uuid import UUID
from fastapi import APIRouter, BackgroundTasks, Body
from fastapi import APIRouter, BackgroundTasks, Body, status
from fastapi.exceptions import HTTPException
from fastapi.responses import StreamingResponse
from clan_cli.webui.routers.flake import get_attrs
from ...nix import nix_build, nix_eval
from ..schemas import VmConfig, VmCreateResponse, VmInspectResponse, VmStatusResponse
from ..task_manager import BaseTask, get_task, register_task
@ -107,5 +110,11 @@ async def get_vm_logs(uuid: UUID) -> StreamingResponse:
async def create_vm(
vm: Annotated[VmConfig, Body()], background_tasks: BackgroundTasks
) -> VmCreateResponse:
flake_attrs = await get_attrs(vm.flake_url)
if vm.flake_attr not in flake_attrs:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Provided attribute '{vm.flake_attr}' does not exist.",
)
uuid = register_task(BuildVmTask, vm)
return VmCreateResponse(uuid=str(uuid))