4 from django.views.generic import TemplateView, View
6 from pprint import pprint
8 from core.models import *
9 from django.http import HttpResponse
10 from django.core import urlresolvers
14 if os.path.exists("/home/smbaker/projects/vicci/cdn/bigquery"):
15 sys.path.append("/home/smbaker/projects/vicci/cdn/bigquery")
17 sys.path.append("/opt/planetstack/hpc_wizard")
19 from planetstack_analytics import DoPlanetStackAnalytics
21 class DashboardWelcomeView(TemplateView):
22 template_name = 'admin/dashboard/welcome.html'
24 def get(self, request, *args, **kwargs):
25 context = self.get_context_data(**kwargs)
26 userDetails = getUserSliceInfo(request.user)
27 #context['site'] = userDetails['site']
29 context['userSliceInfo'] = userDetails['userSliceInfo']
30 context['cdnData'] = userDetails['cdnData']
31 return self.render_to_response(context=context)
33 def getUserSliceInfo(user, tableFormat = False):
36 # // site = Site.objects.filter(id=user.site.id)
38 # // site = Site.objects.filter(name="Princeton")
39 # // userDetails['sitename'] = site[0].name
40 # // userDetails['siteid'] = site[0].id
42 userSliceData = getSliceInfo(user)
44 # pprint("******* GET USER SLICE INFO")
45 userDetails['userSliceInfo'] = userSliceTableFormatter(userSliceData)
47 userDetails['userSliceInfo'] = userSliceData
48 userDetails['cdnData'] = getCDNOperatorData();
49 # pprint( userDetails)
52 class 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")
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)
68 def getTenantSliceInfo(user, tableFormat = False):
69 tenantSliceDetails = {}
70 tenantSliceData = getTenantInfo(user)
71 tenantServiceClassData = getServiceClassInfo(user)
73 tenantSliceDetails['userSliceInfo'] = userSliceTableFormatter(tenantSliceData)
74 tenantSliceDetails['sliceServiceClass']=userSliceTableFormatter(tenantServiceClassData)
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
85 def getTenantInfo(user):
86 slices =Slice.objects.all()
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
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})
104 def getTenantSitesInfo():
106 for entry in Site.objects.all():
107 tenantSiteInfo.append({'siteName':entry.name})
108 return tenantSiteInfo
110 def userSliceTableFormatter(data):
117 def getServiceClassInfo(user):
118 serviceClassList = ServiceClass.objects.all()
120 for entry in serviceClassList:
121 sliceInfo.append({'serviceClass':entry.name})
124 def getImageInfo(user):
125 imageList = Image.objects.all()
127 for imageEntry in imageList:
128 imageInfo.append({'Image':imageEntry.name})
131 def getNetworkInfo(user):
132 #networkList = Network.objects.all()
133 networkList = ['Private Only','Private and Publicly Routable']
135 for networkEntry in networkList:
136 #networkInfo.append({'Network':networkEntry.name})
137 networkInfo.append({'Network':networkEntry})
140 def getDeploymentSites():
141 deploymentList = Deployment.objects.all()
143 for entry in deploymentList:
144 deploymentInfo.append({'DeploymentSite':entry.name})
145 return deploymentInfo
147 def getSliceInfo(user):
148 sliceList = Slice.objects.all()
149 slicePrivs = SlicePrivilege.objects.filter(user=user)
151 for entry in slicePrivs:
153 slicename = Slice.objects.get(id=entry.slice.id).name
154 slice = Slice.objects.get(name=Slice.objects.get(id=entry.slice.id).name)
155 sliverList=Sliver.objects.all()
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
161 sliceid = Slice.objects.get(id=entry.slice.id).id
163 sliverList = Sliver.objects.filter(slice=entry.slice.id)
166 if x.node.site not in siteList:
167 siteList[x.node.site] = 1
168 slivercount = len(sliverList)
169 sitecount = len(siteList)
171 traceback.print_exc()
175 userSliceInfo.append({'slicename': slicename, 'sliceid':sliceid,
176 'sitesUsed':sites_used,
177 'role': SliceRole.objects.get(id=entry.role.id).role,
178 'slivercount': slivercount,
179 'sitecount':sitecount})
183 def getCDNOperatorData(randomizeData = False):
184 return hpc_wizard.get_hpc_wizard().get_sites_for_view()
186 def getPageSummary(request):
187 slice = request.GET.get('slice', None)
188 site = request.GET.get('site', None)
189 node = request.GET.get('node', None)
192 class 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():
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"])
206 text += "</body></html>"
207 return HttpResponse(text)
209 class DashboardUserSiteView(View):
210 def get(self, request, **kwargs):
211 return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript')
213 class TenantViewData(View):
214 def get(self, request, **kwargs):
215 return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript')
217 def tenant_increase_slivers(user, siteName, slice, count):
218 site = Site.objects.filter(name=siteName)
219 nodes = Node.objects.filter(site=site)
223 sliceName = Slice.objects.get(name=slice)
226 for sliver in node.slivers.all():
227 if sliver in Sliver.objects.filter(slice=sliceName):
230 site.usedNodes.append(node)
233 site.freeNodes.append(node)
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()
241 sliver = Sliver(name=node.name,
244 image = Image.objects.all()[0],
245 creator = User.objects.get(email=user),
246 deploymentNetwork=node.deployment,
250 print "created sliver", sliver
252 print sliver.numberCores
253 site.usedNodes.append(node)
254 count = int(count) - 1
256 def 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()
262 sliceName = Slice.objects.get(name=slice)
266 for sliver in node.slivers.all():
267 if sliver in Sliver.objects.filter(slice=sliceName):
270 site.usedNodes.append(node)
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)
278 node = site.usedNodes.pop()
281 for sliver in node.slivers.all():
282 if sliver.slice in slices:
283 print "deleting sliver", sliver.slice
285 site.freeNodes.append(node)
286 count = int(count) - 1
287 print "deleted sliver", sliver
289 class 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")
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 ')
302 class 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')
306 class DashboardAddOrRemoveSliverView(View):
307 def post(self, request, *args, **kwargs):
308 siteName = request.POST.get("site", "0")
309 actionToDo = request.POST.get("actionToDo", "0")
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)
317 print 'Ask for site: ' + siteName + ' to ' + actionToDo + ' another HPC Sliver'
318 return HttpResponse('This is POST request ')
320 class DashboardAjaxView(View):
321 def get(self, request, **kwargs):
322 return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
324 class 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)
336 return HttpResponse(json.dumps("Unknown"), mimetype='application/javascript')