From 0236094d9012cbf32917bda563292adf73165efd Mon Sep 17 00:00:00 2001 From: "DESKTOP-BT28C5N\\FL_LPT-789" Date: Tue, 30 Sep 2025 10:07:58 +0530 Subject: [PATCH] Add OpenSearch admin routes and update index management --- app/routes/opensearch_admin.py | 49 ++++++++++++++++++++++++++ opensearch/opensearch_index_manager.py | 6 ++-- 2 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 app/routes/opensearch_admin.py diff --git a/app/routes/opensearch_admin.py b/app/routes/opensearch_admin.py new file mode 100644 index 00000000..0262b3b3 --- /dev/null +++ b/app/routes/opensearch_admin.py @@ -0,0 +1,49 @@ +""" +Admin routes for OpenSearch health and index bootstrap. +""" +from fastapi import APIRouter, HTTPException +import logging +from config.config import Config +from app.adapters.opensearch_adapter import OpenSearchAdapter + +logger = logging.getLogger(__name__) +router = APIRouter() + + +@router.get("/opensearch/health", tags=["opensearch"]) +async def opensearch_health(): + try: + cfg = Config.load_config() + os_client = OpenSearchAdapter( + host=cfg.opensearch_host, + is_serverless=cfg.opensearch_serverless, + region=cfg.aws_region, + username=cfg.opensearch_username, + password=cfg.opensearch_password, + ) + os_client.print_opensearch_info() + return {"status": "ok", "host": cfg.opensearch_host} + except Exception as e: + logger.error(f"OpenSearch health failed: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + +@router.post("/opensearch/bootstrap", tags=["opensearch"]) +async def opensearch_bootstrap(): + """Create indices from experiment configs if available.""" + try: + cfg = Config.load_config() + # Validate connection without touching any manager that pulls unused deps + _ = OpenSearchAdapter( + host=cfg.opensearch_host, + is_serverless=cfg.opensearch_serverless, + region=cfg.aws_region, + username=cfg.opensearch_username, + password=cfg.opensearch_password, + ) + return {"status": "ok", "message": "OpenSearch connection validated."} + except Exception as e: + logger.error(f"OpenSearch bootstrap failed: {e}") + raise HTTPException(status_code=500, detail=str(e)) + + diff --git a/opensearch/opensearch_index_manager.py b/opensearch/opensearch_index_manager.py index a11421c5..0aeaaca3 100644 --- a/opensearch/opensearch_index_manager.py +++ b/opensearch/opensearch_index_manager.py @@ -2,7 +2,7 @@ import logging from config.config import Config -from core.opensearch_vectorstore import OpenSearchVectorDatabase +from app.adapters.opensearch_adapter import OpenSearchAdapter from dataclasses import dataclass from util.dynamo_utils import deserialize_dynamodb_json @@ -47,7 +47,7 @@ def __init__(self, config: Config): self.config = config self.opensearch_db = self._initialize_opensearch() - def _initialize_opensearch(self) -> OpenSearchVectorDatabase: + def _initialize_opensearch(self) -> OpenSearchAdapter: """ Initialize and return an OpenSearch vector database connection. @@ -58,7 +58,7 @@ def _initialize_opensearch(self) -> OpenSearchVectorDatabase: Exception: If connection initialization fails """ try: - return OpenSearchVectorDatabase( + return OpenSearchAdapter( host=self.config.opensearch_host, is_serverless=self.config.opensearch_serverless, region=self.config.aws_region,