[haizea-commit] r569 - in trunk/src/haizea: cli resourcemanager resourcemanager/scheduler

haizea-commit at mailman.cs.uchicago.edu haizea-commit at mailman.cs.uchicago.edu
Fri Feb 13 17:50:45 CST 2009


Author: borja
Date: 2009-02-13 17:50:43 -0600 (Fri, 13 Feb 2009)
New Revision: 569

Modified:
   trunk/src/haizea/cli/__init__.py
   trunk/src/haizea/cli/rpc_commands.py
   trunk/src/haizea/resourcemanager/accounting.py
   trunk/src/haizea/resourcemanager/configfile.py
   trunk/src/haizea/resourcemanager/leases.py
   trunk/src/haizea/resourcemanager/rm.py
   trunk/src/haizea/resourcemanager/rpcserver.py
   trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py
   trunk/src/haizea/resourcemanager/scheduler/slottable.py
   trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py
Log:
Lots of small fixes to issues uncovered by the tests and by pylint

Modified: trunk/src/haizea/cli/__init__.py
===================================================================
--- trunk/src/haizea/cli/__init__.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/cli/__init__.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -1,10 +1,14 @@
-from haizea.cli.optionparser import OptionParser
+from haizea.cli.optionparser import OptionParser, Option
 
 class Command(object):
     
     def __init__(self, argv):
         self.argv = argv
         self.optparser = OptionParser()
+        self.optparser.add_option(Option("-D", "--debug", action="store_true", dest="debug",
+                                         help = """
+                                         Run command in debug mode.
+                                         """))
         
     def parse_options(self):
         opt, args = self.optparser.parse_args(self.argv)

Modified: trunk/src/haizea/cli/rpc_commands.py
===================================================================
--- trunk/src/haizea/cli/rpc_commands.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/cli/rpc_commands.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -97,8 +97,15 @@
                                 self.opt.cpu, self.opt.mem, self.opt.vmimage, self.opt.vmimagesize)
             print "Lease submitted correctly."
             print "Lease ID: %i" % lease_id
+        except xmlrpclib.Fault, err:
+            print >> sys.stderr, "XMLRPC fault: %s" % err.faultString
+            if self.opt.debug:
+                raise
         except Exception, msg:
             print >> sys.stderr, "Error: %s" % msg
+            if self.opt.debug:
+                raise
+
         
 class haizea_cancel_lease(RPCCommand):
     """
@@ -122,8 +129,15 @@
         
         try:
             code = server.cancel_lease(self.opt.lease)
+        except xmlrpclib.Fault, err:
+            print >> sys.stderr, "XMLRPC fault: %s" % err.faultString
+            if self.opt.debug:
+                raise
         except Exception, msg:
             print >> sys.stderr, "Error: %s" % msg
+            if self.opt.debug:
+                raise
+
         
 class haizea_list_leases(RPCCommand):
     """
@@ -150,9 +164,16 @@
         try:
             leases = server.get_leases()
             console_table_printer(fields, leases)
+        except xmlrpclib.Fault, err:
+            print >> sys.stderr, "XMLRPC fault: %s" % err.faultString
+            if self.opt.debug:
+                raise
         except Exception, msg:
             print >> sys.stderr, "Error: %s" % msg
+            if self.opt.debug:
+                raise
 
+
 class haizea_list_hosts(RPCCommand):
     """
     List hosts managed by Haizea
@@ -176,8 +197,14 @@
         try:
             hosts = server.get_hosts()
             console_table_printer(fields, hosts)
+        except xmlrpclib.Fault, err:
+            print >> sys.stderr, "XMLRPC fault: %s" % err.faultString
+            if self.opt.debug:
+                raise
         except Exception, msg:
             print >> sys.stderr, "Error: %s" % msg
+            if self.opt.debug:
+                raise
 
 class haizea_show_queue(RPCCommand):
     """
@@ -207,9 +234,16 @@
                 print "Queue is empty."
             else:
                 console_table_printer(fields, leases)
+        except xmlrpclib.Fault, err:
+            print >> sys.stderr, "XMLRPC fault: %s" % err.faultString
+            if self.opt.debug:
+                raise
         except Exception, msg:
             print >> sys.stderr, "Error: %s" % msg
+            if self.opt.debug:
+                raise
 
+
 def console_table_printer(fields, values):
     print "\33[1m\33[4m",
     for (name,pname,width) in fields:

Modified: trunk/src/haizea/resourcemanager/accounting.py
===================================================================
--- trunk/src/haizea/resourcemanager/accounting.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/accounting.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -20,6 +20,7 @@
 import os.path
 import haizea.common.constants as constants
 from haizea.common.utils import pickle, get_config, get_clock
+from haizea.resourcemanager.leases import BestEffortLease
 from errno import EEXIST
 
 class AccountingData(object):
@@ -41,7 +42,7 @@
         waiting_times = {}
         for lease_id in self.leases:
             lease = self.leases[lease_id]
-            if isinstance(lease, ds.BestEffortLease):
+            if isinstance(lease, BestEffortLease):
                 waiting_times[lease_id] = lease.get_waiting_time()
         return waiting_times
 
@@ -49,12 +50,12 @@
         slowdowns = {}
         for lease_id in self.leases:
             lease = self.leases[lease_id]
-            if isinstance(lease, ds.BestEffortLease):
+            if isinstance(lease, BestEffortLease):
                 slowdowns[lease_id] = lease.get_slowdown()
         return slowdowns
     
     def get_besteffort_end(self):
-        return max([l.end for l in self.leases.values() if isinstance(l, ds.BestEffortLease)])
+        return max([l.end for l in self.leases.values() if isinstance(l, BestEffortLease)])
 
 class AccountingDataCollection(object):
     def __init__(self, rm, datafile):

Modified: trunk/src/haizea/resourcemanager/configfile.py
===================================================================
--- trunk/src/haizea/resourcemanager/configfile.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/configfile.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -19,7 +19,6 @@
 from haizea.common.config import ConfigException, Section, Option, Config, OPTTYPE_INT, OPTTYPE_FLOAT, OPTTYPE_STRING, OPTTYPE_BOOLEAN, OPTTYPE_DATETIME, OPTTYPE_TIMEDELTA 
 from haizea.common.utils import generate_config_name
 import haizea.common.constants as constants
-import os.path
 import sys
 from mx.DateTime import TimeDelta
 import ConfigParser

Modified: trunk/src/haizea/resourcemanager/leases.py
===================================================================
--- trunk/src/haizea/resourcemanager/leases.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/leases.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -29,12 +29,11 @@
   * Duration: A wrapper around requested/accumulated/actual durations
 """
 
-from haizea.common.constants import RES_MEM, MIGRATE_NONE, MIGRATE_MEM, MIGRATE_MEMDISK, LOGLEVEL_VDEBUG
-from haizea.common.utils import StateMachine, round_datetime_delta, get_lease_id, pretty_nodemap, estimate_transfer_time, xmlrpc_marshall_singlevalue
+from haizea.common.constants import LOGLEVEL_VDEBUG
+from haizea.common.utils import StateMachine, round_datetime_delta, get_lease_id, pretty_nodemap, xmlrpc_marshall_singlevalue
+from haizea.resourcemanager.scheduler.slottable import ResourceReservation
 
-from operator import attrgetter
 from mx.DateTime import TimeDelta
-from math import floor
 
 import logging
 
@@ -109,7 +108,7 @@
         self.state = LeaseStateMachine()
         self.diskimagemap = {}
         self.memimagemap = {}
-        self.deployment_rrs = []
+        self.preparation_rrs = []
         self.vm_rrs = []
 
         # Enactment information. Should only be manipulated by enactment module
@@ -137,10 +136,10 @@
         self.logger.log(loglevel, "Mem image map  : %s" % pretty_nodemap(self.memimagemap))
 
     def print_rrs(self, loglevel=LOGLEVEL_VDEBUG):
-        if len(self.deployment_rrs) > 0:
+        if len(self.preparation_rrs) > 0:
             self.logger.log(loglevel, "DEPLOYMENT RESOURCE RESERVATIONS")
             self.logger.log(loglevel, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
-            for r in self.deployment_rrs:
+            for r in self.preparation_rrs:
                 r.print_contents(loglevel)
                 self.logger.log(loglevel, "##")
         self.logger.log(loglevel, "VM RESOURCE RESERVATIONS")
@@ -149,6 +148,12 @@
             r.print_contents(loglevel)
             self.logger.log(loglevel, "##")
 
+    def get_active_vmrrs(self, time):
+        return [r for r in self.vm_rrs if r.start <= time and time <= r.end and r.state == ResourceReservation.STATE_ACTIVE]
+
+    def get_scheduled_reservations(self):
+        return [r for r in self.preparation_rrs + self.vm_rrs if r.state == ResourceReservation.STATE_SCHEDULED]
+
     def get_endtime(self):
         vmrr = self.get_last_vmrr()
         return vmrr.end
@@ -156,8 +161,8 @@
     def append_vmrr(self, vmrr):
         self.vm_rrs.append(vmrr)
         
-    def append_deployrr(self, vmrr):
-        self.deployment_rrs.append(vmrr)
+    def append_preparationrr(self, vmrr):
+        self.preparation_rrs.append(vmrr)
 
     def get_last_vmrr(self):
         return self.vm_rrs[-1]
@@ -172,7 +177,7 @@
             self.vm_rrs.remove(vmrr)
 
     def clear_rrs(self):
-        self.deployment_rrs = []
+        self.preparation_rrs = []
         self.vm_rrs = []
         
     def add_boot_overhead(self, t):

Modified: trunk/src/haizea/resourcemanager/rm.py
===================================================================
--- trunk/src/haizea/resourcemanager/rm.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/rm.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -33,7 +33,6 @@
 
 import haizea.resourcemanager.accounting as accounting
 import haizea.common.constants as constants
-import haizea.resourcemanager.enact as enact
 from haizea.resourcemanager.scheduler.preparation_schedulers.unmanaged import UnmanagedPreparationScheduler
 from haizea.resourcemanager.scheduler.preparation_schedulers.imagetransfer import ImageTransferPreparationScheduler
 from haizea.resourcemanager.enact.opennebula import OpenNebulaResourcePoolInfo, OpenNebulaVMEnactment, OpenNebulaDummyDeploymentEnactment
@@ -41,7 +40,7 @@
 from haizea.resourcemanager.frontends.tracefile import TracefileFrontend
 from haizea.resourcemanager.frontends.opennebula import OpenNebulaFrontend
 from haizea.resourcemanager.frontends.rpc import RPCFrontend
-from haizea.resourcemanager.leases import ARLease, BestEffortLease, ImmediateLease
+from haizea.resourcemanager.leases import BestEffortLease
 from haizea.resourcemanager.scheduler import UnrecoverableError
 from haizea.resourcemanager.scheduler.lease_scheduler import LeaseScheduler
 from haizea.resourcemanager.scheduler.vm_scheduler import VMScheduler
@@ -298,8 +297,12 @@
             
         # Start the clock
         self.clock.run()
+
+    def stop(self):
+        """Stops the resource manager by stopping the clock"""
+        self.clock.stop()
         
-    def stop(self):
+    def graceful_stop(self):
         """Stops the resource manager gracefully and exits"""
         
         self.logger.status("Stopping resource manager gracefully...")
@@ -394,7 +397,7 @@
         """    
         try:
             lease = self.scheduler.get_lease_by_id(lease_id)
-            self.scheduler.cancel_lease(lease_id)
+            self.scheduler.cancel_lease(lease)
         except UnrecoverableError, exc:
             self.__unrecoverable_error(exc)
         except Exception, exc:
@@ -431,7 +434,7 @@
         """
         self.logger.error("An unrecoverable error has happened.")
         self.logger.error("Original exception:")
-        self.print_exception(exc.exc, exc.get_traceback())
+        self.__print_exception(exc.exc, exc.get_traceback())
         self.logger.error("Unrecoverable error traceback:")
         self.__print_exception(exc, sys.exc_traceback)
         self.__panic()
@@ -492,6 +495,7 @@
     """
     def __init__(self, rm):
         self.rm = rm
+        self.done = False
     
     def get_time(self): 
         """Return the current time"""
@@ -516,6 +520,13 @@
         """Start and run the clock. This function is, in effect,
         the main loop of the resource manager."""
         return abstract()     
+
+    def stop(self):
+        """Stop the clock.
+        
+        Stopping the clock makes Haizea exit.
+        """
+        self.done = True    
     
         
 class SimulatedClock(Clock):
@@ -564,9 +575,9 @@
         self.logger.status("Starting simulated clock")
         self.rm.accounting.start(self.get_start_time())
         prevstatustime = self.time
-        done = False
+        
         # Main loop
-        while not done:
+        while not self.done:
             # Check to see if there are any leases which are ending prematurely.
             # Note that this is unique to simulation.
             prematureends = self.rm.scheduler.slottable.getPrematurelyEndingRes(self.time)
@@ -590,11 +601,12 @@
                 prevstatustime = self.time
                 
             # Skip to next point in time.
-            self.time, done = self.__get_next_time()
+            self.time, self.done = self.__get_next_time()
                     
+        self.logger.status("Simulated clock has stopped")
+
         # Stop the resource manager
-        self.logger.status("Stopping simulated clock")
-        self.rm.stop()
+        self.rm.graceful_stop()
         
     
     def __get_next_time(self):
@@ -605,7 +617,6 @@
         * The start or end of a reservation (a "changepoint" in the slot table)
         * A premature end of a lease
         """
-        done = False
         
         # Determine candidate next times
         tracefrontend = self.__get_trace_frontend()
@@ -646,7 +657,7 @@
         # If there's no more leases in the system, and no more pending requests,
         # then we're done.
         if not self.rm.exists_leases_in_rm() and not tracefrontend.exists_more_requests():
-            done = True
+            self.done = True
         
         # We can also be done if we've specified that we want to stop when
         # the best-effort requests are all done or when they've all been submitted.
@@ -655,17 +666,17 @@
         pendingbesteffort = [r for r in tracefrontend.requests if isinstance(r, BestEffortLease)]
         if stopwhen == constants.STOPWHEN_BEDONE:
             if self.rm.scheduler.is_queue_empty() and len(besteffort) + len(pendingbesteffort) == 0:
-                done = True
+                self.done = True
         elif stopwhen == constants.STOPWHEN_BESUBMITTED:
             if len(pendingbesteffort) == 0:
-                done = True
+                self.done = True
                 
         # If we didn't arrive at a new time, and we're not done, we've fallen into
         # an infinite loop. This is A Bad Thing(tm).
-        if newtime == prevtime and done != True:
+        if newtime == prevtime and self.done != True:
             raise Exception, "Simulated clock has fallen into an infinite loop."
         
-        return newtime, done
+        return newtime, self.done
 
     def __get_trace_frontend(self):
         """Gets the tracefile frontend from the resource manager"""
@@ -740,12 +751,17 @@
         self.logger.status("Starting clock")
         self.rm.accounting.start(self.get_start_time())
         
-        signal.signal(signal.SIGINT, self.signalhandler_gracefulstop)
-        signal.signal(signal.SIGTERM, self.signalhandler_gracefulstop)
+        try:
+            signal.signal(signal.SIGINT, self.signalhandler_gracefulstop)
+            signal.signal(signal.SIGTERM, self.signalhandler_gracefulstop)
+        except ValueError, exc:
+            # This means Haizea is not the main thread, which will happen
+            # when running it as part of a py.test. We simply ignore this
+            # to allow the test to continue.
+            pass
         
-        done = False
         # Main loop
-        while not done:
+        while not self.done:
             self.logger.status("Waking up to manage resources")
             
             # Save the waking time. We want to use a consistent time in the 
@@ -794,18 +810,19 @@
             if self.rm.config._options.has_key("stop-when-no-more-leases"):
                 stop_when_no_more_leases = self.rm.config.get("stop-when-no-more-leases")
                 if stop_when_no_more_leases and not self.rm.exists_leases_in_rm():
-                    done = True
+                    self.done = True
             
             # Sleep
-            if not done:
+            if not self.done:
                 if not self.fastforward:
                     sleep((nextwakeup - now()).seconds)
                 else:
                     self.lastwakeup = nextwakeup
 
+        self.logger.status("Real clock has stopped")
+
         # Stop the resource manager
-        self.logger.status("Stopping real clock")
-        self.rm.stop()
+        self.rm.graceful_stop()
     
     def signalhandler_gracefulstop(self, signum, frame):
         """Handler for SIGTERM and SIGINT. Allows Haizea to stop gracefully."""
@@ -816,5 +833,5 @@
         elif signum == signal.SIGINT:
             sigstr = " (SIGINT)"
         self.logger.status("Received signal %i%s" %(signum, sigstr))
-        self.rm.stop()
+        self.done = True
 

Modified: trunk/src/haizea/resourcemanager/rpcserver.py
===================================================================
--- trunk/src/haizea/resourcemanager/rpcserver.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/rpcserver.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -27,11 +27,13 @@
 
     def serve_forever(self):
         self.run = True
+        self.socket.settimeout(1)
         while self.run:
             self.handle_request()
 
     def stop(self):
         self.run = False
+        self.socket.close()
 
 class RPCServer(object):
     def __init__(self, rm):
@@ -39,6 +41,7 @@
         self.logger = logging.getLogger("RPCSERVER")
         self.port = DEFAULT_HAIZEA_PORT
         self.server = StoppableSimpleXMLRPCServer(("localhost", self.port), allow_none=True)
+        self.server_thread = None
         self.register_rpc(self.test_func)
         self.register_rpc(self.cancel_lease)
         self.register_rpc(self.get_leases)
@@ -49,11 +52,12 @@
 
     def start(self):
         # Start the XML-RPC server
-        server_thread = threading.Thread( target = self.serve )
-        server_thread.start()
+        self.server_thread = threading.Thread( target = self.serve )
+        self.server_thread.start()
         
     def stop(self):
         self.server.stop()
+        self.server_thread.join()
         
     def register_rpc(self, func):
         self.server.register_function(func)
@@ -80,7 +84,7 @@
         return [l.xmlrpc_marshall() for l in self.rm.scheduler.queue]
 
     def get_hosts(self):
-        return [h.xmlrpc_marshall() for h in self.rm.scheduler.resourcepool.nodes]
+        return [h.xmlrpc_marshall() for h in self.rm.scheduler.vm_scheduler.resourcepool.nodes]
 
     def notify_event(self, lease_id, enactment_id, event):
         pass
\ No newline at end of file

Modified: trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -29,14 +29,12 @@
 """
 
 import haizea.common.constants as constants
-from haizea.common.utils import round_datetime_delta, round_datetime, estimate_transfer_time, get_config, get_accounting, get_clock
+from haizea.common.utils import round_datetime, get_config, get_accounting, get_clock
 from haizea.resourcemanager.leases import Lease, ARLease, BestEffortLease, ImmediateLease
 from haizea.resourcemanager.scheduler import RescheduleLeaseException, NormalEndLeaseException, InconsistentLeaseStateError, EnactmentError, UnrecoverableError, NotSchedulableException
-from haizea.resourcemanager.scheduler.slottable import SlotTable, ResourceReservation
-from haizea.resourcemanager.scheduler.resourcepool import ResourcePool, ResourcePoolWithReusableImages
-from haizea.resourcemanager.scheduler.vm_scheduler import VMResourceReservation, SuspensionResourceReservation, ResumptionResourceReservation, ShutdownResourceReservation
-from operator import attrgetter, itemgetter
-from mx.DateTime import TimeDelta
+from haizea.resourcemanager.scheduler.slottable import ResourceReservation
+from haizea.resourcemanager.scheduler.vm_scheduler import VMResourceReservation
+from operator import attrgetter
 
 import logging
 
@@ -215,7 +213,7 @@
                 self.handlers[type(rr)].on_end(lease, rr)
                 
             # A RescheduleLeaseException indicates that the lease has to be rescheduled
-            except RescheduleLeaseException, msg:
+            except RescheduleLeaseException, exc:
                 # Currently, the only leases that get rescheduled are best-effort leases,
                 # once they've been suspended.
                 if isinstance(rr.lease, BestEffortLease):
@@ -224,7 +222,7 @@
                         self.__enqueue_in_order(lease)
                         lease.set_state(Lease.STATE_SUSPENDED_QUEUED)
                     else:
-                        raise InconsistentLeaseStateError(l, doing = "rescheduling best-effort lease")
+                        raise InconsistentLeaseStateError(lease, doing = "rescheduling best-effort lease")
                     
             # A NormalEndLeaseException indicates that the end of this reservations marks
             # the normal end of the lease.
@@ -307,7 +305,7 @@
         """
         time = get_clock().get_time()
         
-        self.logger.info("Cancelling lease %i..." % lease_id)
+        self.logger.info("Cancelling lease %i..." % lease.id)
             
         lease_state = lease.get_state()
         
@@ -319,29 +317,27 @@
 
         elif lease_state == Lease.STATE_ACTIVE:
             # If a lease is active, that means we have to shut down its VMs to cancel it.
-            self.logger.info("Lease %i is active. Stopping active reservation..." % lease_id)
-            rr = lease.get_active_reservations(time)[0]
-            self.vm_scheduler._handle_unscheduled_end_vm(lease, rr, enact=True)
+            self.logger.info("Lease %i is active. Stopping active reservation..." % lease.id)
+            vmrr = lease.get_active_vmrrs(time)[0]
+            self.vm_scheduler._handle_unscheduled_end_vm(lease, vmrr)
 
         elif lease_state in [Lease.STATE_SCHEDULED, Lease.STATE_SUSPENDED_SCHEDULED, Lease.STATE_READY, Lease.STATE_RESUMED_READY]:
             # If a lease is scheduled or ready, we just need to cancel all future reservations
             # for that lease
-            self.logger.info("Lease %i is scheduled. Cancelling reservations." % lease_id)
+            self.logger.info("Lease %i is scheduled. Cancelling reservations." % lease.id)
             rrs = lease.get_scheduled_reservations()
             for r in rrs:
-                lease.remove_rr(r)
                 self.slottable.removeReservation(r)
             
-        elif lease_state == [Lease.STATE_QUEUED, Lease.STATE_SUSPENDED_QUEUED]:
+        elif lease_state in [Lease.STATE_QUEUED, Lease.STATE_SUSPENDED_QUEUED]:
             # If a lease is in the queue, waiting to be scheduled, cancelling
             # just requires removing it from the queue
             
-            self.logger.info("Lease %i is in the queue. Removing..." % lease_id)
-            l = self.queue.get_lease(lease_id)
+            self.logger.info("Lease %i is in the queue. Removing..." % lease.id)
             self.queue.remove_lease(lease)
         else:
             # Cancelling in any of the other states is currently unsupported
-            raise InconsistentLeaseStateError(l, doing = "cancelling the VM")
+            raise InconsistentLeaseStateError(lease, doing = "cancelling the VM")
             
         # Change state, and remove from lease table
         lease.set_state(Lease.STATE_CANCELLED)
@@ -364,7 +360,7 @@
             rrs = lease.get_scheduled_reservations()
             for r in rrs:
                 self.slottable.removeReservation(r)
-            lease.set_state(Lease.STATE_FAILED)
+            lease.set_state(Lease.STATE_FAIL)
             self.completed_leases.add(lease)
             self.leases.remove(lease)
         elif treatment == constants.ONFAILURE_EXIT or treatment == constants.ONFAILURE_EXIT_RAISE:
@@ -390,7 +386,7 @@
             vmrr = lease.get_last_vmrr()
             self._handle_end_rr(vmrr)
             # TODO: Exception handling
-            self.vm_scheduler._handle_unscheduled_end_vm(lease, vmrr, enact=False)
+            self.vm_scheduler._handle_unscheduled_end_vm(lease, vmrr)
             self._handle_end_lease(lease)
             nexttime = get_clock().get_next_schedulable_time()
             # We need to reevaluate the schedule to see if there are any future
@@ -470,7 +466,7 @@
             # (only intra-node transfer)
             earliest = dict([(node+1, [nexttime, constants.REQTRANSFER_NO, None]) for node in range(lease.numnodes)])
         else:
-            raise InconsistentLeaseStateError(l, doing = "scheduling a best-effort lease")
+            raise InconsistentLeaseStateError(lease, doing = "scheduling a best-effort lease")
         
         if isinstance(lease, BestEffortLease):
             (vmrr, preemptions) = self.vm_scheduler.fit_asap(lease, nexttime, earliest)
@@ -486,18 +482,18 @@
                 
         # Schedule deployment
         is_ready = False
-        deploy_rrs = []
+        preparation_rrs = []
         if lease_state == Lease.STATE_SUSPENDED_QUEUED:
             self.vm_scheduler.schedule_migration(lease, vmrr, nexttime)
         else:
-            deploy_rrs, is_ready = self.preparation_scheduler.schedule(lease, vmrr, nexttime)
+            preparation_rrs, is_ready = self.preparation_scheduler.schedule(lease, vmrr, nexttime)
 
         # At this point, the lease is feasible.
         # Commit changes by adding RRs to lease and to slot table
         
         # Add deployment RRs (if any) to lease
-        for rr in deploy_rrs:
-            lease.append_deployrr(rr)
+        for rr in preparation_rrs:
+            lease.append_preparationrr(rr)
         
         # Add VMRR to lease
         lease.append_vmrr(vmrr)
@@ -506,7 +502,7 @@
         # Add resource reservations to slottable
         
         # Deployment RRs (if any)
-        for rr in deploy_rrs:
+        for rr in preparation_rrs:
             self.slottable.addReservation(rr)
         
         # Pre-VM RRs (if any)
@@ -611,13 +607,13 @@
         leases = set([rr.lease for rr in vmrrs])
         leases = [l for l in leases if isinstance(l, BestEffortLease) and l.get_state() in (Lease.STATE_SUSPENDED_SCHEDULED, Lease.STATE_READY) and not l in checkedleases]
         for lease in leases:
-            self.logger.debug("Found lease %i" % l.id)
-            l.print_contents()
+            self.logger.debug("Found lease %i" % lease.id)
+            lease.print_contents()
             # Earliest time can't be earlier than time when images will be
             # available in node
             earliest = max(nexttime, lease.imagesavail)
             self.vm_scheduler.slideback(lease, earliest)
-            checkedleases.append(l)
+            checkedleases.append(lease)
         #for l in leases:
         #    vmrr, susprr = l.getLastVMRR()
         #    self.reevaluateSchedule(l, vmrr.nodes.values(), vmrr.end, checkedleases)        

Modified: trunk/src/haizea/resourcemanager/scheduler/slottable.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/slottable.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/scheduler/slottable.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -16,12 +16,10 @@
 # limitations under the License.                                             #
 # -------------------------------------------------------------------------- #
 
-from mx.DateTime import ISO, TimeDelta
-from operator import attrgetter, itemgetter
 import haizea.common.constants as constants
-from math import ceil, floor
+from haizea.common.utils import xmlrpc_marshall_singlevalue
+from math import floor
 import bisect
-import copy
 import logging
 
 class Node(object):
@@ -407,7 +405,7 @@
             rrs = [rr for rr in rrs if isinstance(rr, rr_type)]
             
         # Filter the RRs by nodes
-        for r in rrs:
+        for rr in rrs:
             rr_nodes = set(rr.resources_in_pnode.keys())
             if len(nodes & rr_nodes) > 0:
                 rrs_in_nodes.append(rr)

Modified: trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py	2009-02-13 23:49:49 UTC (rev 568)
+++ trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py	2009-02-13 23:50:43 UTC (rev 569)
@@ -17,12 +17,10 @@
 # -------------------------------------------------------------------------- #
 
 import haizea.common.constants as constants
-from haizea.common.utils import round_datetime_delta, round_datetime, estimate_transfer_time, pretty_nodemap, get_config, get_accounting, get_clock
-from haizea.resourcemanager.scheduler.slottable import SlotTable
-from haizea.resourcemanager.leases import Lease, ARLease, BestEffortLease, ImmediateLease
+from haizea.common.utils import round_datetime_delta, round_datetime, estimate_transfer_time, pretty_nodemap, get_config, get_clock
+from haizea.resourcemanager.leases import Lease, BestEffortLease
 from haizea.resourcemanager.scheduler.slottable import ResourceReservation, ResourceTuple
-from haizea.resourcemanager.scheduler.resourcepool import ResourcePool, ResourcePoolWithReusableImages
-from haizea.resourcemanager.scheduler import ReservationEventHandler, RescheduleLeaseException, NormalEndLeaseException, EnactmentError, NotSchedulableException
+from haizea.resourcemanager.scheduler import ReservationEventHandler, RescheduleLeaseException, NormalEndLeaseException, EnactmentError, NotSchedulableException, InconsistentScheduleError, InconsistentLeaseStateError
 from operator import attrgetter, itemgetter
 from mx.DateTime import TimeDelta
 
@@ -126,9 +124,9 @@
         # At this point we know if the lease is feasible, and if
         # will require preemption.
         if not mustpreempt:
-           self.logger.debug("The VM reservations for this lease are feasible without preemption.")
+            self.logger.debug("The VM reservations for this lease are feasible without preemption.")
         else:
-           self.logger.debug("The VM reservations for this lease are feasible but will require preemption.")
+            self.logger.debug("The VM reservations for this lease are feasible but will require preemption.")
 
         # merge canfitnopreempt and canfitpreempt
         canfit = {}
@@ -1148,7 +1146,7 @@
         self.logger.debug("LEASE-%i End of handleEndVM" % l.id)
         self.logger.info("Stopped VMs for lease %i on nodes %s" % (l.id, rr.nodes.values()))
 
-    def _handle_unscheduled_end_vm(self, l, vmrr, enact=False):
+    def _handle_unscheduled_end_vm(self, l, vmrr):
         self.logger.info("LEASE-%i The VM has ended prematurely." % l.id)
         for rr in vmrr.post_rrs:
             self.slottable.removeReservation(rr)



More information about the Haizea-commit mailing list