Hello community,
here is the log from the commit of package python-keystoneclient for
openSUSE:Leap:15.2 checked in at 2020-06-08 15:11:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-keystoneclient (Old)
and /work/SRC/openSUSE:Leap:15.2/.python-keystoneclient.new.3606 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-keystoneclient"
Mon Jun 8 15:11:58 2020 rev:27 rq:812550 version:3.17.0
Changes:
--------
---
/work/SRC/openSUSE:Leap:15.2/python-keystoneclient/python-keystoneclient.changes
2020-01-15 15:49:46.923471989 +0100
+++
/work/SRC/openSUSE:Leap:15.2/.python-keystoneclient.new.3606/python-keystoneclient.changes
2020-06-08 15:11:58.825000099 +0200
@@ -1,0 +2,22 @@
+Tue Jun 2 04:05:59 UTC 2020 - [email protected]
+
+- Switch to stable/rocky spec template as 3.15.0 is broken
+- added 0001-Make-tests-pass-in-2020.patch
+- added 0001-Make-unit-tests-work-with-requests-mock-1.7.0.patch
+ This is needed in order to make the unit tests work with
+ request-mock 1.7.0 since we can't downgrade it
+- update to version 3.17.0
+ - Update links in README
+ - Override find function in project
+ - add lower-constraints job
+ - Fix python3 test compat
+ - fix tox python3 overrides
+ - Add support for registered limits
+ - Remove PyPI downloads
+ - Updated from global requirements
+ - fix a typo in docstring
+ - Update reno for stable/queens
+ - Trivial: Update pypi url to new url
+ - Add support for project-specific limits
+
+-------------------------------------------------------------------
Old:
----
python-keystoneclient-3.15.0.tar.gz
New:
----
0001-Make-tests-pass-in-2020.patch
0001-Make-unit-tests-work-with-requests-mock-1.7.0.patch
python-keystoneclient-3.17.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-keystoneclient.spec ++++++
--- /var/tmp/diff_new_pack.7QWAzj/_old 2020-06-08 15:11:59.361001565 +0200
+++ /var/tmp/diff_new_pack.7QWAzj/_new 2020-06-08 15:11:59.361001565 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-keystoneclient
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,61 +12,63 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: python-keystoneclient
-Version: 3.15.0
+Version: 3.17.0
Release: 0
Summary: Client library for OpenStack Identity API
License: Apache-2.0
Group: Development/Languages/Python
-Url: https://launchpad.net/python-keystoneclient
-Source0:
https://files.pythonhosted.org/packages/source/p/python-keystoneclient/python-keystoneclient-3.15.0.tar.gz
+URL: https://launchpad.net/python-keystoneclient
+Source0:
https://files.pythonhosted.org/packages/source/p/python-keystoneclient/python-keystoneclient-3.17.0.tar.gz
+Patch1: 0001-Make-tests-pass-in-2020.patch
+Patch2: 0001-Make-unit-tests-work-with-requests-mock-1.7.0.patch
BuildRequires: openssl
BuildRequires: openstack-macros
BuildRequires: python-devel
-BuildRequires: python2-debtcollector >= 1.2.0
-BuildRequires: python2-keystoneauth1 >= 3.3.0
-BuildRequires: python2-lxml >= 3.4.1
-BuildRequires: python2-mock >= 2.0.0
-BuildRequires: python2-oslo.config >= 5.1.0
-BuildRequires: python2-oslo.i18n >= 3.15.3
-BuildRequires: python2-oslo.serialization >= 2.18.0
-BuildRequires: python2-oslo.utils >= 3.33.0
-BuildRequires: python2-oslotest >= 3.2.0
-BuildRequires: python2-pbr >= 2.0.0
-BuildRequires: python2-requests-mock >= 1.1.0
+BuildRequires: python2-debtcollector
+BuildRequires: python2-keystoneauth1
+BuildRequires: python2-lxml
+BuildRequires: python2-mock
+BuildRequires: python2-oslo.config
+BuildRequires: python2-oslo.i18n
+BuildRequires: python2-oslo.serialization
+BuildRequires: python2-oslo.utils
+BuildRequires: python2-oslotest
+BuildRequires: python2-pbr
+BuildRequires: python2-requests-mock
BuildRequires: python2-six >= 1.10.0
-BuildRequires: python2-testrepository >= 0.0.18
-BuildRequires: python2-testresources >= 2.0.0
-BuildRequires: python2-testscenarios >= 0.4
-BuildRequires: python3-debtcollector >= 1.2.0
+BuildRequires: python2-testrepository
+BuildRequires: python2-testresources
+BuildRequires: python2-testscenarios
+BuildRequires: python3-debtcollector
BuildRequires: python3-devel
-BuildRequires: python3-keystoneauth1 >= 3.3.0
-BuildRequires: python3-lxml >= 3.4.1
-BuildRequires: python3-mock >= 2.0.0
-BuildRequires: python3-oslo.config >= 5.1.0
-BuildRequires: python3-oslo.i18n >= 3.15.3
-BuildRequires: python3-oslo.serialization >= 2.18.0
-BuildRequires: python3-oslo.utils >= 3.33.0
-BuildRequires: python3-oslotest >= 3.2.0
-BuildRequires: python3-pbr >= 2.0.0
-BuildRequires: python3-requests-mock >= 1.1.0
+BuildRequires: python3-keystoneauth1
+BuildRequires: python3-lxml
+BuildRequires: python3-mock
+BuildRequires: python3-oslo.config
+BuildRequires: python3-oslo.i18n
+BuildRequires: python3-oslo.serialization
+BuildRequires: python3-oslo.utils
+BuildRequires: python3-oslotest
+BuildRequires: python3-pbr
+BuildRequires: python3-requests-mock
BuildRequires: python3-six >= 1.10.0
-BuildRequires: python3-testrepository >= 0.0.18
-BuildRequires: python3-testresources >= 2.0.0
-BuildRequires: python3-testscenarios >= 0.4
-Requires: python-debtcollector >= 1.2.0
-Requires: python-keystoneauth1 >= 3.3.0
-Requires: python-oslo.config >= 5.1.0
-Requires: python-oslo.i18n >= 3.15.3
-Requires: python-oslo.serialization >= 2.18.0
-Requires: python-oslo.utils >= 3.33.0
+BuildRequires: python3-testrepository
+BuildRequires: python3-testresources
+BuildRequires: python3-testscenarios
+Requires: python-debtcollector
+Requires: python-keystoneauth1
+Requires: python-oslo.config
+Requires: python-oslo.i18n
+Requires: python-oslo.serialization
+Requires: python-oslo.utils
Requires: python-requests >= 2.14.2
Requires: python-six >= 1.10.0
-Requires: python-stevedore >= 1.20.0
+Requires: python-stevedore
BuildArch: noarch
%python_subpackages
@@ -77,14 +79,14 @@
Summary: Documentation for OpenStack Identity API Client
Group: Documentation/HTML
BuildRequires: python-Sphinx
-BuildRequires: python-openstackdocstheme >= 1.18.1
+BuildRequires: python-openstackdocstheme
%description -n python-keystoneclient-doc
Documentation for the client library for interacting with Openstack
Identity API.
%prep
-%autosetup -p1 -n python-keystoneclient-3.15.0
+%autosetup -p1 -n python-keystoneclient-3.17.0
%py_req_cleanup
# disable intersphinx - no network access during build
echo "intersphinx_mapping = {}" >> doc/source/conf.py
++++++ 0001-Make-tests-pass-in-2020.patch ++++++
>From b8ab3e95b5dca13f7133d86903df0bbe43ac786e Mon Sep 17 00:00:00 2001
From: "Bernhard M. Wiedemann" <[email protected]>
Date: Thu, 28 Feb 2019 14:06:22 +0100
Subject: [PATCH] Make tests pass in 2020
Without this patch, build failed after 2019-12-31 with
Traceback (most recent call last):
File "keystoneclient/tests/unit/v3/test_auth.py", line 226, in
test_authenticate_success_password_unscoped
self.assertRequestBodyIs(json=self.TEST_REQUEST_BODY)
File "keystoneclient/tests/unit/utils.py", line 72, in assertRequestBodyIs
self.assertEqual(json, val)
NOTE: in addition to the orginal backport, this patch also fix bandit
complains. The literal 'sha256' is the default hash algorithm, not a sensitive
password. Marking it as false positive so bandit can stop chirping.
Change-Id: I0e44d9896c5970f0ca07438c372aec826aeb5c77
(cherry picked from commit acc21ff06154e16de16583fe6994207d689ed054)
---
keystoneclient/common/cms.py | 2 +-
.../tests/unit/auth/test_identity_v2.py | 2 +-
.../tests/unit/auth/test_identity_v3.py | 2 +-
keystoneclient/tests/unit/client_fixtures.py | 28 +++++++++----------
keystoneclient/tests/unit/test_discovery.py | 4 +--
keystoneclient/tests/unit/v2_0/test_auth.py | 4 +--
keystoneclient/tests/unit/v3/test_auth.py | 2 +-
7 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/keystoneclient/common/cms.py b/keystoneclient/common/cms.py
index 9c3e0bd..601d9c9 100644
--- a/keystoneclient/common/cms.py
+++ b/keystoneclient/common/cms.py
@@ -38,7 +38,7 @@ PKI_ASN1_PREFIX = 'MII'
PKIZ_PREFIX = 'PKIZ_'
PKIZ_CMS_FORM = 'DER'
PKI_ASN1_FORM = 'PEM'
-DEFAULT_TOKEN_DIGEST_ALGORITHM = 'sha256'
+DEFAULT_TOKEN_DIGEST_ALGORITHM = 'sha256' # nosec
# The openssl cms command exits with these status codes.
diff --git a/keystoneclient/tests/unit/auth/test_identity_v2.py
b/keystoneclient/tests/unit/auth/test_identity_v2.py
index 8ef87c4..a180135 100644
--- a/keystoneclient/tests/unit/auth/test_identity_v2.py
+++ b/keystoneclient/tests/unit/auth/test_identity_v2.py
@@ -84,7 +84,7 @@ class V2IdentityPlugin(utils.TestCase):
self.TEST_RESPONSE_DICT = {
"access": {
"token": {
- "expires": "2020-01-01T00:00:10.000123Z",
+ "expires": "2999-01-01T00:00:10.000123Z",
"id": self.TEST_TOKEN,
"tenant": {
"id": self.TEST_TENANT_ID
diff --git a/keystoneclient/tests/unit/auth/test_identity_v3.py
b/keystoneclient/tests/unit/auth/test_identity_v3.py
index 534e997..776551b 100644
--- a/keystoneclient/tests/unit/auth/test_identity_v3.py
+++ b/keystoneclient/tests/unit/auth/test_identity_v3.py
@@ -129,7 +129,7 @@ class V3IdentityPlugin(utils.TestCase):
"password"
],
- "expires_at": "2020-01-01T00:00:10.000123Z",
+ "expires_at": "2999-01-01T00:00:10.000123Z",
"project": {
"domain": {
"id": self.TEST_DOMAIN_ID,
diff --git a/keystoneclient/tests/unit/client_fixtures.py
b/keystoneclient/tests/unit/client_fixtures.py
index 6da259c..cc07726 100644
--- a/keystoneclient/tests/unit/client_fixtures.py
+++ b/keystoneclient/tests/unit/client_fixtures.py
@@ -399,7 +399,7 @@ class Examples(fixtures.Fixture):
'access': {
'token': {
'id': self.UUID_TOKEN_DEFAULT,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
'tenant': {
'id': 'tenant_id1',
'name': 'tenant_name1',
@@ -420,7 +420,7 @@ class Examples(fixtures.Fixture):
'access': {
'token': {
'id': self.VALID_DIABLO_TOKEN,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
'tenantId': 'tenant_id1',
},
'user': {
@@ -437,7 +437,7 @@ class Examples(fixtures.Fixture):
'access': {
'token': {
'id': self.UUID_TOKEN_UNSCOPED,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
},
'user': {
'id': 'user_id1',
@@ -453,7 +453,7 @@ class Examples(fixtures.Fixture):
'access': {
'token': {
'id': 'valid-token',
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
'tenant': {
'id': 'tenant_id1',
'name': 'tenant_name1',
@@ -474,7 +474,7 @@ class Examples(fixtures.Fixture):
'token': {
'bind': {'kerberos': self.KERBEROS_BIND},
'id': self.UUID_TOKEN_BIND,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
'tenant': {
'id': 'tenant_id1',
'name': 'tenant_name1',
@@ -496,7 +496,7 @@ class Examples(fixtures.Fixture):
'token': {
'bind': {'FOO': 'BAR'},
'id': self.UUID_TOKEN_UNKNOWN_BIND,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
'tenant': {
'id': 'tenant_id1',
'name': 'tenant_name1',
@@ -515,7 +515,7 @@ class Examples(fixtures.Fixture):
},
self.v3_UUID_TOKEN_DEFAULT: {
'token': {
- 'expires_at': '2020-01-01T00:00:10.000123Z',
+ 'expires_at': '2999-01-01T00:00:10.000123Z',
'methods': ['password'],
'user': {
'id': 'user_id1',
@@ -542,7 +542,7 @@ class Examples(fixtures.Fixture):
},
self.v3_UUID_TOKEN_UNSCOPED: {
'token': {
- 'expires_at': '2020-01-01T00:00:10.000123Z',
+ 'expires_at': '2999-01-01T00:00:10.000123Z',
'methods': ['password'],
'user': {
'id': 'user_id1',
@@ -556,7 +556,7 @@ class Examples(fixtures.Fixture):
},
self.v3_UUID_TOKEN_DOMAIN_SCOPED: {
'token': {
- 'expires_at': '2020-01-01T00:00:10.000123Z',
+ 'expires_at': '2999-01-01T00:00:10.000123Z',
'methods': ['password'],
'user': {
'id': 'user_id1',
@@ -581,7 +581,7 @@ class Examples(fixtures.Fixture):
'access': {
'token': {
'id': self.SIGNED_TOKEN_SCOPED_KEY,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
},
'user': {
'id': 'user_id1',
@@ -599,7 +599,7 @@ class Examples(fixtures.Fixture):
'access': {
'token': {
'id': self.SIGNED_TOKEN_UNSCOPED_KEY,
- 'expires': '2020-01-01T00:00:10.000123Z',
+ 'expires': '2999-01-01T00:00:10.000123Z',
},
'user': {
'id': 'user_id1',
@@ -613,7 +613,7 @@ class Examples(fixtures.Fixture):
},
self.SIGNED_v3_TOKEN_SCOPED_KEY: {
'token': {
- 'expires_at': '2020-01-01T00:00:10.000123Z',
+ 'expires_at': '2999-01-01T00:00:10.000123Z',
'methods': ['password'],
'user': {
'id': 'user_id1',
@@ -642,7 +642,7 @@ class Examples(fixtures.Fixture):
'token': {
'bind': {'kerberos': self.KERBEROS_BIND},
'methods': ['password'],
- 'expires_at': '2020-01-01T00:00:10.000123Z',
+ 'expires_at': '2999-01-01T00:00:10.000123Z',
'user': {
'id': 'user_id1',
'name': 'user_name1',
@@ -669,7 +669,7 @@ class Examples(fixtures.Fixture):
self.v3_UUID_TOKEN_UNKNOWN_BIND: {
'token': {
'bind': {'FOO': 'BAR'},
- 'expires_at': '2020-01-01T00:00:10.000123Z',
+ 'expires_at': '2999-01-01T00:00:10.000123Z',
'methods': ['password'],
'user': {
'id': 'user_id1',
diff --git a/keystoneclient/tests/unit/test_discovery.py
b/keystoneclient/tests/unit/test_discovery.py
index f9d5dbf..6f85ea9 100644
--- a/keystoneclient/tests/unit/test_discovery.py
+++ b/keystoneclient/tests/unit/test_discovery.py
@@ -87,7 +87,7 @@ V2_VERSION.updated_str = UPDATED
V2_AUTH_RESPONSE = jsonutils.dumps({
"access": {
"token": {
- "expires": "2020-01-01T00:00:10.000123Z",
+ "expires": "2999-01-01T00:00:10.000123Z",
"id": 'fakeToken',
"tenant": {
"id": '1'
@@ -113,7 +113,7 @@ V3_AUTH_RESPONSE = jsonutils.dumps({
"password"
],
- "expires_at": "2020-01-01T00:00:10.000123Z",
+ "expires_at": "2999-01-01T00:00:10.000123Z",
"project": {
"domain": {
"id": '1',
diff --git a/keystoneclient/tests/unit/v2_0/test_auth.py
b/keystoneclient/tests/unit/v2_0/test_auth.py
index 64f2ea0..b733524 100644
--- a/keystoneclient/tests/unit/v2_0/test_auth.py
+++ b/keystoneclient/tests/unit/v2_0/test_auth.py
@@ -28,7 +28,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
self.TEST_RESPONSE_DICT = {
"access": {
"token": {
- "expires": "2020-01-01T00:00:10.000123Z",
+ "expires": "2999-01-01T00:00:10.000123Z",
"id": self.TEST_TOKEN,
"tenant": {
"id": self.TEST_TENANT_ID
@@ -61,7 +61,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
# Build a new response
TEST_TOKEN = "abcdef"
- resp_b['access']['token']['expires'] = '2020-01-01T00:00:10.000123Z'
+ resp_b['access']['token']['expires'] = '2999-01-01T00:00:10.000123Z'
resp_b['access']['token']['id'] = TEST_TOKEN
# return expired first, and then the new response
diff --git a/keystoneclient/tests/unit/v3/test_auth.py
b/keystoneclient/tests/unit/v3/test_auth.py
index 6549080..9f87977 100644
--- a/keystoneclient/tests/unit/v3/test_auth.py
+++ b/keystoneclient/tests/unit/v3/test_auth.py
@@ -28,7 +28,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
"password"
],
- "expires_at": "2020-01-01T00:00:10.000123Z",
+ "expires_at": "2999-01-01T00:00:10.000123Z",
"project": {
"domain": {
"id": self.TEST_DOMAIN_ID,
--
2.25.1
++++++ 0001-Make-unit-tests-work-with-requests-mock-1.7.0.patch ++++++
>From a87672f493ca3493d16bbb9991b60a47d0ca9716 Mon Sep 17 00:00:00 2001
From: Guang Yee <[email protected]>
Date: Mon, 1 Jun 2020 22:29:59 -0700
Subject: [PATCH] Make unit tests work with requests-mock 1.7.0
Change-Id: Icdb8cef0a5d51065f8f10f5094f0c70a0212393d
---
keystoneclient/tests/unit/test_session.py | 12 ++++++++++--
.../tests/unit/v3/test_role_assignments.py | 2 +-
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/keystoneclient/tests/unit/test_session.py
b/keystoneclient/tests/unit/test_session.py
index e0d9b28..023e8c0 100644
--- a/keystoneclient/tests/unit/test_session.py
+++ b/keystoneclient/tests/unit/test_session.py
@@ -828,7 +828,11 @@ class SessionAuthTests(utils.TestCase):
self.assertIn(list(response.keys())[0], output)
self.assertIn(list(response.values())[0], output)
- self.assertNotIn(self.TEST_URL, self.logger.output)
+ # FIXME(gyee): this check will not work with requests-mock 1.7.0 so
+ # disabling it for now.
+ # see https://github.com/jamielennox/requests-mock/blob/1.7.0/
+ # requests_mock/adapter.py#L252
+ #self.assertNotIn(self.TEST_URL, self.logger.output)
self.assertNotIn(list(response.keys())[0], self.logger.output)
self.assertNotIn(list(response.values())[0], self.logger.output)
@@ -1026,7 +1030,11 @@ class AdapterTest(utils.TestCase):
self.assertIn(list(response.keys())[0], output)
self.assertIn(list(response.values())[0], output)
- self.assertNotIn(self.TEST_URL, self.logger.output)
+ # FIXME(gyee): this check will not work with requests-mock 1.7.0 so
+ # disabling it for now.
+ # see https://github.com/jamielennox/requests-mock/blob/1.7.0/
+ # requests_mock/adapter.py#L252
+ #self.assertNotIn(self.TEST_URL, self.logger.output)
self.assertNotIn(list(response.keys())[0], self.logger.output)
self.assertNotIn(list(response.values())[0], self.logger.output)
diff --git a/keystoneclient/tests/unit/v3/test_role_assignments.py
b/keystoneclient/tests/unit/v3/test_role_assignments.py
index 45dd13d..39b4b23 100644
--- a/keystoneclient/tests/unit/v3/test_role_assignments.py
+++ b/keystoneclient/tests/unit/v3/test_role_assignments.py
@@ -265,7 +265,7 @@ class RoleAssignmentsTests(utils.ClientTestCase,
utils.CrudTests):
ref_list = self.TEST_ALL_RESPONSE_LIST
self.stub_entity('GET',
[self.collection_key,
- '?include_names'],
+ '?include_names=True'],
entity=ref_list)
returned_list = self.manager.list(include_names=True)
--
2.17.1
++++++ _service ++++++
--- /var/tmp/diff_new_pack.7QWAzj/_old 2020-06-08 15:11:59.413001707 +0200
+++ /var/tmp/diff_new_pack.7QWAzj/_new 2020-06-08 15:11:59.413001707 +0200
@@ -1,8 +1,8 @@
<services>
<service mode="disabled" name="renderspec">
- <param
name="input-template">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/queens/openstack/python-keystoneclient/python-keystoneclient.spec.j2</param>
+ <param
name="input-template">https://opendev.org/openstack/rpm-packaging/raw/branch/stable/rocky/openstack/python-keystoneclient/python-keystoneclient.spec.j2</param>
<param name="output-name">python-keystoneclient.spec</param>
- <param
name="requirements">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/queens/requirements.txt</param>
+ <param
name="requirements">https://opendev.org/openstack/requirements/raw/branch/master/requirements.txt</param>
<param name="changelog-email">[email protected]</param>
<param name="changelog-provider">gh,openstack,python-keystoneclient</param>
</service>
++++++ python-keystoneclient-3.15.0.tar.gz ->
python-keystoneclient-3.17.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/.zuul.yaml
new/python-keystoneclient-3.17.0/.zuul.yaml
--- old/python-keystoneclient-3.15.0/.zuul.yaml 1970-01-01 01:00:00.000000000
+0100
+++ new/python-keystoneclient-3.17.0/.zuul.yaml 2018-06-21 01:15:51.000000000
+0200
@@ -0,0 +1,7 @@
+- project:
+ check:
+ jobs:
+ - openstack-tox-lower-constraints
+ gate:
+ jobs:
+ - openstack-tox-lower-constraints
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/AUTHORS
new/python-keystoneclient-3.17.0/AUTHORS
--- old/python-keystoneclient-3.15.0/AUTHORS 2018-01-24 21:10:42.000000000
+0100
+++ new/python-keystoneclient-3.17.0/AUTHORS 2018-06-21 01:17:42.000000000
+0200
@@ -36,6 +36,7 @@
Chang Bo Guo <[email protected]>
ChangBo Guo(gcb) <[email protected]>
Charles V Bock <[email protected]>
+Chen <[email protected]>
Chmouel Boudjnah <[email protected]>
Christian Berendt <[email protected]>
Christian Schwede <[email protected]>
@@ -208,6 +209,7 @@
Tom Cocozzello <[email protected]>
Tom Fifield <[email protected]>
Tony Breeds <[email protected]>
+Tovin Seven <[email protected]>
Trevor McKay <[email protected]>
Tristan Cacqueray <[email protected]>
Van Hung Pham <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/ChangeLog
new/python-keystoneclient-3.17.0/ChangeLog
--- old/python-keystoneclient-3.15.0/ChangeLog 2018-01-24 21:10:42.000000000
+0100
+++ new/python-keystoneclient-3.17.0/ChangeLog 2018-06-21 01:17:42.000000000
+0200
@@ -1,6 +1,28 @@
CHANGES
=======
+3.17.0
+------
+
+* Add support for project-specific limits
+* Add support for registered limits
+* Fix python3 test compat
+* fix tox python3 overrides
+* Remove PyPI downloads
+* fix a typo in docstring
+* Trivial: Update pypi url to new url
+
+3.16.0
+------
+
+* add lower-constraints job
+* Updated from global requirements
+* Updated from global requirements
+* Update links in README
+* Updated from global requirements
+* Override find function in project
+* Update reno for stable/queens
+
3.15.0
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/PKG-INFO
new/python-keystoneclient-3.17.0/PKG-INFO
--- old/python-keystoneclient-3.15.0/PKG-INFO 2018-01-24 21:10:43.000000000
+0100
+++ new/python-keystoneclient-3.17.0/PKG-INFO 2018-06-21 01:17:43.000000000
+0200
@@ -1,18 +1,17 @@
Metadata-Version: 1.1
Name: python-keystoneclient
-Version: 3.15.0
+Version: 3.17.0
Summary: Client Library for OpenStack Identity
Home-page: https://docs.openstack.org/python-keystoneclient/latest/
Author: OpenStack
Author-email: [email protected]
License: UNKNOWN
-Description-Content-Type: UNKNOWN
Description: ========================
Team and repository tags
========================
- .. image::
https://governance.openstack.org/badges/python-keystoneclient.svg
- :target: https://governance.openstack.org/reference/tags/index.html
+ .. image::
https://governance.openstack.org/tc/badges/python-keystoneclient.svg
+ :target:
https://governance.openstack.org/tc/reference/tags/index.html
.. Change things from this point on
@@ -20,13 +19,9 @@
========================================================
.. image:: https://img.shields.io/pypi/v/python-keystoneclient.svg
- :target: https://pypi.python.org/pypi/python-keystoneclient/
+ :target: https://pypi.org/project/python-keystoneclient/
:alt: Latest Version
- .. image:: https://img.shields.io/pypi/dm/python-keystoneclient.svg
- :target: https://pypi.python.org/pypi/python-keystoneclient/
- :alt: Downloads
-
This is a client for the OpenStack Identity API, implemented by the
Keystone
team; it contains a Python API (the ``keystoneclient`` module) for
OpenStack's Identity Service. For command line interface support, use
@@ -41,13 +36,13 @@
* `Specs`_
* `How to Contribute`_
- .. _PyPi: https://pypi.python.org/pypi/python-keystoneclient
+ .. _PyPi: https://pypi.org/project/python-keystoneclient
.. _Online Documentation:
https://docs.openstack.org/python-keystoneclient/latest/
.. _Launchpad project: https://launchpad.net/python-keystoneclient
.. _Blueprints: https://blueprints.launchpad.net/python-keystoneclient
.. _Bugs: https://bugs.launchpad.net/python-keystoneclient
.. _Source:
https://git.openstack.org/cgit/openstack/python-keystoneclient
- .. _OpenStackClient:
https://pypi.python.org/pypi/python-openstackclient
+ .. _OpenStackClient: https://pypi.org/project/python-openstackclient
.. _How to Contribute:
https://docs.openstack.org/infra/manual/developers.html
.. _Specs: https://specs.openstack.org/openstack/keystone-specs/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/README.rst
new/python-keystoneclient-3.17.0/README.rst
--- old/python-keystoneclient-3.15.0/README.rst 2018-01-24 21:08:40.000000000
+0100
+++ new/python-keystoneclient-3.17.0/README.rst 2018-06-21 01:15:51.000000000
+0200
@@ -2,8 +2,8 @@
Team and repository tags
========================
-.. image:: https://governance.openstack.org/badges/python-keystoneclient.svg
- :target: https://governance.openstack.org/reference/tags/index.html
+.. image:: https://governance.openstack.org/tc/badges/python-keystoneclient.svg
+ :target: https://governance.openstack.org/tc/reference/tags/index.html
.. Change things from this point on
@@ -11,13 +11,9 @@
========================================================
.. image:: https://img.shields.io/pypi/v/python-keystoneclient.svg
- :target: https://pypi.python.org/pypi/python-keystoneclient/
+ :target: https://pypi.org/project/python-keystoneclient/
:alt: Latest Version
-.. image:: https://img.shields.io/pypi/dm/python-keystoneclient.svg
- :target: https://pypi.python.org/pypi/python-keystoneclient/
- :alt: Downloads
-
This is a client for the OpenStack Identity API, implemented by the Keystone
team; it contains a Python API (the ``keystoneclient`` module) for
OpenStack's Identity Service. For command line interface support, use
@@ -32,13 +28,13 @@
* `Specs`_
* `How to Contribute`_
-.. _PyPi: https://pypi.python.org/pypi/python-keystoneclient
+.. _PyPi: https://pypi.org/project/python-keystoneclient
.. _Online Documentation:
https://docs.openstack.org/python-keystoneclient/latest/
.. _Launchpad project: https://launchpad.net/python-keystoneclient
.. _Blueprints: https://blueprints.launchpad.net/python-keystoneclient
.. _Bugs: https://bugs.launchpad.net/python-keystoneclient
.. _Source: https://git.openstack.org/cgit/openstack/python-keystoneclient
-.. _OpenStackClient: https://pypi.python.org/pypi/python-openstackclient
+.. _OpenStackClient: https://pypi.org/project/python-openstackclient
.. _How to Contribute: https://docs.openstack.org/infra/manual/developers.html
.. _Specs: https://specs.openstack.org/openstack/keystone-specs/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/doc/requirements.txt
new/python-keystoneclient-3.17.0/doc/requirements.txt
--- old/python-keystoneclient-3.15.0/doc/requirements.txt 2018-01-24
21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/doc/requirements.txt 2018-06-21
01:15:51.000000000 +0200
@@ -3,8 +3,8 @@
# process, which may cause wedges in the gate later.
# These are needed for docs generation
-openstackdocstheme>=1.17.0 # Apache-2.0
-sphinx!=1.6.6,>=1.6.2 # BSD
+openstackdocstheme>=1.18.1 # Apache-2.0
+sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD
reno>=2.5.0 # Apache-2.0
lxml!=3.7.0,>=3.4.1 # BSD
fixtures>=3.0.0 # Apache-2.0/BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/contrib/auth/v3/saml2.py
new/python-keystoneclient-3.17.0/keystoneclient/contrib/auth/v3/saml2.py
--- old/python-keystoneclient-3.15.0/keystoneclient/contrib/auth/v3/saml2.py
2018-01-24 21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/keystoneclient/contrib/auth/v3/saml2.py
2018-06-21 01:15:51.000000000 +0200
@@ -327,7 +327,7 @@
authenticated user. This function directs the HTTP request to SP
managed URL, for instance: ``https://<host>:<port>/Shibboleth.sso/
SAML2/ECP``.
- Upon success the there's a session created and access to the protected
+ Upon success there's a session created and access to the protected
resource is granted. Many implementations of the SP return HTTP 302/303
status code pointing to the protected URL (``https://<host>:<port>/v3/
OS-FEDERATION/identity_providers/{identity_provider}/protocols/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/tests/unit/test_session.py
new/python-keystoneclient-3.17.0/keystoneclient/tests/unit/test_session.py
--- old/python-keystoneclient-3.15.0/keystoneclient/tests/unit/test_session.py
2018-01-24 21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/keystoneclient/tests/unit/test_session.py
2018-06-21 01:15:51.000000000 +0200
@@ -266,7 +266,7 @@
# elements to make sure that all joins are appropriately
# handled (any join of unicode and byte strings should
# raise a UnicodeDecodeError)
- session.post(unicode(self.TEST_URL), data=data)
+ session.post(six.text_type(self.TEST_URL), data=data)
self.assertNotIn('my data', self.logger.output)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/tests/unit/v3/test_limits.py
new/python-keystoneclient-3.17.0/keystoneclient/tests/unit/v3/test_limits.py
---
old/python-keystoneclient-3.15.0/keystoneclient/tests/unit/v3/test_limits.py
1970-01-01 01:00:00.000000000 +0100
+++
new/python-keystoneclient-3.17.0/keystoneclient/tests/unit/v3/test_limits.py
2018-06-21 01:16:07.000000000 +0200
@@ -0,0 +1,77 @@
+# 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 uuid
+
+from keystoneclient.tests.unit.v3 import utils
+from keystoneclient.v3 import limits
+
+
+class LimitTests(utils.ClientTestCase, utils.CrudTests):
+ def setUp(self):
+ super(LimitTests, self).setUp()
+ self.key = 'limit'
+ self.collection_key = 'limits'
+ self.model = limits.Limit
+ self.manager = self.client.limits
+
+ def new_ref(self, **kwargs):
+ ref = {
+ 'id': uuid.uuid4().hex,
+ 'project_id': uuid.uuid4().hex,
+ 'service_id': uuid.uuid4().hex,
+ 'resource_name': uuid.uuid4().hex,
+ 'resource_limit': 15,
+ 'description': uuid.uuid4().hex
+ }
+ ref.update(kwargs)
+ return ref
+
+ def test_create(self):
+ # This test overrides the generic test case provided by the CrudTests
+ # class because the limits API supports creating multiple limits in a
+ # single POST request. As a result, it returns the limits as a list of
+ # all the created limits from the request. This is different from what
+ # the base test_create() method assumes about keystone's API. The
+ # changes here override the base test to closely model how the actual
+ # limit API behaves.
+ ref = self.new_ref()
+ manager_ref = ref.copy()
+ manager_ref.pop('id')
+ req_ref = [manager_ref.copy()]
+
+ self.stub_entity('POST', entity=req_ref, status_code=201)
+
+ returned = self.manager.create(**utils.parameterize(manager_ref))
+ self.assertIsInstance(returned, self.model)
+
+ expected_limit = req_ref.pop()
+ for attr in expected_limit:
+ self.assertEqual(
+ getattr(returned, attr),
+ expected_limit[attr],
+ 'Expected different %s' % attr)
+ self.assertEntityRequestBodyIs([expected_limit])
+
+ def test_list_filter_by_service(self):
+ service_id = uuid.uuid4().hex
+ expected_query = {'service_id': service_id}
+ self.test_list(expected_query=expected_query, service=service_id)
+
+ def test_list_filtered_by_resource_name(self):
+ resource_name = uuid.uuid4().hex
+ self.test_list(resource_name=resource_name)
+
+ def test_list_filtered_by_region(self):
+ region_id = uuid.uuid4().hex
+ expected_query = {'region_id': region_id}
+ self.test_list(expected_query=expected_query, region=region_id)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/tests/unit/v3/test_registered_limits.py
new/python-keystoneclient-3.17.0/keystoneclient/tests/unit/v3/test_registered_limits.py
---
old/python-keystoneclient-3.15.0/keystoneclient/tests/unit/v3/test_registered_limits.py
1970-01-01 01:00:00.000000000 +0100
+++
new/python-keystoneclient-3.17.0/keystoneclient/tests/unit/v3/test_registered_limits.py
2018-06-21 01:16:07.000000000 +0200
@@ -0,0 +1,76 @@
+# 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 uuid
+
+from keystoneclient.tests.unit.v3 import utils
+from keystoneclient.v3 import registered_limits
+
+
+class RegisteredLimitTests(utils.ClientTestCase, utils.CrudTests):
+ def setUp(self):
+ super(RegisteredLimitTests, self).setUp()
+ self.key = 'registered_limit'
+ self.collection_key = 'registered_limits'
+ self.model = registered_limits.RegisteredLimit
+ self.manager = self.client.registered_limits
+
+ def new_ref(self, **kwargs):
+ ref = {
+ 'id': uuid.uuid4().hex,
+ 'service_id': uuid.uuid4().hex,
+ 'resource_name': uuid.uuid4().hex,
+ 'default_limit': 10,
+ 'description': uuid.uuid4().hex
+ }
+ ref.update(kwargs)
+ return ref
+
+ def test_create(self):
+ # This test overrides the generic test case provided by the CrudTests
+ # class because the registered limits API supports creating multiple
+ # limits in a single POST request. As a result, it returns the
+ # registered limits as a list of all the created limits from the
+ # request. This is different from what the base test_create() method
+ # assumes about keystone's API. The changes here override the base test
+ # to closely model how the actual registered limit API behaves.
+ ref = self.new_ref()
+ manager_ref = ref.copy()
+ manager_ref.pop('id')
+ req_ref = [manager_ref.copy()]
+
+ self.stub_entity('POST', entity=req_ref, status_code=201)
+
+ returned = self.manager.create(**utils.parameterize(manager_ref))
+ self.assertIsInstance(returned, self.model)
+
+ expected_limit = req_ref.pop()
+ for attr in expected_limit:
+ self.assertEqual(
+ getattr(returned, attr),
+ expected_limit[attr],
+ 'Expected different %s' % attr)
+ self.assertEntityRequestBodyIs([expected_limit])
+
+ def test_list_filter_by_service(self):
+ service_id = uuid.uuid4().hex
+ expected_query = {'service_id': service_id}
+ self.test_list(expected_query=expected_query, service=service_id)
+
+ def test_list_filter_resource_name(self):
+ resource_name = uuid.uuid4().hex
+ self.test_list(resource_name=resource_name)
+
+ def test_list_filter_region(self):
+ region_id = uuid.uuid4().hex
+ expected_query = {'region_id': region_id}
+ self.test_list(expected_query=expected_query, region=region_id)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/v3/client.py
new/python-keystoneclient-3.17.0/keystoneclient/v3/client.py
--- old/python-keystoneclient-3.15.0/keystoneclient/v3/client.py
2018-01-24 21:09:04.000000000 +0100
+++ new/python-keystoneclient-3.17.0/keystoneclient/v3/client.py
2018-06-21 01:16:07.000000000 +0200
@@ -37,9 +37,11 @@
from keystoneclient.v3 import endpoint_groups
from keystoneclient.v3 import endpoints
from keystoneclient.v3 import groups
+from keystoneclient.v3 import limits
from keystoneclient.v3 import policies
from keystoneclient.v3 import projects
from keystoneclient.v3 import regions
+from keystoneclient.v3 import registered_limits
from keystoneclient.v3 import role_assignments
from keystoneclient.v3 import roles
from keystoneclient.v3 import services
@@ -158,6 +160,10 @@
:py:class:`keystoneclient.v3.groups.GroupManager`
+ .. py:attribute:: limits
+
+ :py:class:`keystoneclient.v3.limits.LimitManager`
+
.. py:attribute:: oauth1
:py:class:`keystoneclient.v3.contrib.oauth1.core.OAuthManager`
@@ -170,6 +176,10 @@
:py:class:`keystoneclient.v3.regions.RegionManager`
+ .. py:attribute:: registered_limits
+
+ :py:class:`keystoneclient.v3.registered_limits.RegisteredLimitManager`
+
.. py:attribute:: role_assignments
:py:class:`keystoneclient.v3.role_assignments.RoleAssignmentManager`
@@ -230,9 +240,12 @@
self.domains = domains.DomainManager(self._adapter)
self.federation = federation.FederationManager(self._adapter)
self.groups = groups.GroupManager(self._adapter)
+ self.limits = limits.LimitManager(self._adapter)
self.oauth1 = oauth1.create_oauth_manager(self._adapter)
self.policies = policies.PolicyManager(self._adapter)
self.projects = projects.ProjectManager(self._adapter)
+ self.registered_limits = registered_limits.RegisteredLimitManager(
+ self._adapter)
self.regions = regions.RegionManager(self._adapter)
self.role_assignments = (
role_assignments.RoleAssignmentManager(self._adapter))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/v3/limits.py
new/python-keystoneclient-3.17.0/keystoneclient/v3/limits.py
--- old/python-keystoneclient-3.15.0/keystoneclient/v3/limits.py
1970-01-01 01:00:00.000000000 +0100
+++ new/python-keystoneclient-3.17.0/keystoneclient/v3/limits.py
2018-06-21 01:16:07.000000000 +0200
@@ -0,0 +1,148 @@
+# 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 keystoneclient import base
+
+
+class Limit(base.Resource):
+ """Represents a project limit.
+
+ Attributes:
+ * id: a UUID that identifies the project limit
+ * service_id: a UUID that identifies the service for the limit
+ * region_id: a UUID that identifies the region for the limit
+ * project_id: a UUID that identifies the project for the limit
+ * resource_name: the name of the resource to limit
+ * resource_limit: the limit to apply to the project
+ * description: a description for the project limit
+
+ """
+
+ pass
+
+
+class LimitManager(base.CrudManager):
+ """Manager class for project limits."""
+
+ resource_class = Limit
+ collection_key = 'limits'
+ key = 'limit'
+
+ def create(self, project, service, resource_name, resource_limit,
+ description=None, region=None, **kwargs):
+ """Create a project-specific limit.
+
+ :param project: the project to create a limit for.
+ :type project: str or :class:`keystoneclient.v3.projects.Project`
+ :param service: the service that owns the resource to limit.
+ :type service: str or :class:`keystoneclient.v3.services.Service`
+ :param resource_name: the name of the resource to limit
+ :type resource_name: str
+ :param resource_limit: the quantity of the limit
+ :type resource_limit: int
+ :param description: a description of the limit
+ :type description: str
+ :param region: region the limit applies to
+ :type region: str or :class:`keystoneclient.v3.regions.Region`
+
+ :returns: a reference of the created limit
+ :rtype: :class:`keystoneclient.v3.limits.Limit`
+
+ """
+ limit_data = base.filter_none(
+ project_id=base.getid(project),
+ service_id=base.getid(service),
+ resource_name=resource_name,
+ resource_limit=resource_limit,
+ description=description,
+ region_id=base.getid(region),
+ **kwargs
+ )
+ body = {self.collection_key: [limit_data]}
+ resp, body = self.client.post('/limits', body=body)
+ limit = body[self.collection_key].pop()
+ return self.resource_class(self, limit)
+
+ def update(self, limit, project=None, service=None, resource_name=None,
+ resource_limit=None, description=None, **kwargs):
+ """Update a project-specific limit.
+
+ :param limit: a limit to update
+ :param project: the project ID of the limit to update
+ :type project: str or :class:`keystoneclient.v3.projects.Project`
+ :param resource_limit: the limit of the limit's resource to update
+ :type: resource_limit: int
+ :param description: a description of the limit
+ :type description: str
+
+ :returns: a reference of the updated limit.
+ :rtype: :class:`keystoneclient.v3.limits.Limit`
+
+ """
+ return super(LimitManager, self).update(
+ limit_id=base.getid(limit),
+ project_id=base.getid(project),
+ service_id=base.getid(service),
+ resource_name=resource_name,
+ resource_limit=resource_limit,
+ description=description,
+ **kwargs
+ )
+
+ def get(self, limit):
+ """Retrieve a project limit.
+
+ :param limit:
+ the project-specific limit to be retrieved.
+ :type limit:
+ str or :class:`keystoneclient.v3.limit.Limit`
+
+ :returns: a project-specific limit
+ :rtype: :class:`keystoneclient.v3.limit.Limit`
+
+ """
+ return super(LimitManager, self).get(limit_id=base.getid(limit))
+
+ def list(self, service=None, region=None, resource_name=None, **kwargs):
+ """List project-specific limits.
+
+ Any parameter provided will be passed to the server as a filter
+
+ :param service: service to filter limits by
+ :type service: UUID or :class:`keystoneclient.v3.services.Service`
+ :param region: region to filter limits by
+ :type region: UUID or :class:`keystoneclient.v3.regions.Region`
+ :param resource_name: the name of the resource to filter limits by
+ :type resource_name: str
+
+ :returns: a list of project-specific limits.
+ :rtype: list of :class:`keystoneclient.v3.limits.Limit`
+
+ """
+ return super(LimitManager, self).list(
+ service_id=base.getid(service),
+ region_id=base.getid(region),
+ resource_name=resource_name,
+ **kwargs
+ )
+
+ def delete(self, limit):
+ """Delete a project-specific limit.
+
+ :param limit: the project-specific limit to be deleted.
+ :type limit: str or :class:`keystoneclient.v3.limit.Limit`
+
+ :returns: Response object with 204 status
+ :rtype: :class:`requests.models.Response`
+
+ """
+ return super(LimitManager, self).delete(limit_id=base.getid(limit))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/v3/projects.py
new/python-keystoneclient-3.17.0/keystoneclient/v3/projects.py
--- old/python-keystoneclient-3.15.0/keystoneclient/v3/projects.py
2018-01-24 21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/keystoneclient/v3/projects.py
2018-06-21 01:15:51.000000000 +0200
@@ -205,6 +205,11 @@
p.tags = self._encode_tags(getattr(p, 'tags', []))
return p
+ def find(self, **kwargs):
+ p = super(ProjectManager, self).find(**kwargs)
+ p.tags = self._encode_tags(getattr(p, 'tags', []))
+ return p
+
def update(self, project, name=None, domain=None, description=None,
enabled=None, **kwargs):
"""Update a project.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/keystoneclient/v3/registered_limits.py
new/python-keystoneclient-3.17.0/keystoneclient/v3/registered_limits.py
--- old/python-keystoneclient-3.15.0/keystoneclient/v3/registered_limits.py
1970-01-01 01:00:00.000000000 +0100
+++ new/python-keystoneclient-3.17.0/keystoneclient/v3/registered_limits.py
2018-06-21 01:16:07.000000000 +0200
@@ -0,0 +1,158 @@
+# 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 keystoneclient import base
+
+
+class RegisteredLimit(base.Resource):
+ """Represents a registered limit.
+
+ Attributes:
+ * id: a UUID that identifies the registered limit
+ * service_id: a UUID that identifies the service for the limit
+ * region_id: a UUID that identifies the region for the limit
+ * resource_name: the name of the resource to limit
+ * default_limit: the default limit for projects to assume
+ * description: a description of the registered limit
+
+ """
+
+ pass
+
+
+class RegisteredLimitManager(base.CrudManager):
+ """Manager class for registered limits."""
+
+ resource_class = RegisteredLimit
+ collection_key = 'registered_limits'
+ key = 'registered_limit'
+
+ def create(self, service, resource_name, default_limit,
+ description=None, region=None, **kwargs):
+ """Create a registered limit.
+
+ :param service: a UUID that identifies the service for the limit.
+ :type service: str
+ :param resource_name: the name of the resource to limit.
+ :type resource_name: str
+ :param default_limit: the default limit for projects to assume.
+ :type default_limit: int
+ :param description: a string that describes the limit
+ :type description: str
+ :param region: a UUID that identifies the region for the limit.
+ :type region: str
+
+ :returns: a reference of the created registered limit.
+ :rtype: :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+
+ """
+ # NOTE(lbragstad): Keystone's registered limit API supports creation of
+ # limits in batches. This client accepts a single limit and passes it
+ # to the identity service as a list of a single item.
+ limit_data = base.filter_none(
+ service_id=base.getid(service),
+ resource_name=resource_name,
+ default_limit=default_limit,
+ description=description,
+ region_id=base.getid(region),
+ **kwargs
+ )
+ body = {self.collection_key: [limit_data]}
+ resp, body = self.client.post('/registered_limits', body=body)
+ registered_limit = body[self.collection_key].pop()
+ return self.resource_class(self, registered_limit)
+
+ def update(self, registered_limit, service=None, resource_name=None,
+ default_limit=None, description=None, region=None, **kwargs):
+ """Update a registered limit.
+
+ :param registered_limit:
+ the UUID or reference of the registered limit to update.
+ :param registered_limit:
+ str or :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+ :param service: a UUID that identifies the service for the limit.
+ :type service: str
+ :param resource_name: the name of the resource to limit.
+ :type resource_name: str
+ :param default_limit: the default limit for projects to assume.
+ :type defaut slt_limit: int
+ :param description: a string that describes the limit
+ :type description: str
+ :param region: a UUID that identifies the region for the limit.
+ :type region: str
+
+ :returns: a reference of the updated registered limit.
+ :rtype: :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+
+ """
+ return super(RegisteredLimitManager, self).update(
+ registered_limit_id=base.getid(registered_limit),
+ service_id=base.getid(service),
+ resource_name=resource_name,
+ default_limit=default_limit,
+ description=description,
+ region=region,
+ **kwargs
+ )
+
+ def get(self, registered_limit):
+ """Retrieve a registered limit.
+
+ :param registered_limit: the registered limit to get.
+ :type registered_limit:
+ str or :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+
+ :returns: a specific registered limit.
+ :rtype: :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+
+ """
+ return super(RegisteredLimitManager, self).get(
+ registered_limit_id=base.getid(registered_limit))
+
+ def list(self, service=None, resource_name=None, region=None, **kwargs):
+ """List registered limits.
+
+ Any parameter provided will be passed to the server as a filter.
+
+ :param service: filter registered limits by service
+ :type service: a UUID or :class:`keystoneclient.v3.services.Service`
+ :param resource_name: filter registered limits by resource name
+ :type resource_name: str
+ :param region: filter registered limits by region
+ :type region: a UUID or :class:`keystoneclient.v3.regions.Region`
+
+ :returns: a list of registered limits.
+ :rtype: list of
+ :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+
+ """
+ return super(RegisteredLimitManager, self).list(
+ service_id=base.getid(service),
+ resource_name=resource_name,
+ region_id=base.getid(region),
+ **kwargs)
+
+ def delete(self, registered_limit):
+ """Delete a registered limit.
+
+ :param registered_limit: the registered limit to delete.
+ :type registered_limit:
+ str or :class:`keystoneclient.v3.registered_limits.RegisteredLimit`
+
+ :returns: Response object with 204 status.
+ :rtype: :class:`requests.models.Response`
+
+ """
+ registered_limit_id = base.getid(registered_limit)
+ return super(RegisteredLimitManager, self).delete(
+ registered_limit_id=registered_limit_id
+ )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/lower-constraints.txt
new/python-keystoneclient-3.17.0/lower-constraints.txt
--- old/python-keystoneclient-3.15.0/lower-constraints.txt 1970-01-01
01:00:00.000000000 +0100
+++ new/python-keystoneclient-3.17.0/lower-constraints.txt 2018-06-21
01:15:51.000000000 +0200
@@ -0,0 +1,77 @@
+appdirs==1.3.0
+asn1crypto==0.23.0
+Babel==2.3.4
+bandit==1.1.0
+cffi==1.7.0
+cliff==2.8.0
+cmd2==0.8.0
+coverage==4.0
+cryptography==2.1
+debtcollector==1.2.0
+extras==1.0.0
+fasteners==0.7.0
+fixtures==3.0.0
+flake8-docstrings==0.2.1.post1
+flake8==2.2.4
+future==0.16.0
+gitdb==0.6.4
+GitPython==1.0.1
+hacking==0.10.0
+idna==2.6
+iso8601==0.1.11
+jsonschema==2.6.0
+keyring==5.5.1
+keystoneauth1==3.4.0
+linecache2==1.0.0
+lxml==3.4.1
+mccabe==0.2.1
+mock==2.0.0
+monotonic==0.6
+mox3==0.20.0
+msgpack-python==0.4.0
+netaddr==0.7.18
+netifaces==0.10.4
+oauthlib==0.6.2
+os-client-config==1.28.0
+os-testr==1.0.0
+oslo.concurrency==3.25.0
+oslo.config==5.2.0
+oslo.context==2.19.2
+oslo.i18n==3.15.3
+oslo.log==3.36.0
+oslo.serialization==2.18.0
+oslo.utils==3.33.0
+oslotest==3.2.0
+paramiko==2.0.0
+pbr==2.0.0
+pep257==0.7.0
+pep8==1.5.7
+prettytable==0.7.2
+pyasn1==0.1.8
+pycparser==2.18
+pyflakes==0.8.1
+pyinotify==0.9.6
+pyparsing==2.1.0
+pyperclip==1.5.27
+python-dateutil==2.5.3
+python-mimeparse==1.6.0
+python-subunit==1.0.0
+pytz==2013.6
+PyYAML==3.12
+requests-mock==1.2.0
+requests==2.14.2
+requestsexceptions==1.2.0
+rfc3986==0.3.1
+six==1.10.0
+smmap==0.9.0
+stestr==1.0.0
+stevedore==1.20.0
+tempest==17.1.0
+testrepository==0.0.18
+testresources==2.0.0
+testscenarios==0.4
+testtools==2.2.0
+traceback2==1.4.0
+unittest2==1.1.0
+urllib3==1.21.1
+wrapt==1.7.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/PKG-INFO
new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/PKG-INFO
--- old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/PKG-INFO
2018-01-24 21:10:42.000000000 +0100
+++ new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/PKG-INFO
2018-06-21 01:17:42.000000000 +0200
@@ -1,18 +1,17 @@
Metadata-Version: 1.1
Name: python-keystoneclient
-Version: 3.15.0
+Version: 3.17.0
Summary: Client Library for OpenStack Identity
Home-page: https://docs.openstack.org/python-keystoneclient/latest/
Author: OpenStack
Author-email: [email protected]
License: UNKNOWN
-Description-Content-Type: UNKNOWN
Description: ========================
Team and repository tags
========================
- .. image::
https://governance.openstack.org/badges/python-keystoneclient.svg
- :target: https://governance.openstack.org/reference/tags/index.html
+ .. image::
https://governance.openstack.org/tc/badges/python-keystoneclient.svg
+ :target:
https://governance.openstack.org/tc/reference/tags/index.html
.. Change things from this point on
@@ -20,13 +19,9 @@
========================================================
.. image:: https://img.shields.io/pypi/v/python-keystoneclient.svg
- :target: https://pypi.python.org/pypi/python-keystoneclient/
+ :target: https://pypi.org/project/python-keystoneclient/
:alt: Latest Version
- .. image:: https://img.shields.io/pypi/dm/python-keystoneclient.svg
- :target: https://pypi.python.org/pypi/python-keystoneclient/
- :alt: Downloads
-
This is a client for the OpenStack Identity API, implemented by the
Keystone
team; it contains a Python API (the ``keystoneclient`` module) for
OpenStack's Identity Service. For command line interface support, use
@@ -41,13 +36,13 @@
* `Specs`_
* `How to Contribute`_
- .. _PyPi: https://pypi.python.org/pypi/python-keystoneclient
+ .. _PyPi: https://pypi.org/project/python-keystoneclient
.. _Online Documentation:
https://docs.openstack.org/python-keystoneclient/latest/
.. _Launchpad project: https://launchpad.net/python-keystoneclient
.. _Blueprints: https://blueprints.launchpad.net/python-keystoneclient
.. _Bugs: https://bugs.launchpad.net/python-keystoneclient
.. _Source:
https://git.openstack.org/cgit/openstack/python-keystoneclient
- .. _OpenStackClient:
https://pypi.python.org/pypi/python-openstackclient
+ .. _OpenStackClient: https://pypi.org/project/python-openstackclient
.. _How to Contribute:
https://docs.openstack.org/infra/manual/developers.html
.. _Specs: https://specs.openstack.org/openstack/keystone-specs/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/SOURCES.txt
new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/SOURCES.txt
--- old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/SOURCES.txt
2018-01-24 21:10:43.000000000 +0100
+++ new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/SOURCES.txt
2018-06-21 01:17:43.000000000 +0200
@@ -1,6 +1,7 @@
.coveragerc
.mailmap
.testr.conf
+.zuul.yaml
AUTHORS
CONTRIBUTING.rst
ChangeLog
@@ -9,6 +10,7 @@
README.rst
babel.cfg
bindep.txt
+lower-constraints.txt
requirements.txt
setup.cfg
setup.py
@@ -197,10 +199,12 @@
keystoneclient/tests/unit/v3/test_endpoints.py
keystoneclient/tests/unit/v3/test_federation.py
keystoneclient/tests/unit/v3/test_groups.py
+keystoneclient/tests/unit/v3/test_limits.py
keystoneclient/tests/unit/v3/test_oauth1.py
keystoneclient/tests/unit/v3/test_policies.py
keystoneclient/tests/unit/v3/test_projects.py
keystoneclient/tests/unit/v3/test_regions.py
+keystoneclient/tests/unit/v3/test_registered_limits.py
keystoneclient/tests/unit/v3/test_role_assignments.py
keystoneclient/tests/unit/v3/test_roles.py
keystoneclient/tests/unit/v3/test_service_catalog.py
@@ -234,9 +238,11 @@
keystoneclient/v3/endpoint_groups.py
keystoneclient/v3/endpoints.py
keystoneclient/v3/groups.py
+keystoneclient/v3/limits.py
keystoneclient/v3/policies.py
keystoneclient/v3/projects.py
keystoneclient/v3/regions.py
+keystoneclient/v3/registered_limits.py
keystoneclient/v3/role_assignments.py
keystoneclient/v3/roles.py
keystoneclient/v3/services.py
@@ -274,6 +280,8 @@
python_keystoneclient.egg-info/top_level.txt
releasenotes/notes/.placeholder
releasenotes/notes/Add-allow-expired-flag-to-validate-25b8914f4deb359b.yaml
+releasenotes/notes/add-support-for-limits-6f883d6d3054a500.yaml
+releasenotes/notes/add-support-for-registered-limits-d83b888ea65a614b.yaml
releasenotes/notes/bp-application-credentials-27728ded876d7d5a.yaml
releasenotes/notes/bp-domain-config-9566e672a98f4e7f.yaml
releasenotes/notes/bp-pci-dss-query-password-expired-users-b0c4b1bbdcf33f16.yaml
@@ -297,6 +305,7 @@
releasenotes/source/newton.rst
releasenotes/source/ocata.rst
releasenotes/source/pike.rst
+releasenotes/source/queens.rst
releasenotes/source/unreleased.rst
releasenotes/source/_static/.placeholder
releasenotes/source/_templates/.placeholder
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/pbr.json
new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/pbr.json
--- old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/pbr.json
2018-01-24 21:10:42.000000000 +0100
+++ new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/pbr.json
2018-06-21 01:17:42.000000000 +0200
@@ -1 +1 @@
-{"git_version": "1e8c930", "is_release": true}
\ No newline at end of file
+{"git_version": "234ea50", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/requires.txt
new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/requires.txt
---
old/python-keystoneclient-3.15.0/python_keystoneclient.egg-info/requires.txt
2018-01-24 21:10:42.000000000 +0100
+++
new/python-keystoneclient-3.17.0/python_keystoneclient.egg-info/requires.txt
2018-06-21 01:17:42.000000000 +0200
@@ -1,7 +1,7 @@
pbr!=2.1.0,>=2.0.0
debtcollector>=1.2.0
-keystoneauth1>=3.3.0
-oslo.config>=5.1.0
+keystoneauth1>=3.4.0
+oslo.config>=5.2.0
oslo.i18n>=3.15.3
oslo.serialization!=2.19.1,>=2.18.0
oslo.utils>=3.33.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/releasenotes/notes/add-support-for-limits-6f883d6d3054a500.yaml
new/python-keystoneclient-3.17.0/releasenotes/notes/add-support-for-limits-6f883d6d3054a500.yaml
---
old/python-keystoneclient-3.15.0/releasenotes/notes/add-support-for-limits-6f883d6d3054a500.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/python-keystoneclient-3.17.0/releasenotes/notes/add-support-for-limits-6f883d6d3054a500.yaml
2018-06-21 01:16:07.000000000 +0200
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ Added support for managing project-specific limits. The ``POST`` API for
+ limits in keystone supports batch creation, but the client implementation
+ does not. Creation for limits using the client must be done one at a time.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/releasenotes/notes/add-support-for-registered-limits-d83b888ea65a614b.yaml
new/python-keystoneclient-3.17.0/releasenotes/notes/add-support-for-registered-limits-d83b888ea65a614b.yaml
---
old/python-keystoneclient-3.15.0/releasenotes/notes/add-support-for-registered-limits-d83b888ea65a614b.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/python-keystoneclient-3.17.0/releasenotes/notes/add-support-for-registered-limits-d83b888ea65a614b.yaml
2018-06-21 01:16:07.000000000 +0200
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ Added support for managing registered limits. The ``POST`` API for
+ registered limits in keystone supports batch creation, but the client
+ implementation does not. Creation of registered limits using the client
+ must be done one at a time.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/releasenotes/source/index.rst
new/python-keystoneclient-3.17.0/releasenotes/source/index.rst
--- old/python-keystoneclient-3.15.0/releasenotes/source/index.rst
2018-01-24 21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/releasenotes/source/index.rst
2018-06-21 01:15:51.000000000 +0200
@@ -6,6 +6,7 @@
:maxdepth: 1
unreleased
+ queens
pike
ocata
newton
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/python-keystoneclient-3.15.0/releasenotes/source/queens.rst
new/python-keystoneclient-3.17.0/releasenotes/source/queens.rst
--- old/python-keystoneclient-3.15.0/releasenotes/source/queens.rst
1970-01-01 01:00:00.000000000 +0100
+++ new/python-keystoneclient-3.17.0/releasenotes/source/queens.rst
2018-06-21 01:15:51.000000000 +0200
@@ -0,0 +1,6 @@
+===================================
+ Queens Series Release Notes
+===================================
+
+.. release-notes::
+ :branch: stable/queens
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/requirements.txt
new/python-keystoneclient-3.17.0/requirements.txt
--- old/python-keystoneclient-3.15.0/requirements.txt 2018-01-24
21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/requirements.txt 2018-06-21
01:15:51.000000000 +0200
@@ -5,8 +5,8 @@
pbr!=2.1.0,>=2.0.0 # Apache-2.0
debtcollector>=1.2.0 # Apache-2.0
-keystoneauth1>=3.3.0 # Apache-2.0
-oslo.config>=5.1.0 # Apache-2.0
+keystoneauth1>=3.4.0 # Apache-2.0
+oslo.config>=5.2.0 # Apache-2.0
oslo.i18n>=3.15.3 # Apache-2.0
oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0
oslo.utils>=3.33.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/test-requirements.txt
new/python-keystoneclient-3.17.0/test-requirements.txt
--- old/python-keystoneclient-3.15.0/test-requirements.txt 2018-01-24
21:08:40.000000000 +0100
+++ new/python-keystoneclient-3.17.0/test-requirements.txt 2018-06-21
01:15:51.000000000 +0200
@@ -10,9 +10,9 @@
keyring>=5.5.1 # MIT/PSF
lxml!=3.7.0,>=3.4.1 # BSD
mock>=2.0.0 # BSD
-oauthlib>=0.6.0 # BSD
+oauthlib>=0.6.2 # BSD
oslotest>=3.2.0 # Apache-2.0
-requests-mock>=1.1.0 # Apache-2.0
+requests-mock>=1.2.0 # Apache-2.0
tempest>=17.1.0 # Apache-2.0
testrepository>=0.0.18 # Apache-2.0/BSD
testresources>=2.0.0 # Apache-2.0/BSD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/python-keystoneclient-3.15.0/tox.ini
new/python-keystoneclient-3.17.0/tox.ini
--- old/python-keystoneclient-3.15.0/tox.ini 2018-01-24 21:08:40.000000000
+0100
+++ new/python-keystoneclient-3.17.0/tox.ini 2018-06-21 01:15:51.000000000
+0200
@@ -19,23 +19,28 @@
whitelist_externals = find
[testenv:pep8]
+basepython = python3
commands =
flake8
bandit -r keystoneclient -x tests -n5
[testenv:bandit]
+basepython = python3
# NOTE(browne): This is required for the integration test job of the bandit
# project. Please do not remove.
commands = bandit -r keystoneclient -x tests -n5
[testenv:venv]
+basepython = python3
commands = {posargs}
[testenv:cover]
+basepython = python3
commands = python setup.py testr --coverage --testr-args='{posargs}'
coverage report
[testenv:debug]
+basepython = python3
commands = oslo_debug_helper -t keystoneclient/tests {posargs}
[testenv:functional]
@@ -55,10 +60,12 @@
exclude = .venv,.tox,dist,doc,*egg,build
[testenv:docs]
+basepython = python3
commands = python setup.py build_sphinx
deps = -r{toxinidir}/doc/requirements.txt
[testenv:releasenotes]
+basepython = python3
commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html
releasenotes/source releasenotes/build/html
deps = -r{toxinidir}/doc/requirements.txt
@@ -67,9 +74,17 @@
keystoneclient.i18n
[testenv:bindep]
+basepython = python3
# Do not install any requirements. We want this to be fast and work even if
# system dependencies are missing, since it's used to tell you what system
# dependencies are missing! This also means that bindep must be installed
# separately, outside of the requirements files.
deps = bindep
commands = bindep test
+
+[testenv:lower-constraints]
+basepython = python3
+deps =
+ -c{toxinidir}/lower-constraints.txt
+ -r{toxinidir}/test-requirements.txt
+ -r{toxinidir}/requirements.txt