summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Elliott <brian.elliott@rackspace.com>2012-09-28 03:43:33 +0000
committerBrian Elliott <brian.elliott@rackspace.com>2012-09-28 16:52:00 +0000
commitb68da99b22614f0207645b3df2566f6187c571d2 (patch)
tree546e78a2020d7c14fb6baeb35b8d6914a2fba1e9
parent522e122b13c8a33ce4c4436ccc35e3109acb90ec (diff)
downloadnova-b68da99b22614f0207645b3df2566f6187c571d2.tar.gz
nova-b68da99b22614f0207645b3df2566f6187c571d2.tar.xz
nova-b68da99b22614f0207645b3df2566f6187c571d2.zip
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
-rw-r--r--nova/scheduler/filters/num_instances_filter.py42
-rw-r--r--nova/tests/scheduler/test_host_filters.py14
2 files changed, 56 insertions, 0 deletions
diff --git a/nova/scheduler/filters/num_instances_filter.py b/nova/scheduler/filters/num_instances_filter.py
new file mode 100644
index 000000000..e96539c0c
--- /dev/null
+++ b/nova/scheduler/filters/num_instances_filter.py
@@ -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
diff --git a/nova/tests/scheduler/test_host_filters.py b/nova/tests/scheduler/test_host_filters.py
index b1e1ec897..bc62ad6f1 100644
--- a/nova/tests/scheduler/test_host_filters.py
+++ b/nova/tests/scheduler/test_host_filters.py
@@ -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))