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 st...@apache.org on 2011/07/25 04:30:46 UTC

svn commit: r1150541 - /incubator/tashi/trunk/src/tashi/agents/primitive.py

Author: stroucki
Date: Mon Jul 25 04:30:46 2011
New Revision: 1150541

URL: http://svn.apache.org/viewvc?rev=1150541&view=rev
Log:
primitive: check if scheduling was successful
           put held VMs at the back of the queue to try them again

Modified:
    incubator/tashi/trunk/src/tashi/agents/primitive.py

Modified: incubator/tashi/trunk/src/tashi/agents/primitive.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/agents/primitive.py?rev=1150541&r1=1150540&r2=1150541&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/agents/primitive.py (original)
+++ incubator/tashi/trunk/src/tashi/agents/primitive.py Mon Jul 25 04:30:46 2011
@@ -31,9 +31,9 @@ from tashi.util import getConfig, create
 import tashi
 
 class Primitive(object):
-	def __init__(self, config, client):
+	def __init__(self, config, cmclient):
 		self.config = config
-		self.client = client
+		self.cm = cmclient
 		self.hooks = []
 		self.log = logging.getLogger(__file__)
 		self.scheduleDelay = float(self.config.get("Primitive", "scheduleDelay"))
@@ -45,7 +45,7 @@ class Primitive(object):
 			name = name.lower()
 			if (name.startswith("hook")):
 				try:
-					self.hooks.append(instantiateImplementation(value, config, client, False))
+					self.hooks.append(instantiateImplementation(value, config, cmclient, False))
 				except:
 					self.log.exception("Failed to load hook %s" % (value))
 	        self.hosts = {}
@@ -62,7 +62,7 @@ class Primitive(object):
 		# load's keys are the host id, or None if not on a host. values are instance ids
 		load = {}
 		ctr = 0
-		for h in self.client.getHosts():
+		for h in self.cm.getHosts():
 			#XXXstroucki get all hosts here?
 			#if (h.up == True and h.state == HostState.Normal):
 				hosts[ctr] = h
@@ -70,15 +70,21 @@ class Primitive(object):
 				load[h.id] = []
 			
 		load[None] = []
-		_instances = self.client.getInstances()
+		_instances = self.cm.getInstances()
 		instances = {}
 		for i in _instances:
 			instances[i.id] = i
+			
+		# XXXstroucki put held machines behind pending ones
+		heldInstances = []
 		for i in instances.itervalues():
-			# XXXstroucki: do we need to look at Held machines here?
 			if (i.hostId or i.state == InstanceState.Pending):
 				# Nonrunning VMs will have hostId of None
 				load[i.hostId] = load[i.hostId] + [i.id]
+			elif (i.hostId is None and i.state == InstanceState.Held):
+				heldInstances = heldInstances + [i.id]
+
+		load[None] = load[None] + heldInstances
 
 		self.hosts = hosts
 		self.load = load
@@ -117,7 +123,7 @@ class Primitive(object):
 						# XXXstroucki: Should we log something here for analysis?
 						break
 					if self.__checkCapacity(h, inst):
-						minMax = len(load[h.id])
+						minMax = len(self.load[h.id])
 						minMaxHost = h
 
 		
@@ -158,11 +164,15 @@ class Primitive(object):
 					for hook in self.hooks:
 						hook.preCreate(inst)
 				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(inst.id, minMaxHost)
-				self.load[minMaxHost.id] = self.load[minMaxHost.id] + [inst.id]
-				# get rid of its possible entry in muffle if VM is scheduled to a host
-				if (inst.name in self.muffle):
-					self.muffle.pop(inst.name)
+				rv = self.cm.activateVm(inst.id, minMaxHost)
+
+				if rv == "success":
+					self.load[minMaxHost.id] = self.load[minMaxHost.id] + [inst.id]
+					# get rid of its possible entry in muffle if VM is scheduled to a host
+					if (inst.name in self.muffle):
+						self.muffle.pop(inst.name)
+				else:
+					self.log.warning("Instance %s failed to activate on host %s" % (inst.name, minMaxHost.name))
 			else:
 				# did not find a host
 				if (inst.name not in self.muffle):
@@ -220,9 +230,9 @@ def main():
 	(config, configFiles) = getConfig(["Agent"])
 	publisher = instantiateImplementation(config.get("Agent", "publisher"), config)
 	tashi.publisher = publisher
-	client = createClient(config)
+	cmclient = createClient(config)
 	logging.config.fileConfig(configFiles)
-	agent = Primitive(config, client)
+	agent = Primitive(config, cmclient)
 	agent.start()
 
 if __name__ == "__main__":