Coverage for /Users/buh/.pyenv/versions/3.12.9/envs/es-testbed/lib/python3.12/site-packages/es_testbed/mgrs/data_stream.py: 96%
70 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-16 12:23 -0600
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-16 12:23 -0600
1"""data_stream Entity Manager Class"""
3import typing as t
4import logging
5from importlib import import_module
6from ..debug import debug, begin_end
7from ..entities import DataStream, Index
8from ..es_api import create_data_stream, fill_index
9from ..utils import prettystr
10from .index import IndexMgr
11from .snapshot import SnapshotMgr
13if t.TYPE_CHECKING:
14 from elasticsearch8 import Elasticsearch
15 from dotmap import DotMap
17logger = logging.getLogger(__name__)
20class DataStreamMgr(IndexMgr):
21 """data_stream Entity Manager Class"""
23 kind = 'data_stream'
24 listname = 'data_stream'
26 def __init__(
27 self,
28 client: t.Union['Elasticsearch', None] = None,
29 plan: t.Union['DotMap', None] = None,
30 snapmgr: t.Union[SnapshotMgr, None] = None,
31 ):
32 self.ds = None
33 self.index_trackers = []
34 debug.lv3('Initializing DataStreamMgr object...')
35 super().__init__(client=client, plan=plan, snapmgr=snapmgr)
36 debug.lv3('DataStreamMgr object initialized')
38 @property
39 def suffix(self):
40 """Return nothing, as there is no index count suffix to a data_stream name"""
41 return ''
43 @property
44 def indexlist(self) -> t.Sequence[str]:
45 """Get the current list of indices in the data_stream"""
46 return [x.name for x in self.index_trackers]
48 @begin_end()
49 def add(self, value):
50 """Create a data stream and track it"""
51 try:
52 debug.lv4(f'TRY: Creating data_stream {value}')
53 create_data_stream(self.client, value)
54 except Exception as err:
55 logger.critical(f'Error creating data_stream: {prettystr(err)}')
56 raise err
57 self.track_data_stream()
59 @begin_end()
60 def searchable(self):
61 """If the indices were marked as searchable snapshots, we do that now"""
62 for idx, scheme in enumerate(self.plan.index_buildlist):
63 self.index_trackers[idx].mount_ss(scheme)
64 logger.info('Completed backing index promotion to searchable snapshots.')
65 debug.lv5(f'data_stream backing indices: {prettystr(self.ds.backing_indices)}')
67 @begin_end()
68 def setup(self) -> None:
69 """Setup the entity manager"""
70 self.index_trackers = [] # Inheritance oddity requires redeclaration here
71 mod = import_module(f'{self.plan.modpath}.functions')
72 func = getattr(mod, 'doc_generator')
73 for scheme in self.plan.index_buildlist:
74 if not self.entity_list:
75 self.add(self.name)
76 else:
77 self.ds.rollover()
78 fill_index(
79 self.client,
80 name=self.name,
81 doc_generator=func,
82 options=scheme['options'],
83 )
84 debug.lv2(f'Created data_stream: {self.ds.name}')
85 debug.lv3(
86 f'Created data_stream backing indices: {prettystr(self.ds.backing_indices)}'
87 )
88 for index in self.ds.backing_indices:
89 self.track_index(index)
90 self.ds.verify(self.indexlist)
91 self.searchable()
92 self.ds.verify(self.indexlist)
93 logger.info('Successfully completed data_stream buildout.')
95 @begin_end()
96 def track_data_stream(self) -> None:
97 """Add a DataStream entity and append it to entity_list"""
98 debug.lv3(f'Tracking data_stream: {self.name}')
99 self.ds = DataStream(client=self.client, name=self.name)
100 self.appender(self.name)
102 @begin_end()
103 def track_index(self, name: str) -> None:
104 """Add an Index entity and append it to index_trackers"""
105 debug.lv3(f'Tracking index: "{name}"')
106 entity = Index(
107 client=self.client,
108 name=name,
109 snapmgr=self.snapmgr,
110 policy_name=self.policy_name,
111 )
112 entity.track_ilm(name)
113 self.index_trackers.append(entity)