Revision 41be279f
b/qa/qa_config.py | ||
---|---|---|
553 | 553 |
return GetConfig().IsTemplateSupported(templ) |
554 | 554 |
|
555 | 555 |
|
556 |
def _NodeSortKey(node): |
|
557 |
"""Returns sort key for a node. |
|
558 |
|
|
559 |
@type node: L{_QaNode} |
|
560 |
|
|
561 |
""" |
|
562 |
return (node.use_count, utils.NiceSortKey(node.primary)) |
|
563 |
|
|
564 |
|
|
556 | 565 |
def AcquireNode(exclude=None, _cfg=None): |
557 | 566 |
"""Returns the least used node. |
558 | 567 |
|
... | ... | |
578 | 587 |
if not nodes: |
579 | 588 |
raise qa_error.OutOfNodesError("No nodes left") |
580 | 589 |
|
581 |
# Get node with least number of uses |
|
582 |
# TODO: Switch to computing sort key instead of comparing directly |
|
583 |
def compare(a, b): |
|
584 |
result = cmp(a.use_count, b.use_count) |
|
585 |
if result == 0: |
|
586 |
result = cmp(a.primary, b.primary) |
|
587 |
return result |
|
588 |
|
|
589 |
nodes.sort(cmp=compare) |
|
590 |
|
|
591 |
return nodes[0].Use() |
|
590 |
# Return node with least number of uses |
|
591 |
return sorted(nodes, key=_NodeSortKey)[0].Use() |
|
592 | 592 |
|
593 | 593 |
|
594 | 594 |
def AcquireManyNodes(num, exclude=None): |
b/test/py/qa.qa_config_unittest.py | ||
---|---|---|
349 | 349 |
self.assertRaises(qa_error.OutOfNodesError, qa_config.AcquireNode, |
350 | 350 |
exclude=acquired, _cfg=self.config) |
351 | 351 |
|
352 |
def testAcquireNodeOrder(self): |
|
353 |
# Mark all nodes as marked (master excluded) |
|
354 |
for node in self.config["nodes"]: |
|
355 |
if node != self.config.GetMasterNode(): |
|
356 |
node.MarkAdded() |
|
357 |
|
|
358 |
nodecount = len(self.config["nodes"]) |
|
359 |
|
|
360 |
for iterations in [0, 1, 3, 100, 127, 7964]: |
|
361 |
acquired = [] |
|
362 |
|
|
363 |
for i in range(iterations): |
|
364 |
node = qa_config.AcquireNode(_cfg=self.config) |
|
365 |
self.assertTrue(node.use_count > 0) |
|
366 |
self.assertEqual(node.use_count, (i / nodecount + 1)) |
|
367 |
acquired.append((node.use_count, node.primary, node)) |
|
368 |
|
|
369 |
# Check if returned nodes were in correct order |
|
370 |
key_fn = lambda (a, b, c): (a, utils.NiceSortKey(b), c) |
|
371 |
self.assertEqual(acquired, sorted(acquired, key=key_fn)) |
|
372 |
|
|
373 |
# Release previously acquired nodes |
|
374 |
qa_config.ReleaseManyNodes(map(operator.itemgetter(2), acquired)) |
|
375 |
|
|
376 |
# Check if nodes were actually released |
|
377 |
for node in self.config["nodes"]: |
|
378 |
self.assertEqual(node.use_count, 0) |
|
379 |
self.assertTrue(node.added or node == self.config.GetMasterNode()) |
|
380 |
|
|
352 | 381 |
|
353 | 382 |
class TestRepresentation(unittest.TestCase): |
354 | 383 |
def _Check(self, target, part): |
Also available in: Unified diff