diff --git a/qa/qa_config.py b/qa/qa_config.py index afa553de0a944533b7d0739c853870a6050cc552..ae6021fb8d4b2a71b811056244e74b20317aa4e5 100644 --- a/qa/qa_config.py +++ b/qa/qa_config.py @@ -296,5 +296,41 @@ def AcquireNode(exclude=None): return node +def AcquireManyNodes(num, exclude=None): + """Return the least used nodes. + + @type num: int + @param num: Number of nodes; can be 0. + @type exclude: list of nodes or C{None} + @param exclude: nodes to be excluded from the choice + @rtype: list of nodes + @return: C{num} different nodes + + """ + nodes = [] + if exclude is None: + exclude = [] + elif isinstance(exclude, (list, tuple)): + # Don't modify the incoming argument + exclude = list(exclude) + else: + exclude = [exclude] + + try: + for _ in range(0, num): + n = AcquireNode(exclude=exclude) + nodes.append(n) + exclude.append(n) + except qa_error.OutOfNodesError: + ReleaseManyNodes(nodes) + raise + return nodes + + def ReleaseNode(node): node["_count"] = node.get("_count", 0) - 1 + + +def ReleaseManyNodes(nodes): + for n in nodes: + ReleaseNode(n)