Coverage for /Users/buh/.pyenv/versions/3.12.2/envs/es-testbed/lib/python3.12/site-packages/es_testbed/mgrs/index.py: 97%
76 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-05-02 18:19 -0600
« prev ^ index » next coverage.py v7.4.4, created at 2024-05-02 18:19 -0600
1"""Index Entity Manager Class"""
3import typing as t
4import logging
5from es_testbed.entities import Alias, Index
6from es_testbed.helpers.es_api import create_index, fill_index
7from es_testbed.helpers.utils import prettystr, setting_component
8from es_testbed.mgrs.entity import EntityMgr
9from es_testbed.mgrs.snapshot import SnapshotMgr
11if t.TYPE_CHECKING:
12 from elasticsearch8 import Elasticsearch
13 from dotmap import DotMap
15logger = logging.getLogger(__name__)
18class IndexMgr(EntityMgr):
19 """Index Entity Manager Class"""
21 kind = 'index'
22 listname = 'indices'
24 def __init__(
25 self,
26 client: t.Union['Elasticsearch', None] = None,
27 plan: t.Union['DotMap', None] = None,
28 snapmgr: t.Union[SnapshotMgr, None] = None,
29 ):
30 self.doc_incr = 0
31 self.snapmgr = snapmgr
32 self.alias = None # Only used for tracking the rollover alias
33 super().__init__(client=client, plan=plan)
35 @property
36 def indexlist(self) -> t.Sequence[str]:
37 """Return a list of index names currently being managed"""
38 return [x.name for x in self.entity_list]
40 @property
41 def policy_name(self) -> t.Union[str, None]:
42 """Return the name of the ILM policy, if it exists"""
43 if len(self.plan.ilm_policies) > 0:
44 return self.plan.ilm_policies[-1]
45 return None
47 def _rollover_path(self) -> None:
48 """This is the execution path for rollover indices"""
49 if not self.entity_list:
50 kw = {
51 'ilm_policy': self.policy_name,
52 'rollover_alias': self.plan.rollover_alias,
53 }
54 cfg = setting_component(**kw)['settings']
55 acfg = {self.plan.rollover_alias: {'is_write_index': True}}
56 logger.debug(
57 'No indices created yet. Starting with a rollover alias index...'
58 )
59 create_index(self.client, self.name, aliases=acfg, settings=cfg)
60 logger.debug(
61 'Created %s with rollover alias %s', self.name, self.plan.rollover_alias
62 )
63 self.track_alias()
64 else:
65 self.alias.rollover()
66 if self.policy_name: # We have an ILM policy
67 kw = {'phase': 'hot', 'action': 'complete', 'name': 'complete'}
68 self.last.ilm_tracker.advance(**kw)
70 def add(self, value) -> None:
71 """Create a single index"""
72 # In this case, value is a single array element from plan.entities
73 logger.debug('Creating index: "%s"', value)
74 create_index(self.client, value)
76 def add_indices(self) -> None:
77 """Add indices according to plan"""
78 for scheme in self.plan.entities:
79 if self.plan.rollover_alias:
80 self._rollover_path()
81 else:
82 self.add(self.name)
83 self.filler(scheme)
84 self.track_index(self.name)
85 logger.debug('Created indices: %s', prettystr(self.indexlist))
86 if self.plan.rollover_alias:
87 if not self.alias.verify(self.indexlist):
88 logger.error(
89 'Unable to confirm rollover of alias "%s" was successful',
90 self.plan.rollover_alias,
91 )
93 def filler(self, scheme) -> None:
94 """If the scheme from the TestPlan says to write docs, do it"""
95 # scheme is a single array element from plan.entities
96 logger.debug('Adding docs to "%s"', self.name)
97 if scheme['docs'] > 0:
98 fill_index(
99 self.client,
100 name=self.name,
101 count=scheme['docs'],
102 start_num=self.doc_incr,
103 match=scheme['match'],
104 )
105 self.doc_incr += scheme['docs']
107 def searchable(self) -> None:
108 """If the indices were marked as searchable snapshots, we do that now"""
109 for idx, scheme in enumerate(self.plan.entities):
110 self.entity_list[idx].mount_ss(scheme)
112 def setup(self) -> None:
113 """Setup the entity manager"""
114 logger.debug('Beginning setup...')
115 logger.debug('PLAN: %s', prettystr(self.plan.toDict()))
116 if self.plan.rollover_alias:
117 logger.debug('rollover_alias is True...')
118 self.add_indices()
119 self.searchable()
120 logger.info('Successfully created indices: %s', prettystr(self.indexlist))
122 def track_alias(self) -> None:
123 """Track a rollover alias"""
124 logger.debug('Tracking alias: %s', self.plan.rollover_alias)
125 self.alias = Alias(client=self.client, name=self.plan.rollover_alias)
127 def track_index(self, name: str) -> None:
128 """Track an index and append that tracking entity to entity_list"""
129 logger.debug('Tracking index: %s', name)
130 entity = Index(
131 client=self.client,
132 name=name,
133 snapmgr=self.snapmgr,
134 policy_name=self.policy_name,
135 )
136 entity.track_ilm(self.name)
137 self.entity_list.append(entity)