diff --git a/doc/source/filter_scheduler.rst b/doc/source/filter_scheduler.rst index 8e41e8703983..407f23e7df96 100644 --- a/doc/source/filter_scheduler.rst +++ b/doc/source/filter_scheduler.rst @@ -164,6 +164,15 @@ There are many standard filter classes which may be used * |TypeAffinityFilter| - Only passes hosts that are not already running an instance of the requested type. + + .. warning:: TypeAffinityFilter is deprecated for removal in the + 17.0.0 Queens release. There is no replacement planned for this + filter. It is fundamentally flawed in that it relies on the + ``flavors.id`` primary key and if a flavor "changed", i.e. deleted + and re-created with new values, it will result in this filter + thinking it is a different flavor, thus breaking the usefulness of + this filter. + * |AggregateTypeAffinityFilter| - limits instance_type by aggregate. This filter passes hosts if no instance_type key is set or the instance_type aggregate metadata value contains the name of the diff --git a/nova/scheduler/filters/type_filter.py b/nova/scheduler/filters/type_filter.py index b10060db0eb9..7b9a0ad54fba 100644 --- a/nova/scheduler/filters/type_filter.py +++ b/nova/scheduler/filters/type_filter.py @@ -14,17 +14,33 @@ # 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 TypeAffinityFilter(filters.BaseHostFilter): - """TypeAffinityFilter doesn't allow more than one VM type per host. + """DEPRECATED: TypeAffinityFilter doesn't allow more than one VM type + per host. Note: this works best with ram_weight_multiplier (spread) set to 1 (default). """ + def __init__(self): + super(TypeAffinityFilter, self).__init__() + LOG.warning('TypeAffinityFilter is deprecated for removal in the ' + '17.0.0 Queens release. There is no replacement planned ' + 'for this filter. It is fundamentally flawed in that it ' + 'relies on the flavors.id primary key and if a flavor ' + '\"changed\" (deleted and re-created with new values) ' + 'it will result in this filter thinking it is a ' + 'different flavor, thus breaking the usefulness of this ' + 'filter.') + def host_passes(self, host_state, spec_obj): """Dynamically limits hosts to one instance type diff --git a/nova/tests/unit/scheduler/filters/test_type_filters.py b/nova/tests/unit/scheduler/filters/test_type_filters.py index da7efee539b5..5180dc4c59f6 100644 --- a/nova/tests/unit/scheduler/filters/test_type_filters.py +++ b/nova/tests/unit/scheduler/filters/test_type_filters.py @@ -12,6 +12,8 @@ import mock +import six + from nova import objects from nova.scheduler.filters import type_filter from nova import test @@ -22,7 +24,12 @@ from nova.tests import uuidsentinel as uuids class TestTypeFilter(test.NoDBTestCase): def test_type_filter(self): - self.filt_cls = type_filter.TypeAffinityFilter() + with mock.patch.object(type_filter.LOG, 'warning') as mock_warning: + self.filt_cls = type_filter.TypeAffinityFilter() + # make sure we logged a deprecation warning + self.assertEqual(1, mock_warning.call_count) + self.assertIn('TypeAffinityFilter is deprecated for removal', + six.text_type(mock_warning.call_args_list[0][0])) host = fakes.FakeHostState('fake_host', 'fake_node', {}) host.instances = {} target_id = 1 diff --git a/releasenotes/notes/deprecate-TypeAffinityFilter-465c47a6b2a7bd77.yaml b/releasenotes/notes/deprecate-TypeAffinityFilter-465c47a6b2a7bd77.yaml new file mode 100644 index 000000000000..c21fff8882de --- /dev/null +++ b/releasenotes/notes/deprecate-TypeAffinityFilter-465c47a6b2a7bd77.yaml @@ -0,0 +1,10 @@ +--- +deprecations: + - | + TypeAffinityFilter is deprecated for removal in the + 17.0.0 Queens release. There is no replacement planned for this + filter. It is fundamentally flawed in that it relies on the + ``flavors.id`` primary key and if a flavor "changed", i.e. deleted + and re-created with new values, it will result in this filter + thinking it is a different flavor, thus breaking the usefulness of + this filter.