69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
# Copyright (c) 2012-2013 Rackspace Hosting
|
|
# 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.
|
|
|
|
"""
|
|
Target cell filter.
|
|
|
|
A scheduler hint of 'target_cell' with a value of a full cell name may be
|
|
specified to route a build to a particular cell. No error handling is
|
|
done as there's no way to know whether the full path is a valid.
|
|
"""
|
|
|
|
from nova.cells import filters
|
|
from nova.openstack.common import log as logging
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class TargetCellFilter(filters.BaseCellFilter):
|
|
"""Target cell filter. Works by specifying a scheduler hint of
|
|
'target_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
|
|
|
|
# This filter only makes sense at the top level, as a full
|
|
# cell name is specified. So we pop 'target_cell' out of the
|
|
# hints dict.
|
|
cell_name = scheduler_hints.pop('target_cell', None)
|
|
if not cell_name:
|
|
return cells
|
|
|
|
# This authorization is after popping off target_cell, so
|
|
# that in case this fails, 'target_cell' is not left in the
|
|
# dict when child cells go to schedule.
|
|
if not self.authorized(filter_properties['context']):
|
|
# No filtering, if not authorized.
|
|
return cells
|
|
|
|
LOG.info(_("Forcing direct route to %(cell_name)s because "
|
|
"of 'target_cell' scheduler hint"),
|
|
{'cell_name': cell_name})
|
|
|
|
scheduler = filter_properties['scheduler']
|
|
if cell_name == filter_properties['routing_path']:
|
|
return [scheduler.state_manager.get_my_state()]
|
|
ctxt = filter_properties['context']
|
|
scheduler.msg_runner.schedule_run_instance(ctxt, cell_name,
|
|
filter_properties['host_sched_kwargs'])
|
|
# Returning None means to skip further scheduling, because we
|
|
# handled it.
|