1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2010 United States Government as represented by the
4
# Administrator of the National Aeronautics and Space Administration.
7
# Licensed under the Apache License, Version 2.0 (the "License"); you may
8
# not use this file except in compliance with the License. You may obtain
9
# a copy of the License at
11
# http://www.apache.org/licenses/LICENSE-2.0
13
# Unless required by applicable law or agreed to in writing, software
14
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
# License for the specific language governing permissions and limitations
20
Views for managing Nova through the Django admin interface.
25
from django import http
26
from django import template
27
from django.contrib import messages
28
from django.contrib.admin.views.decorators import staff_member_required
29
from django.contrib.auth import models as auth_models
30
from django.shortcuts import redirect, render_to_response
31
from django.utils.translation import ugettext as _
32
from django_openstack import log as logging
33
from django_openstack import models
34
from django_openstack.core.connection import get_nova_admin_connection
35
from django_openstack.nova import forms
38
LOG = logging.getLogger('django_openstack.nova')
41
@staff_member_required
42
def project_sendcredentials(request, project_id):
43
nova = get_nova_admin_connection()
44
project = nova.get_project(project_id)
46
users = [user.memberId for user in nova.get_project_members(project_id)]
47
form = forms.SendCredentialsForm(query_list=users)
50
LOG.error("Project id %s not found" % project_id)
53
if request.method == 'POST':
54
if len(request.POST.getlist('users')) < 1:
55
msg = "Please select a user to send credentials to."
57
return render_to_response(
58
'admin/django_openstack/nova/project/send_credentials.html',
63
context_instance=template.RequestContext(request))
65
for username in request.POST.getlist('users'):
66
models.CredentialsAuthorization.authorize(username, project_id)
67
msg = "Credentials were successfully sent."
68
return render_to_response(
69
'admin/django_openstack/nova/project/send_credentials.html',
74
context_instance=template.RequestContext(request))
76
return render_to_response(
77
'admin/django_openstack/nova/project/send_credentials.html',
81
context_instance=template.RequestContext(request))
84
@staff_member_required
85
def project_start_vpn(request, project_id):
86
nova = get_nova_admin_connection()
87
project = nova.get_project(project_id)
90
LOG.error("Project id %s does not exist" % project_id)
94
nova.start_vpn(project_id)
95
messages.success(request,
96
_('Successfully started VPN for project %(proj)s.') %
98
LOG.info('Successfully started VPN for project %s.' % project_id)
99
except boto.exception.EC2ResponseError, e:
100
msg = _('Unable to start VPN for the project %(proj)s: %(code)s - %(msg)s' %
103
'msg': e.error_message})
104
messages.error(request, msg)
107
return redirect('admin_projects')
110
@staff_member_required
111
def projects_list(request):
112
nova = get_nova_admin_connection()
113
projects = nova.get_projects()
115
return render_to_response(
116
'admin/django_openstack/nova/project/project_list.html',
117
{'projects': projects},
118
context_instance=template.RequestContext(request))
121
@staff_member_required
122
def project_view(request, project_name):
123
nova = get_nova_admin_connection()
124
project = nova.get_project(project_name)
125
users = nova.get_project_members(project_name)
128
manager = auth_models.User.objects.get(
129
username=project.projectManagerId)
130
except auth_models.User.DoesNotExist:
133
if request.method == 'POST':
134
form = forms.ProjectForm(request.POST)
137
nova.modify_project(form.cleaned_data["projectname"],
138
form.cleaned_data["manager"],
139
form.cleaned_data["description"])
140
msg = _('Successfully modified the project %(proj)s.' %
141
{'proj': project_name})
142
messages.success(request, msg)
144
except boto.exception.EC2ResponseError, e:
145
msg = _('Unable modify the project %(proj)s: %(code)s - %(msg)s' %
146
{'proj': project_name,
148
'msg': e.error_message})
149
messages.error(request, msg)
152
return redirect('admin_project', request.POST["projectname"])
154
form = forms.ProjectForm(initial={'projectname': project.projectname,
155
'description': project.description,
160
project_role = [str(role.role) for role in
161
nova.get_user_roles(user.memberId, project_name)]
162
global_role = [str(role.role) for role in
163
nova.get_user_roles(user.memberId, project=False)]
165
user.project_roles = ", ".join(project_role)
166
user.global_roles = ", ".join(global_role)
168
return render_to_response(
169
'admin/django_openstack/nova/project/edit_project.html',
173
context_instance=template.RequestContext(request))
176
@staff_member_required
177
def add_project(request):
178
nova = get_nova_admin_connection()
180
if request.method == 'POST':
181
form = forms.ProjectForm(request.POST)
183
manager = form.cleaned_data['manager']
184
nova.create_project(form.cleaned_data['projectname'],
186
form.cleaned_data['description'])
187
LOG.info('Project "%s" created' %
188
form.cleaned_data['projectname'])
189
return redirect('admin_project', request.POST['projectname'])
191
form = forms.ProjectForm()
193
return render_to_response(
194
'admin/django_openstack/nova/project/add_project.html',
196
context_instance=template.RequestContext(request))
199
@staff_member_required
200
def delete_project(request, project_name):
201
nova = get_nova_admin_connection()
203
if request.method == 'POST':
204
nova.delete_project(project_name)
205
LOG.info('Project "%s" deleted' % project_name)
206
return redirect('admin_projects')
208
project = nova.get_project(project_name)
210
return render_to_response(
211
'admin/django_openstack/nova/project/delete_project.html',
212
{'project': project},
213
context_instance=template.RequestContext(request))
216
def remove_project_roles(username, project):
217
nova = get_nova_admin_connection()
218
userroles = nova.get_user_roles(username, project)
219
roles = [str(role.role) for role in userroles]
222
if role == "developer":
223
nova.remove_user_role(username, "developer", project)
224
if role == "sysadmin":
225
nova.remove_user_role(username, "sysadmin", project)
226
if role == "netadmin":
227
nova.remove_user_role(username, "netadmin", project)
229
LOG.info('Removed roles "%s" from user "%s" on project "%s"' %
230
(",".join(roles), username, project))
233
def remove_global_roles(username):
234
nova = get_nova_admin_connection()
235
userroles = nova.get_user_roles(username)
236
roles = [str(role.role) for role in userroles]
239
if role == "developer":
240
nova.remove_user_role(username, "developer")
241
if role == "sysadmin":
242
nova.remove_user_role(username, "sysadmin")
243
if role == "netadmin":
244
nova.remove_user_role(username, "netadmin")
245
if role == "cloudadmin":
246
nova.remove_user_role(username, "cloudadmin")
248
nova.remove_user_role(username, "itsec")
250
LOG.info('Removed global roles "%s" from user "%s"' %
251
(",".join(roles), username))
254
@staff_member_required
255
def project_user(request, project_name, project_user):
256
nova = get_nova_admin_connection()
257
project = nova.get_project(project_name)
258
userroles = nova.get_user_roles(project_user, project_name)
261
modeluser = auth_models.User.objects.get(username=project_user)
262
except auth_models.User.DoesNotExist:
265
if request.method == 'POST':
266
form = forms.ProjectUserForm(project, request.user, request.POST)
268
username = project_user
270
# hacky work around to interface correctly with
271
# multiple select form
272
remove_project_roles(username, project_name)
274
roleform = request.POST.getlist("role")
275
for role in roleform:
276
nova.add_user_role(username, str(role), project_name)
278
LOG.info('Added roles "%s" to user "%s" on project "%s"' %
279
",".join(str(role) for role in roleform),
280
username, project_name)
282
return redirect('admin_project', project_name)
284
roles = [str(role.role) for role in userroles]
285
form = forms.ProjectUserForm(project,
290
return render_to_response(
291
'admin/django_openstack/nova/project/project_user.html',
295
context_instance=template.RequestContext(request))
298
@staff_member_required
299
def add_project_user(request, project_name):
300
nova = get_nova_admin_connection()
302
if request.method == 'POST':
303
form = forms.AddProjectUserForm(request.POST, project=project_name)
305
username = form.cleaned_data["username"].username
306
roleform = request.POST.getlist("role")
308
nova.add_project_member(username, project_name,)
310
for role in roleform:
311
nova.add_user_role(username, str(role), project_name)
313
LOG.info('Added user "%s" to project "%s" with roles "%s"' %
314
(username, project_name,
315
",".join(str(role) for role in roleform)))
317
return redirect('admin_project', project_name)
319
form = forms.AddProjectUserForm(project=project_name)
321
project = nova.get_project(project_name)
323
return render_to_response(
324
'admin/django_openstack/nova/project/add_project_user.html',
327
context_instance=template.RequestContext(request))
330
@staff_member_required
331
def delete_project_user(request, project_name, project_user):
332
nova = get_nova_admin_connection()
334
if request.method == 'POST':
335
nova.remove_project_member(project_user, project_name)
336
return redirect('admin_project', project_name)
338
project = nova.get_project(project_name)
339
user = nova.get_user(project_user)
341
return render_to_response(
342
'admin/django_openstack/nova/project/delete_project_user.html',
345
context_instance=template.RequestContext(request))
348
@staff_member_required
349
def users_list(request):
350
nova = get_nova_admin_connection()
351
users = nova.get_users()
354
# NOTE(devcamcar): Temporarily disabled for performance reasons.
355
#roles = [str(role.role) for role in
356
# nova.get_user_roles(user.username)]
358
user.roles = ", ".join(roles)
360
return render_to_response(
361
'admin/django_openstack/nova/project/user_list.html',
363
context_instance=template.RequestContext(request))
366
@staff_member_required
367
def user_roles(request, user_id):
368
nova = get_nova_admin_connection()
369
userroles = nova.get_user_roles(user_id)
371
modeluser = auth_models.User.objects.get(username=user_id)
372
except auth_models.User.DoesNotExist:
375
if request.method == 'POST':
376
form = forms.GlobalRolesForm(request.POST)
380
# hacky work around to interface correctly with
381
# multiple select form
382
remove_global_roles(username)
384
roleform = request.POST.getlist("role")
385
for role in roleform:
386
nova.add_user_role(username, str(role))
388
LOG.info('Added user "%s" to global roles "%s"' %
389
(username, ",".join(str(role) for role in roleform)))
391
return redirect('admin_user_roles', user_id)
393
roles = [str(role.role) for role in userroles]
394
form = forms.GlobalRolesForm({
395
'username': modeluser and modeluser.id or None,
399
return render_to_response(
400
'admin/django_openstack/nova/project/global_edit_user.html',
403
context_instance=template.RequestContext(request))