Project

General

Profile

root / trunk / tests / test_slottable.py @ 632

1
from haizea.core.leases import Lease, Capacity
2
from haizea.core.scheduler.resourcepool import ResourcePoolNode
3
from haizea.core.scheduler.slottable import ResourceTuple, SlotTable, ResourceReservation, AvailabilityWindow
4
from mx import DateTime
5
from sample_slottables import *
6
import haizea.common.constants as constants
7

    
8
class TestSlotTable(object):
9
    def __init__(self):
10
        self.slottable = None
11
   
12
    def test_resource_tuple(self):
13
        
14
        multiinst = [(constants.RES_CPU,ResourceTuple.MULTI_INSTANCE),(constants.RES_MEM,ResourceTuple.SINGLE_INSTANCE)]
15
        
16
        self.slottable = SlotTable(multiinst)
17
                
18
        c1_100 = Capacity([constants.RES_CPU,constants.RES_MEM])
19
        c1_100.set_quantity(constants.RES_CPU, 100)
20
        c1_100.set_quantity(constants.RES_MEM, 1024)
21
        c1_100 = self.slottable.create_resource_tuple_from_capacity(c1_100)
22

    
23
        c2_100 = Capacity([constants.RES_CPU,constants.RES_MEM])
24
        c2_100.set_ninstances(constants.RES_CPU, 2)
25
        c2_100.set_quantity_instance(constants.RES_CPU, 1, 100)
26
        c2_100.set_quantity_instance(constants.RES_CPU, 2, 100)
27
        c2_100.set_quantity(constants.RES_MEM, 1024)
28
        c2_100 = self.slottable.create_resource_tuple_from_capacity(c2_100)
29

    
30
        c1_50 = Capacity([constants.RES_CPU,constants.RES_MEM])
31
        c1_50.set_quantity(constants.RES_CPU, 50)
32
        c1_50.set_quantity(constants.RES_MEM, 1024)
33
        c1_50 = self.slottable.create_resource_tuple_from_capacity(c1_50)
34

    
35
        c2_50 = Capacity([constants.RES_CPU,constants.RES_MEM])
36
        c2_50.set_ninstances(constants.RES_CPU, 2)
37
        c2_50.set_quantity_instance(constants.RES_CPU, 1, 50)
38
        c2_50.set_quantity_instance(constants.RES_CPU, 2, 50)
39
        c2_50.set_quantity(constants.RES_MEM, 1024)
40
        c2_50 = self.slottable.create_resource_tuple_from_capacity(c2_50)
41

    
42
        assert c1_100.fits_in(c2_100)
43
        assert not c1_100.fits_in(c1_50)
44
        assert not c1_100.fits_in(c2_50)
45

    
46
        assert not c2_100.fits_in(c1_100)
47
        assert not c2_100.fits_in(c1_50)
48
        assert not c2_100.fits_in(c2_50)
49

    
50
        assert c1_50.fits_in(c1_100)
51
        assert c1_50.fits_in(c2_100)
52
        assert c1_50.fits_in(c2_50)
53

    
54
        assert c2_50.fits_in(c1_100)
55
        assert c2_50.fits_in(c2_100)
56
        assert not c2_50.fits_in(c1_50)
57
        
58
        empty = self.slottable.create_empty_resource_tuple()
59
        empty.incr(c2_100)
60
        assert empty._res[0] == 1024
61
        assert empty.multiinst[1] == [100,100]
62
 
63
        empty = self.slottable.create_empty_resource_tuple()
64
        empty.incr(c1_100)
65
        assert empty._res[0] == 1024
66
        assert empty.multiinst[1] == [100]
67
        empty.incr(c1_100)
68
        assert empty._res[0] == 2048
69
        assert empty.multiinst[1] == [100,100]
70

    
71
        empty = self.slottable.create_empty_resource_tuple()
72
        empty.incr(c1_100)
73
        assert empty._res[0] == 1024
74
        assert empty.multiinst[1] == [100]
75
        empty.incr(c1_50)
76
        assert empty._res[0] == 2048
77
        assert empty.multiinst[1] == [100,50]
78
   
79
        c1_100a = ResourceTuple.copy(c1_100)
80
        c1_100a.decr(c1_50)
81
        assert c1_100a._res[0] == 0
82
        assert c1_100a.multiinst[1] == [50]
83

    
84
        c2_100a = ResourceTuple.copy(c2_100)
85
        c2_100a._res[0] = 2048
86
        c2_100a.decr(c1_50)
87
        assert c2_100a._res[0] == 1024
88
        assert c2_100a.multiinst[1] == [50,100]
89
        c2_100a.decr(c1_50)
90
        assert c2_100a._res[0] == 0
91
        assert c2_100a.multiinst[1] == [0,100]
92

    
93
        c2_100a = ResourceTuple.copy(c2_100)
94
        c2_100a._res[0] = 2048
95
        c2_100a.decr(c2_50)
96
        assert c2_100a._res[0] == 1024
97
        assert c2_100a.multiinst[1] == [0,100]
98
        c2_100a.decr(c2_50)
99
        assert c2_100a._res[0] == 0
100
        assert c2_100a.multiinst[1] == [0,0]
101
   
102
    def test_slottable(self):
103
        def assert_capacity(node, percent):
104
            assert node.capacity.get_by_type(constants.RES_CPU) == percent * 100
105
            assert node.capacity.get_by_type(constants.RES_MEM) == percent * 1024
106
            
107
        def reservations_1_assertions():
108
            assert not self.slottable.is_empty()
109
            nodes = self.slottable.get_availability(T1300)
110
            assert_capacity(nodes[1], 0.5)
111
            assert_capacity(nodes[2], 0.5)
112
            nodes = self.slottable.get_availability(T1330)
113
            assert_capacity(nodes[1], 1.0)
114
            assert_capacity(nodes[2], 1.0)
115
            
116
        def reservations_2_assertions():
117
            nodes = self.slottable.get_availability(T1300)
118
            assert_capacity(nodes[1], 0.5)
119
            assert_capacity(nodes[2], 0.5)
120
            rrs = self.slottable.get_reservations_at(T1300)
121
            assert len(rrs) == 1
122
            assert rrs[0] == rr1
123
    
124
            nodes = self.slottable.get_availability(T1330)
125
            assert_capacity(nodes[1], 0.75)
126
            assert_capacity(nodes[2], 0.5)
127
            rrs = self.slottable.get_reservations_at(T1330)
128
            assert len(rrs) == 1
129
            assert rrs[0] == rr2
130
    
131
            nodes = self.slottable.get_availability(T1400)
132
            assert_capacity(nodes[1], 1.0)
133
            assert_capacity(nodes[2], 1.0)
134
            rrs = self.slottable.get_reservations_at(T1400)
135
            assert len(rrs) == 0
136
            
137
        def reservations_3_assertions():
138
            nodes = self.slottable.get_availability(T1300)
139
            assert_capacity(nodes[1], 0.5)
140
            assert_capacity(nodes[2], 0.5)
141
            rrs = self.slottable.get_reservations_at(T1300)
142
            assert len(rrs) == 1
143
            assert rrs[0] == rr1
144
    
145
            nodes = self.slottable.get_availability(T1315)
146
            assert_capacity(nodes[1], 0.25)
147
            assert_capacity(nodes[2], 0.25)
148
            rrs = self.slottable.get_reservations_at(T1315)
149
            assert len(rrs) == 2
150
            assert rr1 in rrs and rr3 in rrs
151

    
152
            nodes = self.slottable.get_availability(T1330)
153
            assert_capacity(nodes[1], 0.5)
154
            assert_capacity(nodes[2], 0.25)
155
            rrs = self.slottable.get_reservations_at(T1330)
156
            assert len(rrs) == 2
157
            assert rr2 in rrs and rr3 in rrs
158

    
159
            nodes = self.slottable.get_availability(T1345)
160
            assert_capacity(nodes[1], 0.75)
161
            assert_capacity(nodes[2], 0.5)
162
            rrs = self.slottable.get_reservations_at(T1345)
163
            assert len(rrs) == 1
164
            assert rrs[0] == rr2
165
    
166
            nodes = self.slottable.get_availability(T1400)
167
            assert_capacity(nodes[1], 1.0)
168
            assert_capacity(nodes[2], 1.0)
169
            rrs = self.slottable.get_reservations_at(T1400)
170
            assert len(rrs) == 0
171

    
172
        def reservations_4_assertions():
173
            nodes = self.slottable.get_availability(T1300)
174
            assert_capacity(nodes[1], 0.5)
175
            assert_capacity(nodes[2], 0.5)
176
            rrs = self.slottable.get_reservations_at(T1300)
177
            assert len(rrs) == 1
178
            assert rrs[0] == rr1
179
    
180
            nodes = self.slottable.get_availability(T1315)
181
            assert_capacity(nodes[1], 0.25)
182
            assert_capacity(nodes[2], 0.25)
183
            rrs = self.slottable.get_reservations_at(T1315)
184
            assert len(rrs) == 2
185
            assert rr1 in rrs and rr3 in rrs
186

    
187
            nodes = self.slottable.get_availability(T1330)
188
            assert_capacity(nodes[1], 0)
189
            assert_capacity(nodes[2], 0)
190
            rrs = self.slottable.get_reservations_at(T1330)
191
            assert len(rrs) == 3
192
            assert rr4 in rrs and rr2 in rrs and rr3 in rrs
193

    
194
            nodes = self.slottable.get_availability(T1345)
195
            assert_capacity(nodes[1], 0.25)
196
            assert_capacity(nodes[2], 0.25)
197
            rrs = self.slottable.get_reservations_at(T1345)
198
            assert len(rrs) == 2
199
            assert rr2 in rrs and rr4 in rrs
200
    
201
            nodes = self.slottable.get_availability(T1400)
202
            assert_capacity(nodes[1], 0.5)
203
            assert_capacity(nodes[2], 0.75)
204
            rrs = self.slottable.get_reservations_at(T1400)
205
            assert len(rrs) == 1
206
            assert rrs[0] == rr4
207
    
208
            nodes = self.slottable.get_availability(T1415)
209
            assert_capacity(nodes[1], 1.0)
210
            assert_capacity(nodes[2], 1.0)
211
            rrs = self.slottable.get_reservations_at(T1415)
212
            assert len(rrs) == 0
213
        
214
        def reservations_5_assertions():
215
            nodes = self.slottable.get_availability(T1300)
216
            assert_capacity(nodes[1], 0.5)
217
            assert_capacity(nodes[2], 0.5)
218
            rrs = self.slottable.get_reservations_at(T1300)
219
            assert len(rrs) == 1
220
            assert rrs[0] == rr1
221
    
222
            nodes = self.slottable.get_availability(T1315)
223
            assert_capacity(nodes[1], 0.25)
224
            assert_capacity(nodes[2], 0.25)
225
            rrs = self.slottable.get_reservations_at(T1315)
226
            assert len(rrs) == 2
227
            assert set(rrs) == set([rr1,rr3])
228

    
229
            nodes = self.slottable.get_availability(T1330)
230
            assert_capacity(nodes[1], 0)
231
            assert_capacity(nodes[2], 0)
232
            rrs = self.slottable.get_reservations_at(T1330)
233
            assert len(rrs) == 3
234
            assert set(rrs) == set([rr2,rr3,rr4])
235

    
236
            nodes = self.slottable.get_availability(T1345)
237
            assert_capacity(nodes[1], 0.25)
238
            assert_capacity(nodes[2], 0)
239
            rrs = self.slottable.get_reservations_at(T1345)
240
            assert len(rrs) == 3
241
            assert set(rrs) == set([rr2,rr4,rr5])
242
    
243
            nodes = self.slottable.get_availability(T1400)
244
            assert_capacity(nodes[1], 0.5)
245
            assert_capacity(nodes[2], 0.5)
246
            rrs = self.slottable.get_reservations_at(T1400)
247
            assert len(rrs) == 2
248
            assert set(rrs) == set([rr4,rr5])
249
    
250
            nodes = self.slottable.get_availability(T1415)
251
            assert_capacity(nodes[1], 1.0)
252
            assert_capacity(nodes[2], 1.0)
253
            rrs = self.slottable.get_reservations_at(T1415)
254
            assert len(rrs) == 0
255
            
256
            rrs = self.slottable.get_reservations_starting_between(T1300, T1315)
257
            assert set(rrs) == set([rr1,rr3])
258
            rrs = self.slottable.get_reservations_starting_between(T1300, T1330)
259
            assert set(rrs) == set([rr1,rr2,rr3,rr4])
260
            rrs = self.slottable.get_reservations_starting_between(T1300, T1345)
261
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
262
            rrs = self.slottable.get_reservations_starting_between(T1315, T1330)
263
            assert set(rrs) == set([rr2,rr3,rr4])
264
            rrs = self.slottable.get_reservations_starting_between(T1315, T1345)
265
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
266
            rrs = self.slottable.get_reservations_starting_between(T1330, T1345)
267
            assert set(rrs) == set([rr2,rr4,rr5])
268
            rrs = self.slottable.get_reservations_starting_between(T1400, T1415)
269
            assert len(rrs) == 0
270
            rrs = self.slottable.get_reservations_starting_between(T1305, T1335)
271
            assert set(rrs) == set([rr3,rr2,rr4])
272

    
273
            rrs = self.slottable.get_reservations_ending_between(T1300, T1305)
274
            assert len(rrs) == 0
275
            rrs = self.slottable.get_reservations_ending_between(T1300, T1315)
276
            assert len(rrs) == 0
277
            rrs = self.slottable.get_reservations_ending_between(T1300, T1330)
278
            assert set(rrs) == set([rr1])
279
            rrs = self.slottable.get_reservations_ending_between(T1300, T1335)
280
            assert set(rrs) == set([rr1])
281
            rrs = self.slottable.get_reservations_ending_between(T1300, T1345)
282
            assert set(rrs) == set([rr1,rr3])
283
            rrs = self.slottable.get_reservations_ending_between(T1300, T1400)
284
            assert set(rrs) == set([rr1,rr2,rr3])
285
            rrs = self.slottable.get_reservations_ending_between(T1300, T1415)
286
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
287
            rrs = self.slottable.get_reservations_ending_between(T1305, T1315)
288
            assert len(rrs) == 0
289
            rrs = self.slottable.get_reservations_ending_between(T1305, T1330)
290
            assert set(rrs) == set([rr1])
291
            rrs = self.slottable.get_reservations_ending_between(T1305, T1335)
292
            assert set(rrs) == set([rr1])
293
            rrs = self.slottable.get_reservations_ending_between(T1305, T1345)
294
            assert set(rrs) == set([rr1,rr3])
295
            rrs = self.slottable.get_reservations_ending_between(T1305, T1400)
296
            assert set(rrs) == set([rr1,rr2,rr3])
297
            rrs = self.slottable.get_reservations_ending_between(T1305, T1415)
298
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
299
            rrs = self.slottable.get_reservations_ending_between(T1315, T1330)
300
            assert set(rrs) == set([rr1])
301
            rrs = self.slottable.get_reservations_ending_between(T1315, T1335)
302
            assert set(rrs) == set([rr1])
303
            rrs = self.slottable.get_reservations_ending_between(T1315, T1345)
304
            assert set(rrs) == set([rr1,rr3])
305
            rrs = self.slottable.get_reservations_ending_between(T1315, T1400)
306
            assert set(rrs) == set([rr1,rr2,rr3])
307
            rrs = self.slottable.get_reservations_ending_between(T1315, T1415)
308
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
309
            rrs = self.slottable.get_reservations_ending_between(T1330, T1335)
310
            assert set(rrs) == set([rr1])
311
            rrs = self.slottable.get_reservations_ending_between(T1330, T1345)
312
            assert set(rrs) == set([rr1,rr3])
313
            rrs = self.slottable.get_reservations_ending_between(T1330, T1400)
314
            assert set(rrs) == set([rr1,rr2,rr3])
315
            rrs = self.slottable.get_reservations_ending_between(T1330, T1415)
316
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
317
            rrs = self.slottable.get_reservations_ending_between(T1335, T1345)
318
            assert set(rrs) == set([rr3])
319
            rrs = self.slottable.get_reservations_ending_between(T1335, T1400)
320
            assert set(rrs) == set([rr2,rr3])
321
            rrs = self.slottable.get_reservations_ending_between(T1335, T1415)
322
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
323
            rrs = self.slottable.get_reservations_ending_between(T1345, T1400)
324
            assert set(rrs) == set([rr2,rr3])
325
            rrs = self.slottable.get_reservations_ending_between(T1345, T1415)
326
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
327
            rrs = self.slottable.get_reservations_ending_between(T1400, T1415)
328
            assert set(rrs) == set([rr2,rr4,rr5])
329
            
330
            rrs = self.slottable.get_reservations_starting_on_or_after(T1300)
331
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
332
            rrs = self.slottable.get_reservations_starting_on_or_after(T1305)
333
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
334
            rrs = self.slottable.get_reservations_starting_on_or_after(T1315)
335
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
336
            rrs = self.slottable.get_reservations_starting_on_or_after(T1330)
337
            assert set(rrs) == set([rr2,rr4,rr5])
338
            rrs = self.slottable.get_reservations_starting_on_or_after(T1335)
339
            assert set(rrs) == set([rr5])
340
            rrs = self.slottable.get_reservations_starting_on_or_after(T1345)
341
            assert set(rrs) == set([rr5])
342
            rrs = self.slottable.get_reservations_starting_on_or_after(T1400)
343
            assert len(rrs) == 0
344
            rrs = self.slottable.get_reservations_starting_on_or_after(T1415)
345
            assert len(rrs) == 0
346
            
347
            rrs = self.slottable.get_reservations_ending_on_or_after(T1300)
348
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
349
            rrs = self.slottable.get_reservations_ending_on_or_after(T1305)
350
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
351
            rrs = self.slottable.get_reservations_ending_on_or_after(T1315)
352
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
353
            rrs = self.slottable.get_reservations_ending_on_or_after(T1330)
354
            assert set(rrs) == set([rr1,rr2,rr3,rr4,rr5])
355
            rrs = self.slottable.get_reservations_ending_on_or_after(T1335)
356
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
357
            rrs = self.slottable.get_reservations_ending_on_or_after(T1345)
358
            assert set(rrs) == set([rr2,rr3,rr4,rr5])
359
            rrs = self.slottable.get_reservations_ending_on_or_after(T1400)
360
            assert set(rrs) == set([rr2,rr4,rr5])
361
            rrs = self.slottable.get_reservations_ending_on_or_after(T1415)
362
            assert set(rrs) == set([rr4,rr5])
363
            
364
            assert self.slottable.get_next_changepoint(T1255) == T1300
365
            assert self.slottable.get_next_changepoint(T1300) == T1315
366
            assert self.slottable.get_next_changepoint(T1315) == T1330
367
            assert self.slottable.get_next_changepoint(T1330) == T1345
368
            assert self.slottable.get_next_changepoint(T1335) == T1345
369
            assert self.slottable.get_next_changepoint(T1345) == T1400
370
            assert self.slottable.get_next_changepoint(T1400) == T1415
371
            assert self.slottable.get_next_changepoint(T1415) == None
372
            assert self.slottable.get_next_changepoint(T1420) == None
373
        
374
        self.slottable = SlotTable([(constants.RES_CPU,ResourceTuple.SINGLE_INSTANCE),(constants.RES_MEM,ResourceTuple.SINGLE_INSTANCE)])
375
        FULL_NODE, HALF_NODE, QRTR_NODE, EMPT_NODE = create_capacities(self.slottable)
376
        
377
        self.slottable.add_node(1, FULL_NODE)
378
        self.slottable.add_node(2, FULL_NODE)  
379
        
380
        assert self.slottable.get_total_capacity(constants.RES_CPU) == 200
381
        assert self.slottable.get_total_capacity(constants.RES_MEM) == 2048
382
        assert self.slottable.is_empty()
383
    
384
        res1 = {1: HALF_NODE, 2: HALF_NODE}
385
        rr1 = ResourceReservation(None, T1300, T1330, res1)
386
        self.slottable.add_reservation(rr1)
387
        reservations_1_assertions()
388

    
389
        res2 = {1: QRTR_NODE, 2: HALF_NODE}
390
        rr2 = ResourceReservation(None, T1330, T1400, res2)
391
        self.slottable.add_reservation(rr2)
392
        reservations_2_assertions()
393

    
394
        res3 = {1: QRTR_NODE, 2: QRTR_NODE}
395
        rr3 = ResourceReservation(None, T1315, T1345, res3)
396
        self.slottable.add_reservation(rr3)
397
        reservations_3_assertions()
398

    
399
        res4 = {1: HALF_NODE, 2: QRTR_NODE}
400
        rr4 = ResourceReservation(None, T1330, T1415, res4)
401
        self.slottable.add_reservation(rr4)
402
        reservations_4_assertions()
403

    
404
        res5 = {2: QRTR_NODE}
405
        rr5 = ResourceReservation(None, T1345, T1415, res5)
406
        self.slottable.add_reservation(rr5)
407
        reservations_5_assertions()
408

    
409
        self.slottable.remove_reservation(rr5)
410
        reservations_4_assertions()
411
        self.slottable.remove_reservation(rr4)
412
        reservations_3_assertions()
413
        self.slottable.remove_reservation(rr3)
414
        reservations_2_assertions()
415
        self.slottable.remove_reservation(rr2)
416
        reservations_1_assertions()
417
        self.slottable.remove_reservation(rr1)
418
        
419
        assert self.slottable.is_empty()
420
        
421
    def test_availabilitywindow(self):
422
        def avail_node_assertions(time, avail, node_id, leases, next_cp):
423
            node = aw.changepoints[time].nodes[node_id]
424
            nleases = len(leases)
425
            assert(node.available == avail)
426
            
427
            assert(len(node.leases)==nleases)
428
            for l in leases:
429
                assert(l in node.leases)
430
            assert(len(node.available_if_preempting) == nleases)
431
            for l in leases:
432
                assert(node.available_if_preempting[l] == leases[l])
433
            assert(node.next_cp == next_cp)
434
            if next_cp != None:
435
                assert(node.next_nodeavail == aw.changepoints[next_cp].nodes[node_id])
436
        
437
        self.slottable, leases = sample_slottable_1()        
438
        FULL_NODE, HALF_NODE, QRTR_NODE, EMPT_NODE = create_capacities(self.slottable)
439
        
440
        lease1,lease2,lease3,lease4,lease5,lease6 = leases
441
        
442
        aw = self.slottable.get_availability_window(T1300)
443
        
444
        # TODO: Factor out data into a data structure so we can do more
445
        # elaborate assertions
446
        
447
        # 13:00
448
        avail_node_assertions(time = T1300, avail = EMPT_NODE, node_id = 1, 
449
                              leases = {lease6:FULL_NODE}, next_cp = T1305)
450
        avail_node_assertions(time = T1300, avail = FULL_NODE, node_id = 2, 
451
                              leases = {}, next_cp = T1315)
452
        avail_node_assertions(time = T1300, avail = FULL_NODE, node_id = 3, 
453
                              leases = {}, next_cp = T1330)
454
        avail_node_assertions(time = T1300, avail = FULL_NODE, node_id = 4, 
455
                              leases = {}, next_cp = T1330)
456

    
457

    
458
        # 13:05
459
        avail_node_assertions(time = T1305, avail = FULL_NODE, node_id = 1, 
460
                              leases = {}, next_cp = None)
461
        avail_node_assertions(time = T1305, avail = FULL_NODE, node_id = 2, 
462
                              leases = {}, next_cp = T1315)
463
        avail_node_assertions(time = T1305, avail = FULL_NODE, node_id = 3, 
464
                              leases = {}, next_cp = T1330)
465
        avail_node_assertions(time = T1305, avail = FULL_NODE, node_id = 4, 
466
                              leases = {}, next_cp = T1330)
467

    
468
        # 13:15
469
        avail_node_assertions(time = T1315, avail = FULL_NODE, node_id = 1, 
470
                              leases = {}, next_cp = None)
471
        avail_node_assertions(time = T1315, avail = HALF_NODE, node_id = 2, 
472
                              leases = {lease1:HALF_NODE}, next_cp = T1330)
473
        avail_node_assertions(time = T1315, avail = FULL_NODE, node_id = 3, 
474
                              leases = {}, next_cp = T1330)
475
        avail_node_assertions(time = T1315, avail = FULL_NODE, node_id = 4, 
476
                              leases = {}, next_cp = T1330)
477

    
478
        # 13:25
479
        avail_node_assertions(time = T1325, avail = FULL_NODE, node_id = 1, 
480
                              leases = {}, next_cp = None)
481
        avail_node_assertions(time = T1325, avail = HALF_NODE, node_id = 2, 
482
                              leases = {lease1:HALF_NODE}, next_cp = T1330)
483
        avail_node_assertions(time = T1325, avail = FULL_NODE, node_id = 3, 
484
                              leases = {}, next_cp = T1330)
485
        avail_node_assertions(time = T1325, avail = FULL_NODE, node_id = 4, 
486
                              leases = {}, next_cp = T1330)
487

    
488
        # 13:30
489
        avail_node_assertions(time = T1330, avail = FULL_NODE, node_id = 1, 
490
                              leases = {}, next_cp = None)
491
        avail_node_assertions(time = T1330, avail = EMPT_NODE, node_id = 2, 
492
                              leases = {lease2:FULL_NODE}, next_cp = T1345)
493
        avail_node_assertions(time = T1330, avail = EMPT_NODE, node_id = 3, 
494
                              leases = {lease2:FULL_NODE}, next_cp = T1345)
495
        avail_node_assertions(time = T1330, avail = EMPT_NODE, node_id = 4, 
496
                              leases = {lease3:FULL_NODE}, next_cp = T1400)
497

    
498
        # 13:45
499
        avail_node_assertions(time = T1345, avail = FULL_NODE, node_id = 1, 
500
                              leases = {}, next_cp = None)
501
        avail_node_assertions(time = T1345, avail = FULL_NODE, node_id = 2, 
502
                              leases = {}, next_cp = T1350)
503
        avail_node_assertions(time = T1345, avail = FULL_NODE, node_id = 3, 
504
                              leases = {}, next_cp = T1350)
505
        avail_node_assertions(time = T1345, avail = EMPT_NODE, node_id = 4, 
506
                              leases = {lease3:FULL_NODE}, next_cp = T1400)
507

    
508
        # 13:50
509
        avail_node_assertions(time = T1350, avail = FULL_NODE, node_id = 1, 
510
                              leases = {}, next_cp = None)
511
        avail_node_assertions(time = T1350, avail = HALF_NODE, node_id = 2, 
512
                              leases = {lease4:QRTR_NODE,lease5:QRTR_NODE}, next_cp = T1415)
513
        avail_node_assertions(time = T1350, avail = HALF_NODE, node_id = 3, 
514
                              leases = {lease4:HALF_NODE}, next_cp = T1415)
515
        avail_node_assertions(time = T1350, avail = EMPT_NODE, node_id = 4, 
516
                              leases = {lease3:FULL_NODE}, next_cp = T1400)
517

    
518
        # 13:55
519
        avail_node_assertions(time = T1355, avail = FULL_NODE, node_id = 1, 
520
                              leases = {}, next_cp = None)
521
        avail_node_assertions(time = T1355, avail = HALF_NODE, node_id = 2, 
522
                              leases = {lease4:QRTR_NODE,lease5:QRTR_NODE}, next_cp = T1415)
523
        avail_node_assertions(time = T1355, avail = HALF_NODE, node_id = 3, 
524
                              leases = {lease4:HALF_NODE}, next_cp = T1415)
525
        avail_node_assertions(time = T1355, avail = EMPT_NODE, node_id = 4, 
526
                              leases = {lease3:FULL_NODE}, next_cp = T1400)
527

    
528
        # 14:00
529
        avail_node_assertions(time = T1400, avail = FULL_NODE, node_id = 1, 
530
                              leases = {}, next_cp = None)
531
        avail_node_assertions(time = T1400, avail = HALF_NODE, node_id = 2, 
532
                              leases = {lease4:QRTR_NODE,lease5:QRTR_NODE}, next_cp = T1415)
533
        avail_node_assertions(time = T1400, avail = HALF_NODE, node_id = 3, 
534
                              leases = {lease4:HALF_NODE}, next_cp = T1415)
535
        avail_node_assertions(time = T1400, avail = FULL_NODE, node_id = 4, 
536
                              leases = {}, next_cp = None)
537

    
538
        # 14:15
539
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 1, 
540
                              leases = {}, next_cp = None)
541
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 2, 
542
                              leases = {}, next_cp = None)
543
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 3, 
544
                              leases = {}, next_cp = None)
545
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 4, 
546
                              leases = {}, next_cp = None)
547
        
548
        avail = aw.get_availability_at_node(T1300, 1)
549
        assert(len(avail.avail_list)==1)
550
        assert(avail.avail_list[0].available == EMPT_NODE)
551
        assert(avail.avail_list[0].until     == None)
552

    
553
        avail = aw.get_availability_at_node(T1300, 2)
554
        assert(len(avail.avail_list)==3)
555
        assert(avail.avail_list[0].available == FULL_NODE)
556
        assert(avail.avail_list[0].until     == T1315)
557
        assert(avail.avail_list[1].available == HALF_NODE)
558
        assert(avail.avail_list[1].until     == T1330)
559
        assert(avail.avail_list[2].available == EMPT_NODE)
560
        assert(avail.avail_list[2].until     == None)
561

    
562
        avail = aw.get_availability_at_node(T1300, 3)
563
        assert(len(avail.avail_list)==2)
564
        assert(avail.avail_list[0].available == FULL_NODE)
565
        assert(avail.avail_list[0].until     == T1330)
566
        assert(avail.avail_list[1].available == EMPT_NODE)
567
        assert(avail.avail_list[1].until     == None)
568

    
569
        avail = aw.get_availability_at_node(T1300, 4)
570
        assert(len(avail.avail_list)==2)
571
        assert(avail.avail_list[0].available == FULL_NODE)
572
        assert(avail.avail_list[0].until     == T1330)
573
        assert(avail.avail_list[1].available == EMPT_NODE)
574
        assert(avail.avail_list[1].until     == None)
575

    
576

    
577
        avail = aw.get_availability_at_node(T1330, 1)
578
        assert(len(avail.avail_list)==1)
579
        assert(avail.avail_list[0].available == FULL_NODE)
580
        assert(avail.avail_list[0].until     == None)
581

    
582
        avail = aw.get_availability_at_node(T1330, 2)
583
        assert(len(avail.avail_list)==1)
584
        assert(avail.avail_list[0].available == EMPT_NODE)
585
        assert(avail.avail_list[0].until     == None)
586

    
587
        avail = aw.get_availability_at_node(T1330, 3)
588
        assert(len(avail.avail_list)==1)
589
        assert(avail.avail_list[0].available == EMPT_NODE)
590
        assert(avail.avail_list[0].until     == None)
591

    
592
        avail = aw.get_availability_at_node(T1330, 4)
593
        assert(len(avail.avail_list)==1)
594
        assert(avail.avail_list[0].available == EMPT_NODE)
595
        assert(avail.avail_list[0].until     == None)
596
        
597
        
598
        avail = aw.get_availability_at_node(T1345, 1)
599
        assert(len(avail.avail_list)==1)
600
        assert(avail.avail_list[0].available == FULL_NODE)
601
        assert(avail.avail_list[0].until     == None)
602

    
603
        avail = aw.get_availability_at_node(T1345, 2)
604
        assert(len(avail.avail_list)==2)
605
        assert(avail.avail_list[0].available == FULL_NODE)
606
        assert(avail.avail_list[0].until     == T1350)
607
        assert(avail.avail_list[1].available == HALF_NODE)
608
        assert(avail.avail_list[1].until     == None)
609

    
610
        avail = aw.get_availability_at_node(T1345, 3)
611
        assert(len(avail.avail_list)==2)
612
        assert(avail.avail_list[0].available == FULL_NODE)
613
        assert(avail.avail_list[0].until     == T1350)
614
        assert(avail.avail_list[1].available == HALF_NODE)
615
        assert(avail.avail_list[1].until     == None)
616

    
617
        avail = aw.get_availability_at_node(T1345, 4)
618
        assert(len(avail.avail_list)==1)
619
        assert(avail.avail_list[0].available == EMPT_NODE)
620
        assert(avail.avail_list[0].until     == None)        
621

    
622
        self.slottable.awcache = None
623
        aw = self.slottable.get_availability_window(T1415)
624
        # 14:15
625
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 1, 
626
                              leases = {}, next_cp = None)
627
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 2, 
628
                              leases = {}, next_cp = None)
629
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 3, 
630
                              leases = {}, next_cp = None)
631
        avail_node_assertions(time = T1415, avail = FULL_NODE, node_id = 4, 
632
                              leases = {}, next_cp = None)
633

    
634
        avail = aw.get_availability_at_node(T1415, 1)
635
        assert(len(avail.avail_list)==1)
636
        assert(avail.avail_list[0].available == FULL_NODE)
637
        assert(avail.avail_list[0].until     == None)
638
        
639
        avail = aw.get_availability_at_node(T1415, 2)
640
        assert(len(avail.avail_list)==1)
641
        assert(avail.avail_list[0].available == FULL_NODE)
642
        assert(avail.avail_list[0].until     == None)
643
        
644
        avail = aw.get_availability_at_node(T1415, 3)
645
        assert(len(avail.avail_list)==1)
646
        assert(avail.avail_list[0].available == FULL_NODE)
647
        assert(avail.avail_list[0].until     == None)
648
        
649
        avail = aw.get_availability_at_node(T1415, 4)
650
        assert(len(avail.avail_list)==1)
651
        assert(avail.avail_list[0].available == FULL_NODE)
652
        assert(avail.avail_list[0].until     == None) 
653
        
654
        self.slottable, leases = sample_slottable_4()        
655
        FULL_NODE, HALF_NODE, QRTR_NODE, EMPT_NODE = create_capacities(self.slottable)
656
        
657
        lease1,lease2,lease3 = leases
658
        aw = self.slottable.get_availability_window(T1300)
659
        
660
        # 13:30
661
        avail_node_assertions(time = T1300, avail = FULL_NODE, node_id = 1, 
662
                              leases = {}, next_cp = T1315)
663
        avail_node_assertions(time = T1315, avail = HALF_NODE, node_id = 1, 
664
                              leases = {lease1:HALF_NODE}, next_cp = T1330)
665
        avail_node_assertions(time = T1330, avail = QRTR_NODE, node_id = 1, 
666
                              leases = {lease1:HALF_NODE,lease2:QRTR_NODE}, next_cp = T1415)
667
        
668
        avail = aw.get_availability_at_node(T1300, 1)
669
        assert(len(avail.avail_list)==3)
670
        assert(avail.avail_list[0].available == FULL_NODE)
671
        assert(avail.avail_list[0].until     == T1315)
672
        assert(avail.avail_list[1].available == HALF_NODE)
673
        assert(avail.avail_list[1].until     == T1330)
674
        assert(avail.avail_list[2].available == QRTR_NODE)
675
        assert(avail.avail_list[2].until     == None)
676
        
677