@Nullable final Lock mutableLock,
SessionKey session) {
requireNonNull(session);
final SanitizedConfiguration sanitized;
try {
sessionValidator.checkAuthenticated(
session,
ImmutableSet.of(mutableJob.getKey().getRole()));
sanitized = SanitizedConfiguration.fromUnsanitized(IJobConfiguration.build(mutableJob));
} catch (AuthFailedException e) {
return errorResponse(AUTH_FAILED, e);
} catch (TaskDescriptionException e) {
return errorResponse(INVALID_REQUEST, e);
}
return storage.write(new MutateWork.Quiet<Response>() {
@Override
public Response apply(MutableStoreProvider storeProvider) {
final IJobConfiguration job = sanitized.getJobConfig();
try {
lockManager.validateIfLocked(
ILockKey.build(LockKey.job(job.getKey().newBuilder())),
Optional.fromNullable(mutableLock).transform(ILock.FROM_BUILDER));
if (!storeProvider.getTaskStore().fetchTasks(
Query.jobScoped(job.getKey()).active()).isEmpty()
|| cronJobManager.hasJob(job.getKey())) {
return invalidResponse("Job already exists: " + JobKeys.canonicalString(job.getKey()));
}
ITaskConfig template = sanitized.getJobConfig().getTaskConfig();
int count = sanitized.getJobConfig().getInstanceCount();
validateTaskLimits(template, count, quotaManager.checkInstanceAddition(template, count));
// TODO(mchucarroll): deprecate cron as a part of create/kill job.(AURORA-454)
if (sanitized.isCron()) {
LOG.warning("Deprecated behavior: scheduling job " + job.getKey()
+ " with cron via createJob (AURORA_454)");
cronJobManager.createJob(SanitizedCronJob.from(sanitized));
} else {
LOG.info("Launching " + count + " tasks.");
stateManager.insertPendingTasks(
storeProvider,
template,
sanitized.getInstanceIds());
}
return okEmptyResponse();
} catch (LockException e) {
return errorResponse(LOCK_ERROR, e);
} catch (CronException | TaskValidationException e) {