Make ComputeFilter verify compute-related instance properties
This change adds checks in the ComputeFilter to verify compute hosts can support the (architecture, hypervisor_type, vm_mode) triple specified in the instance properties, improving support for heterogeneous clouds. Images can be marked with the architecture, hypervisor, and virtual machine mode they require, e.g. glance image-update --property architecture=x86_64 \ --property hypervisor_type=kvm <image-uuid> glance image-update --property architecture=i686 \ --property hypervisor_type=xen --property vm_mode=xen <image-uuid> glance image-update --property architecture=x86_64 \ --property hypervisor_type=xen --property vm_mode=hvm <image-uuid> These properties are included in the request_spec part of the run_instance RPC message and made available to the ComputeFilter. The ComputeFilter will only pass compute nodes that satisfy the specified properties. If no properties are specified, the ComputeFilter behavior is unchanged. Adding these checks to the compute filter seems consistent with its definition [1]: "ComputeFilter - checks that the capabilities provided by the compute service satisfy the extra specifications, associated with the instance type." [1] https://github.com/openstack/nova/blob/master/doc/source/devref/filter_scheduler.rst DocImpact Change-Id: I993f2e222ec036f1045f3cc5cc1851e730962729
This commit is contained in:
@@ -394,6 +394,106 @@ class HostFiltersTestCase(test.TestCase):
|
||||
'service': service})
|
||||
self.assertTrue(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_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}
|
||||
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})
|
||||
self.assertTrue(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_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}
|
||||
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})
|
||||
self.assertFalse(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_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}
|
||||
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})
|
||||
self.assertTrue(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_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}
|
||||
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})
|
||||
self.assertFalse(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_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': {}}
|
||||
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})
|
||||
self.assertTrue(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_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}
|
||||
capabilities = {'enabled': True}
|
||||
service = {'disabled': False}
|
||||
host = fakes.FakeHostState('host1', 'compute',
|
||||
{'free_ram_mb': 1024, 'capabilities': capabilities,
|
||||
'service': service})
|
||||
self.assertFalse(filt_cls.host_passes(host, filter_properties))
|
||||
|
||||
def test_compute_filter_passes_extra_specs_noop(self):
|
||||
self._stub_service_is_up(True)
|
||||
filt_cls = self.class_map['ComputeCapabilitiesFilter']()
|
||||
|
||||
Reference in New Issue
Block a user