1616from sentry_sdk .integrations .sanic import SanicIntegration , _context_enter , _context_exit , _set_transaction
1717
1818import renku_data_services .search .core as search_core
19+ import renku_data_services .solr .entity_schema as entity_schema
1920from renku_data_services .app_config import Config
2021from renku_data_services .authz .admin_sync import sync_admins_from_keycloak
22+ from renku_data_services .base_models .core import APIUser
2123from renku_data_services .data_api .app import register_all_handlers
2224from renku_data_services .data_api .prometheus import collect_system_metrics , setup_app_metrics , setup_prometheus
2325from renku_data_services .errors .errors import (
2729 ValidationError ,
2830)
2931from renku_data_services .migrations .core import run_migrations_for_app
30- from renku_data_services .solr import entity_schema
3132from renku_data_services .solr .solr_client import DefaultSolrClient
3233from renku_data_services .solr .solr_migrate import SchemaMigrator
3334from renku_data_services .storage .rclone import RCloneValidator
@@ -72,6 +73,17 @@ async def _update_search(app: Sanic) -> None:
7273 raise
7374
7475
76+ async def _solr_reindex (app : Sanic ) -> None :
77+ """Run a solr reindex of all data.
78+
79+ This might be required after migrating the solr schema.
80+ """
81+ config = Config .from_env ()
82+ reprovision = config .search_reprovisioning
83+ admin = APIUser (is_admin = True )
84+ await reprovision .run_reprovision (admin )
85+
86+
7587def send_pending_events (app_name : str ) -> None :
7688 """Send pending messages to redis."""
7789 app = Sanic (app_name )
@@ -94,6 +106,16 @@ def update_search(app_name: str) -> None:
94106 asyncio .run (_update_search (app ))
95107
96108
109+ def solr_reindex (app_name : str ) -> None :
110+ """Runs a solr reindex."""
111+ app = Sanic (app_name )
112+ setup_app_metrics (app )
113+
114+ logger .info ("Running SOLR reindex triggered by a migration" )
115+ asyncio .set_event_loop (uvloop .new_event_loop ())
116+ asyncio .run (_solr_reindex (app ))
117+
118+
97119def create_app () -> Sanic :
98120 """Create a Sanic application."""
99121 config = Config .from_env ()
@@ -171,11 +193,13 @@ async def do_migrations(_: Sanic) -> None:
171193 await config .rp_repo .initialize (config .db .conn_url (async_client = False ), config .default_resource_pool )
172194
173195 @app .main_process_start
174- async def do_solr_migrations (_ : Sanic ) -> None :
196+ async def do_solr_migrations (app : Sanic ) -> None :
175197 logger .info (f"Running SOLR migrations at: { config .solr_config } " )
176198 migrator = SchemaMigrator (config .solr_config )
177199 await migrator .ensure_core ()
178200 result = await migrator .migrate (entity_schema .all_migrations )
201+ # starting background tasks can only be done in `main_process_ready`
202+ app .ctx .solr_reindex = result .requires_reindex
179203 logger .info (f"SOLR migration done: { result } " )
180204
181205 @app .before_server_start
@@ -186,10 +210,11 @@ async def setup_rclone_validator(app: Sanic) -> None:
186210 @app .main_process_ready
187211 async def ready (app : Sanic ) -> None :
188212 """Application ready event handler."""
189- config = Config .from_env ()
190213 logger .info ("starting events background job." )
191- app .manager .manage ("SendEvents" , send_pending_events , {"app_name" : config .app_name }, transient = True )
192- app .manager .manage ("UpdateSearch" , update_search , {"app_name" : config .app_name }, transient = True )
214+ app .manager .manage ("SendEvents" , send_pending_events , {"app_name" : app .name }, transient = True )
215+ app .manager .manage ("UpdateSearch" , update_search , {"app_name" : app .name }, transient = True )
216+ if getattr (app .ctx , "solr_reindex" , False ):
217+ app .manager .manage ("SolrReindex" , solr_reindex , {"app_name" : app .name }, transient = True )
193218
194219 return app
195220
0 commit comments