From 1719306170fad6f7a3344e5b1b293212253a34cc Mon Sep 17 00:00:00 2001 From: ghanshyam Date: Fri, 24 Jun 2016 10:36:54 +0900 Subject: [PATCH] Define 4 identity v2 clients as libraries - roles_client - services_client - tenants_client - users_client of identity v2 services are stable and good interface to migrate those in libraries interfaces. neutron tempest tests and other CI use below service clients from tempest path so keeping those temporarily in tempest also otherwise it will break their gate. These service clients will be removed from tempest path once those interface are released n lib and fixed in neutron side etc. - roles_client - tenants_client - users_client Partially implements blueprint consistent-service-method-names Change-Id: I3c09396f36a82d484de226cfe27848b6916cb636 --- ...y-clients-as-library-e663c6132fcac6c2.yaml | 4 + tempest/cmd/javelin.py | 6 +- .../lib/services/identity/v2/roles_client.py | 107 ++++++++ .../services/identity/v2}/services_client.py | 0 .../services/identity/v2/tenants_client.py | 98 +++++++ .../lib/services/identity/v2/users_client.py | 152 +++++++++++ tempest/services/identity/v2/__init__.py | 8 +- tempest/tests/common/test_dynamic_creds.py | 8 +- .../services/identity/v2/test_roles_client.py | 2 +- .../identity/v2/test_services_client.py | 97 +++++++ .../identity/v2/test_tenants_client.py | 131 ++++++++++ .../services/identity/v2/test_users_client.py | 243 ++++++++++++++++++ tempest/tests/services/identity/__init__.py | 0 .../tests/services/identity/v2/__init__.py | 0 14 files changed, 844 insertions(+), 12 deletions(-) create mode 100644 tempest/lib/services/identity/v2/roles_client.py rename tempest/{services/identity/v2/json => lib/services/identity/v2}/services_client.py (100%) create mode 100644 tempest/lib/services/identity/v2/tenants_client.py create mode 100644 tempest/lib/services/identity/v2/users_client.py rename tempest/tests/{ => lib}/services/identity/v2/test_roles_client.py (98%) create mode 100644 tempest/tests/lib/services/identity/v2/test_services_client.py create mode 100644 tempest/tests/lib/services/identity/v2/test_tenants_client.py create mode 100644 tempest/tests/lib/services/identity/v2/test_users_client.py delete mode 100644 tempest/tests/services/identity/__init__.py delete mode 100644 tempest/tests/services/identity/v2/__init__.py diff --git a/releasenotes/notes/identity-clients-as-library-e663c6132fcac6c2.yaml b/releasenotes/notes/identity-clients-as-library-e663c6132fcac6c2.yaml index b7850d069c..f9173a007e 100644 --- a/releasenotes/notes/identity-clients-as-library-e663c6132fcac6c2.yaml +++ b/releasenotes/notes/identity-clients-as-library-e663c6132fcac6c2.yaml @@ -7,3 +7,7 @@ features: any maintenance changes. * endpoints_client(v2) + * roles_client(v2) + * services_client(v2) + * tenants_client(v2) + * users_client(v2) diff --git a/tempest/cmd/javelin.py b/tempest/cmd/javelin.py index 08ad94fd46..a9e5167c59 100755 --- a/tempest/cmd/javelin.py +++ b/tempest/cmd/javelin.py @@ -126,15 +126,15 @@ from tempest.lib.services.compute import floating_ips_client from tempest.lib.services.compute import security_group_rules_client from tempest.lib.services.compute import security_groups_client from tempest.lib.services.compute import servers_client +from tempest.lib.services.identity.v2 import roles_client +from tempest.lib.services.identity.v2 import tenants_client +from tempest.lib.services.identity.v2 import users_client from tempest.lib.services.image.v2 import images_client from tempest.lib.services.network import networks_client from tempest.lib.services.network import ports_client from tempest.lib.services.network import routers_client from tempest.lib.services.network import subnets_client from tempest.services.identity.v2.json import identity_client -from tempest.services.identity.v2.json import roles_client -from tempest.services.identity.v2.json import tenants_client -from tempest.services.identity.v2.json import users_client from tempest.services.object_storage import container_client from tempest.services.object_storage import object_client from tempest.services.volume.v1.json import volumes_client diff --git a/tempest/lib/services/identity/v2/roles_client.py b/tempest/lib/services/identity/v2/roles_client.py new file mode 100644 index 0000000000..15c8834ab8 --- /dev/null +++ b/tempest/lib/services/identity/v2/roles_client.py @@ -0,0 +1,107 @@ +# 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 oslo_serialization import jsonutils as json +from six.moves.urllib import parse as urllib + +from tempest.lib.common import rest_client + + +class RolesClient(rest_client.RestClient): + api_version = "v2.0" + + def create_role(self, **kwargs): + """Create a role. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#createRole + """ + post_body = json.dumps({'role': kwargs}) + resp, body = self.post('OS-KSADM/roles', post_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def show_role(self, role_id_or_name): + """Get a role by its id or name. + + Available params: see + http://developer.openstack.org/ + api-ref-identity-v2-ext.html#showRoleByID + OR + http://developer.openstack.org/ + api-ref-identity-v2-ext.html#showRoleByName + """ + resp, body = self.get('OS-KSADM/roles/%s' % role_id_or_name) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def list_roles(self, **params): + """Returns roles. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#listRoles + """ + url = 'OS-KSADM/roles' + if params: + url += '?%s' % urllib.urlencode(params) + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_role(self, role_id): + """Delete a role. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#deleteRole + """ + resp, body = self.delete('OS-KSADM/roles/%s' % str(role_id)) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def create_user_role_on_project(self, tenant_id, user_id, role_id): + """Add roles to a user on a tenant. + + Available params: see + http://developer.openstack.org/ + api-ref-identity-v2-ext.html#grantRoleToUserOnTenant + """ + resp, body = self.put('/tenants/%s/users/%s/roles/OS-KSADM/%s' % + (tenant_id, user_id, role_id), "") + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def list_user_roles_on_project(self, tenant_id, user_id, **params): + """Returns a list of roles assigned to a user for a tenant.""" + # TODO(gmann): Need to write API-ref link, Bug# 1592711 + url = '/tenants/%s/users/%s/roles' % (tenant_id, user_id) + if params: + url += '?%s' % urllib.urlencode(params) + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_role_from_user_on_project(self, tenant_id, user_id, role_id): + """Removes a role assignment for a user on a tenant. + + Available params: see + http://developer.openstack.org/ + api-ref-identity-v2-ext.html#revokeRoleFromUserOnTenant + """ + resp, body = self.delete('/tenants/%s/users/%s/roles/OS-KSADM/%s' % + (tenant_id, user_id, role_id)) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) diff --git a/tempest/services/identity/v2/json/services_client.py b/tempest/lib/services/identity/v2/services_client.py similarity index 100% rename from tempest/services/identity/v2/json/services_client.py rename to tempest/lib/services/identity/v2/services_client.py diff --git a/tempest/lib/services/identity/v2/tenants_client.py b/tempest/lib/services/identity/v2/tenants_client.py new file mode 100644 index 0000000000..77ddaa5d36 --- /dev/null +++ b/tempest/lib/services/identity/v2/tenants_client.py @@ -0,0 +1,98 @@ +# Copyright 2015 Red Hat, Inc. +# +# 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 oslo_serialization import jsonutils as json +from six.moves.urllib import parse as urllib + +from tempest.lib.common import rest_client + + +class TenantsClient(rest_client.RestClient): + api_version = "v2.0" + + def create_tenant(self, **kwargs): + """Create a tenant + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#createTenant + """ + post_body = json.dumps({'tenant': kwargs}) + resp, body = self.post('tenants', post_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_tenant(self, tenant_id): + """Delete a tenant. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#deleteTenant + """ + resp, body = self.delete('tenants/%s' % str(tenant_id)) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def show_tenant(self, tenant_id): + """Get tenant details. + + Available params: see + http://developer.openstack.org/ + api-ref-identity-v2-ext.html#admin-showTenantById + """ + resp, body = self.get('tenants/%s' % str(tenant_id)) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def list_tenants(self, **params): + """Returns tenants. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#admin-listTenants + """ + url = 'tenants' + if params: + url += '?%s' % urllib.urlencode(params) + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_tenant(self, tenant_id, **kwargs): + """Updates a tenant. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#updateTenant + """ + if 'id' not in kwargs: + kwargs['id'] = tenant_id + post_body = json.dumps({'tenant': kwargs}) + resp, body = self.post('tenants/%s' % tenant_id, post_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def list_tenant_users(self, tenant_id, **params): + """List users for a Tenant. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#listUsersForTenant + """ + url = '/tenants/%s/users' % tenant_id + if params: + url += '?%s' % urllib.urlencode(params) + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) diff --git a/tempest/lib/services/identity/v2/users_client.py b/tempest/lib/services/identity/v2/users_client.py new file mode 100644 index 0000000000..4ea17f9c85 --- /dev/null +++ b/tempest/lib/services/identity/v2/users_client.py @@ -0,0 +1,152 @@ +# 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 oslo_serialization import jsonutils as json +from six.moves.urllib import parse as urllib + +from tempest.lib.common import rest_client + + +class UsersClient(rest_client.RestClient): + api_version = "v2.0" + + def create_user(self, **kwargs): + """Create a user. + + Available params: see http://developer.openstack.org/ + api-ref-identity-admin-v2.html#admin-createUser + """ + post_body = json.dumps({'user': kwargs}) + resp, body = self.post('users', post_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_user(self, user_id, **kwargs): + """Updates a user. + + Available params: see http://developer.openstack.org/ + api-ref-identity-admin-v2.html#admin-updateUser + """ + put_body = json.dumps({'user': kwargs}) + resp, body = self.put('users/%s' % user_id, put_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def show_user(self, user_id): + """GET a user. + + Available params: see http://developer.openstack.org/ + api-ref-identity-admin-v2.html#admin-showUser + """ + resp, body = self.get("users/%s" % user_id) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_user(self, user_id): + """Delete a user. + + Available params: see http://developer.openstack.org/ + api-ref-identity-admin-v2.html#admin-deleteUser + """ + resp, body = self.delete("users/%s" % user_id) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def list_users(self, **params): + """Get the list of users. + + Available params: see http://developer.openstack.org/ + api-ref-identity-admin-v2.html#admin-listUsers + """ + url = "users" + if params: + url += '?%s' % urllib.urlencode(params) + resp, body = self.get(url) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_user_enabled(self, user_id, **kwargs): + """Enables or disables a user. + + Available params: see http://developer.openstack.org/ + api-ref-identity-v2-ext.html#enableUser + """ + # NOTE: The URL (users//enabled) is different from the api-site + # one (users//OS-KSADM/enabled) , but they are the same API + # because of the fact that in keystone/contrib/admin_crud/core.py + # both api use same action='set_user_enabled' + put_body = json.dumps({'user': kwargs}) + resp, body = self.put('users/%s/enabled' % user_id, put_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_user_password(self, user_id, **kwargs): + """Update User Password.""" + # TODO(piyush): Current api-site doesn't contain this API description. + # After fixing the api-site, we need to fix here also for putting the + # link to api-site. + # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1524147 + put_body = json.dumps({'user': kwargs}) + resp, body = self.put('users/%s/OS-KSADM/password' % user_id, put_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def update_user_own_password(self, user_id, **kwargs): + """User updates own password""" + # TODO(piyush): Current api-site doesn't contain this API description. + # After fixing the api-site, we need to fix here also for putting the + # link to api-site. + # LP: https://bugs.launchpad.net/openstack-api-site/+bug/1524153 + # NOTE: This API is used for updating user password by itself. + # Ref: http://lists.openstack.org/pipermail/openstack-dev/2015-December + # /081803.html + patch_body = json.dumps({'user': kwargs}) + resp, body = self.patch('OS-KSCRUD/users/%s' % user_id, patch_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def create_user_ec2_credential(self, user_id, **kwargs): + # TODO(piyush): Current api-site doesn't contain this API description. + # After fixing the api-site, we need to fix here also for putting the + # link to api-site. + post_body = json.dumps(kwargs) + resp, body = self.post('/users/%s/credentials/OS-EC2' % user_id, + post_body) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def delete_user_ec2_credential(self, user_id, access): + resp, body = self.delete('/users/%s/credentials/OS-EC2/%s' % + (user_id, access)) + self.expected_success(204, resp.status) + return rest_client.ResponseBody(resp, body) + + def list_user_ec2_credentials(self, user_id): + resp, body = self.get('/users/%s/credentials/OS-EC2' % user_id) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) + + def show_user_ec2_credential(self, user_id, access): + resp, body = self.get('/users/%s/credentials/OS-EC2/%s' % + (user_id, access)) + self.expected_success(200, resp.status) + body = json.loads(body) + return rest_client.ResponseBody(resp, body) diff --git a/tempest/services/identity/v2/__init__.py b/tempest/services/identity/v2/__init__.py index 6f4ebcf97b..ac2a8748dd 100644 --- a/tempest/services/identity/v2/__init__.py +++ b/tempest/services/identity/v2/__init__.py @@ -13,12 +13,12 @@ # the License. from tempest.lib.services.identity.v2.endpoints_client import EndpointsClient +from tempest.lib.services.identity.v2.roles_client import RolesClient +from tempest.lib.services.identity.v2.services_client import ServicesClient +from tempest.lib.services.identity.v2.tenants_client import TenantsClient from tempest.lib.services.identity.v2.token_client import TokenClient +from tempest.lib.services.identity.v2.users_client import UsersClient from tempest.services.identity.v2.json.identity_client import IdentityClient -from tempest.services.identity.v2.json.roles_client import RolesClient -from tempest.services.identity.v2.json.services_client import ServicesClient -from tempest.services.identity.v2.json.tenants_client import TenantsClient -from tempest.services.identity.v2.json.users_client import UsersClient __all__ = ['EndpointsClient', 'TokenClient', 'IdentityClient', 'RolesClient', 'ServicesClient', 'TenantsClient', 'UsersClient'] diff --git a/tempest/tests/common/test_dynamic_creds.py b/tempest/tests/common/test_dynamic_creds.py index 7a8637ff1e..b7cc05d6cc 100644 --- a/tempest/tests/common/test_dynamic_creds.py +++ b/tempest/tests/common/test_dynamic_creds.py @@ -22,14 +22,14 @@ from tempest import config from tempest import exceptions from tempest.lib.common import rest_client from tempest.lib import exceptions as lib_exc +from tempest.lib.services.identity.v2 import roles_client as v2_roles_client +from tempest.lib.services.identity.v2 import tenants_client as \ + v2_tenants_client from tempest.lib.services.identity.v2 import token_client as v2_token_client +from tempest.lib.services.identity.v2 import users_client as v2_users_client from tempest.lib.services.identity.v3 import token_client as v3_token_client from tempest.lib.services.network import routers_client from tempest.services.identity.v2.json import identity_client as v2_iden_client -from tempest.services.identity.v2.json import roles_client as v2_roles_client -from tempest.services.identity.v2.json import tenants_client as \ - v2_tenants_client -from tempest.services.identity.v2.json import users_client as v2_users_client from tempest.services.identity.v3.json import domains_client from tempest.services.identity.v3.json import identity_client as v3_iden_client from tempest.services.identity.v3.json import projects_client as \ diff --git a/tempest/tests/services/identity/v2/test_roles_client.py b/tempest/tests/lib/services/identity/v2/test_roles_client.py similarity index 98% rename from tempest/tests/services/identity/v2/test_roles_client.py rename to tempest/tests/lib/services/identity/v2/test_roles_client.py index e36ec186d6..464a71500e 100644 --- a/tempest/tests/services/identity/v2/test_roles_client.py +++ b/tempest/tests/lib/services/identity/v2/test_roles_client.py @@ -12,7 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. -from tempest.services.identity.v2.json import roles_client +from tempest.lib.services.identity.v2 import roles_client from tempest.tests.lib import fake_auth_provider from tempest.tests.lib.services import base diff --git a/tempest/tests/lib/services/identity/v2/test_services_client.py b/tempest/tests/lib/services/identity/v2/test_services_client.py new file mode 100644 index 0000000000..bafb6b1e87 --- /dev/null +++ b/tempest/tests/lib/services/identity/v2/test_services_client.py @@ -0,0 +1,97 @@ +# Copyright 2016 NEC Corporation. All rights reserved. +# +# 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 tempest.lib.services.identity.v2 import services_client +from tempest.tests.lib import fake_auth_provider +from tempest.tests.lib.services import base + + +class TestServicesClient(base.BaseServiceTest): + FAKE_SERVICE_INFO = { + "OS-KSADM:service": { + "id": "1", + "name": "test", + "type": "compute", + "description": "test_description" + } + } + + FAKE_LIST_SERVICES = { + "OS-KSADM:services": [ + { + "id": "1", + "name": "test", + "type": "compute", + "description": "test_description" + }, + { + "id": "2", + "name": "test2", + "type": "compute", + "description": "test2_description" + } + ] + } + + def setUp(self): + super(TestServicesClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.client = services_client.ServicesClient(fake_auth, + 'identity', 'regionOne') + + def _test_create_service(self, bytes_body=False): + self.check_service_client_function( + self.client.create_service, + 'tempest.lib.common.rest_client.RestClient.post', + self.FAKE_SERVICE_INFO, + bytes_body, + id="1", + name="test", + type="compute", + description="test_description") + + def _test_show_service(self, bytes_body=False): + self.check_service_client_function( + self.client.show_service, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_SERVICE_INFO, + bytes_body, + service_id="1") + + def _test_list_services(self, bytes_body=False): + self.check_service_client_function( + self.client.list_services, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_LIST_SERVICES, + bytes_body) + + def test_create_service_with_str_body(self): + self._test_create_service() + + def test_create_service_with_bytes_body(self): + self._test_create_service(bytes_body=True) + + def test_show_service_with_str_body(self): + self._test_show_service() + + def test_show_service_with_bytes_body(self): + self._test_show_service(bytes_body=True) + + def test_delete_service(self): + self.check_service_client_function( + self.client.delete_service, + 'tempest.lib.common.rest_client.RestClient.delete', + {}, + service_id="1", + status=204) diff --git a/tempest/tests/lib/services/identity/v2/test_tenants_client.py b/tempest/tests/lib/services/identity/v2/test_tenants_client.py new file mode 100644 index 0000000000..ae3d13ab60 --- /dev/null +++ b/tempest/tests/lib/services/identity/v2/test_tenants_client.py @@ -0,0 +1,131 @@ +# Copyright 2016 NEC Corporation. All rights reserved. +# +# 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 tempest.lib.services.identity.v2 import tenants_client +from tempest.tests.lib import fake_auth_provider +from tempest.tests.lib.services import base + + +class TestTenantsClient(base.BaseServiceTest): + FAKE_TENANT_INFO = { + "tenant": { + "id": "1", + "name": "test", + "description": "test_description", + "enabled": True + } + } + + FAKE_LIST_TENANTS = { + "tenants": [ + { + "id": "1", + "name": "test", + "description": "test_description", + "enabled": True + }, + { + "id": "2", + "name": "test2", + "description": "test2_description", + "enabled": True + } + ] + } + + def setUp(self): + super(TestTenantsClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.client = tenants_client.TenantsClient(fake_auth, + 'identity', 'regionOne') + + def _test_create_tenant(self, bytes_body=False): + self.check_service_client_function( + self.client.create_tenant, + 'tempest.lib.common.rest_client.RestClient.post', + self.FAKE_TENANT_INFO, + bytes_body, + name="test", + description="test_description") + + def _test_show_tenant(self, bytes_body=False): + self.check_service_client_function( + self.client.show_tenant, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_TENANT_INFO, + bytes_body, + tenant_id="1") + + def _test_update_tenant(self, bytes_body=False): + self.check_service_client_function( + self.client.update_tenant, + 'tempest.lib.common.rest_client.RestClient.post', + self.FAKE_TENANT_INFO, + bytes_body, + tenant_id="1", + name="test", + description="test_description") + + def _test_list_tenants(self, bytes_body=False): + self.check_service_client_function( + self.client.list_tenants, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_LIST_TENANTS, + bytes_body) + + def _test_list_tenant_users(self, bytes_body=False): + self.check_service_client_function( + self.client.list_tenant_users, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_LIST_TENANTS, + bytes_body, + tenant_id="1") + + def test_create_tenant_with_str_body(self): + self._test_create_tenant() + + def test_create_tenant_with_bytes_body(self): + self._test_create_tenant(bytes_body=True) + + def test_show_tenant_with_str_body(self): + self._test_show_tenant() + + def test_show_tenant_with_bytes_body(self): + self._test_show_tenant(bytes_body=True) + + def test_update_tenant_with_str_body(self): + self._test_update_tenant() + + def test_update_tenant_with_bytes_body(self): + self._test_update_tenant(bytes_body=True) + + def test_list_tenants_with_str_body(self): + self._test_list_tenants() + + def test_list_tenants_with_bytes_body(self): + self._test_list_tenants(bytes_body=True) + + def test_delete_tenant(self): + self.check_service_client_function( + self.client.delete_tenant, + 'tempest.lib.common.rest_client.RestClient.delete', + {}, + tenant_id="1", + status=204) + + def test_list_tenant_users_with_str_body(self): + self._test_list_tenant_users() + + def test_list_tenant_users_with_bytes_body(self): + self._test_list_tenant_users(bytes_body=True) diff --git a/tempest/tests/lib/services/identity/v2/test_users_client.py b/tempest/tests/lib/services/identity/v2/test_users_client.py new file mode 100644 index 0000000000..9534e44144 --- /dev/null +++ b/tempest/tests/lib/services/identity/v2/test_users_client.py @@ -0,0 +1,243 @@ +# Copyright 2016 NEC Corporation. All rights reserved. +# +# 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 tempest.lib.services.identity.v2 import users_client +from tempest.tests.lib import fake_auth_provider +from tempest.tests.lib.services import base + + +class TestUsersClient(base.BaseServiceTest): + FAKE_USER_INFO = { + "user": { + "id": "1", + "name": "test", + "email": "john.smith@example.org", + "enabled": True + } + } + + FAKE_LIST_USERS = { + "users": [ + { + "id": "1", + "name": "test", + "email": "john.smith@example.org", + "enabled": True + }, + { + "id": "2", + "name": "test2", + "email": "john.smith@example.org", + "enabled": True + } + ] + } + + FAKE_USER_EC2_CREDENTIAL_INFO = { + "credential": { + 'user_id': '9beb0e12f3e5416db8d7cccfc785db3b', + 'access': '79abf59acc77492a86170cbe2f1feafa', + 'secret': 'c4e7d3a691fd4563873d381a40320f46', + 'trust_id': None, + 'tenant_id': '596557269d7b4dd78631a602eb9f151d' + } + } + + FAKE_LIST_USER_EC2_CREDENTIALS = { + "credentials": [ + { + 'user_id': '9beb0e12f3e5416db8d7cccfc785db3b', + 'access': '79abf59acc77492a86170cbe2f1feafa', + 'secret': 'c4e7d3a691fd4563873d381a40320f46', + 'trust_id': None, + 'tenant_id': '596557269d7b4dd78631a602eb9f151d' + }, + { + 'user_id': '3beb0e12f3e5416db8d7cccfc785de4r', + 'access': '45abf59acc77492a86170cbe2f1fesde', + 'secret': 'g4e7d3a691fd4563873d381a40320e45', + 'trust_id': None, + 'tenant_id': '123557269d7b4dd78631a602eb9f112f' + } + ] + } + + def setUp(self): + super(TestUsersClient, self).setUp() + fake_auth = fake_auth_provider.FakeAuthProvider() + self.client = users_client.UsersClient(fake_auth, + 'identity', 'regionOne') + + def _test_create_user(self, bytes_body=False): + self.check_service_client_function( + self.client.create_user, + 'tempest.lib.common.rest_client.RestClient.post', + self.FAKE_USER_INFO, + bytes_body, + name="test", + email="john.smith@example.org") + + def _test_update_user(self, bytes_body=False): + self.check_service_client_function( + self.client.update_user, + 'tempest.lib.common.rest_client.RestClient.put', + self.FAKE_USER_INFO, + bytes_body, + user_id="1", + name="test") + + def _test_show_user(self, bytes_body=False): + self.check_service_client_function( + self.client.show_user, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_USER_INFO, + bytes_body, + user_id="1") + + def _test_list_users(self, bytes_body=False): + self.check_service_client_function( + self.client.list_users, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_LIST_USERS, + bytes_body) + + def _test_update_user_enabled(self, bytes_body=False): + self.check_service_client_function( + self.client.update_user_enabled, + 'tempest.lib.common.rest_client.RestClient.put', + self.FAKE_USER_INFO, + bytes_body, + user_id="1", + enabled=True) + + def _test_update_user_password(self, bytes_body=False): + self.check_service_client_function( + self.client.update_user_password, + 'tempest.lib.common.rest_client.RestClient.put', + self.FAKE_USER_INFO, + bytes_body, + user_id="1", + password="pass") + + def _test_update_user_own_password(self, bytes_body=False): + self.check_service_client_function( + self.client.update_user_own_password, + 'tempest.lib.common.rest_client.RestClient.patch', + self.FAKE_USER_INFO, + bytes_body, + user_id="1", + password="pass") + + def _test_create_user_ec2_credential(self, bytes_body=False): + self.check_service_client_function( + self.client.create_user_ec2_credential, + 'tempest.lib.common.rest_client.RestClient.post', + self.FAKE_USER_EC2_CREDENTIAL_INFO, + bytes_body, + user_id="1", + tenant_id="123") + + def _test_show_user_ec2_credential(self, bytes_body=False): + self.check_service_client_function( + self.client.show_user_ec2_credential, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_USER_EC2_CREDENTIAL_INFO, + bytes_body, + user_id="1", + access="123") + + def _test_list_user_ec2_credentials(self, bytes_body=False): + self.check_service_client_function( + self.client.list_user_ec2_credentials, + 'tempest.lib.common.rest_client.RestClient.get', + self.FAKE_LIST_USER_EC2_CREDENTIALS, + bytes_body, + user_id="1") + + def test_create_user_with_str_body(self): + self._test_create_user() + + def test_create_user_with_bytes_body(self): + self._test_create_user(bytes_body=True) + + def test_update_user_with_str_body(self): + self._test_update_user() + + def test_update_user_with_bytes_body(self): + self._test_update_user(bytes_body=True) + + def test_show_user_with_str_body(self): + self._test_show_user() + + def test_show_user_with_bytes_body(self): + self._test_show_user(bytes_body=True) + + def test_list_users_with_str_body(self): + self._test_list_users() + + def test_list_users_with_bytes_body(self): + self._test_list_users(bytes_body=True) + + def test_delete_user(self): + self.check_service_client_function( + self.client.delete_user, + 'tempest.lib.common.rest_client.RestClient.delete', + {}, + user_id="1", + status=204) + + def test_update_user_enabled_with_str_body(self): + self._test_update_user_enabled() + + def test_update_user_enabled_with_bytes_body(self): + self._test_update_user_enabled(bytes_body=True) + + def test_update_user_password_with_str_body(self): + self._test_update_user_password() + + def test_update_user_password_with_bytes_body(self): + self._test_update_user_password(bytes_body=True) + + def test_update_user_own_password_with_str_body(self): + self._test_update_user_own_password() + + def test_update_user_own_password_with_bytes_body(self): + self._test_update_user_own_password(bytes_body=True) + + def test_create_user_ec2_credential_with_str_body(self): + self._test_create_user_ec2_credential() + + def test_create_user_ec2_credential_with_bytes_body(self): + self._test_create_user_ec2_credential(bytes_body=True) + + def test_show_user_ec2_credential_with_str_body(self): + self._test_show_user_ec2_credential() + + def test_show_user_ec2_credential_with_bytes_body(self): + self._test_show_user_ec2_credential(bytes_body=True) + + def test_list_user_ec2_credentials_with_str_body(self): + self._test_list_user_ec2_credentials() + + def test_list_user_ec2_credentials_with_bytes_body(self): + self._test_list_user_ec2_credentials(bytes_body=True) + + def test_delete_user_ec2_credential(self): + self.check_service_client_function( + self.client.delete_user_ec2_credential, + 'tempest.lib.common.rest_client.RestClient.delete', + {}, + user_id="123", + access="1234", + status=204) diff --git a/tempest/tests/services/identity/__init__.py b/tempest/tests/services/identity/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tempest/tests/services/identity/v2/__init__.py b/tempest/tests/services/identity/v2/__init__.py deleted file mode 100644 index e69de29bb2..0000000000