Coverage for /Users/buh/.pyenv/versions/3.12.2/envs/es-testbed/lib/python3.12/site-packages/es_testbed/presets/searchable_test/scenarios.py: 100%

60 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-08-30 19:06 -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 

36 # ##################### 

37 # ### Hot Scenarios ### 

38 # ##################### 

39 

40 @property 

41 def hot(self): 

42 """Basic hot scenario""" 

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

44 

45 @property 

46 def hot_rollover(self): 

47 """Hot rollover index scenario""" 

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

49 

50 @property 

51 def hot_ds(self): 

52 """Hot data_stream scenario""" 

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

54 

55 # ###################### 

56 # ### Cold Scenarios ### 

57 # ###################### 

58 

59 @property 

60 def cold(self): 

61 """Basic cold scenario""" 

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

63 

64 @property 

65 def cold_rollover(self): 

66 """Cold rollover index scenario""" 

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

68 

69 @property 

70 def cold_ilm(self): 

71 """Cold ilm index scenario""" 

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

73 

74 @property 

75 def cold_ds(self): 

76 """Cold data_stream scenario""" 

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

78 

79 # ######################## 

80 # ### Frozen Scenarios ### 

81 # ######################## 

82 

83 @property 

84 def frozen(self): 

85 """Basic frozen scenario""" 

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

87 

88 @property 

89 def frozen_rollover(self): 

90 """Frozen rollover index scenario""" 

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

92 

93 @property 

94 def frozen_ilm(self): 

95 """Frozen ilm index scenario""" 

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

97 

98 @property 

99 def frozen_ds(self): 

100 """Frozen data_stream scenario""" 

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

102 

103 def build_list(self) -> t.Sequence[t.Dict]: 

104 """The plan build list for these scenarios""" 

105 return [ 

106 { 

107 'options': { 

108 'count': 10, 

109 'start_at': 0, 

110 'match': True, 

111 }, 

112 'target_tier': 'frozen', 

113 }, 

114 { 

115 'options': { 

116 'count': 10, 

117 'start_at': 10, 

118 'match': True, 

119 }, 

120 'target_tier': 'frozen', 

121 }, 

122 { 

123 'options': { 

124 'count': 10, 

125 'start_at': 20, 

126 'match': True, 

127 }, 

128 'target_tier': 'hot', 

129 }, 

130 ] 

131 

132 def define_ilm( 

133 self, 

134 phase: t.Literal['hot', 'warm', 'cold', 'frozen'], 

135 subtype: t.Literal['basic', 'rollover', 'ilm', 'data_stream'], 

136 ) -> t.Union[t.Dict, bool]: 

137 """Return ILM based on subtype""" 

138 retval = {'enabled': False, 'phases': ['hot', 'delete']} 

139 if phase in ['cold', 'frozen']: 

140 retval['phases'].append(phase) 

141 if subtype in ['ilm', 'data_stream']: 

142 retval['enabled'] = True 

143 return retval 

144 

145 def scenario_builder( 

146 self, 

147 phase: t.Literal['hot', 'warm', 'cold', 'frozen'] = 'hot', 

148 subtype: t.Literal['basic', 'rollover', 'ilm', 'data_stream'] = 'basic', 

149 ) -> t.Dict: 

150 """Build a scenario""" 

151 retval = { 

152 'repository': REPOSITORY, 

153 'index_buildlist': self.build_list(), 

154 'ilm': {'enabled': False, 'phases': ['hot', 'delete']}, 

155 } 

156 for idx in range(0, len(retval['index_buildlist'])): 

157 # By default, make everything have the phase as the target_tier 

158 retval['index_buildlist'][idx]['target_tier'] = phase 

159 if subtype != 'basic': 

160 # The last entry should always be hot in rollover, ilm, and data_stream 

161 retval['index_buildlist'][-1]['target_tier'] = 'hot' 

162 if subtype in ['rollover', 'ilm']: 

163 retval['rollover_alias'] = True 

164 retval['ilm'] = self.define_ilm(phase, subtype) 

165 retval['type'] = 'data_stream' if subtype == 'data_stream' else 'indices' 

166 return retval