Delete tenant error 500 when parent have child

Description

If you have a tenant with a child when you delete it you have an 500 error instead an error with a comprehensible error.

2019-03-14 13:33:21,076 [16278] (DEBUG) (wazo_auth.plugins.http.tenants.http): deleting tenant 21d27b9c-3efa-4fd2-8ff7-b95cd9de51d8 from 21d27b9c-3efa-4fd2-8ff7-b95cd9de51d8
2019-03-14 13:33:21,181 [16278] (ERROR) (flask.app): Exception on /0.1/tenants/21d27b9c-3efa-4fd2-8ff7-b95cd9de51d8 [DELETE]
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
context)
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute
cursor.execute(statement, parameters)
psycopg2.IntegrityError: update or delete on table "auth_tenant" violates foreign key constraint "auth_tenant_parent_uuid_fkey" on table "auth_tenant"
DETAIL: Key (uuid)=(21d27b9c-3efa-4fd2-8ff7-b95cd9de51d8) is still referenced from table "auth_tenant".

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python3/dist-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/usr/lib/python3/dist-packages/flask_restful/_init_.py", line 477, in wrapper
resp = resource(*args, **kwargs)
File "/usr/lib/python3/dist-packages/flask/views.py", line 88, in view
return self.dispatch_request(*args, **kwargs)
File "/usr/lib/python3/dist-packages/flask_restful/_init_.py", line 587, in dispatch_request
resp = meth(*args, **kwargs)
File "/usr/lib/python3/dist-packages/xivo/rest_api_helpers.py", line 29, in wrapper
return func(*args, **kwargs)
File "/usr/lib/python3.5/dist-packages/wazo_auth/http.py", line 78, in wrapper
return func(*args, **kwargs)
File "/usr/lib/python3/dist-packages/xivo/auth_verifier.py", line 109, in wrapper
return func(*args, **kwargs)
File "/usr/lib/python3.5/dist-packages/wazo_auth/plugins/http/tenants/http.py", line 27, in delete
self.tenant_service.delete(scoping_tenant.uuid, tenant_uuid)
File "/usr/lib/python3.5/dist-packages/wazo_auth/services/tenant.py", line 40, in delete
result = self._dao.tenant.delete(uuid)
File "/usr/lib/python3.5/dist-packages/wazo_auth/database/queries/tenant.py", line 107, in delete
nb_deleted = s.query(Tenant).filter(Tenant.uuid == str(uuid)).delete()
File "/usr/lib/python3/dist-packages/sqlalchemy/orm/query.py", line 3073, in delete
delete_op.exec_()
File "/usr/lib/python3/dist-packages/sqlalchemy/orm/persistence.py", line 1127, in exec_
self._do_exec()
File "/usr/lib/python3/dist-packages/sqlalchemy/orm/persistence.py", line 1311, in _do_exec
mapper=self.mapper)
File "/usr/lib/python3/dist-packages/sqlalchemy/orm/session.py", line 1034, in execute
bind, close_with_result=True).execute(clause, params or {})
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 914, in execute
return meth(self, multiparams, params)
File "/usr/lib/python3/dist-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1146, in _execute_context
context)
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1341, in _handle_dbapi_exception
exc_info
File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 185, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
context)
File "/usr/lib/python3/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) update or delete on table "auth_tenant" violates foreign key constraint "auth_tenant_parent_uuid_fkey" on table "auth_tenant"
DETAIL: Key (uuid)=(21d27b9c-3efa-4fd2-8ff7-b95cd9de51d8) is still referenced from table "auth_tenant".
[SQL: 'DELETE FROM auth_tenant WHERE auth_tenant.uuid = %(uuid_1)s'] [parameters: {'uuid_1': '21d27b9c-3efa-4fd2-8ff7-b95cd9de51d8'}]

Zendesk Ticket IDs

None

Activity

Show:
Pascal Cadotte
November 18, 2021 at 7:49 PM

The result should be a 400 with a nice message describing that this tenant has child and could not be deleted

Done

Details

Priority

Assignee

Reporter

Approvers

Aniss Chohra

Fix versions

Sprint

None

Labels

Zendesk Support

Created March 14, 2019 at 5:39 PM
Updated December 6, 2021 at 6:22 PM
Resolved November 25, 2021 at 6:44 PM