Statistics
| Branch: | Tag: | Revision:

root / admin / views.py @ 7cc3c7d9

History | View | Annotate | Download (8.5 kB)

1
from functools import wraps
2

    
3
from django.http import HttpResponse
4
from django.shortcuts import redirect
5
from django.template.loader import render_to_string
6

    
7
from synnefo.db import models
8
from synnefo.invitations.invitations import add_invitation, send_invitation
9
from synnefo.logic import backend, log, users
10

    
11

    
12
_log = log.get_logger('synnefo.admin')
13

    
14

    
15
def render(template, tab, **kwargs):
16
    kwargs.setdefault('tab', tab)
17
    return render_to_string(template, kwargs)
18

    
19

    
20
def requires_admin(func):
21
    @wraps(func)
22
    def wrapper(request, *args):
23
        if not request.user or request.user.type != 'ADMIN':
24
            return HttpResponse('Forbidden', status=403)
25
        return func(request, *args)
26
    return wrapper
27

    
28

    
29
@requires_admin
30
def index(request):
31
    stats = {}
32
    stats['users'] = models.SynnefoUser.objects.count()
33
    stats['images'] = models.Image.objects.exclude(state='DELETED').count()
34
    stats['flavors'] = models.Flavor.objects.count()
35
    stats['vms'] = models.VirtualMachine.objects.filter(deleted=False).count()
36
    stats['networks'] = models.Network.objects.exclude(state='DELETED').count()
37
    stats['invitations'] = models.Invitations.objects.count()
38

    
39
    stats['ganeti_instances'] = len(backend.get_ganeti_instances())
40
    stats['ganeti_nodes'] = len(backend.get_ganeti_nodes())
41
    stats['ganeti_jobs'] = len(backend.get_ganeti_jobs())
42

    
43
    images = []
44
    for image in models.Image.objects.exclude(state='DELETED'):
45
        vms = models.VirtualMachine.objects.filter(sourceimage=image)
46
        count = vms.filter(deleted=False).count()
47
        images.append((count, image.name))
48
    images.sort(reverse=True)
49

    
50
    html = render('index.html', 'home', stats=stats, images=images)
51
    return HttpResponse(html)
52

    
53

    
54
@requires_admin
55
def flavors_list(request):
56
    flavors = models.Flavor.objects.order_by('id')
57
    html = render('flavors_list.html', 'flavors', flavors=flavors)
58
    return HttpResponse(html)
59

    
60

    
61
@requires_admin
62
def flavors_create(request):
63
    if request.method == 'GET':
64
        html = render('flavors_create.html', 'flavors')
65
        return HttpResponse(html)
66
    if request.method == 'POST':
67
        flavor = models.Flavor()
68
        flavor.cpu = int(request.POST.get('cpu'))
69
        flavor.ram = int(request.POST.get('ram'))
70
        flavor.disk = int(request.POST.get('disk'))
71
        flavor.save()
72
        _log.info('User %s created Flavor %s', request.user.name, flavor.name)
73
        return redirect(flavors_info, flavor.id)
74

    
75

    
76
@requires_admin
77
def flavors_info(request, flavor_id):
78
    flavor = models.Flavor.objects.get(id=flavor_id)
79
    html = render('flavors_info.html', 'flavors', flavor=flavor)
80
    return HttpResponse(html)
81

    
82

    
83
@requires_admin
84
def flavors_modify(request, flavor_id):
85
    flavor = models.Flavor.objects.get(id=flavor_id)
86
    flavor.cpu = int(request.POST.get('cpu'))
87
    flavor.ram = int(request.POST.get('ram'))
88
    flavor.disk = int(request.POST.get('disk'))
89
    flavor.save()
90
    _log.info('User %s modified Flavor %s', request.user.name, flavor.name)
91
    return redirect(flavors_info, flavor.id)
92

    
93

    
94
@requires_admin
95
def flavors_delete(request, flavor_id):
96
    flavor = models.Flavor.objects.get(id=flavor_id)
97
    flavor.delete()
98
    _log.info('User %s deleted Flavor %s', request.user.name, flavor.name)
99
    return redirect(flavors_list)
100

    
101

    
102
@requires_admin
103
def images_list(request):
104
    images = models.Image.objects.order_by('id')
105
    html = render('images_list.html', 'images', images=images)
106
    return HttpResponse(html)
107

    
108

    
109
@requires_admin
110
def images_register(request):
111
    if request.method == 'GET':
112
        formats = [x[0] for x in models.Image.FORMATS]
113
        html = render('images_register.html', 'images', formats=formats)
114
        return HttpResponse(html)
115
    elif request.method == 'POST':
116
        image = models.Image()
117
        image.state = 'ACTIVE'
118
        image.name = request.POST.get('name')
119
        owner_id = request.POST.get('owner') or None
120
        image.owner = owner_id and models.SynnefoUser.objects.get(id=owner_id)
121
        image.backend_id = request.POST.get('backend')
122
        image.format = request.POST.get('format')
123
        image.public = True if request.POST.get('public') else False
124
        image.save()
125
        _log.info('User %s registered Image %s', request.user.name, image.name)
126
        return redirect(images_info, image.id)
127

    
128

    
129
@requires_admin
130
def images_info(request, image_id):
131
    image = models.Image.objects.get(id=image_id)
132
    states = [x[0] for x in models.Image.IMAGE_STATES]
133
    if not image.state:
134
        states = [''] + states
135
    formats = [x[0] for x in models.Image.FORMATS]
136
    if not image.format:
137
        formats = [''] + formats
138
    
139
    metadata = image.metadata.order_by('meta_key')
140
    html = render('images_info.html', 'images',
141
                    image=image,
142
                    states=states,
143
                    formats=formats,
144
                    metadata=metadata)
145
    return HttpResponse(html)
146

    
147

    
148
@requires_admin
149
def images_modify(request, image_id):
150
    image = models.Image.objects.get(id=image_id)
151
    image.name = request.POST.get('name')
152
    image.state = request.POST.get('state')
153
    owner_id = request.POST.get('owner') or None
154
    image.owner = owner_id and models.SynnefoUser.objects.get(id=owner_id)
155
    vm_id = request.POST.get('sourcevm') or None
156
    image.sourcevm = vm_id and models.VirtualMachine.objects.get(id=vm_id)
157
    image.backend_id = request.POST.get('backend')
158
    image.format = request.POST.get('format')
159
    image.public = True if request.POST.get('public') else False
160
    image.save()
161
    
162
    keys = request.POST.getlist('key')
163
    vals = request.POST.getlist('value')
164
    meta = dict(zip(keys, vals))
165
    image.metadata.all().delete()
166
    for key, val in meta.items():
167
        if key:
168
            image.metadata.create(meta_key=key, meta_value=val)
169
    
170
    _log.info('User %s modified Image %s', request.user.name, image.name)
171

    
172
    return redirect(images_info, image.id)
173

    
174

    
175
@requires_admin
176
def servers_list(request):
177
    vms = models.VirtualMachine.objects.order_by('id')
178
    html = render('servers_list.html', 'servers', vms=vms)
179
    return HttpResponse(html)
180

    
181

    
182
@requires_admin
183
def users_list(request):
184
    users = models.SynnefoUser.objects.order_by('id')
185
    html = render('users_list.html', 'users', users=users)
186
    return HttpResponse(html)
187

    
188

    
189
@requires_admin
190
def users_invite(request):
191
    if request.method == 'GET':
192
        html = render('users_invite.html', 'users')
193
        return HttpResponse(html)
194
    elif request.method == 'POST':
195
        inviter_id = request.POST.get('inviter')
196
        realname = request.POST.get('realname')
197
        uniq = request.POST.get('uniq')
198
        inviter = models.SynnefoUser.objects.get(id=inviter_id)
199
        inv = add_invitation(inviter, realname, uniq)
200
        send_invitation(inv)
201
        _log.info('User %s sent Invitation to %s as %s', request.user.name,
202
                    uniq, inviter.name)
203
        return redirect(users_list)
204

    
205

    
206
@requires_admin
207
def users_info(request, user_id):
208
    user = models.SynnefoUser.objects.get(id=user_id)
209
    types = [x[0] for x in models.SynnefoUser.ACCOUNT_TYPE]
210
    if not user.type:
211
        types = [''] + types
212
    html = render('users_info.html', 'users', user=user, types=types)
213
    return HttpResponse(html)
214

    
215

    
216
@requires_admin
217
def users_modify(request, user_id):
218
    user = models.SynnefoUser.objects.get(id=user_id)
219
    user.name = request.POST.get('name')
220
    user.realname = request.POST.get('realname')
221
    user.uniq = request.POST.get('uniq')
222
    user.credit = int(request.POST.get('credit'))
223
    user.type = request.POST.get('type')
224
    invitations = request.POST.get('invitations')
225
    user.max_invitations = int(invitations) if invitations else None
226
    user.save()
227
    _log.info('User %s modified User %s', request.user.name, user.name)
228
    return redirect(users_info, user.id)
229

    
230

    
231
@requires_admin
232
def users_delete(request, user_id):
233
    user = models.SynnefoUser.objects.get(id=user_id)
234
    users.delete_user(user)
235
    _log.info('User %s deleted User %s', request.user.name, user.name)
236
    return redirect(users_list)
237

    
238

    
239
@requires_admin
240
def invitations_list(request):
241
    invitations = models.Invitations.objects.order_by('id')
242
    html = render('invitations_list.html', 'invitations',
243
                     invitations=invitations)
244
    return HttpResponse(html)
245

    
246

    
247
@requires_admin
248
def invitations_resend(request, invitation_id):
249
    invitation = models.Invitations.objects.get(id=invitation_id)
250
    send_invitation(invitation)
251
    _log.info('User %s resent Invitations from %s to %s', request.user.name,
252
                invitation.source.name, invitation.target.name)
253
    return redirect(invitations_list)