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/02/20 18:38:00 UTC

svn commit: r746331 - in /incubator/tashi/trunk: etc/ src/tashi/client/ src/tashi/clustermanager/ src/tashi/clustermanager/data/ src/tashi/nodemanager/vmcontrol/ src/tashi/thrift/

Author: mryan3
Date: Fri Feb 20 18:37:59 2009
New Revision: 746331

URL: http://svn.apache.org/viewvc?rev=746331&view=rev
Log:
Removed the MachineType specification -- now users can specify memory and core count directly and independently, but maximum allowable values can be specified in the config file.


Modified:
    incubator/tashi/trunk/etc/TashiDefaults.cfg
    incubator/tashi/trunk/src/tashi/client/tashi-client.py
    incubator/tashi/trunk/src/tashi/clustermanager/clustermanagerservice.py
    incubator/tashi/trunk/src/tashi/clustermanager/data/datainterface.py
    incubator/tashi/trunk/src/tashi/clustermanager/data/fromconfig.py
    incubator/tashi/trunk/src/tashi/clustermanager/data/pickled.py
    incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/qemu.py
    incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/xenpv.py
    incubator/tashi/trunk/src/tashi/thrift/services.thrift

Modified: incubator/tashi/trunk/etc/TashiDefaults.cfg
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/etc/TashiDefaults.cfg?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/etc/TashiDefaults.cfg (original)
+++ incubator/tashi/trunk/etc/TashiDefaults.cfg Fri Feb 20 18:37:59 2009
@@ -27,6 +27,9 @@
 expireHostTime = 30.0
 allowDecayed = 30.0
 allowMismatchedVersions = False
+maxMemory = 7680
+maxCores = 8
+allowDuplicateNames = False
 ;bind = 0.0.0.0 ; not supported (Thrift is missing support to specify what to bind to!)
 
 [FromConfig]

Modified: incubator/tashi/trunk/src/tashi/client/tashi-client.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/client/tashi-client.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/client/tashi-client.py (original)
+++ incubator/tashi/trunk/src/tashi/client/tashi-client.py Fri Feb 20 18:37:59 2009
@@ -30,7 +30,6 @@
 from tashi import vmStates, hostStates, boolean, getConfig, stringPartition
 
 users = {}
-machineTypes = {}
 
 def fetchUsers():
 	if (users == {}):
@@ -38,12 +37,6 @@
 		for user in _users:
 			users[user.id] = user
 
-def fetchMachineTypes():
-	if (machineTypes == {}):
-		_machineTypes = client.getMachineTypes()
-		for machineType in _machineTypes:
-			machineTypes[machineType.id] = machineType
-
 def getUser():
 	fetchUsers()
 	userStr = os.getenv("USER", "unknown")
@@ -122,7 +115,6 @@
 		raise ValueError("Incorrect format for hints argument")
 
 def getVmLayout():
-	fetchMachineTypes()
 	_hosts = client.getHosts()
 	_instances = client.getInstances()
 	hosts = {}
@@ -133,8 +125,8 @@
 		hosts[h.id] = h
 	for i in _instances:
 		hosts[i.hostId].instances.append(i.id)
-		hosts[i.hostId].usedMemory += machineTypes[i.type].memory
-		hosts[i.hostId].usedCores += machineTypes[i.type].cores
+		hosts[i.hostId].usedMemory += i.memory
+		hosts[i.hostId].usedCores += i.cores
 	return hosts.values()
 
 def createMany(instance, count):
@@ -179,19 +171,19 @@
 
 # Used to specify what args are excepted for a function, what to use to convert the string to a value, what to use as a default value if it's missing, and whether the argument was required or not
 argLists = {
-'createVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False)],
-'createMany': [('userId', int, getUser, False), ('basename', str, lambda: requiredArg('basename'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False), ('count', int, lambda: requiredArg('count'), True)],
+'createVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('cores', int, lambda: 1, False), ('memory', int, lambda: 128, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False)],
+'createMany': [('userId', int, getUser, False), ('basename', str, lambda: requiredArg('basename'), True), ('cores', int, lambda: 1, False), ('memory', int, lambda: 128, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False), ('count', int, lambda: requiredArg('count'), True)],
 'shutdownVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
 'destroyVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
 'destroyMany': [('basename', str, lambda: requiredArg('basename'), True)],
 'suspendVm': [('instance', checkIid, lambda: requiredArg('instance'), True), ('destination', str, lambda: requiredArg('destination'), True)],
-'resumeVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('type', int, lambda: 1, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False), ('source', str, lambda: requiredArg('source'), True)],
+'resumeVm': [('userId', int, getUser, False), ('name', str, lambda: requiredArg('name'), True), ('cores', int, lambda: 1, False), ('memory', int, lambda: 128, False), ('disks', parseDisks, lambda: requiredArg('disks'), True), ('nics', parseNics, randomNetwork, False), ('hints', parseHints, lambda: {}, False), ('source', str, lambda: requiredArg('source'), True)],
 'migrateVm': [('instance', checkIid, lambda: requiredArg('instance'), True), ('targetHostId', int, lambda: requiredArg('targetHostId'), True)],
 'pauseVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
 'unpauseVm': [('instance', checkIid, lambda: requiredArg('instance'), True)],
-'getMachineTypes': [],
 'getHosts': [],
 'getUsers': [],
+'getNetworks': [],
 'getInstances': [],
 'getMyInstances': [],
 'getVmLayout': [],
@@ -200,13 +192,13 @@
 
 # Used to convert the dictionary built from the arguments into an object that can be used by thrift
 convertArgs = {
-'createVm': '[Instance(d={"userId":userId,"name":name,"type":type,"disks":disks,"nics":nics,"hints":hints})]',
-'createMany': '[Instance(d={"userId":userId,"name":basename,"type":type,"disks":disks,"nics":nics,"hints":hints}), count]',
+'createVm': '[Instance(d={"userId":userId,"name":name,"cores":cores,"memory":memory,"disks":disks,"nics":nics,"hints":hints})]',
+'createMany': '[Instance(d={"userId":userId,"name":basename,"cores":cores,"memory":memory,"disks":disks,"nics":nics,"hints":hints}), count]',
 'shutdownVm': '[instance]',
 'destroyVm': '[instance]',
 'destroyMany': '[basename]',
 'suspendVm': '[instance, destination]',
-'resumeVm': '[Instance(d={"userId":userId,"name":name,"type":type,"disks":disks,"nics":nics,"hints":hints}), source]',
+'resumeVm': '[Instance(d={"userId":userId,"name":name,"cores":cores,"memory":memory,"disks":disks,"nics":nics,"hints":hints}), source]',
 'migrateVm': '[instance, targetHostId]',
 'pauseVm': '[instance]',
 'unpauseVm': '[instance]',
@@ -215,7 +207,7 @@
 
 # Example use strings
 examples = {
-'createVm': ['--name foobar --disks i386-hardy.qcow2', '--userId 3 --name foobar --type 9 --disks mpi-hardy.qcow2:True,scratch.qcow2:False --nics 2:52:54:00:00:12:34,1:52:54:00:00:56:78 --hints enableDisplay=True'],
+'createVm': ['--name foobar --disks i386-hardy.qcow2', '--userId 3 --name foobar --cores 8 --memory 7168 --disks mpi-hardy.qcow2:True,scratch.qcow2:False --nics 2:52:54:00:00:12:34,1:52:54:00:00:56:78 --hints enableDisplay=True'],
 'createMany': ['--basename foobar --disks i386-hardy.qcow2 --count 4'],
 'shutdownVm': ['--instance 12345', '--instance foobar'],
 'destroyVm': ['--instance 12345', '--instance foobar'],
@@ -225,9 +217,9 @@
 'migrateVm': ['--instanc 12345 --targetHostId 73', '--instance foobar --targetHostId 73'],
 'pauseVm': ['--instance 12345', '--instance foobar'],
 'unpauseVm': ['---instance 12345', '--instance foobar'],
-'getMachineTypes': [''],
 'getHosts': [''],
 'getUsers': [''],
+'getNetworks': [''],
 'getInstances': [''],
 'getMyInstances': [''],
 'getVmLayout': [''],
@@ -264,7 +256,6 @@
 def transformState(obj):
 	if (type(obj) == Instance):
 		fetchUsers()
-		fetchMachineTypes()
 		obj.state = vmStates[obj.state]
 		if (obj.userId in users):
 			obj.user = users[obj.userId].name
@@ -273,8 +264,6 @@
 		obj.disk = obj.disks[0].uri
 		if (obj.disks[0].persistent):
 			obj.disk += ":True"
-		obj.memory = machineTypes[obj.type].memory
-		obj.cores = machineTypes[obj.type].cores
 	elif (type(obj) == Host):
 		obj.state = hostStates[obj.state]
 

Modified: incubator/tashi/trunk/src/tashi/clustermanager/clustermanagerservice.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/clustermanager/clustermanagerservice.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/clustermanager/clustermanagerservice.py (original)
+++ incubator/tashi/trunk/src/tashi/clustermanager/clustermanagerservice.py Fri Feb 20 18:37:59 2009
@@ -51,6 +51,9 @@
 		self.expireHostTime = float(self.config.get('ClusterManagerService', 'expireHostTime'))
 		self.allowDecayed = float(self.config.get('ClusterManagerService', 'allowDecayed'))
 		self.allowMismatchedVersions = boolean(self.config.get('ClusterManagerService', 'allowMismatchedVersions'))
+		self.maxMemory = int(self.config.get('ClusterManagerService', 'maxMemory'))
+		self.maxCores = int(self.config.get('ClusterManagerService', 'maxCores'))
+		self.allowDuplicateNames = boolean(self.config.get('ClusterManagerService', 'allowDuplicateNames'))
 		now = time.time()
 		for instance in self.data.getInstances().itervalues():
 			instanceId = instance.id
@@ -153,13 +156,33 @@
 				self.log.exception('Exception in monitorHosts')
 			time.sleep(sleepFor)
 	
+	def normalize(self, instance):
+		instance.vmId = None
+		instance.hostId = None
+		instance.decayed = False
+		instance.state = InstanceState.Pending
+		# At some point, check userId
+		if (not self.allowDuplicateNames):
+			for i in self.data.getInstances().itervalues():
+				if (i.name == instance.name):
+					raise TashiException(d={'errno':Errors.InvalidInstance,'msg':"The name %s is already in use" % (instance.name)})
+		if (instance.cores < 1):
+			raise TashiException(d={'errno':Errors.InvalidInstance,'msg':"Number of cores must be >= 1"})
+		if (instance.cores > self.maxCores):
+			raise TashiException(d={'errno':Errors.InvalidInstance,'msg':"Number of cores must be <= %d" % (self.maxCores)})
+		if (instance.memory < 1):
+			raise TashiException(d={'errno':Errors.InvalidInstance,'msg':"Amount of memory must be >= 1"})
+		if (instance.memory > self.maxMemory):
+			raise TashiException(d={'errno':Errors.InvalidInstance,'msg':"Amount of memory must be <= %d" % (self.maxMemory)})
+		# Make sure disk spec is valid
+		# Make sure network spec is valid
+		# Ignore hints
+		return instance
+	
 	@RPC
 	def createVm(self, instance):
 		"""Function to add a VM to the list of pending VMs"""
-		instance.state = InstanceState.Pending
-		# XXX: Synchronize on MachineType
-		instance.typeObj = self.data.getMachineTypes()[instance.type]
-		instance.decayed = False
+		instance = self.normalize(instance)
 		instance = self.data.registerInstance(instance)
 		self.data.releaseInstance(instance)
 		return instance
@@ -213,8 +236,6 @@
 	@RPC
 	def resumeVm(self, instance, source):
 		instance.state = InstanceState.Pending
-		# XXX: Synchronize on MachineType
-		instance.typeObj = self.data.getMachineTypes()[instance.type]
 		instance.decayed = False
 		instance.hints['__resume_source'] = source
 		instance = self.data.registerInstance(instance)
@@ -296,10 +317,6 @@
 		return
 	
 	@RPC
-	def getMachineTypes(self):
-		return self.data.getMachineTypes().values()
-	
-	@RPC
 	def getHosts(self):
 		return self.data.getHosts().values()
 	
@@ -313,17 +330,7 @@
 	
 	@RPC
 	def getInstances(self):
-		instances = self.data.getInstances().values()
-		for instance in instances:
-			if (instance.hostId):
-				instance.hostObj = self.data.getHost(instance.hostId)
-			else:
-				instance.hostObj = None
-			if (instance.userId):
-				instance.userObj = self.data.getUser(instance.userId)
-			else:
-				instance.userObj = None
-		return instances
+		return self.data.getInstances().values()
 	
 	@RPC
 	def vmmSpecificCall(self, instanceId, arg):

Modified: incubator/tashi/trunk/src/tashi/clustermanager/data/datainterface.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/clustermanager/data/datainterface.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/clustermanager/data/datainterface.py (original)
+++ incubator/tashi/trunk/src/tashi/clustermanager/data/datainterface.py Fri Feb 20 18:37:59 2009
@@ -52,12 +52,6 @@
 	def getInstance(self, id):
 		raise NotImplementedError
 	
-	def getMachineTypes(self):
-		raise NotImplementedError
-	
-	def getMachineType(self, id):
-		raise NotImplementedError
-	
 	def getNetworks(self):
 		raise NotImplementedError
 	

Modified: incubator/tashi/trunk/src/tashi/clustermanager/data/fromconfig.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/clustermanager/data/fromconfig.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/clustermanager/data/fromconfig.py (original)
+++ incubator/tashi/trunk/src/tashi/clustermanager/data/fromconfig.py Fri Feb 20 18:37:59 2009
@@ -25,7 +25,6 @@
 		DataInterface.__init__(self, config)
 		self.hosts = {}
 		self.instances = {}
-		self.machineTypes = {}
 		self.networks = {}
 		self.users = {}
 #		self.locks = {}
@@ -44,11 +43,6 @@
 				host._lock = threading.Lock()
 				self.lockNames[host._lock] = "h%d" % (host.id)
 				self.hosts[host.id] = host
-			if (name.startswith("machinetype")):
-				machineType = eval(value)
-				if (machineType.__class__ is not MachineType):
-					raise ValueError, "Entry %s is not a MachineType" % (name)
-				self.machineTypes[machineType.id] = machineType
 			if (name.startswith("network")):
 				network = eval(value)
 				if (network.__class__ is not Network):
@@ -151,12 +145,6 @@
 			raise TashiException(d={'errno':Errors.NoSuchInstanceId,'msg':"No such instanceId - %d" % (id)})
 		return instance
 	
-	def getMachineTypes(self):
-		return self.machineTypes
-	
-	def getMachineType(self, id):
-		return self.machineTypes[id]
-	
 	def getNetworks(self):
 		return self.networks
 	

Modified: incubator/tashi/trunk/src/tashi/clustermanager/data/pickled.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/clustermanager/data/pickled.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/clustermanager/data/pickled.py (original)
+++ incubator/tashi/trunk/src/tashi/clustermanager/data/pickled.py Fri Feb 20 18:37:59 2009
@@ -38,9 +38,6 @@
 		ci = {}
 		for i in self.instances.itervalues():
 			i2 = Instance(d=i.__dict__)
-			i2.hostObj = None
-			i2.typeObj = None
-			i2.userObj = None
 			ci[i2.id] = i2
 		return ci
 	
@@ -53,19 +50,18 @@
 	
 	def save(self):
 		file = open(self.file, "w")
-		cPickle.dump((self.cleanHosts(), self.cleanInstances(), self.machineTypes, self.networks, self.users), file)
+		cPickle.dump((self.cleanHosts(), self.cleanInstances(), self.networks, self.users), file)
 		file.close()
 
 	def load(self):
 		if (os.access(self.file, os.F_OK)):
 			file = open(self.file, "r")
-			(hosts, instances, machineTypes, networks, users) = cPickle.load(file)
+			(hosts, instances, networks, users) = cPickle.load(file)
 			file.close()
 		else:
-			(hosts, instances, machineTypes, networks, users) = ({}, {}, {}, {}, {})
+			(hosts, instances, networks, users) = ({}, {}, {}, {})
 		self.hosts = hosts
 		self.instances = instances
-		self.machineTypes = machineTypes
 		self.networks = networks
 		self.users = users
 		for i in self.instances.itervalues():

Modified: incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/qemu.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/qemu.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/qemu.py (original)
+++ incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/qemu.py Fri Feb 20 18:37:59 2009
@@ -379,8 +379,8 @@
 			raise NotImplementedError
 		image = instance.disks[0].uri
 		macAddr = instance.nics[0].mac
-		memory = instance.typeObj.memory
-		cores = instance.typeObj.cores
+		memory = instance.memory
+		cores = instance.cores
 		if (instance.disks[0].persistent):
 			diskModel = "persistent"
 		else:
@@ -395,11 +395,10 @@
 		instance = self.anonClass()
 		instance.disks = [self.anonClass()]
 		instance.nics = [self.anonClass()]
-		instance.typeObj = self.anonClass()
 		instance.disks[0].uri = image
 		instance.nics[0].mac = macAddr
-		instance.typeObj.memory = memory
-		instance.typeObj.cores = cores
+		instance.memory = memory
+		instance.cores = cores
 		instance.disks[0].persistent = (diskModel == "persistent")
 		instance.id = -1
 		instance.hints = opts

Modified: incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/xenpv.py
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/xenpv.py?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/xenpv.py (original)
+++ incubator/tashi/trunk/src/tashi/nodemanager/vmcontrol/xenpv.py Fri Feb 20 18:37:59 2009
@@ -25,7 +25,7 @@
 
 from vmcontrolinterface import VmControlInterface
 from tashi.services.ttypes import Errors, InstanceState, TashiException
-from tashi.services.ttypes import Instance, MachineType, Host
+from tashi.services.ttypes import Instance, Host
 from tashi import boolean, convertExceptions, ConnectionManager
 from tashi.util import isolatedRPC
 
@@ -87,9 +87,8 @@
 		instance.state = InstanceState.Running
 		if(vminfo['state'][2] !='-'):
 			instance.state = InstanceState.Paused
-		instance.typeObj = MachineType()
-		instance.typeObj.memory = int(vminfo['memory'])
-		instance.typeObj.cores = int(vminfo['cores'])
+		instance.memory = int(vminfo['memory'])
+		instance.cores = int(vminfo['cores'])
 		instance.disks = []
 
 		r[instance.vmId] = instance
@@ -213,8 +212,8 @@
 		fn = self.createXenConfig(name, 
 					  instance.disks[0].local, 
 					  instance.nics[0].mac, 
-					  instance.typeObj.memory,
-					  instance.typeObj.cores)
+					  instance.memory,
+					  instance.cores)
 		cmd = "xm create %s"%fn
 		r = os.system(cmd)
 #		self.deleteXenConfig(name)

Modified: incubator/tashi/trunk/src/tashi/thrift/services.thrift
URL: http://svn.apache.org/viewvc/incubator/tashi/trunk/src/tashi/thrift/services.thrift?rev=746331&r1=746330&r2=746331&view=diff
==============================================================================
--- incubator/tashi/trunk/src/tashi/thrift/services.thrift (original)
+++ incubator/tashi/trunk/src/tashi/thrift/services.thrift Fri Feb 20 18:37:59 2009
@@ -25,7 +25,8 @@
 	InstanceIdAlreadyExists = 7,
 	HostNameMismatch = 8,
 	HostNotUp = 9,
-	HostStateError = 10
+	HostStateError = 10,
+	InvalidInstance = 11
 }
 
 enum InstanceState {
@@ -79,13 +80,6 @@
 	2:string name
 }
 
-struct MachineType {
-	1:i32 id,
-	2:string name,
-	3:i32 memory,
-	4:i32 cores
-}
-
 struct DiskConfiguration {
 	1:string uri,
 	2:bool persistent
@@ -100,17 +94,15 @@
 	1:i32 id,
 	2:i32 vmId,
 	3:i32 hostId,
-	4:Host hostObj,
-	5:bool decayed,
-	6:InstanceState state,
-	7:i32 userId,
-	8:User userObj,
-	9:string name, // User specified
-	10:i32 type, // User specified
-	11:MachineType typeObj,
-	12:list<DiskConfiguration> disks, // User specified
-	13:list<NetworkConfiguration> nics // User specified
-	14:map<string, string> hints // User specified
+	4:bool decayed,
+	5:InstanceState state,
+	6:i32 userId,
+	7:string name, // User specified
+	8:i32 cores, // User specified
+	9:i32 memory, // User specified
+	10:list<DiskConfiguration> disks, // User specified
+	11:list<NetworkConfiguration> nics // User specified
+	12:map<string, string> hints // User specified
 }
 
 service clustermanagerservice {
@@ -128,7 +120,6 @@
 	void pauseVm(1:i32 instanceId) throws (1:TashiException e)
 	void unpauseVm(1:i32 instanceId) throws (1:TashiException e)
 	
-	list<MachineType> getMachineTypes() throws (1:TashiException e)
 	list<Host> getHosts() throws (1:TashiException e)
 	list<Network> getNetworks() throws (1:TashiException e)
 	list<User> getUsers() throws (1:TashiException e)