~devcamcar/horizon/trunk

« back to all changes in this revision

Viewing changes to django-openstack/src/django_openstack/nova/views/keypairs.py

  • Committer: Devin Carlen
  • Date: 2011-06-18 05:59:37 UTC
  • Revision ID: devin.carlen@gmail.com-20110618055937-aobwm0buvviijz3o
Moved codebase to GitHub

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
 
 
3
 
# Copyright 2010 United States Government as represented by the
4
 
# Administrator of the National Aeronautics and Space Administration.
5
 
# All Rights Reserved.
6
 
#
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
10
 
#
11
 
#         http://www.apache.org/licenses/LICENSE-2.0
12
 
#
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
17
 
#    under the License.
18
 
 
19
 
"""
20
 
Views for managing Nova keypairs.
21
 
"""
22
 
 
23
 
from django import http
24
 
from django import template
25
 
from django.contrib import messages
26
 
from django.contrib.auth.decorators import login_required
27
 
from django.shortcuts import redirect, render_to_response
28
 
from django.utils.translation import ugettext as _
29
 
from django_openstack import log as logging
30
 
from django_openstack.nova import exceptions
31
 
from django_openstack.nova import forms
32
 
from django_openstack.nova import shortcuts
33
 
from django_openstack.nova.exceptions import handle_nova_error
34
 
 
35
 
 
36
 
LOG = logging.getLogger('django_openstack.nova')
37
 
 
38
 
 
39
 
@login_required
40
 
@handle_nova_error
41
 
def index(request, project_id, download_key=None):
42
 
    project = shortcuts.get_project_or_404(request, project_id)
43
 
    keypairs = project.get_key_pairs()
44
 
 
45
 
    return render_to_response('django_openstack/nova/keypairs/index.html', {
46
 
        'create_form': forms.CreateKeyPairForm(project),
47
 
        'region': project.region,
48
 
        'project': project,
49
 
        'keypairs': keypairs,
50
 
        'download_key': download_key
51
 
    }, context_instance=template.RequestContext(request))
52
 
 
53
 
 
54
 
@login_required
55
 
@handle_nova_error
56
 
def add(request, project_id):
57
 
    project = shortcuts.get_project_or_404(request, project_id)
58
 
 
59
 
    if request.method == 'POST':
60
 
        form = forms.CreateKeyPairForm(project, request.POST)
61
 
 
62
 
        if form.is_valid():
63
 
            try:
64
 
                keypair = project.create_key_pair(form.cleaned_data['name'])
65
 
            except exceptions.NovaApiError, e:
66
 
                messages.error(request,
67
 
                               _('Unable to create key: %s') % e.message)
68
 
                LOG.error('Unable to create key for user "%s" on project "%s".'
69
 
                          ' Exception: "%s"' %
70
 
                          (str(request.user), project_id, e.message))
71
 
            else:
72
 
                LOG.info('Keypair "%s" for project "%s" created successfully' %
73
 
                        (keypair.name, project_id))
74
 
                if request.POST['js'] == '1':
75
 
                    request.session['key.%s' % keypair.name] = keypair.material
76
 
                    return index(request,
77
 
                                 project_id,
78
 
                                 download_key=keypair.name)
79
 
                else:
80
 
                    response = http.HttpResponse(mimetype='application/binary')
81
 
                    response['Content-Disposition'] = \
82
 
                        'attachment; filename=%s.pem' % \
83
 
                        form.cleaned_data['name']
84
 
                    response.write(keypair.material)
85
 
                    return response
86
 
        else:
87
 
            keypairs = project.get_key_pairs()
88
 
 
89
 
            return render_to_response(
90
 
                'django_openstack/nova/keypairs/index.html',
91
 
                {'create_form': form,
92
 
                 'region': project.region,
93
 
                 'project': project,
94
 
                 'keypairs': keypairs},
95
 
                context_instance=template.RequestContext(request))
96
 
 
97
 
    return redirect('nova_keypairs', project_id)
98
 
 
99
 
 
100
 
@login_required
101
 
@handle_nova_error
102
 
def delete(request, project_id):
103
 
    project = shortcuts.get_project_or_404(request, project_id)
104
 
 
105
 
    if request.method == 'POST':
106
 
        key_name = request.POST['key_name']
107
 
 
108
 
        try:
109
 
            project.delete_key_pair(key_name)
110
 
        except exceptions.NovaApiError, e:
111
 
            messages.error(request,
112
 
                           _('Unable to delete key: %s') % e.message)
113
 
            LOG.error('Unable to delete key "%s".  Exception: "%s"' %
114
 
                      (key_name, e.message_))
115
 
        else:
116
 
            messages.success(request,
117
 
                             _('Key %s has been successfully deleted.') % \
118
 
                             key_name)
119
 
            LOG.info('Key "%s" successfully deleted' % key_name)
120
 
 
121
 
    return redirect('nova_keypairs', project_id)
122
 
 
123
 
 
124
 
@login_required
125
 
@handle_nova_error
126
 
def download(request, project_id, key_name):
127
 
    # Ensure the project exists.
128
 
    shortcuts.get_project_or_404(request, project_id)
129
 
 
130
 
    try:
131
 
        material = request.session.pop('key.%s' % key_name)
132
 
    except KeyError:
133
 
        return redirect('nova_keypairs', project_id)
134
 
 
135
 
    response = http.HttpResponse(mimetype='application/binary')
136
 
    response['Content-Disposition'] = 'attachment; filename=%s.pem' % key_name
137
 
    response.write(material)
138
 
 
139
 
    return response