Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: appengine/swarming/server/lease_management_test.py

Issue 2386793002: Reimplement Machine Provider integration (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « appengine/swarming/server/lease_management.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright 2015 The LUCI Authors. All rights reserved. 2 # Copyright 2015 The LUCI Authors. All rights reserved.
3 # Use of this source code is governed under the Apache License, Version 2.0 3 # Use of this source code is governed under the Apache License, Version 2.0
4 # that can be found in the LICENSE file. 4 # that can be found in the LICENSE file.
5 5
6 """Unit tests for lease_management.py.""" 6 """Unit tests for lease_management.py."""
7 7
8 import datetime 8 import datetime
9 import json 9 import json
10 import unittest 10 import unittest
(...skipping 18 matching lines...) Expand all
29 29
30 Args: 30 Args:
31 rpc_message: A protorpc.message.Message instance. 31 rpc_message: A protorpc.message.Message instance.
32 32
33 Returns: 33 Returns:
34 A string representing a JSON dict. 34 A string representing a JSON dict.
35 """ 35 """
36 return json.loads(protojson.encode_message(rpc_message)) 36 return json.loads(protojson.encode_message(rpc_message))
37 37
38 38
39 class CleanUpBotsTest(test_case.TestCase): 39 class DrainExcessTest(test_case.TestCase):
40 """Tests for lease_management.clean_up_bots.""" 40 """Tests for lease_management.drain_excess."""
41 41
42 def test_no_machine_types(self): 42 def test_no_machine_types(self):
43 lease_management.clean_up_bots() 43 lease_management.drain_excess()
44 44
45 def test_none_pending_deletion(self): 45 self.failIf(lease_management.MachineLease.query().count())
46 machine_type = lease_management.MachineType( 46
47 id='none-pending-deletion', 47 def test_nothing_to_drain(self):
48 key = lease_management.MachineType(
49 target_size=1,
50 ).put()
51 key = lease_management.MachineLease(
52 id='%s-0' % key.id(),
53 machine_type=key,
54 ).put()
55
56 lease_management.drain_excess()
57
58 self.assertEqual(lease_management.MachineLease.query().count(), 1)
59 self.failIf(key.get().drained)
60
61 def test_drain_one(self):
62 key = lease_management.MachineType(
63 target_size=0,
64 ).put()
65 key = lease_management.MachineLease(
66 id='%s-0' % key.id(),
67 machine_type=key,
68 ).put()
69
70 lease_management.drain_excess()
71
72 self.assertEqual(lease_management.MachineLease.query().count(), 1)
73 self.assertTrue(key.get().drained)
74
75 def test_drain_all(self):
76 key = lease_management.MachineType(
77 enabled=False,
78 target_size=3,
79 ).put()
80 lease_management.MachineLease(
81 id='%s-0' % key.id(),
82 machine_type=key,
83 ).put()
84 lease_management.MachineLease(
85 id='%s-1' % key.id(),
86 machine_type=key,
87 ).put()
88 lease_management.MachineLease(
89 id='%s-2' % key.id(),
90 machine_type=key,
91 ).put()
92
93 lease_management.drain_excess()
94
95 self.assertEqual(lease_management.MachineLease.query().count(), 3)
96 for machine_lease in lease_management.MachineLease.query():
97 self.assertTrue(machine_lease.drained)
98
99 def test_drain_batched(self):
100 key = lease_management.MachineType(
101 enabled=False,
48 target_size=2, 102 target_size=2,
49 ) 103 ).put()
50 machine_type.put() 104 lease_management.MachineLease(
105 id='%s-0' % key.id(),
106 machine_type=key,
107 ).put()
108 lease_management.MachineLease(
109 id='%s-1' % key.id(),
110 machine_type=key,
111 ).put()
112 key = lease_management.MachineType(
113 enabled=False,
114 target_size=2,
115 ).put()
116 lease_management.MachineLease(
117 id='%s-0' % key.id(),
118 machine_type=key,
119 ).put()
120 lease_management.MachineLease(
121 id='%s-1' % key.id(),
122 machine_type=key,
123 ).put()
124 key = lease_management.MachineType(
125 target_size=0,
126 ).put()
127 lease_management.MachineLease(
128 id='%s-0' % key.id(),
129 machine_type=key,
130 ).put()
51 131
52 lease_management.clean_up_bots() 132 # Choice of 2, 2, 1 above and 3 here ensures at least one batch contains
53 updated_machine_type = machine_type.key.get() 133 # MachineLease entities created for two different MachineTypes.
54 self.failIf(updated_machine_type.pending_deletion) 134 lease_management.drain_excess(max_concurrent=3)
55 135
56 def test_pending_deletion(self): 136 self.assertEqual(lease_management.MachineLease.query().count(), 5)
57 bot_ids = [] 137 for machine_lease in lease_management.MachineLease.query():
58 for i in xrange(200): 138 self.assertTrue(machine_lease.drained)
59 bot_ids.append('fake-bot-%d' % i)
60 bot_management.BotInfo(key=bot_management.get_info_key(bot_ids[-1])).put()
61 machine_type = lease_management.MachineType(
62 id='few-pending-deletion',
63 pending_deletion=bot_ids,
64 target_size=2,
65 )
66 machine_type.put()
67
68 lease_management.clean_up_bots()
69 updated_machine_type = machine_type.key.get()
70 self.failIf(updated_machine_type.pending_deletion)
71 for bot_id in bot_ids:
72 self.failIf(bot_management.get_info_key(bot_id).get())
73 139
74 140
75 class ClearBotsPendingDeletionTest(test_case.TestCase):
76 """Tests for lease_management._clear_bots_pending_deletion."""
77 141
78 def test_machine_type_not_found(self): 142 class EnsureEntitiesExistTest(test_case.TestCase):
79 machine_type = lease_management.MachineType( 143 """Tests for lease_management.ensure_entities_exist."""
80 id='not-found',
81 pending_deletion=['fake-bot-1', 'fake-bot-2'],
82 )
83 144
84 lease_management._clear_bots_pending_deletion( 145 def test_no_machine_types(self):
85 machine_type.key, ['fake-bot-1', 'fake-bot-2']) 146 lease_management.ensure_entities_exist()
86 self.assertEqual(len(machine_type.pending_deletion), 2)
87 147
88 def test_machine_type_none_pending_deletion(self): 148 self.failIf(lease_management.MachineLease.query().count())
89 machine_type = lease_management.MachineType( 149
90 id='none-pending-deletion', 150 def test_no_enabled_machine_types(self):
151 lease_management.MachineType(
152 enabled=False,
153 target_size=3,
154 ).put()
155
156 lease_management.ensure_entities_exist()
157
158 self.failIf(lease_management.MachineLease.query().count())
159
160 def test_one_enabled_machine_type(self):
161 lease_management.MachineType(
162 target_size=1,
163 ).put()
164
165 lease_management.ensure_entities_exist()
166
167 self.assertEqual(lease_management.MachineLease.query().count(), 1)
168
169 def test_two_enabled_machine_types(self):
170 lease_management.MachineType(
171 id='a',
172 target_size=1,
173 ).put()
174 lease_management.MachineType(
175 id='b',
176 target_size=1,
177 ).put()
178
179 lease_management.ensure_entities_exist()
180
181 self.assertEqual(lease_management.MachineLease.query().count(), 2)
182 self.failUnless(lease_management.MachineLease.get_by_id('a-0'))
183 self.failUnless(lease_management.MachineLease.get_by_id('b-0'))
184
185 def test_one_machine_type_multiple_batches(self):
186 lease_management.MachineType(
187 id='machine-type',
188 target_size=5,
189 ).put()
190
191 # Choice of 3 here and 5 above ensures MachineLeases are created in two
192 # batches of differing sizes.
193 lease_management.ensure_entities_exist(max_concurrent=3)
194
195 self.assertEqual(lease_management.MachineLease.query().count(), 5)
196 self.failUnless(lease_management.MachineLease.get_by_id('machine-type-0'))
197 self.failUnless(lease_management.MachineLease.get_by_id('machine-type-1'))
198 self.failUnless(lease_management.MachineLease.get_by_id('machine-type-2'))
199 self.failUnless(lease_management.MachineLease.get_by_id('machine-type-3'))
200 self.failUnless(lease_management.MachineLease.get_by_id('machine-type-4'))
201
202 def test_three_machine_types_multiple_batches(self):
203 lease_management.MachineType(
204 id='a',
91 target_size=2, 205 target_size=2,
92 ) 206 ).put()
93 machine_type.put() 207 lease_management.MachineType(
208 id='b',
209 target_size=2,
210 ).put()
211 lease_management.MachineType(
212 id='c',
213 target_size=1,
214 ).put()
94 215
95 lease_management._clear_bots_pending_deletion(machine_type.key, []) 216 # Choice of 2, 2, 1 above and 3 here ensures at least one batch contains
96 updated_machine_type = machine_type.key.get() 217 # MachineLease entities created for two different MachineTypes.
97 self.failIf(updated_machine_type.pending_deletion) 218 lease_management.ensure_entities_exist(max_concurrent=3)
98 219
99 def test_machine_type_pending_deletion(self): 220 self.assertEqual(lease_management.MachineLease.query().count(), 5)
100 machine_type = lease_management.MachineType( 221 self.failUnless(lease_management.MachineLease.get_by_id('a-0'))
101 id='pending-deletion', 222 self.failUnless(lease_management.MachineLease.get_by_id('a-1'))
102 pending_deletion=['fake-bot-1', 'fake-bot-2'], 223 self.failUnless(lease_management.MachineLease.get_by_id('b-0'))
103 target_size=2, 224 self.failUnless(lease_management.MachineLease.get_by_id('b-1'))
104 ) 225 self.failUnless(lease_management.MachineLease.get_by_id('c-0'))
105 machine_type.put()
106
107 lease_management._clear_bots_pending_deletion(
108 machine_type.key, ['fake-bot-1'])
109 updated_machine_type = machine_type.key.get()
110 self.assertEqual(len(updated_machine_type.pending_deletion), 1)
111 self.assertEqual(updated_machine_type.pending_deletion[0], 'fake-bot-2')
112
113
114 class GenerateLeaseRequestsTest(test_case.TestCase):
115 """Tests for lease_management.generate_lease_requests."""
116
117 def test_machine_type_not_found(self):
118 machine_type = lease_management.MachineType(
119 id='not-found',
120 leases=[
121 lease_management.MachineLease(
122 client_request_id='fake-id',
123 request_hash='fake-hash',
124 ),
125 ],
126 mp_dimensions=machine_provider.Dimensions(
127 os_family=machine_provider.OSFamily.LINUX,
128 ),
129 target_size=2,
130 )
131
132 requests = lease_management.generate_lease_requests(
133 machine_type.key, 'example', 'https://example.com')
134 self.failIf(requests)
135
136 def test_machine_type_not_enabled(self):
137 machine_type = lease_management.MachineType(
138 id='not-enabled',
139 enabled=False,
140 leases=[
141 lease_management.MachineLease(
142 client_request_id='fake-id-1',
143 request_hash='fake-hash',
144 ),
145 ],
146 mp_dimensions=machine_provider.Dimensions(
147 os_family=machine_provider.OSFamily.LINUX,
148 ),
149 request_count=1,
150 target_size=2,
151 )
152 machine_type.put()
153
154 requests = lease_management.generate_lease_requests(
155 machine_type.key, 'example', 'https://example.com')
156 self.assertEqual(len(requests), 1)
157 self.assertEqual(requests[0].request_id, 'fake-id-1')
158
159 def test_need_one(self):
160 machine_type = lease_management.MachineType(
161 id='need-one',
162 mp_dimensions=machine_provider.Dimensions(
163 os_family=machine_provider.OSFamily.LINUX,
164 ),
165 target_size=1,
166 )
167 machine_type.put()
168
169 requests = lease_management.generate_lease_requests(
170 machine_type.key, 'example', 'https://example.com')
171 updated_machine_type = machine_type.key.get()
172 self.assertEqual(len(requests), 1)
173 self.assertEqual(len(updated_machine_type.leases), 1)
174 self.assertEqual(
175 updated_machine_type.leases[0].client_request_id, 'need-one-1')
176 self.assertEqual(updated_machine_type.request_count, 1)
177
178
179 class CleanUpExpiredLeasesTest(test_case.TestCase):
180 """Tests for lease_management._clean_up_expired_leases."""
181
182 def test_machine_type_no_leases(self):
183 machine_type = lease_management.MachineType(
184 id='no-leases',
185 leases=[],
186 mp_dimensions=machine_provider.Dimensions(
187 os_family=machine_provider.OSFamily.LINUX,
188 ),
189 target_size=2,
190 )
191
192 expired = lease_management._clean_up_expired_leases(machine_type)
193 self.failIf(expired)
194 self.failIf(machine_type.leases)
195 self.failIf(machine_type.pending_deletion)
196
197 def test_machine_type_no_expired_leases(self):
198 machine_type = lease_management.MachineType(
199 id='no-leases',
200 leases=[
201 lease_management.MachineLease(
202 client_request_id='fake-id-1',
203 request_hash='fake-hash-1',
204 ),
205 lease_management.MachineLease(
206 client_request_id='fake-id-2',
207 hostname='fake-host',
208 lease_expiration_ts=(
209 utils.utcnow() + datetime.timedelta(seconds=60)),
210 request_hash='fake-hash-2',
211 ),
212 ],
213 mp_dimensions=machine_provider.Dimensions(
214 os_family=machine_provider.OSFamily.LINUX,
215 ),
216 target_size=2,
217 )
218
219 expired = lease_management._clean_up_expired_leases(machine_type)
220 self.failIf(expired)
221 self.assertEqual(len(machine_type.leases), 2)
222 self.failIf(machine_type.pending_deletion)
223
224 def test_machine_type_one_expired_lease(self):
225 machine_type = lease_management.MachineType(
226 id='no-leases',
227 leases=[
228 lease_management.MachineLease(
229 client_request_id='fake-id-1',
230 request_hash='fake-hash-1',
231 ),
232 lease_management.MachineLease(
233 client_request_id='fake-id-2',
234 hostname='fake-host-2',
235 lease_expiration_ts=utils.EPOCH,
236 request_hash='fake-hash-2',
237 ),
238 ],
239 mp_dimensions=machine_provider.Dimensions(
240 os_family=machine_provider.OSFamily.LINUX,
241 ),
242 pending_deletion=[
243 'fake-host-3',
244 ],
245 target_size=2,
246 )
247
248 expired = lease_management._clean_up_expired_leases(machine_type)
249 self.assertEqual(len(expired), 1)
250 self.assertEqual(expired[0], 'fake-host-2')
251 self.assertEqual(len(machine_type.leases), 1)
252 self.assertEqual(machine_type.leases[0].client_request_id, 'fake-id-1')
253 self.assertEqual(machine_type.leases[0].request_hash, 'fake-hash-1')
254 self.assertEqual(len(machine_type.pending_deletion), 2)
255 hostnames = sorted(machine_type.pending_deletion)
256 self.assertEqual(hostnames[0], 'fake-host-2')
257 self.assertEqual(hostnames[1], 'fake-host-3')
258
259
260 class GenerateLeaseRequestStatusUpdatesTest(test_case.TestCase):
261 """Tests for lease_management._generate_lease_request_status_updates."""
262
263 def test_machine_type_no_leases(self):
264 machine_type = lease_management.MachineType(
265 id='no-leases',
266 leases=[],
267 mp_dimensions=machine_provider.Dimensions(
268 os_family=machine_provider.OSFamily.LINUX,
269 ),
270 target_size=2,
271 )
272
273 requests = lease_management._generate_lease_request_status_updates(
274 machine_type, 'example', 'https://example.com')
275 self.failIf(requests)
276
277 def test_machine_type_none_pending(self):
278 machine_type = lease_management.MachineType(
279 id='none-pending',
280 leases=[
281 lease_management.MachineLease(
282 client_request_id='fake-id',
283 hostname='fake-host',
284 request_hash='fake-hash',
285 ),
286 ],
287 mp_dimensions=machine_provider.Dimensions(
288 os_family=machine_provider.OSFamily.LINUX,
289 ),
290 target_size=2,
291 )
292
293 requests = lease_management._generate_lease_request_status_updates(
294 machine_type, 'example', 'https://example.com')
295 self.failIf(requests)
296
297 def test_machine_type_one_pending(self):
298 machine_type = lease_management.MachineType(
299 id='one-pending',
300 leases=[
301 lease_management.MachineLease(
302 client_request_id='fake-id-1',
303 hostname='fake-host-1',
304 request_hash='fake-hash-1',
305 ),
306 lease_management.MachineLease(
307 client_request_id='fake-id-2',
308 hostname='fake-host-2',
309 request_hash='fake-hash-2',
310 ),
311 lease_management.MachineLease(
312 client_request_id='fake-id-3',
313 request_hash='fake-hash-3',
314 ),
315 ],
316 mp_dimensions=machine_provider.Dimensions(
317 os_family=machine_provider.OSFamily.LINUX,
318 ),
319 target_size=2,
320 )
321
322 requests = lease_management._generate_lease_request_status_updates(
323 machine_type, 'example', 'https://example.com')
324 self.assertEqual(len(requests), 1)
325 self.assertEqual(requests[0].request_id, 'fake-id-3')
326
327
328 class GenerateLeaseRequestsForNewMachinesTest(test_case.TestCase):
329 """Tests for lease_management._generate_lease_requests_for_new_machines."""
330
331 def test_machine_type_at_capacity(self):
332 machine_type = lease_management.MachineType(
333 id='at-capacity',
334 leases=[
335 lease_management.MachineLease(
336 client_request_id='fake-id-1',
337 request_hash='fake-hash-1',
338 ),
339 lease_management.MachineLease(
340 client_request_id='fake-id-2',
341 request_hash='fake-hash-2',
342 ),
343 ],
344 mp_dimensions=machine_provider.Dimensions(
345 os_family=machine_provider.OSFamily.LINUX,
346 ),
347 target_size=2,
348 )
349
350 requests = lease_management._generate_lease_requests_for_new_machines(
351 machine_type, 'example', 'https://example.com')
352 self.failIf(requests)
353
354 def test_need_one(self):
355 machine_type = lease_management.MachineType(
356 id='need-one',
357 mp_dimensions=machine_provider.Dimensions(
358 os_family=machine_provider.OSFamily.LINUX,
359 ),
360 target_size=1,
361 )
362
363 requests = lease_management._generate_lease_requests_for_new_machines(
364 machine_type, 'example', 'https://example.com')
365 self.assertEqual(len(requests), 1)
366
367 def test_ensure_correct_request_ids(self):
368 machine_type = lease_management.MachineType(
369 id='ensure-correct-request-ids',
370 mp_dimensions=machine_provider.Dimensions(
371 os_family=machine_provider.OSFamily.LINUX,
372 ),
373 request_count=2,
374 target_size=2,
375 )
376
377 requests = lease_management._generate_lease_requests_for_new_machines(
378 machine_type, 'example', 'https://example.com')
379 self.assertEqual(len(requests), 2)
380 request_ids = sorted(request.request_id for request in requests)
381 self.assertEqual(request_ids[0], 'ensure-correct-request-ids-3')
382 self.assertEqual(request_ids[1], 'ensure-correct-request-ids-4')
383
384
385 class UpdateLeasesTest(test_case.TestCase):
386 """Tests for lease_management.update_leases."""
387
388 def test_leases_fulfilled(self):
389 machine_type = lease_management.MachineType(
390 id='fulfilled',
391 leases=[
392 lease_management.MachineLease(client_request_id='fake-id-1'),
393 lease_management.MachineLease(client_request_id='fake-id-2'),
394 ],
395 mp_dimensions=machine_provider.Dimensions(
396 os_family=machine_provider.OSFamily.LINUX,
397 ),
398 target_size=2,
399 )
400 machine_type.put()
401
402 responses = rpc_to_json(machine_provider.BatchedLeaseResponse(responses=[
403 machine_provider.LeaseResponse(
404 client_request_id='fake-id-1',
405 hostname='fake-host-1',
406 lease_expiration_ts=1,
407 request_hash='fake-hash-1',
408 state=machine_provider.LeaseRequestState.FULFILLED,
409 ),
410 machine_provider.LeaseResponse(
411 client_request_id='fake-id-2',
412 hostname='fake-host-2',
413 lease_expiration_ts=2,
414 request_hash='fake-hash-2',
415 state=machine_provider.LeaseRequestState.FULFILLED,
416 ),
417 ]))
418
419 lease_management.update_leases(machine_type.key, responses['responses'])
420 updated_machine_type = machine_type.key.get()
421 self.assertEqual(len(updated_machine_type.leases), 2)
422 self.failUnless(updated_machine_type.leases[0].hostname)
423 self.failUnless(updated_machine_type.leases[1].hostname)
424 self.failUnless(updated_machine_type.leases[0].lease_expiration_ts)
425 self.failUnless(updated_machine_type.leases[1].lease_expiration_ts)
426 request_hashes = sorted(
427 lease.request_hash for lease in updated_machine_type.leases)
428 self.assertEqual(request_hashes[0], 'fake-hash-1')
429 self.assertEqual(request_hashes[1], 'fake-hash-2')
430
431 def test_lease_denied(self):
432 machine_type = lease_management.MachineType(
433 id='denied',
434 leases=[
435 lease_management.MachineLease(client_request_id='fake-id-1'),
436 lease_management.MachineLease(client_request_id='fake-id-2'),
437 ],
438 mp_dimensions=machine_provider.Dimensions(
439 os_family=machine_provider.OSFamily.LINUX,
440 ),
441 target_size=2,
442 )
443 machine_type.put()
444
445 responses = rpc_to_json(machine_provider.BatchedLeaseResponse(responses=[
446 machine_provider.LeaseResponse(
447 client_request_id='fake-id-1',
448 request_hash='fake-hash-1',
449 state=machine_provider.LeaseRequestState.DENIED,
450 ),
451 ]))
452
453 lease_management.update_leases(machine_type.key, responses['responses'])
454 updated_machine_type = machine_type.key.get()
455 self.assertEqual(len(updated_machine_type.leases), 1)
456 self.assertEqual(
457 updated_machine_type.leases[0].client_request_id, 'fake-id-2')
458 self.failIf(updated_machine_type.leases[0].hostname)
459 self.failIf(updated_machine_type.leases[0].lease_expiration_ts)
460 self.failIf(updated_machine_type.leases[0].request_hash)
461
462 def test_lease_untriaged(self):
463 machine_type = lease_management.MachineType(
464 id='untriaged',
465 leases=[
466 lease_management.MachineLease(client_request_id='fake-id-1'),
467 ],
468 mp_dimensions=machine_provider.Dimensions(
469 os_family=machine_provider.OSFamily.LINUX,
470 ),
471 target_size=2,
472 )
473 machine_type.put()
474
475 responses = rpc_to_json(machine_provider.BatchedLeaseResponse(responses=[
476 machine_provider.LeaseResponse(
477 client_request_id='fake-id-1',
478 request_hash='fake-hash-1',
479 state=machine_provider.LeaseRequestState.UNTRIAGED,
480 ),
481 ]))
482
483 lease_management.update_leases(machine_type.key, responses['responses'])
484 updated_machine_type = machine_type.key.get()
485 self.assertEqual(len(updated_machine_type.leases), 1)
486 self.assertEqual(
487 updated_machine_type.leases[0].client_request_id, 'fake-id-1')
488 self.failIf(updated_machine_type.leases[0].hostname)
489 self.failIf(updated_machine_type.leases[0].lease_expiration_ts)
490 self.assertEqual(updated_machine_type.leases[0].request_hash, 'fake-hash-1')
491
492 def test_lease_expired(self):
493 machine_type = lease_management.MachineType(
494 id='untriaged',
495 leases=[
496 lease_management.MachineLease(client_request_id='fake-id-1'),
497 ],
498 mp_dimensions=machine_provider.Dimensions(
499 os_family=machine_provider.OSFamily.LINUX,
500 ),
501 target_size=2,
502 )
503 machine_type.put()
504
505 responses = rpc_to_json(machine_provider.BatchedLeaseResponse(responses=[
506 machine_provider.LeaseResponse(
507 client_request_id='fake-id-1',
508 request_hash='fake-hash-1',
509 state=machine_provider.LeaseRequestState.FULFILLED,
510 ),
511 ]))
512
513 lease_management.update_leases(machine_type.key, responses['responses'])
514 updated_machine_type = machine_type.key.get()
515 self.failIf(updated_machine_type.leases)
516
517 def test_lease_errors(self):
518 machine_type = lease_management.MachineType(
519 id='errors',
520 leases=[
521 lease_management.MachineLease(client_request_id='fake-id-1'),
522 lease_management.MachineLease(client_request_id='fake-id-2'),
523 lease_management.MachineLease(client_request_id='fake-id-3'),
524 ],
525 mp_dimensions=machine_provider.Dimensions(
526 os_family=machine_provider.OSFamily.LINUX,
527 ),
528 target_size=2,
529 )
530 machine_type.put()
531
532 responses = rpc_to_json(machine_provider.BatchedLeaseResponse(responses=[
533 machine_provider.LeaseResponse(
534 client_request_id='fake-id-1',
535 error=machine_provider.LeaseRequestError.DEADLINE_EXCEEDED,
536 ),
537 machine_provider.LeaseResponse(
538 client_request_id='fake-id-2',
539 error=machine_provider.LeaseRequestError.REQUEST_ID_REUSE,
540 ),
541 machine_provider.LeaseResponse(
542 client_request_id='fake-id-3',
543 error=machine_provider.LeaseRequestError.TRANSIENT_ERROR,
544 ),
545 ]))
546
547 lease_management.update_leases(machine_type.key, responses['responses'])
548 updated_machine_type = machine_type.key.get()
549 self.assertEqual(len(updated_machine_type.leases), 2)
550 request_ids = sorted(
551 request.client_request_id for request in updated_machine_type.leases)
552 self.assertEqual(request_ids[0], 'fake-id-1')
553 self.assertEqual(request_ids[1], 'fake-id-3')
554 226
555 227
556 if __name__ == '__main__': 228 if __name__ == '__main__':
557 unittest.main() 229 unittest.main()
OLDNEW
« no previous file with comments | « appengine/swarming/server/lease_management.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698