diff -Nru python-keystoneclient-3.18.0/AUTHORS python-keystoneclient-3.19.0/AUTHORS --- python-keystoneclient-3.18.0/AUTHORS 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/AUTHORS 2019-02-28 18:18:43.000000000 +0000 @@ -47,6 +47,7 @@ Clark Boylan Claudiu Belu Clint Byrum +Colleen Murphy Colleen Murphy Corey Bryant Cyril Roelandt @@ -104,6 +105,7 @@ Jamie Lennox Javeme Jay Pipes +Jens Harbott Jeremy Stanley Jesse Andrews Joao Paulo Targino @@ -157,6 +159,7 @@ Nachiappan VR N Nam Nguyen Hoai Navid Pustchi +Neha Alhat Nicolas Simonds Nisha Yadav Ondřej Kobližek @@ -237,6 +240,7 @@ Zhenguo Niu ZhiQiang Fan ZhiQiang Fan +ZhijunWei Zhongyue Luo Zhongyue Luo Ziad Sawalha @@ -267,12 +271,15 @@ mathrock melissaml nachiappan-veerappan-nachiappan +openstack pawnesh.kumar +qingszhao rajiv root shu-mutou sonu.kumar sridhargaddam +sunjia termie venkatamahesh wanghong diff -Nru python-keystoneclient-3.18.0/ChangeLog python-keystoneclient-3.19.0/ChangeLog --- python-keystoneclient-3.18.0/ChangeLog 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/ChangeLog 2019-02-28 18:18:43.000000000 +0000 @@ -1,6 +1,22 @@ CHANGES ======= +3.19.0 +------ + +* add python 3.7 unit test job +* Add return-request-id-to-caller function(v3/contrib) +* Update hacking version +* Change openstack-dev to openstack-discuss +* Add Python 3.6 classifier to setup.cfg +* Add release notes for return-request-id-to-caller +* Fix keystoneclient-devstack-functional job +* Use python3 for functional tests +* Make the functional test voting +* Add py36 tox environment +* Convert functional tests to Zuulv3 +* Add return-request-id-to-caller function(v3/contrib) + 3.18.0 ------ diff -Nru python-keystoneclient-3.18.0/debian/changelog python-keystoneclient-3.19.0/debian/changelog --- python-keystoneclient-3.18.0/debian/changelog 2018-11-15 19:40:48.000000000 +0000 +++ python-keystoneclient-3.19.0/debian/changelog 2019-03-11 20:27:29.000000000 +0000 @@ -1,8 +1,15 @@ -python-keystoneclient (1:3.18.0-0ubuntu1~cloud0) bionic-stein; urgency=medium +python-keystoneclient (1:3.19.0-0ubuntu1~cloud0) bionic-stein; urgency=medium * New upstream release for the Ubuntu Cloud Archive. - -- Openstack Ubuntu Testing Bot Thu, 15 Nov 2018 19:40:48 +0000 + -- Openstack Ubuntu Testing Bot Mon, 11 Mar 2019 20:27:29 +0000 + +python-keystoneclient (1:3.19.0-0ubuntu1) disco; urgency=medium + + * New upstream release for OpenStack Stein. + * d/control: Align (Build-)Depends with upstream. + + -- Corey Bryant Mon, 11 Mar 2019 15:03:14 -0400 python-keystoneclient (1:3.18.0-0ubuntu1) disco; urgency=medium diff -Nru python-keystoneclient-3.18.0/debian/control python-keystoneclient-3.19.0/debian/control --- python-keystoneclient-3.18.0/debian/control 2018-11-14 18:22:45.000000000 +0000 +++ python-keystoneclient-3.19.0/debian/control 2019-03-11 19:03:14.000000000 +0000 @@ -24,7 +24,7 @@ python-coverage (>= 4.0), python-debtcollector (>= 1.2.0), python-fixtures (>= 3.0.0), - python-hacking (>= 0.10.0), + python-hacking (>= 1.1.0), python-keyring (>= 5.5.1), python-keystoneauth1 (>= 3.4.0), python-lxml (>= 3.4.1), @@ -53,7 +53,7 @@ python3-coverage (>= 4.0), python3-debtcollector (>= 1.2.0), python3-fixtures (>= 3.0.0), - python3-hacking (>= 0.10.0), + python3-hacking (>= 1.1.0), python3-keyring (>= 5.5.1), python3-keystoneauth1 (>= 3.4.0), python3-lxml (>= 3.4.1), diff -Nru python-keystoneclient-3.18.0/keystoneclient/access.py python-keystoneclient-3.19.0/keystoneclient/access.py --- python-keystoneclient-3.18.0/keystoneclient/access.py 2018-10-24 17:18:37.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/access.py 2019-02-28 18:17:12.000000000 +0000 @@ -554,9 +554,9 @@ 'scoped is deprecated as of the 1.7.0 release in favor of ' 'project_scoped and may be removed in the 2.0.0 release.', DeprecationWarning) - if ('serviceCatalog' in self - and self['serviceCatalog'] - and 'tenant' in self['token']): + if ('serviceCatalog' in self and + self['serviceCatalog'] and + 'tenant' in self['token']): return True return False diff -Nru python-keystoneclient-3.18.0/keystoneclient/base.py python-keystoneclient-3.19.0/keystoneclient/base.py --- python-keystoneclient-3.18.0/keystoneclient/base.py 2018-10-24 17:18:37.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/base.py 2019-02-28 18:17:12.000000000 +0000 @@ -214,6 +214,10 @@ else: return self._prepare_return_value( resp, self.resource_class(self, body)) + # In some cases (e.g. 'add_endpoint_to_project' from endpoint_filters + # resource), PUT request may not return a body so return None as + # response along with request_id if include_metadata is True. + return self._prepare_return_value(resp, body) def _patch(self, url, body=None, response_key=None, **kwargs): """Update an object with PATCH method. diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/functional/hooks/post_test_hook.sh python-keystoneclient-3.19.0/keystoneclient/tests/functional/hooks/post_test_hook.sh --- python-keystoneclient-3.18.0/keystoneclient/tests/functional/hooks/post_test_hook.sh 2018-10-24 17:18:37.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/functional/hooks/post_test_hook.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -#!/bin/bash -xe - -# 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. - -# This script is executed inside post_test_hook function in devstack gate. - -function generate_testr_results { - if [ -f .testrepository/0 ]; then - sudo .tox/functional/bin/testr last --subunit > $WORKSPACE/testrepository.subunit - sudo mv $WORKSPACE/testrepository.subunit $BASE/logs/testrepository.subunit - sudo /usr/os-testr-env/bin/subunit2html $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html - sudo gzip -9 $BASE/logs/testrepository.subunit - sudo gzip -9 $BASE/logs/testr_results.html - sudo chown $USER:$USER $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz - sudo chmod a+r $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz - fi -} - -export KEYSTONECLIENT_DIR="$BASE/new/python-keystoneclient" - -# Get admin credentials -cd $BASE/new/devstack -source openrc admin admin - -# Go to the keystoneclient dir -cd $KEYSTONECLIENT_DIR - -sudo chown -R $USER:stack $KEYSTONECLIENT_DIR - -# Run tests -echo "Running keystoneclient functional test suite" -set +e -# Preserve env for OS_ credentials -sudo -E -H -u $USER tox -efunctional -EXIT_CODE=$? -set -e - -# Collect and parse result -generate_testr_results -exit $EXIT_CODE diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_federation.py python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_federation.py --- python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_federation.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_federation.py 2019-02-28 18:17:12.000000000 +0000 @@ -11,6 +11,7 @@ # under the License. import copy +import fixtures import uuid from keystoneauth1 import exceptions @@ -582,3 +583,244 @@ req_ref[attr], 'Expected different %s' % attr) self.assertEntityRequestBodyIs(req_ref) + + +class IdentityProviderRequestIdTests(utils.TestRequestId): + + def setUp(self): + super(IdentityProviderRequestIdTests, self).setUp() + self.mgr = identity_providers.IdentityProviderManager(self.client) + + def _mock_request_method(self, method=None, body=None): + return self.useFixture(fixtures.MockPatchObject( + self.client, method, autospec=True, + return_value=(self.resp, body)) + ).mock + + def test_get_identity_provider(self): + body = {"identity_provider": {"name": "admin"}} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get("admin") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/admin') + + def test_list_identity_provider(self): + body = {"identity_providers": [{"name": "admin"}]} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.list() + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('OS-FEDERATION/identity_providers?') + + def test_create_identity_provider(self): + body = {"identity_provider": {"name": "admin"}} + self._mock_request_method(method='post', body=body) + put_mock = self._mock_request_method(method='put', body=body) + + response = self.mgr.create(id="admin", description='fake') + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + put_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/admin', + body={'identity_provider': {'description': 'fake'}}) + + def test_update_identity_provider(self): + body = {"identity_provider": {"name": "admin"}} + patch_mock = self._mock_request_method(method='patch', body=body) + self._mock_request_method(method='post', body=body) + + response = self.mgr.update("admin") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + patch_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/admin', body={ + 'identity_provider': {}}) + + def test_delete_identity_provider(self): + get_mock = self._mock_request_method(method='delete') + + _, resp = self.mgr.delete("admin") + self.assertEqual(resp.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/admin') + + +class MappingRequestIdTests(utils.TestRequestId): + + def setUp(self): + super(MappingRequestIdTests, self).setUp() + self.mgr = mappings.MappingManager(self.client) + + def _mock_request_method(self, method=None, body=None): + return self.useFixture(fixtures.MockPatchObject( + self.client, method, autospec=True, + return_value=(self.resp, body)) + ).mock + + def test_get_mapping(self): + body = {"mapping": {"name": "admin"}} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get("admin") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('OS-FEDERATION/mappings/admin') + + def test_list_mapping(self): + body = {"mappings": [{"name": "admin"}]} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.list() + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('OS-FEDERATION/mappings?') + + def test_create_mapping(self): + body = {"mapping": {"name": "admin"}} + self._mock_request_method(method='post', body=body) + put_mock = self._mock_request_method(method='put', body=body) + + response = self.mgr.create(mapping_id="admin", description='fake') + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + put_mock.assert_called_once_with( + 'OS-FEDERATION/mappings/admin', body={ + 'mapping': {'description': 'fake'}}) + + def test_update_mapping(self): + body = {"mapping": {"name": "admin"}} + patch_mock = self._mock_request_method(method='patch', body=body) + self._mock_request_method(method='post', body=body) + + response = self.mgr.update("admin") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + patch_mock.assert_called_once_with( + 'OS-FEDERATION/mappings/admin', body={'mapping': {}}) + + def test_delete_mapping(self): + get_mock = self._mock_request_method(method='delete') + + _, resp = self.mgr.delete("admin") + self.assertEqual(resp.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('OS-FEDERATION/mappings/admin') + + +class ProtocolRequestIdTests(utils.TestRequestId): + + def setUp(self): + super(ProtocolRequestIdTests, self).setUp() + self.mgr = protocols.ProtocolManager(self.client) + + def _mock_request_method(self, method=None, body=None): + return self.useFixture(fixtures.MockPatchObject( + self.client, method, autospec=True, + return_value=(self.resp, body)) + ).mock + + def test_get_protocol(self): + body = {"protocol": {"name": "admin"}} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get("admin", "protocol") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/admin/protocols/protocol') + + def test_list_protocol(self): + body = {"protocols": [{"name": "admin"}]} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.list("identity_provider") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/identity_provider/protocols?') + + def test_create_protocol(self): + body = {"protocol": {"name": "admin"}} + self._mock_request_method(method='post', body=body) + put_mock = self._mock_request_method(method='put', body=body) + + response = self.mgr.create( + protocol_id="admin", identity_provider='fake', mapping='fake') + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + put_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/fake/protocols/admin', body={ + 'protocol': {'mapping_id': 'fake'}}) + + def test_update_protocol(self): + body = {"protocol": {"name": "admin"}} + patch_mock = self._mock_request_method(method='patch', body=body) + self._mock_request_method(method='post', body=body) + + response = self.mgr.update(protocol="admin", identity_provider='fake', + mapping='fake') + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + patch_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/fake/protocols/admin', body={ + 'protocol': {'mapping_id': 'fake'}}) + + def test_delete_protocol(self): + get_mock = self._mock_request_method(method='delete') + + _, resp = self.mgr.delete("identity_provider", "protocol") + self.assertEqual(resp.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/identity_providers/' + 'identity_provider/protocols/protocol') + + +class ServiceProviderRequestIdTests(utils.TestRequestId): + + def setUp(self): + super(ServiceProviderRequestIdTests, self).setUp() + self.mgr = service_providers.ServiceProviderManager(self.client) + + def _mock_request_method(self, method=None, body=None): + return self.useFixture(fixtures.MockPatchObject( + self.client, method, autospec=True, + return_value=(self.resp, body)) + ).mock + + def test_get_service_provider(self): + body = {"service_provider": {"name": "admin"}} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get("provider") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/service_providers/provider') + + def test_list_service_provider(self): + body = {"service_providers": [{"name": "admin"}]} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.list() + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('OS-FEDERATION/service_providers?') + + def test_create_service_provider(self): + body = {"service_provider": {"name": "admin"}} + self._mock_request_method(method='post', body=body) + put_mock = self._mock_request_method(method='put', body=body) + + response = self.mgr.create(id='provider') + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + put_mock.assert_called_once_with( + 'OS-FEDERATION/service_providers/provider', body={ + 'service_provider': {}}) + + def test_update_service_provider(self): + body = {"service_provider": {"name": "admin"}} + patch_mock = self._mock_request_method(method='patch', body=body) + self._mock_request_method(method='post', body=body) + + response = self.mgr.update("provider") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + patch_mock.assert_called_once_with( + 'OS-FEDERATION/service_providers/provider', body={ + 'service_provider': {}}) + + def test_delete_service_provider(self): + get_mock = self._mock_request_method(method='delete') + + _, resp = self.mgr.delete("provider") + self.assertEqual(resp.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + 'OS-FEDERATION/service_providers/provider') diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_oauth1.py python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_oauth1.py --- python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_oauth1.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_oauth1.py 2019-02-28 18:17:12.000000000 +0000 @@ -11,6 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import fixtures import uuid import mock @@ -277,6 +278,53 @@ oauth_client) +class OauthRequestIdTests(utils.TestRequestId, TokenTests): + + def setUp(self): + super(OauthRequestIdTests, self).setUp() + self.mgr = consumers.ConsumerManager(self.client) + + def _mock_request_method(self, method=None, body=None): + return self.useFixture(fixtures.MockPatchObject( + self.client, method, autospec=True, + return_value=(self.resp, body)) + ).mock + + def test_get_consumers(self): + body = {"consumer": {"name": "admin"}} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get("admin") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('/OS-OAUTH1/consumers/admin') + + def test_create_consumers(self): + body = {"consumer": {"name": "admin"}} + post_mock = self._mock_request_method(method='post', body=body) + + response = self.mgr.create(name="admin", description="fake") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + post_mock.assert_called_once_with('/OS-OAUTH1/consumers', body={ + 'consumer': {'name': 'admin', 'description': 'fake'}}) + + def test_update_consumers(self): + body = {"consumer": {"name": "admin"}} + patch_mock = self._mock_request_method(method='patch', body=body) + self._mock_request_method(method='post', body=body) + + response = self.mgr.update("admin", "demo") + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + patch_mock.assert_called_once_with('/OS-OAUTH1/consumers/admin', body={ + 'consumer': {'description': 'demo'}}) + + def test_delete_consumers(self): + get_mock = self._mock_request_method(method='delete') + + _, resp = self.mgr.delete("admin") + self.assertEqual(resp.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with('/OS-OAUTH1/consumers/admin') + + class TestOAuthLibModule(utils.TestCase): def test_no_oauthlib_installed(self): diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_projects.py python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_projects.py --- python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_projects.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_projects.py 2019-02-28 18:17:12.000000000 +0000 @@ -11,16 +11,12 @@ # under the License. import fixtures -import requests import uuid from keystoneauth1 import exceptions as ksa_exceptions -from keystoneauth1.identity import v3 -from keystoneauth1 import session from keystoneclient import exceptions as ksc_exceptions from keystoneclient.tests.unit.v3 import utils -from keystoneclient.v3 import client from keystoneclient.v3 import projects @@ -402,20 +398,12 @@ return ret -class ProjectsRequestIdTests(utils.TestCase): +class ProjectsRequestIdTests(utils.TestRequestId): url = "/projects" - resp = requests.Response() - TEST_REQUEST_ID = uuid.uuid4().hex - resp.headers['x-openstack-request-id'] = TEST_REQUEST_ID def setUp(self): super(ProjectsRequestIdTests, self).setUp() - auth = v3.Token(auth_url='http://127.0.0.1:5000', - token=self.TEST_TOKEN) - session_ = session.Session(auth=auth) - self.client = client.Client(session=session_, - include_metadata='True')._adapter self.mgr = projects.ProjectManager(self.client) self.mgr.resource_class = projects.Project diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_roles.py python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_roles.py --- python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_roles.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_roles.py 2019-02-28 18:17:12.000000000 +0000 @@ -656,7 +656,7 @@ implied_role_id = uuid.uuid4().hex self.stub_url('HEAD', ['roles', prior_role_id, 'implies', implied_role_id], - status_code=200) + status_code=204) result = self.manager.check(prior_role_id, implied_role_id) self.assertTrue(result) diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_simple_cert.py python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_simple_cert.py --- python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/test_simple_cert.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/test_simple_cert.py 2019-02-28 18:17:12.000000000 +0000 @@ -11,10 +11,12 @@ # License for the specific language governing permissions and limitations # under the License. +import fixtures import testresources from keystoneclient.tests.unit import client_fixtures from keystoneclient.tests.unit.v3 import utils +from keystoneclient.v3.contrib import simple_cert class SimpleCertTests(utils.ClientTestCase, testresources.ResourcedTestCase): @@ -36,5 +38,36 @@ self.assertEqual(self.examples.SIGNING_CERT, res) +class SimpleCertRequestIdTests(utils.TestRequestId): + + def setUp(self): + super(SimpleCertRequestIdTests, self).setUp() + self.mgr = simple_cert.SimpleCertManager(self.client) + + def _mock_request_method(self, method=None, body=None): + return self.useFixture(fixtures.MockPatchObject( + self.client, method, autospec=True, + return_value=(self.resp, body)) + ).mock + + def test_list_ca_certificates(self): + body = {"certificates": [{"name": "admin"}, {"name": "admin2"}]} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get_ca_certificates() + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + '/OS-SIMPLE-CERT/ca', authenticated=False) + + def test_list_certificates(self): + body = {"certificates": [{"name": "admin"}, {"name": "admin2"}]} + get_mock = self._mock_request_method(method='get', body=body) + + response = self.mgr.get_certificates() + self.assertEqual(response.request_ids[0], self.TEST_REQUEST_ID) + get_mock.assert_called_once_with( + '/OS-SIMPLE-CERT/certificates', authenticated=False) + + def load_tests(loader, tests, pattern): return testresources.OptimisingTestSuite(tests) diff -Nru python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/utils.py python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/utils.py --- python-keystoneclient-3.18.0/keystoneclient/tests/unit/v3/utils.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/tests/unit/v3/utils.py 2019-02-28 18:17:12.000000000 +0000 @@ -10,12 +10,16 @@ # License for the specific language governing permissions and limitations # under the License. +import requests import uuid from six.moves.urllib import parse as urlparse +from keystoneauth1.identity import v3 +from keystoneauth1 import session from keystoneclient.tests.unit import client_fixtures from keystoneclient.tests.unit import utils +from keystoneclient.v3 import client def parameterize(ref): @@ -375,3 +379,17 @@ self.stub_entity('DELETE', id=ref['id'], status_code=204) self.manager.delete(ref['id']) + + +class TestRequestId(TestCase): + resp = requests.Response() + TEST_REQUEST_ID = uuid.uuid4().hex + resp.headers['x-openstack-request-id'] = TEST_REQUEST_ID + + def setUp(self): + super(TestRequestId, self).setUp() + auth = v3.Token(auth_url='http://127.0.0.1:5000', + token=self.TEST_TOKEN) + session_ = session.Session(auth=auth) + self.client = client.Client(session=session_, + include_metadata='True')._adapter diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/contrib/endpoint_policy.py python-keystoneclient-3.19.0/keystoneclient/v3/contrib/endpoint_policy.py --- python-keystoneclient-3.18.0/keystoneclient/v3/contrib/endpoint_policy.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/contrib/endpoint_policy.py 2019-02-28 18:17:12.000000000 +0000 @@ -39,17 +39,17 @@ def create_policy_association_for_endpoint(self, policy, endpoint): """Create an association between a policy and an endpoint.""" - self._act_on_policy_association_for_endpoint( + return self._act_on_policy_association_for_endpoint( policy, endpoint, self._put) def check_policy_association_for_endpoint(self, policy, endpoint): """Check an association between a policy and an endpoint.""" - self._act_on_policy_association_for_endpoint( + return self._act_on_policy_association_for_endpoint( policy, endpoint, self._head) def delete_policy_association_for_endpoint(self, policy, endpoint): """Delete an association between a policy and an endpoint.""" - self._act_on_policy_association_for_endpoint( + return self._act_on_policy_association_for_endpoint( policy, endpoint, self._delete) def _act_on_policy_association_for_service(self, policy, service, action): @@ -67,17 +67,17 @@ def create_policy_association_for_service(self, policy, service): """Create an association between a policy and a service.""" - self._act_on_policy_association_for_service( + return self._act_on_policy_association_for_service( policy, service, self._put) def check_policy_association_for_service(self, policy, service): """Check an association between a policy and a service.""" - self._act_on_policy_association_for_service( + return self._act_on_policy_association_for_service( policy, service, self._head) def delete_policy_association_for_service(self, policy, service): """Delete an association between a policy and a service.""" - self._act_on_policy_association_for_service( + return self._act_on_policy_association_for_service( policy, service, self._delete) def _act_on_policy_association_for_region_and_service( @@ -99,19 +99,19 @@ def create_policy_association_for_region_and_service( self, policy, region, service): """Create an association between a policy and a service in a region.""" - self._act_on_policy_association_for_region_and_service( + return self._act_on_policy_association_for_region_and_service( policy, region, service, self._put) def check_policy_association_for_region_and_service( self, policy, region, service): """Check an association between a policy and a service in a region.""" - self._act_on_policy_association_for_region_and_service( + return self._act_on_policy_association_for_region_and_service( policy, region, service, self._head) def delete_policy_association_for_region_and_service( self, policy, region, service): """Delete an association between a policy and a service in a region.""" - self._act_on_policy_association_for_region_and_service( + return self._act_on_policy_association_for_region_and_service( policy, region, service, self._delete) def get_policy_for_endpoint(self, endpoint): @@ -130,9 +130,10 @@ 'endpoint_id': endpoint_id, 'ext_name': self.OS_EP_POLICY_EXT} - _resp, body = self.client.get(url) - return policies.Policy( - self, body[policies.PolicyManager.key], loaded=True) + resp, body = self.client.get(url) + return self._prepare_return_value( + resp, policies.Policy(self, body[policies.PolicyManager.key], + loaded=True)) def list_endpoints_for_policy(self, policy): """List endpoints with the effective association to a policy. diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/contrib/federation/saml.py python-keystoneclient-3.19.0/keystoneclient/v3/contrib/federation/saml.py --- python-keystoneclient-3.18.0/keystoneclient/v3/contrib/federation/saml.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/contrib/federation/saml.py 2019-02-28 18:17:12.000000000 +0000 @@ -37,7 +37,7 @@ headers, body = self._create_common_request(service_provider, token_id) resp, body = self.client.post(SAML2_ENDPOINT, json=body, headers=headers) - return resp.text + return self._prepare_return_value(resp, resp.text) def create_ecp_assertion(self, service_provider, token_id): """Create an ECP wrapped SAML assertion from a token. @@ -56,7 +56,7 @@ headers, body = self._create_common_request(service_provider, token_id) resp, body = self.client.post(ECP_ENDPOINT, json=body, headers=headers) - return resp.text + return self._prepare_return_value(resp, resp.text) def _create_common_request(self, service_provider, token_id): headers = {'Content-Type': 'application/json'} diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/contrib/oauth1/access_tokens.py python-keystoneclient-3.19.0/keystoneclient/v3/contrib/oauth1/access_tokens.py --- python-keystoneclient-3.18.0/keystoneclient/v3/contrib/oauth1/access_tokens.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/contrib/oauth1/access_tokens.py 2019-02-28 18:17:12.000000000 +0000 @@ -48,4 +48,5 @@ http_method='POST') resp, body = self.client.post(endpoint, headers=headers) token = utils.get_oauth_token_from_body(resp.content) - return self.resource_class(self, token) + return self._prepare_return_value(resp, + self.resource_class(self, token)) diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/contrib/oauth1/request_tokens.py python-keystoneclient-3.19.0/keystoneclient/v3/contrib/oauth1/request_tokens.py --- python-keystoneclient-3.18.0/keystoneclient/v3/contrib/oauth1/request_tokens.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/contrib/oauth1/request_tokens.py 2019-02-28 18:17:12.000000000 +0000 @@ -70,4 +70,5 @@ headers=headers) resp, body = self.client.post(endpoint, headers=headers) token = utils.get_oauth_token_from_body(resp.content) - return self.resource_class(self, token) + return self._prepare_return_value(resp, + self.resource_class(self, token)) diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/contrib/simple_cert.py python-keystoneclient-3.19.0/keystoneclient/v3/contrib/simple_cert.py --- python-keystoneclient-3.18.0/keystoneclient/v3/contrib/simple_cert.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/contrib/simple_cert.py 2019-02-28 18:17:12.000000000 +0000 @@ -11,12 +11,15 @@ # License for the specific language governing permissions and limitations # under the License. +from keystoneclient import base + class SimpleCertManager(object): """Manager for the OS-SIMPLE-CERT extension.""" def __init__(self, client): self._client = client + self.mgr = base.Manager(self._client) def get_ca_certificates(self): """Get CA certificates. @@ -27,7 +30,7 @@ """ resp, body = self._client.get('/OS-SIMPLE-CERT/ca', authenticated=False) - return resp.text + return self.mgr._prepare_return_value(resp, resp.text) def get_certificates(self): """Get signing certificates. @@ -38,4 +41,4 @@ """ resp, body = self._client.get('/OS-SIMPLE-CERT/certificates', authenticated=False) - return resp.text + return self.mgr._prepare_return_value(resp, resp.text) diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/limits.py python-keystoneclient-3.19.0/keystoneclient/v3/limits.py --- python-keystoneclient-3.18.0/keystoneclient/v3/limits.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/limits.py 2019-02-28 18:17:12.000000000 +0000 @@ -70,7 +70,9 @@ 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) + return self._prepare_return_value(resp, + self.resource_class( + self, limit)) def update(self, limit, project=None, service=None, resource_name=None, resource_limit=None, description=None, **kwargs): diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/projects.py python-keystoneclient-3.19.0/keystoneclient/v3/projects.py --- python-keystoneclient-3.18.0/keystoneclient/v3/projects.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/projects.py 2019-02-28 18:17:12.000000000 +0000 @@ -278,7 +278,7 @@ """ url = "/projects/%s/tags/%s" % (base.getid(project), urllib.parse.quote(tag)) - self.client.put(url) + return self._put(url) def update_tags(self, project, tags): """Update tag list of a project. @@ -295,7 +295,7 @@ for tag in tags: tag = urllib.parse.quote(tag) resp, body = self.client.put(url, body={"tags": tags}) - return body['tags'] + return self._prepare_return_value(resp, body['tags']) def delete_tag(self, project, tag): """Remove tag from project. @@ -304,7 +304,7 @@ :param tag: str name of tag to remove from project """ - self._delete( + return self._delete( "/projects/%s/tags/%s" % (base.getid(project), urllib.parse.quote(tag))) @@ -318,7 +318,8 @@ """ url = "/projects/%s/tags" % base.getid(project) resp, body = self.client.get(url) - return self._encode_tags(body['tags']) + body['tags'] = self._encode_tags(body['tags']) + return self._prepare_return_value(resp, body['tags']) def check_tag(self, project, tag): """Check if tag is associated with project. @@ -332,9 +333,9 @@ url = "/projects/%s/tags/%s" % (base.getid(project), urllib.parse.quote(tag)) try: - self.client.head(url) + resp, body = self.client.head(url) # no errors means found the tag - return True - except exceptions.NotFound: - # 404 means tag not in project - return False + return self._prepare_return_value(resp, True) + except exceptions.HttpError as ex: + # return false with request_id if include_metadata=True + return self._prepare_return_value(ex.response, False) diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/registered_limits.py python-keystoneclient-3.19.0/keystoneclient/v3/registered_limits.py --- python-keystoneclient-3.18.0/keystoneclient/v3/registered_limits.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/registered_limits.py 2019-02-28 18:17:12.000000000 +0000 @@ -69,7 +69,9 @@ 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) + return self._prepare_return_value(resp, + self.resource_class( + self, registered_limit)) def update(self, registered_limit, service=None, resource_name=None, default_limit=None, description=None, region=None, **kwargs): diff -Nru python-keystoneclient-3.18.0/keystoneclient/v3/roles.py python-keystoneclient-3.19.0/keystoneclient/v3/roles.py --- python-keystoneclient-3.18.0/keystoneclient/v3/roles.py 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/keystoneclient/v3/roles.py 2019-02-28 18:17:12.000000000 +0000 @@ -455,7 +455,8 @@ """ url_tail = self._implied_role_url_tail(prior_role, implied_role) _resp, body = self.client.put("/roles" + url_tail) - return self.resource_class(self, body['role_inference']) + return self._prepare_return_value( + _resp, self.resource_class(self, body['role_inference'])) def delete(self, prior_role, implied_role): """Delete an inference rule. @@ -478,7 +479,7 @@ """ url_tail = self._implied_role_url_tail(prior_role, implied_role) - return self.client.delete("/roles" + url_tail) + return self._delete("/roles" + url_tail) def get(self, prior_role, implied_role): """Retrieve an inference rule. @@ -499,7 +500,8 @@ """ url_tail = self._implied_role_url_tail(prior_role, implied_role) _resp, body = self.client.get("/roles" + url_tail) - return self.resource_class(self, body['role_inference']) + return self._prepare_return_value( + _resp, self.resource_class(self, body['role_inference'])) def list(self, prior_role): """List all roles that a role may imply. @@ -518,7 +520,8 @@ """ url_tail = ('/%s/implies' % base.getid(prior_role)) _resp, body = self.client.get("/roles" + url_tail) - return self.resource_class(self, body['role_inference']) + return self._prepare_return_value( + _resp, self.resource_class(self, body['role_inference'])) def check(self, prior_role, implied_role): """Check if an inference rule exists. @@ -538,7 +541,7 @@ """ url_tail = self._implied_role_url_tail(prior_role, implied_role) - return self.client.head("/roles" + url_tail) + return self._head("/roles" + url_tail) def list_inference_roles(self): """List all rule inferences. diff -Nru python-keystoneclient-3.18.0/PKG-INFO python-keystoneclient-3.19.0/PKG-INFO --- python-keystoneclient-3.18.0/PKG-INFO 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/PKG-INFO 2019-02-28 18:18:44.000000000 +0000 @@ -1,10 +1,10 @@ Metadata-Version: 1.1 Name: python-keystoneclient -Version: 3.18.0 +Version: 3.19.0 Summary: Client Library for OpenStack Identity Home-page: https://docs.openstack.org/python-keystoneclient/latest/ Author: OpenStack -Author-email: openstack-dev@lists.openstack.org +Author-email: openstack-discuss@lists.openstack.org License: UNKNOWN Description: ======================== Team and repository tags @@ -81,3 +81,4 @@ Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 diff -Nru python-keystoneclient-3.18.0/playbooks/keystoneclient-dsvm-functional/post.yaml python-keystoneclient-3.19.0/playbooks/keystoneclient-dsvm-functional/post.yaml --- python-keystoneclient-3.18.0/playbooks/keystoneclient-dsvm-functional/post.yaml 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/playbooks/keystoneclient-dsvm-functional/post.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -- hosts: primary - tasks: - - - name: Copy files from {{ ansible_user_dir }}/workspace/ on node - synchronize: - src: '{{ ansible_user_dir }}/workspace/' - dest: '{{ zuul.executor.log_root }}' - mode: pull - copy_links: true - verify_host: true - rsync_opts: - - --include=**/*nose_results.html - - --include=*/ - - --exclude=* - - --prune-empty-dirs - - - name: Copy files from {{ ansible_user_dir }}/workspace/ on node - synchronize: - src: '{{ ansible_user_dir }}/workspace/' - dest: '{{ zuul.executor.log_root }}' - mode: pull - copy_links: true - verify_host: true - rsync_opts: - - --include=**/*testr_results.html.gz - - --include=*/ - - --exclude=* - - --prune-empty-dirs - - - name: Copy files from {{ ansible_user_dir }}/workspace/ on node - synchronize: - src: '{{ ansible_user_dir }}/workspace/' - dest: '{{ zuul.executor.log_root }}' - mode: pull - copy_links: true - verify_host: true - rsync_opts: - - --include=/.testrepository/tmp* - - --include=*/ - - --exclude=* - - --prune-empty-dirs - - - name: Copy files from {{ ansible_user_dir }}/workspace/ on node - synchronize: - src: '{{ ansible_user_dir }}/workspace/' - dest: '{{ zuul.executor.log_root }}' - mode: pull - copy_links: true - verify_host: true - rsync_opts: - - --include=**/*testrepository.subunit.gz - - --include=*/ - - --exclude=* - - --prune-empty-dirs - - - name: Copy files from {{ ansible_user_dir }}/workspace/ on node - synchronize: - src: '{{ ansible_user_dir }}/workspace/' - dest: '{{ zuul.executor.log_root }}/tox' - mode: pull - copy_links: true - verify_host: true - rsync_opts: - - --include=/.tox/*/log/* - - --include=*/ - - --exclude=* - - --prune-empty-dirs - - - name: Copy files from {{ ansible_user_dir }}/workspace/ on node - synchronize: - src: '{{ ansible_user_dir }}/workspace/' - dest: '{{ zuul.executor.log_root }}' - mode: pull - copy_links: true - verify_host: true - rsync_opts: - - --include=/logs/** - - --include=*/ - - --exclude=* - - --prune-empty-dirs diff -Nru python-keystoneclient-3.18.0/playbooks/keystoneclient-dsvm-functional/run.yaml python-keystoneclient-3.19.0/playbooks/keystoneclient-dsvm-functional/run.yaml --- python-keystoneclient-3.18.0/playbooks/keystoneclient-dsvm-functional/run.yaml 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/playbooks/keystoneclient-dsvm-functional/run.yaml 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -- hosts: all - name: Autoconverted job legacy-keystoneclient-dsvm-functional from old job gate-keystoneclient-dsvm-functional-ubuntu-xenial-nv - tasks: - - - name: Ensure legacy workspace directory - file: - path: '{{ ansible_user_dir }}/workspace' - state: directory - - - shell: - cmd: | - set -e - set -x - cat > clonemap.yaml << EOF - clonemap: - - name: openstack-infra/devstack-gate - dest: devstack-gate - EOF - /usr/zuul-env/bin/zuul-cloner -m clonemap.yaml --cache-dir /opt/git \ - git://git.openstack.org \ - openstack-infra/devstack-gate - executable: /bin/bash - chdir: '{{ ansible_user_dir }}/workspace' - environment: '{{ zuul | zuul_legacy_vars }}' - - - shell: - cmd: | - set -e - set -x - export PYTHONUNBUFFERED=true - export BRANCH_OVERRIDE=default - export DEVSTACK_PROJECT_FROM_GIT=python-keystoneclient - if [ "$BRANCH_OVERRIDE" != "default" ] ; then - export OVERRIDE_ZUUL_BRANCH=$BRANCH_OVERRIDE - fi - - function post_test_hook { - # Configure and run functional tests - $BASE/new/python-keystoneclient/keystoneclient/tests/functional/hooks/post_test_hook.sh - } - export -f post_test_hook - - cp devstack-gate/devstack-vm-gate-wrap.sh ./safe-devstack-vm-gate-wrap.sh - ./safe-devstack-vm-gate-wrap.sh - executable: /bin/bash - chdir: '{{ ansible_user_dir }}/workspace' - environment: '{{ zuul | zuul_legacy_vars }}' diff -Nru python-keystoneclient-3.18.0/playbooks/run-ds-tox.yaml python-keystoneclient-3.19.0/playbooks/run-ds-tox.yaml --- python-keystoneclient-3.18.0/playbooks/run-ds-tox.yaml 1970-01-01 00:00:00.000000000 +0000 +++ python-keystoneclient-3.19.0/playbooks/run-ds-tox.yaml 2019-02-28 18:17:12.000000000 +0000 @@ -0,0 +1,5 @@ +- hosts: all + roles: + - run-devstack + - ensure-tox + - tox diff -Nru python-keystoneclient-3.18.0/playbooks/tox-post.yaml python-keystoneclient-3.19.0/playbooks/tox-post.yaml --- python-keystoneclient-3.18.0/playbooks/tox-post.yaml 1970-01-01 00:00:00.000000000 +0000 +++ python-keystoneclient-3.19.0/playbooks/tox-post.yaml 2019-02-28 18:17:12.000000000 +0000 @@ -0,0 +1,4 @@ +- hosts: all + roles: + - fetch-tox-output + - fetch-subunit-output diff -Nru python-keystoneclient-3.18.0/python_keystoneclient.egg-info/pbr.json python-keystoneclient-3.19.0/python_keystoneclient.egg-info/pbr.json --- python-keystoneclient-3.18.0/python_keystoneclient.egg-info/pbr.json 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/python_keystoneclient.egg-info/pbr.json 2019-02-28 18:18:43.000000000 +0000 @@ -1 +1 @@ -{"git_version": "8982841", "is_release": true} \ No newline at end of file +{"git_version": "6c4bb8b", "is_release": true} \ No newline at end of file diff -Nru python-keystoneclient-3.18.0/python_keystoneclient.egg-info/PKG-INFO python-keystoneclient-3.19.0/python_keystoneclient.egg-info/PKG-INFO --- python-keystoneclient-3.18.0/python_keystoneclient.egg-info/PKG-INFO 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/python_keystoneclient.egg-info/PKG-INFO 2019-02-28 18:18:43.000000000 +0000 @@ -1,10 +1,10 @@ Metadata-Version: 1.1 Name: python-keystoneclient -Version: 3.18.0 +Version: 3.19.0 Summary: Client Library for OpenStack Identity Home-page: https://docs.openstack.org/python-keystoneclient/latest/ Author: OpenStack -Author-email: openstack-dev@lists.openstack.org +Author-email: openstack-discuss@lists.openstack.org License: UNKNOWN Description: ======================== Team and repository tags @@ -81,3 +81,4 @@ Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 diff -Nru python-keystoneclient-3.18.0/python_keystoneclient.egg-info/SOURCES.txt python-keystoneclient-3.19.0/python_keystoneclient.egg-info/SOURCES.txt --- python-keystoneclient-3.18.0/python_keystoneclient.egg-info/SOURCES.txt 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/python_keystoneclient.egg-info/SOURCES.txt 2019-02-28 18:18:43.000000000 +0000 @@ -110,7 +110,6 @@ keystoneclient/tests/functional/__init__.py keystoneclient/tests/functional/base.py keystoneclient/tests/functional/test_base.py -keystoneclient/tests/functional/hooks/post_test_hook.sh keystoneclient/tests/functional/v3/__init__.py keystoneclient/tests/functional/v3/client_fixtures.py keystoneclient/tests/functional/v3/test_credentials.py @@ -270,8 +269,8 @@ keystoneclient/v3/contrib/oauth1/core.py keystoneclient/v3/contrib/oauth1/request_tokens.py keystoneclient/v3/contrib/oauth1/utils.py -playbooks/keystoneclient-dsvm-functional/post.yaml -playbooks/keystoneclient-dsvm-functional/run.yaml +playbooks/run-ds-tox.yaml +playbooks/tox-post.yaml python_keystoneclient.egg-info/PKG-INFO python_keystoneclient.egg-info/SOURCES.txt python_keystoneclient.egg-info/dependency_links.txt @@ -302,6 +301,7 @@ releasenotes/notes/remove_apiclient_exceptions-6580003a885db286.yaml releasenotes/notes/remove_cli-d2c4435ba6a09b79.yaml releasenotes/notes/removed-generic-client-ff505b2b01bc9302.yaml +releasenotes/notes/return-request-id-to-caller-97fa269ad626f8c1.yaml releasenotes/source/conf.py releasenotes/source/index.rst releasenotes/source/mitaka.rst diff -Nru python-keystoneclient-3.18.0/releasenotes/notes/return-request-id-to-caller-97fa269ad626f8c1.yaml python-keystoneclient-3.19.0/releasenotes/notes/return-request-id-to-caller-97fa269ad626f8c1.yaml --- python-keystoneclient-3.18.0/releasenotes/notes/return-request-id-to-caller-97fa269ad626f8c1.yaml 1970-01-01 00:00:00.000000000 +0000 +++ python-keystoneclient-3.19.0/releasenotes/notes/return-request-id-to-caller-97fa269ad626f8c1.yaml 2019-02-28 18:17:12.000000000 +0000 @@ -0,0 +1,13 @@ +--- +features: + - > + [`blueprint return-request-id-to-caller + `_] + Instantiating client with ``include_metadata=True`` will cause manager response to return data + along with request_ids for better tracing. Refer [`using-api-v3 + `_] + + + Added support to return "x-openstack-request-id" header in request_ids attribute if + ``include_metadata=True``. Also, for APIs which return response as None, client will return request_ids + as well if ``include_metadata`` is True. \ No newline at end of file diff -Nru python-keystoneclient-3.18.0/setup.cfg python-keystoneclient-3.19.0/setup.cfg --- python-keystoneclient-3.18.0/setup.cfg 2018-10-24 17:19:40.000000000 +0000 +++ python-keystoneclient-3.19.0/setup.cfg 2019-02-28 18:18:44.000000000 +0000 @@ -4,7 +4,7 @@ description-file = README.rst author = OpenStack -author-email = openstack-dev@lists.openstack.org +author-email = openstack-discuss@lists.openstack.org home-page = https://docs.openstack.org/python-keystoneclient/latest/ classifier = Environment :: OpenStack @@ -17,6 +17,7 @@ Programming Language :: Python :: 2.7 Programming Language :: Python :: 3 Programming Language :: Python :: 3.5 + Programming Language :: Python :: 3.6 [files] packages = diff -Nru python-keystoneclient-3.18.0/test-requirements.txt python-keystoneclient-3.19.0/test-requirements.txt --- python-keystoneclient-3.18.0/test-requirements.txt 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/test-requirements.txt 2019-02-28 18:17:12.000000000 +0000 @@ -2,7 +2,7 @@ # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. -hacking<0.11,>=0.10.0 +hacking>=1.1.0,<1.2.0 # Apache-2.0 flake8-docstrings==0.2.1.post1 # MIT coverage!=4.4,>=4.0 # Apache-2.0 diff -Nru python-keystoneclient-3.18.0/tox.ini python-keystoneclient-3.19.0/tox.ini --- python-keystoneclient-3.18.0/tox.ini 2018-10-24 17:18:38.000000000 +0000 +++ python-keystoneclient-3.19.0/tox.ini 2019-02-28 18:17:12.000000000 +0000 @@ -1,7 +1,7 @@ [tox] minversion = 2.0 skipsdist = True -envlist = py35,py27,pep8,releasenotes +envlist = py36,py35,py27,pep8,releasenotes [testenv] usedevelop = True @@ -50,6 +50,7 @@ commands = oslo_debug_helper -t keystoneclient/tests {posargs} [testenv:functional] +basepython = python3 setenv = {[testenv]setenv} OS_TEST_PATH=./keystoneclient/tests/functional passenv = OS_* diff -Nru python-keystoneclient-3.18.0/.zuul.yaml python-keystoneclient-3.19.0/.zuul.yaml --- python-keystoneclient-3.18.0/.zuul.yaml 2018-10-24 17:18:37.000000000 +0000 +++ python-keystoneclient-3.19.0/.zuul.yaml 2019-02-28 18:17:12.000000000 +0000 @@ -1,13 +1,19 @@ - job: name: keystoneclient-devstack-functional - parent: legacy-dsvm-base - run: playbooks/keystoneclient-dsvm-functional/run.yaml - post-run: playbooks/keystoneclient-dsvm-functional/post.yaml + parent: devstack-minimal timeout: 4200 required-projects: - - openstack-infra/devstack-gate - openstack/keystone - openstack/python-keystoneclient + run: playbooks/run-ds-tox.yaml + post-run: playbooks/tox-post.yaml + vars: + devstack_localrc: + USE_PYTHON3: True + devstack_services: + key: true + tox_envlist: functional + zuul_work_dir: src/git.openstack.org/openstack/python-keystoneclient - project: templates: @@ -16,6 +22,7 @@ - openstack-python-jobs - openstack-python35-jobs - openstack-python36-jobs + - openstack-python37-jobs - publish-openstack-docs-pti - check-requirements - lib-forward-testing @@ -23,5 +30,7 @@ - release-notes-jobs-python3 check: jobs: - - keystoneclient-devstack-functional: - voting: false + - keystoneclient-devstack-functional + gate: + jobs: + - keystoneclient-devstack-functional