Hello community,
here is the log from the commit of package python-keystoneauth1 for
openSUSE:Factory checked in at 2018-02-14 10:50:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-keystoneauth1 (Old)
and /work/SRC/openSUSE:Factory/.python-keystoneauth1.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-keystoneauth1"
Wed Feb 14 10:50:31 2018 rev:6 rq:575937 version:3.4.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-keystoneauth1/python-keystoneauth1.changes
2018-01-13 21:43:13.566440685 +0100
+++
/work/SRC/openSUSE:Factory/.python-keystoneauth1.new/python-keystoneauth1.changes
2018-02-14 10:50:32.792006145 +0100
@@ -1,0 +2,16 @@
+Mon Feb 12 09:57:34 UTC 2018 - [email protected]
+
+- update to version 3.4.0 (bsc#1078607)
+ - Implement system scope
+ - Make none auth usable in CLI
+ - Mark SAML loader properties as required
+ - Shift additional_user_agent in the stack
+ - Fix docs builds
+ - Use stestr in tox.ini
+ - Add documentation and release note for app creds
+ - Add osc, shade and sdk tips jobs
+ - Add support for application credentials
+ - Updated from global requirements
+ - Fix masked variable name
+
+-------------------------------------------------------------------
Old:
----
keystoneauth1-3.3.0.tar.gz
New:
----
keystoneauth1-3.4.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-keystoneauth1.spec ++++++
--- /var/tmp/diff_new_pack.70mpQU/_old 2018-02-14 10:50:33.483981243 +0100
+++ /var/tmp/diff_new_pack.70mpQU/_new 2018-02-14 10:50:33.483981243 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-keystoneauth1
#
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%global sname keystoneauth1
Name: python-keystoneauth1
-Version: 3.3.0
+Version: 3.4.0
Release: 0
Summary: OpenStack authenticating tools
License: Apache-2.0
@@ -34,9 +34,9 @@
BuildRequires: python2-mock >= 2.0.0
BuildRequires: python2-oauthlib >= 0.6.0
BuildRequires: python2-os-testr >= 1.0.0
-BuildRequires: python2-oslo.config >= 4.6.0
-BuildRequires: python2-oslo.utils >= 3.31.0
-BuildRequires: python2-oslotest >= 1.10.0
+BuildRequires: python2-oslo.config >= 5.1.0
+BuildRequires: python2-oslo.utils >= 3.33.0
+BuildRequires: python2-oslotest >= 3.2.0
BuildRequires: python2-pbr >= 2.0.0
BuildRequires: python2-positional
BuildRequires: python2-pycrypto >= 2.6
@@ -53,9 +53,9 @@
BuildRequires: python3-mock >= 2.0.0
BuildRequires: python3-oauthlib >= 0.6.0
BuildRequires: python3-os-testr >= 1.0.0
-BuildRequires: python3-oslo.config >= 4.6.0
-BuildRequires: python3-oslo.utils >= 3.31.0
-BuildRequires: python3-oslotest >= 1.10.0
+BuildRequires: python3-oslo.config >= 5.1.0
+BuildRequires: python3-oslo.utils >= 3.33.0
+BuildRequires: python3-oslotest >= 3.2.0
BuildRequires: python3-pbr >= 2.0.0
BuildRequires: python3-positional
BuildRequires: python3-pycrypto >= 2.6
++++++ keystoneauth1-3.3.0.tar.gz -> keystoneauth1-3.4.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/.zuul.yaml
new/keystoneauth1-3.4.0/.zuul.yaml
--- old/keystoneauth1-3.3.0/.zuul.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/keystoneauth1-3.4.0/.zuul.yaml 2018-01-21 18:16:03.000000000 +0100
@@ -0,0 +1,8 @@
+- project:
+ name: openstack/keystoneauth
+ templates:
+ - openstacksdk-functional-tips
+ - openstacksdk-tox-tips
+ - osc-tox-unit-tips
+ - shade-functional-tips
+ - shade-tox-tips
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/AUTHORS
new/keystoneauth1-3.4.0/AUTHORS
--- old/keystoneauth1-3.3.0/AUTHORS 2017-11-29 22:54:05.000000000 +0100
+++ new/keystoneauth1-3.4.0/AUTHORS 2018-01-21 18:18:04.000000000 +0100
@@ -31,6 +31,7 @@
Clenimar Sousa <[email protected]>
Clint Byrum <[email protected]>
Colleen Murphy <[email protected]>
+Colleen Murphy <[email protected]>
Colleen Murphy <[email protected]>
Corey Bryant <[email protected]>
Cyril Roelandt <[email protected]>
@@ -144,6 +145,7 @@
Victor Stinner <[email protected]>
Vincent Untz <[email protected]>
Vishvananda Ishaya <[email protected]>
+Vladyslav Drok <[email protected]>
Vu Cong Tuan <[email protected]>
Wu Wenxiang <[email protected]>
YangLei <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/ChangeLog
new/keystoneauth1-3.4.0/ChangeLog
--- old/keystoneauth1-3.3.0/ChangeLog 2017-11-29 22:54:05.000000000 +0100
+++ new/keystoneauth1-3.4.0/ChangeLog 2018-01-21 18:18:03.000000000 +0100
@@ -1,12 +1,29 @@
CHANGES
=======
+3.4.0
+-----
+
+* Add documentation and release note for app creds
+* Add support for application credentials
+* Updated from global requirements
+* Implement system scope
+* Use stestr in tox.ini
+* Updated from global requirements
+* Fix masked variable name
+* Shift additional\_user\_agent in the stack
+* Updated from global requirements
+* Fix docs builds
+* Add osc, shade and sdk tips jobs
+* Mark SAML loader properties as required
+
3.3.0
-----
* Remove setting of version/release from releasenotes
* Updated from global requirements
* Updated from global requirements
+* Make none auth usable in CLI
* Add EndpointData.\_\_str\_\_ for debugging
* Correct docs usage of keystoneauth1 session
* Updated from global requirements
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/PKG-INFO
new/keystoneauth1-3.4.0/PKG-INFO
--- old/keystoneauth1-3.3.0/PKG-INFO 2017-11-29 22:54:06.000000000 +0100
+++ new/keystoneauth1-3.4.0/PKG-INFO 2018-01-21 18:18:05.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: keystoneauth1
-Version: 3.3.0
+Version: 3.4.0
Summary: Authentication Library for OpenStack Identity
Home-page: https://docs.openstack.org/keystoneauth/latest/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/doc/requirements.txt
new/keystoneauth1-3.4.0/doc/requirements.txt
--- old/keystoneauth1-3.3.0/doc/requirements.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/keystoneauth1-3.4.0/doc/requirements.txt 2018-01-21
18:16:03.000000000 +0100
@@ -0,0 +1,19 @@
+# The order of packages is significant, because pip processes them in the order
+# of appearance. Changing the order has an impact on the overall integration
+# process, which may cause wedges in the gate later.
+
+# For generationg sphinx documentation
+openstackdocstheme>=1.17.0 # Apache-2.0
+reno>=2.5.0 # Apache-2.0
+sphinx!=1.6.6,>=1.6.2 # 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.1.0 # Apache-2.0
+oslo.utils>=3.33.0 # Apache-2.0
+requests-mock>=1.1.0 # Apache-2.0
+lxml!=3.7.0,>=3.4.1 # BSD
+oauthlib>=0.6.0 # BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/doc/source/authentication-plugins.rst
new/keystoneauth1-3.4.0/doc/source/authentication-plugins.rst
--- old/keystoneauth1-3.3.0/doc/source/authentication-plugins.rst
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/doc/source/authentication-plugins.rst
2018-01-21 18:16:26.000000000 +0100
@@ -59,6 +59,8 @@
a V3 identity service using Time-Based One-Time Password (TOTP).
- :py:class:`~keystoneauth1.identity.v3.TokenlessAuth`: Authenticate against
a V3 identity service using tokenless authentication.
+- :py:class:`~keystoneauth1.identity.v3.ApplicationCredentialMethod`:
+ Authenticate against a V3 identity service using an application credential.
- :py:class:`~keystoneauth1.extras.kerberos.KerberosMethod`: Authenticate
against a V3 identity service using Kerberos.
@@ -179,6 +181,29 @@
>>> s = session.Session(auth=a)
+Application Credentials
+=======================
+
+There is a specific authentication method for interacting with Identity servers
+that support application credential authentication. Since application
+credentials are associated to a user on a specific project, some parameters are
+not required as they would be with traditional password authentication. The
+following method can be used to authenticate for a token using an application
+credential::
+
+- :py:class:`~keystoneauth1.identity.v3.ApplicationCredential`:
+
+The following example shows the method usage with a session::
+
+ >>> from keystoneauth1 import session
+ >>> from keystone.identity import v3
+ >>> auth = v3.ApplicationCredential(
+ application_credential_secret='application_credential_secret',
+ application_credential_id='c2872b920853478292623be94b657090'
+ )
+ >>> sess = session.Session(auth=auth)
+
+
Tokenless Auth
==============
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/keystoneauth1/access/access.py
new/keystoneauth1-3.4.0/keystoneauth1/access/access.py
--- old/keystoneauth1-3.3.0/keystoneauth1/access/access.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/access/access.py 2018-01-21
18:16:03.000000000 +0100
@@ -219,7 +219,7 @@
:returns: bool
"""
- return self.project_scoped or self.domain_scoped
+ return self.project_scoped or self.domain_scoped or self.system_scoped
@property
def project_scoped(self):
@@ -238,6 +238,14 @@
raise NotImplementedError()
@property
+ def system_scoped(self):
+ """Return true if the auth token was scoped to the system.
+
+ :returns: bool
+ """
+ raise NotImplementedError()
+
+ @property
def trust_id(self):
"""Return the trust id associated with the auth request.
@@ -492,6 +500,10 @@
return False
@property
+ def system_scoped(self):
+ return False
+
+ @property
def _trust(self):
return self._data['access']['trust']
@@ -647,6 +659,10 @@
def username(self):
return self._user['name']
+ @_missingproperty
+ def system(self):
+ return self._data['token']['system']
+
@property
def _domain(self):
return self._data['token']['domain']
@@ -690,6 +706,10 @@
except KeyError:
return False
+ @_missingproperty
+ def system_scoped(self):
+ return self._data['token']['system'].get('all', False)
+
@property
def _trust(self):
return self._data['token']['OS-TRUST:trust']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/access/service_catalog.py
new/keystoneauth1-3.4.0/keystoneauth1/access/service_catalog.py
--- old/keystoneauth1-3.3.0/keystoneauth1/access/service_catalog.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/access/service_catalog.py
2018-01-21 18:16:03.000000000 +0100
@@ -206,9 +206,9 @@
return matching_endpoints
ret = {}
- for service_type, endpoints in matching_endpoints.items():
+ for matched_service_type, endpoints in matching_endpoints.items():
if not endpoints:
- ret[service_type] = []
+ ret[matched_service_type] = []
continue
matches_by_interface = {}
for endpoint in endpoints:
@@ -216,7 +216,7 @@
matches_by_interface[endpoint.interface].append(endpoint)
best_interface = [i for i in interfaces
if i in matches_by_interface.keys()][0]
- ret[service_type] = matches_by_interface[best_interface]
+ ret[matched_service_type] = matches_by_interface[best_interface]
return ret
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/extras/_saml2/_loading.py
new/keystoneauth1-3.4.0/keystoneauth1/extras/_saml2/_loading.py
--- old/keystoneauth1-3.3.0/keystoneauth1/extras/_saml2/_loading.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/extras/_saml2/_loading.py
2018-01-21 18:16:03.000000000 +0100
@@ -29,10 +29,14 @@
options.extend([
loading.Opt('identity-provider-url',
+ required=True,
help=('An Identity Provider URL, where the SAML2 '
'authentication request will be sent.')),
- loading.Opt('username', help='Username'),
- loading.Opt('password', secret=True, help='Password')
+ loading.Opt('username', help='Username', required=True),
+ loading.Opt('password',
+ secret=True,
+ help='Password',
+ required=True)
])
return options
@@ -53,14 +57,20 @@
options.extend([
loading.Opt('identity-provider-url',
+ required=True,
help=('An Identity Provider URL, where the SAML '
'authentication request will be sent.')),
loading.Opt('service-provider-endpoint',
+ required=True,
help="Service Provider's Endpoint"),
loading.Opt('service-provider-entity-id',
+ required=True,
help="Service Provider's SAML Entity ID"),
- loading.Opt('username', help='Username'),
- loading.Opt('password', secret=True, help='Password')
+ loading.Opt('username', help='Username', required=True),
+ loading.Opt('password',
+ secret=True,
+ required=True,
+ help='Password')
])
return options
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/keystoneauth1/fixture/v3.py
new/keystoneauth1-3.4.0/keystoneauth1/fixture/v3.py
--- old/keystoneauth1-3.3.0/keystoneauth1/fixture/v3.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/fixture/v3.py 2018-01-21
18:16:03.000000000 +0100
@@ -265,6 +265,14 @@
self.root.setdefault('domain', {})['name'] = value
@property
+ def system(self):
+ return self.root.get('system', {})
+
+ @system.setter
+ def system(self, value):
+ return self.root.setdefault('system', value)
+
+ @property
def trust_id(self):
return self.root.get('OS-TRUST:trust', {}).get('id')
@@ -363,12 +371,13 @@
def validate(self):
project = self.root.get('project')
domain = self.root.get('domain')
+ system = self.root.get('system')
trust = self.root.get('OS-TRUST:trust')
catalog = self.root.get('catalog')
roles = self.root.get('roles')
scoped = project or domain or trust
- if sum((bool(project), bool(domain), bool(trust))) > 1:
+ if sum((bool(project), bool(domain), bool(trust), bool(system))) > 1:
msg = 'You cannot scope to multiple targets'
raise exception.FixtureValidationError(msg)
@@ -412,6 +421,13 @@
self.domain_id = id or uuid.uuid4().hex
self.domain_name = name or uuid.uuid4().hex
+ def set_system_scope(self):
+ # NOTE(lbragstad): In the future it might be possible to scope a token
+ # to a subset of the entire system (e.g. a specific service, region, or
+ # service within a region). Until then, the only system scope is the
+ # entire system.
+ self.system = {'all': True}
+
def set_trust_scope(self, id=None, impersonation=False,
trustee_user_id=None, trustor_user_id=None):
self.trust_id = id or uuid.uuid4().hex
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/identity/__init__.py
new/keystoneauth1-3.4.0/keystoneauth1/identity/__init__.py
--- old/keystoneauth1-3.3.0/keystoneauth1/identity/__init__.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/identity/__init__.py 2018-01-21
18:16:03.000000000 +0100
@@ -55,6 +55,9 @@
V3TokenlessAuth = v3.TokenlessAuth
"""See :class:`keystoneauth1.identity.v3.TokenlessAuth`"""
+V3ApplicationCredential = v3.ApplicationCredential
+"""See :class:`keystoneauth1.identity.v3.ApplicationCredential`"""
+
__all__ = ('BaseIdentityPlugin',
'Password',
'Token',
@@ -66,4 +69,5 @@
'V3OidcAuthorizationCode',
'V3OidcAccessToken',
'V3TOTP',
- 'V3TokenlessAuth')
+ 'V3TokenlessAuth',
+ 'V3ApplicationCredential')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/identity/generic/base.py
new/keystoneauth1-3.4.0/keystoneauth1/identity/generic/base.py
--- old/keystoneauth1-3.3.0/keystoneauth1/identity/generic/base.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/identity/generic/base.py
2018-01-21 18:16:03.000000000 +0100
@@ -41,6 +41,7 @@
project_domain_name=None,
domain_id=None,
domain_name=None,
+ system_scope=None,
trust_id=None,
default_domain_id=None,
default_domain_name=None,
@@ -54,6 +55,7 @@
self._project_domain_name = project_domain_name
self._domain_id = domain_id
self._domain_name = domain_name
+ self._system_scope = system_scope
self._trust_id = trust_id
self._default_domain_id = default_domain_id
self._default_domain_name = default_domain_name
@@ -102,6 +104,7 @@
def _v3_params(self):
"""Return the parameters that are common to v3 plugins."""
return {'trust_id': self._trust_id,
+ 'system_scope': self._system_scope,
'project_id': self._project_id,
'project_name': self._project_name,
'project_domain_id': self.project_domain_id,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/__init__.py
new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/__init__.py
--- old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/__init__.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/__init__.py
2018-01-21 18:16:03.000000000 +0100
@@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+from keystoneauth1.identity.v3.application_credential import * # noqa
from keystoneauth1.identity.v3.base import * # noqa
from keystoneauth1.identity.v3.federation import * # noqa
from keystoneauth1.identity.v3.k2k import * # noqa
@@ -20,7 +21,10 @@
from keystoneauth1.identity.v3.tokenless_auth import * # noqa
-__all__ = ('Auth',
+__all__ = ('ApplicationCredential',
+ 'ApplicationCredentialMethod',
+
+ 'Auth',
'AuthConstructor',
'AuthMethod',
'BaseAuth',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/application_credential.py
new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/application_credential.py
--- old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/application_credential.py
1970-01-01 01:00:00.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/application_credential.py
2018-01-21 18:16:03.000000000 +0100
@@ -0,0 +1,89 @@
+# Copyright 2018 SUSE Linux GmbH
+#
+# 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.identity.v3 import base
+
+
+__all__ = ('ApplicationCredentialMethod', 'ApplicationCredential')
+
+
+class ApplicationCredentialMethod(base.AuthMethod):
+ """Construct a User/Passcode based authentication method.
+
+ :param string application_credential_secret: Application credential secret.
+ :param string application_credential_id: Application credential id.
+ :param string application_credential_name: The name of the application
+ credential, if an ID is not
+ provided.
+ :param string username: Username for authentication, if an application
+ credential ID is not provided.
+ :param string user_id: User ID for authentication, if an application
+ credential ID is not provided.
+ :param string user_domain_id: User's domain ID for authentication, if an
+ application credential ID is not provided.
+ :param string user_domain_name: User's domain name for authentication, if
+ an application credential ID is not
+ provided.
+ """
+
+ _method_parameters = ['application_credential_secret',
+ 'application_credential_id',
+ 'application_credential_name',
+ 'user_id',
+ 'username',
+ 'user_domain_id',
+ 'user_domain_name']
+
+ def get_auth_data(self, session, auth, headers, **kwargs):
+ auth_data = {'secret': self.application_credential_secret}
+
+ if self.application_credential_id:
+ auth_data['id'] = self.application_credential_id
+ else:
+ auth_data['name'] = self.application_credential_name
+ auth_data['user'] = {}
+ if self.user_id:
+ auth_data['user']['id'] = self.user_id
+ elif self.username:
+ auth_data['user']['name'] = self.username
+
+ if self.user_domain_id:
+ auth_data['user']['domain'] = {'id': self.user_domain_id}
+ elif self.user_domain_name:
+ auth_data['user']['domain'] = {
+ 'name': self.user_domain_name}
+
+ return 'application_credential', auth_data
+
+ def get_cache_id_elements(self):
+ return dict(('application_credential_%s' % p, getattr(self, p))
+ for p in self._method_parameters)
+
+
+class ApplicationCredential(base.AuthConstructor):
+ """A plugin for authenticating with an application credential.
+
+ :param string auth_url: Identity service endpoint for authentication.
+ :param string application_credential_secret: Application credential secret.
+ :param string application_credential_id: Application credential ID.
+ :param string application_credential_name: Application credential name.
+ :param string username: Username for authentication.
+ :param string user_id: User ID for authentication.
+ :param string user_domain_id: User's domain ID for authentication.
+ :param string user_domain_name: User's domain name for authentication.
+ :param bool reauthenticate: Allow fetching a new token if the current one
+ is going to expire. (optional) default True
+ """
+
+ _auth_method_class = ApplicationCredentialMethod
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/base.py
new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/base.py
--- old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/base.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/base.py 2018-01-21
18:16:03.000000000 +0100
@@ -31,6 +31,7 @@
:param string auth_url: Identity service endpoint for authentication.
:param string trust_id: Trust ID for trust scoping.
+ :param string system_scope: System information to scope to.
:param string domain_id: Domain ID for domain scoping.
:param string domain_name: Domain name for domain scoping.
:param string project_id: Project ID for project scoping.
@@ -45,6 +46,7 @@
def __init__(self, auth_url,
trust_id=None,
+ system_scope=None,
domain_id=None,
domain_name=None,
project_id=None,
@@ -56,6 +58,7 @@
super(BaseAuth, self).__init__(auth_url=auth_url,
reauthenticate=reauthenticate)
self.trust_id = trust_id
+ self.system_scope = system_scope
self.domain_id = domain_id
self.domain_name = domain_name
self.project_id = project_id
@@ -78,7 +81,7 @@
"""Return true if parameters can be used to create a scoped token."""
return (self.domain_id or self.domain_name or
self.project_id or self.project_name or
- self.trust_id)
+ self.trust_id or self.system_scope)
class Auth(BaseAuth):
@@ -153,6 +156,15 @@
body['auth']['scope'] = {'OS-TRUST:trust': {'id': self.trust_id}}
elif self.unscoped:
body['auth']['scope'] = 'unscoped'
+ elif self.system_scope:
+ # NOTE(lbragstad): Right now it's only possible to have role
+ # assignments on the entire system. In the future that might change
+ # so that users and groups can have roles on parts of the system,
+ # like a specific service in a specific region. If that happens,
+ # this will have to be accounted for here. Until then we'll only
+ # support scoping to the entire system.
+ if self.system_scope == 'all':
+ body['auth']['scope'] = {'system': {'all': True}}
# NOTE(jamielennox): we add nocatalog here rather than in token_url
# directly as some federation plugins require the base token_url
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/password.py
new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/password.py
--- old/keystoneauth1-3.3.0/keystoneauth1/identity/v3/password.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/identity/v3/password.py
2018-01-21 18:16:03.000000000 +0100
@@ -62,6 +62,7 @@
:param string user_domain_id: User's domain ID for authentication.
:param string user_domain_name: User's domain name for authentication.
:param string trust_id: Trust ID for trust scoping.
+ :param string system_scope: System information to scope to.
:param string domain_id: Domain ID for domain scoping.
:param string domain_name: Domain name for domain scoping.
:param string project_id: Project ID for project scoping.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/loading/_plugins/identity/v3.py
new/keystoneauth1-3.4.0/keystoneauth1/loading/_plugins/identity/v3.py
--- old/keystoneauth1-3.3.0/keystoneauth1/loading/_plugins/identity/v3.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/loading/_plugins/identity/v3.py
2018-01-21 18:16:03.000000000 +0100
@@ -254,3 +254,43 @@
raise exceptions.OptionError(m)
return super(TokenlessAuth, self).load_from_options(**kwargs)
+
+
+class ApplicationCredential(loading.BaseV3Loader):
+
+ @property
+ def plugin_class(self):
+ return identity.V3ApplicationCredential
+
+ def get_options(self):
+ options = super(ApplicationCredential, self).get_options()
+ _add_common_identity_options(options)
+
+ options.extend([
+ loading.Opt('application_credential_secret', secret=True,
+ required=True,
+ help="Application credential auth secret"),
+ ]),
+ options.extend([
+ loading.Opt('application_credential_id',
+ help='Application credential ID'),
+ ]),
+ options.extend([
+ loading.Opt('application_credential_name',
+ help='Application credential name'),
+ ])
+
+ return options
+
+ def load_from_options(self, **kwargs):
+ _assert_identity_options(kwargs)
+ if (not kwargs.get('application_credential_id') and
+ not kwargs.get('application_credential_name')):
+ m = ('You must provide either an application credential ID or an '
+ 'application credential name and user.')
+ raise exceptions.OptionError(m)
+ if not kwargs.get('application_credential_secret'):
+ m = ('You must provide an auth secret.')
+ raise exceptions.OptionError(m)
+
+ return super(ApplicationCredential, self).load_from_options(**kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/loading/_plugins/noauth.py
new/keystoneauth1-3.4.0/keystoneauth1/loading/_plugins/noauth.py
--- old/keystoneauth1-3.3.0/keystoneauth1/loading/_plugins/noauth.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/loading/_plugins/noauth.py
2018-01-21 18:16:03.000000000 +0100
@@ -17,11 +17,12 @@
class NoAuth(loading.BaseLoader):
"""Use no tokens to perform requests.
- This must be used together with adapter.Adapter.endpoint_override
- to instantiate clients for services deployed in noauth/standalone mode.
+ This can be used to instantiate clients for services deployed in
+ noauth/standalone mode.
There is no fetching a service catalog or determining scope information
- and so it cannot be used by clients that expect use this scope information.
+ and so it cannot be used by clients that expect to use this scope
+ information.
"""
@@ -30,4 +31,11 @@
return noauth.NoAuth
def get_options(self):
- return []
+ options = super(NoAuth, self).get_options()
+
+ options.extend([
+ 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-3.3.0/keystoneauth1/loading/identity.py
new/keystoneauth1-3.4.0/keystoneauth1/loading/identity.py
--- old/keystoneauth1-3.3.0/keystoneauth1/loading/identity.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/loading/identity.py 2018-01-21
18:16:03.000000000 +0100
@@ -74,6 +74,7 @@
options = super(BaseV3Loader, self).get_options()
options.extend([
+ opts.Opt('system-scope', help='Scope for system operations'),
opts.Opt('domain-id', help='Domain ID to scope to'),
opts.Opt('domain-name', help='Domain name to scope to'),
opts.Opt('project-id', help='Project ID to scope to'),
@@ -136,6 +137,7 @@
options = super(BaseGenericLoader, self).get_options()
options.extend([
+ opts.Opt('system-scope', help='Scope for system operations'),
opts.Opt('domain-id', help='Domain ID to scope to'),
opts.Opt('domain-name', help='Domain name to scope to'),
opts.Opt('project-id', help='Project ID to scope to',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/keystoneauth1/noauth.py
new/keystoneauth1-3.4.0/keystoneauth1/noauth.py
--- old/keystoneauth1-3.3.0/keystoneauth1/noauth.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/noauth.py 2018-01-21
18:16:03.000000000 +0100
@@ -20,5 +20,18 @@
that might be deployed in standalone/noauth mode.
"""
- def get_token(self, session):
+ 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-3.3.0/keystoneauth1/session.py
new/keystoneauth1-3.4.0/keystoneauth1/session.py
--- old/keystoneauth1-3.3.0/keystoneauth1/session.py 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/session.py 2018-01-21
18:16:03.000000000 +0100
@@ -623,14 +623,14 @@
elif self.app_name:
agent.append(self.app_name)
- for additional in self.additional_user_agent:
- agent.append('%s/%s' % additional)
-
if client_name and client_version:
agent.append('%s/%s' % (client_name, client_version))
elif client_name:
agent.append(client_name)
+ for additional in self.additional_user_agent:
+ agent.append('%s/%s' % additional)
+
if not agent:
# NOTE(jamielennox): determine_user_agent will return an empty
# string on failure so checking for None will ensure it is only
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/access/test_v3_access.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/access/test_v3_access.py
--- old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/access/test_v3_access.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/access/test_v3_access.py
2018-01-21 18:16:03.000000000 +0100
@@ -73,6 +73,54 @@
self.assertTrue(auth_ref.will_expire_soon(stale_duration=301))
self.assertFalse(auth_ref.will_expire_soon())
+ def test_building_system_scoped_assessinfo(self):
+ token = fixture.V3Token()
+ token.set_system_scope()
+
+ s = token.add_service(type='identity')
+ s.add_standard_endpoints(public='http://url')
+
+ token_id = uuid.uuid4().hex
+
+ auth_ref = access.create(body=token, auth_token=token_id)
+
+ self.assertTrue(auth_ref)
+ self.assertIn('methods', auth_ref._data['token'])
+ self.assertIn('catalog', auth_ref._data['token'])
+ self.assertTrue(auth_ref.has_service_catalog())
+ self.assertTrue(auth_ref._data['token']['catalog'])
+
+ self.assertEqual(token_id, auth_ref.auth_token)
+ self.assertEqual(token.user_name, auth_ref.username)
+ self.assertEqual(token.user_id, auth_ref.user_id)
+
+ self.assertEqual(token.role_ids, auth_ref.role_ids)
+ self.assertEqual(token.role_names, auth_ref.role_names)
+
+ self.assertEqual(token.domain_name, auth_ref.domain_name)
+ self.assertEqual(token.domain_id, auth_ref.domain_id)
+
+ self.assertEqual(token.user_domain_id, auth_ref.user_domain_id)
+ self.assertEqual(token.user_domain_name, auth_ref.user_domain_name)
+
+ self.assertIsNone(auth_ref.project_name)
+ self.assertIsNone(auth_ref.project_id)
+
+ self.assertIsNone(auth_ref.project_domain_id)
+ self.assertIsNone(auth_ref.project_domain_name)
+
+ self.assertIsNone(auth_ref.domain_name)
+ self.assertIsNone(auth_ref.domain_id)
+
+ self.assertEqual(token.system, auth_ref.system)
+
+ self.assertTrue(auth_ref.system_scoped)
+ self.assertFalse(auth_ref.domain_scoped)
+ self.assertFalse(auth_ref.project_scoped)
+
+ self.assertEqual(token.audit_id, auth_ref.audit_id)
+ self.assertEqual(token.audit_chain_id, auth_ref.audit_chain_id)
+
def test_building_domain_scoped_accessinfo(self):
token = fixture.V3Token()
token.set_domain_scope()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
---
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
2017-11-29 22:52:38.000000000 +0100
+++
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/extras/kerberos/test_fedkerb_loading.py
2018-01-21 18:16:03.000000000 +0100
@@ -21,7 +21,8 @@
opts = [o.name for o in
loading.get_plugin_loader('v3fedkerb').get_options()]
- allowed_opts = ['domain-id',
+ allowed_opts = ['system-scope',
+ 'domain-id',
'domain-name',
'identity-provider',
'project-id',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
---
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
2017-11-29 22:52:38.000000000 +0100
+++
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/extras/kerberos/test_kerberos_loading.py
2018-01-21 18:16:03.000000000 +0100
@@ -20,7 +20,8 @@
opts = [o.name for o in
loading.get_plugin_loader('v3kerberos').get_options()]
- allowed_opts = ['domain-id',
+ allowed_opts = ['system-scope',
+ 'domain-id',
'domain-name',
'project-id',
'project-name',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/identity/test_identity_v3.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/identity/test_identity_v3.py
---
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/identity/test_identity_v3.py
2017-11-29 22:52:38.000000000 +0100
+++
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/identity/test_identity_v3.py
2018-01-21 18:16:03.000000000 +0100
@@ -33,6 +33,9 @@
TEST_PASS = 'password'
+ TEST_APP_CRED_ID = 'appcredid'
+ TEST_APP_CRED_SECRET = 'secret'
+
TEST_SERVICE_CATALOG = [{
"endpoints": [{
"url": "http://cdn.admin-nets.local:8774/v1.0/",
@@ -186,6 +189,35 @@
"self": "https://identity:5000/v3/projects",
}
}
+ self.TEST_APP_CRED_TOKEN_RESPONSE = {
+ "token": {
+ "methods": [
+ "application_credential"
+ ],
+
+ "expires_at": "2020-01-01T00:00:10.000123Z",
+ "project": {
+ "domain": {
+ "id": self.TEST_DOMAIN_ID,
+ "name": self.TEST_DOMAIN_NAME
+ },
+ "id": self.TEST_TENANT_ID,
+ "name": self.TEST_TENANT_NAME
+ },
+ "user": {
+ "domain": {
+ "id": self.TEST_DOMAIN_ID,
+ "name": self.TEST_DOMAIN_NAME
+ },
+ "id": self.TEST_USER,
+ "name": self.TEST_USER
+ },
+ "issued_at": "2013-05-29T16:55:21.468960Z",
+ "catalog": self.TEST_SERVICE_CATALOG,
+ "service_providers": self.TEST_SERVICE_PROVIDERS,
+ "application_credential_restricted": True
+ },
+ }
def stub_auth(self, subject_token=None, **kwargs):
if not subject_token:
@@ -370,6 +402,22 @@
domain_id='x', trust_id='x')
self.assertRaises(exceptions.AuthorizationFailure, a.get_auth_ref, s)
+ def test_application_credential_method(self):
+ self.stub_auth(json=self.TEST_APP_CRED_TOKEN_RESPONSE)
+ ac = v3.ApplicationCredential(
+ self.TEST_URL, application_credential_id=self.TEST_APP_CRED_ID,
+ application_credential_secret=self.TEST_APP_CRED_SECRET)
+ req = {'auth': {'identity':
+ {'methods': ['application_credential'],
+ 'application_credential': {
+ 'id': self.TEST_APP_CRED_ID,
+ 'secret': self.TEST_APP_CRED_SECRET}}}}
+ s = session.Session(auth=ac)
+ self.assertEqual({'X-Auth-Token': self.TEST_TOKEN},
+ s.get_auth_headers())
+ self.assertRequestBodyIs(json=req)
+ self.assertEqual(s.auth.auth_ref.auth_token, self.TEST_TOKEN)
+
def _do_service_url_test(self, base_url, endpoint_filter):
self.stub_auth(json=self.TEST_RESPONSE_DICT)
self.stub_url('GET', ['path'],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/loading/test_generic.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/loading/test_generic.py
--- old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/loading/test_generic.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/loading/test_generic.py
2018-01-21 18:16:03.000000000 +0100
@@ -30,6 +30,7 @@
'user-id',
'password',
+ 'system-scope',
'domain-id',
'domain-name',
'project-id',
@@ -70,6 +71,7 @@
opts = [o.name for o in generic.Token().get_options()]
allowed_opts = ['token',
+ 'system-scope',
'domain-id',
'domain-name',
'project-id',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/loading/test_v3.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/loading/test_v3.py
--- old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/loading/test_v3.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/loading/test_v3.py
2018-01-21 18:16:03.000000000 +0100
@@ -363,3 +363,67 @@
self.assertRaises(exceptions.OptionError,
self.create,
project_name=uuid.uuid4().hex)
+
+
+class V3ApplicationCredentialTests(utils.TestCase):
+
+ def setUp(self):
+ super(V3ApplicationCredentialTests, self).setUp()
+
+ self.auth_url = uuid.uuid4().hex
+
+ def create(self, **kwargs):
+ kwargs.setdefault('auth_url', self.auth_url)
+ loader = loading.get_plugin_loader('v3applicationcredential')
+ return loader.load_from_options(**kwargs)
+
+ def test_basic(self):
+ id = uuid.uuid4().hex
+ secret = uuid.uuid4().hex
+
+ app_cred = self.create(application_credential_id=id,
+ application_credential_secret=secret)
+
+ ac_method = app_cred.auth_methods[0]
+
+ self.assertEqual(id, ac_method.application_credential_id)
+ self.assertEqual(secret, ac_method.application_credential_secret)
+
+ def test_with_name(self):
+ name = uuid.uuid4().hex
+ secret = uuid.uuid4().hex
+ username = uuid.uuid4().hex
+ user_domain_id = uuid.uuid4().hex
+
+ app_cred = self.create(application_credential_name=name,
+ application_credential_secret=secret,
+ username=username,
+ user_domain_id=user_domain_id)
+
+ ac_method = app_cred.auth_methods[0]
+
+ self.assertEqual(name, ac_method.application_credential_name)
+ self.assertEqual(secret, ac_method.application_credential_secret)
+ self.assertEqual(username, ac_method.username)
+ self.assertEqual(user_domain_id, ac_method.user_domain_id)
+
+ def test_without_user_domain(self):
+ self.assertRaises(exceptions.OptionError,
+ self.create,
+ application_credential_name=uuid.uuid4().hex,
+ username=uuid.uuid4().hex,
+ application_credential_secret=uuid.uuid4().hex)
+
+ def test_without_name_or_id(self):
+ self.assertRaises(exceptions.OptionError,
+ self.create,
+ username=uuid.uuid4().hex,
+ user_domain_id=uuid.uuid4().hex,
+ application_credential_secret=uuid.uuid4().hex)
+
+ def test_without_secret(self):
+ self.assertRaises(exceptions.OptionError,
+ self.create,
+ application_credential_id=uuid.uuid4().hex,
+ username=uuid.uuid4().hex,
+ user_domain_id=uuid.uuid4().hex)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/test_noauth.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/test_noauth.py
--- old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/test_noauth.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/test_noauth.py
2018-01-21 18:16:03.000000000 +0100
@@ -34,4 +34,15 @@
self.assertIsNone(a.get_endpoint(s))
def test_noauth_options(self):
- self.assertEqual([], loader.NoAuth().get_options())
+ opts = loader.NoAuth().get_options()
+ self.assertEqual(['endpoint'], [o.name for o in opts])
+
+ def test_get_endpoint(self):
+ a = noauth.NoAuth(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 = noauth.NoAuth(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-3.3.0/keystoneauth1/tests/unit/test_session.py
new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/test_session.py
--- old/keystoneauth1-3.3.0/keystoneauth1/tests/unit/test_session.py
2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1/tests/unit/test_session.py
2018-01-21 18:16:03.000000000 +0100
@@ -1307,7 +1307,7 @@
adap.get(url)
- agent = 'ksatest/1.2.3 one/1.1.1 two/2.2.2 testclient/4.5.6'
+ agent = 'ksatest/1.2.3 testclient/4.5.6 one/1.1.1 two/2.2.2'
self.assertEqual(agent + ' ' + client_session.DEFAULT_USER_AGENT,
self.requests_mock.last_request.headers['User-Agent'])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/keystoneauth1.egg-info/PKG-INFO
new/keystoneauth1-3.4.0/keystoneauth1.egg-info/PKG-INFO
--- old/keystoneauth1-3.3.0/keystoneauth1.egg-info/PKG-INFO 2017-11-29
22:54:05.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1.egg-info/PKG-INFO 2018-01-21
18:18:04.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: keystoneauth1
-Version: 3.3.0
+Version: 3.4.0
Summary: Authentication Library for OpenStack Identity
Home-page: https://docs.openstack.org/keystoneauth/latest/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1.egg-info/SOURCES.txt
new/keystoneauth1-3.4.0/keystoneauth1.egg-info/SOURCES.txt
--- old/keystoneauth1-3.3.0/keystoneauth1.egg-info/SOURCES.txt 2017-11-29
22:54:06.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1.egg-info/SOURCES.txt 2018-01-21
18:18:05.000000000 +0100
@@ -1,6 +1,7 @@
.coveragerc
.mailmap
.stestr.conf
+.zuul.yaml
AUTHORS
CONTRIBUTING.rst
ChangeLog
@@ -15,6 +16,7 @@
tox.ini
doc/.gitignore
doc/Makefile
+doc/requirements.txt
doc/ext/__init__.py
doc/ext/list_plugins.py
doc/source/authentication-plugins.rst
@@ -91,6 +93,7 @@
keystoneauth1/identity/generic/password.py
keystoneauth1/identity/generic/token.py
keystoneauth1/identity/v3/__init__.py
+keystoneauth1/identity/v3/application_credential.py
keystoneauth1/identity/v3/base.py
keystoneauth1/identity/v3/federation.py
keystoneauth1/identity/v3/k2k.py
@@ -201,6 +204,8 @@
releasenotes/notes/add-totp-auth-plugin-0650d220899c25b7.yaml
releasenotes/notes/additional-headers-f2d16f85f5abe942.yaml
releasenotes/notes/allow_version_hack-flag-9b53b72d9b084c04.yaml
+releasenotes/notes/bp-application-credentials-416a1f8bb2311e04.yaml
+releasenotes/notes/bp-system-scope-29e9c597039ddb1e.yaml
releasenotes/notes/bug-1582774-49af731b6dfc6f2f.yaml
releasenotes/notes/bug-1614688-c4a1bd54f4ba5644.yaml
releasenotes/notes/bug-1616105-cc8b85eb056e99e2.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/keystoneauth1.egg-info/entry_points.txt
new/keystoneauth1-3.4.0/keystoneauth1.egg-info/entry_points.txt
--- old/keystoneauth1-3.3.0/keystoneauth1.egg-info/entry_points.txt
2017-11-29 22:54:05.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1.egg-info/entry_points.txt
2018-01-21 18:18:04.000000000 +0100
@@ -6,6 +6,7 @@
v2password = keystoneauth1.loading._plugins.identity.v2:Password
v2token = keystoneauth1.loading._plugins.identity.v2:Token
v3adfspassword = keystoneauth1.extras._saml2._loading:ADFSPassword
+v3applicationcredential =
keystoneauth1.loading._plugins.identity.v3:ApplicationCredential
v3fedkerb = keystoneauth1.extras.kerberos._loading:MappedKerberos
v3kerberos = keystoneauth1.extras.kerberos._loading:Kerberos
v3oauth1 = keystoneauth1.extras.oauth1._loading:V3OAuth1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/keystoneauth1.egg-info/pbr.json
new/keystoneauth1-3.4.0/keystoneauth1.egg-info/pbr.json
--- old/keystoneauth1-3.3.0/keystoneauth1.egg-info/pbr.json 2017-11-29
22:54:05.000000000 +0100
+++ new/keystoneauth1-3.4.0/keystoneauth1.egg-info/pbr.json 2018-01-21
18:18:04.000000000 +0100
@@ -1 +1 @@
-{"git_version": "ba6650e", "is_release": true}
\ No newline at end of file
+{"git_version": "d4a552c", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/releasenotes/notes/bp-application-credentials-416a1f8bb2311e04.yaml
new/keystoneauth1-3.4.0/releasenotes/notes/bp-application-credentials-416a1f8bb2311e04.yaml
---
old/keystoneauth1-3.3.0/releasenotes/notes/bp-application-credentials-416a1f8bb2311e04.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/keystoneauth1-3.4.0/releasenotes/notes/bp-application-credentials-416a1f8bb2311e04.yaml
2018-01-21 18:16:26.000000000 +0100
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ [`blueprint application-credentials
<https://blueprints.launchpad.net/keystone/+spec/application-credentials>`_]
+ Support for authentication via an application credential has been added.
+ Keystoneauth can now be used to authenticate to Identity servers that
+ support application credentials.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/keystoneauth1-3.3.0/releasenotes/notes/bp-system-scope-29e9c597039ddb1e.yaml
new/keystoneauth1-3.4.0/releasenotes/notes/bp-system-scope-29e9c597039ddb1e.yaml
---
old/keystoneauth1-3.3.0/releasenotes/notes/bp-system-scope-29e9c597039ddb1e.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/keystoneauth1-3.4.0/releasenotes/notes/bp-system-scope-29e9c597039ddb1e.yaml
2018-01-21 18:16:03.000000000 +0100
@@ -0,0 +1,8 @@
+---
+features:
+ - |
+ [`blueprint system-scope
<https://blueprints.launchpad.net/keystone/+spec/system-scope>`_]
+ Keystoneauth now has the ability to authenticate for system-scoped tokens,
+ which were implemented during the Queens development cycle. System-scoped
+ tokens will eventually be required to separate system-level APIs from
+ project-level APIs, allowing for better security via scoped RBAC.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/setup.cfg
new/keystoneauth1-3.4.0/setup.cfg
--- old/keystoneauth1-3.3.0/setup.cfg 2017-11-29 22:54:06.000000000 +0100
+++ new/keystoneauth1-3.4.0/setup.cfg 2018-01-21 18:18:05.000000000 +0100
@@ -55,6 +55,7 @@
v3tokenlessauth =
keystoneauth1.loading._plugins.identity.v3:TokenlessAuth
v3adfspassword = keystoneauth1.extras._saml2._loading:ADFSPassword
v3samlpassword = keystoneauth1.extras._saml2._loading:Saml2Password
+ v3applicationcredential =
keystoneauth1.loading._plugins.identity.v3:ApplicationCredential
[build_sphinx]
source-dir = doc/source
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/keystoneauth1-3.3.0/test-requirements.txt
new/keystoneauth1-3.4.0/test-requirements.txt
--- old/keystoneauth1-3.3.0/test-requirements.txt 2017-11-29
22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/test-requirements.txt 2018-01-21
18:16:03.000000000 +0100
@@ -9,15 +9,15 @@
coverage!=4.4,>=4.0 # Apache-2.0
fixtures>=3.0.0 # Apache-2.0/BSD
mock>=2.0.0 # BSD
-oslo.config>=4.6.0 # Apache-2.0
+oslo.config>=5.1.0 # Apache-2.0
openstackdocstheme>=1.17.0 # Apache-2.0
-oslo.utils>=3.31.0 # Apache-2.0
-oslotest>=1.10.0 # Apache-2.0
+oslo.utils>=3.33.0 # Apache-2.0
+oslotest>=3.2.0 # Apache-2.0
os-testr>=1.0.0 # Apache-2.0
betamax>=0.7.0 # Apache-2.0
reno>=2.5.0 # Apache-2.0
requests-mock>=1.1.0 # Apache-2.0
-sphinx>=1.6.2 # BSD
+sphinx!=1.6.6,>=1.6.2 # BSD
stestr>=1.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/keystoneauth1-3.3.0/tox.ini
new/keystoneauth1-3.4.0/tox.ini
--- old/keystoneauth1-3.3.0/tox.ini 2017-11-29 22:52:38.000000000 +0100
+++ new/keystoneauth1-3.4.0/tox.ini 2018-01-21 18:16:03.000000000 +0100
@@ -15,7 +15,7 @@
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
.[kerberos,saml2,betamax,oauth1]
-commands = ostestr {posargs}
+commands = stestr run {posargs}
whitelist_externals =
bash
@@ -63,12 +63,14 @@
exclude = .venv,.tox,dist,doc,*egg,build
[testenv:docs]
+deps = -r{toxinidir}/doc/requirements.txt
commands=
bash -c "rm -rf doc/build"
bash -c "rm -rf doc/source/api"
python setup.py build_sphinx
[testenv:releasenotes]
+deps = -r{toxinidir}/doc/requirements.txt
commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html
releasenotes/source releasenotes/build/html
[hacking]