summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Young <ayoung@redhat.com>2013-06-04 10:27:31 -0400
committerAdam Young <ayoung@redhat.com>2013-06-10 11:38:39 -0400
commit7b7800608af87e5f84df97f8fef7a69b4f435946 (patch)
treeed40178b12948a2c551f2db6691cb512bcfb869b
parentf1172aac7d8e462af8956c8ce071aeef855bb370 (diff)
downloadkeystone-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.py62
-rw-r--r--keystone/identity/backends/sql.py23
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):