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
« 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.
16"""
17Tests For CapabilitiesFilter.
18"""
20import ddt
22from manila.scheduler.filters import capabilities
23from manila import test
24from manila.tests.scheduler import fakes
27@ddt.ddt
28class HostFiltersTestCase(test.TestCase):
29 """Test case for CapabilitiesFilter."""
31 def setUp(self):
32 super(HostFiltersTestCase, self).setUp()
33 self.filter = capabilities.CapabilitiesFilter()
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))
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))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)