From c40a7bf3fb0326d354e661797025cd3874bd400d Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 3 Oct 2023 11:43:06 +0200 Subject: [PATCH] smoke check error handling for create vm --- pkgs/clan-cli/clan_cli/webui/routers/flake.py | 19 +++++++++++-------- pkgs/clan-cli/clan_cli/webui/routers/vms.py | 11 ++++++++++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/webui/routers/flake.py b/pkgs/clan-cli/clan_cli/webui/routers/flake.py index 7c5913430..c5f15a970 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/flake.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/flake.py @@ -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") diff --git a/pkgs/clan-cli/clan_cli/webui/routers/vms.py b/pkgs/clan-cli/clan_cli/webui/routers/vms.py index 3011c32c5..2cd37b2bd 100644 --- a/pkgs/clan-cli/clan_cli/webui/routers/vms.py +++ b/pkgs/clan-cli/clan_cli/webui/routers/vms.py @@ -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))