-
Notifications
You must be signed in to change notification settings - Fork 44
Expand file tree
/
Copy pathmain.py
More file actions
129 lines (106 loc) · 3.57 KB
/
Copy pathmain.py
File metadata and controls
129 lines (106 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"""
main file for exosphere state manager
"""
from beanie import init_beanie
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from pymongo import AsyncMongoClient
# injecting singletons
from .singletons.logs_manager import LogsManager
# injecting middlewares
from .middlewares.unhandled_exceptions_middleware import (
UnhandledExceptionsMiddleware,
)
from .middlewares.request_id_middleware import RequestIdMiddleware
# injecting models
from .models.db.state import State
from .models.db.graph_template_model import GraphTemplate
from .models.db.registered_node import RegisteredNode
from .models.db.store import Store
from .models.db.run import Run
from .models.db.trigger import DatabaseTriggers
# injecting routes
from .routes import router, global_router
# importing CORS config
from .config.cors import get_cors_config
from .config.settings import get_settings
# importing database health check function
from .utils.check_database_health import check_database_health
#scheduler
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
from .tasks.trigger_cron import trigger_cron
from .tasks.check_node_timeout import check_node_timeout
# Define models list
DOCUMENT_MODELS = [State, GraphTemplate, RegisteredNode, Store, Run, DatabaseTriggers]
scheduler = AsyncIOScheduler()
@asynccontextmanager
async def lifespan(app: FastAPI):
# begaining of the server
logger = LogsManager().get_logger()
logger.info("server starting")
# Get settings
settings = get_settings()
# initializing beanie
client = AsyncMongoClient(settings.mongo_uri)
db = client[settings.mongo_database_name]
await init_beanie(db, document_models=DOCUMENT_MODELS)
logger.info("beanie dbs initialized")
# initialize secret
if not settings.state_manager_secret:
raise ValueError("STATE_MANAGER_SECRET is not set")
logger.info("secret initialized")
# perform database health check
await check_database_health(DOCUMENT_MODELS)
scheduler.add_job(
trigger_cron,
CronTrigger.from_crontab("* * * * *"),
replace_existing=True,
misfire_grace_time=60,
coalesce=True,
max_instances=1,
id="every_minute_task"
)
scheduler.add_job(
check_node_timeout,
CronTrigger.from_crontab("* * * * *"),
replace_existing=True,
misfire_grace_time=60,
coalesce=True,
max_instances=1,
id="check_node_timeout_task"
)
scheduler.start()
# main logic of the server
yield
# end of the server
await client.close()
scheduler.shutdown()
logger.info("server stopped")
app = FastAPI(
lifespan=lifespan,
title="Exosphere State Manager",
description="Exosphere State Manager",
version="0.0.2-beta",
contact={
"name": "Nivedit Jain (Founder exosphere.host)",
"email": "nivedit@exosphere.host",
},
license_info={
"name": "Elastic License 2.0 (ELv2)",
"url": "https://github.com/exospherehost/exosphere-api-server/blob/main/LICENSE",
},
)
# Add middlewares in inner-to-outer order (last added runs first on request):
# 1) UnhandledExceptions (inner)
app.add_middleware(UnhandledExceptionsMiddleware)
# 2) Request ID (middle)
app.add_middleware(RequestIdMiddleware)
# 3) CORS (outermost)
app.add_middleware(CORSMiddleware, **get_cors_config())
@app.get("/health")
def health() -> dict:
return {"message": "OK"}
app.include_router(global_router)
app.include_router(router)