Coverage for conf/settings/elasticsearch.py: 90%

19 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 06:14 +0000

1"""This file contains configuration pertaining to Elasticsearch.""" 

2 

3from decouple import config 

4from elasticsearch import Elasticsearch 

5from elasticsearch_dsl import connections 

6 

7from api.constants.media_types import MEDIA_TYPES 

8 

9 

10def _elasticsearch_connect() -> tuple[Elasticsearch, str]: 

11 """ 

12 Connect to configured Elasticsearch domain. 

13 

14 :return: An Elasticsearch connection object. 

15 """ 

16 

17 es_scheme = config("ELASTICSEARCH_SCHEME", default="http://") 

18 es_url = config("ELASTICSEARCH_URL", default="localhost") 

19 es_port = config("ELASTICSEARCH_PORT", default=9200, cast=int) 

20 

21 es_endpoint = f"{es_scheme}{es_url}:{es_port}" 

22 

23 _es = Elasticsearch( 

24 es_endpoint, 

25 # TODO: Return to default timeout of 10s and 1 retry once 

26 # TODO: Elasticsearch response time has been stabilized 

27 request_timeout=12, 

28 max_retries=3, 

29 retry_on_timeout=True, 

30 ) 

31 _es.info() 

32 _es.cluster.health(wait_for_status="yellow") 

33 return _es, es_endpoint 

34 

35 

36SETUP_ES = config("SETUP_ES", default=True, cast=bool) 

37if SETUP_ES: 37 ↛ 43line 37 didn't jump to line 43 because the condition on line 37 was always true

38 ES, ES_ENDPOINT = _elasticsearch_connect() 

39 #: Elasticsearch client, also aliased to connection 'default' 

40 

41 connections.add_connection("default", ES) 

42else: 

43 ES, ES_ENDPOINT = None, None 

44 

45MEDIA_INDEX_MAPPING = { 

46 media_type: config(f"{media_type.upper()}_INDEX_NAME", default=media_type) 

47 for media_type in MEDIA_TYPES 

48} 

49#: mapping of media types to Elasticsearch index names