Remove deprecated scheduler filters
The RetryFilter was deprecated in Train. The Aggregate[core|ram|disk] filters were also deprecated in train. This change removes all four deprecated filters and their docs. Change-Id: Idc29c759632850d3d767a261c9f385af71348f65
This commit is contained in:
parent
8ecc29bfcc
commit
4939d0d1e2
@ -336,14 +336,11 @@ related availability zones feature operate under the hood:
|
|||||||
Finally, as discussed previously, there are a number of host aggregate-specific
|
Finally, as discussed previously, there are a number of host aggregate-specific
|
||||||
scheduler filters. These are:
|
scheduler filters. These are:
|
||||||
|
|
||||||
- :ref:`AggregateCoreFilter`
|
|
||||||
- :ref:`AggregateDiskFilter`
|
|
||||||
- :ref:`AggregateImagePropertiesIsolation`
|
- :ref:`AggregateImagePropertiesIsolation`
|
||||||
- :ref:`AggregateInstanceExtraSpecsFilter`
|
- :ref:`AggregateInstanceExtraSpecsFilter`
|
||||||
- :ref:`AggregateIoOpsFilter`
|
- :ref:`AggregateIoOpsFilter`
|
||||||
- :ref:`AggregateMultiTenancyIsolation`
|
- :ref:`AggregateMultiTenancyIsolation`
|
||||||
- :ref:`AggregateNumInstancesFilter`
|
- :ref:`AggregateNumInstancesFilter`
|
||||||
- :ref:`AggregateRamFilter`
|
|
||||||
- :ref:`AggregateTypeAffinityFilter`
|
- :ref:`AggregateTypeAffinityFilter`
|
||||||
|
|
||||||
The following configuration options are applicable to the scheduler
|
The following configuration options are applicable to the scheduler
|
||||||
|
@ -158,68 +158,6 @@ Compute filters
|
|||||||
|
|
||||||
The following sections describe the available compute filters.
|
The following sections describe the available compute filters.
|
||||||
|
|
||||||
.. _AggregateCoreFilter:
|
|
||||||
|
|
||||||
AggregateCoreFilter
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
.. deprecated:: 20.0.0
|
|
||||||
|
|
||||||
``AggregateCoreFilter`` is deprecated since the 20.0.0 Train release.
|
|
||||||
As of the introduction of the placement service in Ocata, the behavior
|
|
||||||
of this filter :ref:`has changed <bug-1804125>` and no longer should be used.
|
|
||||||
In the 18.0.0 Rocky release nova `automatically mirrors`_ host aggregates
|
|
||||||
to placement aggregates.
|
|
||||||
In the 19.0.0 Stein release initial allocation ratios support was added
|
|
||||||
which allows management of the allocation ratios via the placement API in
|
|
||||||
addition to the existing capability to manage allocation ratios via the nova
|
|
||||||
config. See `Allocation ratios`_ for details.
|
|
||||||
|
|
||||||
.. _`automatically mirrors`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/placement-mirror-host-aggregates.html
|
|
||||||
|
|
||||||
Filters host by CPU core count with a per-aggregate ``cpu_allocation_ratio``
|
|
||||||
value. If the per-aggregate value is not found, the value falls back to the
|
|
||||||
global setting. If the host is in more than one aggregate and more than one
|
|
||||||
value is found, the minimum value will be used.
|
|
||||||
|
|
||||||
Refer to :doc:`/admin/aggregates` for more information.
|
|
||||||
|
|
||||||
.. important::
|
|
||||||
|
|
||||||
Note the ``cpu_allocation_ratio`` :ref:`bug 1804125 <bug-1804125>`
|
|
||||||
restriction.
|
|
||||||
|
|
||||||
|
|
||||||
.. _AggregateDiskFilter:
|
|
||||||
|
|
||||||
AggregateDiskFilter
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
.. deprecated:: 20.0.0
|
|
||||||
|
|
||||||
``AggregateDiskFilter`` is deprecated since the 20.0.0 Train release.
|
|
||||||
As of the introduction of the placement service in Ocata, the behavior
|
|
||||||
of this filter :ref:`has changed <bug-1804125>` and no longer should be used.
|
|
||||||
In the 18.0.0 Rocky release nova `automatically mirrors`_ host aggregates
|
|
||||||
to placement aggregates.
|
|
||||||
In the 19.0.0 Stein release initial allocation ratios support was added
|
|
||||||
which allows management of the allocation ratios via the placement API in
|
|
||||||
addition to the existing capability to manage allocation ratios via the nova
|
|
||||||
config. See `Allocation ratios`_ for details.
|
|
||||||
|
|
||||||
Filters host by disk allocation with a per-aggregate ``disk_allocation_ratio``
|
|
||||||
value. If the per-aggregate value is not found, the value falls back to the
|
|
||||||
global setting. If the host is in more than one aggregate and more than one
|
|
||||||
value is found, the minimum value will be used.
|
|
||||||
|
|
||||||
Refer to :doc:`/admin/aggregates` for more information.
|
|
||||||
|
|
||||||
.. important::
|
|
||||||
|
|
||||||
Note the ``disk_allocation_ratio`` :ref:`bug 1804125 <bug-1804125>`
|
|
||||||
restriction.
|
|
||||||
|
|
||||||
|
|
||||||
.. _AggregateImagePropertiesIsolation:
|
.. _AggregateImagePropertiesIsolation:
|
||||||
|
|
||||||
AggregateImagePropertiesIsolation
|
AggregateImagePropertiesIsolation
|
||||||
@ -370,37 +308,6 @@ Refer to :doc:`/admin/aggregates` and :ref:`NumInstancesFilter` for more
|
|||||||
information.
|
information.
|
||||||
|
|
||||||
|
|
||||||
.. _AggregateRamFilter:
|
|
||||||
|
|
||||||
AggregateRamFilter
|
|
||||||
------------------
|
|
||||||
|
|
||||||
.. deprecated:: 20.0.0
|
|
||||||
|
|
||||||
``AggregateRamFilter`` is deprecated since the 20.0.0 Train release.
|
|
||||||
As of the introduction of the placement service in Ocata, the behavior
|
|
||||||
of this filter :ref:`has changed <bug-1804125>` and no longer should be used.
|
|
||||||
In the 18.0.0 Rocky release nova `automatically mirrors`_ host aggregates
|
|
||||||
to placement aggregates.
|
|
||||||
In the 19.0.0 Stein release initial allocation ratios support was added
|
|
||||||
which allows management of the allocation ratios via the placement API in
|
|
||||||
addition to the existing capability to manage allocation ratios via the nova
|
|
||||||
config. See `Allocation ratios`_ for details.
|
|
||||||
|
|
||||||
Filters host by RAM allocation of instances with a per-aggregate
|
|
||||||
``ram_allocation_ratio`` value. If the per-aggregate value is not found, the
|
|
||||||
value falls back to the global setting. If the host is in more than one
|
|
||||||
aggregate and thus more than one value is found, the minimum value will be
|
|
||||||
used.
|
|
||||||
|
|
||||||
Refer to :doc:`/admin/aggregates` for more information.
|
|
||||||
|
|
||||||
.. important::
|
|
||||||
|
|
||||||
Note the ``ram_allocation_ratio`` :ref:`bug 1804125 <bug-1804125>`
|
|
||||||
restriction.
|
|
||||||
|
|
||||||
|
|
||||||
.. _AggregateTypeAffinityFilter:
|
.. _AggregateTypeAffinityFilter:
|
||||||
|
|
||||||
AggregateTypeAffinityFilter
|
AggregateTypeAffinityFilter
|
||||||
@ -689,26 +596,6 @@ PciPassthroughFilter
|
|||||||
The filter schedules instances on a host if the host has devices that meet the
|
The filter schedules instances on a host if the host has devices that meet the
|
||||||
device requests in the ``extra_specs`` attribute for the flavor.
|
device requests in the ``extra_specs`` attribute for the flavor.
|
||||||
|
|
||||||
RetryFilter
|
|
||||||
-----------
|
|
||||||
|
|
||||||
.. deprecated:: 20.0.0
|
|
||||||
|
|
||||||
Since the 17.0.0 (Queens) release, the scheduler has provided alternate
|
|
||||||
hosts for rescheduling so the scheduler does not need to be called during
|
|
||||||
a reschedule which makes the ``RetryFilter`` useless. See the
|
|
||||||
`Return Alternate Hosts`_ spec for details.
|
|
||||||
|
|
||||||
Filters out hosts that have already been attempted for scheduling purposes. If
|
|
||||||
the scheduler selects a host to respond to a service request, and the host
|
|
||||||
fails to respond to the request, this filter prevents the scheduler from
|
|
||||||
retrying that host for the service request.
|
|
||||||
|
|
||||||
This filter is only useful if the :oslo.config:option:`scheduler.max_attempts`
|
|
||||||
configuration option is set to a value greater than one.
|
|
||||||
|
|
||||||
.. _Return Alternate Hosts: https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/return-alternate-hosts.html
|
|
||||||
|
|
||||||
SameHostFilter
|
SameHostFilter
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
@ -1012,23 +899,6 @@ The allocation ratio configuration is used both during reporting of compute
|
|||||||
node `resource provider inventory`_ to the placement service and during
|
node `resource provider inventory`_ to the placement service and during
|
||||||
scheduling.
|
scheduling.
|
||||||
|
|
||||||
.. _bug-1804125:
|
|
||||||
|
|
||||||
.. note:: Regarding the `AggregateCoreFilter`_, `AggregateDiskFilter`_ and
|
|
||||||
`AggregateRamFilter`_, starting in 15.0.0 (Ocata) there is a behavior
|
|
||||||
change where aggregate-based overcommit ratios will no longer be honored
|
|
||||||
during scheduling for the FilterScheduler. Instead, overcommit values must
|
|
||||||
be set on a per-compute-node basis in the Nova configuration files.
|
|
||||||
|
|
||||||
If you have been relying on per-aggregate overcommit, during your upgrade,
|
|
||||||
you must change to using per-compute-node overcommit ratios in order for
|
|
||||||
your scheduling behavior to stay consistent. Otherwise, you may notice
|
|
||||||
increased NoValidHost scheduling failures as the aggregate-based overcommit
|
|
||||||
is no longer being considered.
|
|
||||||
|
|
||||||
See `bug 1804125 <https://bugs.launchpad.net/nova/+bug/1804125>`_ for more
|
|
||||||
details.
|
|
||||||
|
|
||||||
.. _resource provider inventory: https://docs.openstack.org/api-ref/placement/?expanded=#resource-provider-inventories
|
.. _resource provider inventory: https://docs.openstack.org/api-ref/placement/?expanded=#resource-provider-inventories
|
||||||
|
|
||||||
Usage scenarios
|
Usage scenarios
|
||||||
@ -1060,8 +930,6 @@ here.
|
|||||||
|
|
||||||
$ openstack resource provider inventory set --resource VCPU:allocation_ratio=1.0 815a5634-86fb-4e1e-8824-8a631fee3e06
|
$ openstack resource provider inventory set --resource VCPU:allocation_ratio=1.0 815a5634-86fb-4e1e-8824-8a631fee3e06
|
||||||
|
|
||||||
Note the :ref:`bug 1804125 <bug-1804125>` restriction.
|
|
||||||
|
|
||||||
3. When the deployer wants to **always** use the placement API to set
|
3. When the deployer wants to **always** use the placement API to set
|
||||||
allocation ratios, then the deployer should ensure that
|
allocation ratios, then the deployer should ensure that
|
||||||
``[DEFAULT]/xxx_allocation_ratio`` options are all set to None (the
|
``[DEFAULT]/xxx_allocation_ratio`` options are all set to None (the
|
||||||
|
@ -95,33 +95,12 @@ There are many standard filter classes which may be used
|
|||||||
use a comma. E.g., "value1,value2". All hosts are passed if no extra_specs
|
use a comma. E.g., "value1,value2". All hosts are passed if no extra_specs
|
||||||
are specified.
|
are specified.
|
||||||
* |ComputeFilter| - passes all hosts that are operational and enabled.
|
* |ComputeFilter| - passes all hosts that are operational and enabled.
|
||||||
* |AggregateCoreFilter| - DEPRECATED; filters hosts by CPU core number with per-aggregate
|
|
||||||
:oslo.config:option:`cpu_allocation_ratio` setting. If no
|
|
||||||
per-aggregate value is found, it will fall back to the global default
|
|
||||||
:oslo.config:option:`cpu_allocation_ratio`.
|
|
||||||
If more than one value is found for a host (meaning the host is in two
|
|
||||||
different aggregates with different ratio settings), the minimum value
|
|
||||||
will be used.
|
|
||||||
* |IsolatedHostsFilter| - filter based on
|
* |IsolatedHostsFilter| - filter based on
|
||||||
:oslo.config:option:`filter_scheduler.isolated_images`,
|
:oslo.config:option:`filter_scheduler.isolated_images`,
|
||||||
:oslo.config:option:`filter_scheduler.isolated_hosts`
|
:oslo.config:option:`filter_scheduler.isolated_hosts`
|
||||||
and :oslo.config:option:`filter_scheduler.restrict_isolated_hosts_to_isolated_images`
|
and :oslo.config:option:`filter_scheduler.restrict_isolated_hosts_to_isolated_images`
|
||||||
flags.
|
flags.
|
||||||
* |JsonFilter| - allows simple JSON-based grammar for selecting hosts.
|
* |JsonFilter| - allows simple JSON-based grammar for selecting hosts.
|
||||||
* |AggregateRamFilter| - DEPRECATED; filters hosts by RAM with per-aggregate
|
|
||||||
:oslo.config:option:`ram_allocation_ratio` setting. If no per-aggregate value
|
|
||||||
is found, it will fall back to the global default
|
|
||||||
:oslo.config:option:`ram_allocation_ratio`.
|
|
||||||
If more than one value is found for a host (meaning the host is in two
|
|
||||||
different aggregates with different ratio settings), the minimum value
|
|
||||||
will be used.
|
|
||||||
* |AggregateDiskFilter| - DEPRECATED; filters hosts by disk allocation with per-aggregate
|
|
||||||
:oslo.config:option:`disk_allocation_ratio` setting. If no per-aggregate value
|
|
||||||
is found, it will fall back to the global default
|
|
||||||
:oslo.config:option:`disk_allocation_ratio`.
|
|
||||||
If more than one value is found for a host (meaning the host is in two or more
|
|
||||||
different aggregates with different ratio settings), the minimum value will
|
|
||||||
be used.
|
|
||||||
* |NumInstancesFilter| - filters compute nodes by number of instances.
|
* |NumInstancesFilter| - filters compute nodes by number of instances.
|
||||||
Nodes with too many instances will be filtered. The host will be
|
Nodes with too many instances will be filtered. The host will be
|
||||||
ignored by the scheduler if more than
|
ignored by the scheduler if more than
|
||||||
@ -156,8 +135,6 @@ There are many standard filter classes which may be used
|
|||||||
set of instances.
|
set of instances.
|
||||||
* |SameHostFilter| - puts the instance on the same host as another instance in
|
* |SameHostFilter| - puts the instance on the same host as another instance in
|
||||||
a set of instances.
|
a set of instances.
|
||||||
* |RetryFilter| - DEPRECATED; filters hosts that have been attempted for
|
|
||||||
scheduling. Only passes hosts that have not been previously attempted.
|
|
||||||
* |AggregateTypeAffinityFilter| - limits instance_type by aggregate.
|
* |AggregateTypeAffinityFilter| - limits instance_type by aggregate.
|
||||||
This filter passes hosts if no instance_type key is set or
|
This filter passes hosts if no instance_type key is set or
|
||||||
the instance_type aggregate metadata value contains the name of the
|
the instance_type aggregate metadata value contains the name of the
|
||||||
@ -281,26 +258,6 @@ creation of the new server for the user. The only exception for this rule is
|
|||||||
directly. Variable naming, such as the ``$free_ram_mb`` example above, should
|
directly. Variable naming, such as the ``$free_ram_mb`` example above, should
|
||||||
be based on those attributes.
|
be based on those attributes.
|
||||||
|
|
||||||
The |RetryFilter| filters hosts that have already been attempted for
|
|
||||||
scheduling. It only passes hosts that have not been previously attempted. If a
|
|
||||||
compute node is raising an exception when spawning an instance, then the
|
|
||||||
compute manager will reschedule it by adding the failing host to a retry
|
|
||||||
dictionary so that the RetryFilter will not accept it as a possible
|
|
||||||
destination. That means that if all of your compute nodes are failing, then the
|
|
||||||
RetryFilter will return 0 hosts and the scheduler will raise a NoValidHost
|
|
||||||
exception even if the problem is related to 1:N compute nodes. If you see that
|
|
||||||
case in the scheduler logs, then your problem is most likely related to a
|
|
||||||
compute problem and you should check the compute logs.
|
|
||||||
|
|
||||||
.. note:: The ``RetryFilter`` is deprecated since the 20.0.0 (Train) release
|
|
||||||
and will be removed in an upcoming release. Since the 17.0.0 (Queens)
|
|
||||||
release, the scheduler has provided alternate hosts for rescheduling
|
|
||||||
so the scheduler does not need to be called during a reschedule which
|
|
||||||
makes the ``RetryFilter`` useless. See the `Return Alternate Hosts`_
|
|
||||||
spec for details.
|
|
||||||
|
|
||||||
.. _Return Alternate Hosts: https://specs.openstack.org/openstack/nova-specs/specs/queens/implemented/return-alternate-hosts.html
|
|
||||||
|
|
||||||
The |NUMATopologyFilter| considers the NUMA topology that was specified for the instance
|
The |NUMATopologyFilter| considers the NUMA topology that was specified for the instance
|
||||||
through the use of flavor extra_specs in combination with the image properties, as
|
through the use of flavor extra_specs in combination with the image properties, as
|
||||||
described in detail in the related nova-spec document:
|
described in detail in the related nova-spec document:
|
||||||
@ -647,11 +604,8 @@ in :mod:`nova.tests.scheduler`.
|
|||||||
.. |BaseHostFilter| replace:: :class:`BaseHostFilter <nova.scheduler.filters.BaseHostFilter>`
|
.. |BaseHostFilter| replace:: :class:`BaseHostFilter <nova.scheduler.filters.BaseHostFilter>`
|
||||||
.. |ComputeCapabilitiesFilter| replace:: :class:`ComputeCapabilitiesFilter <nova.scheduler.filters.compute_capabilities_filter.ComputeCapabilitiesFilter>`
|
.. |ComputeCapabilitiesFilter| replace:: :class:`ComputeCapabilitiesFilter <nova.scheduler.filters.compute_capabilities_filter.ComputeCapabilitiesFilter>`
|
||||||
.. |ComputeFilter| replace:: :class:`ComputeFilter <nova.scheduler.filters.compute_filter.ComputeFilter>`
|
.. |ComputeFilter| replace:: :class:`ComputeFilter <nova.scheduler.filters.compute_filter.ComputeFilter>`
|
||||||
.. |AggregateCoreFilter| replace:: :class:`AggregateCoreFilter <nova.scheduler.filters.core_filter.AggregateCoreFilter>`
|
|
||||||
.. |IsolatedHostsFilter| replace:: :class:`IsolatedHostsFilter <nova.scheduler.filters.isolated_hosts_filter>`
|
.. |IsolatedHostsFilter| replace:: :class:`IsolatedHostsFilter <nova.scheduler.filters.isolated_hosts_filter>`
|
||||||
.. |JsonFilter| replace:: :class:`JsonFilter <nova.scheduler.filters.json_filter.JsonFilter>`
|
.. |JsonFilter| replace:: :class:`JsonFilter <nova.scheduler.filters.json_filter.JsonFilter>`
|
||||||
.. |AggregateRamFilter| replace:: :class:`AggregateRamFilter <nova.scheduler.filters.ram_filter.AggregateRamFilter>`
|
|
||||||
.. |AggregateDiskFilter| replace:: :class:`AggregateDiskFilter <nova.scheduler.filters.disk_filter.AggregateDiskFilter>`
|
|
||||||
.. |NumInstancesFilter| replace:: :class:`NumInstancesFilter <nova.scheduler.filters.num_instances_filter.NumInstancesFilter>`
|
.. |NumInstancesFilter| replace:: :class:`NumInstancesFilter <nova.scheduler.filters.num_instances_filter.NumInstancesFilter>`
|
||||||
.. |AggregateNumInstancesFilter| replace:: :class:`AggregateNumInstancesFilter <nova.scheduler.filters.num_instances_filter.AggregateNumInstancesFilter>`
|
.. |AggregateNumInstancesFilter| replace:: :class:`AggregateNumInstancesFilter <nova.scheduler.filters.num_instances_filter.AggregateNumInstancesFilter>`
|
||||||
.. |IoOpsFilter| replace:: :class:`IoOpsFilter <nova.scheduler.filters.io_ops_filter.IoOpsFilter>`
|
.. |IoOpsFilter| replace:: :class:`IoOpsFilter <nova.scheduler.filters.io_ops_filter.IoOpsFilter>`
|
||||||
@ -660,7 +614,6 @@ in :mod:`nova.tests.scheduler`.
|
|||||||
.. |SimpleCIDRAffinityFilter| replace:: :class:`SimpleCIDRAffinityFilter <nova.scheduler.filters.affinity_filter.SimpleCIDRAffinityFilter>`
|
.. |SimpleCIDRAffinityFilter| replace:: :class:`SimpleCIDRAffinityFilter <nova.scheduler.filters.affinity_filter.SimpleCIDRAffinityFilter>`
|
||||||
.. |DifferentHostFilter| replace:: :class:`DifferentHostFilter <nova.scheduler.filters.affinity_filter.DifferentHostFilter>`
|
.. |DifferentHostFilter| replace:: :class:`DifferentHostFilter <nova.scheduler.filters.affinity_filter.DifferentHostFilter>`
|
||||||
.. |SameHostFilter| replace:: :class:`SameHostFilter <nova.scheduler.filters.affinity_filter.SameHostFilter>`
|
.. |SameHostFilter| replace:: :class:`SameHostFilter <nova.scheduler.filters.affinity_filter.SameHostFilter>`
|
||||||
.. |RetryFilter| replace:: :class:`RetryFilter <nova.scheduler.filters.retry_filter.RetryFilter>`
|
|
||||||
.. |AggregateTypeAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter <nova.scheduler.filters.type_filter.AggregateTypeAffinityFilter>`
|
.. |AggregateTypeAffinityFilter| replace:: :class:`AggregateTypeAffinityFilter <nova.scheduler.filters.type_filter.AggregateTypeAffinityFilter>`
|
||||||
.. |ServerGroupAntiAffinityFilter| replace:: :class:`ServerGroupAntiAffinityFilter <nova.scheduler.filters.affinity_filter.ServerGroupAntiAffinityFilter>`
|
.. |ServerGroupAntiAffinityFilter| replace:: :class:`ServerGroupAntiAffinityFilter <nova.scheduler.filters.affinity_filter.ServerGroupAntiAffinityFilter>`
|
||||||
.. |ServerGroupAffinityFilter| replace:: :class:`ServerGroupAffinityFilter <nova.scheduler.filters.affinity_filter.ServerGroupAffinityFilter>`
|
.. |ServerGroupAffinityFilter| replace:: :class:`ServerGroupAffinityFilter <nova.scheduler.filters.affinity_filter.ServerGroupAffinityFilter>`
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
# Copyright (c) 2011 OpenStack Foundation
|
|
||||||
# Copyright (c) 2012 Justin Santa Barbara
|
|
||||||
#
|
|
||||||
# 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 nova.scheduler import filters
|
|
||||||
from nova.scheduler.filters import utils
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class AggregateCoreFilter(filters.BaseHostFilter):
|
|
||||||
"""DEPRECATED: AggregateCoreFilter with per-aggregate allocation ratio.
|
|
||||||
|
|
||||||
Fall back to global cpu_allocation_ratio if no per-aggregate setting found.
|
|
||||||
"""
|
|
||||||
|
|
||||||
RUN_ON_REBUILD = False
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(AggregateCoreFilter, self).__init__()
|
|
||||||
LOG.warning('The AggregateCoreFilter is deprecated since the 20.0.0 '
|
|
||||||
'Train release. VCPU filtering is performed natively '
|
|
||||||
'using the Placement service when using the '
|
|
||||||
'filter_scheduler driver. Operators should define cpu '
|
|
||||||
'allocation ratios either per host in the nova.conf '
|
|
||||||
'or via the placement API.')
|
|
||||||
|
|
||||||
def _get_cpu_allocation_ratio(self, host_state, spec_obj):
|
|
||||||
aggregate_vals = utils.aggregate_values_from_key(
|
|
||||||
host_state,
|
|
||||||
'cpu_allocation_ratio')
|
|
||||||
try:
|
|
||||||
ratio = utils.validate_num_values(
|
|
||||||
aggregate_vals, host_state.cpu_allocation_ratio, cast_to=float)
|
|
||||||
except ValueError as e:
|
|
||||||
LOG.warning("Could not decode cpu_allocation_ratio: '%s'", e)
|
|
||||||
ratio = host_state.cpu_allocation_ratio
|
|
||||||
|
|
||||||
return ratio
|
|
||||||
|
|
||||||
def host_passes(self, host_state, spec_obj):
|
|
||||||
"""Return True if host has sufficient CPU cores.
|
|
||||||
|
|
||||||
:param host_state: nova.scheduler.host_manager.HostState
|
|
||||||
:param spec_obj: filter options
|
|
||||||
:return: boolean
|
|
||||||
"""
|
|
||||||
if not host_state.vcpus_total:
|
|
||||||
# Fail safe
|
|
||||||
LOG.warning("VCPUs not set; assuming CPU collection broken")
|
|
||||||
return True
|
|
||||||
|
|
||||||
instance_vcpus = spec_obj.vcpus
|
|
||||||
cpu_allocation_ratio = self._get_cpu_allocation_ratio(host_state,
|
|
||||||
spec_obj)
|
|
||||||
vcpus_total = host_state.vcpus_total * cpu_allocation_ratio
|
|
||||||
|
|
||||||
# Only provide a VCPU limit to compute if the virt driver is reporting
|
|
||||||
# an accurate count of installed VCPUs. (XenServer driver does not)
|
|
||||||
if vcpus_total > 0:
|
|
||||||
host_state.limits['vcpu'] = vcpus_total
|
|
||||||
|
|
||||||
# Do not allow an instance to overcommit against itself, only
|
|
||||||
# against other instances.
|
|
||||||
if instance_vcpus > host_state.vcpus_total:
|
|
||||||
LOG.debug("%(host_state)s does not have %(instance_vcpus)d "
|
|
||||||
"total cpus before overcommit, it only has %(cpus)d",
|
|
||||||
{'host_state': host_state,
|
|
||||||
'instance_vcpus': instance_vcpus,
|
|
||||||
'cpus': host_state.vcpus_total})
|
|
||||||
return False
|
|
||||||
|
|
||||||
free_vcpus = vcpus_total - host_state.vcpus_used
|
|
||||||
if free_vcpus < instance_vcpus:
|
|
||||||
LOG.debug("%(host_state)s does not have %(instance_vcpus)d "
|
|
||||||
"usable vcpus, it only has %(free_vcpus)d usable "
|
|
||||||
"vcpus",
|
|
||||||
{'host_state': host_state,
|
|
||||||
'instance_vcpus': instance_vcpus,
|
|
||||||
'free_vcpus': free_vcpus})
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
@ -1,95 +0,0 @@
|
|||||||
# Copyright (c) 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.
|
|
||||||
|
|
||||||
from oslo_log import log as logging
|
|
||||||
|
|
||||||
from nova.scheduler import filters
|
|
||||||
from nova.scheduler.filters import utils
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class AggregateDiskFilter(filters.BaseHostFilter):
|
|
||||||
"""DEPRECATED: AggregateDiskFilter with per-aggregate disk allocation ratio
|
|
||||||
|
|
||||||
Fall back to global disk_allocation_ratio if no per-aggregate setting
|
|
||||||
found.
|
|
||||||
"""
|
|
||||||
|
|
||||||
RUN_ON_REBUILD = False
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(AggregateDiskFilter, self).__init__()
|
|
||||||
LOG.warning('The AggregateDiskFilter is deprecated since the 20.0.0 '
|
|
||||||
'Train release. DISK_GB filtering is performed natively '
|
|
||||||
'using the Placement service when using the '
|
|
||||||
'filter_scheduler driver. Operators should define disk '
|
|
||||||
'allocation ratios either per host in the nova.conf '
|
|
||||||
'or via the placement API.')
|
|
||||||
|
|
||||||
def _get_disk_allocation_ratio(self, host_state, spec_obj):
|
|
||||||
aggregate_vals = utils.aggregate_values_from_key(
|
|
||||||
host_state,
|
|
||||||
'disk_allocation_ratio')
|
|
||||||
try:
|
|
||||||
ratio = utils.validate_num_values(
|
|
||||||
aggregate_vals, host_state.disk_allocation_ratio,
|
|
||||||
cast_to=float)
|
|
||||||
except ValueError as e:
|
|
||||||
LOG.warning("Could not decode disk_allocation_ratio: '%s'", e)
|
|
||||||
ratio = host_state.disk_allocation_ratio
|
|
||||||
|
|
||||||
return ratio
|
|
||||||
|
|
||||||
def host_passes(self, host_state, spec_obj):
|
|
||||||
"""Filter based on disk usage."""
|
|
||||||
requested_disk = (1024 * (spec_obj.root_gb +
|
|
||||||
spec_obj.ephemeral_gb) +
|
|
||||||
spec_obj.swap)
|
|
||||||
|
|
||||||
free_disk_mb = host_state.free_disk_mb
|
|
||||||
total_usable_disk_mb = host_state.total_usable_disk_gb * 1024
|
|
||||||
|
|
||||||
# Do not allow an instance to overcommit against itself, only against
|
|
||||||
# other instances. In other words, if there isn't room for even just
|
|
||||||
# this one instance in total_usable_disk space, consider the host full.
|
|
||||||
if total_usable_disk_mb < requested_disk:
|
|
||||||
LOG.debug("%(host_state)s does not have %(requested_disk)s "
|
|
||||||
"MB usable disk space before overcommit, it only "
|
|
||||||
"has %(physical_disk_size)s MB.",
|
|
||||||
{'host_state': host_state,
|
|
||||||
'requested_disk': requested_disk,
|
|
||||||
'physical_disk_size':
|
|
||||||
total_usable_disk_mb})
|
|
||||||
return False
|
|
||||||
|
|
||||||
disk_allocation_ratio = self._get_disk_allocation_ratio(
|
|
||||||
host_state, spec_obj)
|
|
||||||
|
|
||||||
disk_mb_limit = total_usable_disk_mb * disk_allocation_ratio
|
|
||||||
used_disk_mb = total_usable_disk_mb - free_disk_mb
|
|
||||||
usable_disk_mb = disk_mb_limit - used_disk_mb
|
|
||||||
|
|
||||||
if not usable_disk_mb >= requested_disk:
|
|
||||||
LOG.debug("%(host_state)s does not have %(requested_disk)s MB "
|
|
||||||
"usable disk, it only has %(usable_disk_mb)s MB usable "
|
|
||||||
"disk.", {'host_state': host_state,
|
|
||||||
'requested_disk': requested_disk,
|
|
||||||
'usable_disk_mb': usable_disk_mb})
|
|
||||||
return False
|
|
||||||
|
|
||||||
disk_gb_limit = disk_mb_limit / 1024
|
|
||||||
host_state.limits['disk_gb'] = disk_gb_limit
|
|
||||||
return True
|
|
@ -1,89 +0,0 @@
|
|||||||
# Copyright (c) 2011 OpenStack Foundation
|
|
||||||
# Copyright (c) 2012 Cloudscaling
|
|
||||||
# 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 nova.scheduler import filters
|
|
||||||
from nova.scheduler.filters import utils
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class AggregateRamFilter(filters.BaseHostFilter):
|
|
||||||
"""DEPRECATED: AggregateRamFilter with per-aggregate ram subscription flag.
|
|
||||||
|
|
||||||
Fall back to global ram_allocation_ratio if no per-aggregate setting found.
|
|
||||||
"""
|
|
||||||
|
|
||||||
RUN_ON_REBUILD = False
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(AggregateRamFilter, self).__init__()
|
|
||||||
LOG.warning('The AggregateRamFilter is deprecated since the 20.0.0 '
|
|
||||||
'Train release. MEMORY_MB filtering is performed natively '
|
|
||||||
'using the Placement service when using the '
|
|
||||||
'filter_scheduler driver. Operators should define ram '
|
|
||||||
'allocation ratios either per host in the nova.conf '
|
|
||||||
'or via the placement API.')
|
|
||||||
|
|
||||||
def _get_ram_allocation_ratio(self, host_state, spec_obj):
|
|
||||||
aggregate_vals = utils.aggregate_values_from_key(
|
|
||||||
host_state,
|
|
||||||
'ram_allocation_ratio')
|
|
||||||
|
|
||||||
try:
|
|
||||||
ratio = utils.validate_num_values(
|
|
||||||
aggregate_vals, host_state.ram_allocation_ratio, cast_to=float)
|
|
||||||
except ValueError as e:
|
|
||||||
LOG.warning("Could not decode ram_allocation_ratio: '%s'", e)
|
|
||||||
ratio = host_state.ram_allocation_ratio
|
|
||||||
|
|
||||||
return ratio
|
|
||||||
|
|
||||||
def host_passes(self, host_state, spec_obj):
|
|
||||||
"""Only return hosts with sufficient available RAM."""
|
|
||||||
requested_ram = spec_obj.memory_mb
|
|
||||||
free_ram_mb = host_state.free_ram_mb
|
|
||||||
total_usable_ram_mb = host_state.total_usable_ram_mb
|
|
||||||
|
|
||||||
# Do not allow an instance to overcommit against itself, only against
|
|
||||||
# other instances.
|
|
||||||
if not total_usable_ram_mb >= requested_ram:
|
|
||||||
LOG.debug("%(host_state)s does not have %(requested_ram)s MB "
|
|
||||||
"usable ram before overcommit, it only has "
|
|
||||||
"%(usable_ram)s MB.",
|
|
||||||
{'host_state': host_state,
|
|
||||||
'requested_ram': requested_ram,
|
|
||||||
'usable_ram': total_usable_ram_mb})
|
|
||||||
return False
|
|
||||||
|
|
||||||
ram_allocation_ratio = self._get_ram_allocation_ratio(host_state,
|
|
||||||
spec_obj)
|
|
||||||
|
|
||||||
memory_mb_limit = total_usable_ram_mb * ram_allocation_ratio
|
|
||||||
used_ram_mb = total_usable_ram_mb - free_ram_mb
|
|
||||||
usable_ram = memory_mb_limit - used_ram_mb
|
|
||||||
if not usable_ram >= requested_ram:
|
|
||||||
LOG.debug("%(host_state)s does not have %(requested_ram)s MB "
|
|
||||||
"usable ram, it only has %(usable_ram)s MB usable ram.",
|
|
||||||
{'host_state': host_state,
|
|
||||||
'requested_ram': requested_ram,
|
|
||||||
'usable_ram': usable_ram})
|
|
||||||
return False
|
|
||||||
|
|
||||||
# save oversubscription limit for compute node to test against:
|
|
||||||
host_state.limits['memory_mb'] = memory_mb_limit
|
|
||||||
return True
|
|
@ -1,60 +0,0 @@
|
|||||||
# Copyright (c) 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.
|
|
||||||
|
|
||||||
from oslo_log import log as logging
|
|
||||||
|
|
||||||
from nova.scheduler import filters
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class RetryFilter(filters.BaseHostFilter):
|
|
||||||
"""Filter out nodes that have already been attempted for scheduling
|
|
||||||
purposes
|
|
||||||
"""
|
|
||||||
|
|
||||||
# NOTE(danms): This does not affect _where_ an instance lands, so not
|
|
||||||
# related to rebuild.
|
|
||||||
RUN_ON_REBUILD = False
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(RetryFilter, self).__init__()
|
|
||||||
LOG.warning('The RetryFilter is deprecated since the 20.0.0 Train '
|
|
||||||
'release. Since the 17.0.0 (Queens) release, the '
|
|
||||||
'scheduler has provided alternate hosts for rescheduling '
|
|
||||||
'so the scheduler does not need to be called during a '
|
|
||||||
'reschedule which makes the RetryFilter useless.')
|
|
||||||
|
|
||||||
def host_passes(self, host_state, spec_obj):
|
|
||||||
"""Skip nodes that have already been attempted."""
|
|
||||||
retry = spec_obj.retry
|
|
||||||
if not retry:
|
|
||||||
return True
|
|
||||||
|
|
||||||
# TODO(sbauza): Once the HostState is actually a ComputeNode, we could
|
|
||||||
# easily get this one...
|
|
||||||
host = [host_state.host, host_state.nodename]
|
|
||||||
# TODO(sbauza)... and we wouldn't need to primitive the hosts into
|
|
||||||
# lists
|
|
||||||
hosts = [[cn.host, cn.hypervisor_hostname] for cn in retry.hosts]
|
|
||||||
|
|
||||||
passes = host not in hosts
|
|
||||||
|
|
||||||
if not passes:
|
|
||||||
LOG.info("Host %(host)s fails. Previously tried hosts: "
|
|
||||||
"%(hosts)s", {'host': host, 'hosts': hosts})
|
|
||||||
|
|
||||||
# Host passes if it's not in the list of previously attempted hosts:
|
|
||||||
return passes
|
|
@ -1,64 +0,0 @@
|
|||||||
# 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 mock
|
|
||||||
|
|
||||||
from nova import objects
|
|
||||||
from nova.scheduler.filters import core_filter
|
|
||||||
from nova import test
|
|
||||||
from nova.tests.unit.scheduler import fakes
|
|
||||||
|
|
||||||
|
|
||||||
class TestAggregateCoreFilter(test.NoDBTestCase):
|
|
||||||
|
|
||||||
@mock.patch('nova.scheduler.filters.utils.aggregate_values_from_key')
|
|
||||||
def test_aggregate_core_filter_value_error(self, agg_mock):
|
|
||||||
self.filt_cls = core_filter.AggregateCoreFilter()
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx, flavor=objects.Flavor(vcpus=1))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'vcpus_total': 4, 'vcpus_used': 7,
|
|
||||||
'cpu_allocation_ratio': 2})
|
|
||||||
agg_mock.return_value = set(['XXX'])
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
agg_mock.assert_called_once_with(host, 'cpu_allocation_ratio')
|
|
||||||
self.assertEqual(4 * 2, host.limits['vcpu'])
|
|
||||||
|
|
||||||
@mock.patch('nova.scheduler.filters.utils.aggregate_values_from_key')
|
|
||||||
def test_aggregate_core_filter_default_value(self, agg_mock):
|
|
||||||
self.filt_cls = core_filter.AggregateCoreFilter()
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx, flavor=objects.Flavor(vcpus=1))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'vcpus_total': 4, 'vcpus_used': 8,
|
|
||||||
'cpu_allocation_ratio': 2})
|
|
||||||
agg_mock.return_value = set([])
|
|
||||||
# False: fallback to default flag w/o aggregates
|
|
||||||
self.assertFalse(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
agg_mock.assert_called_once_with(host, 'cpu_allocation_ratio')
|
|
||||||
# True: use ratio from aggregates
|
|
||||||
agg_mock.return_value = set(['3'])
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
self.assertEqual(4 * 3, host.limits['vcpu'])
|
|
||||||
|
|
||||||
@mock.patch('nova.scheduler.filters.utils.aggregate_values_from_key')
|
|
||||||
def test_aggregate_core_filter_conflict_values(self, agg_mock):
|
|
||||||
self.filt_cls = core_filter.AggregateCoreFilter()
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx, flavor=objects.Flavor(vcpus=1))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'vcpus_total': 4, 'vcpus_used': 8,
|
|
||||||
'cpu_allocation_ratio': 1})
|
|
||||||
agg_mock.return_value = set(['2', '3'])
|
|
||||||
# use the minimum ratio from aggregates
|
|
||||||
self.assertFalse(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
self.assertEqual(4 * 2, host.limits['vcpu'])
|
|
@ -1,55 +0,0 @@
|
|||||||
# 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 mock
|
|
||||||
|
|
||||||
from nova import objects
|
|
||||||
from nova.scheduler.filters import disk_filter
|
|
||||||
from nova import test
|
|
||||||
from nova.tests.unit.scheduler import fakes
|
|
||||||
|
|
||||||
|
|
||||||
class TestAggregateDiskFilter(test.NoDBTestCase):
|
|
||||||
|
|
||||||
@mock.patch('nova.scheduler.filters.utils.aggregate_values_from_key')
|
|
||||||
def test_aggregate_disk_filter_value_error(self, agg_mock):
|
|
||||||
filt_cls = disk_filter.AggregateDiskFilter()
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx,
|
|
||||||
flavor=objects.Flavor(
|
|
||||||
root_gb=1, ephemeral_gb=1, swap=1024))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'free_disk_mb': 3 * 1024,
|
|
||||||
'total_usable_disk_gb': 4,
|
|
||||||
'disk_allocation_ratio': 1.0})
|
|
||||||
agg_mock.return_value = set(['XXX'])
|
|
||||||
self.assertTrue(filt_cls.host_passes(host, spec_obj))
|
|
||||||
agg_mock.assert_called_once_with(host, 'disk_allocation_ratio')
|
|
||||||
|
|
||||||
@mock.patch('nova.scheduler.filters.utils.aggregate_values_from_key')
|
|
||||||
def test_aggregate_disk_filter_default_value(self, agg_mock):
|
|
||||||
filt_cls = disk_filter.AggregateDiskFilter()
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx,
|
|
||||||
flavor=objects.Flavor(
|
|
||||||
root_gb=2, ephemeral_gb=1, swap=1024))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'free_disk_mb': 3 * 1024,
|
|
||||||
'total_usable_disk_gb': 4,
|
|
||||||
'disk_allocation_ratio': 1.0})
|
|
||||||
# Uses global conf.
|
|
||||||
agg_mock.return_value = set([])
|
|
||||||
self.assertFalse(filt_cls.host_passes(host, spec_obj))
|
|
||||||
agg_mock.assert_called_once_with(host, 'disk_allocation_ratio')
|
|
||||||
|
|
||||||
agg_mock.return_value = set(['2'])
|
|
||||||
self.assertTrue(filt_cls.host_passes(host, spec_obj))
|
|
@ -1,64 +0,0 @@
|
|||||||
# 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 mock
|
|
||||||
|
|
||||||
from nova import objects
|
|
||||||
from nova.scheduler.filters import ram_filter
|
|
||||||
from nova import test
|
|
||||||
from nova.tests.unit.scheduler import fakes
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch('nova.scheduler.filters.utils.aggregate_values_from_key')
|
|
||||||
class TestAggregateRamFilter(test.NoDBTestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestAggregateRamFilter, self).setUp()
|
|
||||||
self.filt_cls = ram_filter.AggregateRamFilter()
|
|
||||||
|
|
||||||
def test_aggregate_ram_filter_value_error(self, agg_mock):
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx,
|
|
||||||
flavor=objects.Flavor(memory_mb=1024))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'free_ram_mb': 1024, 'total_usable_ram_mb': 1024,
|
|
||||||
'ram_allocation_ratio': 1.0})
|
|
||||||
agg_mock.return_value = set(['XXX'])
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
self.assertEqual(1024 * 1.0, host.limits['memory_mb'])
|
|
||||||
|
|
||||||
def test_aggregate_ram_filter_default_value(self, agg_mock):
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx,
|
|
||||||
flavor=objects.Flavor(memory_mb=1024))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'free_ram_mb': 1023, 'total_usable_ram_mb': 1024,
|
|
||||||
'ram_allocation_ratio': 1.0})
|
|
||||||
# False: fallback to default flag w/o aggregates
|
|
||||||
agg_mock.return_value = set()
|
|
||||||
self.assertFalse(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
agg_mock.return_value = set(['2.0'])
|
|
||||||
# True: use ratio from aggregates
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
self.assertEqual(1024 * 2.0, host.limits['memory_mb'])
|
|
||||||
|
|
||||||
def test_aggregate_ram_filter_conflict_values(self, agg_mock):
|
|
||||||
spec_obj = objects.RequestSpec(
|
|
||||||
context=mock.sentinel.ctx,
|
|
||||||
flavor=objects.Flavor(memory_mb=1024))
|
|
||||||
host = fakes.FakeHostState('host1', 'node1',
|
|
||||||
{'free_ram_mb': 1023, 'total_usable_ram_mb': 1024,
|
|
||||||
'ram_allocation_ratio': 1.0})
|
|
||||||
agg_mock.return_value = set(['1.5', '2.0'])
|
|
||||||
# use the minimum ratio from aggregates
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
self.assertEqual(1024 * 1.5, host.limits['memory_mb'])
|
|
@ -1,56 +0,0 @@
|
|||||||
# 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 nova import objects
|
|
||||||
from nova.scheduler.filters import retry_filter
|
|
||||||
from nova import test
|
|
||||||
from nova.tests.unit.scheduler import fakes
|
|
||||||
|
|
||||||
|
|
||||||
class TestRetryFilter(test.NoDBTestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestRetryFilter, self).setUp()
|
|
||||||
self.filt_cls = retry_filter.RetryFilter()
|
|
||||||
self.assertIn('The RetryFilter is deprecated',
|
|
||||||
self.stdlog.logger.output)
|
|
||||||
|
|
||||||
def test_retry_filter_disabled(self):
|
|
||||||
# Test case where retry/re-scheduling is disabled.
|
|
||||||
host = fakes.FakeHostState('host1', 'node1', {})
|
|
||||||
spec_obj = objects.RequestSpec(retry=None)
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
|
|
||||||
def test_retry_filter_pass(self):
|
|
||||||
# Node not previously tried.
|
|
||||||
host = fakes.FakeHostState('host1', 'nodeX', {})
|
|
||||||
retry = objects.SchedulerRetries(
|
|
||||||
num_attempts=2,
|
|
||||||
hosts=objects.ComputeNodeList(objects=[
|
|
||||||
# same host, different node
|
|
||||||
objects.ComputeNode(host='host1', hypervisor_hostname='node1'),
|
|
||||||
# different host and node
|
|
||||||
objects.ComputeNode(host='host2', hypervisor_hostname='node2'),
|
|
||||||
]))
|
|
||||||
spec_obj = objects.RequestSpec(retry=retry)
|
|
||||||
self.assertTrue(self.filt_cls.host_passes(host, spec_obj))
|
|
||||||
|
|
||||||
def test_retry_filter_fail(self):
|
|
||||||
# Node was already tried.
|
|
||||||
host = fakes.FakeHostState('host1', 'node1', {})
|
|
||||||
retry = objects.SchedulerRetries(
|
|
||||||
num_attempts=1,
|
|
||||||
hosts=objects.ComputeNodeList(objects=[
|
|
||||||
objects.ComputeNode(host='host1', hypervisor_hostname='node1')
|
|
||||||
]))
|
|
||||||
spec_obj = objects.RequestSpec(retry=retry)
|
|
||||||
self.assertFalse(self.filt_cls.host_passes(host, spec_obj))
|
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
The following deprecated scheduler filters have been removed.
|
||||||
|
|
||||||
|
RetryFilter
|
||||||
|
Deprecated in Train (20.0.0). The RetryFilter has
|
||||||
|
not been requied since Queens following the completion of the
|
||||||
|
return-alternate-hosts blueprint
|
||||||
|
|
||||||
|
Aggregatefilter, AggregateRAMFilter, AggregateDiskFilter
|
||||||
|
Deprecated in Train (20.0.0). These filters have not worked
|
||||||
|
correctly since the introduction of placement in ocata.
|
||||||
|
|
||||||
|
On upgrade operators should ensure they have not configured
|
||||||
|
any of the new removed filters and instead should use placement
|
||||||
|
to control cpu, ram and disk allocation ratios.
|
||||||
|
|
||||||
|
Refer to the `config reference documentation`__ for more information.
|
||||||
|
|
||||||
|
.. __: https://docs.openstack.org/nova/latest/admin/configuration/schedulers.html#allocation-ratios
|
Loading…
x
Reference in New Issue
Block a user