summaryrefslogtreecommitdiffstats
path: root/nova/tests
diff options
context:
space:
mode:
authorChristopher MacGown <chris@pistoncloud.com>2012-01-23 18:25:34 -0800
committerChristopher MacGown <ignoti+github@gmail.com>2012-01-24 08:19:46 -0800
commit91bc67d81a9711fbf5a0f0c46bbf1d87232391f8 (patch)
treeb9223a4cdaed27af32aeedcb01999726b72d0523 /nova/tests
parent0fc18408d93aa30a2cb2650951dc1171b4ef6bcd (diff)
Add affinity filters
updated to use scheduler_hints and have non-douchey names Change-Id: I4fa22980a28e4a051176f1426a571f37fb5f118e
Diffstat (limited to 'nova/tests')
-rw-r--r--nova/tests/scheduler/fakes.py29
-rw-r--r--nova/tests/scheduler/test_host_filters.py84
2 files changed, 113 insertions, 0 deletions
diff --git a/nova/tests/scheduler/fakes.py b/nova/tests/scheduler/fakes.py
index 8abf68e52..94287bac3 100644
--- a/nova/tests/scheduler/fakes.py
+++ b/nova/tests/scheduler/fakes.py
@@ -19,6 +19,8 @@ Fakes For Scheduler tests.
import mox
from nova import db
+from nova.compute import instance_types
+from nova.compute import vm_states
from nova.scheduler import distributed_scheduler
from nova.scheduler import host_manager
from nova.scheduler import zone_manager
@@ -96,6 +98,33 @@ class FakeHostState(host_manager.HostState):
setattr(self, key, val)
+class FakeInstance(object):
+ def __init__(self, context=None, params=None, type_name='m1.tiny'):
+ """Create a test instance. Returns uuid"""
+ self.context = context
+
+ i = self._create_fake_instance(params, type_name=type_name)
+ self.uuid = i['uuid']
+
+ def _create_fake_instance(self, params=None, type_name='m1.tiny'):
+ """Create a test instance"""
+ if not params:
+ params = {}
+
+ inst = {}
+ inst['vm_state'] = vm_states.ACTIVE
+ inst['image_ref'] = 1
+ inst['reservation_id'] = 'r-fakeres'
+ inst['launch_time'] = '10'
+ inst['user_id'] = 'fake'
+ inst['project_id'] = 'fake'
+ type_id = instance_types.get_instance_type_by_name(type_name)['id']
+ inst['instance_type_id'] = type_id
+ inst['ami_launch_index'] = 0
+ inst.update(params)
+ return db.instance_create(self.context, inst)
+
+
class FakeComputeAPI(object):
def create_db_entry_for_new_instance(self, *args, **kwargs):
pass
diff --git a/nova/tests/scheduler/test_host_filters.py b/nova/tests/scheduler/test_host_filters.py
index 8d9fa18a1..5e3ff2601 100644
--- a/nova/tests/scheduler/test_host_filters.py
+++ b/nova/tests/scheduler/test_host_filters.py
@@ -18,6 +18,7 @@ Tests For Scheduler Host Filters.
import json
from nova import context
+from nova import flags
from nova.scheduler import filters
from nova import test
from nova.tests.scheduler import fakes
@@ -29,6 +30,7 @@ class HostFiltersTestCase(test.TestCase):
def setUp(self):
super(HostFiltersTestCase, self).setUp()
+ self.context = context.RequestContext('fake', 'fake')
self.json_query = json.dumps(
['and', ['>=', '$free_ram_mb', 1024],
['>=', '$free_disk_mb', 200 * 1024]])
@@ -43,6 +45,88 @@ class HostFiltersTestCase(test.TestCase):
return ret_value
self.stubs.Set(utils, 'service_is_up', fake_service_is_up)
+ def test_affinity_different_filter_passes(self):
+ filt_cls = filters.DifferentHostFilter()
+ host = fakes.FakeHostState('host1', 'compute', {})
+ instance = fakes.FakeInstance(context=self.context,
+ params={'host': 'host2'})
+ instance_uuid = instance.uuid
+
+ filter_properties = {'context': self.context.elevated(),
+ 'scheduler_hints': {
+ 'different_host': [instance_uuid], }}
+
+ self.assertTrue(filt_cls.host_passes(host, filter_properties))
+
+ def test_affinity_different_filter_fails(self):
+ filt_cls = filters.DifferentHostFilter()
+ host = fakes.FakeHostState('host1', 'compute', {})
+ instance = fakes.FakeInstance(context=self.context,
+ params={'host': 'host1'})
+ instance_uuid = instance.uuid
+
+ filter_properties = {'context': self.context.elevated(),
+ 'scheduler_hints': {
+ 'different_host': [instance_uuid], }}
+
+ self.assertFalse(filt_cls.host_passes(host, filter_properties))
+
+ def test_affinity_same_filter_passes(self):
+ filt_cls = filters.SameHostFilter()
+ host = fakes.FakeHostState('host1', 'compute', {})
+ instance = fakes.FakeInstance(context=self.context,
+ params={'host': 'host1'})
+ instance_uuid = instance.uuid
+
+ filter_properties = {'context': self.context.elevated(),
+ 'scheduler_hints': {
+ 'same_host': [instance_uuid], }}
+
+ self.assertTrue(filt_cls.host_passes(host, filter_properties))
+
+ def test_affinity_same_filter_fails(self):
+ filt_cls = filters.SameHostFilter()
+ host = fakes.FakeHostState('host1', 'compute', {})
+ instance = fakes.FakeInstance(context=self.context,
+ params={'host': 'host2'})
+ instance_uuid = instance.uuid
+
+ filter_properties = {'context': self.context.elevated(),
+ 'scheduler_hints': {
+ 'same_host': [instance_uuid], }}
+
+ self.assertFalse(filt_cls.host_passes(host, filter_properties))
+
+ def test_affinity_simple_cidr_filter_passes(self):
+ filt_cls = filters.SimpleCIDRAffinityFilter()
+ host = fakes.FakeHostState('host1', 'compute', {})
+
+ affinity_ip = flags.FLAGS.my_ip.split('.')[0:3]
+ affinity_ip.append('100')
+ affinity_ip = str.join('.', affinity_ip)
+
+ filter_properties = {'context': self.context.elevated(),
+ 'scheduler_hints': {
+ 'cidr': '/24',
+ 'build_near_host_ip': affinity_ip}}
+
+ self.assertTrue(filt_cls.host_passes(host, filter_properties))
+
+ def test_affinity_simple_cidr_filter_fails(self):
+ filt_cls = filters.SimpleCIDRAffinityFilter()
+ host = fakes.FakeHostState('host1', 'compute', {})
+
+ affinity_ip = flags.FLAGS.my_ip.split('.')
+ affinity_ip[-1] = '100' if affinity_ip[-1] != '100' else '101'
+ affinity_ip = str.join('.', affinity_ip)
+
+ filter_properties = {'context': self.context.elevated(),
+ 'scheduler_hints': {
+ 'cidr': '/32',
+ 'build_near_host_ip': affinity_ip}}
+
+ self.assertFalse(filt_cls.host_passes(host, filter_properties))
+
def test_compute_filter_passes(self):
self._stub_service_is_up(True)
filt_cls = filters.ComputeFilter()