From 7b7800608af87e5f84df97f8fef7a69b4f435946 Mon Sep 17 00:00:00 2001 From: Adam Young Date: Tue, 4 Jun 2013 10:27:31 -0400 Subject: drop user and group constraints Drop foreign keys that point to user and group tables from other tables. This is required to be able to split up the backends. Blueprint extract-projects-from-id Change-Id: Iea78ddca4ef5ea5ca1bb542cba81da8aefa95b6b --- .../versions/026_drop_user_group_constraints.py | 62 ++++++++++++++++++++++ keystone/identity/backends/sql.py | 23 +++++--- 2 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 keystone/common/sql/migrate_repo/versions/026_drop_user_group_constraints.py diff --git a/keystone/common/sql/migrate_repo/versions/026_drop_user_group_constraints.py b/keystone/common/sql/migrate_repo/versions/026_drop_user_group_constraints.py new file mode 100644 index 00000000..94945830 --- /dev/null +++ b/keystone/common/sql/migrate_repo/versions/026_drop_user_group_constraints.py @@ -0,0 +1,62 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2013 OpenStack LLC +# +# 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. + +import sqlalchemy + +from keystone.common.sql import migration_helpers + + +def list_constraints(migrate_engine): + meta = sqlalchemy.MetaData() + meta.bind = migrate_engine + user_table = sqlalchemy.Table('user', meta, autoload=True) + sqlalchemy.Table('project', meta, autoload=True) + group_table = sqlalchemy.Table('group', meta, autoload=True) + user_domain_metadata_table = sqlalchemy.Table('user_domain_metadata', + meta, autoload=True) + group_domain_metadata_table = sqlalchemy.Table('group_domain_metadata', + meta, autoload=True) + user_project_metadata_table = sqlalchemy.Table('user_project_metadata', + meta, autoload=True) + group_project_metadata_table = sqlalchemy.Table('group_project_metadata', + meta, autoload=True) + + constraints = [{'table': user_domain_metadata_table, + 'fk_column': 'user_id', + 'ref_column': user_table.c.id}, + {'table': group_domain_metadata_table, + 'fk_column': 'group_id', + 'ref_column': group_table.c.id}, + {'table': user_project_metadata_table, + 'fk_column': 'user_id', + 'ref_column': user_table.c.id}, + {'table': group_project_metadata_table, + 'fk_column': 'group_id', + 'ref_column': group_table.c.id}, + ] + return constraints + + +def upgrade(migrate_engine): + if migrate_engine.name == 'sqlite': + return + migration_helpers.remove_constraints(list_constraints(migrate_engine)) + + +def downgrade(migrate_engine): + if migrate_engine.name == 'sqlite': + return + migration_helpers.add_constraints(list_constraints(migrate_engine)) diff --git a/keystone/identity/backends/sql.py b/keystone/identity/backends/sql.py index 394be8f8..b2be8774 100644 --- a/keystone/identity/backends/sql.py +++ b/keystone/identity/backends/sql.py @@ -96,10 +96,8 @@ class BaseGrant(sql.DictBase): class UserProjectGrant(sql.ModelBase, BaseGrant): __tablename__ = 'user_project_metadata' user_id = sql.Column(sql.String(64), - sql.ForeignKey('user.id'), primary_key=True) project_id = sql.Column(sql.String(64), - sql.ForeignKey('project.id'), primary_key=True) data = sql.Column(sql.JsonBlob()) @@ -208,15 +206,24 @@ class Identity(sql.Base, identity.Driver): raise exception.ProjectNotFound(project_id=tenant_name) return project_ref.to_dict() - def get_project_users(self, tenant_id): + def get_project_user_ids(self, tenant_id): session = self.get_session() self.get_project(tenant_id) - query = session.query(User) - query = query.join(UserProjectGrant) + query = session.query(UserProjectGrant) query = query.filter(UserProjectGrant.project_id == tenant_id) - user_refs = query.all() - return [identity.filter_user(user_ref.to_dict()) - for user_ref in user_refs] + project_refs = query.all() + return [project_ref.user_id for project_ref in project_refs] + + def get_project_users(self, tenant_id): + session = self.get_session() + self.get_project(tenant_id) + user_refs = [] + for user_id in self.get_project_user_ids(tenant_id): + query = session.query(User) + query = query.filter(User.id == user_id) + user_ref = query.first() + user_refs.append(identity.filter_user(user_ref.to_dict())) + return user_refs def get_metadata(self, user_id=None, tenant_id=None, domain_id=None, group_id=None): -- cgit