Merge pull request 'drop dependency on fastapi in the cli' (#551) from Mic92-cli into main
This commit is contained in:
@@ -6,14 +6,8 @@ from pathlib import Path
|
|||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from fastapi import HTTPException
|
from clan_cli.dirs import machine_settings_file, nixpkgs_source, specific_machine_dir
|
||||||
|
from clan_cli.errors import ClanError, ClanHttpError
|
||||||
from clan_cli.dirs import (
|
|
||||||
machine_settings_file,
|
|
||||||
nixpkgs_source,
|
|
||||||
specific_machine_dir,
|
|
||||||
)
|
|
||||||
from clan_cli.errors import ClanError
|
|
||||||
from clan_cli.git import commit_file
|
from clan_cli.git import commit_file
|
||||||
from clan_cli.nix import nix_eval
|
from clan_cli.nix import nix_eval
|
||||||
|
|
||||||
@@ -83,9 +77,9 @@ def verify_machine_config(
|
|||||||
def config_for_machine(flake_dir: Path, machine_name: str) -> dict:
|
def config_for_machine(flake_dir: Path, machine_name: str) -> dict:
|
||||||
# read the config from a json file located at {flake}/machines/{machine_name}/settings.json
|
# read the config from a json file located at {flake}/machines/{machine_name}/settings.json
|
||||||
if not specific_machine_dir(flake_dir, machine_name).exists():
|
if not specific_machine_dir(flake_dir, machine_name).exists():
|
||||||
raise HTTPException(
|
raise ClanHttpError(
|
||||||
|
msg=f"Machine {machine_name} not found. Create the machine first`",
|
||||||
status_code=404,
|
status_code=404,
|
||||||
detail=f"Machine {machine_name} not found. Create the machine first`",
|
|
||||||
)
|
)
|
||||||
settings_path = machine_settings_file(flake_dir, machine_name)
|
settings_path = machine_settings_file(flake_dir, machine_name)
|
||||||
if not settings_path.exists():
|
if not settings_path.exists():
|
||||||
@@ -100,9 +94,9 @@ def set_config_for_machine(flake_dir: Path, machine_name: str, config: dict) ->
|
|||||||
raise ClanError("Machine name must be a valid hostname")
|
raise ClanError("Machine name must be a valid hostname")
|
||||||
if "networking" in config and "hostName" in config["networking"]:
|
if "networking" in config and "hostName" in config["networking"]:
|
||||||
if machine_name != config["networking"]["hostName"]:
|
if machine_name != config["networking"]["hostName"]:
|
||||||
raise HTTPException(
|
raise ClanHttpError(
|
||||||
|
msg="Machine name does not match the 'networking.hostName' setting in the config",
|
||||||
status_code=400,
|
status_code=400,
|
||||||
detail="Machine name does not match the 'networking.hostName' setting in the config",
|
|
||||||
)
|
)
|
||||||
config["networking"]["hostName"] = machine_name
|
config["networking"]["hostName"] = machine_name
|
||||||
# create machine folder if it doesn't exist
|
# create machine folder if it doesn't exist
|
||||||
|
|||||||
@@ -6,12 +6,8 @@ from pathlib import Path
|
|||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from fastapi import HTTPException
|
from clan_cli.dirs import nixpkgs_source
|
||||||
|
from clan_cli.errors import ClanError, ClanHttpError
|
||||||
from clan_cli.dirs import (
|
|
||||||
nixpkgs_source,
|
|
||||||
)
|
|
||||||
from clan_cli.errors import ClanError
|
|
||||||
from clan_cli.nix import nix_eval
|
from clan_cli.nix import nix_eval
|
||||||
|
|
||||||
|
|
||||||
@@ -59,17 +55,14 @@ def machine_schema(
|
|||||||
)
|
)
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0:
|
||||||
print(proc.stderr, file=sys.stderr)
|
print(proc.stderr, file=sys.stderr)
|
||||||
raise ClanError(
|
raise ClanHttpError(
|
||||||
f"Failed to check clanImports for existence:\n{proc.stderr}"
|
status_code=400,
|
||||||
|
msg=f"Failed to check clanImports for existence:\n{proc.stderr}",
|
||||||
)
|
)
|
||||||
modules_not_found = json.loads(proc.stdout)
|
modules_not_found = json.loads(proc.stdout)
|
||||||
if len(modules_not_found) > 0:
|
if len(modules_not_found) > 0:
|
||||||
raise HTTPException(
|
raise ClanHttpError(
|
||||||
status_code=400,
|
msg="Some requested clan modules could not be found", status_code=400
|
||||||
detail={
|
|
||||||
"msg": "Some requested clan modules could not be found",
|
|
||||||
"modules_not_found": modules_not_found,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# get the schema
|
# get the schema
|
||||||
|
|||||||
@@ -2,3 +2,13 @@ class ClanError(Exception):
|
|||||||
"""Base class for exceptions in this module."""
|
"""Base class for exceptions in this module."""
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ClanHttpError(ClanError):
|
||||||
|
status_code: int
|
||||||
|
msg: str
|
||||||
|
|
||||||
|
def __init__(self, status_code: int, msg: str):
|
||||||
|
self.status_code = status_code
|
||||||
|
self.msg = msg
|
||||||
|
super().__init__(msg)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from fastapi import Request, status
|
|||||||
from fastapi.encoders import jsonable_encoder
|
from fastapi.encoders import jsonable_encoder
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
|
|
||||||
from ..errors import ClanError
|
from ..errors import ClanError, ClanHttpError
|
||||||
from .settings import settings
|
from .settings import settings
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@@ -17,7 +17,13 @@ def clan_error_handler(request: Request, exc: Exception) -> JSONResponse:
|
|||||||
headers["Access-Control-Allow-Origin"] = "*"
|
headers["Access-Control-Allow-Origin"] = "*"
|
||||||
headers["Access-Control-Allow-Methods"] = "*"
|
headers["Access-Control-Allow-Methods"] = "*"
|
||||||
|
|
||||||
if isinstance(exc, ClanError):
|
if isinstance(exc, ClanHttpError):
|
||||||
|
return JSONResponse(
|
||||||
|
status_code=exc.status_code,
|
||||||
|
content=jsonable_encoder(dict(detail={"msg": exc.msg})),
|
||||||
|
headers=headers,
|
||||||
|
)
|
||||||
|
elif isinstance(exc, ClanError):
|
||||||
log.error(f"ClanError: {exc}")
|
log.error(f"ClanError: {exc}")
|
||||||
detail = [
|
detail = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,11 +43,12 @@ let
|
|||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
argcomplete # optional dependency: if not enabled, shell completion will not work
|
argcomplete # optional dependency: if not enabled, shell completion will not work
|
||||||
fastapi
|
|
||||||
uvicorn # optional dependencies: if not enabled, webui subcommand will not work
|
|
||||||
];
|
];
|
||||||
|
|
||||||
pytestDependencies = runtimeDependencies ++ dependencies ++ [
|
pytestDependencies = runtimeDependencies ++ dependencies ++ [
|
||||||
|
fastapi # optional dependencies: if not enabled, webui subcommand will not work
|
||||||
|
uvicorn # optional dependencies: if not enabled, webui subcommand will not work
|
||||||
|
|
||||||
#schemathesis # optional for http fuzzing
|
#schemathesis # optional for http fuzzing
|
||||||
pytest
|
pytest
|
||||||
pytest-cov
|
pytest-cov
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ def test_schema_invalid_clan_imports(
|
|||||||
"Some requested clan modules could not be found"
|
"Some requested clan modules could not be found"
|
||||||
in response.json()["detail"]["msg"]
|
in response.json()["detail"]["msg"]
|
||||||
)
|
)
|
||||||
assert "non-existing-clan-module" in response.json()["detail"]["modules_not_found"]
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_machine_invalid_hostname(
|
def test_create_machine_invalid_hostname(
|
||||||
|
|||||||
Reference in New Issue
Block a user