Merge "Add label filter"
This commit is contained in:
50
zun/scheduler/filters/label_filter.py
Normal file
50
zun/scheduler/filters/label_filter.py
Normal file
@@ -0,0 +1,50 @@
|
||||
# Copyright (c) 2017 OpenStack Foundation
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo_log import log as logging
|
||||
|
||||
from zun.scheduler import filters
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class LabelFilter(filters.BaseHostFilter):
|
||||
"""Filter the containers by label"""
|
||||
|
||||
run_filter_once_per_request = True
|
||||
|
||||
def host_passes(self, host_state, container, extra_spec):
|
||||
labels = {}
|
||||
for key, value in extra_spec.items():
|
||||
if key.startswith('label:'):
|
||||
newkey = key[6:]
|
||||
labels[newkey] = value
|
||||
|
||||
if not labels:
|
||||
return True
|
||||
|
||||
for key in labels:
|
||||
if not(key in host_state.labels and
|
||||
host_state.labels.get(key) == labels.get(key)):
|
||||
LOG.debug("%(host_state)s does not have labels"
|
||||
" %(key)s=%(value)s that container %(container)s"
|
||||
" required.",
|
||||
{'host_state': host_state,
|
||||
'key': key,
|
||||
'value': labels.get(key),
|
||||
'container': container.name})
|
||||
return False
|
||||
|
||||
return True
|
||||
42
zun/tests/unit/scheduler/filters/test_label_filter.py
Normal file
42
zun/tests/unit/scheduler/filters/test_label_filter.py
Normal file
@@ -0,0 +1,42 @@
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from zun.common import context
|
||||
from zun import objects
|
||||
from zun.scheduler.filters import label_filter
|
||||
from zun.tests import base
|
||||
|
||||
|
||||
class TestLabelFilter(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestLabelFilter, self).setUp()
|
||||
self.context = context.RequestContext('fake_user', 'fake_project')
|
||||
|
||||
def test_label_filter_pass(self):
|
||||
self.filt_cls = label_filter.LabelFilter()
|
||||
container = objects.Container(self.context)
|
||||
container.name = 'test-container'
|
||||
extra_spec = {'label:type': 'test'}
|
||||
host = objects.ComputeNode(self.context)
|
||||
host.labels = {'type': 'test'}
|
||||
self.assertTrue(self.filt_cls.host_passes(host, container, extra_spec))
|
||||
|
||||
def test_label_filter_fail(self):
|
||||
self.filt_cls = label_filter.LabelFilter()
|
||||
container = objects.Container(self.context)
|
||||
container.name = 'test-container'
|
||||
extra_spec = {'label:type': 'test'}
|
||||
host = objects.ComputeNode(self.context)
|
||||
host.labels = {'type': 'production'}
|
||||
self.assertFalse(self.filt_cls.host_passes(host, container,
|
||||
extra_spec))
|
||||
Reference in New Issue
Block a user