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)