summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsirish.bitra <sirish.bitra@gmail.com>2011-05-16 15:35:34 +0530
committersirish.bitra <sirish.bitra@gmail.com>2011-05-16 15:35:34 +0530
commit647d4bb99cb48789947d2840ca50f8af3dd07c6f (patch)
tree974899b04b58f0340de7dc8ff3ff9c78a030f1ff
parent61d7addeaf56867a4d1b124bd289e340e9a2e5c9 (diff)
multi token test cases and bug fixes
-rw-r--r--keystone/db/sqlalchemy/api.py9
-rw-r--r--keystone/logic/service.py11
-rw-r--r--test/unit/test_authentication.py59
-rw-r--r--test/unit/test_common.py44
-rw-r--r--test/unit/test_token.py7
5 files changed, 97 insertions, 33 deletions
diff --git a/keystone/db/sqlalchemy/api.py b/keystone/db/sqlalchemy/api.py
index 3f5ec52f..9e5fa6f8 100644
--- a/keystone/db/sqlalchemy/api.py
+++ b/keystone/db/sqlalchemy/api.py
@@ -274,13 +274,6 @@ def user_get(id, session=None):
return result
-def user_get_by_tenant(id, tenant_id, session=None):
- if not session:
- session = get_session()
- user_tenant = session.query(models.UserTenantAssociation).filter_by(\
- tenant_id=tenant_id, user_id=id).first()
- print '1' * 80
- return user_tenant
def user_get_email(email, session=None):
@@ -703,7 +696,7 @@ def user_delete_tenant(id, tenant_id, session=None):
for group_user in group_users:
session.delete(group_user)
user_tenant_ref = session.query(models.UserTenantAssociation)\
- .filter_by(user_id=id, tenant_id=tenant_id).first()
+ .filter_by(user_id=id).first()
if user_tenant_ref is None:
user_ref = user_get(id, session)
session.delete(user_ref)
diff --git a/keystone/logic/service.py b/keystone/logic/service.py
index fc66d8d6..6d07e386 100644
--- a/keystone/logic/service.py
+++ b/keystone/logic/service.py
@@ -57,8 +57,7 @@ class IDMService(object):
credentials.tenant_id)
"""
# added following code
- dtoken = db_api.token_for_user_tenant(duser.id,
- credentials.tenant_id)
+ dtoken = db_api.token_for_user_tenant(duser.id, credentials.tenant_id)
#---
if not dtoken or dtoken.expires < datetime.now():
dtoken = db_models.Token()
@@ -69,11 +68,13 @@ class IDMService(object):
raise fault.IDMFault("Strange: user %s is not associated "
"with a tenant!" % duser.id)
user = db_api.user_get_by_tenant(duser.id, credentials.tenant_id)
- if not credentials.tenant_id and user:
- raise fault.IDMFault("Error: user %s is not associated "
+
+ if not credentials.tenant_id or not user:
+ raise fault.ForbiddenFault("Error: user %s is "
+ "not associated "
"with a tenant! %s" % (duser.id,
credentials.tenant_id))
- dtoken.tenant_id = credentials.tenant_id
+ dtoken.tenant_id = credentials.tenant_id
#removing following code for multi token
"""else:
dtoken.tenant_id = duser.tenants[0].tenant_id"""
diff --git a/test/unit/test_authentication.py b/test/unit/test_authentication.py
index 6f7af0f7..3946f1f3 100644
--- a/test/unit/test_authentication.py
+++ b/test/unit/test_authentication.py
@@ -18,11 +18,11 @@ class AuthenticationTest(unittest.TestCase):
self.tenant = utils.get_tenant()
self.token = utils.get_token('joeuser', 'secrete', self.tenant,
'token')
- self.user = utils.get_user()
+ #self.user = utils.get_user()
self.userdisabled = utils.get_userdisabled()
self.auth_token = utils.get_auth_token()
- self.exp_auth_token = utils.get_exp_auth_token()
- self.disabled_token = utils.get_disabled_token()
+ #self.exp_auth_token = utils.get_exp_auth_token()
+ #self.disabled_token = utils.get_disabled_token()
def tearDown(self):
utils.delete_token(self.token, self.auth_token)
@@ -41,11 +41,12 @@ class AuthenticationTest(unittest.TestCase):
def test_a_authorize_user_disabled(self):
header = httplib2.Http(".cache")
url = '%stoken' % utils.URL
- body = {"passwordCredentials": {"username": "disabled",
+ body = {"passwordCredentials": {"username": self.userdisabled,
"password": "secrete",
"tenantId" : self.tenant}}
resp, content = header.request(url, "POST", body=json.dumps(body),
headers={"Content-Type": "application/json"})
+
content = json.loads(content)
if int(resp['status']) == 500:
self.fail('IDM fault')
@@ -60,11 +61,12 @@ class AuthenticationTest(unittest.TestCase):
body = '<?xml version="1.0" encoding="UTF-8"?> \
<passwordCredentials \
xmlns="http://docs.openstack.org/idm/api/v1.0" \
- password="secrete" username="disabled" \
- tenantId="%s"/>' % self.tenant
+ password="secrete" username="%s" \
+ tenantId="%s"/>' % (self.userdisabled, self.tenant)
resp, content = header.request(url, "POST", body=body,
headers={"Content-Type": "application/xml",
"ACCEPT": "application/xml"})
+
content = etree.fromstring(content)
if int(resp['status']) == 500:
self.fail('IDM fault')
@@ -94,7 +96,7 @@ class AuthenticationTest(unittest.TestCase):
url = '%stoken' % utils.URL
body = '<?xml version="1.0" encoding="UTF-8"?> \
<passwordCredentials \
- xmlns="http://docs.openstack.org/idm/api/v1.0" \
+ xmlns="http://docs.openstack.org/1idm/api/v1.0" \
password="secrete" username-w="disabled" \
tenantId="%s"/>' % self.tenant
resp, content = header.request(url, "POST", body=body,
@@ -108,5 +110,48 @@ class AuthenticationTest(unittest.TestCase):
self.assertEqual(400, int(resp['status']))
self.assertEqual('application/xml', utils.content_type(resp))
+class MultiToken(unittest.TestCase):
+ def setUp(self):
+ self.auth_token = utils.get_auth_token()
+ self.userdisabled = utils.get_userdisabled()
+ resp1, content1 = utils.create_tenant('test_tenant1', self.auth_token)
+ #create tenant2
+ resp2, content2 = utils.create_tenant('test_tenant2', self.auth_token)
+ #create user1 with tenant1
+ resp3, content3 = utils.create_user('test_tenant1', 'test_user1',
+ self.auth_token)
+ resp3, content3 = utils.create_user('test_tenant1', 'test_user2',
+ self.auth_token)
+ #add user1 to tenant2
+ resp4, content4 = utils.add_user_json('test_tenant2', 'test_user1',
+ self.auth_token)
+ #self.exp_auth_token = utils.get_exp_auth_token()
+ #self.disabled_token = utils.get_disabled_token()
+
+ def tearDown(self):
+ utils.delete_user('test_tenant1', 'test_user1', self.auth_token)
+ utils.delete_user('test_tenant1', 'test_user2', self.auth_token)
+ utils.delete_user('test_tenant2', 'test_user1', self.auth_token)
+ utils.delete_tenant('test_tenant1', self.auth_token)
+ utils.delete_tenant('test_tenant2', self.auth_token)
+
+ def test_multi_token(self):
+ #get token for user1 with tenant1
+ token1 = utils.get_token('test_user1', 'secrete', 'test_tenant1', 'token')
+ #get token for user 1 with tenant2
+ token2 = utils.get_token('test_user1', 'secrete', 'test_tenant2', 'token')
+ #test result :: both token should be different
+ self.assertNotEqual(token1, None)
+ self.assertNotEqual(token2, None)
+ self.assertNotEqual(token1, token2)
+
+ resp = utils.delete_token(token1, self.auth_token)
+ resp = utils.delete_token(token2, self.auth_token)
+
+ def test_unassigned_user(self):
+ resp, content = utils.get_token('test_user2', 'secrete', 'test_tenant2')
+
+ self.assertEqual(403, int(resp['status']))
+
if __name__ == '__main__':
unittest.main()
diff --git a/test/unit/test_common.py b/test/unit/test_common.py
index 86088ed4..51452a19 100644
--- a/test/unit/test_common.py
+++ b/test/unit/test_common.py
@@ -14,7 +14,7 @@ from lxml import etree
URL = 'http://localhost:8080/v1.0/'
-def get_token(user, pswd, tenant_id, kind='',):
+def get_token(user, pswd, tenant_id, kind=''):
header = httplib2.Http(".cache")
url = '%stoken' % URL
# to test multi token, removing below code
@@ -33,12 +33,17 @@ def get_token(user, pswd, tenant_id, kind='',):
#---
resp, content = header.request(url, "POST", body=json.dumps(body),
headers={"Content-Type": "application/json"})
- content = json.loads(content)
- token = str(content['auth']['token']['id'])
+
+ if int(resp['status']) == 200:
+ content = json.loads(content)
+ token = str(content['auth']['token']['id'])
+ else:
+ token = None
if kind == 'token':
return token
else:
return (resp, content)
+
def delete_token(token, auth_token):
@@ -81,7 +86,7 @@ def delete_tenant(tenantid, auth_token):
resp, content = header.request(url, "DELETE", body='{}',
headers={"Content-Type": "application/json",
"X-Auth-Token": auth_token})
- return (resp, content)
+ return resp
def delete_tenant_group(groupid, tenantid, auth_token):
@@ -164,10 +169,13 @@ def get_token_xml(user, pswd, tenant_id, type=''):
headers={"Content-Type": "application/xml",
"ACCEPT": "application/xml"})
- dom = etree.fromstring(content)
- root = dom.find("{http://docs.openstack.org/idm/api/v1.0}token")
- token_root = root.attrib
- token = str(token_root['id'])
+ if int(resp['status']) == 200:
+ dom = etree.fromstring(content)
+ root = dom.find("{http://docs.openstack.org/idm/api/v1.0}token")
+ token_root = root.attrib
+ token = str(token_root['id'])
+ else:
+ token = None
if type == 'token':
return token
else:
@@ -221,7 +229,7 @@ def delete_tenant_xml(tenantid, auth_token):
headers={"Content-Type": "application/xml",
"X-Auth-Token": auth_token,
"ACCEPT": "application/xml"})
- return (resp, content)
+ return resp
def delete_tenant_group_xml(groupid, tenantid, auth_token):
@@ -254,7 +262,7 @@ def delete_user(tenant, userid, auth_token):
resp, content = header.request(url, "DELETE", body='{}',
headers={"Content-Type": "application/json",
"X-Auth-Token": auth_token})
-
+ print content
return resp
@@ -292,6 +300,22 @@ def delete_user_xml(tenantid, userid, auth_token):
"ACCEPT": "application/xml"})
return resp
+def add_user_json(tenantid, userid, auth_token):
+ header = httplib2.Http(".cache")
+ url = '%stenants/%s/users/%s/add' % (URL, tenantid, userid)
+ resp, content = header.request(url, "PUT", body='{}',
+ headers={"Content-Type": "application/json",
+ "X-Auth-Token": auth_token})
+ return (resp, content)
+
+def add_user_xml(tenantid, userid, auth_token):
+ header = httplib2.Http(".cache")
+ url = '%stenants/%s/users/%s/add' % (URL, tenantid, userid)
+ resp, content = header.request(url, "PUT", body='{}',
+ headers={"Content-Type": "application/xml",
+ "X-Auth-Token": auth_token,
+ "ACCEPT": "application/xml"})
+ return (resp, content)
def user_update_json(tenant_id, user_id, auth_token, email=None):
h = httplib2.Http(".cache")
diff --git a/test/unit/test_token.py b/test/unit/test_token.py
index 9eee2391..ee72a521 100644
--- a/test/unit/test_token.py
+++ b/test/unit/test_token.py
@@ -1,5 +1,6 @@
import os
import sys
+
# Need to access identity module
sys.path.append(os.path.abspath(os.path.join(os.path.abspath(__file__),
'..', '..', '..', '..', 'keystone')))
@@ -13,11 +14,11 @@ class ValidateToken(unittest.TestCase):
def setUp(self):
self.tenant = utils.get_tenant()
self.token = utils.get_token('joeuser', 'secrete', self.tenant, 'token')
- self.user = utils.get_user()
- self.userdisabled = utils.get_userdisabled()
+ #self.user = utils.get_user()
+ #self.userdisabled = utils.get_userdisabled()
self.auth_token = utils.get_auth_token()
self.exp_auth_token = utils.get_exp_auth_token()
- self.disabled_token = utils.get_disabled_token()
+ #self.disabled_token = utils.get_disabled_token()
def tearDown(self):
utils.delete_token(self.token, self.auth_token)