Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-keystonemiddleware for 
openSUSE:Factory checked in at 2023-03-21 17:40:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-keystonemiddleware (Old)
 and      /work/SRC/openSUSE:Factory/.python-keystonemiddleware.new.31432 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-keystonemiddleware"

Tue Mar 21 17:40:53 2023 rev:15 rq:1073020 version:10.2.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-keystonemiddleware/python-keystonemiddleware.changes
      2022-08-11 18:31:58.090212523 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-keystonemiddleware.new.31432/python-keystonemiddleware.changes
   2023-03-21 17:40:53.565647955 +0100
@@ -1,0 +2,16 @@
+Mon Mar  6 15:55:47 UTC 2023 - [email protected]
+
+- update to version 10.2.0
+  - Update python testing as per zed cycle teting runtime
+  - Bump tox minversion to 3.18.0
+  - Fix logging notifier unit test
+  - setup.cfg: Replace dashes by underscores
+  - Remove translation sections from setup.cfg
+  - Update Python 3 job template
+  - Remove cache invalidation when using expired token
+  - OAuth2.0 Client Credentials Grant Flow Support
+  - Fix pep8 gate
+  - Remove references to 'sys.version_info'
+  - Imported Translations from Zanata
+
+-------------------------------------------------------------------

Old:
----
  keystonemiddleware-9.5.0.tar.gz

New:
----
  keystonemiddleware-10.2.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-keystonemiddleware.spec ++++++
--- /var/tmp/diff_new_pack.RXkUjb/_old  2023-03-21 17:40:54.233651150 +0100
+++ /var/tmp/diff_new_pack.RXkUjb/_new  2023-03-21 17:40:54.253651246 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-keystonemiddleware
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,13 +17,13 @@
 
 
 Name:           python-keystonemiddleware
-Version:        9.5.0
+Version:        10.2.0
 Release:        0
 Summary:        Middleware for OpenStack Identity
 License:        Apache-2.0
 Group:          Development/Languages/Python
 URL:            https://docs.openstack.org/keystonemiddleware
-Source0:        
https://files.pythonhosted.org/packages/source/k/keystonemiddleware/keystonemiddleware-9.5.0.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/source/k/keystonemiddleware/keystonemiddleware-10.2.0.tar.gz
 BuildRequires:  openstack-macros
 BuildRequires:  python3-WebOb >= 1.7.1
 BuildRequires:  python3-WebTest
@@ -91,7 +91,7 @@
 Documentation for Middleware for OpenStack Identity.
 
 %prep
-%autosetup -p1 -n keystonemiddleware-9.5.0
+%autosetup -p1 -n keystonemiddleware-10.2.0
 %py_req_cleanup
 
 %build
@@ -108,7 +108,7 @@
 
 %check
 rm -v keystonemiddleware/tests/unit/audit/test_logging_notifier.py
-python3 -m stestr.cli run
+%{openstack_stestr_run}
 
 %files -n python3-keystonemiddleware
 %license LICENSE

++++++ keystonemiddleware-9.5.0.tar.gz -> keystonemiddleware-10.2.0.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/.zuul.yaml 
new/keystonemiddleware-10.2.0/.zuul.yaml
--- old/keystonemiddleware-9.5.0/.zuul.yaml     2022-05-20 14:32:24.000000000 
+0200
+++ new/keystonemiddleware-10.2.0/.zuul.yaml    2023-01-06 17:20:38.000000000 
+0100
@@ -1,7 +1,7 @@
 - project:
     templates:
       - openstack-cover-jobs
-      - openstack-python3-ussuri-jobs
+      - openstack-python3-zed-jobs
       - publish-openstack-docs-pti
       - check-requirements
       - lib-forward-testing-python3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/AUTHORS 
new/keystonemiddleware-10.2.0/AUTHORS
--- old/keystonemiddleware-9.5.0/AUTHORS        2022-05-20 14:33:03.000000000 
+0200
+++ new/keystonemiddleware-10.2.0/AUTHORS       2023-01-06 17:21:05.000000000 
+0100
@@ -14,6 +14,7 @@
 Anthony Young <[email protected]>
 Artem Vasilyev <[email protected]>
 Arun Kant <[email protected]>
+Ayumu Ueha <[email protected]>
 Ben Nemec <[email protected]>
 Bernhard M. Wiedemann <[email protected]>
 Boris Bobrov <[email protected]>
@@ -47,6 +48,7 @@
 Daniel Gollub <[email protected]>
 Davanum Srinivas <[email protected]>
 Dave Chen <[email protected]>
+Dave Wilde <[email protected]>
 David Höppner <[email protected]>
 David Olorundare <[email protected]>
 David Stanek <[email protected]>
@@ -93,6 +95,7 @@
 Joe Heck <[email protected]>
 Joel Friedly <[email protected]>
 John Dennis <[email protected]>
+Jorge Merlino <[email protected]>
 Julien Danjou <[email protected]>
 Kevin Benton <[email protected]>
 Kevin L. Mitchell <[email protected]>
@@ -175,6 +178,7 @@
 Yaguang Tang <[email protected]>
 Yang Youseok <[email protected]>
 Yatin Kumbhare <[email protected]>
+Yi Feng <[email protected]>
 Zhenguo Niu <[email protected]>
 Zhi Yan Liu <[email protected]>
 ZhiQiang Fan <[email protected]>
@@ -185,6 +189,7 @@
 ankita_wagh <[email protected]>
 ayoung <[email protected]>
 bhagyashris <[email protected]>
+dengzhaosen <[email protected]>
 gordon chung <[email protected]>
 guang-yee <[email protected]>
 guang-yee <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/ChangeLog 
new/keystonemiddleware-10.2.0/ChangeLog
--- old/keystonemiddleware-9.5.0/ChangeLog      2022-05-20 14:33:02.000000000 
+0200
+++ new/keystonemiddleware-10.2.0/ChangeLog     2023-01-06 17:21:04.000000000 
+0100
@@ -1,9 +1,35 @@
 CHANGES
 =======
 
+10.2.0
+------
+
+* Remove cache invalidation when using expired token
+* Fix pep8 gate
+* Imported Translations from Zanata
+
+10.1.0
+------
+
+* OAuth2.0 Client Credentials Grant Flow Support
+
+10.0.1
+------
+
+* Fix logging notifier unit test
+* Bump tox minversion to 3.18.0
+* Imported Translations from Zanata
+
+10.0.0
+------
+
+* setup.cfg: Replace dashes by underscores
+* Update python testing as per zed cycle teting runtime
+
 9.5.0
 -----
 
+* Update Python 3 job template
 * Drop lower-constraints.txt and its testing
 * Update master for stable/yoga
 
@@ -15,6 +41,7 @@
 * Update master for stable/wallaby
 * Update master for stable/victoria
 * Add oslo.config.opts entrypoint for audit middleware options
+* Remove references to 'sys.version\_info'
 
 9.3.0
 -----
@@ -34,6 +61,7 @@
 * Imported Translations from Zanata
 * Change the default Identity endpoint to internal
 * Switch to newer openstackdocstheme and reno versions
+* Remove translation sections from setup.cfg
 * Use unittest.mock instead of third party mock
 * Update master for stable/ussuri
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/PKG-INFO 
new/keystonemiddleware-10.2.0/PKG-INFO
--- old/keystonemiddleware-9.5.0/PKG-INFO       2022-05-20 14:33:03.178202600 
+0200
+++ new/keystonemiddleware-10.2.0/PKG-INFO      2023-01-06 17:21:05.225156300 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: keystonemiddleware
-Version: 9.5.0
+Version: 10.2.0
 Summary: Middleware for OpenStack Identity
 Home-page: https://docs.openstack.org/keystonemiddleware/latest/
 Author: OpenStack
@@ -54,7 +54,9 @@
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Requires-Python: >=3.8
 Provides-Extra: audit_notifications
 Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/babel.cfg 
new/keystonemiddleware-10.2.0/babel.cfg
--- old/keystonemiddleware-9.5.0/babel.cfg      2022-05-20 14:32:24.000000000 
+0200
+++ new/keystonemiddleware-10.2.0/babel.cfg     1970-01-01 01:00:00.000000000 
+0100
@@ -1,3 +0,0 @@
-[python: **.py]
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware/auth_token/__init__.py 
new/keystonemiddleware-10.2.0/keystonemiddleware/auth_token/__init__.py
--- old/keystonemiddleware-9.5.0/keystonemiddleware/auth_token/__init__.py      
2022-05-20 14:32:24.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware/auth_token/__init__.py     
2023-01-06 17:20:38.000000000 +0100
@@ -245,7 +245,6 @@
 
 
 _LOG = logging.getLogger(__name__)
-_CACHE_INVALID_INDICATOR = 'invalid'
 oslo_cache.configure(cfg.CONF)
 
 AUTH_TOKEN_OPTS = [
@@ -736,10 +735,6 @@
             cached = self._token_cache.get(token)
 
             if cached:
-                if cached == _CACHE_INVALID_INDICATOR:
-                    self.log.debug('Cached token is marked unauthorized')
-                    raise ksm_exceptions.InvalidToken()
-
                 # NOTE(jamielennox): Cached values used to be stored as a tuple
                 # of data and expiry time. They no longer are but we have to
                 # allow some time to transition the old format so if it's a
@@ -769,7 +764,6 @@
                 'The Keystone service is temporarily unavailable.')
         except ksm_exceptions.InvalidToken:
             self.log.debug('Token validation failure.', exc_info=True)
-            self._token_cache.set(token, _CACHE_INVALID_INDICATOR)
             self.log.warning('Authorization failed for token')
             raise
         except ksa_exceptions.EndpointNotFound:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware/oauth2_token.py 
new/keystonemiddleware-10.2.0/keystonemiddleware/oauth2_token.py
--- old/keystonemiddleware-9.5.0/keystonemiddleware/oauth2_token.py     
1970-01-01 01:00:00.000000000 +0100
+++ new/keystonemiddleware-10.2.0/keystonemiddleware/oauth2_token.py    
2023-01-06 17:20:38.000000000 +0100
@@ -0,0 +1,103 @@
+# Copyright 2022 OpenStack Foundation
+#
+# 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 webob
+
+from oslo_log import log as logging
+from oslo_serialization import jsonutils
+
+from keystonemiddleware.auth_token import _user_plugin
+from keystonemiddleware.auth_token import AuthProtocol
+from keystonemiddleware import exceptions
+from keystonemiddleware.i18n import _
+
+
+_LOG = logging.getLogger(__name__)
+
+
+class OAuth2Protocol(AuthProtocol):
+    """Middleware that handles OAuth2.0 client credentials authentication."""
+
+    def __init__(self, app, conf):
+        log = logging.getLogger(conf.get('log_name', __name__))
+        log.info('Starting Keystone oauth2_token middleware')
+        super(OAuth2Protocol, self).__init__(app, conf)
+
+    def _is_valid_access_token(self, request):
+        """Check if the request contains an OAuth2.0 access token.
+
+        :param request: Incoming request
+        :type request: _request.AuthTokenRequest
+        """
+        access_token = None
+        if (request.authorization and
+                request.authorization.authtype == 'Bearer'):
+            access_token = request.authorization.params
+
+        if access_token:
+            try:
+                token_data, user_auth_ref = self._do_fetch_token(
+                    access_token, allow_expired=False)
+                self._validate_token(user_auth_ref,
+                                     allow_expired=False)
+                token = token_data['token']
+                self.validate_allowed_request(request, token)
+                self._confirm_token_bind(user_auth_ref, request)
+                request.token_info = token_data
+                request.token_auth = _user_plugin.UserAuthPlugin(
+                    user_auth_ref, None)
+                return True
+            except exceptions.KeystoneMiddlewareException as err:
+                _LOG.info('Invalid OAuth2.0 access token: %s' % str(err))
+        return False
+
+    def process_request(self, request):
+        """Process request.
+
+        :param request: Incoming request
+        :type request: _request.AuthTokenRequest
+        """
+        request.remove_auth_headers()
+        self._token_cache.initialize(request.environ)
+        if (not self._is_valid_access_token(request)
+                or "keystone.token_info" not in request.environ
+                or "token" not in request.environ["keystone.token_info"]):
+            _LOG.info('Rejecting request')
+            message = _('The request you have made requires authentication.')
+            body = {'error': {
+                'code': 401,
+                'title': 'Unauthorized',
+                'message': message,
+            }}
+            raise webob.exc.HTTPUnauthorized(
+                body=jsonutils.dumps(body),
+                headers=self._reject_auth_headers,
+                charset='UTF-8',
+                content_type='application/json')
+
+        request.set_user_headers(request.token_auth.user)
+        request.set_service_catalog_headers(request.token_auth.user)
+        request.token_auth._auth = self._auth
+        request.token_auth._session = self._session
+
+
+def filter_factory(global_conf, **local_conf):
+    """Return a WSGI filter app for use with paste.deploy."""
+    conf = global_conf.copy()
+    conf.update(local_conf)
+
+    def auth_filter(app):
+        return OAuth2Protocol(app, conf)
+
+    return auth_filter
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/audit/test_logging_notifier.py
 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/audit/test_logging_notifier.py
--- 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/audit/test_logging_notifier.py
   2022-05-20 14:32:24.000000000 +0200
+++ 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/audit/test_logging_notifier.py
  2023-01-06 17:20:38.000000000 +0100
@@ -27,6 +27,8 @@
         super(TestLoggingNotifier, self).setUp()
 
     def test_api_request_no_messaging(self):
+        self.cfg.config(use_oslo_messaging=False,
+                        group='audit_middleware_notifications')
         app = self.create_simple_app()
 
         with mock.patch('keystonemiddleware.audit._LOG.info') as log:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/auth_token/test_auth_token_middleware.py
 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/auth_token/test_auth_token_middleware.py
--- 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/auth_token/test_auth_token_middleware.py
 2022-05-20 14:32:24.000000000 +0200
+++ 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/auth_token/test_auth_token_middleware.py
        2023-01-06 17:20:38.000000000 +0100
@@ -595,25 +595,6 @@
         token = 'invalid-token'
         self.call_middleware(headers={'X-Auth-Token': token},
                              expected_status=401)
-        self.assertEqual(auth_token._CACHE_INVALID_INDICATOR,
-                         self._get_cached_token(token))
-
-    def test_memcache_hit_invalid_token(self):
-        token = 'invalid-token'
-        invalid_uri = '%s/v3/tokens/invalid-token' % BASE_URI
-        self.requests_mock.get(invalid_uri, status_code=404)
-
-        # Call once to cache token's invalid state; verify it cached as such
-        self.call_middleware(headers={'X-Auth-Token': token},
-                             expected_status=401)
-        self.assertEqual(auth_token._CACHE_INVALID_INDICATOR,
-                         self._get_cached_token(token))
-
-        # Call again for a cache hit; verify it detected as cached and invalid
-        self.call_middleware(headers={'X-Auth-Token': token},
-                             expected_status=401)
-        self.assertIn('Cached token is marked unauthorized',
-                      self.logger.output)
 
     def test_memcache_set_expired(self, extra_conf={}, extra_environ={}):
         token_cache_time = 10
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/test_oauth2_token_middleware.py
 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/test_oauth2_token_middleware.py
--- 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/test_oauth2_token_middleware.py
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/test_oauth2_token_middleware.py
 2023-01-06 17:20:38.000000000 +0100
@@ -0,0 +1,298 @@
+# Copyright 2022 OpenStack Foundation
+#
+# 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 fixtures
+import logging
+import six
+import testresources
+import uuid
+import webob.dec
+
+from oslo_config import cfg
+from six.moves import http_client
+
+from keystoneauth1 import exceptions as ksa_exceptions
+
+from keystonemiddleware import oauth2_token
+from keystonemiddleware.tests.unit.auth_token import base
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import BASE_URI
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import ENDPOINT_NOT_FOUND_TOKEN
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import ERROR_TOKEN
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import FAKE_ADMIN_TOKEN
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import FAKE_ADMIN_TOKEN_ID
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware\
+    import FakeApp
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import FakeOsloCache
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import request_timeout_response
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import TIMEOUT_TOKEN
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import v3FakeApp
+from keystonemiddleware.tests.unit.auth_token.test_auth_token_middleware \
+    import VERSION_LIST_v3
+from keystonemiddleware.tests.unit import client_fixtures
+from keystonemiddleware.tests.unit import utils
+
+
+def get_authorization_header(token):
+    return {'Authorization': f'Bearer {token}'}
+
+
+class FakeOauth2TokenV3App(v3FakeApp):
+
+    @webob.dec.wsgify
+    def __call__(self, req):
+        resp = webob.Response()
+        resp.body = FakeApp.SUCCESS
+        return resp
+
+
+class BaseOauth2TokenMiddlewareTest(base.BaseAuthTokenTestCase):
+
+    def setUp(self, expected_env=None, auth_version=None, fake_app=None):
+        cfg.CONF.clear()
+        super(BaseOauth2TokenMiddlewareTest, self).setUp()
+
+        self.logger = self.useFixture(fixtures.FakeLogger(level=logging.DEBUG))
+        self.useFixture(fixtures.MockPatchObject(oauth2_token.OAuth2Protocol,
+                                                 '_create_oslo_cache',
+                                                 return_value=FakeOsloCache))
+        self.expected_env = expected_env or dict()
+        self.fake_app = fake_app or FakeApp
+        self.middleware = None
+
+        self.conf = {
+            'identity_uri': 'https://keystone.example.com:1234/testadmin/',
+            'auth_version': auth_version,
+            'www_authenticate_uri': 'https://keystone.example.com:1234',
+            'admin_user': uuid.uuid4().hex,
+        }
+        self.auth_version = auth_version
+
+    def call_middleware(self, **kwargs):
+        return self.call(self.middleware, **kwargs)
+
+    def set_middleware(self, expected_env=None, conf=None):
+        """Configure the class ready to call the oauth2_token middleware.
+
+        Set up the various fake items needed to run the middleware.
+        Individual tests that need to further refine these can call this
+        function to override the class defaults.
+
+        """
+        if conf:
+            self.conf.update(conf)
+
+        if expected_env:
+            self.expected_env.update(expected_env)
+        self.middleware = oauth2_token.OAuth2Protocol(
+            self.fake_app(self.expected_env), self.conf)
+
+    def call(self, middleware, method='GET', path='/', headers=None,
+             expected_status=http_client.OK,
+             expected_body_string=None):
+        req = webob.Request.blank(path)
+        req.method = method
+
+        for k, v in (headers or {}).items():
+            req.headers[k] = v
+
+        resp = req.get_response(middleware)
+        self.assertEqual(expected_status, resp.status_int)
+        if expected_body_string:
+            self.assertIn(expected_body_string, six.text_type(resp.body))
+        resp.request = req
+        return resp
+
+
+class Oauth2TokenMiddlewareTest(BaseOauth2TokenMiddlewareTest,
+                                testresources.ResourcedTestCase):
+
+    resources = [('examples', client_fixtures.EXAMPLES_RESOURCE)]
+
+    def setUp(self):
+        super(Oauth2TokenMiddlewareTest, self).setUp(
+            auth_version='v3.0',
+            fake_app=FakeOauth2TokenV3App)
+        self.requests_mock.post('%s/v2.0/tokens' % BASE_URI,
+                                text=FAKE_ADMIN_TOKEN)
+        self.requests_mock.get(BASE_URI,
+                               json=VERSION_LIST_v3,
+                               status_code=300)
+        self.requests_mock.get('%s/v3/auth/tokens' % BASE_URI,
+                               text=self.token_response,
+                               headers={'X-Subject-Token': uuid.uuid4().hex})
+        self.set_middleware()
+
+    def token_response(self, request, context):
+        auth_id = request.headers.get('X-Auth-Token')
+        token_id = request.headers.get('X-Subject-Token')
+        self.assertEqual(auth_id, FAKE_ADMIN_TOKEN_ID)
+
+        if token_id == ERROR_TOKEN:
+            msg = "Network connection refused."
+            raise ksa_exceptions.ConnectFailure(msg)
+        if token_id == ENDPOINT_NOT_FOUND_TOKEN:
+            raise ksa_exceptions.EndpointNotFound()
+        if token_id == TIMEOUT_TOKEN:
+            request_timeout_response(request, context)
+
+        try:
+            response = self.examples.JSON_TOKEN_RESPONSES[token_id]
+        except KeyError:
+            response = ""
+            context.status_code = 404
+
+        return response
+
+    def test_app_cred_token_without_access_rules(self):
+        self.set_middleware(conf={'service_type': 'compute'})
+        token = self.examples.v3_APP_CRED_TOKEN
+        token_data = self.examples.TOKEN_RESPONSES[token]
+        resp = self.call_middleware(headers=get_authorization_header(token))
+        self.assertEqual(FakeApp.SUCCESS, resp.body)
+        token_auth = resp.request.environ['keystone.token_auth']
+        self.assertEqual(token_data.application_credential_id,
+                         token_auth.user.application_credential_id)
+
+    def test_app_cred_access_rules_token(self):
+        self.set_middleware(conf={'service_type': 'compute'})
+        token = self.examples.v3_APP_CRED_ACCESS_RULES
+        token_data = self.examples.TOKEN_RESPONSES[token]
+        resp = self.call_middleware(headers=get_authorization_header(token),
+                                    expected_status=200,
+                                    method='GET', path='/v2.1/servers')
+        token_auth = resp.request.environ['keystone.token_auth']
+        self.assertEqual(token_data.application_credential_id,
+                         token_auth.user.application_credential_id)
+        self.assertEqual(token_data.application_credential_access_rules,
+                         token_auth.user.application_credential_access_rules)
+        resp = self.call_middleware(headers=get_authorization_header(token),
+                                    expected_status=401,
+                                    method='GET',
+                                    path='/v2.1/servers/someuuid')
+        self.assertEqual(token_data.application_credential_id,
+                         token_auth.user.application_credential_id)
+        self.assertEqual(token_data.application_credential_access_rules,
+                         token_auth.user.application_credential_access_rules)
+
+    def test_app_cred_no_access_rules_token(self):
+        self.set_middleware(conf={'service_type': 'compute'})
+        token = self.examples.v3_APP_CRED_EMPTY_ACCESS_RULES
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v2.1/servers')
+
+    def test_app_cred_matching_rules(self):
+        self.set_middleware(conf={'service_type': 'compute'})
+        token = self.examples.v3_APP_CRED_MATCHING_RULES
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=200,
+                             method='GET', path='/v2.1/servers/foobar')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v2.1/servers/foobar/barfoo')
+        self.set_middleware(conf={'service_type': 'image'})
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=200,
+                             method='GET', path='/v2/images/foobar')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v2/images/foobar/barfoo')
+        self.set_middleware(conf={'service_type': 'identity'})
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=200,
+                             method='GET',
+                             path='/v3/projects/123/users/456/roles/member')
+        self.set_middleware(conf={'service_type': 'block-storage'})
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=200,
+                             method='GET', path='/v3/123/types/456')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v3/123/types')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v2/123/types/456')
+        self.set_middleware(conf={'service_type': 'object-store'})
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=200,
+                             method='GET', path='/v1/1/2/3')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v1/1/2')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/v2/1/2')
+        self.call_middleware(headers=get_authorization_header(token),
+                             expected_status=401,
+                             method='GET', path='/info')
+
+    def test_request_no_token(self):
+        resp = self.call_middleware(expected_status=401)
+        self.assertEqual('Keystone uri="https://keystone.example.com:1234";',
+                         resp.headers['WWW-Authenticate'])
+
+    def test_request_blank_token(self):
+        resp = self.call_middleware(headers=get_authorization_header(''),
+                                    expected_status=401)
+        self.assertEqual('Keystone uri="https://keystone.example.com:1234";',
+                         resp.headers['WWW-Authenticate'])
+
+    def test_request_not_app_cred_token(self):
+        self.call_middleware(
+            headers=get_authorization_header(
+                self.examples.v3_UUID_TOKEN_DEFAULT),
+            expected_status=200)
+
+    def _get_cached_token(self, token):
+        return self.middleware._token_cache.get(token)
+
+    def assert_valid_last_url(self, token_id):
+        self.assertLastPath('/v3/auth/tokens')
+
+    def assertLastPath(self, path):
+        if path:
+            self.assertEqual(BASE_URI + path,
+                             self.requests_mock.last_request.url)
+        else:
+            self.assertIsNone(self.requests_mock.last_request)
+
+    def test_http_error_not_cached_token(self):
+        """Test to don't cache token as invalid on network errors.
+
+        We use UUID tokens since they are the easiest one to reach
+        get_http_connection.
+        """
+        self.set_middleware(conf={'http_request_max_retries': '0'})
+        self.call_middleware(headers=get_authorization_header(ERROR_TOKEN),
+                             expected_status=503)
+        self.assertIsNone(self._get_cached_token(ERROR_TOKEN))
+        self.assert_valid_last_url(ERROR_TOKEN)
+
+
+class FilterFactoryTest(utils.BaseTestCase):
+
+    def test_filter_factory(self):
+        conf = {}
+        auth_filter = oauth2_token.filter_factory(conf)
+        m = auth_filter(FakeOauth2TokenV3App())
+        self.assertIsInstance(m, oauth2_token.OAuth2Protocol)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/utils.py 
new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/utils.py
--- old/keystonemiddleware-9.5.0/keystonemiddleware/tests/unit/utils.py 
2022-05-20 14:32:24.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware/tests/unit/utils.py        
2023-01-06 17:20:38.000000000 +0100
@@ -61,24 +61,6 @@
         super(TestCase, self).tearDown()
 
 
-if tuple(sys.version_info)[0:2] < (2, 7):
-
-    def assertDictEqual(self, d1, d2, msg=None):
-        # Simple version taken from 2.7
-        self.assertIsInstance(d1, dict,
-                              'First argument is not a dictionary')
-        self.assertIsInstance(d2, dict,
-                              'Second argument is not a dictionary')
-        if d1 != d2:
-            if msg:
-                self.fail(msg)
-            else:
-                standardMsg = '%r != %r' % (d1, d2)
-                self.fail(standardMsg)
-
-    TestCase.assertDictEqual = assertDictEqual
-
-
 class MiddlewareTestCase(BaseTestCase):
 
     def create_middleware(self, cb, **kwargs):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/PKG-INFO 
new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/PKG-INFO
--- old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/PKG-INFO   
2022-05-20 14:33:03.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/PKG-INFO  
2023-01-06 17:21:05.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: keystonemiddleware
-Version: 9.5.0
+Version: 10.2.0
 Summary: Middleware for OpenStack Identity
 Home-page: https://docs.openstack.org/keystonemiddleware/latest/
 Author: OpenStack
@@ -54,7 +54,9 @@
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3 :: Only
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Requires-Python: >=3.8
 Provides-Extra: audit_notifications
 Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/SOURCES.txt 
new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/SOURCES.txt
--- old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/SOURCES.txt        
2022-05-20 14:33:03.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/SOURCES.txt       
2023-01-06 17:21:05.000000000 +0100
@@ -7,7 +7,6 @@
 HACKING.rst
 LICENSE
 README.rst
-babel.cfg
 requirements.txt
 setup.cfg
 setup.py
@@ -32,6 +31,7 @@
 keystonemiddleware/exceptions.py
 keystonemiddleware/fixture.py
 keystonemiddleware/i18n.py
+keystonemiddleware/oauth2_token.py
 keystonemiddleware/opts.py
 keystonemiddleware/s3_token.py
 keystonemiddleware.egg-info/PKG-INFO
@@ -69,6 +69,7 @@
 keystonemiddleware/tests/unit/test_ec2_token_middleware.py
 keystonemiddleware/tests/unit/test_entry_points.py
 keystonemiddleware/tests/unit/test_fixtures.py
+keystonemiddleware/tests/unit/test_oauth2_token_middleware.py
 keystonemiddleware/tests/unit/test_opts.py
 keystonemiddleware/tests/unit/test_s3_token_middleware.py
 keystonemiddleware/tests/unit/utils.py
@@ -92,6 +93,7 @@
 releasenotes/notes/.placeholder
 releasenotes/notes/allow-expired-5ddbabcffc5678af.yaml
 
releasenotes/notes/authprotocol-accepts-oslo-config-config-a37212b60f58e154.yaml
+releasenotes/notes/bp-oauth2-client-credentials-ext-19a40c655ee43f57.yaml
 releasenotes/notes/bp-whitelist-extension-for-app-creds-badf088c8ad584bb.yaml
 releasenotes/notes/bug-1490804-87c0ff8e764945c1.yaml
 releasenotes/notes/bug-1544840-a534127f8663e40f.yaml
@@ -118,6 +120,7 @@
 releasenotes/notes/deprecate-caching-tokens-in-process-a412b0f1dea84cb9.yaml
 
releasenotes/notes/deprecate-eventlet-unsafe-memcacheclientpool-f8b4a6733513d73e.yaml
 releasenotes/notes/drop-py-2-7-6655f421a9cac0a2.yaml
+releasenotes/notes/drop-python-3-6-and-3-7-c407d5898c5eafec.yaml
 releasenotes/notes/ec2-v2-removal-6a886210cbc9d3e9.yaml
 releasenotes/notes/fix-audit-no-service-endpoint-ports-72b2009d631dcf19.yaml
 releasenotes/notes/interface-option-ed551d2a3162668d.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/entry_points.txt 
new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/entry_points.txt
--- old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/entry_points.txt   
2022-05-20 14:33:03.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/entry_points.txt  
2023-01-06 17:21:05.000000000 +0100
@@ -6,5 +6,6 @@
 audit = keystonemiddleware.audit:filter_factory
 auth_token = keystonemiddleware.auth_token:filter_factory
 ec2_token = keystonemiddleware.ec2_token:filter_factory
+oauth2_token = keystonemiddleware.oauth2_token:filter_factory
 s3_token = keystonemiddleware.s3_token:filter_factory
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/pbr.json 
new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/pbr.json
--- old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/pbr.json   
2022-05-20 14:33:03.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/pbr.json  
2023-01-06 17:21:05.000000000 +0100
@@ -1 +1 @@
-{"git_version": "2558084", "is_release": true}
\ No newline at end of file
+{"git_version": "e05466c", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/requires.txt 
new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/requires.txt
--- old/keystonemiddleware-9.5.0/keystonemiddleware.egg-info/requires.txt       
2022-05-20 14:33:03.000000000 +0200
+++ new/keystonemiddleware-10.2.0/keystonemiddleware.egg-info/requires.txt      
2023-01-06 17:21:05.000000000 +0100
@@ -22,10 +22,11 @@
 coverage!=4.4,>=4.0
 cryptography>=3.0
 fixtures>=3.0.0
-flake8-docstrings==0.2.1.post1
+flake8-docstrings==1.6.0
 hacking<4.0.0,>=3.0
 oslo.messaging>=5.29.0
 oslotest>=3.2.0
+pep8==1.7.1
 python-memcached>=1.59
 requests-mock>=1.2.0
 stestr>=2.0.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/releasenotes/notes/bp-oauth2-client-credentials-ext-19a40c655ee43f57.yaml
 
new/keystonemiddleware-10.2.0/releasenotes/notes/bp-oauth2-client-credentials-ext-19a40c655ee43f57.yaml
--- 
old/keystonemiddleware-9.5.0/releasenotes/notes/bp-oauth2-client-credentials-ext-19a40c655ee43f57.yaml
      1970-01-01 01:00:00.000000000 +0100
+++ 
new/keystonemiddleware-10.2.0/releasenotes/notes/bp-oauth2-client-credentials-ext-19a40c655ee43f57.yaml
     2023-01-06 17:20:38.000000000 +0100
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    [`blueprint oauth2-client-credentials-ext 
<https://blueprints.launchpad.net/keystone/+spec/oauth2-client-credentials-ext>`_]
+    The oauth2_token filter has been added for accepting or denying incoming
+    requests containing OAuth2.0 client credentials access tokens passed via
+    the Authorization headers as bearer tokens.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/releasenotes/notes/drop-python-3-6-and-3-7-c407d5898c5eafec.yaml
 
new/keystonemiddleware-10.2.0/releasenotes/notes/drop-python-3-6-and-3-7-c407d5898c5eafec.yaml
--- 
old/keystonemiddleware-9.5.0/releasenotes/notes/drop-python-3-6-and-3-7-c407d5898c5eafec.yaml
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/keystonemiddleware-10.2.0/releasenotes/notes/drop-python-3-6-and-3-7-c407d5898c5eafec.yaml
      2023-01-06 17:20:38.000000000 +0100
@@ -0,0 +1,5 @@
+---
+upgrade:
+  - |
+    Python 3.6 & 3.7 support has been dropped. The minimum version of Python 
now
+    supported is Python 3.8.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/keystonemiddleware-9.5.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
 
new/keystonemiddleware-10.2.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
--- 
old/keystonemiddleware-9.5.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
   2022-05-20 14:32:24.000000000 +0200
+++ 
new/keystonemiddleware-10.2.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
  2023-01-06 17:20:38.000000000 +0100
@@ -2,21 +2,28 @@
 # Andi Chandler <[email protected]>, 2018. #zanata
 # Andi Chandler <[email protected]>, 2019. #zanata
 # Andi Chandler <[email protected]>, 2020. #zanata
+# Andi Chandler <[email protected]>, 2022. #zanata
 msgid ""
 msgstr ""
 "Project-Id-Version: keystonemiddleware\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-03-02 18:48+0000\n"
+"POT-Creation-Date: 2022-08-26 17:13+0000\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2020-10-28 02:17+0000\n"
+"PO-Revision-Date: 2022-09-05 10:38+0000\n"
 "Last-Translator: Andi Chandler <[email protected]>\n"
 "Language-Team: English (United Kingdom)\n"
 "Language: en_GB\n"
 "X-Generator: Zanata 4.3.3\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
+msgid "10.0.0"
+msgstr "10.0.0"
+
+msgid "10.0.0-3"
+msgstr "10.0.0-3"
+
 msgid "4.1.0"
 msgstr "4.1.0"
 
@@ -92,6 +99,12 @@
 msgid "9.0.0"
 msgstr "9.0.0"
 
+msgid "9.1.0"
+msgstr "9.1.0"
+
+msgid "9.3.0"
+msgstr "9.3.0"
+
 msgid ""
 "A new configuration option for the s3token middleware called auth_uri can be "
 "used to set the URI to be used for authentication. This replaces auth_host, "
@@ -155,6 +168,15 @@
 "option should be set to ``True`` as soon as possible. The option will "
 "default to ``True`` in a future release."
 
+msgid ""
+"It is recommended that the ``memcache_use_advanced_pool`` option is set to "
+"``True`` in the ``keystone_authtoken`` configuration section of the various "
+"services (e.g. nova, glance, ...) when memcached is used for token cache."
+msgstr ""
+"It is recommended that the ``memcache_use_advanced_pool`` option is set to "
+"``True`` in the ``keystone_authtoken`` configuration section of the various "
+"services (e.g. nova, glance, ...) when Memcached is used for token cache."
+
 msgid "Mitaka Series Release Notes"
 msgstr "Mitaka Series Release Notes"
 
@@ -185,6 +207,13 @@
 "support Python 2.7 is OpenStack Train. The minimum version of Python now "
 "supported is Python 3.6."
 
+msgid ""
+"Python 3.6 & 3.7 support has been dropped. The minimum version of Python now "
+"supported is Python 3.8."
+msgstr ""
+"Python 3.6 & 3.7 support has been dropped. The minimum version of Python now "
+"supported is Python 3.8."
+
 msgid "Queens Series Release Notes"
 msgstr "Queens Series Release Notes"
 
@@ -226,6 +255,17 @@
 "enforce this behaviour. This will become the default setting in future "
 "releases."
 
+msgid ""
+"Since the removal of the Identity API v2 Keystone no longer has any special "
+"functionality that requires using the admin endpoint for it. So this release "
+"changes the default endpoint being used from ``admin`` to ``internal``, "
+"allowing deployments to work without an admin endpoint."
+msgstr ""
+"Since the removal of the Identity API v2 Keystone no longer has any special "
+"functionality that requires using the admin endpoint for it. So this release "
+"changes the default endpoint being used from ``admin`` to ``internal``, "
+"allowing deployments to work without an admin endpoint."
+
 msgid "Stein Series Release Notes"
 msgstr "Stein Series Release Notes"
 
@@ -276,6 +316,21 @@
 msgid "Ussuri Series Release Notes"
 msgstr "Ussuri Series Release Notes"
 
+msgid "Victoria Series Release Notes"
+msgstr "Victoria Series Release Notes"
+
+msgid "Wallaby Series Release Notes"
+msgstr "Wallaby Series Release Notes"
+
+msgid ""
+"We no longer recommend using the eventlet unsafe keystonemiddleware's "
+"memcacheclientpool. This implementation may result in growing connections to "
+"memcached."
+msgstr ""
+"We no longer recommend using the eventlet unsafe keystonemiddleware's "
+"memcacheclientpool. This implementation may result in growing connections to "
+"Memcached."
+
 msgid ""
 "When ``delay_auth_decision`` is enabled and a Keystone failure prevents a "
 "final decision about whether a token is valid or invalid, it will be marked "
@@ -316,6 +371,25 @@
 "removal in keystonemiddleware 5.0.0 or in the `O` development cycle, "
 "whichever is later."
 
+msgid "Xena Series Release Notes"
+msgstr "Xena Series Release Notes"
+
+msgid "Yoga Series Release Notes"
+msgstr "Yoga Series Release Notes"
+
+msgid ""
+"[`blueprint oauth2-client-credentials-ext <https://blueprints.launchpad.net/";
+"keystone/+spec/oauth2-client-credentials-ext>`_] The oauth2_token filter has "
+"been added for accepting or denying incoming requests containing OAuth2.0 "
+"client credentials access tokens passed via the Authorization headers as "
+"bearer tokens."
+msgstr ""
+"[`blueprint oauth2-client-credentials-ext <https://blueprints.launchpad.net/";
+"keystone/+spec/oauth2-client-credentials-ext>`_] The oauth2_token filter has "
+"been added for accepting or denying incoming requests containing OAuth2.0 "
+"client credentials access tokens passed via the Authorisation headers as "
+"bearer tokens."
+
 msgid ""
 "[`bug 1333951 <https://bugs.launchpad.net/keystonemiddleware/";
 "+bug/1333951>`_] Add support for parsing AWS v4 for ec2."
@@ -648,6 +722,15 @@
 "may be set to `public` or `internal` as needed."
 
 msgid ""
+"[`bug 1830002 <https://bugs.launchpad.net/keystonemiddleware/";
+"+bug/1830002>`_] The default Identity endpoint has been changed from "
+"``admin`` to ``internal``."
+msgstr ""
+"[`bug 1830002 <https://bugs.launchpad.net/keystonemiddleware/";
+"+bug/1830002>`_] The default Identity endpoint has been changed from "
+"``admin`` to ``internal``."
+
+msgid ""
 "[`bug 1845539 <https://bugs.launchpad.net/keystone/+bug/1845539>`_] The ec2 "
 "'url' config option now defaults to https://localhost:5000/v3/ec2tokens with "
 "the removal of ec2 v2.0 support. Keystonemiddleware no longer supports "
@@ -670,6 +753,29 @@
 "functionality has been removed."
 
 msgid ""
+"[`bug 1892852 <https://bugs.launchpad.net/keystonemiddleware/";
+"+bug/1892852>`_] [`bug 1888394 <https://bugs.launchpad.net/oslo.cache/";
+"+bug/1888394>`_] [`bug 1883659 <https://bugs.launchpad.net/";
+"keystonemiddleware/+bug/1883659>`_] Keystonemiddleware now using eventlet-"
+"safe implementation of ``MemcacheClientPool`` from oslo.cache's library by "
+"default. The ``keystonemiddleware`` implementation is now deprecated. For "
+"backwards compatibility, the ``[keystone_authtoken] "
+"memcache_use_advanced_pool`` option can be set to ``False`` config files of "
+"the various services (e.g. nova, glance, ...) when memcached is used for "
+"token cache."
+msgstr ""
+"[`bug 1892852 <https://bugs.launchpad.net/keystonemiddleware/";
+"+bug/1892852>`_] [`bug 1888394 <https://bugs.launchpad.net/oslo.cache/";
+"+bug/1888394>`_] [`bug 1883659 <https://bugs.launchpad.net/";
+"keystonemiddleware/+bug/1883659>`_] Keystonemiddleware now using eventlet-"
+"safe implementation of ``MemcacheClientPool`` from oslo.cache's library by "
+"default. The ``keystonemiddleware`` implementation is now deprecated. For "
+"backwards compatibility, the ``[keystone_authtoken] "
+"memcache_use_advanced_pool`` option can be set to ``False`` config files of "
+"the various services (e.g. nova, glance, ...) when Memcached is used for "
+"token cache."
+
+msgid ""
 "[`bug/1747655 <https://bugs.launchpad.net/keystonemiddleware/";
 "+bug/1747655>`_] When keystone is temporarily unavailable, "
 "keystonemiddleware correctly sends a 503 response to the HTTP client but was "
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/setup.cfg 
new/keystonemiddleware-10.2.0/setup.cfg
--- old/keystonemiddleware-9.5.0/setup.cfg      2022-05-20 14:33:03.178202600 
+0200
+++ new/keystonemiddleware-10.2.0/setup.cfg     2023-01-06 17:21:05.229156700 
+0100
@@ -1,11 +1,12 @@
 [metadata]
 name = keystonemiddleware
 summary = Middleware for OpenStack Identity
-description-file = 
+description_file = 
        README.rst
 author = OpenStack
-author-email = [email protected]
-home-page = https://docs.openstack.org/keystonemiddleware/latest/
+author_email = [email protected]
+home_page = https://docs.openstack.org/keystonemiddleware/latest/
+python_requires = >=3.8
 classifier = 
        Environment :: OpenStack
        Intended Audience :: Information Technology
@@ -15,8 +16,9 @@
        Programming Language :: Python
        Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: 3
-       Programming Language :: Python :: 3.6
-       Programming Language :: Python :: 3.7
+       Programming Language :: Python :: 3 :: Only
+       Programming Language :: Python :: 3.8
+       Programming Language :: Python :: 3.9
 
 [files]
 packages = 
@@ -27,7 +29,7 @@
        oslo.messaging>=5.29.0 # Apache-2.0
 
 [global]
-setup-hooks = 
+setup_hooks = 
        pbr.hooks.setup_hook
 
 [entry_points]
@@ -39,20 +41,7 @@
        audit = keystonemiddleware.audit:filter_factory
        ec2_token = keystonemiddleware.ec2_token:filter_factory
        s3_token = keystonemiddleware.s3_token:filter_factory
-
-[compile_catalog]
-directory = keystonemiddleware/locale
-domain = keystonemiddleware
-
-[update_catalog]
-domain = keystonemiddleware
-output_dir = keystonemiddleware/locale
-input_file = keystonemiddleware/locale/keystonemiddleware.pot
-
-[extract_messages]
-keywords = _ gettext ngettext l_ lazy_gettext
-mapping_file = babel.cfg
-output_file = keystonemiddleware/locale/keystonemiddleware.pot
+       oauth2_token = keystonemiddleware.oauth2_token:filter_factory
 
 [egg_info]
 tag_build = 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/test-requirements.txt 
new/keystonemiddleware-10.2.0/test-requirements.txt
--- old/keystonemiddleware-9.5.0/test-requirements.txt  2022-05-20 
14:32:24.000000000 +0200
+++ new/keystonemiddleware-10.2.0/test-requirements.txt 2023-01-06 
17:20:38.000000000 +0100
@@ -3,14 +3,16 @@
 # process, which may cause wedges in the gate later.
 
 hacking>=3.0,<4.0.0 # Apache-2.0
-flake8-docstrings==0.2.1.post1 # MIT
+flake8-docstrings==1.6.0 # MIT
+pep8==1.7.1 # MIT
+
 
 coverage!=4.4,>=4.0 # Apache-2.0
 cryptography>=3.0 # BSD/Apache-2.0
 fixtures>=3.0.0 # Apache-2.0/BSD
 oslotest>=3.2.0 # Apache-2.0
-requests-mock>=1.2.0 # Apache-2.0
 stevedore>=1.20.0 # Apache-2.0
+requests-mock>=1.2.0 # Apache-2.0
 stestr>=2.0.0  # Apache-2.0
 testresources>=2.0.0 # Apache-2.0/BSD
 testtools>=2.2.0 # MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/keystonemiddleware-9.5.0/tox.ini 
new/keystonemiddleware-10.2.0/tox.ini
--- old/keystonemiddleware-9.5.0/tox.ini        2022-05-20 14:32:24.000000000 
+0200
+++ new/keystonemiddleware-10.2.0/tox.ini       2023-01-06 17:20:38.000000000 
+0100
@@ -1,5 +1,5 @@
 [tox]
-minversion = 3.1.1
+minversion = 3.18.0
 skipsdist = True
 envlist = py37,pep8,releasenotes
 ignore_basepython_conflict = True
@@ -49,10 +49,11 @@
 # D102: Missing docstring in public method
 # D103: Missing docstring in public function
 # D104: Missing docstring in public package
-# D203: 1 blank line required before class docstring (deprecated in pep257)
+# D107: Missing docstring in __init__
+# D401: First line should be in imperative mood
 # W503 line break before binary operator
 # W504 line break after binary operator
-ignore = D100,D101,D102,D103,D104,D203,W503,W504
+ignore = D100,D101,D102,D103,D104,D107,D401,W503,W504
 show-source = True
 exclude = .venv,.tox,dist,doc,*egg,build
 
@@ -65,7 +66,7 @@
 [testenv:pdf-docs]
 envdir = {toxworkdir}/docs
 deps = {[testenv:docs]deps}
-whitelist_externals =
+allowlist_externals =
   make
   rm
 commands =

Reply via email to