Source code for aiida_restapi.routers.daemon

"""Declaration of FastAPI router for daemon endpoints."""

from __future__ import annotations

import typing as t

from aiida.cmdline.utils.decorators import with_dbenv
from aiida.engine.daemon.client import DaemonException, get_daemon_client
from fastapi import APIRouter, Depends
from pydantic import BaseModel, Field

from aiida_restapi.jsonapi.models import errors

from .auth import UserInDB, get_current_active_user

read_router = APIRouter(prefix='/daemon')
write_router = APIRouter(prefix='/daemon')


[docs] class DaemonStatusModel(BaseModel): """Response model for daemon status.""" running: bool = Field(description='Whether the daemon is running or not.') num_workers: t.Optional[int] = Field(description='The number of workers if the daemon is running.')
[docs] @read_router.get( '/status', response_model=DaemonStatusModel, responses={ 500: {'model': errors.DaemonError}, }, ) @with_dbenv() async def get_daemon_status() -> DaemonStatusModel: """Return the daemon status.""" client = get_daemon_client() if not client.is_daemon_running: return DaemonStatusModel(running=False, num_workers=None) response = client.get_numprocesses() return DaemonStatusModel(running=True, num_workers=response['numprocesses'])
[docs] @write_router.post( '/start', response_model=DaemonStatusModel, responses={ 500: {'model': errors.DaemonError}, }, ) @with_dbenv() async def get_daemon_start( current_user: t.Annotated[UserInDB, Depends(get_current_active_user)], ) -> DaemonStatusModel: """Start the daemon.""" client = get_daemon_client() if client.is_daemon_running: raise DaemonException('The daemon is already running.') client.start_daemon() response = client.get_numprocesses() return DaemonStatusModel(running=True, num_workers=response['numprocesses'])
[docs] @write_router.post( '/stop', response_model=DaemonStatusModel, responses={ 500: {'model': errors.DaemonError}, }, ) @with_dbenv() async def get_daemon_stop( current_user: t.Annotated[UserInDB, Depends(get_current_active_user)], ) -> DaemonStatusModel: """Stop the daemon.""" client = get_daemon_client() if not client.is_daemon_running: raise DaemonException('The daemon is not running.') client.stop_daemon() return DaemonStatusModel(running=False, num_workers=None)