-def tenant_increase_slivers(user, siteName, slice, count):
- site = Site.objects.filter(name=siteName)
- nodes = Node.objects.filter(site=site)
- print nodes
- site.usedNodes = []
- site.freeNodes = []
- sliceName = Slice.objects.get(name=slice)
- for node in nodes:
- usedNode = False
- for sliver in node.slivers.all():
- if sliver in Sliver.objects.filter(slice=sliceName):
- usedNode = True
- if usedNode:
- site.usedNodes.append(node)
- print site.usedNodes
- else:
- site.freeNodes.append(node)
- print site
- slices =Slice.objects.all()
- sliceName = Slice.objects.get(name=slice)
- test = Sliver.objects.filter(slice=sliceName)
- while (len(site.freeNodes) > 0) and (count > 0):
- node = site.freeNodes.pop()
- hostname = node.name
- sliver = Sliver(name=node.name,
- slice=sliceName,
- node=node,
- image = Image.objects.all()[0],
- creator = User.objects.get(email=user),
- deploymentNetwork=node.deployment,
- numberCores =1 )
- sliver.save()
-
- print "created sliver", sliver
- print sliver.node
- print sliver.numberCores
- site.usedNodes.append(node)
- count = int(count) - 1
-
-def tenant_decrease_slivers(user, siteName, slice, count):
- site = Site.objects.filter(name=siteName)
- nodes = Node.objects.filter(site=site)
- slices = Slice.objects.all()
- site.usedNodes = []
- site.freeNodes = []
- sliceName = Slice.objects.get(name=slice)
-
- for node in nodes:
- usedNode = False
+ALLOWED_TENANT_SITES = ["Stanford", "Washington", "Princeton", "GeorgiaTech", "MaxPlanck"]
+
+def siteSortKey(site, slice=None, count=None, lat=None, lon=None):
+ # try to pick a site we're already using
+ has_slivers_here=False
+ if slice:
+ for sliver in slice.slivers.all():
+ if sliver.node.site.name == site.name:
+ has_slivers_here=True
+
+ # Haversine method
+ d = 0
+ site_lat = site.location.latitude
+ site_lon = site.location.longitude
+ if lat and lon and site_lat and site_lon:
+ site_lat = float(site_lat)
+ site_lon = float(site_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) )
+ d = R * c
+
+ return (-has_slivers_here, d)
+
+def tenant_pick_sites(user, user_ip=None, slice=None, count=None):
+ """ Returns list of sites, sorted from most favorable to least favorable """
+ lat=None
+ lon=None
+ try:
+ client_geo = GeoIP().city(user_ip)
+ if client_geo:
+ lat=float(client_geo["latitude"])
+ lon=float(client_geo["longitude"])
+ except:
+ print "exception in geo code"
+ traceback.print_exc()
+
+ sites = Site.objects.all()
+ sites = [x for x in sites if x.name in ALLOWED_TENANT_SITES]
+ sites = sorted(sites, key=functools.partial(siteSortKey, slice=slice, count=count, lat=lat, lon=lon))
+
+ return sites
+
+def tenant_increase_slivers(user, user_ip, siteList, slice, count):
+ # let's compute how many slivers are in use in each node of each site
+ for site in siteList:
+ site.nodeList = list(site.nodes.all())
+ for node in site.nodeList:
+ node.sliverCount = 0