f7c688b8ef
This aims to fix the issue described in bug 1664931 where a rebuild fails to validate the existing host with the scheduler when a new image is provided. The previous attempt to do this could cause rebuilds to fail unnecessarily because we ran _all_ of the filters during a rebuild, which could cause usage/resource filters to prevent an otherwise valid rebuild from succeeding. This aims to classify filters as useful for rebuild or not, and only apply the former during a rebuild scheduler check. We do this by using an internal scheduler hint, indicating our intent. This should (a) filter out all hosts other than the one we're running on and (b) be detectable by the filtering infrastructure as an internally-generated scheduling request in order to trigger the correct filtering behavior. Closes-Bug: #1664931 Change-Id: I1a46ef1503be2febcd20f4594f44344d05525446
70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
# Copyright (c) 2011-2012 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.
|
|
|
|
import nova.conf
|
|
from nova.scheduler import filters
|
|
|
|
CONF = nova.conf.CONF
|
|
|
|
|
|
class IsolatedHostsFilter(filters.BaseHostFilter):
|
|
"""Keep specified images to selected hosts."""
|
|
|
|
# The configuration values do not change within a request
|
|
run_filter_once_per_request = True
|
|
|
|
RUN_ON_REBUILD = True
|
|
|
|
def host_passes(self, host_state, spec_obj):
|
|
"""Result Matrix with 'restrict_isolated_hosts_to_isolated_images' set
|
|
to True::
|
|
|
|
| | isolated_image | non_isolated_image
|
|
| -------------+----------------+-------------------
|
|
| iso_host | True | False
|
|
| non_iso_host | False | True
|
|
|
|
Result Matrix with 'restrict_isolated_hosts_to_isolated_images' set
|
|
to False::
|
|
|
|
| | isolated_image | non_isolated_image
|
|
| -------------+----------------+-------------------
|
|
| iso_host | True | True
|
|
| non_iso_host | False | True
|
|
|
|
"""
|
|
# If the configuration does not list any hosts, the filter will always
|
|
# return True, assuming a configuration error, so letting all hosts
|
|
# through.
|
|
isolated_hosts = CONF.filter_scheduler.isolated_hosts
|
|
isolated_images = CONF.filter_scheduler.isolated_images
|
|
restrict_isolated_hosts_to_isolated_images = (
|
|
CONF.filter_scheduler.restrict_isolated_hosts_to_isolated_images)
|
|
if not isolated_images:
|
|
# As there are no images to match, return True if the filter is
|
|
# not restrictive otherwise return False if the host is in the
|
|
# isolation list.
|
|
return ((not restrict_isolated_hosts_to_isolated_images) or
|
|
(host_state.host not in isolated_hosts))
|
|
|
|
image_ref = spec_obj.image.id if spec_obj.image else None
|
|
image_isolated = image_ref in isolated_images
|
|
host_isolated = host_state.host in isolated_hosts
|
|
|
|
if restrict_isolated_hosts_to_isolated_images:
|
|
return (image_isolated == host_isolated)
|
|
else:
|
|
return (not image_isolated) or host_isolated
|