This patch adds support for reserving physical hosts to a list of specified 
users.  Changes are to rpyctypes.py and the scheduler (primitive.py).  
Currently, the user creating the VM will need to know what host has been 
reserved for him and will need to specify the host to send his vm to (with the 
--hints targetHost=hostname option).  


Index: agents/primitive.py
===================================================================
--- agents/primitive.py (revision 904607)
+++ agents/primitive.py (working copy)
@@ -89,15 +89,26 @@
                                                        if (targetHost != None):
                                                                for h in 
hosts.values():
                                                                        if 
((str(h.id) == targetHost or h.name == targetHost)):
-                                                                               
if (h.up == True and h.state == HostState.Normal):
+                                                                               
#  make sure that host is up, in a normal state and is not reserved
+                                                                               
if (h.up == True and h.state == HostState.Normal and len(h.reserved) == 0):
                                                                                
        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 a host machine is reserved, only allow if userid is in reserved list
+                                                                               
if ((len(h.reserved) > 0) and inst.userId in h.reserved):
+                                                                               
        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 
(h.up == True and h.state == HostState.Normal):
+                                                                       if 
(h.up == True and h.state == HostState.Normal and len(h.reserved) == 0):
                                                                                
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)
Index: rpycservices/rpyctypes.py
===================================================================
--- rpycservices/rpyctypes.py   (revision 904599)
+++ rpycservices/rpyctypes.py   (working copy)
@@ -69,6 +69,7 @@
                self.cores = None
                self.version = None
                self.notes = None
+               self.reserved = []
                if isinstance(d, dict):
                        if 'id' in d:
                                self.id = d['id']
@@ -88,6 +89,8 @@
                                self.version = d['version']
                        if 'notes' in d:
                                self.notes = d['notes']
+                       if 'reserved' in d:
+                               self.reserved = d['reserved']
 
        def __str__(self): 
                return str(self.__dict__)



-- Richard Gass - <[email protected]> - - - - - - 
Future Technologies Research, Intel Labs Pittsburgh 
4720 Forbes Avenue, Suite 410 - T: +1 412 297 4203 
Pittsburgh, PA 15213, USA     - F: +1 412 297 4110


Reply via email to