diff --git a/swh/search/api/server.py b/swh/search/api/server.py --- a/swh/search/api/server.py +++ b/swh/search/api/server.py @@ -16,6 +16,8 @@ from .. import get_search from ..interface import SearchInterface +logger = logging.getLogger(__name__) + def _get_search(): global search @@ -41,6 +43,13 @@ return "SWH Search API server" +@app.before_first_request +def initialized_index(): + search = _get_search() + logger.info("Initializing indexes with configuration: ", search.origin_config) + search.initialize() + + api_cfg = None diff --git a/swh/search/tests/test_server.py b/swh/search/tests/test_server.py --- a/swh/search/tests/test_server.py +++ b/swh/search/tests/test_server.py @@ -11,9 +11,15 @@ from swh.core.api import RPCServerApp from swh.core.config import load_from_envvar +from swh.search.api import server from swh.search.api.server import load_and_check_config, make_app_from_configfile +def teardown_function(): + # Ensure there is no configuration loaded from a previous test + server.api_cfg = None + + def _write_config_file(tmp_path, monkeypatch, content): conf_path = os.path.join(str(tmp_path), "search.yml") with open(conf_path, "w") as f: @@ -32,8 +38,10 @@ swh_search_server_config_without_indexes, ) -> Dict[str, Any]: return { - **swh_search_server_config_without_indexes, - **{"indexes": {"origin": {"index": "test"}}}, + "search": { + **{"indexes": {"origin": {"index": "test"}}}, + **swh_search_server_config_without_indexes["search"], + } } @@ -122,10 +130,27 @@ def test_server_make_app_from_config_file_with_indexes(swh_search_config_with_indexes,): app = make_app_from_configfile() expected_cfg = load_from_envvar() - assert app is not None assert isinstance(app, RPCServerApp) assert app.config["search"] == expected_cfg["search"] app2 = make_app_from_configfile() assert app is app2 + + +def test_server_first_call_initialize_elasticsearch( + swh_search_config_with_indexes, mocker +): + """Test the initialize method is called during the first and first only + request to the server""" + mock = mocker.patch("swh.search.elasticsearch.ElasticSearch.initialize") + + app = make_app_from_configfile() + app.config["TESTING"] = True + tc = app.test_client() + + tc.get("/") + assert mock.call_count == 1 + + tc.get("/") + assert mock.call_count == 1