private List<Move> move(Node node, Node host, List<Node> hosts, List<Move> movesConsidered, List<Move> movesMade) {
            if (contains(node, movesConsidered)) return null;
            if (contains(node, movesMade)) return null;
            List<Move> shortest = null;
            for (Node target : hosts) {
                if (target.equals(host)) continue;
                Move move = new Move(node, host, target);
                List<Move> childMoves = makeRoomFor(node, target, hosts, append(movesConsidered, move), movesMade);
                if (childMoves == null) continue;
                if (shortest == null || shortest.size() > childMoves.size() + 1) {
                    shortest = new ArrayList<>(childMoves);
                    shortest.add(move);
                }
            }
            return shortest;
        }
Finds the shortest sequence of moves which makes room for the given node on the given host,
assuming the given moves already made over the given hosts' current allocation.

@param node the node to make room for
@param host the target host to make room on
@param hosts the hosts onto which we can move nodes
@param movesConsidered the moves already being considered to add as part of this scenario
                       (after any moves made by this)
@param movesMade the moves already made in this scenario
@return the list of movesMade with the moves needed for this appended, in the order they should be performed,
        or null if no sequence could be found
node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java