nova/nova/scheduler/weights/cross_cell.py

64 lines
2.9 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.
"""
Cross-cell move weigher. Weighs hosts based on which cell they are in. "Local"
cells are preferred when moving an instance. In other words, select a host
from the source cell all other things being equal.
"""
from nova import conf
from nova.scheduler import utils
from nova.scheduler import weights
CONF = conf.CONF
class CrossCellWeigher(weights.BaseHostWeigher):
def weight_multiplier(self, host_state):
"""How weighted this weigher should be."""
return utils.get_weight_multiplier(
host_state, 'cross_cell_move_weight_multiplier',
CONF.filter_scheduler.cross_cell_move_weight_multiplier)
def _weigh_object(self, host_state, weight_properties):
"""Higher weights win. Hosts within the "preferred" cell are weighed
higher than hosts in other cells.
:param host_state: nova.scheduler.host_manager.HostState object
representing a ComputeNode in a cell
:param weight_properties: nova.objects.RequestSpec - this is inspected
to see if there is a preferred cell via the requested_destination
field and if so, is the request spec allowing cross-cell move
:returns: 1 if cross-cell move and host_state is within the preferred
cell, -1 if cross-cell move and host_state is *not* within the
preferred cell, 0 for all other cases
"""
# RequestSpec.requested_destination.cell should only be set for
# move operations. The allow_cross_cell_move value will only be True if
# policy allows.
if ('requested_destination' in weight_properties and
weight_properties.requested_destination and
'cell' in weight_properties.requested_destination and
weight_properties.requested_destination.cell and
weight_properties.requested_destination.allow_cross_cell_move):
# Determine if the given host is in the "preferred" cell from
# the request spec. If it is, weigh it higher.
if (host_state.cell_uuid ==
weight_properties.requested_destination.cell.uuid):
return 1
# The host is in another cell, so weigh it lower.
return -1
# We don't know or don't care what cell we're going to be in, so noop.
return 0