Introduce ImagePropertiesFilter scheduler filter
Commitd39137faadded 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 ind39137fawith 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:
@@ -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']()
|
||||
|
||||
Reference in New Issue
Block a user