Skip to content

Commit

Permalink
atciss: use taskiq 💡 instead of celery 🥦
Browse files Browse the repository at this point in the history
  • Loading branch information
fpletz committed Feb 6, 2024
1 parent f0bc6c0 commit abc3f51
Show file tree
Hide file tree
Showing 43 changed files with 571 additions and 695 deletions.
6 changes: 4 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ htmlcov
.cache
nosetests.xml
coverage.xml
*,cover
*.cover
.hypothesis
xunit-*.xml
.idea
Expand All @@ -25,5 +25,7 @@ site
.git
.github
result

atciss-frontend/
screenshots/
nixos/
docker-compose.*.yml
16 changes: 13 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
FROM python:3.11-slim@sha256:23f52205321f806c2cc742cefbf837e0d25101388c043e860c7817985230565c as base
FROM python:3.11-slim@sha256:53d6284a40eae6b625f22870f5faba6c54f2a28db9027408f4dee111f1e885a2 as base

FROM base as requirements-stage
WORKDIR /tmp
RUN pip install poetry
COPY ./pyproject.toml ./poetry.lock* /tmp/

FROM requirements-stage as requirements-dev
RUN poetry export --with=dev -f requirements.txt --output requirements.txt --without-hashes

FROM requirements-stage as requirements-prod
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes

FROM base as dev
WORKDIR /code
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
COPY --from=requirements-dev /tmp/requirements.txt /code/requirements.txt
RUN apt-get update && apt-get install git -y
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
ENTRYPOINT ["python3", "-c", "from atciss.cli import cli; cli()"]
ENTRYPOINT ["python3", "-m", "atciss.cli"]

FROM dev as production
WORKDIR /code
COPY --from=requirements-prod /tmp/requirements.txt /code/requirements.txt
RUN apt-get update && apt-get install git -y
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY . /code
ENTRYPOINT ["python3", "-m", "atciss.cli"]
7 changes: 3 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,14 @@ using [Nix Flakes](https://nixos.wiki/wiki/Flakes) and
atciss serve
```

### Run the worker
### Run the worker & task scheduler

```
celery -A atciss worker
atciss worker
```

Automatic scheduling of tasks:
```
celery -A atciss beat
atciss scheduler
```

### Run the frontend
Expand Down
6 changes: 2 additions & 4 deletions alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
from sqlalchemy import pool
from sqlalchemy.engine import Connection
from sqlalchemy.ext.asyncio import async_engine_from_config

from alembic import context

from sqlmodel import SQLModel
import atciss.app.models # noqa: F401

import atciss.app.models # noqa: F401
from alembic import context
from atciss.config import settings
from atciss.log import setup_logging

Expand Down
7 changes: 0 additions & 7 deletions atciss/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +0,0 @@
"""ATCISS."""

from atciss import celery

from .version import __version__

__all__ = ("__version__", "celery")
25 changes: 16 additions & 9 deletions atciss/app/asgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,18 @@
from fastapi import FastAPI
from loguru import logger
from prometheus_fastapi_instrumentator import Instrumentator as PrometheusInstrumentator
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine

import alembic.command
import alembic.config

from ..config import settings
from ..log import setup_logging
from .router import root_api_router
from .utils import RedisClient
# for tasks discovery by broker
import atciss.tasks # pyright: ignore # noqa: F401
from atciss.app.router import root_api_router
from atciss.app.utils import RedisClient
from atciss.config import settings
from atciss.log import setup_logging
from atciss.tkq import broker


@dataclass
Expand All @@ -40,7 +43,7 @@ async def __call__(
return await self.app(scope, receive, send)


def run_migrations(connection, cfg):
def run_migrations(connection: AsyncSession, cfg: alembic.config.Config):
cfg.attributes["connection"] = connection
alembic.command.upgrade(cfg, "head")

Expand All @@ -57,15 +60,19 @@ async def run_async_migrations():

@asynccontextmanager
async def lifespan(_app: FastAPI):
await run_async_migrations()
if not broker.is_worker_process:
await run_async_migrations()
await broker.startup()
yield
if not broker.is_worker_process:
await broker.shutdown()
await RedisClient.close()


def get_application() -> FastAPI:
"""Initialize FastAPI application."""
setup_logging()
logger.debug("Initialize FastAPI application node.")
logger.debug("Initialize FastAPI application.")

app = FastAPI(
title=settings.PROJECT_NAME,
Expand All @@ -77,7 +84,7 @@ def get_application() -> FastAPI:

_ = PrometheusInstrumentator().instrument(app).expose(app, tags=["monitoring"])

app.add_middleware(CorrelationIdLogMiddleware)
app.add_middleware(CorrelationIdLogMiddleware) # pyright: ignore
app.add_middleware(
CorrelationIdMiddleware,
generator=(lambda: uuid4().hex) if not settings.DEBUG else (lambda: uuid4().hex[:8]),
Expand Down
7 changes: 3 additions & 4 deletions atciss/app/controllers/admin.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from typing import Annotated

import celery
from fastapi import APIRouter, Depends

import atciss.celery as ac
from atciss.app.controllers.auth import get_admin
from atciss.app.models import User
from atciss.tkq import broker

router = APIRouter()

Expand All @@ -14,12 +13,12 @@
async def get_tasks(
user: Annotated[User, Depends(get_admin)],
) -> list[str]:
return [task for task in dir(ac) if isinstance(getattr(ac, task), celery.Task)]
return list(broker.get_all_tasks().keys())


@router.post("/admin/task/{task}")
async def trigger_task(
task: str,
user: Annotated[User, Depends(get_admin)],
):
getattr(ac, task).apply_async()
_ = await broker.get_all_tasks()[task].kiq()
2 changes: 1 addition & 1 deletion atciss/app/controllers/airspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from loguru import logger
from pydantic import TypeAdapter

from atciss.app.tasks.sectors import Airport, Airspace, Position, SectorData
from atciss.app.views.sector import Airport, Airspace, Position, SectorData

from ...config import settings
from ..controllers.auth import get_user
Expand Down
2 changes: 1 addition & 1 deletion atciss/app/controllers/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ async def get_user(
user = await session.scalar(stmt)

if user is None:
raise HTTPException(500, "User not not found in database")
raise HTTPException(500, "User not found in database")

except JWTError as exc:
raise credentials_exception from exc
Expand Down
4 changes: 2 additions & 2 deletions atciss/app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from sqlmodel import Field, SQLModel

from .views.booking import Booking # noqa: F401 pylint: disable=unused-import
from .views.dfs_aixm import ( # noqa: F401 pylint: disable=unused-import
from .views.booking import Booking # noqa: F401
from .views.dfs_aixm import ( # noqa: F401
Aerodrome,
Navaid,
Runway,
Expand Down
Empty file removed atciss/app/tasks/__init__.py
Empty file.
130 changes: 0 additions & 130 deletions atciss/celery.py

This file was deleted.

17 changes: 1 addition & 16 deletions atciss/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,16 +1 @@
"""
Command-line interface.
The ``cli`` submodule defines Click command-line interface root and its
commands.
Resources:
1. `Click documentation`_
.. _Click documentation:
https://click.palletsprojects.com/en/8.1.x/
"""

from atciss.cli.cli import cli

__all__ = ("cli",)
from .cli import cli # pyright: ignore # noqa: F401
3 changes: 3 additions & 0 deletions atciss/cli/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from atciss.cli.cli import cli

cli()
7 changes: 4 additions & 3 deletions atciss/cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import click

from .scheduler import scheduler
from .serve import serve
from .worker import worker

CMD_HELP = "ATCISS CLI root."

Expand All @@ -15,6 +17,5 @@ def cli(**_: dict[str, Any]) -> None:


cli.add_command(serve)

if __name__ == "__main__":
cli()
cli.add_command(worker)
cli.add_command(scheduler)
Loading

0 comments on commit abc3f51

Please sign in to comment.