Project

General

Profile

root / trunk / tests / test_mapper.py @ 632

1
from haizea.core.leases import Lease
2
from haizea.core.scheduler.resourcepool import ResourcePoolNode
3
from haizea.core.scheduler.policy import PolicyManager
4
from haizea.core.scheduler.slottable import ResourceTuple, SlotTable, ResourceReservation, AvailabilityWindow
5
from haizea.core.scheduler.mapper import GreedyMapper
6
from haizea.policies.host_selection import GreedyPolicy
7
from mx import DateTime
8
import haizea.common.constants as constants
9
from sample_slottables import *
10
from common import create_tmp_slottable
11

    
12
class SimplePolicy(PolicyManager):
13
    def __init__(self, slottable, preemption):
14
        PolicyManager.__init__(self, None, None, None)
15
        self.preemption = preemption
16
        self.host_selection = GreedyPolicy(slottable)
17
    
18
    def get_lease_preemptability_score(self, preemptor, preemptee, time):
19
        if self.preemption:
20
            return 1
21
        else:
22
            return -1
23
        
24
    def accept_lease(self, lease):
25
        return True  
26
    
27

    
28
class TestMapper(object):
29
    def __init__(self):
30
        pass
31
   
32
    def mapping_assertions(self, start, end, requested_resources, strictend, mustmap, 
33
                           maxend = None, can_preempt = []):
34
        lease = create_ar_lease(lease_id = 100,
35
                                submit_time = T1200,
36
                                start = start,
37
                                end = end,
38
                                preemptible = False,
39
                                requested_resources = requested_resources)
40
        
41
        mapping, actualend, preemptions = self.mapper.map(lease, requested_resources,
42
                                                     start, end, 
43
                                                     strictend = strictend)
44
        
45
        if mustmap:
46
            assert(mapping != None and actualend != None and preemptions != None)
47
            if strictend:
48
                assert(end == actualend)
49
            else:
50
                assert(actualend <= maxend)
51
            assert(set(preemptions).issubset(set(can_preempt)))
52

    
53
        else:
54
            assert(mapping == None and actualend == None and preemptions == None)
55
            return
56
        
57
        # Sanity check slottable
58
        tmp_slottable = create_tmp_slottable(self.slottable)
59
        
60
        # Add reservation
61
        res = dict([(mapping[vnode],r) for vnode,r in requested_resources.items()])
62
        rr = ResourceReservation(lease, start, actualend, res)
63
        tmp_slottable.add_reservation(rr)
64
        
65
        if len(preemptions) > 0:
66
            passed, node, time, capacity = tmp_slottable.sanity_check()
67
            assert(not passed)
68
            
69
            # Remove preempted reservations
70
            remove = set()
71
            for rr in [x.value for x in tmp_slottable.reservations_by_start]:
72
                if rr.lease in preemptions:
73
                    remove.add(rr)
74

    
75
            for rr in remove:
76
                tmp_slottable.remove_reservation(rr)
77

    
78
        passed, node, time, capacity = tmp_slottable.sanity_check()
79
        assert(passed)
80

    
81
   
82
    def test_mapping_nopreemption_strictend(self):
83
        self.slottable, leases = sample_slottable_2()
84
        FULL_NODE, HALF_NODE, QRTR_NODE, EMPT_NODE = create_capacities(self.slottable)
85
        policy = SimplePolicy(self.slottable, preemption = False)
86
        self.mapper = GreedyMapper(self.slottable, policy)
87
        
88
        self.mapping_assertions(start = T1300, 
89
                                end = T1345,
90
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE},
91
                                strictend = True,
92
                                mustmap = True)
93

    
94
        self.mapping_assertions(start = T1300, 
95
                                end = T1330,
96
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: HALF_NODE},
97
                                strictend = True,
98
                                mustmap = True)
99

    
100
        self.mapping_assertions(start = T1300, 
101
                                end = T1315,
102
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
103
                                strictend = True,
104
                                mustmap = True)
105

    
106
        self.mapping_assertions(start = T1330, 
107
                                end = T1345,
108
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE},
109
                                strictend = True,
110
                                mustmap = True)
111

    
112
        self.mapping_assertions(start = T1330, 
113
                                end = T1345,
114
                                requested_resources = {1: HALF_NODE, 2: HALF_NODE, 3: HALF_NODE, 4: HALF_NODE},
115
                                strictend = True,
116
                                mustmap = True)
117

    
118
        self.mapping_assertions(start = T1300, 
119
                                end = T1415,
120
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE},
121
                                strictend = True,
122
                                mustmap = True)
123

    
124
        self.mapping_assertions(start = T1300, 
125
                                end = T1415,
126
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
127
                                strictend = True,
128
                                mustmap = False)
129

    
130
        self.mapping_assertions(start = T1300, 
131
                                end = T1330,
132
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
133
                                strictend = True,
134
                                mustmap = False)
135

    
136
        self.mapping_assertions(start = T1330, 
137
                                end = T1345,
138
                                requested_resources = {1: HALF_NODE, 2: HALF_NODE, 3: HALF_NODE, 4: HALF_NODE, 5: HALF_NODE},
139
                                strictend = True,
140
                                mustmap = False)
141

    
142
    def test_mapping_nopreemption_nostrictend(self):
143
        self.slottable, leases = sample_slottable_3()
144
        FULL_NODE, HALF_NODE, QRTR_NODE, EMPT_NODE = create_capacities(self.slottable)
145
        policy = SimplePolicy(self.slottable, preemption = False)
146
        self.mapper = GreedyMapper(self.slottable, policy)
147
        
148
        self.mapping_assertions(start = T1315, 
149
                                end = T1415,
150
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE},
151
                                strictend = False,
152
                                mustmap = True,
153
                                maxend = T1400)
154
        
155
        self.mapping_assertions(start = T1315, 
156
                                end = T1415,
157
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
158
                                strictend = False,
159
                                mustmap = True,
160
                                maxend = T1330)
161

    
162
        self.mapping_assertions(start = T1315, 
163
                                end = T1415,
164
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: HALF_NODE},
165
                                strictend = False,
166
                                mustmap = True,
167
                                maxend = T1345)
168
        
169
        self.mapping_assertions(start = T1315, 
170
                                end = T1415,
171
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE, 4: HALF_NODE, 5: HALF_NODE, 6: HALF_NODE},
172
                                strictend = False,
173
                                mustmap = True,
174
                                maxend = T1330)
175

    
176
        self.mapping_assertions(start = T1330, 
177
                                end = T1415,
178
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: HALF_NODE},
179
                                strictend = False,
180
                                mustmap = True,
181
                                maxend = T1345)
182

    
183
        self.mapping_assertions(start = T1345, 
184
                                end = T1415,
185
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE},
186
                                strictend = False,
187
                                mustmap = True,
188
                                maxend = T1400)
189

    
190
        self.mapping_assertions(start = T1330, 
191
                                end = T1415,
192
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
193
                                strictend = False,
194
                                mustmap = False)
195
        
196
        self.mapping_assertions(start = T1400, 
197
                                end = T1415,
198
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE},
199
                                strictend = False,
200
                                mustmap = False)
201
        
202
    def test_mapping_preemption_strictend(self):
203
        self.slottable, leases = sample_slottable_3()
204
        FULL_NODE, HALF_NODE, QRTR_NODE, EMPT_NODE = create_capacities(self.slottable)
205
        policy = SimplePolicy(self.slottable, preemption = True)        
206
        self.mapper = GreedyMapper(self.slottable, policy)
207

    
208
        self.mapping_assertions(start = T1315, 
209
                                end = T1345,
210
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
211
                                strictend = True,
212
                                mustmap = True,
213
                                can_preempt = [leases[1]])
214

    
215
        self.mapping_assertions(start = T1330, 
216
                                end = T1345,
217
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
218
                                strictend = True,
219
                                mustmap = True,
220
                                can_preempt = [leases[1]])
221

    
222
        self.mapping_assertions(start = T1345, 
223
                                end = T1400,
224
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE},
225
                                strictend = True,
226
                                mustmap = True,
227
                                can_preempt = [leases[0],leases[1]])
228
        
229
        self.mapping_assertions(start = T1315, 
230
                                end = T1415,
231
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: FULL_NODE, 4: FULL_NODE},
232
                                strictend = True,
233
                                mustmap = True,
234
                                can_preempt = leases)
235
                
236
        self.mapping_assertions(start = T1315, 
237
                                end = T1415,
238
                                requested_resources = {1: FULL_NODE, 2: FULL_NODE, 3: HALF_NODE},
239
                                strictend = True,
240
                                mustmap = True,
241
                                can_preempt = leases)