[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