Skip to content

Commit cbad469

Browse files
committed
feat: support global OS prefix
1 parent 427a9ef commit cbad469

7 files changed

Lines changed: 27 additions & 4 deletions

File tree

diracx-core/src/diracx/core/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
__all__ = [
66
"AuthSettings",
77
"DevelopmentSettings",
8+
"FactorySettings",
89
"LocalFileUrl",
910
"SandboxStoreSettings",
1011
"ServiceSettingsBase",
@@ -390,6 +391,11 @@ class FactorySettings(ServiceSettingsBase):
390391
)
391392
"""The url for the redis server to manage tasks"""
392393

394+
os_global_prefix: str = Field(
395+
default="", validation_alias="DIRACX_FACTORY_OS_GLOBAL_PREFIX"
396+
)
397+
"""Global prefix for OpenSearch database indices."""
398+
393399
enabled_services: dict[str, bool] = Field(default_factory=dict)
394400
"""The following environment variables dictates which routers are enabled."""
395401

diracx-db/src/diracx/db/os/utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,17 @@ class BaseOSDB(metaclass=ABCMeta):
8080
@abstractmethod
8181
def index_name(self, vo: str, doc_id: int) -> str: ...
8282

83-
def __init__(self, connection_kwargs: dict[str, Any]) -> None:
83+
def __init__(
84+
self, connection_kwargs: dict[str, Any], *, global_prefix: str = ""
85+
) -> None:
8486
self._client: AsyncOpenSearch | None = None
8587
self._connection_kwargs = connection_kwargs
8688
# We use a ContextVar to make sure that self._conn
8789
# is specific to each context, and avoid parallel
8890
# route executions to overlap
8991
self._conn: ContextVar[bool] = ContextVar("_conn", default=False)
92+
if global_prefix:
93+
self.index_prefix = f"{global_prefix}_{self.index_prefix}"
9094

9195
@classmethod
9296
def available_implementations(cls, db_name: str) -> list[type[BaseOSDB]]:

diracx-routers/src/diracx/routers/factory.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,14 @@ def create_app_inner(
242242
app.dependency_overrides[source_cls.create] = source.read
243243

244244
# Add the OpenSearch DBs to the application
245+
os_global_prefix = FactorySettings().os_global_prefix
245246
available_os_db_classes: set[type[BaseOSDB]] = set()
246247
for db_name, connection_kwargs in os_database_conn_kwargs.items():
247248
os_db_classes = BaseOSDB.available_implementations(db_name)
248249
# The first DB is the highest priority one
249-
os_db = os_db_classes[0](connection_kwargs=connection_kwargs)
250+
os_db = os_db_classes[0](
251+
connection_kwargs=connection_kwargs, global_prefix=os_global_prefix
252+
)
250253
app.lifetime_functions.append(os_db.client_context)
251254
# Add overrides for all the DB classes, including those from extensions
252255
# This means vanilla DiracX routers get an instance of the extension's DB

diracx-tasks/src/diracx/tasks/plumbing/factory.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,12 @@ async def setup_dependency_overrides(
305305
)
306306

307307
# --- OS databases ---
308+
os_global_prefix = FactorySettings().os_global_prefix
308309
for db_name, conn_kwargs in BaseOSDB.available_urls().items():
309310
os_db_classes = BaseOSDB.available_implementations(db_name)
310-
os_db = os_db_classes[0](connection_kwargs=conn_kwargs)
311+
os_db = os_db_classes[0](
312+
connection_kwargs=conn_kwargs, global_prefix=os_global_prefix
313+
)
311314
await stack.enter_async_context(os_db.client_context())
312315
for os_db_class in os_db_classes:
313316
overrides[os_db_class.session] = partial(_db_context, os_db)

diracx-testing/src/diracx/testing/mock_osdb.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ class JobParametersDB(MockOSDBMixin, JobParametersDB):
3636
JobParametersDB = type("JobParametersDB", (MockOSDBMixin, JobParametersDB), {})
3737
"""
3838

39-
def __init__(self, connection_kwargs: dict[str, Any]) -> None:
39+
def __init__(
40+
self, connection_kwargs: dict[str, Any], global_prefix: str = ""
41+
) -> None:
4042
from sqlalchemy import JSON, Column, DateTime, Integer, MetaData, String, Table
4143

4244
# Dynamically create a subclass of BaseSQLDB so we get clearer errors

docs/admin/reference/env-variables.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ The hashed API key for the legacy exchange endpoint.
3333
*Optional*, default value: `redis://localhost`
3434
The url for the redis server to manage tasks
3535

36+
### `DIRACX_FACTORY_OS_GLOBAL_PREFIX`
37+
38+
*Optional*, default value: \`\`
39+
Global prefix for OpenSearch database indices.
40+
3641
### `ENABLED_SERVICES`
3742

3843
*Optional*

toto

Whitespace-only changes.

0 commit comments

Comments
 (0)