Add T111 hacking rule for consistent DELETE method

As the consistent-service-method-names bp, "DELETE /resources/<id>"
methods' names should be "delete_<resource name>".
So this patch adds it as the hacking rule.

Partially implements blueprint consistent-service-method-names

Change-Id: I36592a91001361d816e302745fe8417aee5e7565
This commit is contained in:
Ken'ichi Ohmichi 2015-11-20 08:10:51 +00:00
parent 5334660423
commit b8461cb21f
14 changed files with 51 additions and 22 deletions

View File

@ -95,7 +95,7 @@ class RolesTestJSON(base.BaseIdentityV2AdminTest):
user_role = self.client.assign_user_role(tenant['id'],
user['id'],
role['id'])['role']
self.client.remove_user_role(tenant['id'], user['id'],
self.client.delete_user_role(tenant['id'], user['id'],
user_role['id'])
@test.idempotent_id('262e1e3e-ed71-4edd-a0e5-d64e83d66d05')

View File

@ -177,7 +177,7 @@ class RolesNegativeTestJSON(base.BaseIdentityV2AdminTest):
user['id'],
role['id'])
self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.remove_user_role,
self.non_admin_client.delete_user_role,
tenant['id'], user['id'], role['id'])
@test.attr(type=['negative'])
@ -191,7 +191,7 @@ class RolesNegativeTestJSON(base.BaseIdentityV2AdminTest):
token = self.client.auth_provider.get_token()
self.client.delete_token(token)
self.assertRaises(lib_exc.Unauthorized,
self.client.remove_user_role, tenant['id'],
self.client.delete_user_role, tenant['id'],
user['id'], role['id'])
self.client.auth_provider.clear_auth()
@ -204,7 +204,7 @@ class RolesNegativeTestJSON(base.BaseIdentityV2AdminTest):
user['id'],
role['id'])
non_existent_role = str(uuid.uuid4().hex)
self.assertRaises(lib_exc.NotFound, self.client.remove_user_role,
self.assertRaises(lib_exc.NotFound, self.client.delete_user_role,
tenant['id'], user['id'], non_existent_role)
@test.attr(type=['negative'])
@ -216,7 +216,7 @@ class RolesNegativeTestJSON(base.BaseIdentityV2AdminTest):
user['id'],
role['id'])
non_existent_tenant = str(uuid.uuid4().hex)
self.assertRaises(lib_exc.NotFound, self.client.remove_user_role,
self.assertRaises(lib_exc.NotFound, self.client.delete_user_role,
non_existent_tenant, user['id'], role['id'])
@test.attr(type=['negative'])

View File

@ -102,7 +102,7 @@ class RolesV3TestJSON(base.BaseIdentityV3AdminTest):
self._list_assertions(roles, self.fetched_role_ids,
self.role['id'])
self.client.revoke_role_from_user_on_project(
self.client.delete_role_from_user_on_project(
self.project['id'], self.user_body['id'], self.role['id'])
@test.idempotent_id('6c9a2940-3625-43a3-ac02-5dcec62ef3bd')
@ -119,7 +119,7 @@ class RolesV3TestJSON(base.BaseIdentityV3AdminTest):
self._list_assertions(roles, self.fetched_role_ids,
self.role['id'])
self.client.revoke_role_from_user_on_domain(
self.client.delete_role_from_user_on_domain(
self.domain['id'], self.user_body['id'], self.role['id'])
@test.idempotent_id('cbf11737-1904-4690-9613-97bcbb3df1c4')
@ -149,7 +149,7 @@ class RolesV3TestJSON(base.BaseIdentityV3AdminTest):
self.assertEqual(len(roles), 1)
self.assertEqual(roles[0]['id'], self.role['id'])
# Revoke role to group on project
self.client.revoke_role_from_group_on_project(
self.client.delete_role_from_group_on_project(
self.project['id'], self.group_body['id'], self.role['id'])
@test.idempotent_id('4bf8a70b-e785-413a-ad53-9f91ce02faa7')
@ -166,7 +166,7 @@ class RolesV3TestJSON(base.BaseIdentityV3AdminTest):
self._list_assertions(roles, self.fetched_role_ids,
self.role['id'])
self.client.revoke_role_from_group_on_domain(
self.client.delete_role_from_group_on_domain(
self.domain['id'], self.group_body['id'], self.role['id'])
@test.idempotent_id('f5654bcc-08c4-4f71-88fe-05d64e06de94')

View File

@ -77,7 +77,7 @@ class ImagesMemberTest(base.BaseV2MemberImageTest):
{'status': 'accepted'})
self.assertIn(image_id, self._list_image_ids_as_alt())
self.os_img_client.remove_image_member(image_id, self.alt_tenant_id)
self.os_img_client.delete_image_member(image_id, self.alt_tenant_id)
self.assertNotIn(image_id, self._list_image_ids_as_alt())
@test.idempotent_id('634dcc3f-f6e2-4409-b8fd-354a0bb25d83')
@ -103,5 +103,5 @@ class ImagesMemberTest(base.BaseV2MemberImageTest):
self.alt_tenant_id,
{'status': 'accepted'})
self.assertIn(image_id, self._list_image_ids_as_alt())
self.os_img_client.remove_image_member(image_id, self.alt_tenant_id)
self.os_img_client.delete_image_member(image_id, self.alt_tenant_id)
self.assertNotIn(image_id, self._list_image_ids_as_alt())

View File

@ -146,7 +146,7 @@ class BaseMessagingTest(test.BaseTestCase):
@classmethod
def release_claim(cls, claim_uri):
"""Wrapper utility that deletes a claim."""
resp, body = cls.client.release_claim(claim_uri)
resp, body = cls.client.delete_claim(claim_uri)
return resp, body

View File

@ -115,7 +115,7 @@ class TestClaims(base.BaseMessagingTest):
claim_uri = resp['location']
# Release Claim
self.client.release_claim(claim_uri)
self.client.delete_claim(claim_uri)
# Delete Claimed message
# This will implicitly verify that the claim is deleted.

View File

@ -238,7 +238,7 @@ class TempestCleanup(command.Command):
id_cl = credentials.AdminManager().identity_client
if (self._tenant_exists(tenant_id)):
try:
id_cl.remove_user_role(tenant_id, self.admin_id,
id_cl.delete_user_role(tenant_id, self.admin_id,
self.admin_role_id)
except Exception as ex:
LOG.exception("Failed removing role from tenant which still"

View File

@ -32,6 +32,7 @@ mutable_default_args = re.compile(r"^\s*def .+\((.+=\{\}|.+=\[\])")
TESTTOOLS_SKIP_DECORATOR = re.compile(r'\s*@testtools\.skip\((.*)\)')
METHOD = re.compile(r"^ def .+")
METHOD_GET_RESOURCE = re.compile(r"^\s*def (list|show)\_.+")
METHOD_DELETE_RESOURCE = re.compile(r"^\s*def delete_.+")
CLASS = re.compile(r"^class .+")
@ -195,6 +196,32 @@ def get_resources_on_service_clients(logical_line, physical_line, filename,
yield (0, msg)
def delete_resources_on_service_clients(logical_line, physical_line, filename,
line_number, lines):
"""Check that service client names of DELETE should be consistent
T111
"""
if not _common_service_clients_check(logical_line, physical_line,
filename, 'ignored_list_T111.txt'):
return
for line in lines[line_number:]:
if METHOD.match(line) or CLASS.match(line):
# the end of a method
return
if 'self.delete(' not in line:
continue
if METHOD_DELETE_RESOURCE.match(logical_line):
return
msg = ("T111: [DELETE /resources/<id>] methods should be "
"delete_<resource name>")
yield (0, msg)
def factory(register):
register(import_no_clients_in_api_and_scenario_tests)
register(scenario_tests_need_service_tags)
@ -205,3 +232,4 @@ def factory(register):
register(no_mutable_default_args)
register(no_testtools_skip_decorator)
register(get_resources_on_service_clients)
register(delete_resources_on_service_clients)

View File

@ -0,0 +1 @@
./tempest/services/baremetal/base.py

View File

@ -278,7 +278,7 @@ class ServersClient(service_client.ServiceClient):
self.validate_response(schema.attach_volume, resp, body)
return service_client.ResponseBody(resp, body)
def detach_volume(self, server_id, volume_id):
def detach_volume(self, server_id, volume_id): # noqa
"""Detaches a volume from a server instance."""
resp, body = self.delete('servers/%s/os-volume_attachments/%s' %
(server_id, volume_id))

View File

@ -85,7 +85,7 @@ class IdentityClient(service_client.ServiceClient):
body = json.loads(body)
return service_client.ResponseBody(resp, body)
def remove_user_role(self, tenant_id, user_id, role_id):
def delete_user_role(self, tenant_id, user_id, role_id):
"""Removes a role assignment for a user on a tenant."""
resp, body = self.delete('/tenants/%s/users/%s/roles/OS-KSADM/%s' %
(tenant_id, user_id, role_id))

View File

@ -408,14 +408,14 @@ class IdentityV3Client(service_client.ServiceClient):
body = json.loads(body)
return service_client.ResponseBody(resp, body)
def revoke_role_from_user_on_project(self, project_id, user_id, role_id):
def delete_role_from_user_on_project(self, project_id, user_id, role_id):
"""Delete role of a user on a project."""
resp, body = self.delete('projects/%s/users/%s/roles/%s' %
(project_id, user_id, role_id))
self.expected_success(204, resp.status)
return service_client.ResponseBody(resp, body)
def revoke_role_from_user_on_domain(self, domain_id, user_id, role_id):
def delete_role_from_user_on_domain(self, domain_id, user_id, role_id):
"""Delete role of a user on a domain."""
resp, body = self.delete('domains/%s/users/%s/roles/%s' %
(domain_id, user_id, role_id))
@ -452,14 +452,14 @@ class IdentityV3Client(service_client.ServiceClient):
body = json.loads(body)
return service_client.ResponseBody(resp, body)
def revoke_role_from_group_on_project(self, project_id, group_id, role_id):
def delete_role_from_group_on_project(self, project_id, group_id, role_id):
"""Delete role of a user on a project."""
resp, body = self.delete('projects/%s/groups/%s/roles/%s' %
(project_id, group_id, role_id))
self.expected_success(204, resp.status)
return service_client.ResponseBody(resp, body)
def revoke_role_from_group_on_domain(self, domain_id, group_id, role_id):
def delete_role_from_group_on_domain(self, domain_id, group_id, role_id):
"""Delete role of a user on a domain."""
resp, body = self.delete('domains/%s/groups/%s/roles/%s' %
(domain_id, group_id, role_id))

View File

@ -200,7 +200,7 @@ class ImageClientV2(service_client.ServiceClient):
self.expected_success(200, resp.status)
return service_client.ResponseBody(resp, json.loads(body))
def remove_image_member(self, image_id, member_id):
def delete_image_member(self, image_id, member_id):
url = 'v2/images/%s/members/%s' % (image_id, member_id)
resp, _ = self.delete(url)
self.expected_success(204, resp.status)

View File

@ -170,7 +170,7 @@ class MessagingClient(service_client.ServiceClient):
self.expected_success(204, resp.status)
return resp, body
def release_claim(self, claim_uri):
def delete_claim(self, claim_uri):
resp, body = self.delete(claim_uri)
self.expected_success(204, resp.status)
return resp, body