Introduce ImagePropertiesFilter scheduler filter

Commit d39137fa added functionality to the ComputeFilter to filter on
architecture, hypervisor_type, and vm_mode. The existing ArchFilter
already filtered on architecture. This patch merges the ComputeFilter
functionality introduced in d39137fa with the ArchFilter to create the
ImagePropertiesFilter.  The ImagePropertiesFilter uses image properties
specified in the request_spec to filter hosts.

This patch also adds the ImagePropertiesFilter to the list of default
filters specified by the scheduler_default_filters FLAG.

Fixes LP Bug #1037339

DocImpact

Change-Id: Ifa6fccf2db266b0fe3457d58fc81fdb50ffcbc0f
This commit is contained in:
Jim Fehlig
2012-08-17 15:26:01 -06:00
parent a10be151ad
commit 5ea7db9b71
7 changed files with 146 additions and 224 deletions

View File

@@ -394,104 +394,81 @@ class HostFiltersTestCase(test.TestCase):
'service': service})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_passes_same_inst_props(self):
def test_image_properties_filter_passes_same_inst_props(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
inst_meta = {'system_metadata': {'image_architecture': 'x86_64',
'image_hypervisor_type': 'kvm',
'image_vm_mode': 'hvm'}}
req_spec = {'instance_properties': inst_meta}
filter_properties = {'instance_type': {'memory_mb': 1024},
'request_spec': req_spec}
filt_cls = self.class_map['ImagePropertiesFilter']()
img_props = {'properties': {'_architecture': 'x86_64',
'hypervisor_type': 'kvm',
'vm_mode': 'hvm'}}
filter_properties = {'request_spec': {'image': img_props}}
capabilities = {'enabled': True,
'supported_instances': [
('x86_64', 'kvm', 'hvm')]}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
{'capabilities': capabilities})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_fails_different_inst_props(self):
def test_image_properties_filter_fails_different_inst_props(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
inst_meta = {'system_metadata': {'image_architecture': 'arm',
'image_hypervisor_type': 'qemu',
'image_vm_mode': 'hvm'}}
req_spec = {'instance_properties': inst_meta}
filter_properties = {'instance_type': {'memory_mb': 1024},
'request_spec': req_spec}
filt_cls = self.class_map['ImagePropertiesFilter']()
img_props = {'properties': {'architecture': 'arm',
'hypervisor_type': 'qemu',
'vm_mode': 'hvm'}}
filter_properties = {'request_spec': {'image': img_props}}
capabilities = {'enabled': True,
'supported_instances': [
('x86_64', 'kvm', 'hvm')]}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
{'capabilities': capabilities})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_passes_partial_inst_props(self):
def test_image_properties_filter_passes_partial_inst_props(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
inst_meta = {'system_metadata': {'image_architecture': 'x86_64',
'image_vm_mode': 'hvm'}}
req_spec = {'instance_properties': inst_meta}
filter_properties = {'instance_type': {'memory_mb': 1024},
'request_spec': req_spec}
filt_cls = self.class_map['ImagePropertiesFilter']()
img_props = {'properties': {'architecture': 'x86_64',
'vm_mode': 'hvm'}}
filter_properties = {'request_spec': {'image': img_props}}
capabilities = {'enabled': True,
'supported_instances': [
('x86_64', 'kvm', 'hvm')]}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
{'capabilities': capabilities})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_fails_partial_inst_props(self):
def test_image_properties_filter_fails_partial_inst_props(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
inst_meta = {'system_metadata': {'image_architecture': 'x86_64',
'image_vm_mode': 'hvm'}}
req_spec = {'instance_properties': inst_meta}
filter_properties = {'instance_type': {'memory_mb': 1024},
'request_spec': req_spec}
filt_cls = self.class_map['ImagePropertiesFilter']()
img_props = {'properties': {'architecture': 'x86_64',
'vm_mode': 'hvm'}}
filter_properties = {'request_spec': {'image': img_props}}
capabilities = {'enabled': True,
'supported_instances': [
('x86_64', 'xen', 'xen')]}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
{'capabilities': capabilities})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_passes_without_inst_props(self):
def test_image_properties_filter_passes_without_inst_props(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
filter_properties = {'instance_type': {'memory_mb': 1024},
'request_spec': {}}
filt_cls = self.class_map['ImagePropertiesFilter']()
filter_properties = {'request_spec': {}}
capabilities = {'enabled': True,
'supported_instances': [
('x86_64', 'kvm', 'hvm')]}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
{'capabilities': capabilities})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_fails_without_host_props(self):
def test_image_properties_filter_fails_without_host_props(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
inst_meta = {'system_metadata': {'image_architecture': 'x86_64',
'image_hypervisor_type': 'kvm',
'image_vm_mode': 'hvm'}}
req_spec = {'instance_properties': inst_meta}
filter_properties = {'instance_type': {'memory_mb': 1024},
'request_spec': req_spec}
filt_cls = self.class_map['ImagePropertiesFilter']()
img_props = {'properties': {'architecture': 'x86_64',
'hypervisor_type': 'kvm',
'vm_mode': 'hvm'}}
filter_properties = {'request_spec': {'image': img_props}}
capabilities = {'enabled': True}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
{'capabilities': capabilities})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def _do_test_compute_filter_extra_specs(self, ecaps, especs, passes):
@@ -1214,60 +1191,6 @@ class HostFiltersTestCase(test.TestCase):
host = fakes.FakeHostState('host1', 'compute', {'service': service})
self.assertFalse(filt_cls.host_passes(host, request))
def test_arch_filter_same(self):
permitted_instances = ['x86_64']
filt_cls = self.class_map['ArchFilter']()
filter_properties = {
'request_spec': {
'instance_properties': {'architecture': 'x86_64'}
}
}
capabilities = {'enabled': True,
'cpu_info': {
'permitted_instance_types': permitted_instances
}
}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'capabilities': capabilities, 'service': service})
self.assertTrue(filt_cls.host_passes(host, filter_properties))
def test_arch_filter_different(self):
permitted_instances = ['arm']
filt_cls = self.class_map['ArchFilter']()
filter_properties = {
'request_spec': {
'instance_properties': {'architecture': 'x86_64'}
}
}
capabilities = {'enabled': True,
'cpu_info': {
'permitted_instance_types': permitted_instances
}
}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'capabilities': capabilities, 'service': service})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_arch_filter_without_permitted_instances(self):
permitted_instances = []
filt_cls = self.class_map['ArchFilter']()
filter_properties = {
'request_spec': {
'instance_properties': {'architecture': 'x86_64'}
}
}
capabilities = {'enabled': True,
'cpu_info': {
'permitted_instance_types': permitted_instances
}
}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'compute',
{'capabilities': capabilities, 'service': service})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_retry_filter_disabled(self):
"""Test case where retry/re-scheduling is disabled"""
filt_cls = self.class_map['RetryFilter']()