Amisha's latest changes to tenant view
[plstackapi.git] / planetstack / core / plus / views.py
1 #views.py
2 import os
3 import sys
4 from django.views.generic import TemplateView, View
5 import datetime
6 from pprint import pprint
7 import json
8 from core.models import *
9 from django.http import HttpResponse
10 from django.core import urlresolvers
11 import traceback
12 import socket
13
14 if os.path.exists("/home/smbaker/projects/vicci/cdn/bigquery"):
15     sys.path.append("/home/smbaker/projects/vicci/cdn/bigquery")
16 else:
17     sys.path.append("/opt/planetstack/hpc_wizard")
18 import hpc_wizard
19 from planetstack_analytics import DoPlanetStackAnalytics
20
21 class DashboardWelcomeView(TemplateView):
22     template_name = 'admin/dashboard/welcome.html'
23
24     def get(self, request, *args, **kwargs):
25         context = self.get_context_data(**kwargs)
26         userDetails = getUserSliceInfo(request.user)
27         #context['site'] = userDetails['site']
28
29         context['userSliceInfo'] = userDetails['userSliceInfo']
30         context['cdnData'] = userDetails['cdnData']
31         return self.render_to_response(context=context)
32
33 def 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
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")
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
68 def 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
85 def 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
104 def getTenantSitesInfo():
105         tenantSiteInfo=[]
106         for entry in Site.objects.all():
107                 tenantSiteInfo.append({'siteName':entry.name})
108         return tenantSiteInfo
109
110 def userSliceTableFormatter(data):
111 #    pprint(data)
112     formattedData = {
113                      'rows' : data
114                     }
115     return formattedData
116
117 def getServiceClassInfo(user):
118     serviceClassList = ServiceClass.objects.all()
119     sliceInfo = []
120     for entry in serviceClassList:
121           sliceInfo.append({'serviceClass':entry.name})
122     return sliceInfo
123
124 def getImageInfo(user):
125     imageList = Image.objects.all()
126     imageInfo = []
127     for imageEntry in imageList:
128           imageInfo.append({'Image':imageEntry.name})
129     return imageInfo
130
131 def 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
140 def getDeploymentSites():
141     deploymentList = Deployment.objects.all()
142     deploymentInfo = []
143     for entry in deploymentList:
144         deploymentInfo.append({'DeploymentSite':entry.name})
145     return deploymentInfo
146
147 def getSliceInfo(user):
148     sliceList = Slice.objects.all()
149     slicePrivs = SlicePrivilege.objects.filter(user=user)
150     userSliceInfo = []
151     for entry in slicePrivs:
152
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()
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
161         sliceid = Slice.objects.get(id=entry.slice.id).id
162         try:
163             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)
170         except:
171             traceback.print_exc()
172             slivercount = 0
173             sitecount = 0
174
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})
180
181     return userSliceInfo
182
183 def getCDNOperatorData(randomizeData = False):
184     return hpc_wizard.get_hpc_wizard().get_sites_for_view()
185
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)
190
191
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():
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
209 class DashboardUserSiteView(View):
210     def get(self, request, **kwargs):
211         return HttpResponse(json.dumps(getUserSliceInfo(request.user, True)), mimetype='application/javascript')
212
213 class TenantViewData(View):
214     def get(self, request, **kwargs):
215         return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript')
216
217 def 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
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()
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
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")
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
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')
305
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")
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 ')
319
320 class DashboardAjaxView(View):
321     def get(self, request, **kwargs):
322         return HttpResponse(json.dumps(getCDNOperatorData(True)), mimetype='application/javascript')
323
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)
335         else:
336             return HttpResponse(json.dumps("Unknown"), mimetype='application/javascript')
337