@Override
public Response apply(MutableStoreProvider storeProvider) {
String updateId = uuidGenerator.createNew().toString();
IJobUpdateSettings settings = request.getSettings();
JobDiff diff = JobDiff.compute(
storeProvider.getTaskStore(),
job,
JobDiff.asMap(request.getTaskConfig(), request.getInstanceCount()),
settings.getUpdateOnlyTheseInstances());
if (diff.isNoop()) {
return addMessage(emptyResponse(), OK, NOOP_JOB_UPDATE_MESSAGE);
}
Set<Integer> invalidScope = diff.getOutOfScopeInstances(
Numbers.rangesToInstanceIds(settings.getUpdateOnlyTheseInstances()));
if (!invalidScope.isEmpty()) {
return invalidResponse(
"updateOnlyTheseInstances contains instances irrelevant to the update: "
+ invalidScope);
}
JobUpdateInstructions instructions = new JobUpdateInstructions()
.setSettings(settings.newBuilder())
.setInitialState(buildInitialState(diff.getReplacedInstances()));
if (!diff.getReplacementInstances().isEmpty()) {
instructions.setDesiredState(
new InstanceTaskConfig()
.setTask(request.getTaskConfig().newBuilder())
.setInstances(convertRanges(Numbers.toRanges(diff.getReplacementInstances()))));
}
IJobUpdate update = IJobUpdate.build(new JobUpdate()
.setSummary(new JobUpdateSummary()
.setJobKey(job.newBuilder())