diff options
| author | Joe Gordon <jogo@cloudscaling.com> | 2012-07-24 17:03:56 -0700 |
|---|---|---|
| committer | Joe Gordon <jogo@cloudscaling.com> | 2012-08-07 14:24:53 -0700 |
| commit | 861efe3aa7ce6af7b5c548e5a555625fa53a3d86 (patch) | |
| tree | e156cec40e58e25767a193d453298e1f3b53e30b /nova/tests | |
| parent | ce4b2e27be45a85b310237615c47eb53f37bb5f3 (diff) | |
General host aggregates part 2
Partially implements blueprint general-host-aggregates: Scheduler Filter
* Add AggregateInstanceExtraSpecsFilter
* change db.aggregate_get_by_host to return a list of aggregates
instead of the first aggregate
* Add optional key filter to db.aggregate_get_by_host along with test
* Add db.aggregate_metadata_get_by_host to get host aggregate metadata
* add optional key filter to db.aggregate_metadata_get_by_host
* Add AggregateTypeAffinityFilter
Change-Id: I4a3061276cc3b0c5c695eaf973b773183b3c4f4b
Diffstat (limited to 'nova/tests')
| -rw-r--r-- | nova/tests/scheduler/test_host_filters.py | 80 | ||||
| -rw-r--r-- | nova/tests/test_db_api.py | 62 | ||||
| -rw-r--r-- | nova/tests/test_xenapi.py | 8 |
3 files changed, 140 insertions, 10 deletions
diff --git a/nova/tests/scheduler/test_host_filters.py b/nova/tests/scheduler/test_host_filters.py index c4bdf4d61..57827ac19 100644 --- a/nova/tests/scheduler/test_host_filters.py +++ b/nova/tests/scheduler/test_host_filters.py @@ -19,6 +19,7 @@ import httplib import stubout from nova import context +from nova import db from nova import exception from nova import flags from nova.openstack.common import jsonutils @@ -292,6 +293,28 @@ class HostFiltersTestCase(test.TestCase): params={'host': 'fake_host', 'instance_type_id': 2}) self.assertFalse(filt_cls.host_passes(host, filter_properties)) + def test_aggregate_type_filter(self): + self._stub_service_is_up(True) + filt_cls = self.class_map['AggregateTypeAffinityFilter']() + + filter_properties = {'context': self.context, + 'instance_type': {'name': 'fake1'}} + filter2_properties = {'context': self.context, + 'instance_type': {'name': 'fake2'}} + capabilities = {'enabled': True} + service = {'disabled': False} + host = fakes.FakeHostState('fake_host', 'compute', + {'capabilities': capabilities, + 'service': service}) + #True since no aggregates + self.assertTrue(filt_cls.host_passes(host, filter_properties)) + #True since type matches aggregate, metadata + self._create_aggregate_with_host(name='fake_aggregate', + hosts=['fake_host'], metadata={'instance_type': 'fake1'}) + self.assertTrue(filt_cls.host_passes(host, filter_properties)) + #False since type matches aggregate, metadata + self.assertFalse(filt_cls.host_passes(host, filter2_properties)) + def test_ram_filter_fails_on_memory(self): self._stub_service_is_up(True) filt_cls = self.class_map['RamFilter']() @@ -398,6 +421,63 @@ class HostFiltersTestCase(test.TestCase): self.assertFalse(filt_cls.host_passes(host, filter_properties)) + def test_aggregate_filter_passes_no_extra_specs(self): + self._stub_service_is_up(True) + filt_cls = self.class_map['AggregateInstanceExtraSpecsFilter']() + capabilities = {'enabled': True, 'opt1': 1, 'opt2': 2} + + filter_properties = {'context': self.context, 'instance_type': + {'memory_mb': 1024}} + host = fakes.FakeHostState('host1', 'compute', + {'capabilities': capabilities}) + self.assertTrue(filt_cls.host_passes(host, filter_properties)) + + def _create_aggregate_with_host(self, name='fake_aggregate', + metadata=None, + hosts=['host1']): + values = {'name': name, + 'availability_zone': 'fake_avail_zone', } + result = db.aggregate_create(self.context.elevated(), values, metadata) + for host in hosts: + db.aggregate_host_add(self.context.elevated(), result.id, host) + return result + + def test_aggregate_filter_passes_extra_specs(self): + self._stub_service_is_up(True) + filt_cls = self.class_map['AggregateInstanceExtraSpecsFilter']() + extra_specs = {'opt1': '1', 'opt2': '2'} + self._create_aggregate_with_host(metadata={'opt1': '1'}) + self._create_aggregate_with_host(name='fake2', metadata={'opt2': '2'}) + + filter_properties = {'context': self.context, 'instance_type': + {'memory_mb': 1024, 'extra_specs': extra_specs}} + host = fakes.FakeHostState('host1', 'compute', {'free_ram_mb': 1024}) + self.assertTrue(filt_cls.host_passes(host, filter_properties)) + + def test_aggregate_filter_fails_extra_specs(self): + self._stub_service_is_up(True) + filt_cls = self.class_map['AggregateInstanceExtraSpecsFilter']() + extra_specs = {'opt1': 1, 'opt2': 3} + self._create_aggregate_with_host(metadata={'opt1': '1'}) + self._create_aggregate_with_host(name='fake2', metadata={'opt2': '2'}) + filter_properties = {'context': self.context, 'instance_type': + {'memory_mb': 1024, 'extra_specs': extra_specs}} + host = fakes.FakeHostState('host1', 'compute', {'free_ram_mb': 1024}) + self.assertFalse(filt_cls.host_passes(host, filter_properties)) + + def test_aggregate_filter_fails_extra_specs_deleted_host(self): + self._stub_service_is_up(True) + filt_cls = self.class_map['AggregateInstanceExtraSpecsFilter']() + extra_specs = {'opt1': '1', 'opt2': '2'} + self._create_aggregate_with_host(metadata={'opt1': '1'}) + agg2 = self._create_aggregate_with_host(name='fake2', + metadata={'opt2': '2'}) + filter_properties = {'context': self.context, 'instance_type': + {'memory_mb': 1024, 'extra_specs': extra_specs}} + host = fakes.FakeHostState('host1', 'compute', {'free_ram_mb': 1024}) + db.aggregate_host_delete(self.context.elevated(), agg2.id, 'host1') + self.assertFalse(filt_cls.host_passes(host, filter_properties)) + def test_isolated_hosts_fails_isolated_on_non_isolated(self): self.flags(isolated_images=['isolated'], isolated_hosts=['isolated']) filt_cls = self.class_map['IsolatedHostsFilter']() diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index b2b1cf9e2..4a7adb001 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -515,18 +515,68 @@ class AggregateDBApiTestCase(test.TestCase): self.assertEqual(_get_fake_aggr_metadata(), expected.metadetails) def test_aggregate_get_by_host(self): - """Ensure we can get an aggregate by host.""" + """Ensure we can get aggregates by host.""" ctxt = context.get_admin_context() - r1 = _create_aggregate_with_hosts(context=ctxt) - r2 = db.aggregate_get_by_host(ctxt, 'foo.openstack.org') - self.assertEqual(r1.id, r2.id) + values = {'name': 'fake_aggregate2', + 'availability_zone': 'fake_avail_zone', } + a1 = _create_aggregate_with_hosts(context=ctxt) + a2 = _create_aggregate_with_hosts(context=ctxt, values=values) + r1 = db.aggregate_get_by_host(ctxt, 'foo.openstack.org') + self.assertEqual([a1.id, a2.id], [x.id for x in r1]) + + def test_aggregate_get_by_host_with_key(self): + """Ensure we can get aggregates by host.""" + ctxt = context.get_admin_context() + values = {'name': 'fake_aggregate2', + 'availability_zone': 'fake_avail_zone', } + a1 = _create_aggregate_with_hosts(context=ctxt, + metadata={'goodkey': 'good'}) + a2 = _create_aggregate_with_hosts(context=ctxt, values=values) + # filter result by key + r1 = db.aggregate_get_by_host(ctxt, 'foo.openstack.org', key='goodkey') + self.assertEqual([a1.id], [x.id for x in r1]) + + def test_aggregate_metdata_get_by_host(self): + """Ensure we can get aggregates by host.""" + ctxt = context.get_admin_context() + values = {'name': 'fake_aggregate2', + 'availability_zone': 'fake_avail_zone', } + values2 = {'name': 'fake_aggregate3', + 'availability_zone': 'fake_avail_zone', } + a1 = _create_aggregate_with_hosts(context=ctxt) + a2 = _create_aggregate_with_hosts(context=ctxt, values=values) + a3 = _create_aggregate_with_hosts(context=ctxt, values=values2, + hosts=['bar.openstack.org'], metadata={'badkey': 'bad'}) + r1 = db.aggregate_metadata_get_by_host(ctxt, 'foo.openstack.org') + self.assertEqual(r1['fake_key1'], set(['fake_value1'])) + self.assertFalse('badkey' in r1) + + def test_aggregate_metdata_get_by_host_with_key(self): + """Ensure we can get aggregates by host.""" + ctxt = context.get_admin_context() + values = {'name': 'fake_aggregate2', + 'availability_zone': 'fake_avail_zone', } + values2 = {'name': 'fake_aggregate3', + 'availability_zone': 'fake_avail_zone', } + a1 = _create_aggregate_with_hosts(context=ctxt) + a2 = _create_aggregate_with_hosts(context=ctxt, values=values) + a3 = _create_aggregate_with_hosts(context=ctxt, values=values2, + hosts=['foo.openstack.org'], metadata={'good': 'value'}) + r1 = db.aggregate_metadata_get_by_host(ctxt, 'foo.openstack.org', + key='good') + self.assertEqual(r1['good'], set(['value'])) + self.assertFalse('fake_key1' in r1) + # Delete metadata + db.aggregate_metadata_delete(ctxt, a3.id, 'good') + r2 = db.aggregate_metadata_get_by_host(ctxt, 'foo.openstack.org', + key='good') + self.assertFalse('good' in r2) def test_aggregate_get_by_host_not_found(self): """Ensure AggregateHostNotFound is raised with unknown host.""" ctxt = context.get_admin_context() _create_aggregate_with_hosts(context=ctxt) - self.assertRaises(exception.AggregateHostNotFound, - db.aggregate_get_by_host, ctxt, 'unknown_host') + self.assertEqual([], db.aggregate_get_by_host(ctxt, 'unknown_host')) def test_aggregate_delete_raise_not_found(self): """Ensure AggregateNotFound is raised when deleting an aggregate.""" diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 6362d8ff5..ec84ba077 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -2149,9 +2149,9 @@ class XenAPILiveMigrateTestCase(stubs.XenAPITestBase): def __init__(self): self.metadetails = {"host": "test_host_uuid"} - def fake_aggregate_get_by_host(context, host): + def fake_aggregate_get_by_host(context, host, key=None): self.assertEqual(FLAGS.host, host) - return fake_aggregate() + return [fake_aggregate()] self.stubs.Set(db, "aggregate_get_by_host", fake_aggregate_get_by_host) @@ -2163,9 +2163,9 @@ class XenAPILiveMigrateTestCase(stubs.XenAPITestBase): def __init__(self): self.metadetails = {"dest_other": "test_host_uuid"} - def fake_aggregate_get_by_host(context, host): + def fake_aggregate_get_by_host(context, host, key=None): self.assertEqual(FLAGS.host, host) - return fake_aggregate() + return [fake_aggregate()] self.stubs.Set(db, "aggregate_get_by_host", fake_aggregate_get_by_host) |
