summaryrefslogtreecommitdiff
path: root/django-nova/src/django_nova/views/admin.py
diff options
context:
space:
mode:
Diffstat (limited to 'django-nova/src/django_nova/views/admin.py')
-rw-r--r--django-nova/src/django_nova/views/admin.py326
1 files changed, 326 insertions, 0 deletions
diff --git a/django-nova/src/django_nova/views/admin.py b/django-nova/src/django_nova/views/admin.py
new file mode 100644
index 00000000..ec1b4390
--- /dev/null
+++ b/django-nova/src/django_nova/views/admin.py
@@ -0,0 +1,326 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""
+Views for managing Nova through the Django admin interface.
+"""
+
+import boto.exception
+from django import http
+from django import template
+from django.contrib import messages
+from django.contrib.admin.views.decorators import staff_member_required
+from django.contrib.auth import models as auth_models
+from django.shortcuts import redirect, render_to_response
+from django_nova import forms
+from django_nova import models
+from django_nova.connection import get_nova_admin_connection
+
+
+@staff_member_required
+def project_sendcredentials(request, project_id):
+ nova = get_nova_admin_connection()
+ project = nova.get_project(project_id)
+
+ users = [user.memberId for user in nova.get_project_members(project_id)]
+ form = forms.SendCredentialsForm(query_list=users)
+
+ if project == None:
+ raise http.Http404()
+
+ if request.method == 'POST':
+ if len(request.POST.getlist('users')) < 1:
+ msg = "Please select a user to send credentials to."
+
+ return render_to_response('admin/django_nova/project/send_credentials.html', {
+ 'project' : project,
+ 'form' : form,
+ 'users' : users,
+ 'error': msg,
+ }, context_instance = template.RequestContext(request))
+ else:
+ for username in request.POST.getlist('users'):
+ models.CredentialsAuthorization.authorize(username, project_id)
+ msg = "Credentials were successfully sent."
+ return render_to_response('admin/django_nova/project/send_credentials.html', {
+ 'project' : project,
+ 'form' : form,
+ 'users' : users,
+ 'success': msg,
+ }, context_instance = template.RequestContext(request))
+
+ return render_to_response('admin/django_nova/project/send_credentials.html', {
+ 'project' : project,
+ 'form' : form,
+ 'users' : users,
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def project_start_vpn(request, project_id):
+ nova = get_nova_admin_connection()
+ project = nova.get_project(project_id)
+
+ if project == None:
+ raise http.Http404()
+
+ try:
+ nova.start_vpn(project_id)
+ messages.success(request,
+ 'Successfully started VPN for project %s.' %
+ project_id)
+ except boto.exception.EC2ResponseError, e:
+ messages.error(request,
+ 'Unable to start VPN for the project %s: %s - %s' %
+ (project_id, e.code, e.error_message))
+
+ return redirect('admin_projects')
+
+
+@staff_member_required
+def projects_list(request):
+ nova = get_nova_admin_connection()
+ projects = nova.get_projects()
+
+ return render_to_response('admin/django_nova/project/project_list.html', {
+ 'projects' : projects
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def project_view(request, project_name):
+ nova = get_nova_admin_connection()
+ project = nova.get_project(project_name)
+ users = nova.get_project_members(project_name)
+ try:
+ manager = auth_models.User.objects.get(username=project.projectManagerId)
+ except auth_models.User.DoesNotExist:
+ manager = None
+
+ for user in users:
+ project_role = [str(role.role) for role in nova.get_user_roles(user.memberId, project_name)]
+ global_role = [str(role.role) for role in nova.get_user_roles(user.memberId, project=False)]
+
+ user.project_roles = ", ".join(project_role)
+ user.global_roles = ", ".join(global_role)
+
+ return render_to_response('admin/django_nova/project/edit_project.html', {
+ 'project' : project,
+ 'users' : users,
+ 'projectname': project.projectname,
+ 'manager': manager,
+ 'description': project.description,
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def add_project(request):
+ nova = get_nova_admin_connection()
+
+ if request.method == 'POST':
+ form = forms.ProjectForm(request.POST)
+ if form.is_valid():
+ manager = form.cleaned_data["manager"]
+ nova.create_project(form.cleaned_data["projectname"],
+ manager.username,
+ form.cleaned_data["description"])
+ return redirect('admin_project', request.POST["projectname"])
+ else:
+ form = forms.ProjectForm()
+
+ return render_to_response('admin/django_nova/project/add_project.html', {
+ 'form' : form,
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def delete_project(request, project_name):
+ nova = get_nova_admin_connection()
+
+ if request.method == 'POST':
+ nova.delete_project(project_name)
+ return redirect('admin_projects')
+
+ project = nova.get_project(project_name)
+
+ return render_to_response('admin/django_nova/project/delete_project.html', {
+ 'project' : project,
+ }, context_instance = template.RequestContext(request))
+
+def remove_project_roles(username, project):
+ nova = get_nova_admin_connection()
+ userroles = nova.get_user_roles(username, project)
+ roles = [str(role.role) for role in userroles]
+
+ for role in roles:
+ if role == "developer":
+ nova.remove_user_role(username, "developer", project)
+ if role == "sysadmin":
+ nova.remove_user_role(username, "sysadmin", project)
+ if role == "netadmin":
+ nova.remove_user_role(username, "netadmin", project)
+
+def remove_global_roles(username):
+ nova = get_nova_admin_connection()
+ userroles = nova.get_user_roles(username)
+ roles = [str(role.role) for role in userroles]
+
+ for role in roles:
+ if role == "developer":
+ nova.remove_user_role(username, "developer")
+ if role == "sysadmin":
+ nova.remove_user_role(username, "sysadmin")
+ if role == "netadmin":
+ nova.remove_user_role(username, "netadmin")
+ if role == "cloudadmin":
+ nova.remove_user_role(username, "cloudadmin")
+ if role == "itsec":
+ nova.remove_user_role(username, "itsec")
+
+
+@staff_member_required
+def project_user(request, project_name, project_user):
+ nova = get_nova_admin_connection()
+ userroles = nova.get_user_roles(project_user, project_name)
+ try:
+ modeluser = auth_models.User.objects.get(username = project_user)
+ except auth_models.User.DoesNotExist:
+ modeluser = None
+
+ if request.method == 'POST':
+ form = forms.ProjectUserForm(request.POST)
+ if form.is_valid():
+ username = project_user
+
+ # hacky work around to interface correctly with multiple select form
+ remove_project_roles(username, project_name)
+
+ roleform = request.POST.getlist("role")
+ for role in roleform:
+ nova.add_user_role(username, str(role), project_name)
+
+ return redirect('admin_project', project_name)
+ else:
+ roles = [str(role.role) for role in userroles]
+ form = forms.ProjectUserForm({
+ 'role': roles,
+ 'user': modeluser,
+ })
+
+ project = nova.get_project(project_name)
+
+ return render_to_response('admin/django_nova/project/project_user.html', {
+ 'form' : form,
+ 'project' : project,
+ 'user': modeluser,
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def add_project_user(request, project_name):
+ nova = get_nova_admin_connection()
+
+ if request.method == 'POST':
+ form = forms.AddProjectUserForm(request.POST, project=project_name)
+ if form.is_valid():
+ username = form.cleaned_data["username"].username
+ nova.add_project_member(username, project_name,)
+
+ roleform = request.POST.getlist("role")
+ for role in roleform:
+ nova.add_user_role(username, str(role), project_name)
+
+ return redirect('admin_project', project_name)
+ else:
+ form = forms.AddProjectUserForm(project=project_name)
+
+ project = nova.get_project(project_name)
+
+ return render_to_response('admin/django_nova/project/add_project_user.html', {
+ 'form' : form,
+ 'project' : project,
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def delete_project_user(request, project_name, project_user):
+ nova = get_nova_admin_connection()
+
+ if request.method == 'POST':
+ nova.remove_project_member(project_user, project_name)
+ return redirect('admin_project', project_name)
+
+ project = nova.get_project(project_name)
+ user = nova.get_user(project_user)
+
+ return render_to_response('admin/django_nova/project/delete_project_user.html', {
+ 'user' : user,
+ 'project' : project,
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def users_list(request):
+ nova = get_nova_admin_connection()
+ users = nova.get_users()
+
+ for user in users:
+ # NOTE(devcamcar): Temporarily disabled for performance reasons.
+ #roles = [str(role.role) for role in nova.get_user_roles(user.username)]
+ roles = []
+ user.roles = ", ".join(roles)
+
+ return render_to_response('admin/django_nova/project/user_list.html', {
+ 'users' : users
+ }, context_instance = template.RequestContext(request))
+
+
+@staff_member_required
+def user_roles(request, user_id):
+ nova = get_nova_admin_connection()
+ userroles = nova.get_user_roles(user_id)
+ try:
+ modeluser = auth_models.User.objects.get(username=user_id)
+ except auth_models.User.DoesNotExist:
+ modeluser = None
+
+ if request.method == 'POST':
+ form = forms.GlobalRolesForm(request.POST)
+ if form.is_valid():
+ username = user_id
+
+ # hacky work around to interface correctly with multiple select form
+ remove_global_roles(username)
+
+ roleform = request.POST.getlist("role")
+ for role in roleform:
+ nova.add_user_role(username, str(role))
+
+ return redirect('admin_user_roles', user_id)
+ else:
+ roles = [str(role.role) for role in userroles]
+ form = forms.GlobalRolesForm({
+ 'username': modeluser and modeluser.id or None,
+ 'role': roles,
+ })
+
+ return render_to_response('admin/django_nova/project/global_edit_user.html', {
+ 'form' : form,
+ 'user' : modeluser,
+ }, context_instance = template.RequestContext(request))
+