Num instances scheduler filter

Allow for scheduler filtering based on number of instances already assigned to
that host.

FLAGS.max_instances_per_host controls the maximum number of instances allowed
per host.

Change-Id: Id3e8973311ea5ac8db2d9e4e594a5288a9e3f94d
This commit is contained in:
Brian Elliott 2012-09-28 03:43:33 +00:00
parent 522e122b13
commit b68da99b22
2 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,42 @@
# Copyright (c) 2012 OpenStack, LLC.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from nova import flags
from nova.openstack.common import cfg
from nova.openstack.common import log as logging
from nova.scheduler import filters
LOG = logging.getLogger(__name__)
max_instances_per_host_opt = cfg.IntOpt("max_instances_per_host",
default=50,
help="Ignore hosts that have too many instances")
FLAGS = flags.FLAGS
FLAGS.register_opt(max_instances_per_host_opt)
class NumInstancesFilter(filters.BaseHostFilter):
"""Filter out hosts with too many instances"""
def host_passes(self, host_state, filter_properties):
num_instances = host_state.num_instances
max_instances = FLAGS.max_instances_per_host
passes = num_instances < max_instances
if not passes:
LOG.debug(_("%(host_state)s fails num_instances check: Max "
"instances per host is set to %(max_instances)s"),
locals())
return passes

View File

@ -1292,5 +1292,19 @@ class HostFiltersTestCase(test.TestCase):
filt_cls = self.class_map['IoOpsFilter']()
host = fakes.FakeHostState('host1', 'compute',
{'num_io_ops': 8})
def test_filter_num_instances_passes(self):
self.flags(max_instances_per_host=5)
filt_cls = self.class_map['NumInstancesFilter']()
host = fakes.FakeHostState('host1', 'compute',
{'num_instances': 4})
filter_properties = {}
self.assertTrue(filt_cls.host_passes(host, filter_properties))
def test_filter_num_instances_fails(self):
self.flags(max_instances_per_host=5)
filt_cls = self.class_map['NumInstancesFilter']()
host = fakes.FakeHostState('host1', 'compute',
{'num_instances': 5})
filter_properties = {}
self.assertFalse(filt_cls.host_passes(host, filter_properties))