Skip to content

Commit 3d833dd

Browse files
add files
1 parent 0545b05 commit 3d833dd

File tree

18 files changed

+1005
-0
lines changed

18 files changed

+1005
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#
2+
# Targets to pip-compile requirements
3+
#
4+
include ../../../requirements/base.Makefile
5+
6+
# Add here any extra explicit dependency: e.g. _migration.txt: _base.txt
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#
2+
# Specifies third-party dependencies for 'aws-library'
3+
#
4+
--constraint ../../../requirements/constraints.txt
5+
--requirement ../../../packages/common-library/requirements/_base.in
6+
--requirement ../../../packages/models-library/requirements/_base.in
7+
--requirement ../../../packages/service-library/requirements/_base.in
8+
--requirement ../../../packages/settings-library/requirements/_base.in
9+
10+
celery
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#
2+
# Specifies dependencies required to run 'models-library'
3+
#
4+
--constraint ../../../requirements/constraints.txt
5+
6+
# Adds base AS CONSTRAINT specs, not requirement.
7+
# - Resulting _text.txt is a frozen list of EXTRA packages for testing, besides _base.txt
8+
#
9+
--constraint _base.txt
10+
11+
# testing
12+
coverage
13+
faker
14+
fastapi
15+
httpx
16+
pint
17+
pytest
18+
pytest-asyncio
19+
pytest-benchmark
20+
pytest-cov
21+
pytest-icdiff
22+
pytest-instafail
23+
pytest-mock
24+
pytest-runner
25+
pytest-sugar
26+
python-dotenv
27+
pyyaml
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
--constraint ../../../requirements/constraints.txt
2+
--constraint _base.txt
3+
--constraint _test.txt
4+
5+
--requirement ../../../requirements/devenv.txt
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Shortcut to install all packages for the contigous integration (CI) of 'models-library'
2+
#
3+
# - As ci.txt but w/ tests
4+
#
5+
# Usage:
6+
# pip install -r requirements/ci.txt
7+
#
8+
9+
# installs base + tests requirements
10+
--requirement _base.txt
11+
--requirement _test.txt
12+
--requirement _tools.txt
13+
14+
# installs this repo's packages
15+
simcore-common-library @ ../common-library
16+
simcore-models-library @ ../models-library/
17+
pytest-simcore @ ../pytest-simcore
18+
simcore-service-library @ ../service-library/
19+
simcore-settings-library @ ../settings-library/
20+
21+
# current module
22+
simcore-celery-library @ .
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Shortcut to install all packages needed to develop 'models-library'
2+
#
3+
# - As ci.txt but with current and repo packages in develop (edit) mode
4+
#
5+
# Usage:
6+
# pip install -r requirements/dev.txt
7+
#
8+
9+
# installs base + tests requirements
10+
--requirement _base.txt
11+
--requirement _test.txt
12+
--requirement _tools.txt
13+
14+
# installs this repo's packages
15+
--editable ../common-library/
16+
--editable ../models-library/
17+
--editable ../pytest-simcore/
18+
--editable ../service-library/
19+
--editable ../settings-library/
20+
21+
# current module
22+
--editable .
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import logging
2+
from asyncio import AbstractEventLoop
3+
4+
from fastapi import FastAPI
5+
from servicelib.redis._client import RedisClientSDK
6+
from settings_library.redis import RedisDatabase
7+
8+
from ..._meta import APP_NAME
9+
from ...core.settings import get_application_settings
10+
from ._celery_types import register_celery_types
11+
from ._common import create_app
12+
from .backends._redis import RedisTaskInfoStore
13+
from .client import CeleryTaskClient
14+
15+
_logger = logging.getLogger(__name__)
16+
17+
18+
def setup_celery_client(app: FastAPI) -> None:
19+
async def on_startup() -> None:
20+
application_settings = get_application_settings(app)
21+
celery_settings = application_settings.STORAGE_CELERY
22+
assert celery_settings # nosec
23+
celery_app = create_app(celery_settings)
24+
redis_client_sdk = RedisClientSDK(
25+
celery_settings.CELERY_REDIS_RESULT_BACKEND.build_redis_dsn(
26+
RedisDatabase.CELERY_TASKS
27+
),
28+
client_name=f"{APP_NAME}.celery_tasks",
29+
)
30+
31+
app.state.celery_client = CeleryTaskClient(
32+
celery_app,
33+
celery_settings,
34+
RedisTaskInfoStore(redis_client_sdk),
35+
)
36+
37+
register_celery_types()
38+
39+
app.add_event_handler("startup", on_startup)
40+
41+
42+
def get_celery_client(app: FastAPI) -> CeleryTaskClient:
43+
assert hasattr(app.state, "celery_client") # nosec
44+
celery_client = app.state.celery_client
45+
assert isinstance(celery_client, CeleryTaskClient)
46+
return celery_client
47+
48+
49+
def get_event_loop(app: FastAPI) -> AbstractEventLoop:
50+
event_loop = app.state.event_loop
51+
assert isinstance(event_loop, AbstractEventLoop)
52+
return event_loop
53+
54+
55+
def set_event_loop(app: FastAPI, event_loop: AbstractEventLoop) -> None:
56+
app.state.event_loop = event_loop
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from functools import partial
2+
from pathlib import Path
3+
from typing import Any
4+
5+
from kombu.utils.json import register_type # type: ignore[import-untyped]
6+
from models_library.api_schemas_storage.storage_schemas import (
7+
FileUploadCompletionBody,
8+
FoldersBody,
9+
)
10+
from pydantic import BaseModel
11+
12+
from ...models import FileMetaData
13+
14+
15+
def _path_encoder(obj):
16+
if isinstance(obj, Path):
17+
return {"__path__": True, "path": str(obj)}
18+
return obj
19+
20+
21+
# Define how Path objects are deserialized
22+
def _path_decoder(obj):
23+
if "__path__" in obj:
24+
return Path(obj["path"])
25+
return obj
26+
27+
28+
def _class_full_name(clz: type) -> str:
29+
return ".".join([clz.__module__, clz.__qualname__])
30+
31+
32+
def _pydantic_model_encoder(obj: BaseModel, *args, **kwargs) -> dict[str, Any]:
33+
return obj.model_dump(*args, **kwargs, mode="json")
34+
35+
36+
def _pydantic_model_decoder(clz: type[BaseModel], data: dict[str, Any]) -> BaseModel:
37+
return clz(**data)
38+
39+
40+
def _register_pydantic_types(*models: type[BaseModel]) -> None:
41+
for model in models:
42+
register_type(
43+
model,
44+
_class_full_name(model),
45+
encoder=_pydantic_model_encoder,
46+
decoder=partial(_pydantic_model_decoder, model),
47+
)
48+
49+
50+
def register_celery_types() -> None:
51+
register_type(
52+
Path,
53+
_class_full_name(Path),
54+
_path_encoder,
55+
_path_decoder,
56+
)
57+
register_type(set, _class_full_name(set), encoder=list, decoder=set)
58+
59+
_register_pydantic_types(FileUploadCompletionBody)
60+
_register_pydantic_types(FileMetaData)
61+
_register_pydantic_types(FoldersBody)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import logging
2+
import ssl
3+
from typing import Any
4+
5+
from celery import Celery # type: ignore[import-untyped]
6+
from settings_library.celery import CelerySettings
7+
from settings_library.redis import RedisDatabase
8+
9+
_logger = logging.getLogger(__name__)
10+
11+
12+
def _celery_configure(celery_settings: CelerySettings) -> dict[str, Any]:
13+
base_config = {
14+
"broker_connection_retry_on_startup": True,
15+
"result_expires": celery_settings.CELERY_RESULT_EXPIRES,
16+
"result_extended": True,
17+
"result_serializer": "json",
18+
"task_default_queue": "default",
19+
"task_send_sent_event": True,
20+
"task_track_started": True,
21+
"worker_send_task_events": True,
22+
}
23+
if celery_settings.CELERY_REDIS_RESULT_BACKEND.REDIS_SECURE:
24+
base_config["redis_backend_use_ssl"] = {"ssl_cert_reqs": ssl.CERT_NONE}
25+
return base_config
26+
27+
28+
def create_app(celery_settings: CelerySettings) -> Celery:
29+
assert celery_settings
30+
31+
return Celery(
32+
broker=celery_settings.CELERY_RABBIT_BROKER.dsn,
33+
backend=celery_settings.CELERY_REDIS_RESULT_BACKEND.build_redis_dsn(
34+
RedisDatabase.CELERY_TASKS,
35+
),
36+
**_celery_configure(celery_settings),
37+
)

0 commit comments

Comments
 (0)