use of com.netflix.titus.api.jobmanager.model.job.disruptionbudget.SelfManagedDisruptionBudgetPolicy in project titus-control-plane by Netflix.
the class GrpcJobManagementModelConverters method toGrpcDisruptionBudget.
public static com.netflix.titus.grpc.protogen.JobDisruptionBudget toGrpcDisruptionBudget(DisruptionBudget coreDisruptionBudget) {
JobDisruptionBudget.Builder builder = JobDisruptionBudget.newBuilder();
DisruptionBudgetPolicy disruptionBudgetPolicy = coreDisruptionBudget.getDisruptionBudgetPolicy();
if (disruptionBudgetPolicy instanceof SelfManagedDisruptionBudgetPolicy) {
builder.setSelfManaged(JobDisruptionBudget.SelfManaged.newBuilder().setRelocationTimeMs(((SelfManagedDisruptionBudgetPolicy) disruptionBudgetPolicy).getRelocationTimeMs()));
} else if (disruptionBudgetPolicy instanceof AvailabilityPercentageLimitDisruptionBudgetPolicy) {
builder.setAvailabilityPercentageLimit(JobDisruptionBudget.AvailabilityPercentageLimit.newBuilder().setPercentageOfHealthyContainers(((AvailabilityPercentageLimitDisruptionBudgetPolicy) disruptionBudgetPolicy).getPercentageOfHealthyContainers()));
} else if (disruptionBudgetPolicy instanceof UnhealthyTasksLimitDisruptionBudgetPolicy) {
builder.setUnhealthyTasksLimit(JobDisruptionBudget.UnhealthyTasksLimit.newBuilder().setLimitOfUnhealthyContainers(((UnhealthyTasksLimitDisruptionBudgetPolicy) disruptionBudgetPolicy).getLimitOfUnhealthyContainers()));
} else if (disruptionBudgetPolicy instanceof RelocationLimitDisruptionBudgetPolicy) {
builder.setRelocationLimit(JobDisruptionBudget.RelocationLimit.newBuilder().setLimit(((RelocationLimitDisruptionBudgetPolicy) disruptionBudgetPolicy).getLimit()));
}
DisruptionBudgetRate disruptionBudgetRate = coreDisruptionBudget.getDisruptionBudgetRate();
if (disruptionBudgetRate instanceof UnlimitedDisruptionBudgetRate) {
builder.setRateUnlimited(JobDisruptionBudget.RateUnlimited.newBuilder().build());
} else if (disruptionBudgetRate instanceof PercentagePerHourDisruptionBudgetRate) {
builder.setRatePercentagePerHour(JobDisruptionBudget.RatePercentagePerHour.newBuilder().setMaxPercentageOfContainersRelocatedInHour(((PercentagePerHourDisruptionBudgetRate) disruptionBudgetRate).getMaxPercentageOfContainersRelocatedInHour()));
} else if (disruptionBudgetRate instanceof RatePerIntervalDisruptionBudgetRate) {
RatePerIntervalDisruptionBudgetRate ratePerInterval = (RatePerIntervalDisruptionBudgetRate) disruptionBudgetRate;
builder.setRatePerInterval(JobDisruptionBudget.RatePerInterval.newBuilder().setIntervalMs(ratePerInterval.getIntervalMs()).setLimitPerInterval(ratePerInterval.getLimitPerInterval()).build());
} else if (disruptionBudgetRate instanceof RatePercentagePerIntervalDisruptionBudgetRate) {
RatePercentagePerIntervalDisruptionBudgetRate ratePercentagePerInterval = (RatePercentagePerIntervalDisruptionBudgetRate) disruptionBudgetRate;
builder.setRatePercentagePerInterval(JobDisruptionBudget.RatePercentagePerInterval.newBuilder().setIntervalMs(ratePercentagePerInterval.getIntervalMs()).setPercentageLimitPerInterval(ratePercentagePerInterval.getPercentageLimitPerInterval()).build());
}
return builder.addAllTimeWindows(toGrpcTimeWindows(coreDisruptionBudget.getTimeWindows())).addAllContainerHealthProviders(toGrpcContainerHealthProviders(coreDisruptionBudget.getContainerHealthProviders())).build();
}
use of com.netflix.titus.api.jobmanager.model.job.disruptionbudget.SelfManagedDisruptionBudgetPolicy in project titus-control-plane by Netflix.
the class ExtendedJobSanitizerTest method testLegacyBatchJobDisruptionBudgetRewrite.
@Test
public void testLegacyBatchJobDisruptionBudgetRewrite() {
JobDescriptor<BatchJobExt> jobDescriptor = newBatchJob().getValue().toBuilder().withDisruptionBudget(DisruptionBudget.none()).build();
ExtendedJobSanitizer sanitizer = new ExtendedJobSanitizer(configuration, jobAssertions, entitySanitizer, disruptionBudgetSanitizer, jd -> false, jd -> false, titusRuntime);
Optional<JobDescriptor<BatchJobExt>> sanitizedOpt = sanitizer.sanitize(jobDescriptor);
assertThat(sanitizedOpt).isNotEmpty();
JobDescriptor<BatchJobExt> sanitized = sanitizedOpt.get();
String nonCompliant = sanitized.getAttributes().get(TITUS_NON_COMPLIANT_FEATURES);
assertThat(nonCompliant).contains(JobFeatureComplianceChecks.DISRUPTION_BUDGET_FEATURE);
SelfManagedDisruptionBudgetPolicy policy = (SelfManagedDisruptionBudgetPolicy) sanitized.getDisruptionBudget().getDisruptionBudgetPolicy();
assertThat(policy.getRelocationTimeMs()).isEqualTo((long) ((jobDescriptor.getExtensions()).getRuntimeLimitMs() * BATCH_RUNTIME_LIMIT_FACTOR));
}
use of com.netflix.titus.api.jobmanager.model.job.disruptionbudget.SelfManagedDisruptionBudgetPolicy in project titus-control-plane by Netflix.
the class ExtendedJobSanitizerTest method testLegacyServiceJobDisruptionBudgetRewrite.
@Test
public void testLegacyServiceJobDisruptionBudgetRewrite() {
JobDescriptor<ServiceJobExt> jobDescriptor = newServiceJob().getValue().toBuilder().withDisruptionBudget(DisruptionBudget.none()).build();
ExtendedJobSanitizer sanitizer = new ExtendedJobSanitizer(configuration, jobAssertions, entitySanitizer, disruptionBudgetSanitizer, jd -> false, jd -> false, titusRuntime);
Optional<JobDescriptor<ServiceJobExt>> sanitizedOpt = sanitizer.sanitize(jobDescriptor);
assertThat(sanitizedOpt).isNotEmpty();
JobDescriptor<ServiceJobExt> sanitized = sanitizedOpt.get();
String nonCompliant = sanitized.getAttributes().get(TITUS_NON_COMPLIANT_FEATURES);
assertThat(nonCompliant).contains(JobFeatureComplianceChecks.DISRUPTION_BUDGET_FEATURE);
SelfManagedDisruptionBudgetPolicy policy = (SelfManagedDisruptionBudgetPolicy) sanitized.getDisruptionBudget().getDisruptionBudgetPolicy();
assertThat(policy.getRelocationTimeMs()).isEqualTo(DisruptionBudgetSanitizer.DEFAULT_SERVICE_RELOCATION_TIME_MS);
}
use of com.netflix.titus.api.jobmanager.model.job.disruptionbudget.SelfManagedDisruptionBudgetPolicy in project titus-control-plane by Netflix.
the class ArchaiusEffectiveJobDisruptionBudgetResolver method parse.
private DisruptionBudget parse(String newValue) throws Exception {
DisruptionBudget budget = ObjectMappers.storeMapper().readValue(newValue, DisruptionBudget.class);
Preconditions.checkArgument(!(budget.getDisruptionBudgetPolicy() instanceof SelfManagedDisruptionBudgetPolicy), "Self managed migration policy not allowed as a fallback");
DisruptionBudget sanitized = sanitizer.sanitize(budget).orElse(budget);
Set<ValidationError> violations = sanitizer.validate(sanitized);
Preconditions.checkState(violations.isEmpty(), "Invalid self managed fallback disruption budget: value=%s, violations=%s", sanitized, violations);
return sanitized;
}
use of com.netflix.titus.api.jobmanager.model.job.disruptionbudget.SelfManagedDisruptionBudgetPolicy in project titus-control-plane by Netflix.
the class MustBeRelocatedSelfManagedTaskCollectorStep method buildSelfManagedRelocationPlan.
/**
* Relocation plans today are limited to self managed polices.
*/
private TaskRelocationPlan buildSelfManagedRelocationPlan(Job<?> job, Task task, String reason) {
long now = clock.wallTime();
SelfManagedDisruptionBudgetPolicy selfManaged = (SelfManagedDisruptionBudgetPolicy) job.getJobDescriptor().getDisruptionBudget().getDisruptionBudgetPolicy();
TaskRelocationPlan relocationPlan = TaskRelocationPlan.newBuilder().withTaskId(task.getId()).withReason(TaskRelocationReason.SelfManagedMigration).withReasonMessage(reason).withDecisionTime(now).withRelocationTime(now + selfManaged.getRelocationTimeMs()).build();
TaskRelocationPlan previous = lastResult.get(task.getId());
boolean keepPrevious = previous != null && (areEqualExceptRelocationTime(previous, relocationPlan) || previous.getRelocationTime() < relocationPlan.getRelocationTime());
return keepPrevious ? previous : relocationPlan;
}
Aggregations