From b99d806cf3dccab76161883a6d521231971070c0 Mon Sep 17 00:00:00 2001 From: James Page Date: Mon, 4 Mar 2019 16:20:12 +0000 Subject: [PATCH] Update default scheduler filters Make the default set of scheduler filters conditional on the release being deployed; For Pike or later the CoreFilter, RamFilter and DiskFilter are superfluous to requirements as this filters are in effect completed by the Placement API. Add DiskFilter to list of filters for older OpenStack releases. Change-Id: Iddb4f1f068b982dcd9a70b11b89df1be9f8aaf20 Closes-Bug: 1731302 Closes-Bug: 1732164 --- config.yaml | 4 +-- hooks/nova_cc_context.py | 47 ++++++++++++++++++++++++++++- unit_tests/test_nova_cc_contexts.py | 17 +++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/config.yaml b/config.yaml index 94e017b2..c21c557e 100644 --- a/config.yaml +++ b/config.yaml @@ -258,10 +258,10 @@ options: all units on config change. scheduler-default-filters: type: string - default: "RetryFilter,AvailabilityZoneFilter,CoreFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,DifferentHostFilter,SameHostFilter" + default: description: | List of filter class names to use for filtering hosts when not specified in - the request. + the request. The default filters varies based on OpenStack release. pci-alias: type: string default: diff --git a/hooks/nova_cc_context.py b/hooks/nova_cc_context.py index a7c563d5..f9697e97 100644 --- a/hooks/nova_cc_context.py +++ b/hooks/nova_cc_context.py @@ -300,11 +300,56 @@ class IdentityServiceContext(ch_context.IdentityServiceContext): return ctxt +_base_enabled_filters = [ + "RetryFilter", + "AvailabilityZoneFilter", + "CoreFilter", + "RamFilter", + "DiskFilter", + "ComputeFilter", + "ComputeCapabilitiesFilter", + "ImagePropertiesFilter", + "ServerGroupAntiAffinityFilter", + "ServerGroupAffinityFilter", + "DifferentHostFilter", + "SameHostFilter", +] + +# NOTE: Core,Ram,Disk filters obsolete due +# placement API functionality +_pike_enabled_filters = [ + "RetryFilter", + "AvailabilityZoneFilter", + "ComputeFilter", + "ComputeCapabilitiesFilter", + "ImagePropertiesFilter", + "ServerGroupAntiAffinityFilter", + "ServerGroupAffinityFilter", + "DifferentHostFilter", + "SameHostFilter", +] + + +def default_enabled_filters(): + """ + Determine the list of default filters for scheduler use + + :returns: list of filters to use + :rtype: list of str + """ + os_rel = ch_utils.os_release('nova-common') + cmp_os_rel = ch_utils.CompareOpenStackReleases(os_rel) + if cmp_os_rel >= 'pike': + return _pike_enabled_filters + return _base_enabled_filters + + class NovaConfigContext(ch_context.WorkerConfigContext): def __call__(self): ctxt = super(NovaConfigContext, self).__call__() ctxt['scheduler_default_filters'] = ( - hookenv.config('scheduler-default-filters')) + hookenv.config('scheduler-default-filters') or + ','.join(default_enabled_filters())) if hookenv.config('pci-alias'): aliases = json.loads(hookenv.config('pci-alias')) if isinstance(aliases, list): diff --git a/unit_tests/test_nova_cc_contexts.py b/unit_tests/test_nova_cc_contexts.py index e206f174..95b3da53 100644 --- a/unit_tests/test_nova_cc_contexts.py +++ b/unit_tests/test_nova_cc_contexts.py @@ -45,6 +45,7 @@ class NovaComputeContextTests(CharmTestCase): self.relation_get.side_effect = self.test_relation.get self.config.side_effect = self.test_config.get self.log.side_effect = fake_log + self.os_release.return_value = 'icehouse' @mock.patch('charmhelpers.contrib.openstack.ip.resolve_address', lambda *args, **kwargs: None) @@ -330,6 +331,7 @@ class NovaComputeContextTests(CharmTestCase): mock_config.side_effect = self.test_config.get mock_config_ip.side_effect = self.test_config.get mock_unit_get.return_value = '127.0.0.1' + self.test_config.set('scheduler-default-filters', 'TestFilter') ctxt = context.NovaConfigContext()() self.assertEqual(ctxt['scheduler_default_filters'], self.config('scheduler-default-filters')) @@ -592,3 +594,18 @@ class NovaComputeContextTests(CharmTestCase): self.related_units.return_value = ['nova-cell-conductor/0'] ctxt = context.NovaCellV2Context()() self.assertEqual(ctxt, {}) + + def test_default_enabled_filters_icehouse(self): + self.os_release.return_value = 'icehouse' + self.assertEqual(context.default_enabled_filters(), + context._base_enabled_filters) + + def test_default_enabled_filters_pike(self): + self.os_release.return_value = 'pike' + self.assertEqual(context.default_enabled_filters(), + context._pike_enabled_filters) + + def test_default_enabled_filters_rocky(self): + self.os_release.return_value = 'rocky' + self.assertEqual(context.default_enabled_filters(), + context._pike_enabled_filters)