fix all tests
This commit is contained in:
parent
e1cf345fa8
commit
44d1024a53
@ -66,7 +66,7 @@ class RequestLogging(wsgi.Middleware):
|
||||
else:
|
||||
controller = None
|
||||
action = None
|
||||
ctxt = request.environ.get('ec2.context', None)
|
||||
ctxt = request.environ.get('nova.context', None)
|
||||
delta = utils.utcnow() - start
|
||||
seconds = delta.seconds
|
||||
microseconds = delta.microseconds
|
||||
@ -138,20 +138,8 @@ class Lockout(wsgi.Middleware):
|
||||
return res
|
||||
|
||||
|
||||
class InjectContext(wsgi.Middleware):
|
||||
"""Always add a fake 'ec2.context' to WSGI environ."""
|
||||
def __init__(self, context, *args, **kwargs):
|
||||
self.context = context
|
||||
super(InjectContext, self).__init__(*args, **kwargs)
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, req):
|
||||
req.environ['ec2.context'] = self.context
|
||||
return self.application
|
||||
|
||||
|
||||
class Authenticate(wsgi.Middleware):
|
||||
"""Authenticate an EC2 request and add 'ec2.context' to WSGI environ."""
|
||||
"""Authenticate an EC2 request and add 'nova.context' to WSGI environ."""
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, req):
|
||||
@ -187,12 +175,13 @@ class Authenticate(wsgi.Middleware):
|
||||
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
||||
ctxt = context.RequestContext(user_id=user.id,
|
||||
project_id=project.id,
|
||||
is_admin=user.is_admin(),
|
||||
remote_address=remote_address)
|
||||
req.environ['ec2.context'] = ctxt
|
||||
req.environ['nova.context'] = ctxt
|
||||
uname = user.name
|
||||
pname = project.name
|
||||
msg = _('Authenticated Request For %(uname)s:%(pname)s)') % locals()
|
||||
LOG.audit(msg, context=req.environ['ec2.context'])
|
||||
LOG.audit(msg, context=req.environ['nova.context'])
|
||||
return self.application
|
||||
|
||||
|
||||
@ -239,7 +228,7 @@ class Authorizer(wsgi.Middleware):
|
||||
"""Authorize an EC2 API request.
|
||||
|
||||
Return a 401 if ec2.controller and ec2.action in WSGI environ may not be
|
||||
executed in ec2.context.
|
||||
executed in nova.context.
|
||||
"""
|
||||
|
||||
def __init__(self, application):
|
||||
@ -293,7 +282,7 @@ class Authorizer(wsgi.Middleware):
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, req):
|
||||
context = req.environ['ec2.context']
|
||||
context = req.environ['nova.context']
|
||||
controller = req.environ['ec2.request'].controller.__class__.__name__
|
||||
action = req.environ['ec2.request'].action
|
||||
allowed_roles = self.action_roles[controller].get(action, ['none'])
|
||||
@ -319,14 +308,14 @@ class Executor(wsgi.Application):
|
||||
|
||||
"""Execute an EC2 API request.
|
||||
|
||||
Executes 'ec2.action' upon 'ec2.controller', passing 'ec2.context' and
|
||||
Executes 'ec2.action' upon 'ec2.controller', passing 'nova.context' and
|
||||
'ec2.action_args' (all variables in WSGI environ.) Returns an XML
|
||||
response, or a 400 upon failure.
|
||||
"""
|
||||
|
||||
@webob.dec.wsgify(RequestClass=wsgi.Request)
|
||||
def __call__(self, req):
|
||||
context = req.environ['ec2.context']
|
||||
context = req.environ['nova.context']
|
||||
api_request = req.environ['ec2.request']
|
||||
result = None
|
||||
try:
|
||||
|
@ -58,9 +58,25 @@ class AuthMiddleware(wsgi.Middleware):
|
||||
try:
|
||||
project_id = req.headers["X-Auth-Project-Id"]
|
||||
except KeyError:
|
||||
project_id = user_id
|
||||
# FIXME(usrleon): It needed only for compatibility
|
||||
# while osapi clients don't use this header
|
||||
projects = self.auth.get_projects(user_id)
|
||||
if projects:
|
||||
project_id = projects[0]
|
||||
else:
|
||||
return faults.Fault(webob.exc.HTTPUnauthorized())
|
||||
|
||||
is_admin = self.auth.is_admin(user_id)
|
||||
req.environ['nova.context'] = context.RequestContext(user_id,
|
||||
project_id,
|
||||
is_admin)
|
||||
if not is_admin and not self.auth.is_project_member(user_id,
|
||||
project_id):
|
||||
msg = _("%(user_id)s must be an admin or a "
|
||||
"member of %(project_id)s")
|
||||
LOG.warn(msg % locals())
|
||||
return faults.Fault(webob.exc.HTTPUnauthorized())
|
||||
|
||||
req.environ['nova.context'] = context.RequestContext(user_id, project_id)
|
||||
return self.application
|
||||
|
||||
def has_authentication(self, req):
|
||||
|
@ -676,6 +676,7 @@ class API(base.Base):
|
||||
all instances in the system.
|
||||
"""
|
||||
|
||||
LOG.info(locals())
|
||||
if reservation_id is not None:
|
||||
recurse_zones = True
|
||||
instances = self.db.instance_get_all_by_reservation(
|
||||
@ -688,6 +689,7 @@ class API(base.Base):
|
||||
raise
|
||||
instances = None
|
||||
elif project_id or not context.is_admin:
|
||||
LOG.info(context.project_id)
|
||||
if not context.project_id:
|
||||
instances = self.db.instance_get_all_by_user(
|
||||
context, context.user_id)
|
||||
|
@ -29,6 +29,7 @@ from glance.common import exception as glance_exc
|
||||
from nova import context
|
||||
from nova import exception as exc
|
||||
from nova import utils
|
||||
from nova import wsgi
|
||||
import nova.api.openstack.auth
|
||||
from nova.api import openstack
|
||||
from nova.api.openstack import auth
|
||||
@ -40,14 +41,13 @@ import nova.image.fake
|
||||
from nova.image import glance
|
||||
from nova.image import service
|
||||
from nova.tests import fake_flags
|
||||
from nova.wsgi import Router
|
||||
|
||||
|
||||
class Context(object):
|
||||
pass
|
||||
|
||||
|
||||
class FakeRouter(Router):
|
||||
class FakeRouter(wsgi.Router):
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@ -68,21 +68,30 @@ def fake_auth_init(self, application):
|
||||
|
||||
@webob.dec.wsgify
|
||||
def fake_wsgi(self, req):
|
||||
req.environ['nova.context'] = context.RequestContext(1, 1)
|
||||
return self.application
|
||||
|
||||
|
||||
def wsgi_app(inner_app10=None, inner_app11=None):
|
||||
def wsgi_app(inner_app10=None, inner_app11=None, fake_auth=True):
|
||||
if not inner_app10:
|
||||
inner_app10 = openstack.APIRouterV10()
|
||||
if not inner_app11:
|
||||
inner_app11 = openstack.APIRouterV11()
|
||||
mapper = urlmap.URLMap()
|
||||
api10 = openstack.FaultWrapper(auth.AuthMiddleware(
|
||||
|
||||
if fake_auth:
|
||||
ctxt = context.RequestContext('fake', 'fake')
|
||||
api10 = openstack.FaultWrapper(wsgi.InjectContext(ctxt,
|
||||
limits.RateLimitingMiddleware(inner_app10)))
|
||||
api11 = openstack.FaultWrapper(auth.AuthMiddleware(
|
||||
api11 = openstack.FaultWrapper(wsgi.InjectContext(ctxt,
|
||||
limits.RateLimitingMiddleware(
|
||||
extensions.ExtensionMiddleware(inner_app11))))
|
||||
else:
|
||||
api10 = openstack.FaultWrapper(auth.AuthMiddleware(
|
||||
limits.RateLimitingMiddleware(inner_app10)))
|
||||
api11 = openstack.FaultWrapper(auth.AuthMiddleware(
|
||||
limits.RateLimitingMiddleware(
|
||||
extensions.ExtensionMiddleware(inner_app11))))
|
||||
Auth = auth
|
||||
mapper = urlmap.URLMap()
|
||||
mapper['/v1.0'] = api10
|
||||
mapper['/v1.1'] = api11
|
||||
mapper['/'] = openstack.FaultWrapper(versions.Versions())
|
||||
@ -359,17 +368,18 @@ class FakeAuthManager(object):
|
||||
if admin is not None:
|
||||
user.admin = admin
|
||||
|
||||
def is_admin(self, user):
|
||||
def is_admin(self, user_id):
|
||||
user = self.get_user(user_id)
|
||||
return user.admin
|
||||
|
||||
def is_project_member(self, user, project):
|
||||
def is_project_member(self, user_id, project):
|
||||
if not isinstance(project, Project):
|
||||
try:
|
||||
project = self.get_project(project)
|
||||
except exc.NotFound:
|
||||
raise webob.exc.HTTPUnauthorized()
|
||||
return ((user.id in project.member_ids) or
|
||||
(user.id == project.project_manager_id))
|
||||
return ((user_id in project.member_ids) or
|
||||
(user_id == project.project_manager_id))
|
||||
|
||||
def create_project(self, name, manager_user, description=None,
|
||||
member_users=None):
|
||||
@ -396,13 +406,13 @@ class FakeAuthManager(object):
|
||||
else:
|
||||
raise exc.NotFound
|
||||
|
||||
def get_projects(self, user=None):
|
||||
if not user:
|
||||
def get_projects(self, user_id=None):
|
||||
if not user_id:
|
||||
return FakeAuthManager.projects.values()
|
||||
else:
|
||||
return [p for p in FakeAuthManager.projects.values()
|
||||
if (user.id in p.member_ids) or
|
||||
(user.id == p.project_manager_id)]
|
||||
if (user_id in p.member_ids) or
|
||||
(user_id == p.project_manager_id)]
|
||||
|
||||
|
||||
class FakeRateLimiter(object):
|
||||
|
@ -34,7 +34,6 @@ class Test(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(Test, self).setUp()
|
||||
self.stubs = stubout.StubOutForTesting()
|
||||
self.stubs.Set(nova.api.openstack.auth.AuthMiddleware,
|
||||
'__init__', fakes.fake_auth_init)
|
||||
self.stubs.Set(context, 'RequestContext', fakes.FakeRequestContext)
|
||||
@ -56,7 +55,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-User'] = 'user1'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '204 No Content')
|
||||
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
|
||||
self.assertEqual(result.headers['X-CDN-Management-Url'],
|
||||
@ -72,7 +71,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/', {'HTTP_HOST': 'foo'})
|
||||
req.headers['X-Auth-User'] = 'user1'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '204 No Content')
|
||||
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
|
||||
self.assertEqual(result.headers['X-Server-Management-Url'],
|
||||
@ -85,7 +84,7 @@ class Test(test.TestCase):
|
||||
self.stubs.Set(nova.api.openstack, 'APIRouterV10', fakes.FakeRouter)
|
||||
req = webob.Request.blank('/v1.0/fake')
|
||||
req.headers['X-Auth-Token'] = token
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '200 OK')
|
||||
self.assertEqual(result.headers['X-Test-Success'], 'True')
|
||||
|
||||
@ -109,7 +108,7 @@ class Test(test.TestCase):
|
||||
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-Token'] = 'token_hash'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
self.assertEqual(self.destroy_called, True)
|
||||
|
||||
@ -123,7 +122,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/', {'HTTP_HOST': 'foo'})
|
||||
req.headers['X-Auth-User'] = 'user1'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '204 No Content')
|
||||
|
||||
token = result.headers['X-Auth-Token']
|
||||
@ -131,7 +130,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/fake')
|
||||
req.headers['X-Auth-Token'] = token
|
||||
req.headers['X-Auth-Project-Id'] = 'user2_project'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '200 OK')
|
||||
self.assertEqual(result.headers['X-Test-Success'], 'True')
|
||||
|
||||
@ -139,7 +138,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-User'] = 'unknown_user'
|
||||
req.headers['X-Auth-Key'] = 'unknown_user_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
def test_bad_user_good_key(self):
|
||||
@ -150,18 +149,18 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-User'] = 'unknown_user'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
def test_no_user(self):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
def test_bad_token(self):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-Token'] = 'unknown_token'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
def test_bad_project(self):
|
||||
@ -176,7 +175,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/', {'HTTP_HOST': 'foo'})
|
||||
req.headers['X-Auth-User'] = 'user1'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '204 No Content')
|
||||
|
||||
token = result.headers['X-Auth-Token']
|
||||
@ -184,7 +183,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/fake')
|
||||
req.headers['X-Auth-Token'] = token
|
||||
req.headers['X-Auth-Project-Id'] = 'user2_project'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
def test_not_existing_project(self):
|
||||
@ -196,7 +195,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/', {'HTTP_HOST': 'foo'})
|
||||
req.headers['X-Auth-User'] = 'user1'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '204 No Content')
|
||||
|
||||
token = result.headers['X-Auth-Token']
|
||||
@ -204,7 +203,7 @@ class Test(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/fake')
|
||||
req.headers['X-Auth-Token'] = token
|
||||
req.headers['X-Auth-Project-Id'] = 'unknown_project'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
|
||||
@ -225,13 +224,13 @@ class TestFunctional(test.TestCase):
|
||||
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-Token'] = 'test_token_hash'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
def test_token_doesnotexist(self):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-Token'] = 'nonexistant_token_hash'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '401 Unauthorized')
|
||||
|
||||
|
||||
@ -260,7 +259,7 @@ class TestLimiter(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/')
|
||||
req.headers['X-Auth-User'] = 'user1'
|
||||
req.headers['X-Auth-Key'] = 'user1_key'
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(len(result.headers['X-Auth-Token']), 40)
|
||||
|
||||
token = result.headers['X-Auth-Token']
|
||||
@ -268,6 +267,6 @@ class TestLimiter(test.TestCase):
|
||||
req = webob.Request.blank('/v1.0/fake')
|
||||
req.method = 'POST'
|
||||
req.headers['X-Auth-Token'] = token
|
||||
result = req.get_response(fakes.wsgi_app())
|
||||
result = req.get_response(fakes.wsgi_app(fake_auth=False))
|
||||
self.assertEqual(result.status, '200 OK')
|
||||
self.assertEqual(result.headers['X-Test-Success'], 'True')
|
||||
|
@ -16,13 +16,12 @@
|
||||
# under the License.
|
||||
|
||||
import json
|
||||
import stubout
|
||||
import unittest
|
||||
import webob
|
||||
import os.path
|
||||
|
||||
from nova import context
|
||||
from nova import flags
|
||||
from nova import test
|
||||
from nova.api import openstack
|
||||
from nova.api.openstack import extensions
|
||||
from nova.api.openstack import flavors
|
||||
@ -78,7 +77,7 @@ class StubExtensionManager(object):
|
||||
return request_extensions
|
||||
|
||||
|
||||
class ExtensionControllerTest(unittest.TestCase):
|
||||
class ExtensionControllerTest(test.TestCase):
|
||||
|
||||
def test_index(self):
|
||||
app = openstack.APIRouterV11()
|
||||
@ -95,7 +94,7 @@ class ExtensionControllerTest(unittest.TestCase):
|
||||
self.assertEqual(200, response.status_int)
|
||||
|
||||
|
||||
class ResourceExtensionTest(unittest.TestCase):
|
||||
class ResourceExtensionTest(test.TestCase):
|
||||
|
||||
def test_no_extension_present(self):
|
||||
manager = StubExtensionManager(None)
|
||||
@ -133,13 +132,14 @@ class InvalidExtension(object):
|
||||
return "THIRD"
|
||||
|
||||
|
||||
class ExtensionManagerTest(unittest.TestCase):
|
||||
class ExtensionManagerTest(test.TestCase):
|
||||
|
||||
response_body = "Try to say this Mr. Knox, sir..."
|
||||
|
||||
def setUp(self):
|
||||
FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__),
|
||||
"extensions")
|
||||
super(ExtensionManagerTest, self).setUp()
|
||||
ext_path = os.path.join(os.path.dirname(__file__), "extensions")
|
||||
self.flags(osapi_extensions_path=ext_path)
|
||||
|
||||
def test_get_resources(self):
|
||||
app = openstack.APIRouterV11()
|
||||
@ -158,11 +158,12 @@ class ExtensionManagerTest(unittest.TestCase):
|
||||
self.assertTrue('THIRD' not in ext_mgr.extensions)
|
||||
|
||||
|
||||
class ActionExtensionTest(unittest.TestCase):
|
||||
class ActionExtensionTest(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__),
|
||||
"extensions")
|
||||
super(ActionExtensionTest, self).setUp()
|
||||
ext_path = os.path.join(os.path.dirname(__file__), "extensions")
|
||||
self.flags(osapi_extensions_path=ext_path)
|
||||
|
||||
def _send_server_action_request(self, url, body):
|
||||
app = openstack.APIRouterV11()
|
||||
@ -196,20 +197,14 @@ class ActionExtensionTest(unittest.TestCase):
|
||||
self.assertEqual(404, response.status_int)
|
||||
|
||||
|
||||
class RequestExtensionTest(unittest.TestCase):
|
||||
class RequestExtensionTest(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(RequestExtensionTest, self).setUp()
|
||||
self.stubs = stubout.StubOutForTesting()
|
||||
fakes.FakeAuthManager.reset_fake_data()
|
||||
fakes.FakeAuthDatabase.data = {}
|
||||
fakes.stub_out_auth(self.stubs)
|
||||
self.context = context.get_admin_context()
|
||||
|
||||
def tearDown(self):
|
||||
self.stubs.UnsetAll()
|
||||
super(RequestExtensionTest, self).tearDown()
|
||||
|
||||
def test_get_resources_with_stub_mgr(self):
|
||||
|
||||
def _req_handler(req, res):
|
||||
|
@ -17,14 +17,13 @@
|
||||
|
||||
import json
|
||||
import stubout
|
||||
import unittest
|
||||
import webob
|
||||
import os.path
|
||||
|
||||
|
||||
from nova import flags
|
||||
from nova import test
|
||||
from nova.api import openstack
|
||||
from nova.api.openstack import auth
|
||||
from nova.api.openstack import extensions
|
||||
from nova.tests.api.openstack import fakes
|
||||
import nova.wsgi
|
||||
@ -40,10 +39,6 @@ def return_flavor_extra_specs(context, flavor_id):
|
||||
return stub_flavor_extra_specs()
|
||||
|
||||
|
||||
def return_flavor_extra_specs(context, flavor_id):
|
||||
return stub_flavor_extra_specs()
|
||||
|
||||
|
||||
def return_empty_flavor_extra_specs(context, flavor_id):
|
||||
return {}
|
||||
|
||||
@ -62,30 +57,17 @@ def stub_flavor_extra_specs():
|
||||
return specs
|
||||
|
||||
|
||||
class FlavorsExtraSpecsTest(unittest.TestCase):
|
||||
class FlavorsExtraSpecsTest(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(FlavorsExtraSpecsTest, self).setUp()
|
||||
FLAGS.osapi_extensions_path = os.path.join(os.path.dirname(__file__),
|
||||
"extensions")
|
||||
self.stubs = stubout.StubOutForTesting()
|
||||
fakes.FakeAuthManager.auth_data = {}
|
||||
fakes.FakeAuthDatabase.data = {}
|
||||
fakes.stub_out_auth(self.stubs)
|
||||
fakes.stub_out_key_pair_funcs(self.stubs)
|
||||
self.mware = auth.AuthMiddleware(
|
||||
extensions.ExtensionMiddleware(
|
||||
openstack.APIRouterV11()))
|
||||
|
||||
def tearDown(self):
|
||||
self.stubs.UnsetAll()
|
||||
super(FlavorsExtraSpecsTest, self).tearDown()
|
||||
|
||||
def test_index(self):
|
||||
self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
|
||||
return_flavor_extra_specs)
|
||||
request = webob.Request.blank('/flavors/1/os-extra_specs')
|
||||
res = request.get_response(self.mware)
|
||||
request = webob.Request.blank('/v1.1/flavors/1/os-extra_specs')
|
||||
res = request.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(200, res.status_int)
|
||||
res_dict = json.loads(res.body)
|
||||
self.assertEqual('application/json', res.headers['Content-Type'])
|
||||
@ -94,8 +76,8 @@ class FlavorsExtraSpecsTest(unittest.TestCase):
|
||||
def test_index_no_data(self):
|
||||
self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
|
||||
return_empty_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs')
|
||||
res = req.get_response(self.mware)
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
res_dict = json.loads(res.body)
|
||||
self.assertEqual(200, res.status_int)
|
||||
self.assertEqual('application/json', res.headers['Content-Type'])
|
||||
@ -104,8 +86,8 @@ class FlavorsExtraSpecsTest(unittest.TestCase):
|
||||
def test_show(self):
|
||||
self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
|
||||
return_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/key5')
|
||||
res = req.get_response(self.mware)
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/key5')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(200, res.status_int)
|
||||
res_dict = json.loads(res.body)
|
||||
self.assertEqual('application/json', res.headers['Content-Type'])
|
||||
@ -114,28 +96,28 @@ class FlavorsExtraSpecsTest(unittest.TestCase):
|
||||
def test_show_spec_not_found(self):
|
||||
self.stubs.Set(nova.db.api, 'instance_type_extra_specs_get',
|
||||
return_empty_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/key6')
|
||||
res = req.get_response(self.mware)
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/key6')
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
res_dict = json.loads(res.body)
|
||||
self.assertEqual(404, res.status_int)
|
||||
|
||||
def test_delete(self):
|
||||
self.stubs.Set(nova.db.api, 'instance_type_extra_specs_delete',
|
||||
delete_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/key5')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/key5')
|
||||
req.method = 'DELETE'
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(200, res.status_int)
|
||||
|
||||
def test_create(self):
|
||||
self.stubs.Set(nova.db.api,
|
||||
'instance_type_extra_specs_update_or_create',
|
||||
return_create_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs')
|
||||
req.method = 'POST'
|
||||
req.body = '{"extra_specs": {"key1": "value1"}}'
|
||||
req.headers["content-type"] = "application/json"
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
res_dict = json.loads(res.body)
|
||||
self.assertEqual(200, res.status_int)
|
||||
self.assertEqual('application/json', res.headers['Content-Type'])
|
||||
@ -145,21 +127,21 @@ class FlavorsExtraSpecsTest(unittest.TestCase):
|
||||
self.stubs.Set(nova.db.api,
|
||||
'instance_type_extra_specs_update_or_create',
|
||||
return_create_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs')
|
||||
req.method = 'POST'
|
||||
req.headers["content-type"] = "application/json"
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(400, res.status_int)
|
||||
|
||||
def test_update_item(self):
|
||||
self.stubs.Set(nova.db.api,
|
||||
'instance_type_extra_specs_update_or_create',
|
||||
return_create_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/key1')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/key1')
|
||||
req.method = 'PUT'
|
||||
req.body = '{"key1": "value1"}'
|
||||
req.headers["content-type"] = "application/json"
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(200, res.status_int)
|
||||
self.assertEqual('application/json', res.headers['Content-Type'])
|
||||
res_dict = json.loads(res.body)
|
||||
@ -169,30 +151,30 @@ class FlavorsExtraSpecsTest(unittest.TestCase):
|
||||
self.stubs.Set(nova.db.api,
|
||||
'instance_type_extra_specs_update_or_create',
|
||||
return_create_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/key1')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/key1')
|
||||
req.method = 'PUT'
|
||||
req.headers["content-type"] = "application/json"
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(400, res.status_int)
|
||||
|
||||
def test_update_item_too_many_keys(self):
|
||||
self.stubs.Set(nova.db.api,
|
||||
'instance_type_extra_specs_update_or_create',
|
||||
return_create_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/key1')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/key1')
|
||||
req.method = 'PUT'
|
||||
req.body = '{"key1": "value1", "key2": "value2"}'
|
||||
req.headers["content-type"] = "application/json"
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(400, res.status_int)
|
||||
|
||||
def test_update_item_body_uri_mismatch(self):
|
||||
self.stubs.Set(nova.db.api,
|
||||
'instance_type_extra_specs_update_or_create',
|
||||
return_create_flavor_extra_specs)
|
||||
req = webob.Request.blank('/flavors/1/os-extra_specs/bad')
|
||||
req = webob.Request.blank('/v1.1/flavors/1/os-extra_specs/bad')
|
||||
req.method = 'PUT'
|
||||
req.body = '{"key1": "value1"}'
|
||||
req.headers["content-type"] = "application/json"
|
||||
res = req.get_response(self.mware)
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
self.assertEqual(400, res.status_int)
|
@ -155,7 +155,7 @@ class GlanceImageServiceTest(_BaseImageServiceTests):
|
||||
fakes.stub_out_compute_api_snapshot(self.stubs)
|
||||
service_class = 'nova.image.glance.GlanceImageService'
|
||||
self.service = utils.import_object(service_class)
|
||||
self.context = context.RequestContext(1, None)
|
||||
self.context = context.RequestContext('fake', 'fake')
|
||||
self.service.delete_all()
|
||||
self.sent_to_glance = {}
|
||||
fakes.stub_out_glance_add_image(self.stubs, self.sent_to_glance)
|
||||
@ -168,7 +168,7 @@ class GlanceImageServiceTest(_BaseImageServiceTests):
|
||||
"""Ensure instance_id is persisted as an image-property"""
|
||||
fixture = {'name': 'test image',
|
||||
'is_public': False,
|
||||
'properties': {'instance_id': '42', 'user_id': '1'}}
|
||||
'properties': {'instance_id': '42', 'user_id': 'fake'}}
|
||||
|
||||
image_id = self.service.create(self.context, fixture)['id']
|
||||
expected = fixture
|
||||
@ -178,7 +178,7 @@ class GlanceImageServiceTest(_BaseImageServiceTests):
|
||||
expected = {'id': image_id,
|
||||
'name': 'test image',
|
||||
'is_public': False,
|
||||
'properties': {'instance_id': '42', 'user_id': '1'}}
|
||||
'properties': {'instance_id': '42', 'user_id': 'fake'}}
|
||||
self.assertDictMatch(image_meta, expected)
|
||||
|
||||
image_metas = self.service.detail(self.context)
|
||||
@ -331,11 +331,8 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
self.orig_image_service = FLAGS.image_service
|
||||
FLAGS.image_service = 'nova.image.glance.GlanceImageService'
|
||||
self.stubs = stubout.StubOutForTesting()
|
||||
fakes.FakeAuthManager.reset_fake_data()
|
||||
fakes.FakeAuthDatabase.data = {}
|
||||
fakes.stub_out_networking(self.stubs)
|
||||
fakes.stub_out_rate_limiting(self.stubs)
|
||||
fakes.stub_out_auth(self.stubs)
|
||||
fakes.stub_out_key_pair_funcs(self.stubs)
|
||||
self.fixtures = self._make_image_fixtures()
|
||||
fakes.stub_out_glance(self.stubs, initial_fixtures=self.fixtures)
|
||||
@ -352,7 +349,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
"""Determine if this fixture is applicable for given user id."""
|
||||
is_public = fixture["is_public"]
|
||||
try:
|
||||
uid = int(fixture["properties"]["user_id"])
|
||||
uid = fixture["properties"]["user_id"]
|
||||
except KeyError:
|
||||
uid = None
|
||||
return uid == user_id or is_public
|
||||
@ -424,7 +421,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
},
|
||||
"metadata": {
|
||||
"instance_ref": "http://localhost/v1.1/servers/42",
|
||||
"user_id": "1",
|
||||
"user_id": "fake",
|
||||
},
|
||||
"links": [{
|
||||
"rel": "self",
|
||||
@ -559,7 +556,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
fixtures = copy.copy(self.fixtures)
|
||||
|
||||
for image in fixtures:
|
||||
if not self._applicable_fixture(image, 1):
|
||||
if not self._applicable_fixture(image, "fake"):
|
||||
fixtures.remove(image)
|
||||
continue
|
||||
|
||||
@ -666,7 +663,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
'name': 'queued snapshot',
|
||||
'metadata': {
|
||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
||||
u'user_id': u'1',
|
||||
u'user_id': u'fake',
|
||||
},
|
||||
'updated': self.NOW_API_FORMAT,
|
||||
'created': self.NOW_API_FORMAT,
|
||||
@ -696,7 +693,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
'name': 'saving snapshot',
|
||||
'metadata': {
|
||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
||||
u'user_id': u'1',
|
||||
u'user_id': u'fake',
|
||||
},
|
||||
'updated': self.NOW_API_FORMAT,
|
||||
'created': self.NOW_API_FORMAT,
|
||||
@ -727,7 +724,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
'name': 'active snapshot',
|
||||
'metadata': {
|
||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
||||
u'user_id': u'1',
|
||||
u'user_id': u'fake',
|
||||
},
|
||||
'updated': self.NOW_API_FORMAT,
|
||||
'created': self.NOW_API_FORMAT,
|
||||
@ -757,7 +754,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
'name': 'killed snapshot',
|
||||
'metadata': {
|
||||
u'instance_ref': u'http://localhost/v1.1/servers/42',
|
||||
u'user_id': u'1',
|
||||
u'user_id': u'fake',
|
||||
},
|
||||
'updated': self.NOW_API_FORMAT,
|
||||
'created': self.NOW_API_FORMAT,
|
||||
@ -1259,7 +1256,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
|
||||
# Snapshot for User 1
|
||||
server_ref = 'http://localhost/v1.1/servers/42'
|
||||
snapshot_properties = {'instance_ref': server_ref, 'user_id': '1'}
|
||||
snapshot_properties = {'instance_ref': server_ref, 'user_id': 'fake'}
|
||||
for status in ('queued', 'saving', 'active', 'killed'):
|
||||
add_fixture(id=image_id, name='%s snapshot' % status,
|
||||
is_public=False, status=status,
|
||||
@ -1267,7 +1264,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase):
|
||||
image_id += 1
|
||||
|
||||
# Snapshot for User 2
|
||||
other_snapshot_properties = {'instance_id': '43', 'user_id': '2'}
|
||||
other_snapshot_properties = {'instance_id': '43', 'user_id': 'other'}
|
||||
add_fixture(id=image_id, name='someone elses snapshot',
|
||||
is_public=False, status='active',
|
||||
properties=other_snapshot_properties)
|
||||
|
@ -96,8 +96,8 @@ def return_server_with_power_state(power_state):
|
||||
return _return_server
|
||||
|
||||
|
||||
def return_servers(context, user_id=1):
|
||||
return [stub_instance(i, user_id) for i in xrange(5)]
|
||||
def return_servers(context, *args, **kwargs):
|
||||
return [stub_instance(i, 'fake', 'fake') for i in xrange(5)]
|
||||
|
||||
|
||||
def return_servers_by_reservation(context, reservation_id=""):
|
||||
@ -140,9 +140,9 @@ def instance_addresses(context, instance_id):
|
||||
return None
|
||||
|
||||
|
||||
def stub_instance(id, user_id=1, private_address=None, public_addresses=None,
|
||||
host=None, power_state=0, reservation_id="",
|
||||
uuid=FAKE_UUID, interfaces=None):
|
||||
def stub_instance(id, user_id='fake', project_id='fake', private_address=None,
|
||||
public_addresses=None, host=None, power_state=0,
|
||||
reservation_id="", uuid=FAKE_UUID, interfaces=None):
|
||||
metadata = []
|
||||
metadata.append(InstanceMetadata(key='seq', value=id))
|
||||
|
||||
@ -166,7 +166,7 @@ def stub_instance(id, user_id=1, private_address=None, public_addresses=None,
|
||||
"id": int(id),
|
||||
"admin_pass": "",
|
||||
"user_id": user_id,
|
||||
"project_id": "",
|
||||
"project_id": project_id,
|
||||
"image_ref": "10",
|
||||
"kernel_id": "",
|
||||
"ramdisk_id": "",
|
||||
@ -225,11 +225,9 @@ class ServersTest(test.TestCase):
|
||||
def setUp(self):
|
||||
super(ServersTest, self).setUp()
|
||||
self.stubs = stubout.StubOutForTesting()
|
||||
fakes.FakeAuthManager.reset_fake_data()
|
||||
fakes.FakeAuthDatabase.data = {}
|
||||
fakes.stub_out_networking(self.stubs)
|
||||
fakes.stub_out_rate_limiting(self.stubs)
|
||||
fakes.stub_out_auth(self.stubs)
|
||||
fakes.stub_out_key_pair_funcs(self.stubs)
|
||||
fakes.stub_out_image_service(self.stubs)
|
||||
self.stubs.Set(utils, 'gen_uuid', fake_gen_uuid)
|
||||
@ -237,7 +235,7 @@ class ServersTest(test.TestCase):
|
||||
self.stubs.Set(nova.db.api, 'instance_get', return_server_by_id)
|
||||
self.stubs.Set(nova.db, 'instance_get_by_uuid',
|
||||
return_server_by_uuid)
|
||||
self.stubs.Set(nova.db.api, 'instance_get_all_by_user',
|
||||
self.stubs.Set(nova.db.api, 'instance_get_all_by_project',
|
||||
return_servers)
|
||||
self.stubs.Set(nova.db.api, 'instance_add_security_group',
|
||||
return_security_group)
|
||||
@ -636,6 +634,7 @@ class ServersTest(test.TestCase):
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
res_dict = json.loads(res.body)
|
||||
|
||||
self.assertEqual(len(res_dict['servers']), 5)
|
||||
i = 0
|
||||
for s in res_dict['servers']:
|
||||
self.assertEqual(s['id'], i)
|
||||
@ -699,23 +698,24 @@ class ServersTest(test.TestCase):
|
||||
res = req.get_response(fakes.wsgi_app())
|
||||
res_dict = json.loads(res.body)
|
||||
|
||||
self.assertEqual(len(res_dict['servers']), 5)
|
||||
for i, s in enumerate(res_dict['servers']):
|
||||
self.assertEqual(s['id'], i)
|
||||
self.assertEqual(s['name'], 'server%d' % i)
|
||||
self.assertEqual(s.get('imageId', None), None)
|
||||
|
||||
expected_links = [
|
||||
{
|
||||
"rel": "self",
|
||||
"href": "http://localhost/v1.1/servers/%d" % (i,),
|
||||
},
|
||||
{
|
||||
"rel": "bookmark",
|
||||
"href": "http://localhost/servers/%d" % (i,),
|
||||
},
|
||||
]
|
||||
{
|
||||
"rel": "self",
|
||||
"href": "http://localhost/v1.1/servers/%d" % (i,),
|
||||
},
|
||||
{
|
||||
"rel": "bookmark",
|
||||
"href": "http://localhost/servers/%d" % (i,),
|
||||
},
|
||||
]
|
||||
|
||||
self.assertEqual(s['links'], expected_links)
|
||||
self.assertEqual(s['links'], expected_links)
|
||||
|
||||
def test_get_servers_with_limit(self):
|
||||
req = webob.Request.blank('/v1.0/servers?limit=3')
|
||||
@ -1282,10 +1282,10 @@ class ServersTest(test.TestCase):
|
||||
instances - 2 on one host and 3 on another.
|
||||
'''
|
||||
|
||||
def return_servers_with_host(context, user_id=1):
|
||||
return [stub_instance(i, 1, None, None, i % 2) for i in xrange(5)]
|
||||
def return_servers_with_host(context, *args, **kwargs):
|
||||
return [stub_instance(i, 'fake', 'fake', None, None, i % 2) for i in xrange(5)]
|
||||
|
||||
self.stubs.Set(nova.db.api, 'instance_get_all_by_user',
|
||||
self.stubs.Set(nova.db.api, 'instance_get_all_by_project',
|
||||
return_servers_with_host)
|
||||
|
||||
req = webob.Request.blank('/v1.0/servers/detail')
|
||||
@ -2161,7 +2161,6 @@ class TestServerInstanceCreation(test.TestCase):
|
||||
def setUp(self):
|
||||
super(TestServerInstanceCreation, self).setUp()
|
||||
self.stubs = stubout.StubOutForTesting()
|
||||
fakes.FakeAuthManager.auth_data = {}
|
||||
fakes.FakeAuthDatabase.data = {}
|
||||
fakes.stub_out_auth(self.stubs)
|
||||
fakes.stub_out_image_service(self.stubs)
|
||||
|
@ -41,7 +41,7 @@ class FakeApiRequest(object):
|
||||
class AccessTestCase(test.TestCase):
|
||||
def _env_for(self, ctxt, action):
|
||||
env = {}
|
||||
env['ec2.context'] = ctxt
|
||||
env['nova.context'] = ctxt
|
||||
env['ec2.request'] = FakeApiRequest(action)
|
||||
return env
|
||||
|
||||
|
@ -30,6 +30,7 @@ import webob
|
||||
from nova import context
|
||||
from nova import exception
|
||||
from nova import test
|
||||
from nova import wsgi
|
||||
from nova.api import ec2
|
||||
from nova.api.ec2 import apirequest
|
||||
from nova.api.ec2 import cloud
|
||||
@ -195,7 +196,7 @@ class ApiEc2TestCase(test.TestCase):
|
||||
# NOTE(vish): skipping the Authorizer
|
||||
roles = ['sysadmin', 'netadmin']
|
||||
ctxt = context.RequestContext('fake', 'fake', roles=roles)
|
||||
self.app = ec2.InjectContext(ctxt,
|
||||
self.app = wsgi.InjectContext(ctxt,
|
||||
ec2.Requestify(ec2.Authorizer(ec2.Executor()),
|
||||
'nova.api.ec2.cloud.CloudController'))
|
||||
|
||||
|
12
nova/wsgi.py
12
nova/wsgi.py
@ -274,6 +274,18 @@ class Middleware(Application):
|
||||
return self.process_response(response)
|
||||
|
||||
|
||||
class InjectContext(Middleware):
|
||||
"""Add a 'nova.context' to WSGI environ."""
|
||||
def __init__(self, context, *args, **kwargs):
|
||||
self.context = context
|
||||
super(InjectContext, self).__init__(*args, **kwargs)
|
||||
|
||||
@webob.dec.wsgify(RequestClass=Request)
|
||||
def __call__(self, req):
|
||||
req.environ['nova.context'] = self.context
|
||||
return self.application
|
||||
|
||||
|
||||
class Debug(Middleware):
|
||||
"""Helper class for debugging a WSGI application.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user