|
3 | 3 | import argparse |
4 | 4 | import asyncio |
5 | 5 | from os import environ |
6 | | -from typing import TYPE_CHECKING, Any |
| 6 | +from typing import TYPE_CHECKING, Any, Final |
7 | 7 |
|
8 | 8 | import sentry_sdk |
9 | | -import uvloop |
10 | 9 | from sanic import Request, Sanic |
11 | 10 | from sanic.log import logger |
12 | 11 | from sanic.response import BaseHTTPResponse |
13 | | -from sanic.worker.loader import AppLoader |
14 | 12 | from sentry_sdk.integrations.asyncio import AsyncioIntegration |
15 | 13 | from sentry_sdk.integrations.grpc import GRPCIntegration |
16 | 14 | from sentry_sdk.integrations.sanic import SanicIntegration, _context_enter, _context_exit, _set_transaction |
|
20 | 18 | from renku_data_services.authz.admin_sync import sync_admins_from_keycloak |
21 | 19 | from renku_data_services.base_models.core import APIUser |
22 | 20 | from renku_data_services.data_api.app import register_all_handlers |
23 | | -from renku_data_services.data_api.prometheus import setup_app_metrics, setup_prometheus |
| 21 | +from renku_data_services.data_api.prometheus import setup_prometheus |
24 | 22 | from renku_data_services.errors.errors import ( |
25 | 23 | ForbiddenError, |
26 | 24 | MissingResourceError, |
|
36 | 34 | import sentry_sdk._types |
37 | 35 |
|
38 | 36 |
|
39 | | -async def _solr_reindex(app: Sanic) -> None: |
| 37 | +async def solr_reindex(config: Config) -> None: |
40 | 38 | """Run a solr reindex of all data. |
41 | 39 |
|
42 | 40 | This might be required after migrating the solr schema. |
43 | 41 | """ |
44 | | - config = Config.from_env() |
| 42 | + logger.info("starting SOLR reindexing.") |
45 | 43 | reprovision = config.search_reprovisioning |
46 | 44 | admin = APIUser(is_admin=True) |
47 | 45 | await reprovision.run_reprovision(admin) |
48 | 46 |
|
49 | 47 |
|
50 | | -def solr_reindex(app_name: str) -> None: |
51 | | - """Runs a solr reindex.""" |
52 | | - app = Sanic(app_name) |
53 | | - setup_app_metrics(app) |
54 | | - |
55 | | - logger.info("Running SOLR reindex triggered by a migration") |
56 | | - asyncio.set_event_loop(uvloop.new_event_loop()) |
57 | | - asyncio.run(_solr_reindex(app)) |
58 | | - |
59 | | - |
60 | 48 | def create_app() -> Sanic: |
61 | 49 | """Create a Sanic application.""" |
62 | 50 | config = Config.from_env() |
@@ -145,30 +133,31 @@ async def do_solr_migrations(app: Sanic) -> None: |
145 | 133 |
|
146 | 134 | @app.before_server_start |
147 | 135 | async def setup_rclone_validator(app: Sanic) -> None: |
| 136 | + logger.info("Setting up rclone validator") |
148 | 137 | validator = RCloneValidator() |
149 | 138 | app.ext.dependency(validator) |
150 | 139 |
|
151 | 140 | @app.main_process_ready |
152 | | - async def ready(app: Sanic) -> None: |
153 | | - """Application ready event handler.""" |
154 | | - logger.info("starting events background job.") |
155 | | - if getattr(app.ctx, "solr_reindex", False): |
156 | | - app.manager.manage("SolrReindex", solr_reindex, {"app_name": app.name}, transient=True) |
| 141 | + async def do_solr_reindex(app: Sanic) -> None: |
| 142 | + """Reindex solr if needed.""" |
| 143 | + if not getattr(app.ctx, "solr_reindex", False): |
| 144 | + return |
| 145 | + app.add_task(solr_reindex(config), name="solr_reindex") |
157 | 146 |
|
158 | 147 | return app |
159 | 148 |
|
160 | 149 |
|
| 150 | +sanic_app: Final[Sanic] = create_app() |
| 151 | + |
161 | 152 | if __name__ == "__main__": |
162 | 153 | parser = argparse.ArgumentParser(prog="Renku Data Services") |
163 | 154 | # NOTE: K8s probes will fail if listening only on 127.0.0.1 - so we listen on 0.0.0.0 |
164 | 155 | parser.add_argument("-H", "--host", default="0.0.0.0", help="Host to listen on") # nosec B104 |
165 | 156 | parser.add_argument("-p", "--port", default=8000, type=int, help="Port to listen on") |
166 | 157 | parser.add_argument("--debug", action="store_true", help="Enable Sanic debug mode") |
167 | 158 | parser.add_argument("--fast", action="store_true", help="Enable Sanic fast mode") |
| 159 | + parser.add_argument("--workers", default=1, type=int, help="The number of workers to use.") |
168 | 160 | parser.add_argument("-d", "--dev", action="store_true", help="Enable Sanic development mode") |
169 | 161 | parser.add_argument("--single-process", action="store_true", help="Do not use multiprocessing.") |
170 | 162 | args: dict[str, Any] = vars(parser.parse_args()) |
171 | | - loader = AppLoader(factory=create_app) |
172 | | - app = loader.load() |
173 | | - app.prepare(**args) |
174 | | - Sanic.serve(primary=app, app_loader=loader) |
| 163 | + sanic_app.run(**args) |
0 commit comments