Coverage for /Users/buh/.pyenv/versions/3.12.9/envs/es-testbed/lib/python3.12/site-packages/es_testbed/presets/searchable_test/scenarios.py: 100%
61 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-17 22:23 -0600
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-17 22:23 -0600
1"""
2Searchable Snapshot Test Scenarios
4The repository should be configurable at runtime, so we make it use the TEST_ES_REPO
5env var.
6"""
8from os import environ
9import typing as t
10import logging
12logger = logging.getLogger(__name__)
14REPOSITORY = environ.get('TEST_ES_REPO', 'found-snapshots')
16# default values = {
17# 'type': 'indices',
18# 'rollover_alias': False,
19# 'repository': REPOSITORY,
20# 'ilm': {
21# 'enabled': False,
22# 'phases': ['hot', 'delete'],
23# 'readonly': None,
24# 'max_num_segments': 1,
25# 'forcemerge': False,
26# },
27# }
30class Scenarios:
31 """Scenarios Class"""
33 def __init__(self):
34 """Initialize the scenarios for this preset"""
35 _ = 'init' # Add to avoid empty function body
37 # #####################
38 # ### Hot Scenarios ###
39 # #####################
41 @property
42 def hot(self):
43 """Basic hot scenario"""
44 return self.scenario_builder('hot', 'basic')
46 @property
47 def hot_rollover(self):
48 """Hot rollover index scenario"""
49 return self.scenario_builder('hot', 'rollover')
51 @property
52 def hot_ds(self):
53 """Hot data_stream scenario"""
54 return self.scenario_builder('hot', 'data_stream')
56 # ######################
57 # ### Cold Scenarios ###
58 # ######################
60 @property
61 def cold(self):
62 """Basic cold scenario"""
63 return self.scenario_builder('cold', 'basic')
65 @property
66 def cold_rollover(self):
67 """Cold rollover index scenario"""
68 return self.scenario_builder('cold', 'rollover')
70 @property
71 def cold_ilm(self):
72 """Cold ilm index scenario"""
73 return self.scenario_builder('cold', 'ilm')
75 @property
76 def cold_ds(self):
77 """Cold data_stream scenario"""
78 return self.scenario_builder('cold', 'data_stream')
80 # ########################
81 # ### Frozen Scenarios ###
82 # ########################
84 @property
85 def frozen(self):
86 """Basic frozen scenario"""
87 return self.scenario_builder('frozen', 'basic')
89 @property
90 def frozen_rollover(self):
91 """Frozen rollover index scenario"""
92 return self.scenario_builder('frozen', 'rollover')
94 @property
95 def frozen_ilm(self):
96 """Frozen ilm index scenario"""
97 return self.scenario_builder('frozen', 'ilm')
99 @property
100 def frozen_ds(self):
101 """Frozen data_stream scenario"""
102 return self.scenario_builder('frozen', 'data_stream')
104 def build_list(self) -> t.Sequence[t.Dict]:
105 """The plan build list for these scenarios"""
106 return [
107 {
108 'options': {
109 'count': 10,
110 'start_at': i * 10,
111 'match': True,
112 },
113 'target_tier': 'frozen' if i < 2 else 'hot',
114 }
115 for i in range(3)
116 ]
118 def define_ilm(
119 self,
120 phase: t.Literal['hot', 'warm', 'cold', 'frozen'],
121 subtype: t.Literal['basic', 'rollover', 'ilm', 'data_stream'],
122 ) -> t.Union[t.Dict, bool]:
123 """Return ILM based on subtype"""
124 retval = {'enabled': False, 'phases': ['hot', 'delete']}
125 if phase in ['cold', 'frozen']:
126 retval['phases'].append(phase)
127 if subtype in ['ilm', 'data_stream']:
128 retval['enabled'] = True
129 return retval
131 def scenario_builder(
132 self,
133 phase: t.Literal['hot', 'warm', 'cold', 'frozen'] = 'hot',
134 subtype: t.Literal['basic', 'rollover', 'ilm', 'data_stream'] = 'basic',
135 ) -> t.Dict:
136 """Build a scenario"""
137 retval = {
138 'repository': REPOSITORY,
139 'index_buildlist': self.build_list(),
140 'ilm': {'enabled': False, 'phases': ['hot', 'delete']},
141 }
142 for idx in range(len(retval['index_buildlist'])):
143 # By default, make everything have the phase as the target_tier
144 retval['index_buildlist'][idx]['target_tier'] = phase
145 if subtype != 'basic':
146 # The last entry should always be hot in rollover, ilm, and data_stream
147 retval['index_buildlist'][-1]['target_tier'] = 'hot'
148 if subtype in ['rollover', 'ilm']:
149 retval['rollover_alias'] = True
150 retval['ilm'] = self.define_ilm(phase, subtype)
151 retval['type'] = 'data_stream' if subtype == 'data_stream' else 'indices'
152 return retval