+
+ # Provisional algo:
+ # look for perfectly defined nodes
+ # (ie: those with only one candidate)
+ to_provision = self._to_provision = set()
+ for guid, node in self._elements.iteritems():
+ if isinstance(node, self._node.Node) and node._node_id is None:
+ # Try existing nodes first
+ # If we have only one candidate, simply use it
+ candidates = node.find_candidates(
+ filter_slice_id = self.slice_id)
+ if len(candidates) == 1:
+ node.assign_node_id(iter(candidates).next())
+ else:
+ # Try again including unassigned nodes
+ candidates = node.find_candidates()
+ if len(candidates) > 1:
+ raise RuntimeError, "Cannot assign resources for node %s, too many candidates" % (guid,)
+ if len(candidates) == 1:
+ node_id = iter(candidates).next()
+ node.assign_node_id(node_id)
+ to_provision.add(node_id)
+ elif not candidates:
+ raise RuntimeError, "Cannot assign resources for node %s, no candidates" % (guid,)