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 |
|