You are viewing a plain text version of this content. The canonical link for it is here.
Posted to tashi-commits@incubator.apache.org by mr...@apache.org on 2009/05/25 19:33:05 UTC

svn commit: r778478 - in /incubator/tashi/trunk: etc/TashiDefaults.cfg src/tashi/agents/primitive.py

Author: mryan3
Date: Mon May 25 19:33:05 2009
New Revision: 778478

URL: http://svn.apache.org/viewvc?rev=778478&view=rev
Log:
Added the ability for the basic scheduler to pack VMs in instead of spacing them out


Modified:
    incubator/tashi/trunk/etc/TashiDefaults.cfg
    incubator/tashi/trunk/src/tashi/agents/primitive.py

Modified: incubator/tashi/trunk/etc/TashiDefaults.cfg
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/etc/TashiDefaults.cfg?rev=778478&r1=778477&r2=778478&view=diff
==============================================================================
--- incubator/tashi/trunk/etc/TashiDefaults.cfg (original)
+++ incubator/tashi/trunk/etc/TashiDefaults.cfg Mon May 25 19:33:05 2009
@@ -113,6 +113,7 @@
 [Primitive]
 hook1 = tashi.agents.DhcpDns
 scheduleDelay = 2.0
+densePack = False
 
 [DhcpDns]
 dnsKeyFile = /location/of/private/key/for/dns

Modified: incubator/tashi/trunk/src/tashi/agents/primitive.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/agents/primitive.py?rev=778478&r1=778477&r2=778478&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/agents/primitive.py (original)
+++ incubator/tashi/trunk/src/tashi/agents/primitive.py Mon May 25 19:33:05 2009
@@ -36,6 +36,7 @@
 		self.hooks = []
 		self.log = logging.getLogger(__file__)
 		self.scheduleDelay = float(self.config.get("Primitive", "scheduleDelay"))
+		self.densePack = boolean(self.config.get("Primitive", "densePack"))
 		items = self.config.items("Primitive")
 		items.sort()
 		for item in items:
@@ -79,8 +80,8 @@
 					for i in load[None]:
 						inst = instances[i]
 						try:
-							min = None
-							minHost = None
+							minMax = None
+							minMaxHost = None
 							targetHost = inst.hints.get("targetHost", None)
 							try:
 								allowElsewhere = boolean(inst.hints.get("allowElsewhere", "False"))
@@ -88,27 +89,29 @@
 								allowElsewhere = False
 							if (targetHost != None):
 								for h in hosts.values():
-									if ((str(h.id) == targetHost or h.name == targetHost) and h.up == True and h.state == HostState.Normal):
-										memUsage = reduce(lambda x, y: x + instances[y].memory, load[h.id], inst.memory)
-										coreUsage = reduce(lambda x, y: x + instances[y].cores, load[h.id], inst.cores)
-										if (memUsage <= h.memory and coreUsage <= h.cores):
-											min = len(load[h.id])
-											minHost = h
-							if ((targetHost == None or allowElsewhere) and minHost == None):
+									if ((str(h.id) == targetHost or h.name == targetHost)):
+										if (h.up == True and h.state == HostState.Normal):
+											memUsage = reduce(lambda x, y: x + instances[y].memory, load[h.id], inst.memory)
+											coreUsage = reduce(lambda x, y: x + instances[y].cores, load[h.id], inst.cores)
+											if (memUsage <= h.memory and coreUsage <= h.cores):
+												minMax = len(load[h.id])
+												minMaxHost = h
+							if ((targetHost == None or allowElsewhere) and minMaxHost == None):
 								for h in hosts.values():
-									if ((min is None or len(load[h.id]) < min) and h.up == True and h.state == HostState.Normal):
-										memUsage = reduce(lambda x, y: x + instances[y].memory, load[h.id], inst.memory)
-										coreUsage = reduce(lambda x, y: x + instances[y].cores, load[h.id], inst.cores)
-										if (memUsage <= h.memory and coreUsage <= h.cores):
-											min = len(load[h.id])
-											minHost = h
-							if (minHost):
+									if (h.up == True and h.state == HostState.Normal):
+										if (minMax is None or (self.densePack and len(load[h.id]) > minMax) or (not self.densePack and len(load[h.id]) < minMax)):
+											memUsage = reduce(lambda x, y: x + instances[y].memory, load[h.id], inst.memory)
+											coreUsage = reduce(lambda x, y: x + instances[y].cores, load[h.id], inst.cores)
+											if (memUsage <= h.memory and coreUsage <= h.cores):
+												minMax = len(load[h.id])
+												minMaxHost = h
+							if (minMaxHost):
 								if (not inst.hints.get("__resume_source", None)):
 									for hook in self.hooks:
 										hook.preCreate(inst)
-								self.log.info("Scheduling instance %s on host %s" % (inst.name, minHost.name))	
-								self.client.activateVm(i, minHost)
-								load[minHost.id] = load[minHost.id] + [i]
+								self.log.info("Scheduling instance %s (%d mem, %d cores, %d uid) on host %s" % (inst.name, inst.memory, inst.cores, inst.userId, minMaxHost.name))	
+								self.client.activateVm(i, minMaxHost)
+								load[minMaxHost.id] = load[minMaxHost.id] + [i]
 							else:
 								self.log.info("Failed to find a suitable place to schedule %s" % (inst.name))
 						except Exception, e: