Merge "Add return-request-id-to-caller function(v3/contrib)"

This commit is contained in:
Zuul
2018-11-29 20:40:07 +00:00
committed by Gerrit Code Review
9 changed files with 364 additions and 29 deletions

View File

@@ -11,6 +11,7 @@
# under the License. # under the License.
import copy import copy
import fixtures
import uuid import uuid
from keystoneauth1 import exceptions from keystoneauth1 import exceptions
@@ -582,3 +583,244 @@ class ServiceProviderTests(utils.ClientTestCase, utils.CrudTests):
req_ref[attr], req_ref[attr],
'Expected different %s' % attr) 'Expected different %s' % attr)
self.assertEntityRequestBodyIs(req_ref) 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')

View File

@@ -11,6 +11,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import fixtures
import uuid import uuid
import mock import mock
@@ -277,6 +278,53 @@ class AuthenticateWithOAuthTests(utils.TestCase, TokenTests):
oauth_client) 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): class TestOAuthLibModule(utils.TestCase):
def test_no_oauthlib_installed(self): def test_no_oauthlib_installed(self):

View File

@@ -11,16 +11,12 @@
# under the License. # under the License.
import fixtures import fixtures
import requests
import uuid import uuid
from keystoneauth1 import exceptions as ksa_exceptions 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 import exceptions as ksc_exceptions
from keystoneclient.tests.unit.v3 import utils from keystoneclient.tests.unit.v3 import utils
from keystoneclient.v3 import client
from keystoneclient.v3 import projects from keystoneclient.v3 import projects
@@ -402,20 +398,12 @@ class ProjectTests(utils.ClientTestCase, utils.CrudTests):
return ret return ret
class ProjectsRequestIdTests(utils.TestCase): class ProjectsRequestIdTests(utils.TestRequestId):
url = "/projects" url = "/projects"
resp = requests.Response()
TEST_REQUEST_ID = uuid.uuid4().hex
resp.headers['x-openstack-request-id'] = TEST_REQUEST_ID
def setUp(self): def setUp(self):
super(ProjectsRequestIdTests, self).setUp() 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 = projects.ProjectManager(self.client)
self.mgr.resource_class = projects.Project self.mgr.resource_class = projects.Project

View File

@@ -11,10 +11,12 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import fixtures
import testresources import testresources
from keystoneclient.tests.unit import client_fixtures from keystoneclient.tests.unit import client_fixtures
from keystoneclient.tests.unit.v3 import utils from keystoneclient.tests.unit.v3 import utils
from keystoneclient.v3.contrib import simple_cert
class SimpleCertTests(utils.ClientTestCase, testresources.ResourcedTestCase): class SimpleCertTests(utils.ClientTestCase, testresources.ResourcedTestCase):
@@ -36,5 +38,36 @@ class SimpleCertTests(utils.ClientTestCase, testresources.ResourcedTestCase):
self.assertEqual(self.examples.SIGNING_CERT, res) 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): def load_tests(loader, tests, pattern):
return testresources.OptimisingTestSuite(tests) return testresources.OptimisingTestSuite(tests)

View File

@@ -10,12 +10,16 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import requests
import uuid import uuid
from six.moves.urllib import parse as urlparse 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 client_fixtures
from keystoneclient.tests.unit import utils from keystoneclient.tests.unit import utils
from keystoneclient.v3 import client
def parameterize(ref): def parameterize(ref):
@@ -375,3 +379,17 @@ class CrudTests(object):
self.stub_entity('DELETE', id=ref['id'], status_code=204) self.stub_entity('DELETE', id=ref['id'], status_code=204)
self.manager.delete(ref['id']) 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

View File

@@ -39,17 +39,17 @@ class EndpointPolicyManager(base.Manager):
def create_policy_association_for_endpoint(self, policy, endpoint): def create_policy_association_for_endpoint(self, policy, endpoint):
"""Create an association between a policy and an 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) policy, endpoint, self._put)
def check_policy_association_for_endpoint(self, policy, endpoint): def check_policy_association_for_endpoint(self, policy, endpoint):
"""Check an association between a policy and an 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) policy, endpoint, self._head)
def delete_policy_association_for_endpoint(self, policy, endpoint): def delete_policy_association_for_endpoint(self, policy, endpoint):
"""Delete an association between a policy and an 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) policy, endpoint, self._delete)
def _act_on_policy_association_for_service(self, policy, service, action): def _act_on_policy_association_for_service(self, policy, service, action):
@@ -67,17 +67,17 @@ class EndpointPolicyManager(base.Manager):
def create_policy_association_for_service(self, policy, service): def create_policy_association_for_service(self, policy, service):
"""Create an association between a policy and a 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) policy, service, self._put)
def check_policy_association_for_service(self, policy, service): def check_policy_association_for_service(self, policy, service):
"""Check an association between a policy and a 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) policy, service, self._head)
def delete_policy_association_for_service(self, policy, service): def delete_policy_association_for_service(self, policy, service):
"""Delete an association between a policy and a 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) policy, service, self._delete)
def _act_on_policy_association_for_region_and_service( def _act_on_policy_association_for_region_and_service(
@@ -99,19 +99,19 @@ class EndpointPolicyManager(base.Manager):
def create_policy_association_for_region_and_service( def create_policy_association_for_region_and_service(
self, policy, region, service): self, policy, region, service):
"""Create an association between a policy and a service in a region.""" """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) policy, region, service, self._put)
def check_policy_association_for_region_and_service( def check_policy_association_for_region_and_service(
self, policy, region, service): self, policy, region, service):
"""Check an association between a policy and a service in a region.""" """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) policy, region, service, self._head)
def delete_policy_association_for_region_and_service( def delete_policy_association_for_region_and_service(
self, policy, region, service): self, policy, region, service):
"""Delete an association between a policy and a service in a region.""" """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) policy, region, service, self._delete)
def get_policy_for_endpoint(self, endpoint): def get_policy_for_endpoint(self, endpoint):
@@ -130,9 +130,10 @@ class EndpointPolicyManager(base.Manager):
'endpoint_id': endpoint_id, 'endpoint_id': endpoint_id,
'ext_name': self.OS_EP_POLICY_EXT} 'ext_name': self.OS_EP_POLICY_EXT}
_resp, body = self.client.get(url) resp, body = self.client.get(url)
return policies.Policy( return self._prepare_return_value(
self, body[policies.PolicyManager.key], loaded=True) resp, policies.Policy(self, body[policies.PolicyManager.key],
loaded=True))
def list_endpoints_for_policy(self, policy): def list_endpoints_for_policy(self, policy):
"""List endpoints with the effective association to a policy. """List endpoints with the effective association to a policy.

View File

@@ -48,4 +48,5 @@ class AccessTokenManager(base.CrudManager):
http_method='POST') http_method='POST')
resp, body = self.client.post(endpoint, headers=headers) resp, body = self.client.post(endpoint, headers=headers)
token = utils.get_oauth_token_from_body(resp.content) 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))

View File

@@ -70,4 +70,5 @@ class RequestTokenManager(base.CrudManager):
headers=headers) headers=headers)
resp, body = self.client.post(endpoint, headers=headers) resp, body = self.client.post(endpoint, headers=headers)
token = utils.get_oauth_token_from_body(resp.content) 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))

View File

@@ -11,12 +11,15 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from keystoneclient import base
class SimpleCertManager(object): class SimpleCertManager(object):
"""Manager for the OS-SIMPLE-CERT extension.""" """Manager for the OS-SIMPLE-CERT extension."""
def __init__(self, client): def __init__(self, client):
self._client = client self._client = client
self.mgr = base.Manager(self._client)
def get_ca_certificates(self): def get_ca_certificates(self):
"""Get CA certificates. """Get CA certificates.
@@ -27,7 +30,7 @@ class SimpleCertManager(object):
""" """
resp, body = self._client.get('/OS-SIMPLE-CERT/ca', resp, body = self._client.get('/OS-SIMPLE-CERT/ca',
authenticated=False) authenticated=False)
return resp.text return self.mgr._prepare_return_value(resp, resp.text)
def get_certificates(self): def get_certificates(self):
"""Get signing certificates. """Get signing certificates.
@@ -38,4 +41,4 @@ class SimpleCertManager(object):
""" """
resp, body = self._client.get('/OS-SIMPLE-CERT/certificates', resp, body = self._client.get('/OS-SIMPLE-CERT/certificates',
authenticated=False) authenticated=False)
return resp.text return self.mgr._prepare_return_value(resp, resp.text)