From f0965c955dba16afaf350e65de2db68dc2c35c50 Mon Sep 17 00:00:00 2001 From: Jamie Lennox Date: Thu, 14 Jan 2016 13:14:32 +1100 Subject: [PATCH] Split oslo_config and list all opts The intent of providing the list_auth_token_opts function was to provide the oslo_config sample config file generator a list of options to include in its sample files. However, services like zaqar have come to rely on the list_auth_token_opts to list all the options that may be consumed by auth_token middleware so that they can register them against a non-global oslo_config object. By removing deprecated options from the list_auth_token_opts we remove these options from the config objects that the services use, however by keeping them we will forever have deprecated options in sample config files. To split these two functionalities create a new function that lists the options available for sample config files and update the entrypoint to reflect this. This function is currently private because it should only need to be accessed via entrypoint. The old deprecated options are then added back to the original list_auth_token_opts function. Closes-Bug: #1533932 Change-Id: I2aae5483c9309ab75985298c8de5b6f24cbc0f0d --- keystonemiddleware/auth_token/_opts.py | 55 ++++++++++++++++++++ keystonemiddleware/opts.py | 13 +++-- keystonemiddleware/tests/unit/test_opts.py | 60 +++++++++++++++++++++- setup.cfg | 2 +- 4 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 keystonemiddleware/auth_token/_opts.py diff --git a/keystonemiddleware/auth_token/_opts.py b/keystonemiddleware/auth_token/_opts.py new file mode 100644 index 00000000..b1f57e98 --- /dev/null +++ b/keystonemiddleware/auth_token/_opts.py @@ -0,0 +1,55 @@ +# 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 copy + +from keystoneauth1 import loading + +import keystonemiddleware.auth_token +from keystonemiddleware.auth_token import _base + +auth_token_opts = [ + (_base.AUTHTOKEN_GROUP, + keystonemiddleware.auth_token._OPTS + + loading.get_auth_common_conf_options()) +] + +__all__ = ( + 'list_opts', +) + + +def list_opts(): + """Return a list of oslo_config options available in auth_token middleware. + + The returned list includes the non-deprecated oslo_config options which may + be registered at runtime by the project. The purpose of this is to allow + tools like the Oslo sample config file generator to discover the options + exposed to users by this middleware. + + Deprecated Options should not show up here so as to not be included in + sample configuration. + + Each element of the list is a tuple. The first element is the name of the + group under which the list of elements in the second element will be + registered. A group name of None corresponds to the [DEFAULT] group in + config files. + + This function is discoverable via the entry point + 'keystonemiddleware.auth_token' under the 'oslo.config.opts' namespace. + + :returns: a list of (group_name, opts) tuples + """ + auth_token_opts = (keystonemiddleware.auth_token._OPTS + + loading.get_auth_common_conf_options()) + + return [(_base.AUTHTOKEN_GROUP, copy.deepcopy(auth_token_opts))] diff --git a/keystonemiddleware/opts.py b/keystonemiddleware/opts.py index fad40e87..400ad769 100644 --- a/keystonemiddleware/opts.py +++ b/keystonemiddleware/opts.py @@ -21,11 +21,13 @@ import copy from keystoneauth1 import loading import keystonemiddleware.auth_token +from keystonemiddleware.auth_token import _auth from keystonemiddleware.auth_token import _base auth_token_opts = [ (_base.AUTHTOKEN_GROUP, keystonemiddleware.auth_token._OPTS + + _auth.OPTS + loading.get_auth_common_conf_options()) ] @@ -41,12 +43,13 @@ def list_auth_token_opts(): registered. A group name of None corresponds to the [DEFAULT] group in config files. - This function is also discoverable via the entry point - 'keystonemiddleware.auth_token' under the 'oslo.config.opts' - namespace. + NOTE: This function is no longer used for oslo_config sample generation. + Some services rely on this function for listing ALL (including deprecated) + options and registering them into their own config objects which we do not + want for sample config files. - The purpose of this is to allow tools like the Oslo sample config file - generator to discover the options exposed to users by this middleware. + See: :py:func:`keystonemiddleware.auth_token._opts.list_opts` for sample + config files. :returns: a list of (group_name, opts) tuples """ diff --git a/keystonemiddleware/tests/unit/test_opts.py b/keystonemiddleware/tests/unit/test_opts.py index 9cb2e846..9d9913e8 100644 --- a/keystonemiddleware/tests/unit/test_opts.py +++ b/keystonemiddleware/tests/unit/test_opts.py @@ -15,18 +15,74 @@ import stevedore from testtools import matchers -from keystonemiddleware import opts +from keystonemiddleware.auth_token import _opts as new_opts +from keystonemiddleware import opts as old_opts from keystonemiddleware.tests.unit import utils class OptsTestCase(utils.TestCase): + def test_original_list_all_options(self): + result_of_old_opts = old_opts.list_auth_token_opts() + self.assertThat(result_of_old_opts, matchers.HasLength(1)) + + for group in (g for (g, _l) in result_of_old_opts): + self.assertEqual('keystone_authtoken', group) + + # This is the original list that includes deprecated options + expected_opt_names = [ + 'auth_admin_prefix', + 'auth_host', + 'auth_port', + 'auth_protocol', + 'auth_uri', + 'identity_uri', + 'auth_version', + 'delay_auth_decision', + 'http_connect_timeout', + 'http_request_max_retries', + 'admin_token', + 'admin_user', + 'admin_password', + 'admin_tenant_name', + 'cache', + 'certfile', + 'keyfile', + 'cafile', + 'region_name', + 'insecure', + 'signing_dir', + 'memcached_servers', + 'token_cache_time', + 'revocation_cache_time', + 'memcache_security_strategy', + 'memcache_secret_key', + 'memcache_use_advanced_pool', + 'memcache_pool_dead_retry', + 'memcache_pool_maxsize', + 'memcache_pool_unused_timeout', + 'memcache_pool_conn_get_timeout', + 'memcache_pool_socket_timeout', + 'include_service_catalog', + 'enforce_token_bind', + 'check_revocations_for_cached', + 'hash_algorithms', + 'auth_type', + 'auth_section', + ] + opt_names = [o.name for (g, l) in result_of_old_opts for o in l] + self.assertThat(opt_names, matchers.HasLength(len(expected_opt_names))) + + for opt in opt_names: + self.assertIn(opt, expected_opt_names) + def _test_list_auth_token_opts(self, result): self.assertThat(result, matchers.HasLength(1)) for group in (g for (g, _l) in result): self.assertEqual('keystone_authtoken', group) + # This is the sample config generator list WITHOUT deprecations expected_opt_names = [ 'auth_uri', 'auth_version', @@ -65,7 +121,7 @@ class OptsTestCase(utils.TestCase): self.assertIn(opt, expected_opt_names) def test_list_auth_token_opts(self): - self._test_list_auth_token_opts(opts.list_auth_token_opts()) + self._test_list_auth_token_opts(new_opts.list_opts()) def test_entry_point(self): em = stevedore.ExtensionManager('oslo.config.opts', diff --git a/setup.cfg b/setup.cfg index 00f48603..ce15d2ed 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,7 +28,7 @@ setup-hooks = [entry_points] oslo.config.opts = - keystonemiddleware.auth_token = keystonemiddleware.opts:list_auth_token_opts + keystonemiddleware.auth_token = keystonemiddleware.auth_token._opts:list_opts paste.filter_factory = auth_token = keystonemiddleware.auth_token:filter_factory