From 37ff759707f64ee4f4eafee8448ece36b96173e4 Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Sun, 12 Aug 2012 19:30:35 +1200 Subject: Simplify the sql backend deletion of users and tenants. There is a remaining problem in that the table definition permits dangling membership in tenants, and vice verca, but this change will make the fix for that easier to review, and make the code simpler and faster at the sametime. See bug 1000609 for the bug report that lead to examining this. Change-Id: Id7cd5fad7032779d352a7c577c8d10558091d767 --- keystone/identity/backends/sql.py | 51 +++++++++------------------------------ 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/keystone/identity/backends/sql.py b/keystone/identity/backends/sql.py index dafd19bb..d13683c2 100644 --- a/keystone/identity/backends/sql.py +++ b/keystone/identity/backends/sql.py @@ -385,27 +385,13 @@ class Identity(sql.Base, identity.Driver): def delete_user(self, user_id): session = self.get_session() - user_ref = session.query(User).filter_by(id=user_id).first() - if not user_ref: - raise exception.UserNotFound(user_id=user_id) - membership_refs = session.query(UserTenantMembership)\ - .filter_by(user_id=user_id)\ - .all() - metadata_refs = session.query(Metadata)\ - .filter_by(user_id=user_id)\ - .all() - with session.begin(): - if membership_refs: - for membership_ref in membership_refs: - session.delete(membership_ref) - session.flush() - if metadata_refs: - for metadata_ref in metadata_refs: - session.delete(metadata_ref) - - session.delete(user_ref) - session.flush() + session.query(UserTenantMembership)\ + .filter_by(user_id=user_id).delete(False) + session.query(Metadata)\ + .filter_by(user_id=user_id).delete(False) + if not session.query(User).filter_by(id=user_id).delete(False): + raise exception.UserNotFound(user_id=user_id) @handle_conflicts(type='tenant') def create_tenant(self, tenant_id, tenant): @@ -438,26 +424,13 @@ class Identity(sql.Base, identity.Driver): def delete_tenant(self, tenant_id): session = self.get_session() - tenant_ref = session.query(Tenant).filter_by(id=tenant_id).first() - if not tenant_ref: - raise exception.TenantNotFound(tenant_id=tenant_id) - membership_refs = session.query(UserTenantMembership)\ - .filter_by(tenant_id=tenant_id)\ - .all() - metadata_refs = session.query(Metadata)\ - .filter_by(tenant_id=tenant_id)\ - .all() - with session.begin(): - if membership_refs: - for membership_ref in membership_refs: - session.delete(membership_ref) - if metadata_refs: - for metadata_ref in metadata_refs: - session.delete(metadata_ref) - - session.delete(tenant_ref) - session.flush() + session.query(UserTenantMembership)\ + .filter_by(tenant_id=tenant_id).delete(False) + session.query(Metadata)\ + .filter_by(tenant_id=tenant_id).delete(False) + if not session.query(Tenant).filter_by(id=tenant_id).delete(False): + raise exception.TenantNotFound(tenant_id=tenant_id) @handle_conflicts(type='metadata') def create_metadata(self, user_id, tenant_id, metadata): -- cgit