Don't raise error when filtering on custom metadata

Hosts can have custom metadata. There is no restriction on the key names
used in this metadata, so we should not be raising an exception when
checking for the existence of any metadata key.

Originally worked on: https://review.openstack.org/#/c/271401

Co-Authored-By: Xiaowei Qian <xiaowei.qian@easystack.cn>

Closes-Bug: #1537062

Change-Id: Ie5ff3c1847e9c4533822a77d443e4ce1fcf047fe
This commit is contained in:
EdLeafe 2016-04-18 21:36:09 +00:00
parent 3249f2e02e
commit c5879ffa3e
2 changed files with 40 additions and 1 deletions

View File

@ -17,6 +17,7 @@ from oslo_log import log as logging
import six
import nova.conf
from nova.i18n import _LW
from nova.scheduler import filters
from nova.scheduler.filters import utils
@ -45,7 +46,15 @@ class AggregateImagePropertiesIsolation(filters.BaseHostFilter):
if (cfg_namespace and
not key.startswith(cfg_namespace + cfg_separator)):
continue
prop = image_props.get(key)
prop = None
try:
prop = image_props.get(key)
except AttributeError:
LOG.warning(_LW("Host '%(host)s' has a metadata key '%(key)s' "
"that is not present in the image metadata.") %
{"host": host_state.host, "key": key})
continue
# NOTE(sbauza): Aggregate metadata is only strings, we need to
# stringify the property to match with the option
# TODO(sbauza): Fix that very ugly pattern matching

View File

@ -103,3 +103,33 @@ class TestAggImagePropsIsolationFilter(test.NoDBTestCase):
hw_vm_mode='hvm', img_owner_id='wrong')))
host = fakes.FakeHostState('host1', 'compute', {})
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
def test_aggregate_image_properties_iso_props_with_custom_meta(self,
agg_mock):
agg_mock.return_value = {'os': 'linux'}
spec_obj = objects.RequestSpec(
context=mock.sentinel.ctx,
image=objects.ImageMeta(properties=objects.ImageMetaProps(
os_type='linux')))
host = fakes.FakeHostState('host1', 'compute', {})
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
def test_aggregate_image_properties_iso_props_with_matching_meta_pass(self,
agg_mock):
agg_mock.return_value = {'os_type': 'linux'}
spec_obj = objects.RequestSpec(
context=mock.sentinel.ctx,
image=objects.ImageMeta(properties=objects.ImageMetaProps(
os_type='linux')))
host = fakes.FakeHostState('host1', 'compute', {})
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
def test_aggregate_image_properties_iso_props_with_matching_meta_fail(
self, agg_mock):
agg_mock.return_value = {'os_type': 'windows'}
spec_obj = objects.RequestSpec(
context=mock.sentinel.ctx,
image=objects.ImageMeta(properties=objects.ImageMetaProps(
os_type='linux')))
host = fakes.FakeHostState('host1', 'compute', {})
self.assertFalse(self.filt_cls.host_passes(host, spec_obj))