Hello community,
here is the log from the commit of package python-keystoneauth1 for
openSUSE:Factory checked in at 2020-10-26 16:15:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-keystoneauth1 (Old)
and /work/SRC/openSUSE:Factory/.python-keystoneauth1.new.3463 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-keystoneauth1"
Mon Oct 26 16:15:24 2020 rev:14 rq:841183 version:4.2.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-keystoneauth1/python-keystoneauth1.changes
2020-06-05 20:13:41.214422464 +0200
+++
/work/SRC/openSUSE:Factory/.python-keystoneauth1.new.3463/python-keystoneauth1.changes
2020-10-26 16:16:14.322931525 +0100
@@ -1,0 +2,24 @@
+Fri Oct 9 19:06:32 UTC 2020 - [email protected]
+
+- update to version 4.2.1
+ - Remove mox3 from local upper-constraints
+ - Fix E741 pep8 failure
+ - Add in-tree upper-constraints for py35 job
+ - Cleanup py27 support
+ - Fix get_endpoint_data for non-keystone plugins
+ - Implement HTTP Basic client support in keystoneauth1
+ - Fix docs builds for modern stevedors
+ - Fix hacking min version to 3.0.1
+ - Correct major version discovery for non-keystone plugins
+ - Use unittest.mock instead of third party mock
+ - Make header Case Insensitive
+ - Update lower-constraints versions
+ - Re-add python3.5 testing
+ - Add py38 package metadata
+ - Replace assertItemsEqual with assertCountEqual
+ - Inject /v3 in token path for v3 plugins
+ - Switch to newer openstackdocstheme and reno versions
+ - Drop python 3.5 support
+ - Update master for stable/ussuri
+
+-------------------------------------------------------------------
Old:
----
keystoneauth1-4.0.0.tar.gz
New:
----
keystoneauth1-4.2.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-keystoneauth1.spec ++++++
--- /var/tmp/diff_new_pack.xH9xzG/_old 2020-10-26 16:16:16.138932986 +0100
+++ /var/tmp/diff_new_pack.xH9xzG/_new 2020-10-26 16:16:16.142932989 +0100
@@ -17,13 +17,13 @@
Name: python-keystoneauth1
-Version: 4.0.0
+Version: 4.2.1
Release: 0
Summary: OpenStack authenticating tools
License: Apache-2.0
Group: Development/Languages/Python
URL: https://launchpad.net/keystoneauth
-Source0:
https://files.pythonhosted.org/packages/source/k/keystoneauth1/keystoneauth1-4.0.0.tar.gz
+Source0:
https://files.pythonhosted.org/packages/source/k/keystoneauth1/keystoneauth1-4.2.1.tar.gz
BuildRequires: openstack-macros
BuildRequires: python3-PyYAML
BuildRequires: python3-betamax
++++++ _service ++++++
--- /var/tmp/diff_new_pack.xH9xzG/_old 2020-10-26 16:16:16.174933015 +0100
+++ /var/tmp/diff_new_pack.xH9xzG/_new 2020-10-26 16:16:16.174933015 +0100
@@ -1,8 +1,8 @@
<services>
<service mode="disabled" name="renderspec">
- <param
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/ussuri/openstack/keystoneauth1/keystoneauth1.spec.j2</param>
+ <param
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/victoria/openstack/keystoneauth1/keystoneauth1.spec.j2</param>
<param name="output-name">python-keystoneauth1.spec</param>
- <param
name="requirements">https://opendev.org/openstack/keystoneauth/raw/branch/stable/ussuri/requirements.txt</param>
+ <param
name="requirements">https://opendev.org/openstack/keystoneauth/raw/branch/stable/victoria/requirements.txt</param>
<param name="changelog-email">[email protected]</param>
<param name="changelog-provider">gh,openstack,keystoneauth</param>
</service>
++++++ keystoneauth1-4.0.0.tar.gz -> keystoneauth1-4.2.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/AUTHORS
new/keystoneauth1-4.2.1/AUTHORS
--- old/keystoneauth1-4.0.0/AUTHORS 2020-04-02 16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/AUTHORS 2020-08-04 11:17:27.000000000 +0200
@@ -62,6 +62,7 @@
Florent Flament <[email protected]>
Gabriel Hurley <[email protected]>
Gage Hugo <[email protected]>
+Ghanshyam Mann <[email protected]>
Ghe Rivero <[email protected]>
Ghe Rivero <[email protected]>
Gregory Haynes <[email protected]>
@@ -88,6 +89,7 @@
Joe Gordon <[email protected]>
Joe Gordon <[email protected]>
Joe Heck <[email protected]>
+Joel Capitao <[email protected]>
John Dennis <[email protected]>
JordanP <[email protected]>
Jose Castro Leon <[email protected]>
@@ -142,6 +144,7 @@
Sean Perry <[email protected]>
Sergey Kraynev <[email protected]>
Sergio Cazzolato <[email protected]>
+Steve Baker <[email protected]>
Steve Martinelli <[email protected]>
Steve Martinelli <[email protected]>
Steven Hardy <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/ChangeLog
new/keystoneauth1-4.2.1/ChangeLog
--- old/keystoneauth1-4.0.0/ChangeLog 2020-04-02 16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/ChangeLog 2020-08-04 11:17:27.000000000 +0200
@@ -1,6 +1,37 @@
CHANGES
=======
+4.2.1
+-----
+
+* Correct major version discovery for non-keystone plugins
+* Fix docs builds for modern stevedors
+* Fix get\_endpoint\_data for non-keystone plugins
+
+4.2.0
+-----
+
+* Drop python 3.5 support
+* Implement HTTP Basic client support in keystoneauth1
+* Update lower-constraints versions
+
+4.1.0
+-----
+
+* Remove mox3 from local upper-constraints
+* Replace assertItemsEqual with assertCountEqual
+* Add in-tree upper-constraints for py35 job
+* Make header Case Insensitive
+* Use unittest.mock instead of third party mock
+* Add py38 package metadata
+* Inject /v3 in token path for v3 plugins
+* Fix hacking min version to 3.0.1
+* Fix E741 pep8 failure
+* Switch to newer openstackdocstheme and reno versions
+* Re-add python3.5 testing
+* Cleanup py27 support
+* Update master for stable/ussuri
+
4.0.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/PKG-INFO
new/keystoneauth1-4.2.1/PKG-INFO
--- old/keystoneauth1-4.0.0/PKG-INFO 2020-04-02 16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/PKG-INFO 2020-08-04 11:17:27.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: keystoneauth1
-Version: 4.0.0
+Version: 4.2.1
Summary: Authentication Library for OpenStack Identity
Home-page: https://docs.openstack.org/keystoneauth/latest/
Author: OpenStack
@@ -51,11 +51,15 @@
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: Implementation :: CPython
+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.8
+Requires-Python: >=3.6
+Provides-Extra: betamax
Provides-Extra: kerberos
-Provides-Extra: saml2
Provides-Extra: oauth1
-Provides-Extra: betamax
+Provides-Extra: saml2
Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/doc/ext/list_plugins.py
new/keystoneauth1-4.2.1/doc/ext/list_plugins.py
--- old/keystoneauth1-4.0.0/doc/ext/list_plugins.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/doc/ext/list_plugins.py 2020-08-04
11:15:42.000000000 +0200
@@ -76,7 +76,15 @@
for name in sorted(mgr.names()):
for line in self.display_plugin(mgr[name]):
for l in line.splitlines():
- result.append(l, mgr[name].entry_point.module_name)
+ ep = mgr[name]
+ try:
+ module_name = ep.entry_point.module_name
+ except AttributeError:
+ try:
+ module_name = ep.entry_point.module
+ except AttributeError:
+ module_name = ep.entry_point.value
+ result.append(l, module_name)
# Parse what we have into a new section.
node = nodes.section()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/doc/requirements.txt
new/keystoneauth1-4.2.1/doc/requirements.txt
--- old/keystoneauth1-4.0.0/doc/requirements.txt 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/doc/requirements.txt 2020-08-04
11:15:42.000000000 +0200
@@ -3,18 +3,16 @@
# process, which may cause wedges in the gate later.
# For generationg sphinx documentation
-openstackdocstheme>=1.18.1 # Apache-2.0
-reno>=2.5.0 # Apache-2.0
-sphinx!=1.6.6,!=1.6.7,>=1.6.2;python_version>='3.4' # BSD
+openstackdocstheme>=2.2.1 # Apache-2.0
+reno>=3.1.0 # Apache-2.0
+sphinx>=2.0.0,!=2.1.0 # BSD
sphinxcontrib-apidoc>=0.2.0 # BSD
# For autodoc builds
-hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0
fixtures>=3.0.0 # Apache-2.0/BSD
-mock>=2.0.0 # BSD
betamax>=0.7.0 # Apache-2.0
oslo.config>=5.2.0 # Apache-2.0
oslo.utils>=3.33.0 # Apache-2.0
requests-mock>=1.2.0 # Apache-2.0
-lxml!=3.7.0,>=3.4.1 # BSD
+lxml>=4.2.0 # BSD
oauthlib>=0.6.2 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/doc/source/authentication-plugins.rst
new/keystoneauth1-4.2.1/doc/source/authentication-plugins.rst
--- old/keystoneauth1-4.0.0/doc/source/authentication-plugins.rst
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/doc/source/authentication-plugins.rst
2020-08-04 11:15:42.000000000 +0200
@@ -226,6 +226,34 @@
sess = session.Session(auth=auth)
sess.get_token()
+Standalone Plugins
+------------------
+
+Services can be deployed in a standalone environment where there is no
integration
+with an identity service. The following plugins are provided to support
standalone
+services:
+
+- :py:class:`~keystoneauth1.http_basic.HTTPBasicAuth`: HTTP Basic
authentication
+- :py:class:`~keystoneauth1.noauth.NoAuth`: No authentication
+
+Standalone plugins must be given an `endpoint` that points to the URL of the
one
+service being used, since there is no service catalog to look up endpoints::
+
+ from keystoneauth1 import session
+ from keystoneauth1 import noauth
+ auth = noauth.NoAuth(endpoint='http://hostname:6385/')
+ sess = session.Session(auth=auth)
+
+:py:class:`~keystoneauth1.http_basic.HTTPBasicAuth` also requres a `username`
and
+`password`::
+
+ from keystoneauth1 import session
+ from keystoneauth1 import http_basic
+ auth = http_basic.HTTPBasicAuth(endpoint='http://hostname:6385/',
+ username='myUser',
+ password='myPassword')
+ sess = session.Session(auth=auth)
+
Federation
==========
@@ -374,6 +402,8 @@
are available are then specific to the plugin that you specified. Currently the
authentication plugins that are available in `keystoneauth` are:
+- http_basic: :py:class:`keystoneauth1.http_basic.HTTPBasicAuth`
+- none: :py:class:`keystoneauth1.noauth.NoAuth`
- password: :py:class:`keystoneauth1.identity.generic.Password`
- token: :py:class:`keystoneauth1.identity.generic.Token`
- v2password: :py:class:`keystoneauth1.identity.v2.Password`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/doc/source/conf.py
new/keystoneauth1-4.2.1/doc/source/conf.py
--- old/keystoneauth1-4.0.0/doc/source/conf.py 2020-04-02 16:32:45.000000000
+0200
+++ new/keystoneauth1-4.2.1/doc/source/conf.py 2020-08-04 11:15:42.000000000
+0200
@@ -12,8 +12,6 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
-from __future__ import unicode_literals
-
import os
import sys
@@ -47,6 +45,7 @@
apidoc_module_dir = '../../keystoneauth1'
apidoc_output_dir = 'api'
apidoc_excluded_paths = [
+ 'hacking',
'tests/*',
'tests',
'test']
@@ -69,15 +68,6 @@
project = 'keystoneauth1'
copyright = 'OpenStack Contributors'
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-version_info = pbr.version.VersionInfo('keystoneauth1')
-# The short X.Y version.
-version = version_info.version_string()
-# The full version, including alpha/beta/rc tags.
-release = version_info.release_string()
-
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
@@ -111,7 +101,7 @@
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = 'native'
# A list of ignored prefixes for module index sorting.
modindex_common_prefix = ['keystoneauth1.']
@@ -157,10 +147,6 @@
# so a file named "default.css" will overwrite the builtin "default.css".
#html_static_path = ['static']
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-html_last_updated_fmt = '%Y-%m-%d %H:%M'
-
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
@@ -251,6 +237,8 @@
}
# -- Options for openstackdocstheme -------------------------------------------
-repository_name = 'openstack/keystoneauth'
-bug_project = 'keystoneauth'
-bug_tag = 'doc'
+openstackdocs_repo_name = 'openstack/keystoneauth'
+openstackdocs_pdf_link = True
+openstackdocs_auto_name = False
+openstackdocs_bug_project = 'keystoneauth'
+openstackdocs_bug_tag = 'doc'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1/adapter.py
new/keystoneauth1-4.2.1/keystoneauth1/adapter.py
--- old/keystoneauth1-4.0.0/keystoneauth1/adapter.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/adapter.py 2020-08-04
11:15:42.000000000 +0200
@@ -13,6 +13,8 @@
import os
import warnings
+import requests
+
from keystoneauth1 import _fair_semaphore
from keystoneauth1 import session
@@ -198,7 +200,14 @@
def request(self, url, method, **kwargs):
endpoint_filter = kwargs.setdefault('endpoint_filter', {})
self._set_endpoint_filter_kwargs(endpoint_filter)
-
+ # NOTE(gmann): Convert r initlize the headers to
+ # CaseInsensitiveDict to make sure headers are
+ # case insensitive.
+ if kwargs.get('headers'):
+ kwargs['headers'] = requests.structures.CaseInsensitiveDict(
+ kwargs['headers'])
+ else:
+ kwargs['headers'] = requests.structures.CaseInsensitiveDict()
if self.endpoint_override:
kwargs.setdefault('endpoint_override', self.endpoint_override)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/fixture/keystoneauth_betamax.py
new/keystoneauth1-4.2.1/keystoneauth1/fixture/keystoneauth_betamax.py
--- old/keystoneauth1-4.0.0/keystoneauth1/fixture/keystoneauth_betamax.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/fixture/keystoneauth_betamax.py
2020-08-04 11:15:42.000000000 +0200
@@ -13,10 +13,10 @@
"""A fixture to wrap the session constructor for use with Betamax."""
from functools import partial
+from unittest import mock
import betamax
import fixtures
-import mock
import requests
from keystoneauth1.fixture import hooks
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1/http_basic.py
new/keystoneauth1-4.2.1/keystoneauth1/http_basic.py
--- old/keystoneauth1-4.0.0/keystoneauth1/http_basic.py 1970-01-01
01:00:00.000000000 +0100
+++ new/keystoneauth1-4.2.1/keystoneauth1/http_basic.py 2020-08-04
11:15:42.000000000 +0200
@@ -0,0 +1,45 @@
+# 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 base64
+
+from keystoneauth1 import plugin
+
+AUTH_HEADER_NAME = 'Authorization'
+
+
+class HTTPBasicAuth(plugin.FixedEndpointPlugin):
+ """A provider that will always use HTTP Basic authentication.
+
+ This is useful to unify session/adapter loading for services
+ that might be deployed in standalone mode.
+ """
+
+ def __init__(self, endpoint=None, username=None, password=None):
+ super(HTTPBasicAuth, self).__init__(endpoint)
+ self.username = username
+ self.password = password
+
+ def get_token(self, session, **kwargs):
+ if self.username is None or self.password is None:
+ return None
+ token = bytes('%s:%s' % (self.username, self.password),
+ encoding='utf-8')
+ encoded = base64.b64encode(token)
+ return str(encoded, encoding='utf-8')
+
+ def get_headers(self, session, **kwargs):
+ token = self.get_token(session)
+ if not token:
+ return None
+ auth = 'Basic %s' % token
+ return {AUTH_HEADER_NAME: auth}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/identity/v3/base.py
new/keystoneauth1-4.2.1/keystoneauth1/identity/v3/base.py
--- old/keystoneauth1-4.0.0/keystoneauth1/identity/v3/base.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/identity/v3/base.py 2020-08-04
11:15:42.000000000 +0200
@@ -173,9 +173,13 @@
if self.system_scope == 'all':
body['auth']['scope'] = {'system': {'all': True}}
+ token_url = self.token_url
+
+ if not self.auth_url.rstrip('/').endswith('v3'):
+ token_url = '%s/v3/auth/tokens' % self.auth_url.rstrip('/')
+
# NOTE(jamielennox): we add nocatalog here rather than in token_url
# directly as some federation plugins require the base token_url
- token_url = self.token_url
if not self.include_catalog:
token_url += '?nocatalog'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/loading/_plugins/http_basic.py
new/keystoneauth1-4.2.1/keystoneauth1/loading/_plugins/http_basic.py
--- old/keystoneauth1-4.0.0/keystoneauth1/loading/_plugins/http_basic.py
1970-01-01 01:00:00.000000000 +0100
+++ new/keystoneauth1-4.2.1/keystoneauth1/loading/_plugins/http_basic.py
2020-08-04 11:15:42.000000000 +0200
@@ -0,0 +1,48 @@
+# 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 keystoneauth1 import http_basic
+from keystoneauth1 import loading
+
+
+class HTTPBasicAuth(loading.BaseLoader):
+ """Use HTTP Basic authentication to perform requests.
+
+ This can be used to instantiate clients for services deployed in
+ standalone mode.
+
+ There is no fetching a service catalog or determining scope information
+ and so it cannot be used by clients that expect to use this scope
+ information.
+
+ """
+
+ @property
+ def plugin_class(self):
+ return http_basic.HTTPBasicAuth
+
+ def get_options(self):
+ options = super(HTTPBasicAuth, self).get_options()
+
+ options.extend([
+ loading.Opt('username',
+ help='Username',
+ deprecated=[loading.Opt('user-name')]),
+ loading.Opt('password',
+ secret=True,
+ prompt='Password: ',
+ help="User's password"),
+ loading.Opt('endpoint',
+ help='The endpoint that will always be used'),
+ ])
+
+ return options
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1/noauth.py
new/keystoneauth1-4.2.1/keystoneauth1/noauth.py
--- old/keystoneauth1-4.0.0/keystoneauth1/noauth.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/noauth.py 2020-08-04
11:15:42.000000000 +0200
@@ -13,25 +13,12 @@
from keystoneauth1 import plugin
-class NoAuth(plugin.BaseAuthPlugin):
+class NoAuth(plugin.FixedEndpointPlugin):
"""A provider that will always use no auth.
This is useful to unify session/adapter loading for services
that might be deployed in standalone/noauth mode.
"""
- def __init__(self, endpoint=None):
- super(NoAuth, self).__init__()
- self.endpoint = endpoint
-
def get_token(self, session, **kwargs):
return 'notused'
-
- def get_endpoint(self, session, **kwargs):
- """Return the supplied endpoint.
-
- Using this plugin the same endpoint is returned regardless of the
- parameters passed to the plugin. endpoint_override overrides the
- endpoint specified when constructing the plugin.
- """
- return kwargs.get('endpoint_override') or self.endpoint
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1/plugin.py
new/keystoneauth1-4.2.1/keystoneauth1/plugin.py
--- old/keystoneauth1-4.0.0/keystoneauth1/plugin.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/plugin.py 2020-08-04
11:15:42.000000000 +0200
@@ -149,8 +149,18 @@
endpoint_data = self.get_endpoint_data(
session, endpoint_override=endpoint_override,
discover_versions=False, **kwargs)
- if endpoint_data:
+ if endpoint_data is None:
+ return
+
+ if endpoint_data.api_version is None:
+ # No version detected from the URL, trying full discovery.
+ endpoint_data = self.get_endpoint_data(
+ session, endpoint_override=endpoint_override,
+ discover_versions=True, **kwargs)
+
+ if endpoint_data and endpoint_data.api_version:
return endpoint_data.api_version
+
return None
def get_endpoint(self, session, **kwargs):
@@ -313,3 +323,48 @@
feature.
"""
raise NotImplementedError()
+
+
+class FixedEndpointPlugin(BaseAuthPlugin):
+ """A base class for plugins that have one fixed endpoint."""
+
+ def __init__(self, endpoint=None):
+ super(FixedEndpointPlugin, self).__init__()
+ self.endpoint = endpoint
+
+ def get_endpoint(self, session, **kwargs):
+ """Return the supplied endpoint.
+
+ Using this plugin the same endpoint is returned regardless of the
+ parameters passed to the plugin. endpoint_override overrides the
+ endpoint specified when constructing the plugin.
+ """
+ return kwargs.get('endpoint_override') or self.endpoint
+
+ def get_endpoint_data(self, session,
+ endpoint_override=None,
+ discover_versions=True,
+ **kwargs):
+ """Return a valid endpoint data for a the service.
+
+ :param session: A session object that can be used for communication.
+ :type session: keystoneauth1.session.Session
+ :param str endpoint_override: URL to use for version discovery.
+ :param bool discover_versions: Whether to get version metadata from
+ the version discovery document even
+ if it major api version info can be
+ inferred from the url.
+ (optional, defaults to True)
+ :param kwargs: Ignored.
+
+ :raises keystoneauth1.exceptions.http.HttpError: An error from an
+ invalid HTTP response.
+
+ :return: Valid EndpointData or None if not available.
+ :rtype: `keystoneauth1.discover.EndpointData` or None
+ """
+ return super(FixedEndpointPlugin, self).get_endpoint_data(
+ session,
+ endpoint_override=endpoint_override or self.endpoint,
+ discover_versions=discover_versions,
+ **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1/session.py
new/keystoneauth1-4.2.1/keystoneauth1/session.py
--- old/keystoneauth1-4.0.0/keystoneauth1/session.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/session.py 2020-08-04
11:15:42.000000000 +0200
@@ -753,6 +753,14 @@
else:
split_loggers = None
logger = logger or utils.get_logger(__name__)
+ # NOTE(gmann): Convert r initlize the headers to
+ # CaseInsensitiveDict to make sure headers are
+ # case insensitive.
+ if kwargs.get('headers'):
+ kwargs['headers'] = requests.structures.CaseInsensitiveDict(
+ kwargs['headers'])
+ else:
+ kwargs['headers'] = requests.structures.CaseInsensitiveDict()
if connect_retries is None:
connect_retries = self._connect_retries
# HTTP 503 - Service Unavailable
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
---
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
2020-04-02 16:32:45.000000000 +0200
+++
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
2020-08-04 11:15:42.000000000 +0200
@@ -35,7 +35,7 @@
'mutual-auth',
]
- self.assertItemsEqual(allowed_opts, opts)
+ self.assertCountEqual(allowed_opts, opts)
def create(self, **kwargs):
loader = loading.get_plugin_loader('v3fedkerb')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
---
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
2020-04-02 16:32:45.000000000 +0200
+++
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
2020-08-04 11:15:42.000000000 +0200
@@ -32,4 +32,4 @@
'mutual-auth',
]
- self.assertItemsEqual(allowed_opts, opts)
+ self.assertCountEqual(allowed_opts, opts)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/identity/test_identity_v3.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/identity/test_identity_v3.py
---
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/identity/test_identity_v3.py
2020-04-02 16:32:45.000000000 +0200
+++
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/identity/test_identity_v3.py
2020-08-04 11:15:42.000000000 +0200
@@ -798,3 +798,27 @@
self.assertRequestHeaderEqual("Content-Type", "application/json")
self.assertRequestHeaderEqual("Accept", "application/json")
self.assertEqual(s.auth.auth_ref.auth_token, self.TEST_TOKEN)
+
+ def test_authenticate_with_unversioned_endpoint(self):
+ self.stub_auth(json=self.TEST_RESPONSE_DICT)
+ # We use the root url here because it doesn't reference the API version
+ # (e.g., '/v3'). We want to make sure the authentication plugin handles
+ # this and appends /v3 if it's not present.
+ a = v3.Password(self.TEST_ROOT_URL,
+ username=self.TEST_USER,
+ password=self.TEST_PASS)
+ self.assertFalse(a.has_scope_parameters)
+ s = session.Session(auth=a)
+
+ self.assertEqual({'X-Auth-Token': self.TEST_TOKEN},
+ s.get_auth_headers())
+
+ req = {'auth': {'identity':
+ {'methods': ['password'],
+ 'password': {'user': {'name': self.TEST_USER,
+ 'password': self.TEST_PASS}}}}}
+
+ self.assertRequestBodyIs(json=req)
+ self.assertRequestHeaderEqual('Content-Type', 'application/json')
+ self.assertRequestHeaderEqual('Accept', 'application/json')
+ self.assertEqual(s.auth.auth_ref.auth_token, self.TEST_TOKEN)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/test_cli.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/test_cli.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/test_cli.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/test_cli.py
2020-08-04 11:15:42.000000000 +0200
@@ -11,10 +11,10 @@
# under the License.
import argparse
+from unittest import mock
import uuid
import fixtures
-import mock
from keystoneauth1 import loading
from keystoneauth1.loading import cli
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/test_conf.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/test_conf.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/test_conf.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/test_conf.py
2020-08-04 11:15:42.000000000 +0200
@@ -10,9 +10,9 @@
# License for the specific language governing permissions and limitations
# under the License.
+from unittest import mock
import uuid
-import mock
from oslo_config import cfg
from oslo_config import fixture as config
import stevedore
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/test_loading.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/test_loading.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/test_loading.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/test_loading.py
2020-08-04 11:15:42.000000000 +0200
@@ -76,8 +76,8 @@
loaders = loading.get_available_plugin_loaders()
self.assertThat(len(loaders), matchers.GreaterThan(0))
- for l in loaders.values():
- self.assertIsInstance(l, loading.BaseLoader)
+ for loader in loaders.values():
+ self.assertIsInstance(loader, loading.BaseLoader)
def test_loading_getter(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/utils.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/utils.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/loading/utils.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/loading/utils.py
2020-08-04 11:15:42.000000000 +0200
@@ -11,9 +11,9 @@
# under the License.
import functools
+from unittest import mock
import uuid
-import mock
from keystoneauth1 import loading
from keystoneauth1.loading import base
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_betamax_fixture.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_betamax_fixture.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_betamax_fixture.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_betamax_fixture.py
2020-08-04 11:15:42.000000000 +0200
@@ -10,9 +10,10 @@
# License for the specific language governing permissions and limitations
# under the License.
+from unittest import mock
+
import betamax
from betamax import exceptions
-import mock
import testtools
from keystoneauth1.fixture import keystoneauth_betamax
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_betamax_hooks.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_betamax_hooks.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_betamax_hooks.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_betamax_hooks.py
2020-08-04 11:15:42.000000000 +0200
@@ -11,9 +11,9 @@
# under the License.
import json
+from unittest import mock
import betamax
-import mock
from requests import models
import testtools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_discovery.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_discovery.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_discovery.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_discovery.py
2020-08-04 11:15:42.000000000 +0200
@@ -12,14 +12,15 @@
import json
import re
+from unittest import mock
-import mock
from testtools import matchers
from keystoneauth1 import adapter
from keystoneauth1 import discover
from keystoneauth1 import exceptions
from keystoneauth1 import fixture
+from keystoneauth1 import http_basic
from keystoneauth1 import noauth
from keystoneauth1 import session
from keystoneauth1.tests.unit import utils
@@ -747,24 +748,81 @@
def test_endpoint_data_noauth_discover(self):
mock = self.requests_mock.get(
+ BASE_URL, status_code=200, json=V3_VERSION_LIST)
+ self.requests_mock.get(
V3_URL, status_code=200, json=V3_VERSION_ENTRY)
+
+ plugin = noauth.NoAuth(endpoint=BASE_URL)
+ data = plugin.get_endpoint_data(self.session)
+
+ self.assertEqual(data.api_version, (3, 0))
+ self.assertEqual(data.url, V3_URL)
+ self.assertEqual(plugin.get_api_major_version(self.session), (3, 0))
+ self.assertEqual(plugin.get_endpoint(self.session), BASE_URL)
+
+ self.assertTrue(mock.called_once)
+
+ def test_endpoint_data_noauth_versioned_discover(self):
+ self.requests_mock.get(
+ BASE_URL, status_code=200, json=V3_VERSION_LIST)
+ self.requests_mock.get(
+ V3_URL, status_code=200, json=V3_VERSION_ENTRY)
+
+ plugin = noauth.NoAuth(endpoint=V3_URL)
+ data = plugin.get_endpoint_data(self.session)
+
+ self.assertEqual(data.api_version, (3, 0))
+ self.assertEqual(data.url, V3_URL)
+ self.assertEqual(plugin.get_api_major_version(self.session), (3, 0))
+ self.assertEqual(plugin.get_endpoint(self.session), V3_URL)
+
+ def test_endpoint_data_noauth_no_discover(self):
+ plugin = noauth.NoAuth(endpoint=V3_URL)
+ data = plugin.get_endpoint_data(
+ self.session, discover_versions=False)
+
+ self.assertEqual(data.api_version, (3, 0))
+ self.assertEqual(data.url, V3_URL)
+ self.assertEqual(plugin.get_api_major_version(self.session), (3, 0))
+ self.assertEqual(plugin.get_endpoint(self.session), V3_URL)
+
+ def test_endpoint_data_noauth_override_no_discover(self):
plugin = noauth.NoAuth()
- data = plugin.get_endpoint_data(self.session, endpoint_override=V3_URL)
+ data = plugin.get_endpoint_data(
+ self.session, endpoint_override=V3_URL, discover_versions=False)
self.assertEqual(data.api_version, (3, 0))
self.assertEqual(data.url, V3_URL)
self.assertEqual(
- plugin.get_api_major_version(
- self.session, endpoint_override=V3_URL),
- (3, 0))
- self.assertEqual(
plugin.get_endpoint(self.session, endpoint_override=V3_URL),
V3_URL)
- self.assertTrue(mock.called_once)
+ def test_endpoint_data_http_basic_discover(self):
+ self.requests_mock.get(
+ BASE_URL, status_code=200, json=V3_VERSION_LIST)
+ self.requests_mock.get(
+ V3_URL, status_code=200, json=V3_VERSION_ENTRY)
- def test_endpoint_data_noauth_no_discover(self):
- plugin = noauth.NoAuth()
+ plugin = http_basic.HTTPBasicAuth(endpoint=V3_URL)
+ data = plugin.get_endpoint_data(self.session)
+
+ self.assertEqual(data.api_version, (3, 0))
+ self.assertEqual(data.url, V3_URL)
+ self.assertEqual(plugin.get_api_major_version(self.session), (3, 0))
+ self.assertEqual(plugin.get_endpoint(self.session), V3_URL)
+
+ def test_endpoint_data_http_basic_no_discover(self):
+ plugin = http_basic.HTTPBasicAuth(endpoint=V3_URL)
+ data = plugin.get_endpoint_data(
+ self.session, discover_versions=False)
+
+ self.assertEqual(data.api_version, (3, 0))
+ self.assertEqual(data.url, V3_URL)
+ self.assertEqual(plugin.get_api_major_version(self.session), (3, 0))
+ self.assertEqual(plugin.get_endpoint(self.session), V3_URL)
+
+ def test_endpoint_data_http_basic_override_no_discover(self):
+ plugin = http_basic.HTTPBasicAuth()
data = plugin.get_endpoint_data(
self.session, endpoint_override=V3_URL, discover_versions=False)
@@ -779,6 +837,22 @@
V3_URL)
def test_endpoint_data_noauth_adapter(self):
+ self.requests_mock.get(
+ BASE_URL, status_code=200, json=V3_VERSION_LIST)
+ self.requests_mock.get(
+ V3_URL, status_code=200, json=V3_VERSION_ENTRY)
+
+ client = adapter.Adapter(
+ session.Session(noauth.NoAuth()),
+ endpoint_override=BASE_URL)
+ data = client.get_endpoint_data()
+
+ self.assertEqual(data.api_version, (3, 0))
+ self.assertEqual(data.url, V3_URL)
+ self.assertEqual(client.get_api_major_version(), (3, 0))
+ self.assertEqual(client.get_endpoint(), BASE_URL)
+
+ def test_endpoint_data_noauth_versioned_adapter(self):
mock = self.requests_mock.get(
V3_URL, status_code=200, json=V3_VERSION_ENTRY)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_fair_sempahore.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_fair_sempahore.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_fair_sempahore.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_fair_sempahore.py
2020-08-04 11:15:42.000000000 +0200
@@ -12,8 +12,8 @@
from threading import Thread
from timeit import default_timer as timer
+from unittest import mock
-import mock
from six.moves import queue
import testtools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_hacking_checks.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_hacking_checks.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_hacking_checks.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_hacking_checks.py
2020-08-04 11:15:42.000000000 +0200
@@ -11,8 +11,8 @@
# under the License.
import textwrap
+from unittest import mock
-import mock
import pycodestyle
import testtools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_http_basic.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_http_basic.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_http_basic.py
1970-01-01 01:00:00.000000000 +0100
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_http_basic.py
2020-08-04 11:15:42.000000000 +0200
@@ -0,0 +1,49 @@
+# 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 keystoneauth1 import http_basic
+from keystoneauth1.loading._plugins import http_basic as loader
+from keystoneauth1 import session
+from keystoneauth1.tests.unit import utils
+
+
+class HTTPBasicAuthTest(utils.TestCase):
+
+ TEST_URL = 'http://server/prefix'
+
+ def test_basic_case(self):
+ self.requests_mock.get(self.TEST_URL, text='body')
+
+ a = http_basic.HTTPBasicAuth(username='myName', password='myPassword')
+ s = session.Session(auth=a)
+
+ data = s.get(self.TEST_URL, authenticated=True)
+
+ self.assertEqual(data.text, 'body')
+ self.assertRequestHeaderEqual(
+ 'Authorization', 'Basic bXlOYW1lOm15UGFzc3dvcmQ=')
+ self.assertIsNone(a.get_endpoint(s))
+
+ def test_basic_options(self):
+ opts = loader.HTTPBasicAuth().get_options()
+ self.assertEqual(['username', 'password', 'endpoint'],
+ [o.name for o in opts])
+
+ def test_get_endpoint(self):
+ a = http_basic.HTTPBasicAuth(endpoint=self.TEST_URL)
+ s = session.Session(auth=a)
+ self.assertEqual(self.TEST_URL, a.get_endpoint(s))
+
+ def test_get_endpoint_with_override(self):
+ a = http_basic.HTTPBasicAuth(endpoint=self.TEST_URL)
+ s = session.Session(auth=a)
+ self.assertEqual('foo', a.get_endpoint(s, endpoint_override='foo'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_session.py
new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_session.py
--- old/keystoneauth1-4.0.0/keystoneauth1/tests/unit/test_session.py
2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1/tests/unit/test_session.py
2020-08-04 11:15:42.000000000 +0200
@@ -15,9 +15,9 @@
import json
import logging
import sys
+from unittest import mock
import uuid
-import mock
from oslo_utils import encodeutils
import requests
import requests.auth
@@ -978,7 +978,7 @@
mock_close = mock.Mock()
sess._session.close = mock_close
del sess
- mock_close.assert_called_once()
+ self.assertEqual(1, mock_close.call_count)
def test_service_type_urls(self):
service_type = 'compute'
@@ -1822,7 +1822,7 @@
with mock.patch.object(sess, 'request') as m:
adapter.Adapter(sess, **adap_kwargs).get(url, **get_kwargs)
m.assert_called_once_with(url, 'GET', endpoint_filter={},
- rate_semaphore=mock.ANY,
+ headers={}, rate_semaphore=mock.ANY,
**exp_kwargs)
# No default_microversion in Adapter, no microversion in get()
@@ -1846,7 +1846,7 @@
with mock.patch.object(sess, 'request') as m:
adapter.Adapter(sess, **adap_kwargs).get(url, **get_kwargs)
m.assert_called_once_with(url, 'GET', endpoint_filter={},
- rate_semaphore=mock.ANY,
+ headers={}, rate_semaphore=mock.ANY,
**exp_kwargs)
# No raise_exc in Adapter or get()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1.egg-info/PKG-INFO
new/keystoneauth1-4.2.1/keystoneauth1.egg-info/PKG-INFO
--- old/keystoneauth1-4.0.0/keystoneauth1.egg-info/PKG-INFO 2020-04-02
16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1.egg-info/PKG-INFO 2020-08-04
11:17:27.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: keystoneauth1
-Version: 4.0.0
+Version: 4.2.1
Summary: Authentication Library for OpenStack Identity
Home-page: https://docs.openstack.org/keystoneauth/latest/
Author: OpenStack
@@ -51,11 +51,15 @@
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: Implementation :: CPython
+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.8
+Requires-Python: >=3.6
+Provides-Extra: betamax
Provides-Extra: kerberos
-Provides-Extra: saml2
Provides-Extra: oauth1
-Provides-Extra: betamax
+Provides-Extra: saml2
Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1.egg-info/SOURCES.txt
new/keystoneauth1-4.2.1/keystoneauth1.egg-info/SOURCES.txt
--- old/keystoneauth1-4.0.0/keystoneauth1.egg-info/SOURCES.txt 2020-04-02
16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1.egg-info/SOURCES.txt 2020-08-04
11:17:27.000000000 +0200
@@ -34,6 +34,7 @@
keystoneauth1/_utils.py
keystoneauth1/adapter.py
keystoneauth1/discover.py
+keystoneauth1/http_basic.py
keystoneauth1/noauth.py
keystoneauth1/plugin.py
keystoneauth1/service_token.py
@@ -116,6 +117,7 @@
keystoneauth1/loading/session.py
keystoneauth1/loading/_plugins/__init__.py
keystoneauth1/loading/_plugins/admin_token.py
+keystoneauth1/loading/_plugins/http_basic.py
keystoneauth1/loading/_plugins/noauth.py
keystoneauth1/loading/_plugins/identity/__init__.py
keystoneauth1/loading/_plugins/identity/generic.py
@@ -135,6 +137,7 @@
keystoneauth1/tests/unit/test_fair_sempahore.py
keystoneauth1/tests/unit/test_fixtures.py
keystoneauth1/tests/unit/test_hacking_checks.py
+keystoneauth1/tests/unit/test_http_basic.py
keystoneauth1/tests/unit/test_matchers.py
keystoneauth1/tests/unit/test_noauth.py
keystoneauth1/tests/unit/test_service_token.py
@@ -209,6 +212,7 @@
releasenotes/notes/additional-headers-f2d16f85f5abe942.yaml
releasenotes/notes/allow_version_hack-flag-9b53b72d9b084c04.yaml
releasenotes/notes/api-sig-error-guideline-handler.yaml
+releasenotes/notes/basic-http-auth-45bea4298209df75.yaml
releasenotes/notes/bp-application-credentials-416a1f8bb2311e04.yaml
releasenotes/notes/bp-system-scope-29e9c597039ddb1e.yaml
releasenotes/notes/bug-1582774-49af731b6dfc6f2f.yaml
@@ -220,11 +224,13 @@
releasenotes/notes/bug-1766235wq-0de60d0f996c6bfb.yaml
releasenotes/notes/bug-1839748-5d8dfc99c43aaefc.yaml
releasenotes/notes/bug-1840235-ef2946d149ac329c.yaml
+releasenotes/notes/bug-1876317-1db97d1b12a3e4b4.yaml
releasenotes/notes/cache-trailing-slash-3663c86cd9754379.yaml
releasenotes/notes/cleanup-session-on-delete-1ed6177d4c5c1f83.yaml
releasenotes/notes/client-side-rate-limiting-dec43fc9b54f5b70.yaml
releasenotes/notes/collect-timing-85f007f0d86c8b26.yaml
releasenotes/notes/drop-py-2-7-f90c67a5db0dfeb8.yaml
+releasenotes/notes/drop-python-3.5-362bb9d47f830353.yaml
releasenotes/notes/expose-endpoint-status-6195a6b76d8a8de8.yaml
releasenotes/notes/filter-versions-service-type-763af68092344b7a.yaml
releasenotes/notes/fix-get-all-version-data-a01ee58524755b9b.yaml
@@ -234,6 +240,7 @@
releasenotes/notes/ironic-microversions-a69bf92ab21f0cf5.yaml
releasenotes/notes/ksa_2.2.0-81145229d4b43043.yaml
releasenotes/notes/microversion-header-support-901acd820a21d788.yaml
+releasenotes/notes/noauth-discovery-c26d82a32c36d41d.yaml
releasenotes/notes/none-auth-dab13ab9af6f5c86.yaml
releasenotes/notes/oslo-config-split-loggers-6bda266d657fe921.yaml
releasenotes/notes/retries-limit-dbaedcb3207934ae.yaml
@@ -256,5 +263,6 @@
releasenotes/source/stein.rst
releasenotes/source/train.rst
releasenotes/source/unreleased.rst
+releasenotes/source/ussuri.rst
releasenotes/source/_static/.placeholder
releasenotes/source/_templates/.placeholder
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1.egg-info/entry_points.txt
new/keystoneauth1-4.2.1/keystoneauth1.egg-info/entry_points.txt
--- old/keystoneauth1-4.0.0/keystoneauth1.egg-info/entry_points.txt
2020-04-02 16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1.egg-info/entry_points.txt
2020-08-04 11:17:27.000000000 +0200
@@ -1,5 +1,6 @@
[keystoneauth1.plugin]
admin_token = keystoneauth1.loading._plugins.admin_token:AdminToken
+http_basic = keystoneauth1.loading._plugins.http_basic:HTTPBasicAuth
none = keystoneauth1.loading._plugins.noauth:NoAuth
password = keystoneauth1.loading._plugins.identity.generic:Password
token = keystoneauth1.loading._plugins.identity.generic:Token
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/keystoneauth1.egg-info/pbr.json
new/keystoneauth1-4.2.1/keystoneauth1.egg-info/pbr.json
--- old/keystoneauth1-4.0.0/keystoneauth1.egg-info/pbr.json 2020-04-02
16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1.egg-info/pbr.json 2020-08-04
11:17:27.000000000 +0200
@@ -1 +1 @@
-{"git_version": "c096099", "is_release": true}
\ No newline at end of file
+{"git_version": "c2d2e7a", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/keystoneauth1.egg-info/requires.txt
new/keystoneauth1-4.2.1/keystoneauth1.egg-info/requires.txt
--- old/keystoneauth1-4.0.0/keystoneauth1.egg-info/requires.txt 2020-04-02
16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/keystoneauth1.egg-info/requires.txt 2020-08-04
11:17:27.000000000 +0200
@@ -1,9 +1,9 @@
-pbr!=2.1.0,>=2.0.0
iso8601>=0.1.11
+os-service-types>=1.2.0
+pbr!=2.1.0,>=2.0.0
requests>=2.14.2
six>=1.10.0
stevedore>=1.20.0
-os-service-types>=1.2.0
[betamax]
betamax>=0.7.0
@@ -17,27 +17,26 @@
oauthlib>=0.6.2
[saml2]
-lxml!=3.7.0,>=3.4.1
+lxml>=4.2.0
[test]
-hacking<3.1.0,>=3.0
-flake8-docstrings==0.2.1.post1
-flake8-import-order>=0.17.1
+PyYAML>=3.12
bandit<1.6.0,>=1.1.0
+betamax>=0.7.0
coverage!=4.4,>=4.0
fixtures>=3.0.0
-mock>=2.0.0
+flake8-docstrings==0.2.1.post1
+flake8-import-order>=0.17.1
+hacking<3.1.0,>=3.0.1
+lxml>=4.2.0
+oauthlib>=0.6.2
oslo.config>=5.2.0
-openstackdocstheme>=1.18.1
oslo.utils>=3.33.0
oslotest>=3.2.0
-betamax>=0.7.0
-reno>=2.5.0
+pycodestyle<2.6.0,>=2.0.0
+reno>=3.1.0
+requests-kerberos>=0.8.0
requests-mock>=1.2.0
stestr>=1.0.0
testresources>=2.0.0
testtools>=2.2.0
-PyYAML>=3.12
-requests-kerberos>=0.8.0
-lxml!=3.7.0,>=3.4.1
-oauthlib>=0.6.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/lower-constraints.txt
new/keystoneauth1-4.2.1/lower-constraints.txt
--- old/keystoneauth1-4.0.0/lower-constraints.txt 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/lower-constraints.txt 2020-08-04
11:15:42.000000000 +0200
@@ -1,67 +1,48 @@
-alabaster==0.7.10
appdirs==1.4.3
-Babel==2.5.3
+Babel==2.8.0
bandit==1.1.0
betamax==0.7.0
certifi==2018.1.18
-chardet==3.0.4
-cliff==2.11.0
-cmd2==0.8.1
coverage==4.0
debtcollector==1.19.0
-docutils==0.14
dulwich==0.19.0
+entrypoints==0.3
extras==1.0.0
fixtures==3.0.0
future==0.16.0
gitdb2==2.0.3
GitPython==2.1.8
-idna==2.6
-imagesize==1.0.0
iso8601==0.1.11
-Jinja2==2.10
linecache2==1.0.0
-lxml==3.4.1
-MarkupSafe==1.0
-mccabe==0.2.1
+lxml==4.2.0
mock==2.0.0
monotonic==1.4
mox3==0.25.0
netaddr==0.7.19
netifaces==0.10.6
oauthlib==0.6.2
-openstack-requirements==1.2.0
-openstackdocstheme==1.18.1
os-client-config==1.29.0
os-service-types==1.2.0
oslo.config==5.2.0
oslo.i18n==3.20.0
oslo.utils==3.33.0
oslotest==3.2.0
-packaging==17.1
-Parsley==1.3
pbr==2.0.0
pep257==0.7.0
-prettytable==0.7.2
-pycodestyle==2.3.1
-Pygments==2.2.0
+pykerberos==1.2.1
pyparsing==2.2.0
-pyperclip==1.6.0
python-mimeparse==1.6.0
python-subunit==1.2.0
pytz==2018.3
PyYAML==3.12
-reno==2.5.0
+reno==3.1.0
+requests==2.14.2
requests-kerberos==0.8.0
requests-mock==1.2.0
-requests==2.14.2
requestsexceptions==1.4.0
rfc3986==1.1.0
six==1.10.0
smmap2==2.0.3
-snowballstemmer==1.2.1
-Sphinx==1.6.2
-sphinxcontrib-websupport==1.0.1
stestr==1.0.0
stevedore==1.20.0
testrepository==0.0.20
@@ -70,5 +51,4 @@
traceback2==1.4.0
unittest2==1.1.0
urllib3==1.22
-voluptuous==0.11.1
wrapt==1.10.11
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/releasenotes/notes/basic-http-auth-45bea4298209df75.yaml
new/keystoneauth1-4.2.1/releasenotes/notes/basic-http-auth-45bea4298209df75.yaml
---
old/keystoneauth1-4.0.0/releasenotes/notes/basic-http-auth-45bea4298209df75.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/keystoneauth1-4.2.1/releasenotes/notes/basic-http-auth-45bea4298209df75.yaml
2020-08-04 11:15:42.000000000 +0200
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ A new ``http_basic`` auth plugin is added which enables HTTP Basic
+ authentication for standalone services. Like the ``noauth`` plugin, the
+ ``endpoint`` needs to be specified explicitly, along with the
+ ``username`` and ``password``.
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/releasenotes/notes/bug-1876317-1db97d1b12a3e4b4.yaml
new/keystoneauth1-4.2.1/releasenotes/notes/bug-1876317-1db97d1b12a3e4b4.yaml
---
old/keystoneauth1-4.0.0/releasenotes/notes/bug-1876317-1db97d1b12a3e4b4.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/keystoneauth1-4.2.1/releasenotes/notes/bug-1876317-1db97d1b12a3e4b4.yaml
2020-08-04 11:15:42.000000000 +0200
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ [`bug 1876317 <https://bugs.launchpad.net/keystoneauth/+bug/1876317>`_]
+ The v3 authentication plugins now attempt to add /v3 to the token path if
+ it's not present on the authentication URL.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/releasenotes/notes/drop-python-3.5-362bb9d47f830353.yaml
new/keystoneauth1-4.2.1/releasenotes/notes/drop-python-3.5-362bb9d47f830353.yaml
---
old/keystoneauth1-4.0.0/releasenotes/notes/drop-python-3.5-362bb9d47f830353.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/keystoneauth1-4.2.1/releasenotes/notes/drop-python-3.5-362bb9d47f830353.yaml
2020-08-04 11:15:42.000000000 +0200
@@ -0,0 +1,4 @@
+---
+upgrade:
+ - |
+ Python 3.5 is no longer supported.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-4.0.0/releasenotes/notes/noauth-discovery-c26d82a32c36d41d.yaml
new/keystoneauth1-4.2.1/releasenotes/notes/noauth-discovery-c26d82a32c36d41d.yaml
---
old/keystoneauth1-4.0.0/releasenotes/notes/noauth-discovery-c26d82a32c36d41d.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/keystoneauth1-4.2.1/releasenotes/notes/noauth-discovery-c26d82a32c36d41d.yaml
2020-08-04 11:15:42.000000000 +0200
@@ -0,0 +1,5 @@
+---
+fixes:
+ - |
+ Fixes ``get_api_major_version`` for non-keystone authentication methods
+ when the provided endpoint is not versioned.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/releasenotes/source/conf.py
new/keystoneauth1-4.2.1/releasenotes/source/conf.py
--- old/keystoneauth1-4.0.0/releasenotes/source/conf.py 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/releasenotes/source/conf.py 2020-08-04
11:15:42.000000000 +0200
@@ -97,7 +97,7 @@
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = 'native'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
@@ -146,11 +146,6 @@
# directly to the root of the documentation.
# html_extra_path = []
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-# html_last_updated_fmt = '%b %d, %Y'
-html_last_updated_fmt = '%Y-%m-%d %H:%M'
-
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True
@@ -278,6 +273,7 @@
locale_dirs = ['locale/']
# -- Options for openstackdocstheme -------------------------------------------
-repository_name = 'openstack/keystoneauth'
-bug_project = 'keystoneauth'
-bug_tag = 'doc'
+openstackdocs_repo_name = 'openstack/keystoneauth'
+openstackdocs_auto_name = False
+openstackdocs_bug_project = 'keystoneauth'
+openstackdocs_bug_tag = 'doc'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/releasenotes/source/index.rst
new/keystoneauth1-4.2.1/releasenotes/source/index.rst
--- old/keystoneauth1-4.0.0/releasenotes/source/index.rst 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/releasenotes/source/index.rst 2020-08-04
11:15:42.000000000 +0200
@@ -6,6 +6,7 @@
:maxdepth: 1
unreleased
+ ussuri
train
stein
rocky
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/releasenotes/source/ussuri.rst
new/keystoneauth1-4.2.1/releasenotes/source/ussuri.rst
--- old/keystoneauth1-4.0.0/releasenotes/source/ussuri.rst 1970-01-01
01:00:00.000000000 +0100
+++ new/keystoneauth1-4.2.1/releasenotes/source/ussuri.rst 2020-08-04
11:15:42.000000000 +0200
@@ -0,0 +1,6 @@
+===========================
+Ussuri Series Release Notes
+===========================
+
+.. release-notes::
+ :branch: stable/ussuri
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/setup.cfg
new/keystoneauth1-4.2.1/setup.cfg
--- old/keystoneauth1-4.0.0/setup.cfg 2020-04-02 16:34:05.000000000 +0200
+++ new/keystoneauth1-4.2.1/setup.cfg 2020-08-04 11:17:27.000000000 +0200
@@ -6,6 +6,7 @@
author = OpenStack
author-email = [email protected]
home-page = https://docs.openstack.org/keystoneauth/latest/
+python-requires = >=3.6
classifier =
Environment :: OpenStack
Intended Audience :: Information Technology
@@ -13,9 +14,12 @@
License :: OSI Approved :: Apache Software License
Operating System :: POSIX :: Linux
Programming Language :: Python
+ Programming Language :: Python :: Implementation :: CPython
+ Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
+ Programming Language :: Python :: 3.8
[files]
packages =
@@ -25,7 +29,7 @@
kerberos =
requests-kerberos>=0.8.0 # ISC
saml2 =
- lxml!=3.7.0,>=3.4.1 # BSD
+ lxml>=4.2.0 # BSD
oauth1 =
oauthlib>=0.6.2 # BSD
betamax =
@@ -36,6 +40,7 @@
[entry_points]
keystoneauth1.plugin =
none = keystoneauth1.loading._plugins.noauth:NoAuth
+ http_basic = keystoneauth1.loading._plugins.http_basic:HTTPBasicAuth
password = keystoneauth1.loading._plugins.identity.generic:Password
token = keystoneauth1.loading._plugins.identity.generic:Token
admin_token = keystoneauth1.loading._plugins.admin_token:AdminToken
@@ -57,19 +62,6 @@
v3applicationcredential =
keystoneauth1.loading._plugins.identity.v3:ApplicationCredential
v3multifactor = keystoneauth1.loading._plugins.identity.v3:MultiFactor
-[build_sphinx]
-source-dir = doc/source
-build-dir = doc/build
-all_files = 1
-warning-is-error = 1
-
-[pbr]
-autodoc_tree_index_modules = True
-autodoc_tree_excludes = setup.py
-
-[upload_sphinx]
-upload-dir = doc/build/html
-
[egg_info]
tag_build =
tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/setup.py
new/keystoneauth1-4.2.1/setup.py
--- old/keystoneauth1-4.0.0/setup.py 2020-04-02 16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/setup.py 2020-08-04 11:15:42.000000000 +0200
@@ -13,17 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
import setuptools
-# In python < 2.7.4, a lazy loading of package `pbr` will break
-# setuptools if some other modules registered functions in `atexit`.
-# solution from: http://bugs.python.org/issue15881#msg170215
-try:
- import multiprocessing # noqa
-except ImportError:
- pass
-
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-4.0.0/test-requirements.txt
new/keystoneauth1-4.2.1/test-requirements.txt
--- old/keystoneauth1-4.0.0/test-requirements.txt 2020-04-02
16:32:45.000000000 +0200
+++ new/keystoneauth1-4.2.1/test-requirements.txt 2020-08-04
11:15:42.000000000 +0200
@@ -2,25 +2,24 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-hacking>=3.0,<3.1.0 # Apache-2.0
+hacking>=3.0.1,<3.1.0 # Apache-2.0
flake8-docstrings==0.2.1.post1 # MIT
flake8-import-order>=0.17.1 #LGPLv3
+pycodestyle>=2.0.0,<2.6.0 # MIT
bandit<1.6.0,>=1.1.0 # Apache-2.0
coverage!=4.4,>=4.0 # Apache-2.0
fixtures>=3.0.0 # Apache-2.0/BSD
-mock>=2.0.0 # BSD
oslo.config>=5.2.0 # Apache-2.0
-openstackdocstheme>=1.18.1 # Apache-2.0
oslo.utils>=3.33.0 # Apache-2.0
oslotest>=3.2.0 # Apache-2.0
betamax>=0.7.0 # Apache-2.0
-reno>=2.5.0 # Apache-2.0
+reno>=3.1.0 # Apache-2.0
requests-mock>=1.2.0 # Apache-2.0
stestr>=1.0.0 # Apache-2.0
testresources>=2.0.0 # Apache-2.0/BSD
testtools>=2.2.0 # MIT
PyYAML>=3.12 # MIT
requests-kerberos>=0.8.0 # ISC
-lxml!=3.7.0,>=3.4.1 # BSD
+lxml>=4.2.0 # BSD
oauthlib>=0.6.2 # BSD