Merge branch 'master' into redesign-swishy
This commit is contained in:
@@ -221,6 +221,18 @@ class User(APIResourceWrapper):
|
||||
_attrs = ['email', 'enabled', 'id', 'tenantId']
|
||||
|
||||
|
||||
class SwiftAuthentication(object):
|
||||
"""Auth container to pass CloudFiles storage URL and token from
|
||||
session.
|
||||
"""
|
||||
def __init__(self, storage_url, auth_token):
|
||||
self.storage_url = storage_url
|
||||
self.auth_token = auth_token
|
||||
|
||||
def authenticate(self):
|
||||
return (self.storage_url, '', self.auth_token)
|
||||
|
||||
|
||||
def url_for(request, service_name, admin=False):
|
||||
catalog = request.user.service_catalog
|
||||
if admin:
|
||||
@@ -309,11 +321,13 @@ def auth_api():
|
||||
management_url=settings.OPENSTACK_KEYSTONE_URL)
|
||||
|
||||
|
||||
def swift_api():
|
||||
return cloudfiles.get_connection(
|
||||
settings.SWIFT_ACCOUNT + ":" + settings.SWIFT_USER,
|
||||
settings.SWIFT_PASS,
|
||||
authurl=settings.SWIFT_AUTHURL)
|
||||
def swift_api(request):
|
||||
LOG.debug('object store connection created using token "%s"'
|
||||
' and url "%s"' %
|
||||
(request.session['token'], url_for(request, 'swift')))
|
||||
auth = SwiftAuthentication(url_for(request, 'swift'),
|
||||
request.session['token'])
|
||||
return cloudfiles.get_connection(auth=auth)
|
||||
|
||||
|
||||
def console_create(request, instance_id, kind='text'):
|
||||
@@ -523,16 +537,16 @@ def user_update_tenant(request, user_id, tenant_id):
|
||||
return User(account_api(request).users.update_tenant(user_id, tenant_id))
|
||||
|
||||
|
||||
def swift_container_exists(container_name):
|
||||
def swift_container_exists(request, container_name):
|
||||
try:
|
||||
swift_api().get_container(container_name)
|
||||
swift_api(request).get_container(container_name)
|
||||
return True
|
||||
except cloudfiles.errors.NoSuchContainer:
|
||||
return False
|
||||
|
||||
|
||||
def swift_object_exists(container_name, object_name):
|
||||
container = swift_api().get_container(container_name)
|
||||
def swift_object_exists(request, container_name, object_name):
|
||||
container = swift_api(request).get_container(container_name)
|
||||
|
||||
try:
|
||||
container.get_object(object_name)
|
||||
@@ -541,32 +555,34 @@ def swift_object_exists(container_name, object_name):
|
||||
return False
|
||||
|
||||
|
||||
def swift_get_containers():
|
||||
return [Container(c) for c in swift_api().get_all_containers()]
|
||||
def swift_get_containers(request):
|
||||
return [Container(c) for c in swift_api(request).get_all_containers()]
|
||||
|
||||
|
||||
def swift_create_container(name):
|
||||
if swift_container_exists(name):
|
||||
def swift_create_container(request, name):
|
||||
if swift_container_exists(request, name):
|
||||
raise Exception('Container with name %s already exists.' % (name))
|
||||
|
||||
return Container(swift_api().create_container(name))
|
||||
return Container(swift_api(request).create_container(name))
|
||||
|
||||
|
||||
def swift_delete_container(name):
|
||||
swift_api().delete_container(name)
|
||||
def swift_delete_container(request, name):
|
||||
swift_api(request).delete_container(name)
|
||||
|
||||
|
||||
def swift_get_objects(container_name, prefix=None):
|
||||
container = swift_api().get_container(container_name)
|
||||
def swift_get_objects(request, container_name, prefix=None):
|
||||
container = swift_api(request).get_container(container_name)
|
||||
return [SwiftObject(o) for o in container.get_objects(prefix=prefix)]
|
||||
|
||||
|
||||
def swift_copy_object(orig_container_name, orig_object_name,
|
||||
def swift_copy_object(request, orig_container_name, orig_object_name,
|
||||
new_container_name, new_object_name):
|
||||
|
||||
container = swift_api().get_container(orig_container_name)
|
||||
container = swift_api(request).get_container(orig_container_name)
|
||||
|
||||
if swift_object_exists(new_container_name, new_object_name) == True:
|
||||
if swift_object_exists(request,
|
||||
new_container_name,
|
||||
new_object_name) == True:
|
||||
raise Exception('Object with name %s already exists in container %s'
|
||||
% (new_object_name, new_container_name))
|
||||
|
||||
@@ -574,17 +590,17 @@ def swift_copy_object(orig_container_name, orig_object_name,
|
||||
return orig_obj.copy_to(new_container_name, new_object_name)
|
||||
|
||||
|
||||
def swift_upload_object(container_name, object_name, object_data):
|
||||
container = swift_api().get_container(container_name)
|
||||
def swift_upload_object(request, container_name, object_name, object_data):
|
||||
container = swift_api(request).get_container(container_name)
|
||||
obj = container.create_object(object_name)
|
||||
obj.write(object_data)
|
||||
|
||||
|
||||
def swift_delete_object(container_name, object_name):
|
||||
container = swift_api().get_container(container_name)
|
||||
def swift_delete_object(request, container_name, object_name):
|
||||
container = swift_api(request).get_container(container_name)
|
||||
container.delete_object(object_name)
|
||||
|
||||
|
||||
def swift_get_object_data(container_name, object_name):
|
||||
container = swift_api().get_container(container_name)
|
||||
def swift_get_object_data(request, container_name, object_name):
|
||||
container = swift_api(request).get_container(container_name)
|
||||
return container.get_object(object_name).stream()
|
||||
|
||||
@@ -37,4 +37,4 @@ def tenants(request):
|
||||
|
||||
|
||||
def swift(request):
|
||||
return {'swift_configured': hasattr(settings, "SWIFT_AUTHURL")}
|
||||
return {'swift_configured': settings.SWIFT_ENABLED}
|
||||
|
||||
@@ -42,7 +42,7 @@ class DeleteContainer(forms.SelfHandlingForm):
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
api.swift_delete_container(data['container_name'])
|
||||
api.swift_delete_container(request, data['container_name'])
|
||||
except ContainerNotEmpty, e:
|
||||
messages.error(request,
|
||||
'Unable to delete non-empty container: %s' % \
|
||||
@@ -60,7 +60,7 @@ class CreateContainer(forms.SelfHandlingForm):
|
||||
name = forms.CharField(max_length="255", label="Container Name")
|
||||
|
||||
def handle(self, request, data):
|
||||
api.swift_create_container(data['name'])
|
||||
api.swift_create_container(request, data['name'])
|
||||
messages.success(request, "Container was successfully created.")
|
||||
return shortcuts.redirect("dash_containers", request.user.tenant)
|
||||
|
||||
@@ -71,7 +71,7 @@ def index(request, tenant_id):
|
||||
if handled:
|
||||
return handled
|
||||
|
||||
containers = api.swift_get_containers()
|
||||
containers = api.swift_get_containers(request)
|
||||
|
||||
return shortcuts.render_to_response('dash_containers.html', {
|
||||
'containers': containers,
|
||||
|
||||
@@ -43,14 +43,6 @@ from glance.common import exception as glance_exception
|
||||
|
||||
LOG = logging.getLogger('django_openstack.dash.views.images')
|
||||
|
||||
from django.core import validators
|
||||
import re
|
||||
|
||||
|
||||
def validate_even(value):
|
||||
if value % 2 != 0:
|
||||
raise ValidationError(u'%s is not an even number' % value)
|
||||
|
||||
|
||||
class LaunchForm(forms.SelfHandlingForm):
|
||||
name = forms.CharField(max_length=80, label="Server Name")
|
||||
@@ -145,7 +137,6 @@ def index(request, tenant_id):
|
||||
|
||||
@login_required
|
||||
def launch(request, tenant_id, image_id):
|
||||
LOG.error(dir(request))
|
||||
def flavorlist():
|
||||
try:
|
||||
fl = api.flavor_list(request)
|
||||
|
||||
@@ -120,10 +120,6 @@ def index(request, tenant_id):
|
||||
|
||||
@login_required
|
||||
def refresh(request, tenant_id):
|
||||
for f in (TerminateInstance, RebootInstance):
|
||||
_, handled = f.maybe_handle(request)
|
||||
if handled:
|
||||
return handled
|
||||
instances = []
|
||||
try:
|
||||
instances = api.server_list(request)
|
||||
@@ -135,7 +131,7 @@ def refresh(request, tenant_id):
|
||||
terminate_form = TerminateInstance()
|
||||
reboot_form = RebootInstance()
|
||||
|
||||
return render_to_response('_instance_list.html', {
|
||||
return shortcuts.render_to_response('_instance_list.html', {
|
||||
'instances': instances,
|
||||
'terminate_form': terminate_form,
|
||||
'reboot_form': reboot_form,
|
||||
|
||||
@@ -44,7 +44,8 @@ class FilterObjects(forms.SelfHandlingForm):
|
||||
def handle(self, request, data):
|
||||
object_prefix = data['object_prefix'] or None
|
||||
|
||||
objects = api.swift_get_objects(data['container_name'],
|
||||
objects = api.swift_get_objects(request,
|
||||
data['container_name'],
|
||||
prefix=object_prefix)
|
||||
|
||||
return objects
|
||||
@@ -56,6 +57,7 @@ class DeleteObject(forms.SelfHandlingForm):
|
||||
|
||||
def handle(self, request, data):
|
||||
api.swift_delete_object(
|
||||
request,
|
||||
data['container_name'],
|
||||
data['object_name'])
|
||||
messages.info(request,
|
||||
@@ -71,6 +73,7 @@ class UploadObject(forms.SelfHandlingForm):
|
||||
|
||||
def handle(self, request, data):
|
||||
api.swift_upload_object(
|
||||
request,
|
||||
data['container_name'],
|
||||
data['name'],
|
||||
self.files['object_file'].read())
|
||||
@@ -89,11 +92,11 @@ class CopyObject(forms.SelfHandlingForm):
|
||||
orig_object_name = forms.CharField(widget=forms.HiddenInput())
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
containers = kwargs.pop('containers')
|
||||
|
||||
super(CopyObject, self).__init__(*args, **kwargs)
|
||||
|
||||
container_choices = \
|
||||
[(c.name, c.name) for c in api.swift_get_containers()]
|
||||
self.fields['new_container_name'].choices = container_choices
|
||||
self.fields['new_container_name'].choices = containers
|
||||
|
||||
def handle(self, request, data):
|
||||
orig_container_name = data['orig_container_name']
|
||||
@@ -101,8 +104,9 @@ class CopyObject(forms.SelfHandlingForm):
|
||||
new_container_name = data['new_container_name']
|
||||
new_object_name = data['new_object_name']
|
||||
|
||||
api.swift_copy_object(orig_container_name, orig_object_name,
|
||||
new_container_name, new_object_name)
|
||||
api.swift_copy_object(request, orig_container_name,
|
||||
orig_object_name, new_container_name,
|
||||
new_object_name)
|
||||
|
||||
messages.success(request,
|
||||
'Object was successfully copied to %s\%s' %
|
||||
@@ -120,7 +124,7 @@ def index(request, tenant_id, container_name):
|
||||
filter_form, objects = FilterObjects.maybe_handle(request)
|
||||
if not objects:
|
||||
filter_form.fields['container_name'].initial = container_name
|
||||
objects = api.swift_get_objects(container_name)
|
||||
objects = api.swift_get_objects(request, container_name)
|
||||
|
||||
delete_form.fields['container_name'].initial = container_name
|
||||
return render_to_response('dash_objects.html', {
|
||||
@@ -147,7 +151,7 @@ def upload(request, tenant_id, container_name):
|
||||
@login_required
|
||||
def download(request, tenant_id, container_name, object_name):
|
||||
object_data = api.swift_get_object_data(
|
||||
container_name, object_name)
|
||||
request, container_name, object_name)
|
||||
|
||||
response = http.HttpResponse()
|
||||
response['Content-Disposition'] = 'attachment; filename=%s' % \
|
||||
@@ -159,7 +163,11 @@ def download(request, tenant_id, container_name, object_name):
|
||||
|
||||
@login_required
|
||||
def copy(request, tenant_id, container_name, object_name):
|
||||
form, handled = CopyObject.maybe_handle(request)
|
||||
containers = \
|
||||
[(c.name, c.name) for c in api.swift_get_containers(
|
||||
request)]
|
||||
form, handled = CopyObject.maybe_handle(request,
|
||||
containers=containers)
|
||||
|
||||
if handled:
|
||||
return handled
|
||||
|
||||
@@ -52,7 +52,6 @@ def get_user_from_request(request):
|
||||
|
||||
class LazyUser(object):
|
||||
def __get__(self, request, obj_type=None):
|
||||
return get_user_from_request(request)
|
||||
if not hasattr(request, '_cached_user'):
|
||||
request._cached_user = get_user_from_request(request)
|
||||
return request._cached_user
|
||||
|
||||
@@ -624,16 +624,6 @@ class AccountApiTests(test.TestCase):
|
||||
|
||||
|
||||
class AdminApiTests(test.TestCase):
|
||||
#def setUp(self):
|
||||
# super(AdminApiTests, self).setUp()
|
||||
# self.request = http.HttpRequest()
|
||||
# keystone.AuthenticationMiddleware().process_request(self.request)
|
||||
# #self.request.session = dict()
|
||||
# #self.request.session['token'] = TEST_TOKEN
|
||||
|
||||
#def tearDown(self):
|
||||
# super(AdminApiTests, self).tearDown()
|
||||
|
||||
def stub_admin_api(self, count=1):
|
||||
self.mox.StubOutWithMock(api, 'admin_api')
|
||||
admin_api = self.mox.CreateMock(OSAdmin.Admin)
|
||||
@@ -776,12 +766,11 @@ class AuthApiTests(test.TestCase):
|
||||
]
|
||||
tenants_mock.for_token('aToken').AndReturn(tenant_list)
|
||||
|
||||
request_mock = self.mox.CreateMock(http.HttpRequest)
|
||||
request_mock.session = {'token': 'aToken'}
|
||||
self.request.session = {'token': 'aToken'}
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.token_get_tenant(request_mock, TEST_TENANT_ID)
|
||||
ret_val = api.token_get_tenant(self.request, TEST_TENANT_ID)
|
||||
self.assertEqual(tenant_list[1], ret_val)
|
||||
|
||||
self.mox.VerifyAll()
|
||||
@@ -800,12 +789,11 @@ class AuthApiTests(test.TestCase):
|
||||
]
|
||||
tenants_mock.for_token('aToken').AndReturn(tenant_list)
|
||||
|
||||
request_mock = self.mox.CreateMock(http.HttpRequest)
|
||||
request_mock.session = {'token': 'aToken'}
|
||||
self.request.session = {'token': 'aToken'}
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.token_get_tenant(request_mock, TEST_TENANT_ID)
|
||||
ret_val = api.token_get_tenant(self.request, TEST_TENANT_ID)
|
||||
self.assertIsNone(ret_val)
|
||||
|
||||
self.mox.VerifyAll()
|
||||
@@ -827,11 +815,9 @@ class AuthApiTests(test.TestCase):
|
||||
]
|
||||
tenants_mock.for_token('aToken').AndReturn(tenant_list)
|
||||
|
||||
request_mock = self.mox.CreateMock(http.HttpRequest)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.token_list_tenants(request_mock, 'aToken')
|
||||
ret_val = api.token_list_tenants(self.request, 'aToken')
|
||||
for tenant in ret_val:
|
||||
self.assertIn(tenant, tenant_list)
|
||||
|
||||
@@ -850,11 +836,9 @@ class AuthApiTests(test.TestCase):
|
||||
tokens_mock.create(TEST_TENANT_ID, TEST_USERNAME,
|
||||
TEST_PASSWORD).AndReturn(test_token)
|
||||
|
||||
request_mock = self.mox.CreateMock(http.HttpRequest)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.token_create(request_mock, TEST_TENANT_ID,
|
||||
ret_val = api.token_create(self.request, TEST_TENANT_ID,
|
||||
TEST_USERNAME, TEST_PASSWORD)
|
||||
|
||||
self.assertEqual(test_token, ret_val)
|
||||
@@ -1263,28 +1247,23 @@ class GlanceApiTests(test.TestCase):
|
||||
|
||||
|
||||
class SwiftApiTests(test.TestCase):
|
||||
def setUp(self):
|
||||
self.mox = mox.Mox()
|
||||
|
||||
self.request = http.HttpRequest()
|
||||
self.request.session = dict()
|
||||
self.request.session['token'] = TEST_TOKEN
|
||||
|
||||
def tearDown(self):
|
||||
self.mox.UnsetStubs()
|
||||
|
||||
def stub_swift_api(self, count=1):
|
||||
self.mox.StubOutWithMock(api, 'swift_api')
|
||||
swift_api = self.mox.CreateMock(cloudfiles.connection.Connection)
|
||||
for i in range(count):
|
||||
api.swift_api().AndReturn(swift_api)
|
||||
api.swift_api(IsA(http.HttpRequest)).AndReturn(swift_api)
|
||||
return swift_api
|
||||
|
||||
def test_get_swift_api(self):
|
||||
self.mox.StubOutWithMock(cloudfiles, 'get_connection')
|
||||
|
||||
swiftuser = ':'.join((settings.SWIFT_ACCOUNT, settings.SWIFT_USER))
|
||||
cloudfiles.get_connection(swiftuser,
|
||||
settings.SWIFT_PASS,
|
||||
authurl=settings.SWIFT_AUTHURL
|
||||
).AndReturn(TEST_RETURN)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
self.assertEqual(api.swift_api(), TEST_RETURN)
|
||||
|
||||
self.mox.VerifyAll()
|
||||
|
||||
def test_swift_get_containers(self):
|
||||
containers = (TEST_RETURN, TEST_RETURN + '2')
|
||||
|
||||
@@ -1294,7 +1273,7 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_get_containers()
|
||||
ret_val = api.swift_get_containers(self.request)
|
||||
|
||||
self.assertEqual(len(ret_val), len(containers))
|
||||
for container in ret_val:
|
||||
@@ -1309,12 +1288,13 @@ class SwiftApiTests(test.TestCase):
|
||||
swift_api = self.stub_swift_api()
|
||||
self.mox.StubOutWithMock(api, 'swift_container_exists')
|
||||
|
||||
api.swift_container_exists(NAME).AndReturn(False)
|
||||
api.swift_container_exists(self.request,
|
||||
NAME).AndReturn(False)
|
||||
swift_api.create_container(NAME).AndReturn(TEST_RETURN)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_create_container(NAME)
|
||||
ret_val = api.swift_create_container(self.request, NAME)
|
||||
|
||||
self.assertIsInstance(ret_val, api.Container)
|
||||
self.assertEqual(ret_val._apiresource, TEST_RETURN)
|
||||
@@ -1330,7 +1310,7 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_delete_container(NAME)
|
||||
ret_val = api.swift_delete_container(self.request, NAME)
|
||||
|
||||
self.assertIsNone(ret_val)
|
||||
|
||||
@@ -1349,7 +1329,7 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_get_objects(NAME)
|
||||
ret_val = api.swift_get_objects(self.request, NAME)
|
||||
|
||||
self.assertEqual(len(ret_val), len(swift_objects))
|
||||
for swift_object in ret_val:
|
||||
@@ -1372,7 +1352,9 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_get_objects(NAME, prefix=PREFIX)
|
||||
ret_val = api.swift_get_objects(self.request,
|
||||
NAME,
|
||||
prefix=PREFIX)
|
||||
|
||||
self.assertEqual(len(ret_val), len(swift_objects))
|
||||
for swift_object in ret_val:
|
||||
@@ -1396,7 +1378,9 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_upload_object(CONTAINER_NAME, OBJECT_NAME,
|
||||
ret_val = api.swift_upload_object(self.request,
|
||||
CONTAINER_NAME,
|
||||
OBJECT_NAME,
|
||||
OBJECT_DATA)
|
||||
|
||||
self.assertIsNone(ret_val)
|
||||
@@ -1415,7 +1399,9 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_delete_object(CONTAINER_NAME, OBJECT_NAME)
|
||||
ret_val = api.swift_delete_object(self.request,
|
||||
CONTAINER_NAME,
|
||||
OBJECT_NAME)
|
||||
|
||||
self.assertIsNone(ret_val)
|
||||
|
||||
@@ -1436,7 +1422,9 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_get_object_data(CONTAINER_NAME, OBJECT_NAME)
|
||||
ret_val = api.swift_get_object_data(self.request,
|
||||
CONTAINER_NAME,
|
||||
OBJECT_NAME)
|
||||
|
||||
self.assertEqual(ret_val, OBJECT_DATA)
|
||||
|
||||
@@ -1455,7 +1443,9 @@ class SwiftApiTests(test.TestCase):
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_object_exists(CONTAINER_NAME, OBJECT_NAME)
|
||||
ret_val = api.swift_object_exists(self.request,
|
||||
CONTAINER_NAME,
|
||||
OBJECT_NAME)
|
||||
self.assertTrue(ret_val)
|
||||
|
||||
self.mox.VerifyAll()
|
||||
@@ -1471,15 +1461,18 @@ class SwiftApiTests(test.TestCase):
|
||||
swift_object = self.mox.CreateMock(cloudfiles.Object)
|
||||
|
||||
swift_api.get_container(CONTAINER_NAME).AndReturn(container)
|
||||
api.swift_object_exists(CONTAINER_NAME, OBJECT_NAME).AndReturn(False)
|
||||
api.swift_object_exists(self.request,
|
||||
CONTAINER_NAME,
|
||||
OBJECT_NAME).AndReturn(False)
|
||||
|
||||
container.get_object(OBJECT_NAME).AndReturn(swift_object)
|
||||
swift_object.copy_to(CONTAINER_NAME, OBJECT_NAME)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
ret_val = api.swift_copy_object(CONTAINER_NAME, OBJECT_NAME,
|
||||
CONTAINER_NAME, OBJECT_NAME)
|
||||
ret_val = api.swift_copy_object(self.request, CONTAINER_NAME,
|
||||
OBJECT_NAME, CONTAINER_NAME,
|
||||
OBJECT_NAME)
|
||||
|
||||
self.assertIsNone(ret_val)
|
||||
self.mox.VerifyAll()
|
||||
|
||||
@@ -28,6 +28,7 @@ from django_openstack import urls as django_openstack_urls
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^$', 'django_openstack.tests.views.fakeView', name='splash'),
|
||||
url(r'^dash/$', 'django_openstack.dash.views.instances.usage', name='dash_overview'),
|
||||
url(r'^syspanel/$', 'django_openstack.syspanel.views.instances.usage', name='syspanel_overview')
|
||||
)
|
||||
|
||||
148
django-openstack/django_openstack/tests/view_tests/auth_tests.py
Normal file
148
django-openstack/django_openstack/tests/view_tests/auth_tests.py
Normal file
@@ -0,0 +1,148 @@
|
||||
from django import http
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils import unittest
|
||||
from django_openstack import api
|
||||
from django_openstack.tests.view_tests import base
|
||||
from openstackx.api import exceptions as api_exceptions
|
||||
from mox import IsA
|
||||
|
||||
|
||||
class AuthViewTests(base.BaseViewTests):
|
||||
def setUp(self):
|
||||
super(AuthViewTests, self).setUp()
|
||||
self.setActiveUser(None, None, None, None, None)
|
||||
self.PASSWORD = 'secret'
|
||||
|
||||
def test_login_index(self):
|
||||
res = self.client.get(reverse('auth_login'))
|
||||
self.assertTemplateUsed(res, 'splash.html')
|
||||
|
||||
def test_login_user_logged_in(self):
|
||||
self.setActiveUser(self.TEST_TOKEN, self.TEST_USER, self.TEST_TENANT,
|
||||
False, self.TEST_SERVICE_CATALOG)
|
||||
|
||||
res = self.client.get(reverse('auth_login'))
|
||||
self.assertRedirectsNoFollow(res, reverse('dash_overview'))
|
||||
|
||||
def test_login_admin_logged_in(self):
|
||||
self.setActiveUser(self.TEST_TOKEN, self.TEST_USER, self.TEST_TENANT,
|
||||
True, self.TEST_SERVICE_CATALOG)
|
||||
|
||||
res = self.client.get(reverse('auth_login'))
|
||||
self.assertRedirectsNoFollow(res, reverse('syspanel_overview'))
|
||||
|
||||
def test_login(self):
|
||||
TOKEN_ID = 1
|
||||
|
||||
form_data = {'method': 'Login',
|
||||
'password': self.PASSWORD,
|
||||
'username': self.TEST_USER}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'token_create')
|
||||
aToken = self.mox.CreateMock(api.Token)
|
||||
aToken.id = TOKEN_ID
|
||||
aToken.serviceCatalog = {}
|
||||
api.token_create(IsA(http.HttpRequest), "", self.TEST_USER,
|
||||
self.PASSWORD).AndReturn(aToken)
|
||||
|
||||
self.mox.StubOutWithMock(api, 'token_info')
|
||||
tokenInfo = {'user': self.TEST_USER,
|
||||
'tenant': self.TEST_TENANT,
|
||||
'admin': False}
|
||||
api.token_info(IsA(http.HttpRequest), aToken).AndReturn(tokenInfo)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
res = self.client.post(reverse('auth_login'), form_data)
|
||||
|
||||
self.assertRedirectsNoFollow(res, reverse('dash_overview'))
|
||||
|
||||
self.mox.VerifyAll()
|
||||
|
||||
def test_login_invalid_credentials(self):
|
||||
form_data = {'method': 'Login',
|
||||
'password': self.PASSWORD,
|
||||
'username': self.TEST_USER}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'token_create')
|
||||
unauthorized = api_exceptions.Unauthorized('unauth', message='unauth')
|
||||
api.token_create(IsA(http.HttpRequest), "", self.TEST_USER,
|
||||
self.PASSWORD).AndRaise(unauthorized)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
res = self.client.post(reverse('auth_login'), form_data)
|
||||
|
||||
self.assertTemplateUsed(res, 'splash.html')
|
||||
|
||||
self.mox.VerifyAll()
|
||||
|
||||
def test_login_exception(self):
|
||||
form_data = {'method': 'Login',
|
||||
'password': self.PASSWORD,
|
||||
'username': self.TEST_USER}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'token_create')
|
||||
api_exception = api_exceptions.ApiException('apiException',
|
||||
message='apiException')
|
||||
api.token_create(IsA(http.HttpRequest), "", self.TEST_USER,
|
||||
self.PASSWORD).AndRaise(api_exception)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
res = self.client.post(reverse('auth_login'), form_data)
|
||||
|
||||
self.assertTemplateUsed(res, 'splash.html')
|
||||
|
||||
self.mox.VerifyAll()
|
||||
|
||||
def test_switch_tenants_index(self):
|
||||
res = self.client.get(reverse('auth_switch', args=[self.TEST_TENANT]))
|
||||
|
||||
self.assertTemplateUsed(res, 'switch_tenants.html')
|
||||
|
||||
def test_switch_tenants(self):
|
||||
NEW_TENANT = 'newTenant'
|
||||
TOKEN_ID = 1
|
||||
|
||||
self.setActiveUser(self.TEST_TOKEN, self.TEST_USER, self.TEST_TENANT,
|
||||
False, self.TEST_SERVICE_CATALOG)
|
||||
|
||||
form_data = {'method': 'LoginWithTenant',
|
||||
'password': self.PASSWORD,
|
||||
'tenant': NEW_TENANT,
|
||||
'username': self.TEST_USER}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'token_create')
|
||||
aToken = self.mox.CreateMock(api.Token)
|
||||
aToken.id = TOKEN_ID
|
||||
aToken.serviceCatalog = {}
|
||||
api.token_create(IsA(http.HttpRequest), NEW_TENANT, self.TEST_USER,
|
||||
self.PASSWORD).AndReturn(aToken)
|
||||
|
||||
self.mox.StubOutWithMock(api, 'token_info')
|
||||
tokenInfo = {'user': self.TEST_USER,
|
||||
'tenant': NEW_TENANT,
|
||||
'admin': False}
|
||||
api.token_info(IsA(http.HttpRequest), aToken).AndReturn(tokenInfo)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
res = self.client.post(reverse('auth_switch', args=[NEW_TENANT]),
|
||||
form_data)
|
||||
|
||||
self.assertRedirectsNoFollow(res, reverse('dash_overview'))
|
||||
self.assertEqual(self.client.session['tenant'], NEW_TENANT)
|
||||
|
||||
self.mox.VerifyAll()
|
||||
|
||||
def test_logout(self):
|
||||
KEY = 'arbitraryKeyString'
|
||||
VALUE = 'arbitraryKeyValue'
|
||||
self.assertNotIn(KEY, self.client.session)
|
||||
self.client.session[KEY] = VALUE
|
||||
|
||||
res = self.client.get(reverse('auth_logout'))
|
||||
|
||||
self.assertRedirectsNoFollow(res, reverse('splash'))
|
||||
self.assertNotIn(KEY, self.client.session)
|
||||
@@ -1,4 +1,5 @@
|
||||
from cloudfiles.errors import ContainerNotEmpty
|
||||
from django import http
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django_openstack import api
|
||||
@@ -15,7 +16,8 @@ class ContainerViewTests(base.BaseViewTests):
|
||||
|
||||
def test_index(self):
|
||||
self.mox.StubOutWithMock(api, 'swift_get_containers')
|
||||
api.swift_get_containers().AndReturn([self.container])
|
||||
api.swift_get_containers(
|
||||
IsA(http.HttpRequest)).AndReturn([self.container])
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
@@ -35,7 +37,8 @@ class ContainerViewTests(base.BaseViewTests):
|
||||
'method': 'DeleteContainer'}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_delete_container')
|
||||
api.swift_delete_container('containerName')
|
||||
api.swift_delete_container(IsA(http.HttpRequest),
|
||||
'containerName')
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
@@ -54,7 +57,9 @@ class ContainerViewTests(base.BaseViewTests):
|
||||
exception = ContainerNotEmpty('containerNotEmpty')
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_delete_container')
|
||||
api.swift_delete_container('containerName').AndRaise(exception)
|
||||
api.swift_delete_container(
|
||||
IsA(http.HttpRequest),
|
||||
'containerName').AndRaise(exception)
|
||||
|
||||
self.mox.StubOutWithMock(messages, 'error')
|
||||
|
||||
@@ -81,7 +86,8 @@ class ContainerViewTests(base.BaseViewTests):
|
||||
'method': 'CreateContainer'}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_create_container')
|
||||
api.swift_create_container('CreateContainer')
|
||||
api.swift_create_container(
|
||||
IsA(http.HttpRequest), 'CreateContainer')
|
||||
|
||||
self.mox.StubOutWithMock(messages, 'success')
|
||||
messages.success(IgnoreArg(), IsA(str))
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import tempfile
|
||||
|
||||
from django import http
|
||||
from django.core.urlresolvers import reverse
|
||||
from django_openstack import api
|
||||
from django_openstack.tests.view_tests import base
|
||||
|
||||
from mox import IsA
|
||||
|
||||
class ObjectViewTests(base.BaseViewTests):
|
||||
CONTAINER_NAME = 'containerName'
|
||||
@@ -16,6 +17,7 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
def test_index(self):
|
||||
self.mox.StubOutWithMock(api, 'swift_get_objects')
|
||||
api.swift_get_objects(
|
||||
IsA(http.HttpRequest),
|
||||
self.CONTAINER_NAME).AndReturn(self.swift_objects)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
@@ -49,7 +51,8 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
'object_file': OBJECT_FILE}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_upload_object')
|
||||
api.swift_upload_object(unicode(self.CONTAINER_NAME),
|
||||
api.swift_upload_object(IsA(http.HttpRequest),
|
||||
unicode(self.CONTAINER_NAME),
|
||||
unicode(OBJECT_NAME),
|
||||
OBJECT_DATA)
|
||||
|
||||
@@ -73,7 +76,9 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
'object_name': OBJECT_NAME}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_delete_object')
|
||||
api.swift_delete_object(self.CONTAINER_NAME, OBJECT_NAME)
|
||||
api.swift_delete_object(
|
||||
IsA(http.HttpRequest),
|
||||
self.CONTAINER_NAME, OBJECT_NAME)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
@@ -93,7 +98,8 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
OBJECT_NAME = 'objectName'
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_get_object_data')
|
||||
api.swift_get_object_data(unicode(self.CONTAINER_NAME),
|
||||
api.swift_get_object_data(IsA(http.HttpRequest),
|
||||
unicode(self.CONTAINER_NAME),
|
||||
unicode(OBJECT_NAME)).AndReturn(OBJECT_DATA)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
@@ -115,7 +121,8 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
container.name = self.CONTAINER_NAME
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_get_containers')
|
||||
api.swift_get_containers().AndReturn([container])
|
||||
api.swift_get_containers(
|
||||
IsA(http.HttpRequest)).AndReturn([container])
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
@@ -144,11 +151,15 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
container.name = self.CONTAINER_NAME
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_get_containers')
|
||||
api.swift_get_containers().AndReturn([container])
|
||||
api.swift_get_containers(
|
||||
IsA(http.HttpRequest)).AndReturn([container])
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_copy_object')
|
||||
api.swift_copy_object(ORIG_CONTAINER_NAME, ORIG_OBJECT_NAME,
|
||||
NEW_CONTAINER_NAME, NEW_OBJECT_NAME)
|
||||
api.swift_copy_object(IsA(http.HttpRequest),
|
||||
ORIG_CONTAINER_NAME,
|
||||
ORIG_OBJECT_NAME,
|
||||
NEW_CONTAINER_NAME,
|
||||
NEW_OBJECT_NAME)
|
||||
|
||||
self.mox.ReplayAll()
|
||||
|
||||
@@ -174,7 +185,8 @@ class ObjectViewTests(base.BaseViewTests):
|
||||
}
|
||||
|
||||
self.mox.StubOutWithMock(api, 'swift_get_objects')
|
||||
api.swift_get_objects(unicode(self.CONTAINER_NAME),
|
||||
api.swift_get_objects(IsA(http.HttpRequest),
|
||||
unicode(self.CONTAINER_NAME),
|
||||
prefix=unicode(PREFIX)
|
||||
).AndReturn(self.swift_objects)
|
||||
|
||||
|
||||
11
django-openstack/django_openstack/tests/views.py
Normal file
11
django-openstack/django_openstack/tests/views.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from django import http
|
||||
|
||||
|
||||
def fakeView(request):
|
||||
resp = http.HttpResponse()
|
||||
resp.write('<html><body><p>'
|
||||
'This is a fake httpresponse from a fake view for testing '
|
||||
' purposes only'
|
||||
'</p></body></html>')
|
||||
|
||||
return resp
|
||||
Reference in New Issue
Block a user