only use hpc events in cdn operator display
[plstackapi.git] / planetstack / core / plus / views.py
index 2b015ef..9c1bebc 100644 (file)
@@ -63,15 +63,43 @@ class TenantCreateSlice(View):
         serviceClass = request.POST.get("serviceClass", "0")
         imageName = request.POST.get("imageName", "0")
         actionToDo = request.POST.get("actionToDo", "0")
-        print sliceName
+        network = request.POST.get("network","0")
+        mountDataSets = request.POST.get("mountDataSets","0")
         if (actionToDo == "add"):
            serviceClass = ServiceClass.objects.get(name=serviceClass)
            site = request.user.site
-           #image = Image.objects.get(name=imageName)
-           newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=imageName)
+           image = Image.objects.get(name=imageName)
+           newSlice = Slice(name=sliceName,serviceClass=serviceClass,site=site,imagePreference=image,mountDataSets=mountDataSets,network=network)
            newSlice.save()
-        return newSlice
-
+        return HttpResponse("Slice created")
+
+class TenantUpdateSlice(View):
+    def post(self, request, *args, **kwargs):\r
+        sliceName = request.POST.get("sliceName", "0")\r
+        serviceClass = request.POST.get("serviceClass", "0")\r
+        imageName = request.POST.get("imageName", "0")\r
+        actionToDo = request.POST.get("actionToDo", "0")\r
+        network = request.POST.get("network","0")\r
+        dataSet = request.POST.get("dataSet","0")\r
+        slice = Slice.objects.all()\r
+        for entry in slice:\r
+                serviceClass = ServiceClass.objects.get(name=serviceClass)\r
+                if(entry.name==sliceName):\r
+                         if (actionToDo == "update"):\r
+                                setattr(entry,'serviceClass',serviceClass)\r
+                                setattr(entry,'imagePreference',imageName)\r
+                                setattr(entry,'network',network)\r
+                                setattr(entry,'mountDataSets',dataSet)\r
+                                entry.save()\r
+                                break\r
+        return HttpResponse("Slice updated")\r
+\r
+def  update_slice(sliceName,**fields):
+         slice = Slice.objects.filter(name = sliceName)\r
+         for (k,v) in fields.items():\r
+                setattr(slice, k, v)\r
+                slice.save()\r
+         return slice
 
 def getTenantSliceInfo(user, tableFormat = False):
     tenantSliceDetails = {}
@@ -99,17 +127,21 @@ def getTenantInfo(user):
        slice = Slice.objects.get(name=Slice.objects.get(id=entry.id).name)
        sliceServiceClass = entry.serviceClass.name
        preferredImage =  entry.imagePreference
+       sliceDataSet = entry.mountDataSets
+       sliceNetwork = entry.network
        numSliver = 0
        sliceImage=""
        sliceSite = {}
+       sliceNode = {}
+       sliceInstance= {}
        for sliver in slice.slivers.all():
-            numSliver +=sliver.numberCores
-           # sliceSite[sliver.deploymentNetwork.name] =sliceSite.get(sliver.deploymentNetwork.name,0) + 1
            if sliver.node.site.name in BLESSED_SITES:
                 sliceSite[sliver.node.site.name] = sliceSite.get(sliver.node.site.name,0) + 1
                 sliceImage = sliver.image.name
+                sliceNode[str(sliver)] = sliver.node.name
+       numSliver = sum(sliceSite.values())
        numSites = len(sliceSite)
-       userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver})
+       userSliceInfo.append({'sliceName': sliceName,'sliceServiceClass': sliceServiceClass,'preferredImage':preferredImage,'numOfSites':numSites, 'sliceSite':sliceSite,'sliceImage':sliceImage,'numOfSlivers':numSliver,'sliceDataSet':sliceDataSet,'sliceNetwork':sliceNetwork, 'instanceNodePair':sliceNode})
     return userSliceInfo
 
 def getTenantSitesInfo():
@@ -134,16 +166,16 @@ def getServiceClassInfo(user):
     return sliceInfo
 
 def getImageInfo(user):
-    #imageList = Image.objects.all()
-    imageList = ['Fedora 16 LXC rev 1.3','Hadoop','MPI']
+    imageList = Image.objects.all()
+    #imageList = ['Fedora 16 LXC rev 1.3','Hadoop','MPI']
     imageInfo = []
     for imageEntry in imageList:
-          #imageInfo.append({'Image':imageEntry.name})
-          imageInfo.append({'Image':imageEntry})
+          imageInfo.append({'Image':imageEntry.name})
+          #imageInfo.append({'Image':imageEntry})
     return imageInfo
 
 def getMountDataSets():
-        dataSetList = ['GenBank','LSST','LHC','NOAA','Measurement Lab','Common Crawl']\r
+        dataSetList = ['------','GenBank','LSST','LHC','NOAA','Measurement Lab','Common Crawl']\r
         dataSetInfo = []\r
         for entry in dataSetList:\r
                 dataSetInfo.append({'DataSet':entry})\r
@@ -208,16 +240,19 @@ def getCDNOperatorData(randomizeData = False, wait=True):
 
     rows = bq.get_cached_query_results(bq.compose_latest_query(groupByFields=["%hostname", "event", "%slice"]), wait)
 
-    # if wait==False, then we could have no rows yet
+    # wait=False on the first time the Dashboard is opened. This means we might
+    # not have any rows yet. The dashboard code polls every 30 seconds, so it
+    # will eventually pick them up.
 
-    stats_rows = {}
     if rows:
-        rows = bq.postprocess_results(rows, filter={"slice": HPC_SLICE_NAME}, maxi=["cpu"], count=["hostname"], computed=["bytes_sent/elapsed"], groupBy=["Time","site"], maxDeltaTime=80)
+        rows = bq.postprocess_results(rows, filter={"event": "hpc_heartbeat"}, maxi=["cpu"], count=["hostname"], computed=["bytes_sent/elapsed"], groupBy=["Time","site"], maxDeltaTime=80)
 
         # dictionaryize the statistics rows by site name
         stats_rows = {}
         for row in rows:
             stats_rows[row["site"]] = row
+    else:
+        stats_rows = {}
 
     slice = Slice.objects.get(name=HPC_SLICE_NAME)
     slice_slivers = list(slice.slivers.all())
@@ -290,12 +325,12 @@ class TenantViewData(View):
         return HttpResponse(json.dumps(getTenantSliceInfo(request.user, True)), mimetype='application/javascript')
 
 def haversine(site_lat, site_lon, lat, lon):
-    site_lat = float(site_lat)
-    site_lon = float(site_lon)
-    lat = float(lat)
-    lon = float(lon)
     d=0
     if lat and lon and site_lat and site_lon:
+        site_lat = float(site_lat)
+        site_lon = float(site_lon)
+        lat = float(lat)
+        lon = float(lon)
         R = 6378.1
         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)
         c = 2 * math.atan2( math.sqrt(a), math.sqrt(1 - a) )
@@ -406,6 +441,7 @@ class TenantDeleteSliceView(View):
                 print slice, slice.id\r
                 sliceToDel=Slice(name=sliceName, id=slice.id)\r
                 sliceToDel.delete()
+                return HttpResponse("Slice deleted")
 
 class TenantAddOrRemoveSliverView(View):
     """ Add or remove slivers from a Slice