[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