[haizea-commit] r592 - branches/TP2.0/tests
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Thu Jun 18 12:28:20 CDT 2009
Author: borja
Date: 2009-06-18 12:28:14 -0500 (Thu, 18 Jun 2009)
New Revision: 592
Added:
branches/TP2.0/tests/test_mapper.py
Modified:
branches/TP2.0/tests/common.py
branches/TP2.0/tests/sample_slottables.py
Log:
- Added first mapper tests
- Cleaned up creation of leases
Modified: branches/TP2.0/tests/common.py
===================================================================
--- branches/TP2.0/tests/common.py 2009-06-17 17:52:06 UTC (rev 591)
+++ branches/TP2.0/tests/common.py 2009-06-18 17:28:14 UTC (rev 592)
@@ -4,7 +4,9 @@
import shutil
from haizea.core.configfile import HaizeaConfig
-from haizea.core.haizea import Haizea
+from haizea.core.scheduler.slottable import ResourceReservation, SlotTable
+from haizea.core.leases import Lease, Timestamp, Duration
+from haizea.core.manager import Manager
class BaseTest(object):
def __init__(self):
@@ -92,4 +94,35 @@
def stop(self):
self.haizea.stop()
- self.haizea_thread.join()
\ No newline at end of file
+ self.haizea_thread.join()
+
+
+def create_ar_lease(lease_id, submit_time, start, end, preemptible, requested_resources):
+ start = Timestamp(start)
+ duration = Duration(end - start.requested)
+ lease = Lease(submit_time = submit_time,
+ requested_resources = requested_resources,
+ start = start,
+ duration = duration,
+ deadline = None,
+ preemptible = preemptible,
+ software = None)
+
+ lease.id = lease_id
+
+ return lease
+
+def create_reservation_from_lease(lease, mapping, slottable):
+ start = lease.start.requested
+ end = start + lease.duration.requested
+ res = dict([(mapping[vnode],r) for vnode,r in lease.requested_resources.items()])
+ rr = ResourceReservation(lease, start, end, res)
+ slottable.add_reservation(rr)
+
+def create_tmp_slottable(slottable):
+ tmp_slottable = SlotTable()
+ tmp_slottable.nodes = slottable.nodes
+ tmp_slottable.reservations_by_start = slottable.reservations_by_start[:]
+ tmp_slottable.reservations_by_end = slottable.reservations_by_end[:]
+
+ return tmp_slottable
\ No newline at end of file
Modified: branches/TP2.0/tests/sample_slottables.py
===================================================================
--- branches/TP2.0/tests/sample_slottables.py 2009-06-17 17:52:06 UTC (rev 591)
+++ branches/TP2.0/tests/sample_slottables.py 2009-06-18 17:28:14 UTC (rev 592)
@@ -3,7 +3,9 @@
from haizea.core.scheduler.slottable import ResourceTuple, SlotTable, ResourceReservation, AvailabilityWindow
from mx import DateTime
import haizea.common.constants as constants
+from common import create_ar_lease, create_reservation_from_lease
+T1200 = DateTime.DateTime(2006,11,25,12,00)
T1255 = DateTime.DateTime(2006,11,25,12,55)
T1300 = DateTime.DateTime(2006,11,25,13,00)
T1305 = DateTime.DateTime(2006,11,25,13,05)
@@ -43,7 +45,7 @@
slottable.add_node(Node(3, "test-3", FULL_NODE))
slottable.add_node(Node(4, "test-4", FULL_NODE))
- lease1 = Lease(None,None,None,None,None,1,None,None)
+ lease1 = Lease(None,[],None,None,None,1,None)
lease1.id = 1
res1 = {2: HALF_NODE}
rr1_1 = ResourceReservation(lease1, T1315, T1325, res1)
@@ -51,13 +53,13 @@
slottable.add_reservation(rr1_1)
slottable.add_reservation(rr1_2)
- lease2 = Lease(None,None,None,None,None,2,None,None)
+ lease2 = Lease(None,[],None,None,None,2,None)
lease2.id = 2
res2 = {2: FULL_NODE, 3: FULL_NODE}
rr2 = ResourceReservation(lease2, T1330, T1345, res2)
slottable.add_reservation(rr2)
- lease3 = Lease(None,None,None,None,None,1,None,None)
+ lease3 = Lease(None,[],None,None,None,1,None)
lease3.id = 3
res3 = {4: FULL_NODE}
rr3_1 = ResourceReservation(lease3, T1330, T1355, res3)
@@ -65,19 +67,19 @@
slottable.add_reservation(rr3_1)
slottable.add_reservation(rr3_2)
- lease4 = Lease(None,None,None,None,None,1,None,None)
+ lease4 = Lease(None,[],None,None,None,1,None)
lease4.id = 4
res4 = {2: QRTR_NODE, 3: HALF_NODE}
rr4 = ResourceReservation(lease4, T1350, T1415, res4)
slottable.add_reservation(rr4)
- lease5 = Lease(None,None,None,None,None,1,None,None)
+ lease5 = Lease(None,[],None,None,None,1,None)
lease5.id = 5
res5 = {2: QRTR_NODE}
rr5 = ResourceReservation(lease5, T1350, T1415, res5)
slottable.add_reservation(rr5)
- lease6 = Lease(None,None,None,None,None,1,None,None)
+ lease6 = Lease(None,[],None,None,None,1,None)
lease6.id = 6
res6 = {1: FULL_NODE}
rr6 = ResourceReservation(lease6, T1255, T1305, res6)
@@ -85,7 +87,7 @@
return slottable, [lease1,lease2,lease3,lease4,lease5,lease6]
-def sample_slottable_3():
+def sample_slottable_2():
slottable = SlotTable()
slottable.add_node(Node(1, "test-1", FULL_NODE))
@@ -93,21 +95,25 @@
slottable.add_node(Node(3, "test-3", FULL_NODE))
slottable.add_node(Node(4, "test-4", FULL_NODE))
- lease1 = Lease(None,None,None,None,None,2,None,None)
- lease1.id = 1
- res1 = {1: FULL_NODE, 2: FULL_NODE}
- rr1 = ResourceReservation(lease1, T1330, T1345, res1)
- slottable.add_reservation(rr1)
+ lease1 = create_ar_lease(lease_id = 1,
+ submit_time = T1200,
+ start = T1330,
+ end = T1345,
+ preemptible = False,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE})
+ create_reservation_from_lease(lease1, {1:1,2:2}, slottable)
+
+ lease2 = create_ar_lease(lease_id = 2,
+ submit_time = T1200,
+ start = T1315,
+ end = T1330,
+ preemptible = False,
+ requested_resources = {1: HALF_NODE})
+ create_reservation_from_lease(lease2, {1:1}, slottable)
- lease2 = Lease(None,None,None,None,None,1,None,None)
- lease2.id = 2
- res2 = {1: HALF_NODE}
- rr2 = ResourceReservation(lease1, T1315, T1330, res2)
- slottable.add_reservation(rr2)
+ return slottable, [lease1,lease2]
- return slottable
-
-def sample_slottable_4():
+def sample_slottable_3():
slottable = SlotTable()
slottable.add_node(Node(1, "test-1", FULL_NODE))
@@ -115,22 +121,28 @@
slottable.add_node(Node(3, "test-3", FULL_NODE))
slottable.add_node(Node(4, "test-4", FULL_NODE))
- lease1 = Lease(None,None,None,None,None,1,None,None)
- lease1.id = 1
- res1 = {1: FULL_NODE}
- rr1 = ResourceReservation(lease1, T1345, T1415, res1)
- slottable.add_reservation(rr1)
+ lease1 = create_ar_lease(lease_id = 1,
+ submit_time = T1200,
+ start = T1345,
+ end = T1415,
+ preemptible = False,
+ requested_resources = {1: FULL_NODE})
+ create_reservation_from_lease(lease1, {1:1}, slottable)
- lease2 = Lease(None,None,None,None,None,1,None,None)
- lease2.id = 2
- res2 = {2: HALF_NODE}
- rr2 = ResourceReservation(lease2, T1330, T1415, res2)
- slottable.add_reservation(rr2)
+ lease2 = create_ar_lease(lease_id = 2,
+ submit_time = T1200,
+ start = T1330,
+ end = T1415,
+ preemptible = False,
+ requested_resources = {1: HALF_NODE})
+ create_reservation_from_lease(lease2, {1:2}, slottable)
- lease3 = Lease(None,None,None,None,None,1,None,None)
- lease3.id = 3
- res3 = {2: HALF_NODE}
- rr3 = ResourceReservation(lease3, T1400, T1415, res3)
- slottable.add_reservation(rr3)
+ lease3 = create_ar_lease(lease_id = 3,
+ submit_time = T1200,
+ start = T1400,
+ end = T1415,
+ preemptible = False,
+ requested_resources = {1: HALF_NODE})
+ create_reservation_from_lease(lease3, {1:2}, slottable)
- return slottable
\ No newline at end of file
+ return slottable, [lease1, lease2, lease3]
\ No newline at end of file
Added: branches/TP2.0/tests/test_mapper.py
===================================================================
--- branches/TP2.0/tests/test_mapper.py (rev 0)
+++ branches/TP2.0/tests/test_mapper.py 2009-06-18 17:28:14 UTC (rev 592)
@@ -0,0 +1,137 @@
+from haizea.core.leases import Lease
+from haizea.core.scheduler.resourcepool import Node
+from haizea.core.scheduler.policy import Policy
+from haizea.core.scheduler.slottable import ResourceTuple, SlotTable, ResourceReservation, AvailabilityWindow
+from haizea.core.scheduler.mapper import GreedyMapper
+from mx import DateTime
+import haizea.common.constants as constants
+from sample_slottables import *
+from common import create_tmp_slottable
+
+class SimplePolicy(Policy):
+ def __init__(self, slottable, preemption):
+ Policy.__init__(self, slottable)
+ self.preemption = preemption
+
+ def get_lease_preemptability_score(self, preemptor, preemptee):
+ if self.preemption:
+ return 1
+ else:
+ return -1
+
+ def accept_lease(self, lease):
+ return True
+
+
+class TestMapper(object):
+ def __init__(self):
+ pass
+
+ def mapping_assertions(self, start, end, requested_resources, strictend, mustmap,
+ maxend = None, can_preempt = []):
+ lease = create_ar_lease(lease_id = 100,
+ submit_time = T1200,
+ start = start,
+ end = end,
+ preemptible = False,
+ requested_resources = requested_resources)
+
+ mapping, actualend, preemptions = self.mapper.map(lease, requested_resources,
+ start, end,
+ strictend = strictend)
+
+ if mustmap:
+ assert(mapping != None and actualend != None and preemptions != None)
+ if strictend:
+ assert(end == actualend)
+ else:
+ assert(actualend <= maxend)
+ assert(set(preemptions).issubset(set(can_preempt)))
+
+ else:
+ assert(mapping == None and actualend == None and preemptions == None)
+
+ # Sanity check slottable
+ tmp_slottable = create_tmp_slottable(self.slottable)
+
+ # Add reservation
+ res = dict([(mapping[vnode],r) for vnode,r in requested_resources.items()])
+ rr = ResourceReservation(lease, start, actualend, res)
+ tmp_slottable.add_reservation(rr)
+
+ if len(preemptions) > 0:
+ passed, node, time, capacity = tmp_slottable.sanity_check()
+ assert(not passed)
+
+ # Remove preempted reservations
+ remove = set()
+ for rr in [x.value for x in tmp_slottable.reservations_by_start]:
+ if rr.lease in preemptions:
+ remove.add(rr)
+
+ for rr in remove:
+ tmp_slottable.remove_reservation(rr)
+
+ passed, node, time, capacity = tmp_slottable.sanity_check()
+ assert(passed)
+
+
+ def test_mapping_nopreemption_strictend(self):
+ self.slottable, leases = sample_slottable_2()
+ policy = SimplePolicy(self.slottable, preemption = False)
+ self.mapper = GreedyMapper(self.slottable, policy)
+
+ self.mapping_assertions(start = T1300,
+ end = T1345,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE},
+ strictend = True,
+ mustmap = True,
+ maxend = T1345)
+
+ def test_mapping_nopreemption_nostrictend(self):
+ self.slottable, leases = sample_slottable_3()
+ policy = SimplePolicy(self.slottable, preemption = False)
+ self.mapper = GreedyMapper(self.slottable, policy)
+
+ self.mapping_assertions(start = T1315,
+ end = T1415,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE},
+ strictend = False,
+ mustmap = True,
+ maxend = T1400)
+
+ self.mapping_assertions(start = T1315,
+ end = T1415,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
+ strictend = False,
+ mustmap = True,
+ maxend = T1330)
+
+ self.mapping_assertions(start = T1315,
+ end = T1415,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: HALF_NODE},
+ strictend = False,
+ mustmap = True,
+ maxend = T1345)
+
+ self.mapping_assertions(start = T1315,
+ end = T1415,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE, 4: HALF_NODE, 5: HALF_NODE, 6: HALF_NODE},
+ strictend = False,
+ mustmap = True,
+ maxend = T1330)
+
+ def test_mapping_preemption_strictend(self):
+ self.slottable, leases = sample_slottable_3()
+ policy = SimplePolicy(self.slottable, preemption = True)
+ self.mapper = GreedyMapper(self.slottable, policy)
+
+ self.mapping_assertions(start = T1315,
+ end = T1415,
+ requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
+ strictend = True,
+ mustmap = True,
+ maxend = T1415,
+ can_preempt = leases)
+
+
More information about the Haizea-commit
mailing list