Remove addition of account to service url.

This commit is contained in:
Monsyne Dragon 2011-03-08 17:18:13 +00:00
parent 417f6ca5c5
commit cbc2956a4e
11 changed files with 59 additions and 103 deletions

View File

@ -73,18 +73,6 @@ class APIRouter(wsgi.Router):
def __init__(self):
mapper = routes.Mapper()
accounts_controller = accounts.Controller()
mapper.connect("account", "/{id}",
controller=accounts_controller, action="show",
conditions=dict(method=["GET"]))
if FLAGS.allow_admin_api:
mapper.connect("/{id}",
controller=accounts_controller, action="update",
conditions=dict(method=["PUT"]))
mapper.connect("/{id}",
controller=accounts_controller, action="delete",
conditions=dict(method=["DELETE"]))
server_members = {'action': 'POST'}
if FLAGS.allow_admin_api:
LOG.debug(_("Including admin operations in API."))
@ -101,38 +89,34 @@ class APIRouter(wsgi.Router):
server_members['inject_network_info'] = 'POST'
mapper.resource("zone", "zones", controller=zones.Controller(),
path_prefix="{account_id}/",
collection={'detail': 'GET'})
mapper.resource("user", "users", controller=users.Controller(),
path_prefix="{account_id}/",
collection={'detail': 'GET'})
mapper.resource("account", "accounts",
controller=accounts.Controller(),
collection={'detail': 'GET'})
mapper.resource("server", "servers", controller=servers.Controller(),
collection={'detail': 'GET'},
path_prefix="{account_id}/",
member=server_members)
mapper.resource("backup_schedule", "backup_schedule",
controller=backup_schedules.Controller(),
path_prefix="{account_id}/servers/{server_id}/",
parent_resource=dict(member_name='server',
collection_name='servers'))
mapper.resource("console", "consoles",
controller=consoles.Controller(),
path_prefix="{account_id}/servers/{server_id}/",
parent_resource=dict(member_name='server',
collection_name='servers'))
mapper.resource("image", "images", controller=images.Controller(),
path_prefix="{account_id}/",
collection={'detail': 'GET'})
mapper.resource("flavor", "flavors", controller=flavors.Controller(),
path_prefix="{account_id}/",
collection={'detail': 'GET'})
mapper.resource("shared_ip_group", "shared_ip_groups",
path_prefix="{account_id}/",
collection={'detail': 'GET'},
controller=shared_ip_groups.Controller())

View File

@ -53,19 +53,15 @@ class AuthMiddleware(wsgi.Middleware):
if not self.has_authentication(req):
return self.authenticate(req)
user = self.get_user_by_authentication(req)
account_name = req.path_info_peek()
accounts = self.auth.get_projects(user=user)
if not user:
return faults.Fault(webob.exc.HTTPUnauthorized())
if not account_name:
if self.auth.is_admin(user):
account_name = FLAGS.default_project
else:
return faults.Fault(webob.exc.HTTPUnauthorized())
try:
account = self.auth.get_project(account_name)
except exception.NotFound:
if accounts:
#we are punting on this til auth is settled,
#and possibly til api v1.1 (mdragon)
account = accounts[0]
else:
return faults.Fault(webob.exc.HTTPUnauthorized())
if not self.auth.is_admin(user) and \
@ -85,7 +81,6 @@ class AuthMiddleware(wsgi.Middleware):
# Unless the request is explicitly made against /<version>/ don't
# honor it
path_info = req.path_info
account_name = None
if len(path_info) > 1:
return faults.Fault(webob.exc.HTTPUnauthorized())
@ -95,10 +90,7 @@ class AuthMiddleware(wsgi.Middleware):
except KeyError:
return faults.Fault(webob.exc.HTTPUnauthorized())
if ':' in username:
account_name, username = username.rsplit(':', 1)
token, user = self._authorize_user(username, account_name, key, req)
token, user = self._authorize_user(username, key, req)
if user and token:
res = webob.Response()
res.headers['X-Auth-Token'] = token.token_hash
@ -135,31 +127,15 @@ class AuthMiddleware(wsgi.Middleware):
return self.auth.get_user(token.user_id)
return None
def _authorize_user(self, username, account_name, key, req):
def _authorize_user(self, username, key, req):
"""Generates a new token and assigns it to a user.
username - string
account_name - string
key - string API key
req - webob.Request object
"""
ctxt = context.get_admin_context()
user = self.auth.get_user_from_access_key(key)
if account_name:
try:
account = self.auth.get_project(account_name)
except exception.NotFound:
return None, None
else:
# (dragondm) punt and try to determine account.
# this is something of a hack, but a user on 1 account is a
# common case, and is the way the current RS code works.
accounts = self.auth.get_projects(user=user)
if len(accounts) == 1:
account = accounts[0]
else:
#we can't tell what account they are logging in for.
return None, None
if user and user.name == username:
token_hash = hashlib.sha1('%s%s%f' % (username, key,
@ -167,11 +143,7 @@ class AuthMiddleware(wsgi.Middleware):
token_dict = {}
token_dict['token_hash'] = token_hash
token_dict['cdn_management_url'] = ''
# auth url + project (account) id, e.g.
# http://foo.org:8774/baz/v1.0/myacct/
os_url = '%s%s%s/' % (req.url,
'' if req.url.endswith('/') else '/',
account.id)
os_url = req.url
token_dict['server_management_url'] = os_url
token_dict['storage_url'] = ''
token_dict['user_id'] = user.id

View File

@ -11,5 +11,5 @@ export EUCALYPTUS_CERT=${NOVA_CERT} # euca-bundle-image seems to require this se
alias ec2-bundle-image="ec2-bundle-image --cert ${EC2_CERT} --privatekey ${EC2_PRIVATE_KEY} --user 42 --ec2cert ${NOVA_CERT}"
alias ec2-upload-bundle="ec2-upload-bundle -a ${EC2_ACCESS_KEY} -s ${EC2_SECRET_KEY} --url ${S3_URL} --ec2cert ${NOVA_CERT}"
export NOVA_API_KEY="%(access)s"
export NOVA_USERNAME="%(project)s:%(user)s"
export NOVA_USERNAME="%(user)s"
export NOVA_URL="%(os)s"

View File

@ -70,7 +70,7 @@ class AccountsTest(test.TestCase):
super(AccountsTest, self).tearDown()
def test_get_account(self):
req = webob.Request.blank('/v1.0/test1')
req = webob.Request.blank('/v1.0/accounts/test1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -80,7 +80,7 @@ class AccountsTest(test.TestCase):
self.assertEqual(res.status_int, 200)
def test_account_delete(self):
req = webob.Request.blank('/v1.0/test1')
req = webob.Request.blank('/v1.0/accounts/test1')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertTrue('test1' not in fakes.FakeAuthManager.projects)
@ -89,7 +89,7 @@ class AccountsTest(test.TestCase):
def test_account_create(self):
body = dict(account=dict(description='test account',
manager='guy1'))
req = webob.Request.blank('/v1.0/newacct')
req = webob.Request.blank('/v1.0/accounts/newacct')
req.method = 'PUT'
req.body = json.dumps(body)
@ -108,7 +108,7 @@ class AccountsTest(test.TestCase):
def test_account_update(self):
body = dict(account=dict(description='test account',
manager='guy2'))
req = webob.Request.blank('/v1.0/test1')
req = webob.Request.blank('/v1.0/accounts/test1')
req.method = 'PUT'
req.body = json.dumps(body)

View File

@ -50,7 +50,7 @@ class AdminAPITest(test.TestCase):
def test_admin_enabled(self):
FLAGS.allow_admin_api = True
# We should still be able to access public operations.
req = webob.Request.blank('/v1.0/testacct/flavors')
req = webob.Request.blank('/v1.0/flavors')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
# TODO: Confirm admin operations are available.
@ -58,7 +58,7 @@ class AdminAPITest(test.TestCase):
def test_admin_disabled(self):
FLAGS.allow_admin_api = False
# We should still be able to access public operations.
req = webob.Request.blank('/v1.0/testacct/flavors')
req = webob.Request.blank('/v1.0/flavors')
res = req.get_response(fakes.wsgi_app())
# TODO: Confirm admin operations are unavailable.
self.assertEqual(res.status_int, 200)

View File

@ -78,7 +78,7 @@ class Test(test.TestCase):
self.assertEqual(result.status, '204 No Content')
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
self.assertEqual(result.headers['X-Server-Management-Url'],
"http://foo/v1.0/test/")
"http://foo/v1.0/")
self.assertEqual(result.headers['X-CDN-Management-Url'],
"")
self.assertEqual(result.headers['X-Storage-Url'], "")

View File

@ -42,11 +42,11 @@ class FlavorsTest(test.TestCase):
super(FlavorsTest, self).tearDown()
def test_get_flavor_list(self):
req = webob.Request.blank('/v1.0/testacct/flavors')
req = webob.Request.blank('/v1.0/flavors')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
def test_get_flavor_by_id(self):
req = webob.Request.blank('/v1.0/testacct/flavors/1')
req = webob.Request.blank('/v1.0/flavors/1')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)

View File

@ -216,7 +216,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
super(ImageControllerWithGlanceServiceTest, self).tearDown()
def test_get_image_index(self):
req = webob.Request.blank('/v1.0/testacct/images')
req = webob.Request.blank('/v1.0/images')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -228,7 +228,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
"image %s not in fixture index!" % str(image))
def test_get_image_details(self):
req = webob.Request.blank('/v1.0/testacct/images/detail')
req = webob.Request.blank('/v1.0/images/detail')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)

View File

@ -150,7 +150,7 @@ class ServersTest(test.TestCase):
super(ServersTest, self).tearDown()
def test_get_server_by_id(self):
req = webob.Request.blank('/v1.0/testacct/servers/1')
req = webob.Request.blank('/v1.0/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
self.assertEqual(res_dict['server']['id'], '1')
@ -161,7 +161,7 @@ class ServersTest(test.TestCase):
public = ["1.2.3.4"]
new_return_server = return_server_with_addresses(private, public)
self.stubs.Set(nova.db.api, 'instance_get', new_return_server)
req = webob.Request.blank('/v1.0/testacct/servers/1')
req = webob.Request.blank('/v1.0/servers/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
self.assertEqual(res_dict['server']['id'], '1')
@ -173,7 +173,7 @@ class ServersTest(test.TestCase):
self.assertEqual(addresses["private"][0], private)
def test_get_server_list(self):
req = webob.Request.blank('/v1.0/testacct/servers')
req = webob.Request.blank('/v1.0/servers')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -224,7 +224,7 @@ class ServersTest(test.TestCase):
name='server_test', imageId=2, flavorId=2,
metadata={'hello': 'world', 'open': 'stack'},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers')
req = webob.Request.blank('/v1.0/servers')
req.method = 'POST'
req.body = json.dumps(body)
@ -233,7 +233,7 @@ class ServersTest(test.TestCase):
self.assertEqual(res.status_int, 200)
def test_update_no_body(self):
req = webob.Request.blank('/v1.0/testacct/servers/1')
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 422)
@ -251,7 +251,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.db.api, 'instance_update',
server_update)
req = webob.Request.blank('/v1.0/testacct/servers/1')
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
req.body = self.body
req.get_response(fakes.wsgi_app())
@ -267,30 +267,30 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.db.api, 'instance_update',
server_update)
req = webob.Request.blank('/v1.0/testacct/servers/1')
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'PUT'
req.body = self.body
req.get_response(fakes.wsgi_app())
def test_create_backup_schedules(self):
req = webob.Request.blank('/v1.0/testacct/servers/1/backup_schedules')
req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
req.method = 'POST'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status, '404 Not Found')
def test_delete_backup_schedules(self):
req = webob.Request.blank('/v1.0/testacct/servers/1/backup_schedules')
req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status, '404 Not Found')
def test_get_server_backup_schedules(self):
req = webob.Request.blank('/v1.0/testacct/servers/1/backup_schedules')
req = webob.Request.blank('/v1.0/servers/1/backup_schedules')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status, '404 Not Found')
def test_get_all_server_details(self):
req = webob.Request.blank('/v1.0/testacct/servers/detail')
req = webob.Request.blank('/v1.0/servers/detail')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -321,7 +321,7 @@ class ServersTest(test.TestCase):
self.stubs.Set(nova.db.api, 'instance_get_all_by_user',
return_servers_with_host)
req = webob.Request.blank('/v1.0/testacct/servers/detail')
req = webob.Request.blank('/v1.0/servers/detail')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -341,7 +341,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/pause')
req = webob.Request.blank('/v1.0/servers/1/pause')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -353,7 +353,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/unpause')
req = webob.Request.blank('/v1.0/servers/1/unpause')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -365,7 +365,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/suspend')
req = webob.Request.blank('/v1.0/servers/1/suspend')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -377,7 +377,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/resume')
req = webob.Request.blank('/v1.0/servers/1/resume')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -389,7 +389,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/reset_network')
req = webob.Request.blank('/v1.0/servers/1/reset_network')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -402,7 +402,7 @@ class ServersTest(test.TestCase):
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank(
'/v1.0/testacct/servers/1/inject_network_info')
'/v1.0/servers/1/inject_network_info')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -410,13 +410,13 @@ class ServersTest(test.TestCase):
self.assertEqual(res.status_int, 202)
def test_server_diagnostics(self):
req = webob.Request.blank("/v1.0/testacct/servers/1/diagnostics")
req = webob.Request.blank("/v1.0/servers/1/diagnostics")
req.method = "GET"
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 404)
def test_server_actions(self):
req = webob.Request.blank("/v1.0/testacct/servers/1/actions")
req = webob.Request.blank("/v1.0/servers/1/actions")
req.method = "GET"
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 404)
@ -425,7 +425,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/action')
req = webob.Request.blank('/v1.0/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -435,7 +435,7 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/action')
req = webob.Request.blank('/v1.0/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
@ -445,14 +445,14 @@ class ServersTest(test.TestCase):
body = dict(server=dict(
name='server_test', imageId=2, flavorId=2, metadata={},
personality={}))
req = webob.Request.blank('/v1.0/testacct/servers/1/action')
req = webob.Request.blank('/v1.0/servers/1/action')
req.method = 'POST'
req.content_type = 'application/json'
req.body = json.dumps(body)
res = req.get_response(fakes.wsgi_app())
def test_delete_server_instance(self):
req = webob.Request.blank('/v1.0/testacct/servers/1')
req = webob.Request.blank('/v1.0/servers/1')
req.method = 'DELETE'
self.server_delete_called = False

View File

@ -72,7 +72,7 @@ class UsersTest(test.TestCase):
super(UsersTest, self).tearDown()
def test_get_user_list(self):
req = webob.Request.blank('/v1.0/testacct/users')
req = webob.Request.blank('/v1.0/users')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -80,7 +80,7 @@ class UsersTest(test.TestCase):
self.assertEqual(len(res_dict['users']), 2)
def test_get_user_by_id(self):
req = webob.Request.blank('/v1.0/testacct/users/guy2')
req = webob.Request.blank('/v1.0/users/guy2')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -91,7 +91,7 @@ class UsersTest(test.TestCase):
self.assertEqual(res.status_int, 200)
def test_user_delete(self):
req = webob.Request.blank('/v1.0/testacct/users/guy1')
req = webob.Request.blank('/v1.0/users/guy1')
req.method = 'DELETE'
res = req.get_response(fakes.wsgi_app())
self.assertTrue('guy1' not in [u.id for u in
@ -103,7 +103,7 @@ class UsersTest(test.TestCase):
access='acc3',
secret='invasionIsInNormandy',
admin=True))
req = webob.Request.blank('/v1.0/testacct/users')
req = webob.Request.blank('/v1.0/users')
req.method = 'POST'
req.body = json.dumps(body)
@ -124,7 +124,7 @@ class UsersTest(test.TestCase):
body = dict(user=dict(name='guy2',
access='acc2',
secret='invasionIsInNormandy'))
req = webob.Request.blank('/v1.0/testacct/users/guy2')
req = webob.Request.blank('/v1.0/users/guy2')
req.method = 'PUT'
req.body = json.dumps(body)

View File

@ -85,7 +85,7 @@ class ZonesTest(test.TestCase):
super(ZonesTest, self).tearDown()
def test_get_zone_list(self):
req = webob.Request.blank('/v1.0/testacct/zones')
req = webob.Request.blank('/v1.0/zones')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -93,7 +93,7 @@ class ZonesTest(test.TestCase):
self.assertEqual(len(res_dict['zones']), 2)
def test_get_zone_by_id(self):
req = webob.Request.blank('/v1.0/testacct/zones/1')
req = webob.Request.blank('/v1.0/zones/1')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@ -103,7 +103,7 @@ class ZonesTest(test.TestCase):
self.assertEqual(res.status_int, 200)
def test_zone_delete(self):
req = webob.Request.blank('/v1.0/testacct/zones/1')
req = webob.Request.blank('/v1.0/zones/1')
res = req.get_response(fakes.wsgi_app())
self.assertEqual(res.status_int, 200)
@ -111,7 +111,7 @@ class ZonesTest(test.TestCase):
def test_zone_create(self):
body = dict(zone=dict(api_url='http://blah.zoo', username='fred',
password='fubar'))
req = webob.Request.blank('/v1.0/testacct/zones')
req = webob.Request.blank('/v1.0/zones')
req.method = 'POST'
req.body = json.dumps(body)
@ -125,7 +125,7 @@ class ZonesTest(test.TestCase):
def test_zone_update(self):
body = dict(zone=dict(username='zeb', password='sneaky'))
req = webob.Request.blank('/v1.0/testacct/zones/1')
req = webob.Request.blank('/v1.0/zones/1')
req.method = 'PUT'
req.body = json.dumps(body)