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