Merge lp:~devcamcar/django-nova/improve_unittests into lp:django-nova
- improve_unittests
- Merge into trunk
Proposed by
Devin Carlen
Status: | Merged |
---|---|
Approved by: | Devin Carlen |
Approved revision: | no longer in the source branch. |
Merged at revision: | 11 |
Proposed branch: | lp:~devcamcar/django-nova/improve_unittests |
Merge into: | lp:django-nova |
Diff against target: |
885 lines (+490/-54) 17 files modified
buildout.cfg (+1/-1) setup.py (+1/-1) src/django_nova/forms.py (+3/-3) src/django_nova/manager.py (+11/-1) src/django_nova/models.py (+5/-0) src/django_nova/shortcuts.py (+3/-2) src/django_nova/tests/__init__.py (+1/-0) src/django_nova/tests/urls.py (+32/-0) src/django_nova/tests/view_tests/__init__.py (+3/-0) src/django_nova/tests/view_tests/base.py (+51/-0) src/django_nova/tests/view_tests/image_tests.py (+210/-0) src/django_nova/tests/view_tests/instance_tests.py (+45/-0) src/django_nova/tests/view_tests/keypair_tests.py (+71/-0) src/django_nova/testsettings.py (+17/-3) src/django_nova/views/images.py (+20/-27) src/django_nova/views/instances.py (+11/-11) src/django_nova/views/keypairs.py (+5/-5) |
To merge this branch: | bzr merge lp:~devcamcar/django-nova/improve_unittests |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Devin Carlen | Approve | ||
Review via email: mp+47481@code.launchpad.net |
Commit message
Description of the change
Results of refactoring view tests and adding mox. Still in progress but merging in what's there to date.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'buildout.cfg' | |||
2 | --- buildout.cfg 2011-01-12 20:02:06 +0000 | |||
3 | +++ buildout.cfg 2011-01-25 23:54:53 +0000 | |||
4 | @@ -10,7 +10,7 @@ | |||
5 | 10 | 10 | ||
6 | 11 | [django] | 11 | [django] |
7 | 12 | recipe = djangorecipe | 12 | recipe = djangorecipe |
9 | 13 | version = 1.2.3 | 13 | version = 1.2.4 |
10 | 14 | project = django_nova | 14 | project = django_nova |
11 | 15 | projectegg = django_nova | 15 | projectegg = django_nova |
12 | 16 | settings = testsettings | 16 | settings = testsettings |
13 | 17 | 17 | ||
14 | === modified file 'setup.py' | |||
15 | --- setup.py 2011-01-12 20:02:06 +0000 | |||
16 | +++ setup.py 2011-01-25 23:54:53 +0000 | |||
17 | @@ -15,7 +15,7 @@ | |||
18 | 15 | author_email = 'devin.carlen@gmail.com', | 15 | author_email = 'devin.carlen@gmail.com', |
19 | 16 | packages = find_packages('src'), | 16 | packages = find_packages('src'), |
20 | 17 | package_dir = {'': 'src'}, | 17 | package_dir = {'': 'src'}, |
22 | 18 | install_requires = ['setuptools'], | 18 | install_requires = ['setuptools', 'boto==1.9b', 'mox>=0.5.0'], |
23 | 19 | classifiers = [ | 19 | classifiers = [ |
24 | 20 | 'Development Status :: 4 - Beta', | 20 | 'Development Status :: 4 - Beta', |
25 | 21 | 'Framework :: Django', | 21 | 'Framework :: Django', |
26 | 22 | 22 | ||
27 | === modified file 'src/django_nova/forms.py' | |||
28 | --- src/django_nova/forms.py 2011-01-16 03:46:33 +0000 | |||
29 | +++ src/django_nova/forms.py 2011-01-25 23:54:53 +0000 | |||
30 | @@ -49,13 +49,13 @@ | |||
31 | 49 | 49 | ||
32 | 50 | def get_instance_choices(project): | 50 | def get_instance_choices(project): |
33 | 51 | choices = [(i.id, i.id) for i in project.get_instances()] | 51 | choices = [(i.id, i.id) for i in project.get_instances()] |
35 | 52 | if len(choices) == 0: | 52 | if not len(choices): |
36 | 53 | choices = [('', 'none available')] | 53 | choices = [('', 'none available')] |
37 | 54 | return choices | 54 | return choices |
38 | 55 | 55 | ||
39 | 56 | def get_key_pair_choices(project): | 56 | def get_key_pair_choices(project): |
40 | 57 | choices = [(k.name, k.name) for k in project.get_key_pairs()] | 57 | choices = [(k.name, k.name) for k in project.get_key_pairs()] |
42 | 58 | if len(choices) == 0: | 58 | if not len(choices): |
43 | 59 | choices = [('', 'none available')] | 59 | choices = [('', 'none available')] |
44 | 60 | return choices | 60 | return choices |
45 | 61 | 61 | ||
46 | @@ -68,7 +68,7 @@ | |||
47 | 68 | def get_available_volume_choices(project): | 68 | def get_available_volume_choices(project): |
48 | 69 | choices = [(v.id, '%s %s - %dGB' % (v.id, v.displayName, v.size)) for v in \ | 69 | choices = [(v.id, '%s %s - %dGB' % (v.id, v.displayName, v.size)) for v in \ |
49 | 70 | project.get_volumes() if v.status != "in-use"] | 70 | project.get_volumes() if v.status != "in-use"] |
51 | 71 | if len(choices) == 0: | 71 | if not len(choices): |
52 | 72 | choices = [('', 'none available')] | 72 | choices = [('', 'none available')] |
53 | 73 | return choices | 73 | return choices |
54 | 74 | 74 | ||
55 | 75 | 75 | ||
56 | === modified file 'src/django_nova/manager.py' | |||
57 | --- src/django_nova/manager.py 2011-01-15 09:27:24 +0000 | |||
58 | +++ src/django_nova/manager.py 2011-01-25 23:54:53 +0000 | |||
59 | @@ -87,6 +87,16 @@ | |||
60 | 87 | return conn.get_object('UpdateImage', params, boto.ec2.image.Image) | 87 | return conn.get_object('UpdateImage', params, boto.ec2.image.Image) |
61 | 88 | 88 | ||
62 | 89 | @wrap_nova_error | 89 | @wrap_nova_error |
63 | 90 | def modify_image_attribute(self, image_id, attribute=None, operation=None, | ||
64 | 91 | groups='all'): | ||
65 | 92 | conn = self.get_nova_connection() | ||
66 | 93 | return conn.modify_image_attribute(image_id, | ||
67 | 94 | attribute='launchPermission', | ||
68 | 95 | operation='remove', | ||
69 | 96 | groups='all',) | ||
70 | 97 | |||
71 | 98 | |||
72 | 99 | @wrap_nova_error | ||
73 | 90 | def run_instances(self, image_id, **kwargs): | 100 | def run_instances(self, image_id, **kwargs): |
74 | 91 | """ | 101 | """ |
75 | 92 | Runs instances of the specified image id. | 102 | Runs instances of the specified image id. |
76 | @@ -201,7 +211,7 @@ | |||
77 | 201 | """ | 211 | """ |
78 | 202 | Indicates whether a security group with the specified name exists in this project. | 212 | Indicates whether a security group with the specified name exists in this project. |
79 | 203 | """ | 213 | """ |
81 | 204 | return self.get_security_group(name) != None | 214 | return self.get_security_group(name) is not None |
82 | 205 | 215 | ||
83 | 206 | @wrap_nova_error | 216 | @wrap_nova_error |
84 | 207 | def create_security_group(self, name, description): | 217 | def create_security_group(self, name, description): |
85 | 208 | 218 | ||
86 | === modified file 'src/django_nova/models.py' | |||
87 | --- src/django_nova/models.py 2011-01-12 20:02:06 +0000 | |||
88 | +++ src/django_nova/models.py 2011-01-25 23:54:53 +0000 | |||
89 | @@ -107,6 +107,11 @@ | |||
90 | 107 | """ | 107 | """ |
91 | 108 | Creates a Nova User when a new Django User is created. | 108 | Creates a Nova User when a new Django User is created. |
92 | 109 | """ | 109 | """ |
93 | 110 | |||
94 | 111 | # NOTE(devcamcar): If running unit tests, don't use a real endpoint. | ||
95 | 112 | if settings.NOVA_DEFAULT_ENDPOINT == 'none': | ||
96 | 113 | return | ||
97 | 114 | |||
98 | 110 | if created: | 115 | if created: |
99 | 111 | nova = get_nova_admin_connection() | 116 | nova = get_nova_admin_connection() |
100 | 112 | if not nova.has_user(instance.username): | 117 | if not nova.has_user(instance.username): |
101 | 113 | 118 | ||
102 | === modified file 'src/django_nova/shortcuts.py' | |||
103 | --- src/django_nova/shortcuts.py 2011-01-17 06:58:19 +0000 | |||
104 | +++ src/django_nova/shortcuts.py 2011-01-25 23:54:53 +0000 | |||
105 | @@ -15,6 +15,7 @@ | |||
106 | 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
107 | 16 | # License for the specific language governing permissions and limitations | 16 | # License for the specific language governing permissions and limitations |
108 | 17 | # under the License. | 17 | # under the License. |
109 | 18 | |||
110 | 18 | """ | 19 | """ |
111 | 19 | Helper methods for commonly used operations. | 20 | Helper methods for commonly used operations. |
112 | 20 | """ | 21 | """ |
113 | @@ -115,13 +116,13 @@ | |||
114 | 115 | user_has_modify_permissions = False | 116 | user_has_modify_permissions = False |
115 | 116 | 117 | ||
116 | 117 | # checks global roles, if user is a sysadmin they can modify image attribtues. | 118 | # checks global roles, if user is a sysadmin they can modify image attribtues. |
118 | 118 | if user_has_modify_permissions == False: | 119 | if not user_has_modify_permissions: |
119 | 119 | for role in nova.get_user_roles(username): | 120 | for role in nova.get_user_roles(username): |
120 | 120 | if role.role == "sysadmin": | 121 | if role.role == "sysadmin": |
121 | 121 | user_has_modify_permissions = True | 122 | user_has_modify_permissions = True |
122 | 122 | 123 | ||
123 | 123 | # checks project roles, if user is a sysadmin they can modify image attribtues. | 124 | # checks project roles, if user is a sysadmin they can modify image attribtues. |
125 | 124 | if user_has_modify_permissions == False: | 125 | if not user_has_modify_permissions: |
126 | 125 | for role in nova.get_user_roles(username, project_name): | 126 | for role in nova.get_user_roles(username, project_name): |
127 | 126 | if role.role == "sysadmin": | 127 | if role.role == "sysadmin": |
128 | 127 | user_has_modify_permissions = True | 128 | user_has_modify_permissions = True |
129 | 128 | 129 | ||
130 | === added directory 'src/django_nova/tests' | |||
131 | === added file 'src/django_nova/tests/__init__.py' | |||
132 | --- src/django_nova/tests/__init__.py 1970-01-01 00:00:00 +0000 | |||
133 | +++ src/django_nova/tests/__init__.py 2011-01-25 23:54:53 +0000 | |||
134 | @@ -0,0 +1,1 @@ | |||
135 | 1 | from view_tests import * | ||
136 | 0 | \ No newline at end of file | 2 | \ No newline at end of file |
137 | 1 | 3 | ||
138 | === added directory 'src/django_nova/tests/templates' | |||
139 | === added file 'src/django_nova/tests/templates/base-sidebar.html' | |||
140 | === added file 'src/django_nova/tests/urls.py' | |||
141 | --- src/django_nova/tests/urls.py 1970-01-01 00:00:00 +0000 | |||
142 | +++ src/django_nova/tests/urls.py 2011-01-25 23:54:53 +0000 | |||
143 | @@ -0,0 +1,32 @@ | |||
144 | 1 | # vim: tabstop=4 shiftwidth=4 softtabstop=4 | ||
145 | 2 | |||
146 | 3 | # Copyright 2010 United States Government as represented by the | ||
147 | 4 | # Administrator of the National Aeronautics and Space Administration. | ||
148 | 5 | # All Rights Reserved. | ||
149 | 6 | # | ||
150 | 7 | # Licensed under the Apache License, Version 2.0 (the "License"); you may | ||
151 | 8 | # not use this file except in compliance with the License. You may obtain | ||
152 | 9 | # a copy of the License at | ||
153 | 10 | # | ||
154 | 11 | # http://www.apache.org/licenses/LICENSE-2.0 | ||
155 | 12 | # | ||
156 | 13 | # Unless required by applicable law or agreed to in writing, software | ||
157 | 14 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||
158 | 15 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | ||
159 | 16 | # License for the specific language governing permissions and limitations | ||
160 | 17 | # under the License. | ||
161 | 18 | |||
162 | 19 | """ | ||
163 | 20 | URL patterns for testing django-nova views. | ||
164 | 21 | """ | ||
165 | 22 | |||
166 | 23 | from django.conf.urls.defaults import * | ||
167 | 24 | from django.conf.urls.defaults import * | ||
168 | 25 | |||
169 | 26 | |||
170 | 27 | urlpatterns = patterns('', | ||
171 | 28 | url(r'^projects/', include('django_nova.urls.project')), | ||
172 | 29 | url(r'^region/', include('django_nova.urls.region')), | ||
173 | 30 | url(r'^admin/projects/', include('django_nova.urls.admin_project')), | ||
174 | 31 | url(r'^admin/roles/', include('django_nova.urls.admin_roles')), | ||
175 | 32 | ) | ||
176 | 0 | \ No newline at end of file | 33 | \ No newline at end of file |
177 | 1 | 34 | ||
178 | === added directory 'src/django_nova/tests/view_tests' | |||
179 | === added file 'src/django_nova/tests/view_tests/__init__.py' | |||
180 | --- src/django_nova/tests/view_tests/__init__.py 1970-01-01 00:00:00 +0000 | |||
181 | +++ src/django_nova/tests/view_tests/__init__.py 2011-01-25 23:54:53 +0000 | |||
182 | @@ -0,0 +1,3 @@ | |||
183 | 1 | from keypair_tests import * | ||
184 | 2 | from image_tests import * | ||
185 | 3 | from instance_tests import * | ||
186 | 0 | \ No newline at end of file | 4 | \ No newline at end of file |
187 | 1 | 5 | ||
188 | === added file 'src/django_nova/tests/view_tests/base.py' | |||
189 | --- src/django_nova/tests/view_tests/base.py 1970-01-01 00:00:00 +0000 | |||
190 | +++ src/django_nova/tests/view_tests/base.py 2011-01-25 23:54:53 +0000 | |||
191 | @@ -0,0 +1,51 @@ | |||
192 | 1 | import mox | ||
193 | 2 | |||
194 | 3 | from django import test | ||
195 | 4 | from django.conf import settings | ||
196 | 5 | from django.contrib.auth import models as auth_models | ||
197 | 6 | from django_nova import adminclient | ||
198 | 7 | from django_nova import manager | ||
199 | 8 | from django_nova import shortcuts | ||
200 | 9 | |||
201 | 10 | |||
202 | 11 | TEST_PROJECT = 'test' | ||
203 | 12 | TEST_USER = 'test' | ||
204 | 13 | TEST_REGION = 'test' | ||
205 | 14 | |||
206 | 15 | |||
207 | 16 | class BaseProjectViewTests(test.TestCase): | ||
208 | 17 | def setUp(self): | ||
209 | 18 | project = adminclient.ProjectInfo() | ||
210 | 19 | project.projectname = TEST_PROJECT | ||
211 | 20 | project.projectManagerId = TEST_USER | ||
212 | 21 | |||
213 | 22 | self.mox = mox.Mox() | ||
214 | 23 | self.user = auth_models.User.objects.create_user(TEST_USER, | ||
215 | 24 | 'test@test.com', | ||
216 | 25 | password='test') | ||
217 | 26 | login = self.client.login(username=TEST_USER, password='test') | ||
218 | 27 | self.failUnless(login, 'Unable to login') | ||
219 | 28 | |||
220 | 29 | self.region = adminclient.RegionInfo(name=TEST_REGION, | ||
221 | 30 | endpoint='http://test:8773/') | ||
222 | 31 | self.project = manager.ProjectManager(self.user.username, | ||
223 | 32 | project, | ||
224 | 33 | self.region) | ||
225 | 34 | self.mox.StubOutWithMock(shortcuts, 'get_project_or_404') | ||
226 | 35 | shortcuts.get_project_or_404(mox.IgnoreArg(), | ||
227 | 36 | 'test').AndReturn(self.project) | ||
228 | 37 | |||
229 | 38 | def tearDown(self): | ||
230 | 39 | self.mox.UnsetStubs() | ||
231 | 40 | |||
232 | 41 | def assertRedirectsNoFollow(self, response, expected_url): | ||
233 | 42 | self.assertEqual(response._headers['location'], | ||
234 | 43 | ('Location', settings.TESTSERVER + expected_url)) | ||
235 | 44 | self.assertEqual(response.status_code, 302) | ||
236 | 45 | |||
237 | 46 | def create_key_pair_choices(self, key_names): | ||
238 | 47 | return [(k, k) for k in key_names] | ||
239 | 48 | |||
240 | 49 | def create_instance_type_choices(self): | ||
241 | 50 | return [('m1.medium', 'm1.medium'), | ||
242 | 51 | ('m1.large', 'm1.large')] | ||
243 | 0 | 52 | ||
244 | === added file 'src/django_nova/tests/view_tests/image_tests.py' | |||
245 | --- src/django_nova/tests/view_tests/image_tests.py 1970-01-01 00:00:00 +0000 | |||
246 | +++ src/django_nova/tests/view_tests/image_tests.py 2011-01-25 23:54:53 +0000 | |||
247 | @@ -0,0 +1,210 @@ | |||
248 | 1 | import boto.ec2.image | ||
249 | 2 | import boto.ec2.instance | ||
250 | 3 | import mox | ||
251 | 4 | |||
252 | 5 | from django.core.urlresolvers import reverse | ||
253 | 6 | from django_nova import forms | ||
254 | 7 | from django_nova import shortcuts | ||
255 | 8 | from django_nova.tests.view_tests.base import BaseProjectViewTests, TEST_PROJECT | ||
256 | 9 | |||
257 | 10 | |||
258 | 11 | TEST_IMAGE_ID = 'ami_test' | ||
259 | 12 | TEST_INSTANCE_ID = 'i-abcdefg' | ||
260 | 13 | TEST_KEY = 'foo' | ||
261 | 14 | |||
262 | 15 | |||
263 | 16 | class ImageViewTests(BaseProjectViewTests): | ||
264 | 17 | def setUp(self): | ||
265 | 18 | self.ami = boto.ec2.image.Image() | ||
266 | 19 | self.ami.id = TEST_IMAGE_ID | ||
267 | 20 | setattr(self.ami, 'displayName', TEST_IMAGE_ID) | ||
268 | 21 | setattr(self.ami, 'description', TEST_IMAGE_ID) | ||
269 | 22 | super(ImageViewTests, self).setUp() | ||
270 | 23 | |||
271 | 24 | def test_index(self): | ||
272 | 25 | self.mox.StubOutWithMock(self.project, 'get_images') | ||
273 | 26 | self.mox.StubOutWithMock(forms, 'get_key_pair_choices') | ||
274 | 27 | self.mox.StubOutWithMock(forms, 'get_instance_type_choices') | ||
275 | 28 | |||
276 | 29 | self.project.get_images().AndReturn([]) | ||
277 | 30 | forms.get_key_pair_choices(self.project).AndReturn([]) | ||
278 | 31 | forms.get_instance_type_choices().AndReturn([]) | ||
279 | 32 | |||
280 | 33 | self.mox.ReplayAll() | ||
281 | 34 | |||
282 | 35 | res = self.client.get(reverse('nova_images', args=[TEST_PROJECT])) | ||
283 | 36 | self.assertEqual(res.status_code, 200) | ||
284 | 37 | self.assertTemplateUsed(res, 'django_nova/images/index.html') | ||
285 | 38 | self.assertEqual(len(res.context['image_lists']), 3) | ||
286 | 39 | |||
287 | 40 | self.mox.VerifyAll() | ||
288 | 41 | |||
289 | 42 | def test_launch_form(self): | ||
290 | 43 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
291 | 44 | self.mox.StubOutWithMock(forms, 'get_key_pair_choices') | ||
292 | 45 | self.mox.StubOutWithMock(forms, 'get_instance_type_choices') | ||
293 | 46 | |||
294 | 47 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
295 | 48 | forms.get_key_pair_choices(self.project).AndReturn([]) | ||
296 | 49 | forms.get_instance_type_choices().AndReturn([]) | ||
297 | 50 | |||
298 | 51 | self.mox.ReplayAll() | ||
299 | 52 | |||
300 | 53 | args = [TEST_PROJECT, TEST_IMAGE_ID] | ||
301 | 54 | res = self.client.get(reverse('nova_images_launch', args=args)) | ||
302 | 55 | self.assertEqual(res.status_code, 200) | ||
303 | 56 | self.assertTemplateUsed(res, 'django_nova/images/launch.html') | ||
304 | 57 | self.assertEqual(res.context['ami'].id, TEST_IMAGE_ID) | ||
305 | 58 | |||
306 | 59 | self.mox.VerifyAll() | ||
307 | 60 | |||
308 | 61 | def test_launch(self): | ||
309 | 62 | instance = boto.ec2.instance.Instance() | ||
310 | 63 | instance.id = TEST_INSTANCE_ID | ||
311 | 64 | instance.image_id = TEST_IMAGE_ID | ||
312 | 65 | reservation = boto.ec2.instance.Reservation() | ||
313 | 66 | reservation.instances = [instance] | ||
314 | 67 | |||
315 | 68 | self.mox.StubOutWithMock(forms, 'get_key_pair_choices') | ||
316 | 69 | self.mox.StubOutWithMock(forms, 'get_instance_type_choices') | ||
317 | 70 | self.mox.StubOutWithMock(self.project, 'run_instances') | ||
318 | 71 | |||
319 | 72 | forms.get_key_pair_choices(self.project).AndReturn( | ||
320 | 73 | self.create_key_pair_choices([TEST_KEY])) | ||
321 | 74 | forms.get_instance_type_choices().AndReturn( | ||
322 | 75 | self.create_instance_type_choices()) | ||
323 | 76 | self.project.run_instances(TEST_IMAGE_ID, | ||
324 | 77 | addressing_type=mox.IgnoreArg(), | ||
325 | 78 | key_name=TEST_KEY, | ||
326 | 79 | user_data='', | ||
327 | 80 | instance_type='m1.medium', | ||
328 | 81 | min_count='1', | ||
329 | 82 | max_count='1').AndReturn(reservation) | ||
330 | 83 | self.mox.ReplayAll() | ||
331 | 84 | |||
332 | 85 | url = reverse('nova_images_launch', args=[TEST_PROJECT, TEST_IMAGE_ID]) | ||
333 | 86 | data = {'key_name': TEST_KEY, | ||
334 | 87 | 'count': '1', | ||
335 | 88 | 'size': 'm1.medium', | ||
336 | 89 | 'user_data': ''} | ||
337 | 90 | res = self.client.post(url, data) | ||
338 | 91 | self.assertRedirectsNoFollow(res, reverse('nova_instances', | ||
339 | 92 | args=[TEST_PROJECT])) | ||
340 | 93 | self.mox.VerifyAll() | ||
341 | 94 | |||
342 | 95 | def test_detail(self): | ||
343 | 96 | self.mox.StubOutWithMock(self.project, 'get_images') | ||
344 | 97 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
345 | 98 | self.mox.StubOutWithMock(shortcuts, 'get_user_image_permissions') | ||
346 | 99 | self.mox.StubOutWithMock(forms, 'get_key_pair_choices') | ||
347 | 100 | self.mox.StubOutWithMock(forms, 'get_instance_type_choices') | ||
348 | 101 | |||
349 | 102 | self.project.get_images().AndReturn([self.ami]) | ||
350 | 103 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
351 | 104 | shortcuts.get_user_image_permissions(mox.IgnoreArg(), | ||
352 | 105 | TEST_PROJECT).AndReturn(True) | ||
353 | 106 | forms.get_key_pair_choices(self.project).AndReturn( | ||
354 | 107 | self.create_key_pair_choices([TEST_KEY])) | ||
355 | 108 | forms.get_instance_type_choices().AndReturn( | ||
356 | 109 | self.create_instance_type_choices()) | ||
357 | 110 | |||
358 | 111 | self.mox.ReplayAll() | ||
359 | 112 | |||
360 | 113 | res = self.client.get(reverse('nova_images_detail', | ||
361 | 114 | args=[TEST_PROJECT, TEST_IMAGE_ID])) | ||
362 | 115 | self.assertEqual(res.status_code, 200) | ||
363 | 116 | self.assertTemplateUsed(res, 'django_nova/images/index.html') | ||
364 | 117 | self.assertEqual(res.context['ami'].id, TEST_IMAGE_ID) | ||
365 | 118 | |||
366 | 119 | self.mox.VerifyAll() | ||
367 | 120 | |||
368 | 121 | def test_remove_form(self): | ||
369 | 122 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
370 | 123 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
371 | 124 | self.mox.ReplayAll() | ||
372 | 125 | |||
373 | 126 | res = self.client.get(reverse('nova_images_remove', | ||
374 | 127 | args=[TEST_PROJECT, TEST_IMAGE_ID])) | ||
375 | 128 | self.assertEqual(res.status_code, 200) | ||
376 | 129 | self.assertTemplateUsed(res, 'django_nova/images/detail_list.html') | ||
377 | 130 | self.assertEqual(res.context['ami'].id, TEST_IMAGE_ID) | ||
378 | 131 | |||
379 | 132 | self.mox.VerifyAll() | ||
380 | 133 | |||
381 | 134 | def test_remove(self): | ||
382 | 135 | self.mox.StubOutWithMock(self.project, 'deregister_image') | ||
383 | 136 | self.project.deregister_image(TEST_IMAGE_ID).AndReturn(True) | ||
384 | 137 | self.mox.ReplayAll() | ||
385 | 138 | |||
386 | 139 | res = self.client.post(reverse('nova_images_remove', | ||
387 | 140 | args=[TEST_PROJECT, TEST_IMAGE_ID])) | ||
388 | 141 | self.assertRedirectsNoFollow(res, reverse('nova_images', | ||
389 | 142 | args=[TEST_PROJECT])) | ||
390 | 143 | |||
391 | 144 | self.mox.VerifyAll() | ||
392 | 145 | |||
393 | 146 | def test_make_public(self): | ||
394 | 147 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
395 | 148 | self.mox.StubOutWithMock(self.project, 'modify_image_attribute') | ||
396 | 149 | |||
397 | 150 | self.ami.is_public = False | ||
398 | 151 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
399 | 152 | self.project.modify_image_attribute(TEST_IMAGE_ID, | ||
400 | 153 | attribute='launchPermission', | ||
401 | 154 | operation='add').AndReturn(True) | ||
402 | 155 | self.mox.ReplayAll() | ||
403 | 156 | |||
404 | 157 | res = self.client.post(reverse('nova_images_privacy', | ||
405 | 158 | args=[TEST_PROJECT, TEST_IMAGE_ID])) | ||
406 | 159 | self.assertRedirectsNoFollow(res, reverse('nova_images_detail', | ||
407 | 160 | args=[TEST_PROJECT, TEST_IMAGE_ID])) | ||
408 | 161 | self.mox.VerifyAll() | ||
409 | 162 | |||
410 | 163 | def test_make_private(self): | ||
411 | 164 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
412 | 165 | self.mox.StubOutWithMock(self.project, 'modify_image_attribute') | ||
413 | 166 | |||
414 | 167 | self.ami.is_public = True | ||
415 | 168 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
416 | 169 | self.project.modify_image_attribute(TEST_IMAGE_ID, | ||
417 | 170 | attribute='launchPermission', | ||
418 | 171 | operation='remove').AndReturn(True) | ||
419 | 172 | self.mox.ReplayAll() | ||
420 | 173 | |||
421 | 174 | args = [TEST_PROJECT, TEST_IMAGE_ID] | ||
422 | 175 | res = self.client.post(reverse('nova_images_privacy', args=args)) | ||
423 | 176 | self.assertRedirectsNoFollow(res, reverse('nova_images_detail', | ||
424 | 177 | args=args)) | ||
425 | 178 | self.mox.VerifyAll() | ||
426 | 179 | |||
427 | 180 | def test_update_form(self): | ||
428 | 181 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
429 | 182 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
430 | 183 | self.mox.ReplayAll() | ||
431 | 184 | |||
432 | 185 | args = [TEST_PROJECT, TEST_IMAGE_ID] | ||
433 | 186 | res = self.client.get(reverse('nova_images_update', args=args)) | ||
434 | 187 | self.assertEqual(res.status_code, 200) | ||
435 | 188 | self.assertTemplateUsed(res, 'django_nova/images/edit.html') | ||
436 | 189 | self.assertEqual(res.context['ami'].id, TEST_IMAGE_ID) | ||
437 | 190 | |||
438 | 191 | self.mox.VerifyAll() | ||
439 | 192 | |||
440 | 193 | def test_update(self): | ||
441 | 194 | self.mox.StubOutWithMock(self.project, 'get_image') | ||
442 | 195 | self.mox.StubOutWithMock(self.project, 'update_image') | ||
443 | 196 | |||
444 | 197 | self.project.get_image(TEST_IMAGE_ID).AndReturn(self.ami) | ||
445 | 198 | self.project.update_image(TEST_IMAGE_ID, 'test', 'test').AndReturn(True) | ||
446 | 199 | |||
447 | 200 | self.mox.ReplayAll() | ||
448 | 201 | |||
449 | 202 | args = [TEST_PROJECT, TEST_IMAGE_ID] | ||
450 | 203 | data = {'nickname': 'test', | ||
451 | 204 | 'description': 'test'} | ||
452 | 205 | url = reverse('nova_images_update', args=args) | ||
453 | 206 | res = self.client.post(url, data) | ||
454 | 207 | expected_url = reverse('nova_images_detail', args=args) | ||
455 | 208 | self.assertRedirectsNoFollow(res, expected_url) | ||
456 | 209 | |||
457 | 210 | self.mox.VerifyAll() | ||
458 | 0 | 211 | ||
459 | === added file 'src/django_nova/tests/view_tests/instance_tests.py' | |||
460 | --- src/django_nova/tests/view_tests/instance_tests.py 1970-01-01 00:00:00 +0000 | |||
461 | +++ src/django_nova/tests/view_tests/instance_tests.py 2011-01-25 23:54:53 +0000 | |||
462 | @@ -0,0 +1,45 @@ | |||
463 | 1 | import boto.ec2.instance | ||
464 | 2 | import mox | ||
465 | 3 | |||
466 | 4 | from django.core.urlresolvers import reverse | ||
467 | 5 | from django_nova.tests.view_tests.base import BaseProjectViewTests, TEST_PROJECT | ||
468 | 6 | |||
469 | 7 | |||
470 | 8 | TEST_INSTANCE_ID = 'i-abcdefgh' | ||
471 | 9 | |||
472 | 10 | |||
473 | 11 | class InstanceViewTests(BaseProjectViewTests): | ||
474 | 12 | def test_index(self): | ||
475 | 13 | self.mox.StubOutWithMock(self.project, 'get_instances') | ||
476 | 14 | self.project.get_instances().AndReturn([]) | ||
477 | 15 | |||
478 | 16 | self.mox.ReplayAll() | ||
479 | 17 | |||
480 | 18 | res = self.client.get(reverse('nova_instances', args=[TEST_PROJECT])) | ||
481 | 19 | self.assertEqual(res.status_code, 200) | ||
482 | 20 | self.assertTemplateUsed(res, 'django_nova/instances/index.html') | ||
483 | 21 | self.assertEqual(len(res.context['instances']), 0) | ||
484 | 22 | |||
485 | 23 | self.mox.VerifyAll() | ||
486 | 24 | |||
487 | 25 | def test_detail(self): | ||
488 | 26 | instance = boto.ec2.instance.Instance() | ||
489 | 27 | instance.id = TEST_INSTANCE_ID | ||
490 | 28 | instance.displayName = instance.id | ||
491 | 29 | instance.displayDescription = instance.id | ||
492 | 30 | |||
493 | 31 | self.mox.StubOutWithMock(self.project, 'get_instance') | ||
494 | 32 | self.project.get_instance(instance.id).AndReturn(instance) | ||
495 | 33 | self.mox.StubOutWithMock(self.project, 'get_instances') | ||
496 | 34 | self.project.get_instances().AndReturn([instance]) | ||
497 | 35 | |||
498 | 36 | self.mox.ReplayAll() | ||
499 | 37 | |||
500 | 38 | res = self.client.get(reverse('nova_instances_detail', | ||
501 | 39 | args=[TEST_PROJECT, TEST_INSTANCE_ID])) | ||
502 | 40 | self.assertEqual(res.status_code, 200) | ||
503 | 41 | self.assertTemplateUsed(res, 'django_nova/instances/index.html') | ||
504 | 42 | self.assertEqual(res.context['selected_instance'].id, instance.id) | ||
505 | 43 | |||
506 | 44 | self.mox.VerifyAll() | ||
507 | 45 | |||
508 | 0 | 46 | ||
509 | === added file 'src/django_nova/tests/view_tests/keypair_tests.py' | |||
510 | --- src/django_nova/tests/view_tests/keypair_tests.py 1970-01-01 00:00:00 +0000 | |||
511 | +++ src/django_nova/tests/view_tests/keypair_tests.py 2011-01-25 23:54:53 +0000 | |||
512 | @@ -0,0 +1,71 @@ | |||
513 | 1 | import boto.ec2.keypair | ||
514 | 2 | import mox | ||
515 | 3 | |||
516 | 4 | from django.core.urlresolvers import reverse | ||
517 | 5 | from django_nova.tests.view_tests.base import BaseProjectViewTests, TEST_PROJECT | ||
518 | 6 | |||
519 | 7 | |||
520 | 8 | TEST_KEY = 'test_key' | ||
521 | 9 | |||
522 | 10 | |||
523 | 11 | class KeyPairViewTests(BaseProjectViewTests): | ||
524 | 12 | def test_index(self): | ||
525 | 13 | self.mox.StubOutWithMock(self.project, 'get_key_pairs') | ||
526 | 14 | self.project.get_key_pairs().AndReturn([]) | ||
527 | 15 | |||
528 | 16 | self.mox.ReplayAll() | ||
529 | 17 | |||
530 | 18 | response = self.client.get(reverse('nova_keypairs', | ||
531 | 19 | args=[TEST_PROJECT])) | ||
532 | 20 | self.assertEqual(response.status_code, 200) | ||
533 | 21 | self.assertTemplateUsed(response, 'django_nova/keypairs/index.html') | ||
534 | 22 | self.assertEqual(len(response.context['keypairs']), 0) | ||
535 | 23 | |||
536 | 24 | self.mox.VerifyAll() | ||
537 | 25 | |||
538 | 26 | def test_add_keypair(self): | ||
539 | 27 | key = boto.ec2.keypair.KeyPair() | ||
540 | 28 | key.name = TEST_KEY | ||
541 | 29 | |||
542 | 30 | self.mox.StubOutWithMock(self.project, 'create_key_pair') | ||
543 | 31 | self.project.create_key_pair(key.name).AndReturn(key) | ||
544 | 32 | self.mox.StubOutWithMock(self.project, 'has_key_pair') | ||
545 | 33 | self.project.has_key_pair(key.name).AndReturn(False) | ||
546 | 34 | |||
547 | 35 | self.mox.ReplayAll() | ||
548 | 36 | |||
549 | 37 | url = reverse('nova_keypairs_add', args=[TEST_PROJECT]) | ||
550 | 38 | data = {'js': '0', 'name': key.name} | ||
551 | 39 | res = self.client.post(url, | ||
552 | 40 | data) | ||
553 | 41 | self.assertEqual(res.status_code, 200) | ||
554 | 42 | self.assertEqual(res['Content-Type'], 'application/binary') | ||
555 | 43 | |||
556 | 44 | self.mox.VerifyAll() | ||
557 | 45 | |||
558 | 46 | def test_delete_keypair(self): | ||
559 | 47 | self.mox.StubOutWithMock(self.project, 'delete_key_pair') | ||
560 | 48 | self.project.delete_key_pair(TEST_KEY).AndReturn(None) | ||
561 | 49 | |||
562 | 50 | self.mox.ReplayAll() | ||
563 | 51 | |||
564 | 52 | data = {'key_name': TEST_KEY} | ||
565 | 53 | url = reverse('nova_keypairs_delete', args=[TEST_PROJECT]) | ||
566 | 54 | res = self.client.post(url, data) | ||
567 | 55 | self.assertRedirectsNoFollow(res, reverse('nova_keypairs', | ||
568 | 56 | args=[TEST_PROJECT])) | ||
569 | 57 | |||
570 | 58 | self.mox.VerifyAll() | ||
571 | 59 | |||
572 | 60 | def test_download_keypair(self): | ||
573 | 61 | material = 'abcdefgh' | ||
574 | 62 | session = self.client.session | ||
575 | 63 | session['key.%s' % TEST_KEY] = material | ||
576 | 64 | session.save() | ||
577 | 65 | |||
578 | 66 | res = self.client.get(reverse('nova_keypairs_download', | ||
579 | 67 | args=['test', TEST_KEY])) | ||
580 | 68 | self.assertEqual(res.status_code, 200) | ||
581 | 69 | self.assertEqual(res['Content-Type'], 'application/binary') | ||
582 | 70 | self.assertContains(res, material) | ||
583 | 71 | |||
584 | 0 | 72 | ||
585 | === modified file 'src/django_nova/testsettings.py' | |||
586 | --- src/django_nova/testsettings.py 2011-01-12 20:02:06 +0000 | |||
587 | +++ src/django_nova/testsettings.py 2011-01-25 23:54:53 +0000 | |||
588 | @@ -1,5 +1,19 @@ | |||
589 | 1 | import os | ||
590 | 2 | |||
591 | 3 | ROOT_PATH = os.path.dirname(os.path.abspath(__file__)) | ||
592 | 4 | DEBUG = True | ||
593 | 5 | TESTSERVER = 'http://testserver' | ||
594 | 1 | DATABASE_ENGINE = 'sqlite3' | 6 | DATABASE_ENGINE = 'sqlite3' |
595 | 2 | DATABASE_NAME = '/tmp/django-nova.db' | 7 | DATABASE_NAME = '/tmp/django-nova.db' |
599 | 3 | INSTALLED_APPS = ['django_nova'] | 8 | INSTALLED_APPS = ['django.contrib.auth', |
600 | 4 | ROOT_URLCONF = ['django_nova.urls'] | 9 | 'django.contrib.contenttypes', |
601 | 5 | 10 | 'django.contrib.sessions', | |
602 | 11 | 'django_nova'] | ||
603 | 12 | ROOT_URLCONF = 'django_nova.tests.urls' | ||
604 | 13 | TEMPLATE_DIRS = ( | ||
605 | 14 | os.path.join(ROOT_PATH, 'tests', 'templates') | ||
606 | 15 | ) | ||
607 | 16 | NOVA_DEFAULT_ENDPOINT = 'none' | ||
608 | 17 | NOVA_DEFAULT_REGION = 'test' | ||
609 | 18 | NOVA_ACCESS_KEY = 'test' | ||
610 | 19 | NOVA_SECRET_KEY = 'test' | ||
611 | 6 | 20 | ||
612 | === modified file 'src/django_nova/views/images.py' | |||
613 | --- src/django_nova/views/images.py 2011-01-24 23:17:58 +0000 | |||
614 | +++ src/django_nova/views/images.py 2011-01-25 23:54:53 +0000 | |||
615 | @@ -30,8 +30,8 @@ | |||
616 | 30 | from django.shortcuts import redirect, render_to_response | 30 | from django.shortcuts import redirect, render_to_response |
617 | 31 | from django_nova import exceptions | 31 | from django_nova import exceptions |
618 | 32 | from django_nova import forms | 32 | from django_nova import forms |
619 | 33 | from django_nova import shortcuts | ||
620 | 33 | from django_nova.exceptions import handle_nova_error | 34 | from django_nova.exceptions import handle_nova_error |
621 | 34 | from django_nova.shortcuts import get_project_or_404, get_user_image_permissions | ||
622 | 35 | 35 | ||
623 | 36 | 36 | ||
624 | 37 | def _image_lists(images, project_id): | 37 | def _image_lists(images, project_id): |
625 | @@ -52,7 +52,7 @@ | |||
626 | 52 | @login_required | 52 | @login_required |
627 | 53 | @handle_nova_error | 53 | @handle_nova_error |
628 | 54 | def index(request, project_id): | 54 | def index(request, project_id): |
630 | 55 | project = get_project_or_404(request, project_id) | 55 | project = shortcuts.get_project_or_404(request, project_id) |
631 | 56 | images = project.get_images() | 56 | images = project.get_images() |
632 | 57 | 57 | ||
633 | 58 | return render_to_response('django_nova/images/index.html', { | 58 | return render_to_response('django_nova/images/index.html', { |
634 | @@ -66,7 +66,7 @@ | |||
635 | 66 | @login_required | 66 | @login_required |
636 | 67 | @handle_nova_error | 67 | @handle_nova_error |
637 | 68 | def launch(request, project_id, image_id): | 68 | def launch(request, project_id, image_id): |
639 | 69 | project = get_project_or_404(request, project_id) | 69 | project = shortcuts.get_project_or_404(request, project_id) |
640 | 70 | 70 | ||
641 | 71 | if request.method == 'POST': | 71 | if request.method == 'POST': |
642 | 72 | form = forms.LaunchInstanceForm(project, request.POST) | 72 | form = forms.LaunchInstanceForm(project, request.POST) |
643 | @@ -107,14 +107,15 @@ | |||
644 | 107 | @login_required | 107 | @login_required |
645 | 108 | @handle_nova_error | 108 | @handle_nova_error |
646 | 109 | def detail(request, project_id, image_id): | 109 | def detail(request, project_id, image_id): |
648 | 110 | project = get_project_or_404(request, project_id) | 110 | project = shortcuts.get_project_or_404(request, project_id) |
649 | 111 | images = project.get_images() | 111 | images = project.get_images() |
650 | 112 | 112 | ||
651 | 113 | ami = project.get_image(image_id) | 113 | ami = project.get_image(image_id) |
652 | 114 | can_modify = shortcuts.get_user_image_permissions(request.user.username, | ||
653 | 115 | project_id) | ||
654 | 114 | 116 | ||
655 | 115 | if not ami: | 117 | if not ami: |
656 | 116 | raise http.Http404() | 118 | raise http.Http404() |
657 | 117 | |||
658 | 118 | return render_to_response('django_nova/images/index.html', { | 119 | return render_to_response('django_nova/images/index.html', { |
659 | 119 | 'form': forms.LaunchInstanceForm(project), | 120 | 'form': forms.LaunchInstanceForm(project), |
660 | 120 | 'update_form': forms.UpdateImageForm(ami), | 121 | 'update_form': forms.UpdateImageForm(ami), |
661 | @@ -123,14 +124,14 @@ | |||
662 | 123 | 'images': images, | 124 | 'images': images, |
663 | 124 | 'image_lists': _image_lists(images, project_id), | 125 | 'image_lists': _image_lists(images, project_id), |
664 | 125 | 'ami': ami, | 126 | 'ami': ami, |
666 | 126 | 'can_modify': get_user_image_permissions(request.user.username, project_id), | 127 | 'can_modify': can_modify, |
667 | 127 | }, context_instance = template.RequestContext(request)) | 128 | }, context_instance = template.RequestContext(request)) |
668 | 128 | 129 | ||
669 | 129 | 130 | ||
670 | 130 | @login_required | 131 | @login_required |
671 | 131 | @handle_nova_error | 132 | @handle_nova_error |
672 | 132 | def remove(request, project_id, image_id): | 133 | def remove(request, project_id, image_id): |
674 | 133 | project = get_project_or_404(request, project_id) | 134 | project = shortcuts.get_project_or_404(request, project_id) |
675 | 134 | 135 | ||
676 | 135 | if request.method == 'POST': | 136 | if request.method == 'POST': |
677 | 136 | try: | 137 | try: |
678 | @@ -159,34 +160,27 @@ | |||
679 | 159 | @login_required | 160 | @login_required |
680 | 160 | @handle_nova_error | 161 | @handle_nova_error |
681 | 161 | def privacy(request, project_id, image_id): | 162 | def privacy(request, project_id, image_id): |
684 | 162 | project = get_project_or_404(request, project_id) | 163 | project = shortcuts.get_project_or_404(request, project_id) |
683 | 163 | conn = project.get_nova_connection() | ||
685 | 164 | 164 | ||
686 | 165 | if request.method == 'POST': | 165 | if request.method == 'POST': |
687 | 166 | ami = project.get_image(image_id) | 166 | ami = project.get_image(image_id) |
688 | 167 | 167 | ||
689 | 168 | if ami.is_public: | 168 | if ami.is_public: |
690 | 169 | # TODO(devcamcar): create a wrapper in manager.ProjectManager | ||
691 | 170 | # for modifying image attributes. | ||
692 | 171 | try: | 169 | try: |
698 | 172 | conn.modify_image_attribute(image_id, | 170 | project.modify_image_attribute(image_id, |
699 | 173 | attribute='launchPermission', | 171 | attribute='launchPermission', |
700 | 174 | operation='remove', | 172 | operation='remove') |
701 | 175 | groups='all',) | 173 | except exceptions.NovaApiError, e: |
697 | 176 | except boto.exception.EC2ResponseError, e: | ||
702 | 177 | messages.error(request, | 174 | messages.error(request, |
705 | 178 | 'Unable to make image private: %s - %s' % | 175 | 'Unable to make image private: %s' % e.message) |
704 | 179 | (e.code, e.message,)) | ||
706 | 180 | else: | 176 | else: |
707 | 181 | try: | 177 | try: |
713 | 182 | conn.modify_image_attribute(image_id, | 178 | project.modify_image_attribute(image_id, |
714 | 183 | attribute='launchPermission', | 179 | attribute='launchPermission', |
715 | 184 | operation='add', | 180 | operation='add') |
716 | 185 | groups='all') | 181 | except exceptions.NovaApiError, e: |
712 | 186 | except boto.exception.EC2ResponseError, e: | ||
717 | 187 | messages.error(request, | 182 | messages.error(request, |
720 | 188 | 'Unable to make image public: %s - %s' % | 183 | 'Unable to make image public: %s' % e.message) |
719 | 189 | (e.code, e.message,)) | ||
721 | 190 | 184 | ||
722 | 191 | return redirect('nova_images_detail', project_id, image_id) | 185 | return redirect('nova_images_detail', project_id, image_id) |
723 | 192 | 186 | ||
724 | @@ -194,7 +188,7 @@ | |||
725 | 194 | @login_required | 188 | @login_required |
726 | 195 | @handle_nova_error | 189 | @handle_nova_error |
727 | 196 | def update(request, project_id, image_id): | 190 | def update(request, project_id, image_id): |
729 | 197 | project = get_project_or_404(request, project_id) | 191 | project = shortcuts.get_project_or_404(request, project_id) |
730 | 198 | ami = project.get_image(image_id) | 192 | ami = project.get_image(image_id) |
731 | 199 | 193 | ||
732 | 200 | if request.method == 'POST': | 194 | if request.method == 'POST': |
733 | @@ -221,7 +215,6 @@ | |||
734 | 221 | 'form': form, | 215 | 'form': form, |
735 | 222 | 'region': project.region, | 216 | 'region': project.region, |
736 | 223 | 'project': project, | 217 | 'project': project, |
737 | 224 | 'project_list': project_list, | ||
738 | 225 | 'ami': ami, | 218 | 'ami': ami, |
739 | 226 | }, context_instance = template.RequestContext(request)) | 219 | }, context_instance = template.RequestContext(request)) |
740 | 227 | else: | 220 | else: |
741 | 228 | 221 | ||
742 | === modified file 'src/django_nova/views/instances.py' | |||
743 | --- src/django_nova/views/instances.py 2011-01-18 23:07:26 +0000 | |||
744 | +++ src/django_nova/views/instances.py 2011-01-25 23:54:53 +0000 | |||
745 | @@ -27,14 +27,14 @@ | |||
746 | 27 | from django.shortcuts import redirect, render_to_response | 27 | from django.shortcuts import redirect, render_to_response |
747 | 28 | from django_nova import exceptions | 28 | from django_nova import exceptions |
748 | 29 | from django_nova import forms as nova_forms | 29 | from django_nova import forms as nova_forms |
749 | 30 | from django_nova import shortcuts | ||
750 | 30 | from django_nova.exceptions import handle_nova_error | 31 | from django_nova.exceptions import handle_nova_error |
751 | 31 | from django_nova.shortcuts import get_project_or_404 | ||
752 | 32 | 32 | ||
753 | 33 | 33 | ||
754 | 34 | @login_required | 34 | @login_required |
755 | 35 | @handle_nova_error | 35 | @handle_nova_error |
756 | 36 | def index(request, project_id): | 36 | def index(request, project_id): |
758 | 37 | project = get_project_or_404(request, project_id) | 37 | project = shortcuts.get_project_or_404(request, project_id) |
759 | 38 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) | 38 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) |
760 | 39 | 39 | ||
761 | 40 | return render_to_response('django_nova/instances/index.html', { | 40 | return render_to_response('django_nova/instances/index.html', { |
762 | @@ -48,7 +48,7 @@ | |||
763 | 48 | @login_required | 48 | @login_required |
764 | 49 | @handle_nova_error | 49 | @handle_nova_error |
765 | 50 | def detail(request, project_id, instance_id): | 50 | def detail(request, project_id, instance_id): |
767 | 51 | project = get_project_or_404(request, project_id) | 51 | project = shortcuts.get_project_or_404(request, project_id) |
768 | 52 | instance = project.get_instance(instance_id) | 52 | instance = project.get_instance(instance_id) |
769 | 53 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) | 53 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) |
770 | 54 | 54 | ||
771 | @@ -68,7 +68,7 @@ | |||
772 | 68 | @login_required | 68 | @login_required |
773 | 69 | @handle_nova_error | 69 | @handle_nova_error |
774 | 70 | def performance(request, project_id, instance_id): | 70 | def performance(request, project_id, instance_id): |
776 | 71 | project = get_project_or_404(request, project_id) | 71 | project = shortcuts.get_project_or_404(request, project_id) |
777 | 72 | instance = project.get_instance(instance_id) | 72 | instance = project.get_instance(instance_id) |
778 | 73 | 73 | ||
779 | 74 | if not instance: | 74 | if not instance: |
780 | @@ -88,7 +88,7 @@ | |||
781 | 88 | if not request.user.is_authenticated(): | 88 | if not request.user.is_authenticated(): |
782 | 89 | return http.HttpResponseForbidden() | 89 | return http.HttpResponseForbidden() |
783 | 90 | 90 | ||
785 | 91 | project = get_project_or_404(request, project_id) | 91 | project = shortcuts.get_project_or_404(request, project_id) |
786 | 92 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) | 92 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) |
787 | 93 | 93 | ||
788 | 94 | return render_to_response('django_nova/instances/_instances_list.html', { | 94 | return render_to_response('django_nova/instances/_instances_list.html', { |
789 | @@ -103,7 +103,7 @@ | |||
790 | 103 | if not request.user.is_authenticated(): | 103 | if not request.user.is_authenticated(): |
791 | 104 | return http.HttpResponseForbidden() | 104 | return http.HttpResponseForbidden() |
792 | 105 | 105 | ||
794 | 106 | project = get_project_or_404(request, project_id) | 106 | project = shortcuts.get_project_or_404(request, project_id) |
795 | 107 | instance = project.get_instance(instance_id) | 107 | instance = project.get_instance(instance_id) |
796 | 108 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) | 108 | instances = sorted(project.get_instances(), key=lambda k: k.public_dns_name) |
797 | 109 | 109 | ||
798 | @@ -117,7 +117,7 @@ | |||
799 | 117 | @login_required | 117 | @login_required |
800 | 118 | @handle_nova_error | 118 | @handle_nova_error |
801 | 119 | def terminate(request, project_id): | 119 | def terminate(request, project_id): |
803 | 120 | project = get_project_or_404(request, project_id) | 120 | project = shortcuts.get_project_or_404(request, project_id) |
804 | 121 | 121 | ||
805 | 122 | if request.method == 'POST': | 122 | if request.method == 'POST': |
806 | 123 | instance_id = request.POST['instance_id'] | 123 | instance_id = request.POST['instance_id'] |
807 | @@ -138,7 +138,7 @@ | |||
808 | 138 | @login_required | 138 | @login_required |
809 | 139 | @handle_nova_error | 139 | @handle_nova_error |
810 | 140 | def console(request, project_id, instance_id): | 140 | def console(request, project_id, instance_id): |
812 | 141 | project = get_project_or_404(request, project_id) | 141 | project = shortcuts.get_project_or_404(request, project_id) |
813 | 142 | conn = project.get_nova_connection() | 142 | conn = project.get_nova_connection() |
814 | 143 | console = conn.get_console_output(instance_id) | 143 | console = conn.get_console_output(instance_id) |
815 | 144 | response = http.HttpResponse(mimetype='text/plain') | 144 | response = http.HttpResponse(mimetype='text/plain') |
816 | @@ -151,7 +151,7 @@ | |||
817 | 151 | @login_required | 151 | @login_required |
818 | 152 | @handle_nova_error | 152 | @handle_nova_error |
819 | 153 | def graph(request, project_id, instance_id, graph_name): | 153 | def graph(request, project_id, instance_id, graph_name): |
821 | 154 | project = get_project_or_404(request, project_id) | 154 | project = shortcuts.get_project_or_404(request, project_id) |
822 | 155 | graph = project.get_instance_graph(instance_id, graph_name) | 155 | graph = project.get_instance_graph(instance_id, graph_name) |
823 | 156 | 156 | ||
824 | 157 | if graph is None: | 157 | if graph is None: |
825 | @@ -166,10 +166,10 @@ | |||
826 | 166 | @login_required | 166 | @login_required |
827 | 167 | @handle_nova_error | 167 | @handle_nova_error |
828 | 168 | def update(request, project_id, instance_id): | 168 | def update(request, project_id, instance_id): |
830 | 169 | project = get_project_or_404(request, project_id) | 169 | project = shortcuts.get_project_or_404(request, project_id) |
831 | 170 | instance = project.get_instance(instance_id) | 170 | instance = project.get_instance(instance_id) |
832 | 171 | 171 | ||
834 | 172 | if instance is None: | 172 | if not instance: |
835 | 173 | raise http.Http404() | 173 | raise http.Http404() |
836 | 174 | 174 | ||
837 | 175 | if request.method == 'POST': | 175 | if request.method == 'POST': |
838 | 176 | 176 | ||
839 | === modified file 'src/django_nova/views/keypairs.py' | |||
840 | --- src/django_nova/views/keypairs.py 2011-01-18 23:07:26 +0000 | |||
841 | +++ src/django_nova/views/keypairs.py 2011-01-25 23:54:53 +0000 | |||
842 | @@ -27,14 +27,14 @@ | |||
843 | 27 | from django.shortcuts import redirect, render_to_response | 27 | from django.shortcuts import redirect, render_to_response |
844 | 28 | from django_nova import exceptions | 28 | from django_nova import exceptions |
845 | 29 | from django_nova import forms | 29 | from django_nova import forms |
846 | 30 | from django_nova import shortcuts | ||
847 | 30 | from django_nova.exceptions import handle_nova_error | 31 | from django_nova.exceptions import handle_nova_error |
848 | 31 | from django_nova.shortcuts import get_project_or_404 | ||
849 | 32 | 32 | ||
850 | 33 | 33 | ||
851 | 34 | @login_required | 34 | @login_required |
852 | 35 | @handle_nova_error | 35 | @handle_nova_error |
853 | 36 | def index(request, project_id, download_key=None): | 36 | def index(request, project_id, download_key=None): |
855 | 37 | project = get_project_or_404(request, project_id) | 37 | project = shortcuts.get_project_or_404(request, project_id) |
856 | 38 | keypairs = project.get_key_pairs() | 38 | keypairs = project.get_key_pairs() |
857 | 39 | 39 | ||
858 | 40 | return render_to_response('django_nova/keypairs/index.html', { | 40 | return render_to_response('django_nova/keypairs/index.html', { |
859 | @@ -48,7 +48,7 @@ | |||
860 | 48 | @login_required | 48 | @login_required |
861 | 49 | @handle_nova_error | 49 | @handle_nova_error |
862 | 50 | def add(request, project_id): | 50 | def add(request, project_id): |
864 | 51 | project = get_project_or_404(request, project_id) | 51 | project = shortcuts.get_project_or_404(request, project_id) |
865 | 52 | 52 | ||
866 | 53 | if request.method == 'POST': | 53 | if request.method == 'POST': |
867 | 54 | form = forms.CreateKeyPairForm(project, request.POST) | 54 | form = forms.CreateKeyPairForm(project, request.POST) |
868 | @@ -87,7 +87,7 @@ | |||
869 | 87 | @login_required | 87 | @login_required |
870 | 88 | @handle_nova_error | 88 | @handle_nova_error |
871 | 89 | def delete(request, project_id): | 89 | def delete(request, project_id): |
873 | 90 | project = get_project_or_404(request, project_id) | 90 | project = shortcuts.get_project_or_404(request, project_id) |
874 | 91 | 91 | ||
875 | 92 | if request.method == 'POST': | 92 | if request.method == 'POST': |
876 | 93 | key_name = request.POST['key_name'] | 93 | key_name = request.POST['key_name'] |
877 | @@ -108,7 +108,7 @@ | |||
878 | 108 | @handle_nova_error | 108 | @handle_nova_error |
879 | 109 | def download(request, project_id, key_name): | 109 | def download(request, project_id, key_name): |
880 | 110 | # Ensure the project exists. | 110 | # Ensure the project exists. |
882 | 111 | get_project_or_404(request, project_id) | 111 | shortcuts.get_project_or_404(request, project_id) |
883 | 112 | 112 | ||
884 | 113 | try: | 113 | try: |
885 | 114 | material = request.session.pop('key.%s' % key_name) | 114 | material = request.session.pop('key.%s' % key_name) |
approve