From 093fe4f74f8dfa639564f0f90e9905dd24a91f05 Mon Sep 17 00:00:00 2001 From: Anthony Young Date: Sat, 16 Jul 2011 01:14:07 -0700 Subject: [PATCH] make tests pass again --- django-openstack/django_openstack/api.py | 6 +-- .../django_openstack/dash/views/images.py | 16 ++----- .../django_openstack/dash/views/keypairs.py | 11 +++-- .../django_openstack/middleware/keystone.py | 7 +++- django-openstack/django_openstack/test.py | 8 ++-- .../django_openstack/tests/api_tests.py | 25 ++++++----- .../tests/view_tests/dash/images_tests.py | 42 +++++++++++++++---- .../tests/view_tests/dash/instance_tests.py | 5 ++- 8 files changed, 75 insertions(+), 45 deletions(-) diff --git a/django-openstack/django_openstack/api.py b/django-openstack/django_openstack/api.py index dcd474566..feb204838 100644 --- a/django-openstack/django_openstack/api.py +++ b/django-openstack/django_openstack/api.py @@ -222,7 +222,7 @@ class User(APIResourceWrapper): def url_for(request, service_name, admin=False): - catalog = request.session['serviceCatalog'] + catalog = request.user.service_catalog if admin: rv = catalog[service_name][0]['adminURL'] else: @@ -373,9 +373,9 @@ def keypair_list(request): return [KeyPair(key) for key in extras_api(request).keypairs.list()] -def server_create(request, name, image, flavor, user_data, key_name): +def server_create(request, name, image, flavor, key_name, user_data): return Server(extras_api(request).servers.create( - name, image, flavor, user_data=user_data, key_name=key_name), + name, image, flavor, key_name=key_name, user_data=user_data), request) diff --git a/django-openstack/django_openstack/dash/views/images.py b/django-openstack/django_openstack/dash/views/images.py index e0338e265..406d400e9 100644 --- a/django-openstack/django_openstack/dash/views/images.py +++ b/django-openstack/django_openstack/dash/views/images.py @@ -59,7 +59,6 @@ class LaunchForm(forms.SelfHandlingForm): user_data = forms.CharField(widget=forms.Textarea, label="User Data", required=False) - name = forms.CharField(max_length=80, label="Server Name") # make the dropdown populate when the form is loaded not when django is # started @@ -171,23 +170,16 @@ def launch(request, tenant_id, image_id): # TODO(mgius): Any reason why these can't be after the launchform logic? # If The form is valid, we've just wasted these two api calls + image = api.image_get(request, image_id) + tenant = api.token_get_tenant(request, request.user.tenant) + quotas = api.tenant_quota_get(request, request.user.tenant) try: - image = api.image_get(request, image_id) - tenant = api.token_get_tenant(request, request.user.tenant) - quotas = api.tenant_quota_get(request, request.user.tenant) quotas.ram = int(quotas.ram)/100 except Exception, e: - messages.error(request, 'Unable to retrieve image %s: %s' % + messages.error(request, 'Error parsing quota for %s: %s' % (image_id, e.message)) return redirect('dash_instances', tenant_id) - try: - tenant = api.token_get_tenant(request, request.user.tenant) - except api_exceptions.ApiException, e: - messages.error(request, 'Unable to retrieve tenant %s: %s' % - (request.user.tenant, e.message)) - return redirect('dash_instances', tenant_id) - form, handled = LaunchForm.maybe_handle( request, initial={'flavorlist': flavorlist(), 'keynamelist': keynamelist(), diff --git a/django-openstack/django_openstack/dash/views/keypairs.py b/django-openstack/django_openstack/dash/views/keypairs.py index 4666e3402..8aea0ac61 100644 --- a/django-openstack/django_openstack/dash/views/keypairs.py +++ b/django-openstack/django_openstack/dash/views/keypairs.py @@ -28,9 +28,9 @@ from django import template from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required +from django.core import validators from django import shortcuts from django.shortcuts import redirect, render_to_response -from django.template.defaultfilters import slugify from django.utils.translation import ugettext as _ from django_openstack import api @@ -57,12 +57,14 @@ class DeleteKeypair(forms.SelfHandlingForm): class CreateKeypair(forms.SelfHandlingForm): - name = forms.CharField(max_length="20", label="Keypair Name") + + name = forms.CharField(max_length="20", label="Keypair Name", + validators=[validators.RegexValidator('\w+')]) def handle(self, request, data): try: LOG.info('Creating keypair "%s"' % data['name']) - keypair = api.keypair_create(request, slugify(data['name'])) + keypair = api.keypair_create(request, data['name']) response = http.HttpResponse(mimetype='application/binary') response['Content-Disposition'] = \ 'attachment; filename=%s.pem' % \ @@ -79,6 +81,9 @@ class CreateKeypair(forms.SelfHandlingForm): def index(request, tenant_id): delete_form, handled = DeleteKeypair.maybe_handle(request) + if handled: + return handled + try: keypairs = api.keypair_list(request) except api_exceptions.ApiException, e: diff --git a/django-openstack/django_openstack/middleware/keystone.py b/django-openstack/django_openstack/middleware/keystone.py index 11fec1b4f..d9b007b58 100644 --- a/django-openstack/django_openstack/middleware/keystone.py +++ b/django-openstack/django_openstack/middleware/keystone.py @@ -25,11 +25,12 @@ import openstack class User(object): - def __init__(self, token, user, tenant, admin): + def __init__(self, token, user, tenant, admin, service_catalog): self.token = token self.username = user self.tenant = tenant self.admin = admin + self.service_catalog = service_catalog def is_authenticated(self): # TODO: deal with token expiration @@ -45,11 +46,13 @@ def get_user_from_request(request): return User(request.session['token'], request.session['user'], request.session['tenant'], - request.session['admin']) + request.session['admin'], + request.session['serviceCatalog']) 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 diff --git a/django-openstack/django_openstack/test.py b/django-openstack/django_openstack/test.py index 055b36927..e9e2fd715 100644 --- a/django-openstack/django_openstack/test.py +++ b/django-openstack/django_openstack/test.py @@ -49,6 +49,8 @@ class TestCase(test.TestCase): TEST_TOKEN = 'aToken' TEST_USER = 'test' + TEST_SERVICE_CATALOG = {'cdn': [{'adminURL': 'http://cdn.admin-nets.local/v1.1/1234', 'region': 'RegionOne', 'internalURL': 'http://127.0.0.1:7777/v1.1/1234', 'publicURL': 'http://cdn.publicinternets.com/v1.1/1234'}], 'nova_compat': [{'adminURL': 'http://127.0.0.1:8774/v1.0', 'region': 'RegionOne', 'internalURL': 'http://localhost:8774/v1.0', 'publicURL': 'http://nova.publicinternets.com/v1.0/'}], 'nova': [{'adminURL': 'http://nova/novapi/admin', 'region': 'RegionOne', 'internalURL': 'http://nova/novapi/internal', 'publicURL': 'http://nova/novapi/public'}], 'keystone': [{'adminURL': 'http://127.0.0.1:8081/v2.0', 'region': 'RegionOne', 'internalURL': 'http://127.0.0.1:8080/v2.0', 'publicURL': 'http://keystone.publicinternets.com/v2.0'}], 'glance': [{'adminURL': 'http://glance/glanceapi/admin', 'region': 'RegionOne', 'internalURL': 'http://glance/glanceapi/internal', 'publicURL': 'http://glance/glanceapi/public'}], 'swift': [{'adminURL': 'http://swift.admin-nets.local:8080/', 'region': 'RegionOne', 'internalURL': 'http://127.0.0.1:8080/v1/AUTH_1234', 'publicURL': 'http://swift.publicinternets.com/v1/AUTH_1234'}]} + def setUp(self): self.mox = mox.Mox() self._real_render_to_response = shortcuts.render_to_response @@ -56,7 +58,7 @@ class TestCase(test.TestCase): self._real_get_user_from_request = keystone.get_user_from_request self.setActiveUser(self.TEST_TOKEN, self.TEST_USER, self.TEST_TENANT, - True) + True, self.TEST_SERVICE_CATALOG) self.request = http.HttpRequest() keystone.AuthenticationMiddleware().process_request(self.request) @@ -70,6 +72,6 @@ class TestCase(test.TestCase): ('Location', settings.TESTSERVER + expected_url)) self.assertEqual(response.status_code, 302) - def setActiveUser(self, token, username, tenant, is_admin): + def setActiveUser(self, token, username, tenant, is_admin, service_catalog): keystone.get_user_from_request = \ - lambda x: keystone.User(token, username, tenant, is_admin) + lambda x: keystone.User(token, username, tenant, is_admin, service_catalog) diff --git a/django-openstack/django_openstack/tests/api_tests.py b/django-openstack/django_openstack/tests/api_tests.py index 4276aaadc..eb6a88221 100644 --- a/django-openstack/django_openstack/tests/api_tests.py +++ b/django-openstack/django_openstack/tests/api_tests.py @@ -289,16 +289,15 @@ class ApiHelperTests(test.TestCase): GLANCE_URL = 'http://glance/glanceapi/' NOVA_URL = 'http://nova/novapi/' - serviceCatalog = { - 'glance': [{'adminURL': GLANCE_URL + 'admin', - 'internalURL': GLANCE_URL + 'internal'}, - ], - 'nova': [{'adminURL': NOVA_URL + 'admin', - 'internalURL': NOVA_URL + 'internal'}, - ], - } - - self.request.session['serviceCatalog'] = serviceCatalog + # NOTE: serviceCatalog is now constructed as part of the user object + # serviceCatalog = { + # 'glance': [{'adminURL': GLANCE_URL + 'admin', + # 'internalURL': GLANCE_URL + 'internal'}, + # ], + # 'nova': [{'adminURL': NOVA_URL + 'admin', + # 'internalURL': NOVA_URL + 'internal'}, + # ], + # } url = api.url_for(self.request, 'glance') self.assertEqual(url, GLANCE_URL + 'internal') @@ -516,7 +515,7 @@ class AccountApiTests(test.TestCase): account_api.users = self.mox.CreateMockAnything() account_api.users.create(TEST_USERNAME, TEST_EMAIL, TEST_PASSWORD, - TEST_TENANT_ID).AndReturn(TEST_RETURN) + TEST_TENANT_ID, True).AndReturn(TEST_RETURN) self.mox.ReplayAll() @@ -999,7 +998,7 @@ class ExtrasApiTests(test.TestCase): extras_api.consoles.create( TEST_INSTANCE_ID, TEST_CONSOLE_KIND).AndReturn(TEST_RETURN) extras_api.consoles.create( - TEST_INSTANCE_ID, None).AndReturn(TEST_RETURN + '2') + TEST_INSTANCE_ID, 'text').AndReturn(TEST_RETURN + '2') self.mox.ReplayAll() @@ -1095,7 +1094,7 @@ class ExtrasApiTests(test.TestCase): self.mox.ReplayAll() ret_val = api.server_create(self.request, NAME, IMAGE, FLAVOR, - USER_DATA, KEY) + KEY, USER_DATA) self.assertIsInstance(ret_val, api.Server) self.assertEqual(ret_val._apiresource, TEST_RETURN) diff --git a/django-openstack/django_openstack/tests/view_tests/dash/images_tests.py b/django-openstack/django_openstack/tests/view_tests/dash/images_tests.py index 973f716c7..dffede82c 100644 --- a/django-openstack/django_openstack/tests/view_tests/dash/images_tests.py +++ b/django-openstack/django_openstack/tests/view_tests/dash/images_tests.py @@ -11,6 +11,10 @@ from openstackx.api import exceptions as api_exceptions from mox import IgnoreArg, IsA +class FakeQuota: + ram = 100 + + class ImageViewTests(base.BaseViewTests): def setUp(self): super(ImageViewTests, self).setUp() @@ -119,6 +123,10 @@ class ImageViewTests(base.BaseViewTests): api.image_get(IsA(http.HttpRequest), IMAGE_ID).AndReturn(self.visibleImage) + self.mox.StubOutWithMock(api, 'tenant_quota_get') + api.tenant_quota_get(IsA(http.HttpRequest), + self.TEST_TENANT).AndReturn(FakeQuota) + self.mox.StubOutWithMock(api, 'token_get_tenant') api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) @@ -165,6 +173,7 @@ class ImageViewTests(base.BaseViewTests): 'key_name': KEY_NAME, 'name': SERVER_NAME, 'user_data': USER_DATA, + 'tenant_id': self.TEST_TENANT, } self.mox.StubOutWithMock(api, 'image_get') @@ -175,6 +184,10 @@ class ImageViewTests(base.BaseViewTests): api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) + self.mox.StubOutWithMock(api, 'tenant_quota_get') + api.tenant_quota_get(IsA(http.HttpRequest), + self.TEST_TENANT).AndReturn(FakeQuota) + self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) @@ -193,7 +206,7 @@ class ImageViewTests(base.BaseViewTests): api.server_create(IsA(http.HttpRequest), SERVER_NAME, self.visibleImage, self.flavors[0], - user_data=USER_DATA, key_name=KEY_NAME) + KEY_NAME, USER_DATA) self.mox.StubOutWithMock(messages, 'success') messages.success(IsA(http.HttpRequest), IsA(str)) @@ -204,8 +217,8 @@ class ImageViewTests(base.BaseViewTests): args=[self.TEST_TENANT, IMAGE_ID]), form_data) - self.assertRedirectsNoFollow(res, reverse('dash_images_launch', - args=[self.TEST_TENANT, IMAGE_ID])) + self.assertRedirectsNoFollow(res, reverse('dash_instances', + args=[self.TEST_TENANT])) self.mox.VerifyAll() @@ -220,6 +233,10 @@ class ImageViewTests(base.BaseViewTests): api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) + self.mox.StubOutWithMock(api, 'tenant_quota_get') + api.tenant_quota_get(IsA(http.HttpRequest), + self.TEST_TENANT).AndReturn(FakeQuota) + exception = api_exceptions.ApiException('apiException') self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndRaise(exception) @@ -242,7 +259,7 @@ class ImageViewTests(base.BaseViewTests): self.mox.VerifyAll() def test_launch_keypairlist_error(self): - IMAGE_ID = '1' + IMAGE_ID = '2' self.mox.StubOutWithMock(api, 'image_get') api.image_get(IsA(http.HttpRequest), @@ -252,6 +269,10 @@ class ImageViewTests(base.BaseViewTests): api.token_get_tenant(IsA(http.HttpRequest), self.TEST_TENANT).AndReturn(self.TEST_TENANT) + self.mox.StubOutWithMock(api, 'tenant_quota_get') + api.tenant_quota_get(IsA(http.HttpRequest), + self.TEST_TENANT).AndReturn(FakeQuota) + self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors) @@ -285,6 +306,7 @@ class ImageViewTests(base.BaseViewTests): 'image_id': IMAGE_ID, 'key_name': KEY_NAME, 'name': SERVER_NAME, + 'tenant_id': self.TEST_TENANT, 'user_data': USER_DATA, } @@ -296,6 +318,10 @@ class ImageViewTests(base.BaseViewTests): api.token_get_tenant(IgnoreArg(), self.TEST_TENANT).AndReturn(self.TEST_TENANT) + self.mox.StubOutWithMock(api, 'tenant_quota_get') + api.tenant_quota_get(IsA(http.HttpRequest), + self.TEST_TENANT).AndReturn(FakeQuota) + self.mox.StubOutWithMock(api, 'flavor_list') api.flavor_list(IgnoreArg()).AndReturn(self.flavors) @@ -313,13 +339,13 @@ class ImageViewTests(base.BaseViewTests): self.mox.StubOutWithMock(api, 'server_create') exception = api_exceptions.ApiException('apiException') - api.server_create(IgnoreArg(), SERVER_NAME, + api.server_create(IsA(http.HttpRequest), SERVER_NAME, self.visibleImage, self.flavors[0], - user_data=USER_DATA, - key_name=KEY_NAME).AndRaise(exception) + KEY_NAME, + USER_DATA).AndRaise(exception) self.mox.StubOutWithMock(messages, 'error') - messages.error(IgnoreArg(), IsA(unicode)) + messages.error(IsA(http.HttpRequest), IsA(str)) self.mox.ReplayAll() url = reverse('dash_images_launch', diff --git a/django-openstack/django_openstack/tests/view_tests/dash/instance_tests.py b/django-openstack/django_openstack/tests/view_tests/dash/instance_tests.py index fd994dd80..ab5b48b31 100644 --- a/django-openstack/django_openstack/tests/view_tests/dash/instance_tests.py +++ b/django-openstack/django_openstack/tests/view_tests/dash/instance_tests.py @@ -284,6 +284,9 @@ class InstanceViewTests(base.BaseViewTests): console_mock.output = CONSOLE_OUTPUT self.mox.StubOutWithMock(api, 'console_create') + self.mox.StubOutWithMock(api, 'server_get') + api.server_get(IsA(http.HttpRequest), + str(self.servers[0].id)).AndReturn(self.servers[0]) api.console_create(IgnoreArg(), unicode(INSTANCE_ID), 'vnc').AndReturn(console_mock) @@ -293,7 +296,7 @@ class InstanceViewTests(base.BaseViewTests): res = self.client.get(reverse('dash_instances_vnc', args=[self.TEST_TENANT, INSTANCE_ID])) - self.assertRedirectsNoFollow(res, CONSOLE_OUTPUT) + self.assertRedirectsNoFollow(res, CONSOLE_OUTPUT + '&title=serverName(1)') self.mox.VerifyAll()