diff options
| author | termie <github@anarkystic.com> | 2012-01-06 17:00:01 -0800 |
|---|---|---|
| committer | termie <github@anarkystic.com> | 2012-01-09 10:00:09 -0800 |
| commit | 6495d41ac2bf3548c4d3a9bea40d7ecd3ee8ac1c (patch) | |
| tree | 0d57d8bfc10316eadda618a3b4776c5c0cdb72e5 | |
| parent | 119808d60247ebe59cf84f89e76a262732da2bd9 (diff) | |
| download | keystone-6495d41ac2bf3548c4d3a9bea40d7ecd3ee8ac1c.tar.gz keystone-6495d41ac2bf3548c4d3a9bea40d7ecd3ee8ac1c.tar.xz keystone-6495d41ac2bf3548c4d3a9bea40d7ecd3ee8ac1c.zip | |
most tests working again
| -rw-r--r-- | keystonelight/backends/sql/core.py | 132 | ||||
| -rw-r--r-- | keystonelight/models.py | 7 | ||||
| -rw-r--r-- | keystonelight/test.py | 9 | ||||
| -rw-r--r-- | tests/default_fixtures.py | 2 | ||||
| -rw-r--r-- | tests/test_backend_kvs.py | 96 | ||||
| -rw-r--r-- | tests/test_backend_sql.py | 161 |
6 files changed, 126 insertions, 281 deletions
diff --git a/keystonelight/backends/sql/core.py b/keystonelight/backends/sql/core.py index 2fee455f..6bd9bcec 100644 --- a/keystonelight/backends/sql/core.py +++ b/keystonelight/backends/sql/core.py @@ -15,7 +15,7 @@ from keystonelight import models Base = declarative.declarative_base() - +# Special Fields class JsonBlob(sql_types.TypeDecorator): impl = sql.Text @@ -45,7 +45,7 @@ class DictBase(object): def next(self): n = self._i.next().name - return n, getattr(self, n) + return n def update(self, values): """Make the model object behave like a dict.""" @@ -64,7 +64,7 @@ class DictBase(object): local.update(joined) return local.iteritems() - +# Tables class User(Base, DictBase): __tablename__ = 'user' id = sql.Column(sql.String(64), primary_key=True) @@ -86,12 +86,12 @@ class Role(Base, DictBase): class Extras(Base, DictBase): __tablename__ = 'extras' - __table_args__ = ( - sql.Index('idx_extras_usertenant', 'user', 'tenant'), - ) + #__table_args__ = ( + # sql.Index('idx_extras_usertenant', 'user', 'tenant'), + # ) - user = sql.Column(sql.String(64), primary_key=True) - tenant = sql.Column(sql.String(64), primary_key=True) + user_id = sql.Column(sql.String(64), primary_key=True) + tenant_id = sql.Column(sql.String(64), primary_key=True) data = sql.Column(JsonBlob()) @@ -103,6 +103,17 @@ class Token(Base, DictBase): data = sql.Column(JsonBlob()) +class UserTenantMembership(Base, DictBase): + """Tenant membership join table.""" + __tablename__ = 'user_tenant_membership' + user_id = sql.Column(sql.String(64), + sql.ForeignKey('user.id'), + primary_key=True) + tenant_id = sql.Column(sql.String(64), + sql.ForeignKey('tenant.id'), + primary_key=True) + + class SqlBase(object): _MAKER = None @@ -135,23 +146,23 @@ class SqlBase(object): if "sqlite" in connection_dict.drivername: engine_args["poolclass"] = sqlalchemy.pool.NullPool - elif MySQLdb and "mysql" in connection_dict.drivername: - LOG.info(_("Using mysql/eventlet db_pool.")) - # MySQLdb won't accept 'None' in the password field - password = connection_dict.password or '' - pool_args = { - "db": connection_dict.database, - "passwd": password, - "host": connection_dict.host, - "user": connection_dict.username, - "min_size": self.options.get('sql_min_pool_size'), - "max_size": self.options.get('sql_max_pool_size'), - "max_idle": self.options.get('sql_idle_timeout'), - } - creator = eventlet.db_pool.ConnectionPool(MySQLdb, **pool_args) - engine_args["pool_size"] = self.options.get('sql_max_pool_size') - engine_args["pool_timeout"] = self.options('sql_pool_timeout') - engine_args["creator"] = creator.create + #elif MySQLdb and "mysql" in connection_dict.drivername: + # LOG.info(_("Using mysql/eventlet db_pool.")) + # # MySQLdb won't accept 'None' in the password field + # password = connection_dict.password or '' + # pool_args = { + # "db": connection_dict.database, + # "passwd": password, + # "host": connection_dict.host, + # "user": connection_dict.username, + # "min_size": self.options.get('sql_min_pool_size'), + # "max_size": self.options.get('sql_max_pool_size'), + # "max_idle": self.options.get('sql_idle_timeout'), + # } + # creator = eventlet.db_pool.ConnectionPool(MySQLdb, **pool_args) + # engine_args["pool_size"] = self.options.get('sql_max_pool_size') + # engine_args["pool_timeout"] = self.options('sql_pool_timeout') + # engine_args["creator"] = creator.create return sql.create_engine(self.options.get('sql_connection'), **engine_args) @@ -192,7 +203,8 @@ class SqlIdentity(SqlBase): return tenant_ref def get_tenant_by_name(self, tenant_name): - tenant_ref = self.db.get('tenant_name-%s' % tenant_name) + session = self.get_session() + tenant_ref = session.query(Tenant).filter_by(name=tenant_name).first() return tenant_ref def get_user(self, user_id): @@ -201,29 +213,38 @@ class SqlIdentity(SqlBase): return user_ref def get_user_by_name(self, user_name): - user_ref = self.db.get('user_name-%s' % user_name) + session = self.get_session() + user_ref = session.query(User).filter_by(name=user_name).first() return user_ref def get_extras(self, user_id, tenant_id): - return self.db.get('extras-%s-%s' % (tenant_id, user_id)) + session = self.get_session() + extras_ref = session.query(Extras)\ + .filter_by(user_id=user_id)\ + .filter_by(tenant_id=tenant_id)\ + .first() + return getattr(extras_ref, 'data', None) def get_role(self, role_id): - role_ref = self.db.get('role-%s' % role_id) + session = self.get_session() + role_ref = session.query(Role).filter_by(id=role_id).first() return role_ref def list_users(self): - return self.db.get('user_list', []) + session = self.get_session() + user_refs = session.query(User) + return list(user_refs) def list_roles(self): - return self.db.get('role_list', []) + session = self.get_session() + role_refs = session.query(Role) + return list(role_refs) # These should probably be part of the high-level API def add_user_to_tenant(self, tenant_id, user_id): - user_ref = self.get_user(user_id) - tenants = set(user_ref.get('tenants', [])) - tenants.add(tenant_id) - user_ref['tenants'] = list(tenants) - self.update_user(user_id, user_ref) + session = self.get_session() + with session.begin(): + session.add(UserTenantMembership(user_id=user_id, tenant_id=tenant_id)) def remove_user_from_tenant(self, tenant_id, user_id): user_ref = self.get_user(user_id) @@ -233,8 +254,12 @@ class SqlIdentity(SqlBase): self.update_user(user_id, user_ref) def get_tenants_for_user(self, user_id): - user_ref = self.get_user(user_id) - return user_ref.get('tenants', []) + session = self.get_session() + membership_refs = session.query(UserTenantMembership)\ + .filter_by(user_id=user_id)\ + .all() + + return [x.tenant_id for x in membership_refs] def get_roles_for_user_and_tenant(self, user_id, tenant_id): extras_ref = self.get_extras(user_id, tenant_id) @@ -263,13 +288,8 @@ class SqlIdentity(SqlBase): # CRUD def create_user(self, id, user): session = self.get_session() - session.add(User(**user)) - session.flush() - #self.db.set('user-%s' % id, user) - #self.db.set('user_name-%s' % user['name'], user) - #user_list = set(self.db.get('user_list', [])) - #user_list.add(id) - #self.db.set('user_list', list(user_list)) + with session.begin(): + session.add(User(**user)) return user def update_user(self, id, user): @@ -291,11 +311,9 @@ class SqlIdentity(SqlBase): def create_tenant(self, id, tenant): session = self.get_session() - session.add(Tenant(**tenant)) - #session.commit() - #self.db.set('tenant-%s' % id, tenant) - #self.db.set('tenant_name-%s' % tenant['name'], tenant) - return models.Tenant(**tenant) + with session.begin(): + session.add(Tenant(**tenant)) + return tenant def update_tenant(self, id, tenant): # get the old name and delete it too @@ -312,7 +330,9 @@ class SqlIdentity(SqlBase): return None def create_extras(self, user_id, tenant_id, extras): - self.db.set('extras-%s-%s' % (tenant_id, user_id), extras) + session = self.get_session() + with session.begin(): + session.add(Extras(user_id=user_id, tenant_id=tenant_id, data=extras)) return extras def update_extras(self, user_id, tenant_id, extras): @@ -324,10 +344,9 @@ class SqlIdentity(SqlBase): return None def create_role(self, id, role): - self.db.set('role-%s' % id, role) - role_list = set(self.db.get('role_list', [])) - role_list.add(id) - self.db.set('role_list', list(role_list)) + session = self.get_session() + with session.begin(): + session.add(Role(**role)) return role def update_role(self, id, role): @@ -342,10 +361,9 @@ class SqlIdentity(SqlBase): return None - - class SqlToken(SqlBase): pass + class SqlCatalog(SqlBase): pass diff --git a/keystonelight/models.py b/keystonelight/models.py index c94af4c3..7cfec85c 100644 --- a/keystonelight/models.py +++ b/keystonelight/models.py @@ -21,5 +21,8 @@ class Role(dict): class Extras(dict): - def __init__(self, user=None, tenant=None, *args, **kw): - super(Extras, self).__init__(user=user, tenant=tenant, *args, **kw) + def __init__(self, user_id=None, tenant_id=None, *args, **kw): + super(Extras, self).__init__(user_id=user_id, + tenant_id=tenant_id, + *args, + **kw) diff --git a/keystonelight/test.py b/keystonelight/test.py index 0014aa5b..2045520a 100644 --- a/keystonelight/test.py +++ b/keystonelight/test.py @@ -140,11 +140,12 @@ class TestCase(unittest.TestCase): extras_ref = extras.copy() # TODO(termie): these will probably end up in the model anyway, so this # may be futile - del extras_ref['user'] - del extras_ref['tenant'] + del extras_ref['user_id'] + del extras_ref['tenant_id'] rv = self.identity_api.create_extras( - extras['user'], extras['tenant'], models.Extras(**extras_ref)) - setattr(self, 'extras_%s%s' % (extras['user'], extras['tenant']), rv) + extras['user_id'], extras['tenant_id'], models.Extras(**extras_ref)) + setattr(self, + 'extras_%s%s' % (extras['user_id'], extras['tenant_id']), rv) def loadapp(self, config, name='main'): if not config.startswith('config:'): diff --git a/tests/default_fixtures.py b/tests/default_fixtures.py index 7bddb607..0e24d750 100644 --- a/tests/default_fixtures.py +++ b/tests/default_fixtures.py @@ -8,7 +8,7 @@ USERS = [ ] EXTRAS = [ - {'user': 'foo', 'tenant': 'bar', 'extra': 'extra'}, + {'user_id': 'foo', 'tenant_id': 'bar', 'extra': 'extra'}, ] ROLES = [ diff --git a/tests/test_backend_kvs.py b/tests/test_backend_kvs.py index 5c644d10..089d0885 100644 --- a/tests/test_backend_kvs.py +++ b/tests/test_backend_kvs.py @@ -4,104 +4,16 @@ from keystonelight import models from keystonelight import test from keystonelight.backends import kvs +import test_backends import default_fixtures -class KvsIdentity(test.TestCase): +class KvsIdentity(test.TestCase, test_backends.IdentityTests): def setUp(self): super(KvsIdentity, self).setUp() self.options = self.appconfig('default') - #self.identity_api = kvs.KvsIdentity(options=self.options, db={}) - #self.load_fixtures(default_fixtures) - - def test_authenticate_bad_user(self): - self.assertRaises(AssertionError, - self.identity_api.authenticate, - user_id=self.user_foo['id'] + 'WRONG', - tenant_id=self.tenant_bar['id'], - password=self.user_foo['password']) - - def test_authenticate_bad_password(self): - self.assertRaises(AssertionError, - self.identity_api.authenticate, - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'], - password=self.user_foo['password'] + 'WRONG') - - def test_authenticate_invalid_tenant(self): - self.assertRaises(AssertionError, - self.identity_api.authenticate, - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'] + 'WRONG', - password=self.user_foo['password']) - - def test_authenticate_no_tenant(self): - user_ref, tenant_ref, extras_ref = self.identity_api.authenticate( - user_id=self.user_foo['id'], - password=self.user_foo['password']) - self.assertDictEquals(user_ref, self.user_foo) - self.assert_(tenant_ref is None) - self.assert_(not extras_ref) - - def test_authenticate(self): - user_ref, tenant_ref, extras_ref = self.identity_api.authenticate( - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'], - password=self.user_foo['password']) - self.assertDictEquals(user_ref, self.user_foo) - self.assertDictEquals(tenant_ref, self.tenant_bar) - self.assertDictEquals(extras_ref, self.extras_foobar) - - def test_get_tenant_bad_tenant(self): - tenant_ref = self.identity_api.get_tenant( - tenant_id=self.tenant_bar['id'] + 'WRONG') - self.assert_(tenant_ref is None) - - def test_get_tenant(self): - tenant_ref = self.identity_api.get_tenant(tenant_id=self.tenant_bar['id']) - self.assertDictEquals(tenant_ref, self.tenant_bar) - - def test_get_tenant_by_name_bad_tenant(self): - tenant_ref = self.identity_api.get_tenant( - tenant_id=self.tenant_bar['name'] + 'WRONG') - self.assert_(tenant_ref is None) - - def test_get_tenant_by_name(self): - tenant_ref = self.identity_api.get_tenant_by_name( - tenant_name=self.tenant_bar['name']) - self.assertDictEquals(tenant_ref, self.tenant_bar) - - def test_get_user_bad_user(self): - user_ref = self.identity_api.get_user( - user_id=self.user_foo['id'] + 'WRONG') - self.assert_(user_ref is None) - - def test_get_user(self): - user_ref = self.identity_api.get_user(user_id=self.user_foo['id']) - self.assertDictEquals(user_ref, self.user_foo) - - def test_get_extras_bad_user(self): - extras_ref = self.identity_api.get_extras( - user_id=self.user_foo['id'] + 'WRONG', - tenant_id=self.tenant_bar['id']) - self.assert_(extras_ref is None) - - def test_get_extras_bad_tenant(self): - extras_ref = self.identity_api.get_extras( - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'] + 'WRONG') - self.assert_(extras_ref is None) - - def test_get_extras(self): - extras_ref = self.identity_api.get_extras( - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id']) - self.assertDictEquals(extras_ref, self.extras_foobar) - - def test_get_role(self): - role_ref = self.identity_api.get_role( - role_id=self.role_keystone_admin['id']) - self.assertDictEquals(role_ref, self.role_keystone_admin) + self.identity_api = kvs.KvsIdentity(options=self.options, db={}) + self.load_fixtures(default_fixtures) class KvsToken(test.TestCase): diff --git a/tests/test_backend_sql.py b/tests/test_backend_sql.py index 96f71eb6..1f64d898 100644 --- a/tests/test_backend_sql.py +++ b/tests/test_backend_sql.py @@ -6,11 +6,11 @@ from keystonelight import test from keystonelight.backends import sql from keystonelight.backends.sql import migration -import test_backend_kvs +import test_backends import default_fixtures -class SqlIdentity(test_backend_kvs.KvsIdentity): +class SqlIdentity(test.TestCase, test_backends.IdentityTests): def setUp(self): super(SqlIdentity, self).setUp() self.options = self.appconfig('default') @@ -19,136 +19,47 @@ class SqlIdentity(test_backend_kvs.KvsIdentity): self.identity_api = sql.SqlIdentity(options=self.options) self.load_fixtures(default_fixtures) - def test_authenticate_bad_user(self): - self.assertRaises(AssertionError, - self.identity_api.authenticate, - user_id=self.user_foo['id'] + 'WRONG', - tenant_id=self.tenant_bar['id'], - password=self.user_foo['password']) - def test_authenticate_bad_password(self): - self.assertRaises(AssertionError, - self.identity_api.authenticate, - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'], - password=self.user_foo['password'] + 'WRONG') +#class SqlToken(test_backend_kvs.KvsToken): +# def setUp(self): +# super(SqlToken, self).setUp() +# self.token_api = sql.SqlToken(options=options) +# self.load_fixtures(default_fixtures) - def test_authenticate_invalid_tenant(self): - self.assertRaises(AssertionError, - self.identity_api.authenticate, - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'] + 'WRONG', - password=self.user_foo['password']) +# def test_token_crud(self): +# token_id = uuid.uuid4().hex +# data = {'id': token_id, +# 'a': 'b'} +# data_ref = self.token_api.create_token(token_id, data) +# self.assertDictEquals(data_ref, data) - def test_authenticate_no_tenant(self): - user_ref, tenant_ref, extras_ref = self.identity_api.authenticate( - user_id=self.user_foo['id'], - password=self.user_foo['password']) - self.assertDictEquals(user_ref, self.user_foo) - self.assert_(tenant_ref is None) - self.assert_(not extras_ref) +# new_data_ref = self.token_api.get_token(token_id) +# self.assertEquals(new_data_ref, data) - def test_authenticate(self): - user_ref, tenant_ref, extras_ref = self.identity_api.authenticate( - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'], - password=self.user_foo['password']) - self.assertDictEquals(user_ref, self.user_foo) - self.assertDictEquals(tenant_ref, self.tenant_bar) - self.assertDictEquals(extras_ref, self.extras_foobar) +# self.token_api.delete_token(token_id) +# deleted_data_ref = self.token_api.get_token(token_id) +# self.assert_(deleted_data_ref is None) - def test_get_tenant_bad_tenant(self): - tenant_ref = self.identity_api.get_tenant( - tenant_id=self.tenant_bar['id'] + 'WRONG') - self.assert_(tenant_ref is None) - def test_get_tenant(self): - tenant_ref = self.identity_api.get_tenant(tenant_id=self.tenant_bar['id']) - self.assertDictEquals(tenant_ref, self.tenant_bar) +#class SqlCatalog(test_backend_kvs.KvsCatalog): +# def setUp(self): +# super(SqlCatalog, self).setUp() +# self.catalog_api = sql.SqlCatalog(options=options) +# self._load_fixtures() - def test_get_tenant_by_name_bad_tenant(self): - tenant_ref = self.identity_api.get_tenant( - tenant_id=self.tenant_bar['name'] + 'WRONG') - self.assert_(tenant_ref is None) +# def _load_fixtures(self): +# self.catalog_foobar = self.catalog_api._create_catalog( +# 'foo', 'bar', +# {'RegionFoo': {'service_bar': {'foo': 'bar'}}}) - def test_get_tenant_by_name(self): - tenant_ref = self.identity_api.get_tenant_by_name( - tenant_name=self.tenant_bar['name']) - self.assertDictEquals(tenant_ref, self.tenant_bar) +# def test_get_catalog_bad_user(self): +# catalog_ref = self.catalog_api.get_catalog('foo' + 'WRONG', 'bar') +# self.assert_(catalog_ref is None) - def test_get_user_bad_user(self): - user_ref = self.identity_api.get_user( - user_id=self.user_foo['id'] + 'WRONG') - self.assert_(user_ref is None) +# def test_get_catalog_bad_tenant(self): +# catalog_ref = self.catalog_api.get_catalog('foo', 'bar' + 'WRONG') +# self.assert_(catalog_ref is None) - def test_get_user(self): - user_ref = self.identity_api.get_user(user_id=self.user_foo['id']) - self.assertDictEquals(user_ref, self.user_foo) - - def test_get_extras_bad_user(self): - extras_ref = self.identity_api.get_extras( - user_id=self.user_foo['id'] + 'WRONG', - tenant_id=self.tenant_bar['id']) - self.assert_(extras_ref is None) - - def test_get_extras_bad_tenant(self): - extras_ref = self.identity_api.get_extras( - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id'] + 'WRONG') - self.assert_(extras_ref is None) - - def test_get_extras(self): - extras_ref = self.identity_api.get_extras( - user_id=self.user_foo['id'], - tenant_id=self.tenant_bar['id']) - self.assertDictEquals(extras_ref, self.extras_foobar) - - def test_get_role(self): - role_ref = self.identity_api.get_role( - role_id=self.role_keystone_admin['id']) - self.assertDictEquals(role_ref, self.role_keystone_admin) - - -class SqlToken(test_backend_kvs.KvsToken): - def setUp(self): - super(SqlToken, self).setUp() - self.token_api = sql.SqlToken(options=options) - self.load_fixtures(default_fixtures) - - def test_token_crud(self): - token_id = uuid.uuid4().hex - data = {'id': token_id, - 'a': 'b'} - data_ref = self.token_api.create_token(token_id, data) - self.assertDictEquals(data_ref, data) - - new_data_ref = self.token_api.get_token(token_id) - self.assertEquals(new_data_ref, data) - - self.token_api.delete_token(token_id) - deleted_data_ref = self.token_api.get_token(token_id) - self.assert_(deleted_data_ref is None) - - -class SqlCatalog(test_backend_kvs.KvsCatalog): - def setUp(self): - super(SqlCatalog, self).setUp() - self.catalog_api = sql.SqlCatalog(options=options) - self._load_fixtures() - - def _load_fixtures(self): - self.catalog_foobar = self.catalog_api._create_catalog( - 'foo', 'bar', - {'RegionFoo': {'service_bar': {'foo': 'bar'}}}) - - def test_get_catalog_bad_user(self): - catalog_ref = self.catalog_api.get_catalog('foo' + 'WRONG', 'bar') - self.assert_(catalog_ref is None) - - def test_get_catalog_bad_tenant(self): - catalog_ref = self.catalog_api.get_catalog('foo', 'bar' + 'WRONG') - self.assert_(catalog_ref is None) - - def test_get_catalog(self): - catalog_ref = self.catalog_api.get_catalog('foo', 'bar') - self.assertDictEquals(catalog_ref, self.catalog_foobar) +# def test_get_catalog(self): +# catalog_ref = self.catalog_api.get_catalog('foo', 'bar') +# self.assertDictEquals(catalog_ref, self.catalog_foobar) |
