blob: 6af7e7d7d4c2aa6953772a44e26c9e837a4c37b0 [file] [log] [blame]
Siobhan Tullycf04fb62014-01-11 11:25:57 -05001#views.py
Scott Bakerbd57a432014-04-14 16:12:15 -07002import functools
3import math
Scott Baker771819b2014-03-19 22:10:17 -07004import os
5import sys
Siobhan Tully06d2c032014-02-23 23:48:52 -05006from django.views.generic import TemplateView, View
7import datetime
Scott Baker771819b2014-03-19 22:10:17 -07008from pprint import pprint
9import json
Scott Baker537d8232014-04-08 23:40:56 -070010from core.models import *
Scott Bakerbd57a432014-04-14 16:12:15 -070011from operator import attrgetter
12from django.views.decorators.csrf import csrf_exempt
13from django.http import HttpResponse, HttpResponseServerError
Scott Baker537d8232014-04-08 23:40:56 -070014from django.core import urlresolvers
Scott Bakerbd57a432014-04-14 16:12:15 -070015from django.contrib.gis.geoip import GeoIP
16from ipware.ip import get_ip
Scott Baker771819b2014-03-19 22:10:17 -070017import traceback
Scott Baker6253dfc2014-04-14 09:29:30 -070018import socket
Siobhan Tully06d2c032014-02-23 23:48:52 -050019
Scott Bakera880bb52014-04-14 23:52:48 -070020BLESSED_SITES = ["Stanford", "Washington", "Princeton", "GeorgiaTech", "MaxPlanck"]
21
Scott Baker771819b2014-03-19 22:10:17 -070022if os.path.exists("/home/smbaker/projects/vicci/cdn/bigquery"):
23 sys.path.append("/home/smbaker/projects/vicci/cdn/bigquery")
24else:
25 sys.path.append("/opt/planetstack/hpc_wizard")
26import hpc_wizard
Scott Baker0017c102014-04-18 10:48:31 -070027from planetstack_analytics import DoPlanetStackAnalytics, PlanetStackAnalytics
Siobhan Tullycf04fb62014-01-11 11:25:57 -050028
29class DashboardWelcomeView(TemplateView):
30 template_name = 'admin/dashboard/welcome.html'
31
32 def get(self, request, *args, **kwargs):
33 context = self.get_context_data(**kwargs)
Scott Baker771819b2014-03-19 22:10:17 -070034 userDetails = getUserSliceInfo(request.user)
35 #context['site'] = userDetails['site']
Siobhan Tullycf04fb62014-01-11 11:25:57 -050036
Scott Baker771819b2014-03-19 22:10:17 -070037 context['userSliceInfo'] = userDetails['userSliceInfo']
38 context['cdnData'] = userDetails['cdnData']
Siobhan Tullycf04fb62014-01-11 11:25:57 -050039 return self.render_to_response(context=context)
Siobhan Tullye18b3442014-02-23 14:23:34 -050040
Scott Baker771819b2014-03-19 22:10:17 -070041def getUserSliceInfo(user, tableFormat = False):
42 userDetails = {}
43# try:
44# // site = Site.objects.filter(id=user.site.id)
45# // except:
46# // site = Site.objects.filter(name="Princeton")
47# // userDetails['sitename'] = site[0].name
48# // userDetails['siteid'] = site[0].id
49
50 userSliceData = getSliceInfo(user)
51 if (tableFormat):
52# pprint("******* GET USER SLICE INFO")
53 userDetails['userSliceInfo'] = userSliceTableFormatter(userSliceData)
54 else:
55 userDetails['userSliceInfo'] = userSliceData
56 userDetails['cdnData'] = getCDNOperatorData();
57# pprint( userDetails)
58 return userDetails
59
Scott Baker537d8232014-04-08 23:40:56 -070060class TenantCreateSlice(View):
61 def post(self, request, *args, **kwargs):
62 sliceName = request.POST.get("sliceName", "0")
63 serviceClass = request.POST.get("serviceClass", "0")
64 imageName = request.POST.get("imageName", "0")
65 actionToDo = request.POST.get("actionToDo", "0")
66 print sliceName
67 if (actionToDo == "add"):
68 serviceClass = ServiceClass.objects.get(name=serviceClass)
69 site = request.user.site
70 #image = Image.objects.get(name=imageName)
71 newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=imageName)
72 newSlice.save()
73 return newSlice
74
75
76def getTenantSliceInfo(user, tableFormat = False):
77 tenantSliceDetails = {}
78 tenantSliceData = getTenantInfo(user)
79 tenantServiceClassData = getServiceClassInfo(user)
80 if (tableFormat):
81 tenantSliceDetails['userSliceInfo'] = userSliceTableFormatter(tenantSliceData)
82 tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
83 else:
84 tenantSliceDetails['userSliceInfo'] = tenantSliceData
85 tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
86 tenantSliceDetails['image']=userSliceTableFormatter(getImageInfo(user))
87 tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user))
88 tenantSliceDetails['deploymentSites']=userSliceTableFormatter(getDeploymentSites())
89 tenantSliceDetails['sites'] = userSliceTableFormatter(getTenantSitesInfo());
90 return tenantSliceDetails
91
92
93def getTenantInfo(user):
94 slices =Slice.objects.all()
95 userSliceInfo = []
96 for entry in slices:
97 sliceName = Slice.objects.get(id=entry.id).name
98 slice = Slice.objects.get(name=Slice.objects.get(id=entry.id).name)
99 sliceServiceClass = entry.serviceClass.name
100 preferredImage = entry.imagePreference
101 numSliver = 0
102 sliceImage=""
103 sliceSite = {}
104 for sliver in slice.slivers.all():
105 numSliver +=sliver.numberCores
106 # sliceSite[sliver.deploymentNetwork.name] =sliceSite.get(sliver.deploymentNetwork.name,0) + 1
Scott Bakera880bb52014-04-14 23:52:48 -0700107 if sliver.node.site.name in BLESSED_SITES:
108 print "equal",sliver.node.site.name
109 sliceSite[sliver.node.site.name] = sliceSite.get(sliver.node.site.name,0) + 1
110 sliceImage = sliver.image.name
Scott Baker537d8232014-04-08 23:40:56 -0700111 userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver})
112 return userSliceInfo
113
114def getTenantSitesInfo():
115 tenantSiteInfo=[]
116 for entry in Site.objects.all():
Scott Bakera880bb52014-04-14 23:52:48 -0700117 if entry.name in BLESSED_SITES:
118 tenantSiteInfo.append({'siteName':entry.name})
Scott Baker537d8232014-04-08 23:40:56 -0700119 return tenantSiteInfo
120
Scott Baker771819b2014-03-19 22:10:17 -0700121def userSliceTableFormatter(data):
122# pprint(data)
123 formattedData = {
124 'rows' : data
125 }
126 return formattedData
127
Scott Baker537d8232014-04-08 23:40:56 -0700128def getServiceClassInfo(user):
129 serviceClassList = ServiceClass.objects.all()
130 sliceInfo = []
131 for entry in serviceClassList:
132 sliceInfo.append({'serviceClass':entry.name})
133 return sliceInfo
134
135def getImageInfo(user):
136 imageList = Image.objects.all()
137 imageInfo = []
138 for imageEntry in imageList:
139 imageInfo.append({'Image':imageEntry.name})
140 return imageInfo
141
142def getNetworkInfo(user):
143 #networkList = Network.objects.all()
144 networkList = ['Private Only','Private and Publicly Routable']
145 networkInfo = []
146 for networkEntry in networkList:
147 #networkInfo.append({'Network':networkEntry.name})
148 networkInfo.append({'Network':networkEntry})
149 return networkInfo
150
151def getDeploymentSites():
152 deploymentList = Deployment.objects.all()
153 deploymentInfo = []
154 for entry in deploymentList:
155 deploymentInfo.append({'DeploymentSite':entry.name})
156 return deploymentInfo
157
Scott Baker771819b2014-03-19 22:10:17 -0700158def getSliceInfo(user):
Siobhan Tully06d2c032014-02-23 23:48:52 -0500159 sliceList = Slice.objects.all()
Scott Baker771819b2014-03-19 22:10:17 -0700160 slicePrivs = SlicePrivilege.objects.filter(user=user)
Siobhan Tully06d2c032014-02-23 23:48:52 -0500161 userSliceInfo = []
162 for entry in slicePrivs:
Siobhan Tullye18b3442014-02-23 14:23:34 -0500163
Scott Baker771819b2014-03-19 22:10:17 -0700164 slicename = Slice.objects.get(id=entry.slice.id).name
Scott Baker537d8232014-04-08 23:40:56 -0700165 slice = Slice.objects.get(name=Slice.objects.get(id=entry.slice.id).name)
166 sliverList=Sliver.objects.all()
167 sites_used = {}
168 for sliver in slice.slivers.all():
169 #sites_used['deploymentSites'] = sliver.node.deployment.name
170 # sites_used[sliver.image.name] = sliver.image.name
171 sites_used[sliver.node.site.name] = sliver.numberCores
Scott Baker771819b2014-03-19 22:10:17 -0700172 sliceid = Slice.objects.get(id=entry.slice.id).id
Siobhan Tully06d2c032014-02-23 23:48:52 -0500173 try:
Scott Baker771819b2014-03-19 22:10:17 -0700174 sliverList = Sliver.objects.filter(slice=entry.slice.id)
175 siteList = {}
176 for x in sliverList:
177 if x.node.site not in siteList:
178 siteList[x.node.site] = 1
179 slivercount = len(sliverList)
180 sitecount = len(siteList)
Siobhan Tully06d2c032014-02-23 23:48:52 -0500181 except:
Scott Baker771819b2014-03-19 22:10:17 -0700182 traceback.print_exc()
183 slivercount = 0
184 sitecount = 0
Siobhan Tully06d2c032014-02-23 23:48:52 -0500185
Scott Baker771819b2014-03-19 22:10:17 -0700186 userSliceInfo.append({'slicename': slicename, 'sliceid':sliceid,
Scott Baker537d8232014-04-08 23:40:56 -0700187 'sitesUsed':sites_used,
188 'role': SliceRole.objects.get(id=entry.role.id).role,
189 'slivercount': slivercount,
190 'sitecount':sitecount})
Scott Baker771819b2014-03-19 22:10:17 -0700191
Siobhan Tully06d2c032014-02-23 23:48:52 -0500192 return userSliceInfo
193
Siobhan Tully06d2c032014-02-23 23:48:52 -0500194def getCDNOperatorData(randomizeData = False):
Scott Baker0017c102014-04-18 10:48:31 -0700195 bq = PlanetStackAnalytics()
Siobhan Tully06d2c032014-02-23 23:48:52 -0500196
Scott Baker0017c102014-04-18 10:48:31 -0700197 #hpc_sliceNames = bq.service_to_sliceNames("HPC Service")
Siobhan Tully06d2c032014-02-23 23:48:52 -0500198
Scott Baker0017c102014-04-18 10:48:31 -0700199 rows = bq.get_cached_query_results(bq.compose_latest_query())
200
201 #rows = [x for x in rows if x.get("slice","") in hpc_sliceNames]
202
203 rows = bq.postprocess_results(rows, filter={"slice": "HyperCache"}, maxi=["cpu"], count=["hostname"], computed=["bytes_sent/elapsed"], groupBy=["Time","site"])
204
205 bq.merge_datamodel_sites(rows)
206
207 new_rows = {}
208 for row in rows:
209 new_row = {"lat": float(row.get("lat", 0)),
210 "long": float(row.get("long", 0)),
211 "health": 0,
212 "numNodes": int(row.get("numNodes",0)),
213 "numHPCSlivers": int(row.get("count_hostname", 0)),
214 "siteUrl": str(row.get("url", "")),
215 "hot": float(row.get("hotness", 0.0)),
216 "bandwidth": row.get("sum_computed_bytes_sent_div_elapsed",0),
217 "load": int(float(row.get("max_avg_cpu", row.get("max_cpu",0))))}
218 new_rows[str(row["site"])] = new_row
219
220 return new_rows
Siobhan Tully06d2c032014-02-23 23:48:52 -0500221
Scott Baker771819b2014-03-19 22:10:17 -0700222class SimulatorView(View):
223 def get(self, request, **kwargs):
224 sim = json.loads(file("/tmp/simulator.json","r").read())
225 text = "<html><head></head><body>"
226 text += "Iteration: %d<br>" % sim["iteration"]
227 text += "Elapsed since report %d<br><br>" % sim["elapsed_since_report"]
228 text += "<table border=1>"
229 text += "<tr><th>site</th><th>trend</th><th>weight</th><th>bytes_sent</th><th>hot</th></tr>"
230 for site in sim["site_load"].values():
231 text += "<tr>"
232 text += "<td>%s</td><td>%0.2f</td><td>%0.2f</td><td>%d</td><td>%0.2f</td>" % \
233 (site["name"], site["trend"], site["weight"], site["bytes_sent"], site["load_frac"])
234 text += "</tr>"
235 text += "</table>"
236 text += "</body></html>"
237 return HttpResponse(text)
238
239class DashboardUserSiteView(View):
240 def get(self, request, **kwargs):
241 return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript')
242
Scott Baker537d8232014-04-08 23:40:56 -0700243class TenantViewData(View):
244 def get(self, request, **kwargs):
245 return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript')
246
Scott Bakerbd57a432014-04-14 16:12:15 -0700247def siteSortKey(site, slice=None, count=None, lat=None, lon=None):
248 # try to pick a site we're already using
249 has_slivers_here=False
250 if slice:
251 for sliver in slice.slivers.all():
252 if sliver.node.site.name == site.name:
253 has_slivers_here=True
254
255 # Haversine method
256 d = 0
257 site_lat = site.location.latitude
258 site_lon = site.location.longitude
259 if lat and lon and site_lat and site_lon:
260 site_lat = float(site_lat)
261 site_lon = float(site_lon)
262 R = 6378.1
263 a = math.sin( math.radians((lat - site_lat)/2.0) )**2 + math.cos( math.radians(lat) )*math.cos( math.radians(site_lat) )*(math.sin( math.radians((lon - site_lon)/2.0 ) )**2)
264 c = 2 * math.atan2( math.sqrt(a), math.sqrt(1 - a) )
265 d = R * c
266
267 return (-has_slivers_here, d)
268
269def tenant_pick_sites(user, user_ip=None, slice=None, count=None):
270 """ Returns list of sites, sorted from most favorable to least favorable """
271 lat=None
272 lon=None
273 try:
274 client_geo = GeoIP().city(user_ip)
275 if client_geo:
276 lat=float(client_geo["latitude"])
277 lon=float(client_geo["longitude"])
278 except:
279 print "exception in geo code"
280 traceback.print_exc()
281
282 sites = Site.objects.all()
Scott Bakera880bb52014-04-14 23:52:48 -0700283 sites = [x for x in sites if x.name in BLESSED_SITES]
Scott Bakerbd57a432014-04-14 16:12:15 -0700284 sites = sorted(sites, key=functools.partial(siteSortKey, slice=slice, count=count, lat=lat, lon=lon))
285
286 return sites
287
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700288def slice_increase_slivers(user, user_ip, siteList, slice, count, noAct=False):
Scott Bakere4deddd2014-04-14 16:48:05 -0700289 sitesChanged = {}
290
Scott Bakerbd57a432014-04-14 16:12:15 -0700291 # let's compute how many slivers are in use in each node of each site
292 for site in siteList:
293 site.nodeList = list(site.nodes.all())
294 for node in site.nodeList:
295 node.sliverCount = 0
Scott Baker6253dfc2014-04-14 09:29:30 -0700296 for sliver in node.slivers.all():
Scott Baker21511942014-04-15 17:44:27 -0700297 if sliver.slice.id == slice.id:
Scott Baker0017c102014-04-18 10:48:31 -0700298 node.sliverCount = node.sliverCount + 1
Scott Baker6253dfc2014-04-14 09:29:30 -0700299
Scott Bakerbd57a432014-04-14 16:12:15 -0700300 # Allocate slivers to nodes
301 # for now, assume we want to allocate all slivers from the same site
302 nodes = siteList[0].nodeList
303 while (count>0):
304 # Sort the node list by number of slivers per node, then pick the
305 # node with the least number of slivers.
306 nodes = sorted(nodes, key=attrgetter("sliverCount"))
307 node = nodes[0]
Scott Baker6253dfc2014-04-14 09:29:30 -0700308
Scott Bakerbd57a432014-04-14 16:12:15 -0700309 print "adding sliver at node", node.name, "of site", node.site.name
Scott Baker6253dfc2014-04-14 09:29:30 -0700310
Scott Bakere4deddd2014-04-14 16:48:05 -0700311 if not noAct:
312 sliver = Sliver(name=node.name,
313 slice=slice,
314 node=node,
315 image = Image.objects.all()[0],
316 creator = User.objects.get(email=user),
317 deploymentNetwork=node.deployment,
318 numberCores =1 )
319 sliver.save()
Scott Bakerbd57a432014-04-14 16:12:15 -0700320
321 node.sliverCount = node.sliverCount + 1
322
323 count = count - 1
324
Scott Bakere4deddd2014-04-14 16:48:05 -0700325 sitesChanged[node.site.name] = sitesChanged.get(node.site.name,0) + 1
326
327 return sitesChanged
328
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700329def slice_decrease_slivers(user, siteList, slice, count, noAct=False):
Scott Bakere4deddd2014-04-14 16:48:05 -0700330 sitesChanged = {}
331
Scott Bakerbd57a432014-04-14 16:12:15 -0700332 if siteList:
333 siteNames = [site.name for site in siteList]
334 else:
335 siteNames = None
336
337 for sliver in slice.slivers.all():
338 if (count <= 0):
339 break
340
341 node = sliver.node
342 if (not siteNames) or (node.site.name in siteNames):
343 print "deleting sliver", sliver, "at node", node.name, "of site", node.site.name
Scott Bakere4deddd2014-04-14 16:48:05 -0700344 if not noAct:
345 sliver.delete()
Scott Bakerbd57a432014-04-14 16:12:15 -0700346 count = count -1
Scott Baker6253dfc2014-04-14 09:29:30 -0700347
Scott Bakere4deddd2014-04-14 16:48:05 -0700348 sitesChanged[node.site.name] = sitesChanged.get(node.site.name,0) - 1
349
350 return sitesChanged
351
Scott Baker6253dfc2014-04-14 09:29:30 -0700352class TenantAddOrRemoveSliverView(View):
Scott Bakere4deddd2014-04-14 16:48:05 -0700353 """ Add or remove slivers from a Slice
354
355 Arguments:
356 siteName - name of site. If not specified, PlanetStack will pick the
357 best site.,
358 actionToDo - [add | rem]
359 count - number of slivers to add or remove
360 sliceName - name of slice
Scott Bakera880bb52014-04-14 23:52:48 -0700361 noAct - if set, no changes will be made to db, but result will still
362 show which sites would have been modified.
Scott Bakere4deddd2014-04-14 16:48:05 -0700363
364 Returns:
365 Dictionary of sites that were modified, and the count of nodes
366 that were added or removed at each site.
367 """
Scott Baker6253dfc2014-04-14 09:29:30 -0700368 def post(self, request, *args, **kwargs):
Scott Bakerbd57a432014-04-14 16:12:15 -0700369 siteName = request.POST.get("siteName", None)
370 actionToDo = request.POST.get("actionToDo", None)
371 count = int(request.POST.get("count","0"))
372 sliceName = request.POST.get("slice", None)
Scott Bakere4deddd2014-04-14 16:48:05 -0700373 noAct = request.POST.get("noAct", False)
Scott Bakerbd57a432014-04-14 16:12:15 -0700374
375 if not sliceName:
376 return HttpResponseServerError("No slice name given")
377
378 slice = Slice.objects.get(name=sliceName)
379
380 if siteName:
381 siteList = [Site.objects.get(name=siteName)]
382 else:
383 siteList = None
Scott Baker6253dfc2014-04-14 09:29:30 -0700384
385 if (actionToDo == "add"):
Scott Bakerbd57a432014-04-14 16:12:15 -0700386 user_ip = request.GET.get("ip", get_ip(request))
387 if (siteList is None):
388 siteList = tenant_pick_sites(user, user_ip, slice, count)
389
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700390 sitesChanged = slice_increase_slivers(request.user, user_ip, siteList, slice, count, noAct)
Scott Baker6253dfc2014-04-14 09:29:30 -0700391 elif (actionToDo == "rem"):
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700392 sitesChanged = slice_decrease_slivers(request.user, siteList, slice, count, noAct)
Scott Bakerbd57a432014-04-14 16:12:15 -0700393 else:
394 return HttpResponseServerError("Unknown actionToDo %s" % actionToDo)
395
Scott Bakere4deddd2014-04-14 16:48:05 -0700396 return HttpResponse(json.dumps(sitesChanged), mimetype='application/javascript')
Scott Bakerbd57a432014-04-14 16:12:15 -0700397
398 def get(self, request, *args, **kwargs):
399 request.POST = request.GET
400 return self.post(request, *args, **kwargs) # for testing REST in browser
401 #return HttpResponseServerError("GET is not supported")
402
403class TenantPickSitesView(View):
404 """ primarily just for testing purposes """
405 def get(self, request, *args, **kwargs):
406 count = request.GET.get("count","0")
407 slice = request.GET.get("slice",None)
408 if slice:
409 slice = Slice.objects.get(name=slice)
410 ip = request.GET.get("ip", get_ip(request))
411 sites = tenant_pick_sites(request.user, user_ip=ip, count=0, slice=slice)
412 sites = [x.name for x in sites]
413 return HttpResponse(json.dumps(sites), mimetype='application/javascript')
Scott Baker6253dfc2014-04-14 09:29:30 -0700414
Scott Baker771819b2014-03-19 22:10:17 -0700415class DashboardSummaryAjaxView(View):
416 def get(self, request, **kwargs):
Scott Baker0017c102014-04-18 10:48:31 -0700417 def avg(x):
418 return float(sum(x))/len(x)
419
420 sites = getCDNOperatorData().values()
421
422 sites = [site for site in sites if site["numHPCSlivers"]>0]
423
424 total_slivers = sum( [site["numHPCSlivers"] for site in sites] )
425 total_bandwidth = sum( [site["bandwidth"] for site in sites] )
426 average_cpu = int(avg( [site["load"] for site in sites] ))
427
428 result= {"total_slivers": total_slivers,
429 "total_bandwidth": total_bandwidth,
430 "average_cpu": average_cpu}
431
432 return HttpResponse(json.dumps(result), mimetype='application/javascript')
Scott Baker771819b2014-03-19 22:10:17 -0700433
434class DashboardAddOrRemoveSliverView(View):
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700435 # TODO: deprecate this view in favor of using TenantAddOrRemoveSliverView
436
Scott Baker771819b2014-03-19 22:10:17 -0700437 def post(self, request, *args, **kwargs):
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700438 siteName = request.POST.get("site", None)
Scott Baker771819b2014-03-19 22:10:17 -0700439 actionToDo = request.POST.get("actionToDo", "0")
440
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700441 siteList = [Site.objects.get(name=siteName)]
442 slice = Slice.objects.get(name="HyperCache")
443
Scott Baker771819b2014-03-19 22:10:17 -0700444 if (actionToDo == "add"):
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700445 user_ip = request.GET.get("ip", get_ip(request))
446 slice_increase_slivers(request.user, user_ip, siteList, slice, 1)
Scott Baker771819b2014-03-19 22:10:17 -0700447 elif (actionToDo == "rem"):
Scott Bakerfe6a7e12014-04-15 10:58:31 -0700448 slice_decrease_slivers(request.user, siteList, slice, 1)
Scott Baker771819b2014-03-19 22:10:17 -0700449
450 print '*' * 50
451 print 'Ask for site: ' + siteName + ' to ' + actionToDo + ' another HPC Sliver'
452 return HttpResponse('This is POST request ')
Siobhan Tully06d2c032014-02-23 23:48:52 -0500453
454class DashboardAjaxView(View):
455 def get(self, request, **kwargs):
456 return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
Scott Baker771819b2014-03-19 22:10:17 -0700457
458class DashboardAnalyticsAjaxView(View):
459 def get(self, request, name="hello_world", **kwargs):
460 if (name == "hpcSummary"):
461 return HttpResponse(json.dumps(hpc_wizard.get_hpc_wizard().get_summary_for_view()), mimetype='application/javascript')
462 elif (name == "hpcUserSite"):
463 return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript')
464 elif (name == "hpcMap"):
465 return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
466 elif (name == "bigquery"):
467 (mimetype, data) = DoPlanetStackAnalytics(request)
468 return HttpResponse(data, mimetype=mimetype)
469 else:
470 return HttpResponse(json.dumps("Unknown"), mimetype='application/javascript')
471