diff --git a/nova/auth/fakeldap.py b/nova/auth/fakeldap.py index 2791dfde..3e92c38f 100644 --- a/nova/auth/fakeldap.py +++ b/nova/auth/fakeldap.py @@ -24,8 +24,30 @@ library to work with nova. """ import json +import redis -from nova import datastore +from nova import flags + +FLAGS = flags.FLAGS +flags.DEFINE_string('redis_host', '127.0.0.1', + 'Host that redis is running on.') +flags.DEFINE_integer('redis_port', 6379, + 'Port that redis is running on.') +flags.DEFINE_integer('redis_db', 0, 'Multiple DB keeps tests away') + +class Redis(object): + def __init__(self): + if hasattr(self.__class__, '_instance'): + raise Exception('Attempted to instantiate singleton') + + @classmethod + def instance(cls): + if not hasattr(cls, '_instance'): + inst = redis.Redis(host=FLAGS.redis_host, + port=FLAGS.redis_port, + db=FLAGS.redis_db) + cls._instance = inst + return cls._instance SCOPE_BASE = 0 @@ -164,11 +186,11 @@ class FakeLDAP(object): key = "%s%s" % (self.__redis_prefix, dn) value_dict = dict([(k, _to_json(v)) for k, v in attr]) - datastore.Redis.instance().hmset(key, value_dict) + Redis.instance().hmset(key, value_dict) def delete_s(self, dn): """Remove the ldap object at specified dn.""" - datastore.Redis.instance().delete("%s%s" % (self.__redis_prefix, dn)) + Redis.instance().delete("%s%s" % (self.__redis_prefix, dn)) def modify_s(self, dn, attrs): """Modify the object at dn using the attribute list. @@ -179,7 +201,7 @@ class FakeLDAP(object): ([MOD_ADD | MOD_DELETE | MOD_REPACE], attribute, value) """ - redis = datastore.Redis.instance() + redis = Redis.instance() key = "%s%s" % (self.__redis_prefix, dn) for cmd, k, v in attrs: @@ -204,7 +226,7 @@ class FakeLDAP(object): """ if scope != SCOPE_BASE and scope != SCOPE_SUBTREE: raise NotImplementedError(str(scope)) - redis = datastore.Redis.instance() + redis = Redis.instance() if scope == SCOPE_BASE: keys = ["%s%s" % (self.__redis_prefix, dn)] else: @@ -232,3 +254,5 @@ class FakeLDAP(object): def __redis_prefix(self): # pylint: disable-msg=R0201 """Get the prefix to use for all redis keys.""" return 'ldap:' + + diff --git a/nova/auth/manager.py b/nova/auth/manager.py index d8435c06..bf7ca8a9 100644 --- a/nova/auth/manager.py +++ b/nova/auth/manager.py @@ -202,7 +202,7 @@ class AuthManager(object): def __new__(cls, *args, **kwargs): """Returns the AuthManager singleton""" - if not cls._instance: + if not cls._instance or ('new' in kwargs and kwargs['new']): cls._instance = super(AuthManager, cls).__new__(cls) return cls._instance diff --git a/nova/datastore.py b/nova/datastore.py deleted file mode 100644 index 8e251942..00000000 --- a/nova/datastore.py +++ /dev/null @@ -1,53 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2010 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# 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. - -""" -Datastore: - -MAKE Sure that ReDIS is running, and your flags are set properly, -before trying to run this. -""" - -import logging -import redis - -from nova import flags - -FLAGS = flags.FLAGS -flags.DEFINE_string('redis_host', '127.0.0.1', - 'Host that redis is running on.') -flags.DEFINE_integer('redis_port', 6379, - 'Port that redis is running on.') -flags.DEFINE_integer('redis_db', 0, 'Multiple DB keeps tests away') - - -class Redis(object): - def __init__(self): - if hasattr(self.__class__, '_instance'): - raise Exception('Attempted to instantiate singleton') - - @classmethod - def instance(cls): - if not hasattr(cls, '_instance'): - inst = redis.Redis(host=FLAGS.redis_host, - port=FLAGS.redis_port, - db=FLAGS.redis_db) - cls._instance = inst - return cls._instance - - diff --git a/nova/tests/auth_unittest.py b/nova/tests/auth_unittest.py index 99f7ab59..97d22d70 100644 --- a/nova/tests/auth_unittest.py +++ b/nova/tests/auth_unittest.py @@ -80,7 +80,7 @@ class AuthManagerTestCase(object): FLAGS.auth_driver = self.auth_driver super(AuthManagerTestCase, self).setUp() self.flags(connection_type='fake') - self.manager = manager.AuthManager() + self.manager = manager.AuthManager(new=True) def test_create_and_find_user(self): with user_generator(self.manager): @@ -117,7 +117,7 @@ class AuthManagerTestCase(object): self.assert_(filter(lambda u: u.id == 'test1', users)) self.assert_(filter(lambda u: u.id == 'test2', users)) self.assert_(not filter(lambda u: u.id == 'test3', users)) - + def test_can_add_and_remove_user_role(self): with user_generator(self.manager): self.assertFalse(self.manager.has_role('test1', 'itsec')) @@ -324,6 +324,19 @@ class AuthManagerTestCase(object): class AuthManagerLdapTestCase(AuthManagerTestCase, test.TrialTestCase): auth_driver = 'nova.auth.ldapdriver.FakeLdapDriver' + def __init__(self, *args, **kwargs): + AuthManagerTestCase.__init__(self) + test.TrialTestCase.__init__(self, *args, **kwargs) + import nova.auth.fakeldap as fakeldap + FLAGS.redis_db = 8 + if FLAGS.flush_db: + logging.info("Flushing redis datastore") + try: + r = fakeldap.Redis.instance() + r.flushdb() + except: + self.skip = True + class AuthManagerDbTestCase(AuthManagerTestCase, test.TrialTestCase): auth_driver = 'nova.auth.dbdriver.DbDriver' diff --git a/run_tests.py b/run_tests.py index 0b27ec6c..b1a3f1d6 100644 --- a/run_tests.py +++ b/run_tests.py @@ -45,7 +45,6 @@ import sys from twisted.scripts import trial as trial_script -from nova import datastore from nova import flags from nova import twistd @@ -86,12 +85,6 @@ if __name__ == '__main__': # TODO(termie): these should make a call instead of doing work on import if FLAGS.fake_tests: from nova.tests.fake_flags import * - # use db 8 for fake tests - FLAGS.redis_db = 8 - if FLAGS.flush_db: - logging.info("Flushing redis datastore") - r = datastore.Redis.instance() - r.flushdb() else: from nova.tests.real_flags import *