diff options
| author | Adam Young <ayoung@redhat.com> | 2013-06-04 10:27:31 -0400 |
|---|---|---|
| committer | Adam Young <ayoung@redhat.com> | 2013-06-10 11:38:39 -0400 |
| commit | 7b7800608af87e5f84df97f8fef7a69b4f435946 (patch) | |
| tree | ed40178b12948a2c551f2db6691cb512bcfb869b | |
| parent | f1172aac7d8e462af8956c8ce071aeef855bb370 (diff) | |
| download | keystone-7b7800608af87e5f84df97f8fef7a69b4f435946.tar.gz keystone-7b7800608af87e5f84df97f8fef7a69b4f435946.tar.xz keystone-7b7800608af87e5f84df97f8fef7a69b4f435946.zip | |
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
| -rw-r--r-- | keystone/common/sql/migrate_repo/versions/026_drop_user_group_constraints.py | 62 | ||||
| -rw-r--r-- | keystone/identity/backends/sql.py | 23 |
2 files changed, 77 insertions, 8 deletions
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): |
