596ee8796a
Adds a new cell scheduler filter which can use a 'different_cell' scheduler hint similar to the 'different_host' hint. It expects a fully qualified cell path as the value and filters out any matching cells. Change-Id: I27acd19ac9b6ba4ad61a16db3b032e55113a376c Implements: bp cells-scheduler-anti-affinity-filter
63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
# 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.
|
|
|
|
"""
|
|
Different cell filter.
|
|
|
|
A scheduler hint of 'different_cell' with a value of a full cell name may be
|
|
specified to route a build away from a particular cell.
|
|
"""
|
|
|
|
import six
|
|
|
|
from nova.cells import filters
|
|
from nova.cells import utils as cells_utils
|
|
|
|
|
|
class DifferentCellFilter(filters.BaseCellFilter):
|
|
"""Different cell filter. Works by specifying a scheduler hint of
|
|
'different_cell'. The value should be the full cell path.
|
|
"""
|
|
def filter_all(self, cells, filter_properties):
|
|
"""Override filter_all() which operates on the full list
|
|
of cells...
|
|
"""
|
|
scheduler_hints = filter_properties.get('scheduler_hints')
|
|
if not scheduler_hints:
|
|
return cells
|
|
|
|
cell_routes = scheduler_hints.get('different_cell')
|
|
if not cell_routes:
|
|
return cells
|
|
if isinstance(cell_routes, six.string_types):
|
|
cell_routes = [cell_routes]
|
|
|
|
if not self.authorized(filter_properties['context']):
|
|
# No filtering, if not authorized.
|
|
return cells
|
|
|
|
routing_path = filter_properties['routing_path']
|
|
filtered_cells = []
|
|
for cell in cells:
|
|
if not self._cell_state_matches(cell, routing_path, cell_routes):
|
|
filtered_cells.append(cell)
|
|
|
|
return filtered_cells
|
|
|
|
def _cell_state_matches(self, cell_state, routing_path, cell_routes):
|
|
cell_route = routing_path
|
|
if not cell_state.is_me:
|
|
cell_route += cells_utils.PATH_CELL_SEP + cell_state.name
|
|
if cell_route in cell_routes:
|
|
return True
|
|
return False
|