use of com.netflix.titus.runtime.connector.eviction.EvictionConfiguration in project titus-control-plane by Netflix.
the class TitusQuotasManagerTest method isJobExemptFromSystemDisruptionWindow.
@Test
public void isJobExemptFromSystemDisruptionWindow() {
Job<BatchJobExt> job1 = JobGenerator.oneBatchJob().but(withApplicationName("app1Test"));
EvictionConfiguration config1 = mock(EvictionConfiguration.class);
when(config1.getAppsExemptFromSystemDisruptionWindow()).thenReturn("app1.*");
TitusQuotasManager titusQuotasManager = new TitusQuotasManager(null, null, null, null, config1, null);
boolean jobExemptFromSystemDisruptionBudget = titusQuotasManager.isJobExemptFromSystemDisruptionWindow(job1);
assertThat(jobExemptFromSystemDisruptionBudget).isTrue();
EvictionConfiguration config2 = mock(EvictionConfiguration.class);
when(config2.getAppsExemptFromSystemDisruptionWindow()).thenReturn("app2.*");
TitusQuotasManager titusQuotasManager2 = new TitusQuotasManager(null, null, null, null, config2, null);
boolean jobExemptFromSystemDisruptionBudget2 = titusQuotasManager2.isJobExemptFromSystemDisruptionWindow(job1);
assertThat(jobExemptFromSystemDisruptionBudget2).isFalse();
}
use of com.netflix.titus.runtime.connector.eviction.EvictionConfiguration in project titus-control-plane by Netflix.
the class TitusQuotasManagerTest method tryConsumeSystemAndJobQuota.
@Test
public void tryConsumeSystemAndJobQuota() {
String taskId = "job1Task1";
String jobQuotaRejectionReason = "Job does not allow any more terminations";
Job<BatchJobExt> job1 = JobGenerator.oneBatchJob().but(withApplicationName("app1Test"));
EvictionConfiguration config1 = mock(EvictionConfiguration.class);
when(config1.getAppsExemptFromSystemDisruptionWindow()).thenReturn("app1.*");
SystemQuotaController systemQuotaController = mock(SystemQuotaController.class);
when(systemQuotaController.consume(taskId)).thenReturn(ConsumptionResult.approved());
JobQuotaController jobQuotaController = mock(JobQuotaController.class);
when(jobQuotaController.consume(taskId)).thenReturn(ConsumptionResult.rejected(jobQuotaRejectionReason));
TitusQuotasManager titusQuotasManager = new TitusQuotasManager(null, null, null, systemQuotaController, config1, null);
ConsumptionResult consumptionResult = titusQuotasManager.tryConsumeSystemAndJobQuota(jobQuotaController, job1, taskId);
assertThat(consumptionResult.isApproved()).isFalse();
assertThat(consumptionResult.getRejectionReason()).isPresent();
assertThat(consumptionResult.getRejectionReason().get()).isEqualTo(jobQuotaRejectionReason);
JobQuotaController jobQuotaController2 = mock(JobQuotaController.class);
when(jobQuotaController2.consume(taskId)).thenReturn(ConsumptionResult.approved());
ConsumptionResult consumptionResult2 = titusQuotasManager.tryConsumeSystemAndJobQuota(jobQuotaController2, job1, taskId);
assertThat(consumptionResult2.isApproved()).isTrue();
String quotaLimitExceededReason = SystemQuotaConsumptionResults.QUOTA_LIMIT_EXCEEDED.getRejectionReason().get();
when(systemQuotaController.consume(taskId)).thenReturn(ConsumptionResult.rejected(quotaLimitExceededReason));
ConsumptionResult consumptionResult3 = titusQuotasManager.tryConsumeSystemAndJobQuota(jobQuotaController2, job1, taskId);
assertThat(consumptionResult3.isApproved()).isFalse();
assertThat(consumptionResult3.getRejectionReason()).isPresent();
assertThat(consumptionResult3.getRejectionReason().get()).isEqualTo(quotaLimitExceededReason);
String outsideSystemWindowReason = SystemQuotaConsumptionResults.OUTSIDE_SYSTEM_TIME_WINDOW.getRejectionReason().get();
when(systemQuotaController.consume(taskId)).thenReturn(ConsumptionResult.rejected(outsideSystemWindowReason));
ConsumptionResult consumptionResult4 = titusQuotasManager.tryConsumeSystemAndJobQuota(jobQuotaController2, job1, taskId);
assertThat(consumptionResult4.isApproved()).isTrue();
}
use of com.netflix.titus.runtime.connector.eviction.EvictionConfiguration in project titus-control-plane by Netflix.
the class DefaultDeschedulerService method deschedule.
@Override
public List<DeschedulingResult> deschedule(Map<String, TaskRelocationPlan> plannedAheadTaskRelocationPlans) {
List<Pair<Job, List<Task>>> allJobsAndTasks = jobOperations.getJobsAndTasks();
Map<String, Job<?>> jobs = allJobsAndTasks.stream().map(Pair::getLeft).collect(Collectors.toMap(Job::getId, j -> j));
Map<String, Task> tasksById = allJobsAndTasks.stream().flatMap(p -> p.getRight().stream()).collect(Collectors.toMap(Task::getId, t -> t));
EvacuatedAgentsAllocationTracker evacuatedAgentsAllocationTracker = new EvacuatedAgentsAllocationTracker(nodeDataResolver.resolve(), tasksById);
EvictionQuotaTracker evictionQuotaTracker = new EvictionQuotaTracker(evictionOperations, jobs);
TaskMigrationDescheduler taskMigrationDescheduler = new TaskMigrationDescheduler(plannedAheadTaskRelocationPlans, evacuatedAgentsAllocationTracker, evictionQuotaTracker, evictionConfiguration, jobs, tasksById, titusRuntime);
Map<String, DeschedulingResult> requestedImmediateEvictions = taskMigrationDescheduler.findAllImmediateEvictions();
Map<String, DeschedulingResult> requestedEvictions = taskMigrationDescheduler.findRequestedJobOrTaskMigrations();
Map<String, DeschedulingResult> allRequestedEvictions = CollectionsExt.merge(requestedImmediateEvictions, requestedEvictions);
Map<String, DeschedulingResult> regularEvictions = new HashMap<>();
Optional<Pair<TitusNode, List<Task>>> bestMatch;
while ((bestMatch = taskMigrationDescheduler.nextBestMatch()).isPresent()) {
TitusNode agent = bestMatch.get().getLeft();
List<Task> tasks = bestMatch.get().getRight();
tasks.forEach(task -> {
if (!allRequestedEvictions.containsKey(task.getId())) {
Optional<TaskRelocationPlan> relocationPlanForTask = getRelocationPlanForTask(agent, task, plannedAheadTaskRelocationPlans);
relocationPlanForTask.ifPresent(rp -> regularEvictions.put(task.getId(), DeschedulingResult.newBuilder().withTask(task).withAgentInstance(agent).withTaskRelocationPlan(rp).build()));
}
});
}
// Find eviction which could not be scheduled now.
for (Task task : tasksById.values()) {
if (allRequestedEvictions.containsKey(task.getId()) || regularEvictions.containsKey(task.getId())) {
continue;
}
if (evacuatedAgentsAllocationTracker.isEvacuated(task)) {
DeschedulingFailure failure = taskMigrationDescheduler.getDeschedulingFailure(task);
TaskRelocationPlan relocationPlan = plannedAheadTaskRelocationPlans.get(task.getId());
if (relocationPlan == null) {
relocationPlan = newNotDelayedRelocationPlan(task, false);
}
TitusNode agent = evacuatedAgentsAllocationTracker.getRemovableAgent(task);
regularEvictions.put(task.getId(), DeschedulingResult.newBuilder().withTask(task).withAgentInstance(agent).withTaskRelocationPlan(relocationPlan).withFailure(failure).build());
}
}
return CollectionsExt.merge(new ArrayList<>(allRequestedEvictions.values()), new ArrayList<>(regularEvictions.values()));
}
Aggregations