1
# Copyright 2011-2012 OpenStack LLC.
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
8
# http://www.apache.org/licenses/LICENSE-2.0
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
16
Tests For Scheduler weights.
19
from nova import context
20
from nova.scheduler import weights
22
from nova.tests import matchers
23
from nova.tests.scheduler import fakes
26
class TestWeighedHost(test.TestCase):
27
def test_dict_conversion(self):
28
host_state = fakes.FakeHostState('somehost', None, {})
29
host = weights.WeighedHost(host_state, 'someweight')
30
expected = {'weight': 'someweight',
32
self.assertThat(host.to_dict(), matchers.DictMatches(expected))
34
def test_all_weighers(self):
35
classes = weights.all_weighers()
36
class_names = [cls.__name__ for cls in classes]
37
self.assertEqual(len(classes), 1)
38
self.assertIn('RAMWeigher', class_names)
40
def test_all_weighers_with_deprecated_config1(self):
41
self.flags(compute_fill_first_cost_fn_weight=-1.0)
42
classes = weights.all_weighers()
43
class_names = [cls.__name__ for cls in classes]
44
self.assertEqual(len(classes), 1)
45
self.assertIn('_LeastCostWeigher', class_names)
47
def test_all_weighers_with_deprecated_config2(self):
48
self.flags(least_cost_functions=['something'])
49
classes = weights.all_weighers()
50
class_names = [cls.__name__ for cls in classes]
51
self.assertEqual(len(classes), 1)
52
self.assertIn('_LeastCostWeigher', class_names)
55
class RamWeigherTestCase(test.TestCase):
57
super(RamWeigherTestCase, self).setUp()
58
self.host_manager = fakes.FakeHostManager()
59
self.weight_handler = weights.HostWeightHandler()
60
self.weight_classes = self.weight_handler.get_matching_classes(
61
['nova.scheduler.weights.ram.RAMWeigher'])
63
def _get_weighed_host(self, hosts, weight_properties=None):
64
if weight_properties is None:
65
weight_properties = {}
66
return self.weight_handler.get_weighed_objects(self.weight_classes,
67
hosts, weight_properties)[0]
69
def _get_all_hosts(self):
70
ctxt = context.get_admin_context()
71
fakes.mox_host_manager_db_calls(self.mox, ctxt)
73
host_states = self.host_manager.get_all_host_states(ctxt)
78
def test_default_of_spreading_first(self):
79
hostinfo_list = self._get_all_hosts()
81
# host1: free_ram_mb=512
82
# host2: free_ram_mb=1024
83
# host3: free_ram_mb=3072
84
# host4: free_ram_mb=8192
86
# so, host4 should win:
87
weighed_host = self._get_weighed_host(hostinfo_list)
88
self.assertEqual(weighed_host.weight, 8192)
89
self.assertEqual(weighed_host.obj.host, 'host4')
91
def test_ram_filter_multiplier1(self):
92
self.flags(ram_weight_multiplier=-1.0)
93
hostinfo_list = self._get_all_hosts()
95
# host1: free_ram_mb=-512
96
# host2: free_ram_mb=-1024
97
# host3: free_ram_mb=-3072
98
# host4: free_ram_mb=-8192
100
# so, host1 should win:
101
weighed_host = self._get_weighed_host(hostinfo_list)
102
self.assertEqual(weighed_host.weight, -512)
103
self.assertEqual(weighed_host.obj.host, 'host1')
105
def test_ram_filter_multiplier2(self):
106
self.flags(ram_weight_multiplier=2.0)
107
hostinfo_list = self._get_all_hosts()
109
# host1: free_ram_mb=512 * 2
110
# host2: free_ram_mb=1024 * 2
111
# host3: free_ram_mb=3072 * 2
112
# host4: free_ram_mb=8192 * 2
114
# so, host4 should win:
115
weighed_host = self._get_weighed_host(hostinfo_list)
116
self.assertEqual(weighed_host.weight, 8192 * 2)
117
self.assertEqual(weighed_host.obj.host, 'host4')