Coverage for manila/tests/scheduler/filters/test_capabilities.py: 100%

58 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2026-02-18 22:19 +0000

1# Copyright 2011 OpenStack Foundation. 

2# All Rights Reserved. 

3# 

4# Licensed under the Apache License, Version 2.0 (the "License"); you may 

5# not use this file except in compliance with the License. You may obtain 

6# a copy of the License at 

7# 

8# http://www.apache.org/licenses/LICENSE-2.0 

9# 

10# Unless required by applicable law or agreed to in writing, software 

11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 

12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 

13# License for the specific language governing permissions and limitations 

14# under the License. 

15 

16""" 

17Tests For CapabilitiesFilter. 

18""" 

19 

20import ddt 

21 

22from manila.scheduler.filters import capabilities 

23from manila import test 

24from manila.tests.scheduler import fakes 

25 

26 

27@ddt.ddt 

28class HostFiltersTestCase(test.TestCase): 

29 """Test case for CapabilitiesFilter.""" 

30 

31 def setUp(self): 

32 super(HostFiltersTestCase, self).setUp() 

33 self.filter = capabilities.CapabilitiesFilter() 

34 

35 def _do_test_type_filter_extra_specs(self, ecaps, especs, passes): 

36 capabilities = {'enabled': True} 

37 capabilities.update(ecaps) 

38 service = {'disabled': False} 

39 filter_properties = {'resource_type': {'name': 'fake_type', 

40 'extra_specs': especs}} 

41 host = fakes.FakeHostState('host1', 

42 {'free_capacity_gb': 1024, 

43 'capabilities': capabilities, 

44 'service': service}) 

45 assertion = self.assertTrue if passes else self.assertFalse 

46 assertion(self.filter.host_passes(host, filter_properties)) 

47 

48 def test_mount_point_name_support_pass(self): 

49 capabilities = {'mount_point_name_support': True} 

50 service = {'disabled': False} 

51 filter_properties = { 

52 'resource_type': { 

53 'request_spec': { 

54 'share_properties': { 

55 'mount_point_name': 'fake_mp', 

56 } 

57 } 

58 } 

59 } 

60 host = fakes.FakeHostState('host1', 

61 {'free_capacity_gb': 1024, 

62 'capabilities': capabilities, 

63 'service': service}) 

64 self.assertTrue(self.filter.host_passes(host, filter_properties)) 

65 

66 def test_capability_filter_passes_extra_specs_simple(self): 

67 self._do_test_type_filter_extra_specs( 

68 ecaps={'opt1': '1', 'opt2': '2'}, 

69 especs={'opt1': '1', 'opt2': '2'}, 

70 passes=True) 

71 

72 def test_capability_filter_passes_extra_specs_ignore_azs_spec(self): 

73 self._do_test_type_filter_extra_specs( 

74 ecaps={'opt1': '1', 'opt2': '2'}, 

75 especs={'opt1': '1', 

76 'opt2': '2', 

77 'availability_zones': 'az1,az2'}, 

78 passes=True) 

79 

80 def test_capability_filter_fails_extra_specs_simple(self): 

81 self._do_test_type_filter_extra_specs( 

82 ecaps={'opt1': '1', 'opt2': '2'}, 

83 especs={'opt1': '1', 'opt2': '222'}, 

84 passes=False) 

85 

86 def test_capability_filter_passes_extra_specs_complex(self): 

87 self._do_test_type_filter_extra_specs( 

88 ecaps={'opt1': 10, 'opt2': 5}, 

89 especs={'opt1': '>= 2', 'opt2': '<= 8'}, 

90 passes=True) 

91 

92 def test_capability_filter_fails_extra_specs_complex(self): 

93 self._do_test_type_filter_extra_specs( 

94 ecaps={'opt1': 10, 'opt2': 5}, 

95 especs={'opt1': '>= 2', 'opt2': '>= 8'}, 

96 passes=False) 

97 

98 def test_capability_filter_passes_extra_specs_list_simple(self): 

99 self._do_test_type_filter_extra_specs( 

100 ecaps={'opt1': ['1', '2'], 'opt2': '2'}, 

101 especs={'opt1': '1', 'opt2': '2'}, 

102 passes=True) 

103 

104 @ddt.data('<is> True', '<is> False') 

105 def test_capability_filter_passes_extra_specs_list_complex(self, opt1): 

106 self._do_test_type_filter_extra_specs( 

107 ecaps={'opt1': [True, False], 'opt2': ['1', '2']}, 

108 especs={'opt1': opt1, 'opt2': '<= 8'}, 

109 passes=True) 

110 

111 def test_capability_filter_fails_extra_specs_list_simple(self): 

112 self._do_test_type_filter_extra_specs( 

113 ecaps={'opt1': ['1', '2'], 'opt2': ['2']}, 

114 especs={'opt1': '3', 'opt2': '2'}, 

115 passes=False) 

116 

117 def test_capability_filter_fails_extra_specs_list_complex(self): 

118 self._do_test_type_filter_extra_specs( 

119 ecaps={'opt1': [True, False], 'opt2': ['1', '2']}, 

120 especs={'opt1': 'fake', 'opt2': '<= 8'}, 

121 passes=False) 

122 

123 def test_capability_filter_passes_scope_extra_specs(self): 

124 self._do_test_type_filter_extra_specs( 

125 ecaps={'scope_lv1': {'opt1': 10}}, 

126 especs={'capabilities:scope_lv1:opt1': '>= 2'}, 

127 passes=True) 

128 

129 def test_capability_filter_passes_fakescope_extra_specs(self): 

130 self._do_test_type_filter_extra_specs( 

131 ecaps={'scope_lv1': {'opt1': 10}, 'opt2': 5}, 

132 especs={'scope_lv1:opt1': '= 2', 'opt2': '>= 3'}, 

133 passes=True) 

134 

135 def test_capability_filter_fails_scope_extra_specs(self): 

136 self._do_test_type_filter_extra_specs( 

137 ecaps={'scope_lv1': {'opt1': 10}}, 

138 especs={'capabilities:scope_lv1:opt1': '<= 2'}, 

139 passes=False) 

140 

141 def test_capability_filter_passes_multi_level_scope_extra_specs(self): 

142 self._do_test_type_filter_extra_specs( 

143 ecaps={'scope_lv0': {'scope_lv1': 

144 {'scope_lv2': {'opt1': 10}}}}, 

145 especs={'capabilities:scope_lv0:scope_lv1:scope_lv2:opt1': '>= 2'}, 

146 passes=True) 

147 

148 def test_capability_filter_fails_wrong_scope_extra_specs(self): 

149 self._do_test_type_filter_extra_specs( 

150 ecaps={'scope_lv0': {'opt1': 10}}, 

151 especs={'capabilities:scope_lv1:opt1': '>= 2'}, 

152 passes=False) 

153 

154 def test_capability_filter_passes_multi_level_scope_extra_specs_list(self): 

155 self._do_test_type_filter_extra_specs( 

156 ecaps={ 

157 'scope_lv0': { 

158 'scope_lv1': { 

159 'scope_lv2': { 

160 'opt1': [True, False], 

161 }, 

162 }, 

163 }, 

164 }, 

165 especs={ 

166 'capabilities:scope_lv0:scope_lv1:scope_lv2:opt1': '<is> True', 

167 }, 

168 passes=True) 

169 

170 def test_capability_filter_fails_multi_level_scope_extra_specs_list(self): 

171 self._do_test_type_filter_extra_specs( 

172 ecaps={ 

173 'scope_lv0': { 

174 'scope_lv1': { 

175 'scope_lv2': { 

176 'opt1': [True, False], 

177 'opt2': ['1', '2'], 

178 }, 

179 }, 

180 }, 

181 }, 

182 especs={ 

183 'capabilities:scope_lv0:scope_lv1:scope_lv2:opt1': '<is> True', 

184 'capabilities:scope_lv0:scope_lv1:scope_lv2:opt2': '3', 

185 }, 

186 passes=False) 

187 

188 def test_capability_filter_fails_wrong_scope_extra_specs_list(self): 

189 self._do_test_type_filter_extra_specs( 

190 ecaps={'scope_lv0': {'opt1': [True, False]}}, 

191 especs={'capabilities:scope_lv1:opt1': '<is> True'}, 

192 passes=False)