Statistics
| Branch: | Revision:

root / core / views.py @ 7a231029

History | View | Annotate | Download (10.5 kB)

1
# -*- coding: utf-8 -*- vim:encoding=utf-8:
2
# vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab
3
#
4
#Copyright © 2013 Greek Research and Technology Network (GRNET S.A.)
5
#
6
#Developed by Leonidas Poulopoulos (leopoul-at-noc-dot-grnet-dot-gr) and
7
#George Kargiotakis (kargig-at-noc-dot-grnet-dot-gr), GRNET NOC
8
#
9
#Permission to use, copy, modify, and/or distribute this software for any
10
#purpose with or without fee is hereby granted, provided that the above
11
#copyright notice and this permission notice appear in all copies.
12
#
13
#THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
14
#TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
15
#FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
16
#CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
17
#DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
18
#ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
19
#SOFTWARE.
20

    
21
from core.models import *
22
from graphs.models import *
23
from django.core.urlresolvers import reverse
24
from django.shortcuts import render_to_response,get_object_or_404
25
from django.http import HttpResponse,HttpResponseRedirect,Http404
26
from django.conf import settings
27

    
28
from django.views.decorators.cache import cache_page
29
from django.views.decorators.cache import never_cache
30
from django.core.cache import cache
31

    
32
from django.template import RequestContext
33
from django.db.models import Q
34

    
35
import json
36

    
37
import datetime
38
import time
39
import rrdtool
40
import tempfile
41
import os
42
import re
43
import random
44
import pprint
45

    
46
from gevent.pool import Pool
47
from gevent.timeout import Timeout
48
from operator import itemgetter
49
from util.analyze import analyze
50
from core.forms import *
51

    
52
def lun_tags():
53
    tagslist = cache.get('luntags')
54
    if tagslist is None:
55
        tags = []
56
        luns = Lun.objects.all()
57
        for lun in luns:
58
            for i in lun.tags.all():
59
                if i:
60
                    tags.extend(i.name for i in lun.tags.all())
61
        tags = list(set(tags))
62
        tags.sort()
63
        tagslist = []
64
        for tag in tags:
65
            tag_dict = {}
66
            tag_dict['text'] = tag
67
            tag_dict['id'] = tag
68
            tagslist.append(tag_dict)
69
        
70
        cache.set('luntags',tagslist, 300)
71
    
72
    return tagslist
73
    
74
def index(request):
75
    start='-30h'
76
    end='-8m'
77
    q_tags = None
78
    q_period = None
79
    q_zeroavg = False
80
    q_diskio = False
81
    q_requests = False
82
    q_sortbystd = False
83
    q_groupby = 'clear'
84
    q_topfive = False
85
    selected_tags = []
86
    tags = lun_tags()
87
    all_tags=[]
88
    all_tags.extend([i['text'] for i in tags])
89
    try:
90
        q_tags = request.GET['tags']
91
    except:
92
        pass
93
    try:
94
        q_period = request.GET['period']
95
        if q_period == '2hours':
96
            start = "-2h"
97
            end = '-8m'
98
        if q_period == 'daily':
99
            start = "-30h"
100
            end = '-8m'
101
        if q_period == 'weekly':
102
            start = "-7d"
103
            end = '-8m'
104
        if q_period == 'monthly':
105
            start = "-30d"
106
            end = '-8m'
107
        if q_period == 'yearly':
108
            start = "-365d"
109
            end = '-8m'
110
    except:
111
        q_period = 'daily'
112
    try:
113
        q_zeroavg = request.GET['zeroavg']
114
        q_zeroavg = True
115
    except:
116
        pass
117
    if q_tags:
118
        #This should be tags
119
        selected_tags = q_tags.split(',')
120
    try:
121
        q_diskio = request.GET['diskio']
122
    except:
123
        pass
124
    try:
125
        q_requests = request.GET['requests']
126
    except:
127
        pass
128
    if not q_diskio and not q_requests:
129
        q_diskio = True
130
        q_requests = True
131
    try:
132
        q_groupby = request.GET['groupby']
133
    except:
134
        pass
135
    try:
136
        q_sortbystd = request.GET['sortbystd']
137
    except:
138
        pass
139
    try:
140
        q_topfive = request.GET['topfive']
141
        q_sortbystd = True
142
    except:
143
        pass
144
    
145
    luns = Lun.objects.all()
146
    if q_tags:
147
        lunsfiltered = luns.filter(tags__name__in=selected_tags).distinct()
148
    if q_tags and 'uncategorized' in q_tags:
149
        lunsfiltered = luns.filter(Q(tags__name__in=selected_tags)|~Q(tags__name__in=all_tags)).distinct()
150
    if len(selected_tags) == 1 and 'uncategorized' in selected_tags:
151
        lunsfiltered = luns.exclude(tags__name__in=all_tags).distinct()
152
    
153
    if q_diskio:
154
        graphs = Graph.objects.filter(type='diskio')
155
    if q_requests:
156
        graphs = Graph.objects.filter(type='requests')
157
    if q_diskio and q_requests:
158
        graphs = Graph.objects.all()
159
    nl = cache.get('lun:stats')
160
    if nl is None:
161
        nl = analyze(luns)
162
    urls = []
163
    for i in nl:
164
        lun = luns.get(pk=i['lunpk'])
165
        if q_tags:
166
            try:
167
                lun = lunsfiltered.get(pk=i['lunpk'])
168
            except Lun.DoesNotExist:
169
                continue
170
        try:
171
            graph = graphs.get(pk=i['graph'])
172
        except Graph.DoesNotExist:
173
            continue
174
        if q_zeroavg == False:
175
            if int(i['avg']) == 0:
176
                continue
177
        graph_dict = {}
178
        if q_period == 'daily':
179
            graph.url = reverse("get-thumbnail",  kwargs={'graph_id': graph.pk, 'start':start, 'end':end})
180
        else:
181
            graph.url = reverse("get-thumbnail-non-static",  kwargs={'graph_id': graph.pk, 'start':start, 'end':end})
182
        graph_dict['url'] = graph.url
183
        graph_dict['graph'] = graph
184
        graph_dict['lun'] = lun
185
        graph_dict['dev'] = i['dev']
186
        urls.append(graph_dict)
187
    if q_groupby == 'lun':
188
        if q_sortbystd:
189
            urls = sorted(urls, key=lambda k: (k['lun'].name.lower(), -k['dev']))
190
        else:
191
            urls = sorted(urls, key=lambda k: (k['lun'].name.lower()))
192
    elif q_groupby == 'type':
193
        if q_sortbystd:
194
            urls = sorted(urls, key=lambda k: (k['graph'].type.lower(), -k['dev']))
195
        else:
196
            urls = sorted(urls, key=lambda k: (k['graph'].type.lower()))
197
    else:
198
        if q_sortbystd:
199
            urls = sorted(urls, key=lambda k: (-k['dev']))
200
        else:
201
            urls = sorted(urls, key=lambda k:  k['graph'].pk)
202
        
203
    tags.append({'text':'uncategorized', 'id':'uncategorized'})
204
    if q_topfive:
205
        urls = urls[:5]
206
    saved = Query.objects.all()
207
    ret = {
208
           'urls' :urls,
209
           'tags' :tags,
210
           'saved' : saved,
211
           'selected_tags' : selected_tags,
212
           'q_period' : q_period,
213
           'q_zeroavg' : q_zeroavg,
214
           'q_diskio' : q_diskio,
215
           'q_requests' : q_requests,
216
           'q_groupby' : q_groupby,
217
           'q_sortbystd' :q_sortbystd,
218
           'q_topfive': q_topfive,
219
           
220
           }
221
    return render_to_response('index.html', ret,
222
                context_instance=RequestContext(request))
223

    
224
def editsearch(request):
225
    if request.method == 'POST':
226
        form = queryForm(request.POST)
227
        if form.is_valid():
228
            form.save()
229
            res = {'result':'success'}
230
            return HttpResponse(json.dumps(res), mimetype='application/json')
231
        else:
232
            return render_to_response('querysave.html',
233
                {
234
                    'form': form,
235
                }, 
236
                context_instance=RequestContext(request)
237
                )
238
    elif request.method == 'GET':
239
        form = queryForm()
240
        return render_to_response('querysave.html', {
241
                'form': form }, 
242
                context_instance=RequestContext(request)
243
            )
244
    else:
245
        return HttpResponseRedirect(reverse('index'))
246

    
247
def deletesearch(request, search_id):
248
    if request.method == 'POST':
249
        searchpk = request.POST['searchpk']
250
        delsearch = Query.objects.get(pk=searchpk).delete()
251
        res = {'result':'success'}
252
        return HttpResponse(json.dumps(res), mimetype='application/json')
253
    elif request.method == 'GET':
254
        return render_to_response('querydelete.html', {
255
                'delquery': Query.objects.get(pk=search_id) }, 
256
                context_instance=RequestContext(request)
257
            )
258
    else:
259
        return HttpResponseRedirect(reverse('index'))
260

    
261
def taggedluns(request):
262
    tags = lun_tags()
263
    return HttpResponse(json.dumps(tags), mimetype="application/json")
264

    
265
def graphjson(request, graph_id):
266
    ret = {"graph_pk": graph_id}
267
    return render_to_response('graph.html', ret,  
268
                context_instance=RequestContext(request))
269

    
270

    
271
def graphperiods(request, graph_id):
272
    graph =  Graph.objects.get(pk=graph_id)
273
    lun = Lun.objects.get(pk=int(graph.tags.filter(name__icontains="lun:")[0].name.replace('lun:','')))
274
    return render_to_response('graphperiods.html', {'graph': graph, 'lun': lun},
275
                context_instance=RequestContext(request))
276

    
277
def getpngdata(path,static):
278

    
279
    file = open(path,'r')
280
    data = file.read()
281
    file.close()
282

    
283
    if static == False:
284
        os.remove(path)
285

    
286
    response = HttpResponse(mimetype='image/png')
287
    response.write(data)
288
    return response
289

    
290
def drawpng(request, graph_id, static=True, lazy=False, legend=False, start='-30h', end='-8m', jsonexport=False):
291

    
292
    graph = get_object_or_404(Graph,pk=graph_id)
293
    if static == True:
294
        lazy = True
295
        path = '%s/%s%s%s.png' % (settings.RRD_PNG_STATICPATH, graph_id, start, end)
296
        try:
297
            statinfo = os.stat(path)
298
            if time.time() - statinfo.st_mtime < 300 :
299
                return getpngdata(path,static)
300
        except OSError:
301
            pass
302
    else:
303
        path = tempfile.NamedTemporaryFile().name
304
    '''Removing unicode from strings while constructing kwargs'''
305
    kwargs = { 'start': str(start), 'end': str(end), 'lazy': lazy, 'legend': legend, 'jsonexport':jsonexport }
306
    result = graph.create_graph(path, **kwargs)
307
    if result == None:
308
        raise Http404
309
    if jsonexport:
310
        return HttpResponse(json.dumps(result), mimetype="application/json")
311
    return getpngdata(path, static)
312

    
313

    
314
def thumb(request,graph_id=None,legend=True,lazy=True,static=True, start='-30h', end='-8m',):
315
    graph = get_object_or_404(Graph,pk=graph_id)
316
    if static == True:
317
        lazy = True
318
    
319
        path = '%s/thumb-%s%s%s.png' % (settings.RRD_PNG_STATICPATH, graph_id, start, end)
320
        try:
321
            statinfo = os.stat(path)
322
            if time.time() - statinfo.st_mtime < 300 :
323
                return getpngdata(path,static)
324
        except OSError:
325
            pass
326
    else:
327
        path = tempfile.NamedTemporaryFile().name
328
    '''Removing unicode from strings while constructing kwargs'''
329
    kwargs = { 'start': str(start), 'end': str(end), 'lazy': lazy, 'legend': legend, 'thumb': True, }
330

    
331
    result=graph.create_graph(path,**kwargs)
332
    return getpngdata(path,static)
333