class NodeGcController extends BaseGcController<V1Node> {

    @VisibleForTesting
    boolean isNodeEligibleForGc(V1Node node) {
        String nodeName = KubeUtil.getMetadataName(node.getMetadata());
        Optional<V1NodeCondition> readyNodeConditionOpt = KubeUtil.findNodeCondition(node, READY);
        if (StringExt.isNotEmpty(nodeName) && readyNodeConditionOpt.isPresent()) {
            V1NodeCondition readyNodeCondition = readyNodeConditionOpt.get();
            boolean isReadyConditionTimestampPastGracePeriod = hasConditionGracePeriodElapsed(readyNodeCondition,
                    kubeControllerConfiguration.getNodeGcGracePeriodMs());
            return isReadyConditionTimestampPastGracePeriod && isAgentInstanceNotAvailable(nodeName);
        }
        return false;
    }

    @Inject public  NodeGcController(
            TitusRuntime titusRuntime,
            LocalScheduler scheduler,
            @Named(NODE_GC_CONTROLLER) FixedIntervalTokenBucketConfiguration tokenBucketConfiguration,
            @Named(NODE_GC_CONTROLLER) ControllerConfiguration controllerConfiguration,
            AgentManagementService agentManagementService,
            KubeApiFacade kubeApiFacade,
            KubeControllerConfiguration kubeControllerConfiguration
    );

}