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-03-31 13:12 -0600

1""" 

2Searchable Snapshot Test Scenarios 

3 

4The repository should be configurable at runtime, so we make it use the TEST_ES_REPO 

5env var. 

6""" 

7 

8from os import environ 

9import typing as t 

10import logging 

11 

12logger = logging.getLogger(__name__) 

13 

14REPOSITORY = environ.get('TEST_ES_REPO', 'found-snapshots') 

15 

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# } 

28 

29 

30class Scenarios: 

31 """Scenarios Class""" 

32 

33 def __init__(self): 

34 """Initialize the scenarios for this preset""" 

35 _ = 'init' # Add to avoid empty function body 

36 

37 # ##################### 

38 # ### Hot Scenarios ### 

39 # ##################### 

40 

41 @property 

42 def hot(self): 

43 """Basic hot scenario""" 

44 return self.scenario_builder('hot', 'basic') 

45 

46 @property 

47 def hot_rollover(self): 

48 """Hot rollover index scenario""" 

49 return self.scenario_builder('hot', 'rollover') 

50 

51 @property 

52 def hot_ds(self): 

53 """Hot data_stream scenario""" 

54 return self.scenario_builder('hot', 'data_stream') 

55 

56 # ###################### 

57 # ### Cold Scenarios ### 

58 # ###################### 

59 

60 @property 

61 def cold(self): 

62 """Basic cold scenario""" 

63 return self.scenario_builder('cold', 'basic') 

64 

65 @property 

66 def cold_rollover(self): 

67 """Cold rollover index scenario""" 

68 return self.scenario_builder('cold', 'rollover') 

69 

70 @property 

71 def cold_ilm(self): 

72 """Cold ilm index scenario""" 

73 return self.scenario_builder('cold', 'ilm') 

74 

75 @property 

76 def cold_ds(self): 

77 """Cold data_stream scenario""" 

78 return self.scenario_builder('cold', 'data_stream') 

79 

80 # ######################## 

81 # ### Frozen Scenarios ### 

82 # ######################## 

83 

84 @property 

85 def frozen(self): 

86 """Basic frozen scenario""" 

87 return self.scenario_builder('frozen', 'basic') 

88 

89 @property 

90 def frozen_rollover(self): 

91 """Frozen rollover index scenario""" 

92 return self.scenario_builder('frozen', 'rollover') 

93 

94 @property 

95 def frozen_ilm(self): 

96 """Frozen ilm index scenario""" 

97 return self.scenario_builder('frozen', 'ilm') 

98 

99 @property 

100 def frozen_ds(self): 

101 """Frozen data_stream scenario""" 

102 return self.scenario_builder('frozen', 'data_stream') 

103 

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 ] 

117 

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 

130 

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