private Optional<Instant> downSince(Node node) {
        Optional<Instant> downInstant = node.history().downSince();
        if (downInstant.isEmpty()) return Optional.empty();

        Instant downSince = Stream.of(downInstant,
                                      node.history().resumedSince(),
                                      node.history().event(History.Event.Type.activated).map(History.Event::at))
                                  .filter(Optional::isPresent)
                                  .map(Optional::get)
                                  .max(Comparator.naturalOrder())
                                  .orElseThrow();
        Duration graceDuration = node.history().isSuspended() ? suspendedDownTimeLimit : downTimeLimit;
        if (clock().instant().isBefore(downSince.plus(graceDuration))) return Optional.empty();

        if (applicationSuspended(node)) return Optional.empty();
        if (affectedByMaintenance(node)) return Optional.empty();
        if (busySnapshotting(node, downSince)) return Optional.empty();

        return Optional.of(downSince);
    }
Returns whether node has any kind of hardware issue
node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java