summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Young <ayoung@redhat.com>2012-09-06 11:54:04 -0400
committerAdam Young <ayoung@redhat.com>2012-09-06 16:33:17 -0400
commit150413cc4ba8ec854cf6fa30efeb7a653ad5e17a (patch)
tree7f2762e8e02fe45e2b2851f44bbba1788f7853cd
parentfd6d2f1b1184c5b8da1ded3a560ef57795863fb5 (diff)
downloadkeystone-150413cc4ba8ec854cf6fa30efeb7a653ad5e17a.tar.gz
keystone-150413cc4ba8ec854cf6fa30efeb7a653ad5e17a.tar.xz
keystone-150413cc4ba8ec854cf6fa30efeb7a653ad5e17a.zip
List tokens for memcached backend
Creates and updates an index of tokens in a memcache entry keyed by the user id Bug 1046905 Change-Id: If11d6b87b0a8ae5f8349f1ebb31790e943c70fbf
-rw-r--r--keystone/token/backends/memcache.py20
-rw-r--r--tests/test_backend.py40
-rw-r--r--tests/test_backend_memcache.py5
3 files changed, 59 insertions, 6 deletions
diff --git a/keystone/token/backends/memcache.py b/keystone/token/backends/memcache.py
index b5cae2a0..437431bc 100644
--- a/keystone/token/backends/memcache.py
+++ b/keystone/token/backends/memcache.py
@@ -67,6 +67,15 @@ class Token(token.Driver):
expires_ts = utils.unixtime(data_copy['expires'])
kwargs['time'] = expires_ts
self.client.set(ptk, data_copy, **kwargs)
+ if 'id' in data['user']:
+ token_data = jsonutils.dumps(token_id)
+ user_id = data['user']['id']
+ user_key = 'usertokens-%s' % user_id
+ if not self.client.append(user_key, ',%s' % token_data):
+ if not self.client.add(user_key, token_data):
+ if not self.client.append(user_key, ',%s' % token_data):
+ msg = _('Unable to add token user list.')
+ raise exception.UnexpectedError(msg)
return copy.deepcopy(data_copy)
def _add_to_revocation_list(self, data):
@@ -86,6 +95,17 @@ class Token(token.Driver):
self._add_to_revocation_list(data)
return result
+ def list_tokens(self, user_id):
+ tokens = []
+ user_record = self.client.get('usertokens-%s' % user_id) or ""
+ token_list = jsonutils.loads('[%s]' % user_record)
+ for token_id in token_list:
+ ptk = self._prefix_token_id(token_id)
+ token = self.client.get(ptk)
+ if token:
+ tokens.append(token_id)
+ return tokens
+
def list_revoked_tokens(self):
list_json = self.client.get(self.revocation_key)
if list_json:
diff --git a/tests/test_backend.py b/tests/test_backend.py
index e142c9ab..dd843808 100644
--- a/tests/test_backend.py
+++ b/tests/test_backend.py
@@ -612,7 +612,8 @@ class IdentityTests(object):
class TokenTests(object):
def test_token_crud(self):
token_id = uuid.uuid4().hex
- data = {'id': token_id, 'id_hash': token_id, 'a': 'b'}
+ data = {'id': token_id, 'a': 'b',
+ 'user': {'id': 'testuserid'}}
data_ref = self.token_api.create_token(token_id, data)
expires = data_ref.pop('expires')
self.assertTrue(isinstance(expires, datetime.datetime))
@@ -629,6 +630,34 @@ class TokenTests(object):
self.assertRaises(exception.TokenNotFound,
self.token_api.delete_token, token_id)
+ def create_token_sample_data(self):
+ token_id = uuid.uuid4().hex
+ data = {'id': token_id, 'a': 'b',
+ 'user': {'id': 'testuserid'}}
+ self.token_api.create_token(token_id, data)
+ return token_id
+
+ def test_token_list(self):
+ tokens = self.token_api.list_tokens('testuserid')
+ self.assertEquals(len(tokens), 0)
+ token_id1 = self.create_token_sample_data()
+ tokens = self.token_api.list_tokens('testuserid')
+ self.assertEquals(len(tokens), 1)
+ self.assertIn(token_id1, tokens)
+ token_id2 = self.create_token_sample_data()
+ tokens = self.token_api.list_tokens('testuserid')
+ self.assertEquals(len(tokens), 2)
+ self.assertIn(token_id2, tokens)
+ self.assertIn(token_id1, tokens)
+ self.token_api.delete_token(token_id1)
+ tokens = self.token_api.list_tokens('testuserid')
+ self.assertIn(token_id2, tokens)
+ self.assertNotIn(token_id1, tokens)
+ self.token_api.delete_token(token_id2)
+ tokens = self.token_api.list_tokens('testuserid')
+ self.assertNotIn(token_id2, tokens)
+ self.assertNotIn(token_id1, tokens)
+
def test_get_token_404(self):
self.assertRaises(exception.TokenNotFound,
self.token_api.get_token,
@@ -643,7 +672,8 @@ class TokenTests(object):
token_id = uuid.uuid4().hex
expire_time = timeutils.utcnow() - datetime.timedelta(minutes=1)
data = {'id_hash': token_id, 'id': token_id, 'a': 'b',
- 'expires': expire_time}
+ 'expires': expire_time,
+ 'user': {'id': 'testuserid'}}
data_ref = self.token_api.create_token(token_id, data)
self.assertDictEqual(data_ref, data)
self.assertRaises(exception.TokenNotFound,
@@ -651,7 +681,8 @@ class TokenTests(object):
def test_null_expires_token(self):
token_id = uuid.uuid4().hex
- data = {'id': token_id, 'id_hash': token_id, 'a': 'b', 'expires': None}
+ data = {'id': token_id, 'id_hash': token_id, 'a': 'b', 'expires': None,
+ 'user': {'id': 'testuserid'}}
data_ref = self.token_api.create_token(token_id, data)
self.assertDictEqual(data_ref, data)
new_data_ref = self.token_api.get_token(token_id)
@@ -664,7 +695,8 @@ class TokenTests(object):
def delete_token(self):
token_id = uuid.uuid4().hex
- data = {'id_hash': token_id, 'id': token_id, 'a': 'b'}
+ data = {'id_hash': token_id, 'id': token_id, 'a': 'b',
+ 'user': {'id': 'testuserid'}}
data_ref = self.token_api.create_token(token_id, data)
self.token_api.delete_token(token_id)
self.assertRaises(
diff --git a/tests/test_backend_memcache.py b/tests/test_backend_memcache.py
index 613cec1e..884a94ac 100644
--- a/tests/test_backend_memcache.py
+++ b/tests/test_backend_memcache.py
@@ -36,7 +36,7 @@ class MemcacheClient(object):
def add(self, key, value):
if self.get(key):
return False
- self.set(key, value)
+ return self.set(key, value)
def append(self, key, value):
existing_value = self.get(key)
@@ -80,6 +80,7 @@ class MemcacheToken(test.TestCase, test_backend.TokenTests):
def test_get_unicode(self):
token_id = unicode(uuid.uuid4().hex)
- data = {'id': token_id, 'a': 'b'}
+ data = {'id': token_id, 'a': 'b',
+ 'user': {'id': 'testuserid'}}
self.token_api.create_token(token_id, data)
self.token_api.get_token(token_id)