blob: 4211a30c9276e559e57536172e9c781f13808e73 [file] [log] [blame]
Siobhan Tullycf04fb62014-01-11 11:25:57 -05001#views.py
Scott Baker771819b2014-03-19 22:10:17 -07002import os
3import sys
Siobhan Tully06d2c032014-02-23 23:48:52 -05004from django.views.generic import TemplateView, View
5import datetime
Scott Baker771819b2014-03-19 22:10:17 -07006from pprint import pprint
7import json
Scott Baker537d8232014-04-08 23:40:56 -07008from core.models import *
Siobhan Tully06d2c032014-02-23 23:48:52 -05009from django.http import HttpResponse
Scott Baker537d8232014-04-08 23:40:56 -070010from django.core import urlresolvers
Scott Baker771819b2014-03-19 22:10:17 -070011import traceback
Scott Baker6253dfc2014-04-14 09:29:30 -070012import socket
Siobhan Tully06d2c032014-02-23 23:48:52 -050013
Scott Baker771819b2014-03-19 22:10:17 -070014if os.path.exists("/home/smbaker/projects/vicci/cdn/bigquery"):
15 sys.path.append("/home/smbaker/projects/vicci/cdn/bigquery")
16else:
17 sys.path.append("/opt/planetstack/hpc_wizard")
18import hpc_wizard
19from planetstack_analytics import DoPlanetStackAnalytics
Siobhan Tullycf04fb62014-01-11 11:25:57 -050020
21class DashboardWelcomeView(TemplateView):
22 template_name = 'admin/dashboard/welcome.html'
23
24 def get(self, request, *args, **kwargs):
25 context = self.get_context_data(**kwargs)
Scott Baker771819b2014-03-19 22:10:17 -070026 userDetails = getUserSliceInfo(request.user)
27 #context['site'] = userDetails['site']
Siobhan Tullycf04fb62014-01-11 11:25:57 -050028
Scott Baker771819b2014-03-19 22:10:17 -070029 context['userSliceInfo'] = userDetails['userSliceInfo']
30 context['cdnData'] = userDetails['cdnData']
Siobhan Tullycf04fb62014-01-11 11:25:57 -050031 return self.render_to_response(context=context)
Siobhan Tullye18b3442014-02-23 14:23:34 -050032
Scott Baker771819b2014-03-19 22:10:17 -070033def getUserSliceInfo(user, tableFormat = False):
34 userDetails = {}
35# try:
36# // site = Site.objects.filter(id=user.site.id)
37# // except:
38# // site = Site.objects.filter(name="Princeton")
39# // userDetails['sitename'] = site[0].name
40# // userDetails['siteid'] = site[0].id
41
42 userSliceData = getSliceInfo(user)
43 if (tableFormat):
44# pprint("******* GET USER SLICE INFO")
45 userDetails['userSliceInfo'] = userSliceTableFormatter(userSliceData)
46 else:
47 userDetails['userSliceInfo'] = userSliceData
48 userDetails['cdnData'] = getCDNOperatorData();
49# pprint( userDetails)
50 return userDetails
51
Scott Baker537d8232014-04-08 23:40:56 -070052class TenantCreateSlice(View):
53 def post(self, request, *args, **kwargs):
54 sliceName = request.POST.get("sliceName", "0")
55 serviceClass = request.POST.get("serviceClass", "0")
56 imageName = request.POST.get("imageName", "0")
57 actionToDo = request.POST.get("actionToDo", "0")
58 print sliceName
59 if (actionToDo == "add"):
60 serviceClass = ServiceClass.objects.get(name=serviceClass)
61 site = request.user.site
62 #image = Image.objects.get(name=imageName)
63 newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=imageName)
64 newSlice.save()
65 return newSlice
66
67
68def getTenantSliceInfo(user, tableFormat = False):
69 tenantSliceDetails = {}
70 tenantSliceData = getTenantInfo(user)
71 tenantServiceClassData = getServiceClassInfo(user)
72 if (tableFormat):
73 tenantSliceDetails['userSliceInfo'] = userSliceTableFormatter(tenantSliceData)
74 tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
75 else:
76 tenantSliceDetails['userSliceInfo'] = tenantSliceData
77 tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
78 tenantSliceDetails['image']=userSliceTableFormatter(getImageInfo(user))
79 tenantSliceDetails['network']=userSliceTableFormatter(getNetworkInfo(user))
80 tenantSliceDetails['deploymentSites']=userSliceTableFormatter(getDeploymentSites())
81 tenantSliceDetails['sites'] = userSliceTableFormatter(getTenantSitesInfo());
82 return tenantSliceDetails
83
84
85def getTenantInfo(user):
86 slices =Slice.objects.all()
87 userSliceInfo = []
88 for entry in slices:
89 sliceName = Slice.objects.get(id=entry.id).name
90 slice = Slice.objects.get(name=Slice.objects.get(id=entry.id).name)
91 sliceServiceClass = entry.serviceClass.name
92 preferredImage = entry.imagePreference
93 numSliver = 0
94 sliceImage=""
95 sliceSite = {}
96 for sliver in slice.slivers.all():
97 numSliver +=sliver.numberCores
98 # sliceSite[sliver.deploymentNetwork.name] =sliceSite.get(sliver.deploymentNetwork.name,0) + 1
99 sliceSite[sliver.node.site.name] = sliceSite.get(sliver.node.site.name,0) + 1
100 sliceImage = sliver.image.name
101 userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver})
102 return userSliceInfo
103
104def getTenantSitesInfo():
105 tenantSiteInfo=[]
106 for entry in Site.objects.all():
107 tenantSiteInfo.append({'siteName':entry.name})
108 return tenantSiteInfo
109
Scott Baker771819b2014-03-19 22:10:17 -0700110def userSliceTableFormatter(data):
111# pprint(data)
112 formattedData = {
113 'rows' : data
114 }
115 return formattedData
116
Scott Baker537d8232014-04-08 23:40:56 -0700117def getServiceClassInfo(user):
118 serviceClassList = ServiceClass.objects.all()
119 sliceInfo = []
120 for entry in serviceClassList:
121 sliceInfo.append({'serviceClass':entry.name})
122 return sliceInfo
123
124def getImageInfo(user):
125 imageList = Image.objects.all()
126 imageInfo = []
127 for imageEntry in imageList:
128 imageInfo.append({'Image':imageEntry.name})
129 return imageInfo
130
131def getNetworkInfo(user):
132 #networkList = Network.objects.all()
133 networkList = ['Private Only','Private and Publicly Routable']
134 networkInfo = []
135 for networkEntry in networkList:
136 #networkInfo.append({'Network':networkEntry.name})
137 networkInfo.append({'Network':networkEntry})
138 return networkInfo
139
140def getDeploymentSites():
141 deploymentList = Deployment.objects.all()
142 deploymentInfo = []
143 for entry in deploymentList:
144 deploymentInfo.append({'DeploymentSite':entry.name})
145 return deploymentInfo
146
Scott Baker771819b2014-03-19 22:10:17 -0700147def getSliceInfo(user):
Siobhan Tully06d2c032014-02-23 23:48:52 -0500148 sliceList = Slice.objects.all()
Scott Baker771819b2014-03-19 22:10:17 -0700149 slicePrivs = SlicePrivilege.objects.filter(user=user)
Siobhan Tully06d2c032014-02-23 23:48:52 -0500150 userSliceInfo = []
151 for entry in slicePrivs:
Siobhan Tullye18b3442014-02-23 14:23:34 -0500152
Scott Baker771819b2014-03-19 22:10:17 -0700153 slicename = Slice.objects.get(id=entry.slice.id).name
Scott Baker537d8232014-04-08 23:40:56 -0700154 slice = Slice.objects.get(name=Slice.objects.get(id=entry.slice.id).name)
155 sliverList=Sliver.objects.all()
156 sites_used = {}
157 for sliver in slice.slivers.all():
158 #sites_used['deploymentSites'] = sliver.node.deployment.name
159 # sites_used[sliver.image.name] = sliver.image.name
160 sites_used[sliver.node.site.name] = sliver.numberCores
Scott Baker771819b2014-03-19 22:10:17 -0700161 sliceid = Slice.objects.get(id=entry.slice.id).id
Siobhan Tully06d2c032014-02-23 23:48:52 -0500162 try:
Scott Baker771819b2014-03-19 22:10:17 -0700163 sliverList = Sliver.objects.filter(slice=entry.slice.id)
164 siteList = {}
165 for x in sliverList:
166 if x.node.site not in siteList:
167 siteList[x.node.site] = 1
168 slivercount = len(sliverList)
169 sitecount = len(siteList)
Siobhan Tully06d2c032014-02-23 23:48:52 -0500170 except:
Scott Baker771819b2014-03-19 22:10:17 -0700171 traceback.print_exc()
172 slivercount = 0
173 sitecount = 0
Siobhan Tully06d2c032014-02-23 23:48:52 -0500174
Scott Baker771819b2014-03-19 22:10:17 -0700175 userSliceInfo.append({'slicename': slicename, 'sliceid':sliceid,
Scott Baker537d8232014-04-08 23:40:56 -0700176 'sitesUsed':sites_used,
177 'role': SliceRole.objects.get(id=entry.role.id).role,
178 'slivercount': slivercount,
179 'sitecount':sitecount})
Scott Baker771819b2014-03-19 22:10:17 -0700180
Siobhan Tully06d2c032014-02-23 23:48:52 -0500181 return userSliceInfo
182
Siobhan Tully06d2c032014-02-23 23:48:52 -0500183def getCDNOperatorData(randomizeData = False):
Scott Baker771819b2014-03-19 22:10:17 -0700184 return hpc_wizard.get_hpc_wizard().get_sites_for_view()
Siobhan Tully06d2c032014-02-23 23:48:52 -0500185
Scott Baker771819b2014-03-19 22:10:17 -0700186def getPageSummary(request):
187 slice = request.GET.get('slice', None)
188 site = request.GET.get('site', None)
189 node = request.GET.get('node', None)
Siobhan Tully06d2c032014-02-23 23:48:52 -0500190
191
Scott Baker771819b2014-03-19 22:10:17 -0700192class SimulatorView(View):
193 def get(self, request, **kwargs):
194 sim = json.loads(file("/tmp/simulator.json","r").read())
195 text = "<html><head></head><body>"
196 text += "Iteration: %d<br>" % sim["iteration"]
197 text += "Elapsed since report %d<br><br>" % sim["elapsed_since_report"]
198 text += "<table border=1>"
199 text += "<tr><th>site</th><th>trend</th><th>weight</th><th>bytes_sent</th><th>hot</th></tr>"
200 for site in sim["site_load"].values():
201 text += "<tr>"
202 text += "<td>%s</td><td>%0.2f</td><td>%0.2f</td><td>%d</td><td>%0.2f</td>" % \
203 (site["name"], site["trend"], site["weight"], site["bytes_sent"], site["load_frac"])
204 text += "</tr>"
205 text += "</table>"
206 text += "</body></html>"
207 return HttpResponse(text)
208
209class DashboardUserSiteView(View):
210 def get(self, request, **kwargs):
211 return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript')
212
Scott Baker537d8232014-04-08 23:40:56 -0700213class TenantViewData(View):
214 def get(self, request, **kwargs):
215 return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript')
216
Scott Baker6253dfc2014-04-14 09:29:30 -0700217def tenant_increase_slivers(user, siteName, slice, count):
218 site = Site.objects.filter(name=siteName)
219 nodes = Node.objects.filter(site=site)
220 print nodes
221 site.usedNodes = []
222 site.freeNodes = []
223 sliceName = Slice.objects.get(name=slice)
224 for node in nodes:
225 usedNode = False
226 for sliver in node.slivers.all():
227 if sliver in Sliver.objects.filter(slice=sliceName):
228 usedNode = True
229 if usedNode:
230 site.usedNodes.append(node)
231 print site.usedNodes
232 else:
233 site.freeNodes.append(node)
234 print site
235 slices =Slice.objects.all()
236 sliceName = Slice.objects.get(name=slice)
237 test = Sliver.objects.filter(slice=sliceName)
238 while (len(site.freeNodes) > 0) and (count > 0):
239 node = site.freeNodes.pop()
240 hostname = node.name
241 sliver = Sliver(name=node.name,
242 slice=sliceName,
243 node=node,
244 image = Image.objects.all()[0],
245 creator = User.objects.get(email=user),
246 deploymentNetwork=node.deployment,
247 numberCores =1 )
248 sliver.save()
249
250 print "created sliver", sliver
251 print sliver.node
252 print sliver.numberCores
253 site.usedNodes.append(node)
254 count = int(count) - 1
255
256def tenant_decrease_slivers(user, siteName, slice, count):
257 site = Site.objects.filter(name=siteName)
258 nodes = Node.objects.filter(site=site)
259 slices = Slice.objects.all()
260 site.usedNodes = []
261 site.freeNodes = []
262 sliceName = Slice.objects.get(name=slice)
263
264 for node in nodes:
265 usedNode = False
266 for sliver in node.slivers.all():
267 if sliver in Sliver.objects.filter(slice=sliceName):
268 usedNode = True
269 if usedNode:
270 site.usedNodes.append(node)
271 else:
272 site.freeNodes.append(node)
273 print "used nodes", site.usedNodes
274 slices =Slice.objects.all()
275 sliceName = Slice.objects.get(name=slice)
276 test = Sliver.objects.filter(slice=sliceName)
277 while (count > 0):
278 node = site.usedNodes.pop()
279 print node
280 print count
281 for sliver in node.slivers.all():
282 if sliver.slice in slices:
283 print "deleting sliver", sliver.slice
284 sliver.delete()
285 site.freeNodes.append(node)
286 count = int(count) - 1
287 print "deleted sliver", sliver
288
289class TenantAddOrRemoveSliverView(View):
290 def post(self, request, *args, **kwargs):
291 siteName = request.POST.get("siteName", "0")
292 actionToDo = request.POST.get("actionToDo", "0")
293 count = request.POST.get("count","0")
294 slice = request.POST.get("slice","0")
295
296 if (actionToDo == "add"):
297 tenant_increase_slivers(request.user, siteName,slice, count)
298 elif (actionToDo == "rem"):
299 tenant_decrease_slivers(request.user,siteName,slice, count)
300 return HttpResponse('This is POST request ')
301
Scott Baker771819b2014-03-19 22:10:17 -0700302class DashboardSummaryAjaxView(View):
303 def get(self, request, **kwargs):
304 return HttpResponse(json.dumps(hpc_wizard.get_hpc_wizard().get_summary_for_view()), mimetype='application/javascript')
305
306class DashboardAddOrRemoveSliverView(View):
307 def post(self, request, *args, **kwargs):
308 siteName = request.POST.get("site", "0")
309 actionToDo = request.POST.get("actionToDo", "0")
310
311 if (actionToDo == "add"):
312 hpc_wizard.get_hpc_wizard().increase_slivers(siteName, 1)
313 elif (actionToDo == "rem"):
314 hpc_wizard.get_hpc_wizard().decrease_slivers(siteName, 1)
315
316 print '*' * 50
317 print 'Ask for site: ' + siteName + ' to ' + actionToDo + ' another HPC Sliver'
318 return HttpResponse('This is POST request ')
Siobhan Tully06d2c032014-02-23 23:48:52 -0500319
320class DashboardAjaxView(View):
321 def get(self, request, **kwargs):
322 return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
Scott Baker771819b2014-03-19 22:10:17 -0700323
324class DashboardAnalyticsAjaxView(View):
325 def get(self, request, name="hello_world", **kwargs):
326 if (name == "hpcSummary"):
327 return HttpResponse(json.dumps(hpc_wizard.get_hpc_wizard().get_summary_for_view()), mimetype='application/javascript')
328 elif (name == "hpcUserSite"):
329 return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript')
330 elif (name == "hpcMap"):
331 return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
332 elif (name == "bigquery"):
333 (mimetype, data) = DoPlanetStackAnalytics(request)
334 return HttpResponse(data, mimetype=mimetype)
335 else:
336 return HttpResponse(json.dumps("Unknown"), mimetype='application/javascript')
337