Merge "Support scoped keys in aggregate extra specs filter"

This commit is contained in:
Jenkins
2013-07-17 02:17:54 +00:00
committed by Gerrit Code Review
3 changed files with 31 additions and 9 deletions

View File

@@ -67,7 +67,8 @@ There are some standard filter classes to use (:mod:`nova.scheduler.filters`):
* |AggregateInstanceExtraSpecsFilter| - checks that the aggregate metadata
satisfies any extra specifications associated with the instance type (that
have no scope). It passes hosts that can create the specified instance type.
have no scope or are scoped with 'aggregate_instance_extra_specs').
It passes hosts that can create the specified instance type.
The extra specifications can have the same operators as
|ComputeCapabilitiesFilter|.
* |ComputeFilter| - passes all hosts that are operational and enabled.

View File

@@ -22,6 +22,8 @@ from nova.scheduler.filters import extra_specs_ops
LOG = logging.getLogger(__name__)
_SCOPE = 'aggregate_instance_extra_specs'
class AggregateInstanceExtraSpecsFilter(filters.BaseHostFilter):
"""AggregateInstanceExtraSpecsFilter works with InstanceType records."""
@@ -43,10 +45,14 @@ class AggregateInstanceExtraSpecsFilter(filters.BaseHostFilter):
metadata = db.aggregate_metadata_get_by_host(context, host_state.host)
for key, req in instance_type['extra_specs'].iteritems():
# NOTE(jogo) any key containing a scope (scope is terminated
# by a `:') will be ignored by this filter. (bug 1039386)
if key.count(':'):
continue
# Either not scope format, or aggregate_instance_extra_specs scope
scope = key.split(':', 1)
if len(scope) > 1:
if scope[0] != _SCOPE:
continue
else:
del scope[0]
key = scope[0]
aggregate_vals = metadata.get(key, None)
if not aggregate_vals:
LOG.debug(_("%(host_state)s fails instance_type extra_specs "

View File

@@ -860,11 +860,26 @@ class HostFiltersTestCase(test.NoDBTestCase):
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_aggregate_filter_passes_extra_specs_simple(self):
especs = {
# Un-scoped extra spec
'opt1': '1',
# Scoped extra spec that applies to this filter
'aggregate_instance_extra_specs:opt2': '2',
# Scoped extra spec that does not apply to this filter
'trust:trusted_host': 'true',
}
self._do_test_aggregate_filter_extra_specs(
emeta={'opt1': '1', 'opt2': '2'},
especs={'opt1': '1', 'opt2': '2',
'trust:trusted_host': 'true'},
passes=True)
emeta={'opt1': '1', 'opt2': '2'}, especs=especs, passes=True)
def test_aggregate_filter_passes_with_key_same_as_scope(self):
especs = {
# Un-scoped extra spec, make sure we don't blow up if it
# happens to match our scope.
'aggregate_instance_extra_specs': '1',
}
self._do_test_aggregate_filter_extra_specs(
emeta={'aggregate_instance_extra_specs': '1'},
especs=especs, passes=True)
def test_aggregate_filter_fails_extra_specs_simple(self):
self._do_test_aggregate_filter_extra_specs(