class JobQuotaController implements QuotaController<Job<?>> {

    @VisibleForTesting
    static List<QuotaController<Job<?>>> buildQuotaControllers(Job<?> job,
                                                               V3JobOperations jobOperations,
                                                               EffectiveJobDisruptionBudgetResolver effectiveDisruptionBudgetResolver,
                                                               TitusRuntime titusRuntime) {
        List<QuotaController<Job<?>>> quotaControllers = new ArrayList<>();

        DisruptionBudget effectiveBudget = effectiveDisruptionBudgetResolver.resolve(job);
        if (effectiveBudget.getDisruptionBudgetRate() instanceof PercentagePerHourDisruptionBudgetRate) {
            quotaControllers.add(JobPercentagePerHourRelocationRateController.newJobPercentagePerHourRelocationRateController(job, effectiveDisruptionBudgetResolver, titusRuntime));
        } else if (effectiveBudget.getDisruptionBudgetRate() instanceof RatePercentagePerIntervalDisruptionBudgetRate) {
            quotaControllers.add(JobPercentagePerIntervalRateController.newJobPercentagePerIntervalRateController(job, effectiveDisruptionBudgetResolver, titusRuntime));
        } else if (effectiveBudget.getDisruptionBudgetRate() instanceof RatePerIntervalDisruptionBudgetRate) {
            quotaControllers.add(RatePerIntervalRateController.newRatePerIntervalRateController(job, effectiveDisruptionBudgetResolver, titusRuntime));
        }

        DisruptionBudgetPolicy policy = effectiveBudget.getDisruptionBudgetPolicy();
        if (policy instanceof RelocationLimitDisruptionBudgetPolicy) {
            quotaControllers.add(new TaskRelocationLimitController(job, jobOperations, effectiveDisruptionBudgetResolver));
        }
        return quotaControllers;
    }

    public  JobQuotaController(Job<?> job,
                              V3JobOperations jobOperations,
                              EffectiveJobDisruptionBudgetResolver effectiveDisruptionBudgetResolver,
                              ContainerHealthService containerHealthService,
                              TitusRuntime titusRuntime);
    private  JobQuotaController(Job<?> newJob,
                               V3JobOperations jobOperations,
                               EffectiveJobDisruptionBudgetResolver effectiveDisruptionBudgetResolver,
                               ContainerHealthService containerHealthService,
                               JobQuotaController previousJobQuotaController,
                               TitusRuntime titusRuntime);

}