package com.thinkbiganalytics.feedmgr.service;
/*-
* #%L
* thinkbig-feed-manager-controller
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.thinkbiganalytics.DateTimeUtil;
import com.thinkbiganalytics.jobrepo.service.JobExecutionException;
import com.thinkbiganalytics.jobrepo.service.JobService;
import com.thinkbiganalytics.metadata.api.MetadataAccess;
import com.thinkbiganalytics.metadata.api.jobrepo.ExecutionConstants;
import com.thinkbiganalytics.metadata.api.jobrepo.job.BatchJobExecution;
import com.thinkbiganalytics.metadata.api.jobrepo.job.BatchJobExecutionProvider;
import com.thinkbiganalytics.metadata.api.jobrepo.step.BatchStepExecution;
import com.thinkbiganalytics.nifi.rest.client.LegacyNifiRestClient;
import org.apache.nifi.web.api.dto.provenance.ProvenanceEventDTO;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Set;
import javax.inject.Inject;
/**
* Service to perform actions on batch job executions
*/
public class DefaultJobService implements JobService {
private static final Logger log = LoggerFactory.getLogger(DefaultJobService.class);
@Inject
private MetadataAccess metadataAccess;
@Autowired
private BatchJobExecutionProvider jobExecutionProvider;
@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject
private LegacyNifiRestClient nifiRestClient;
@Override
public Long restartJobExecution(Long executionId) throws JobExecutionException {
//not supported now
return null;
}
public boolean canReplay(ProvenanceEventDTO event) {
return event.getReplayAvailable() != null ? event.getReplayAvailable().booleanValue() : false;
}
@Override
public boolean stopJobExecution(Long executionId) throws JobExecutionException {
throw new UnsupportedOperationException("Unable to stop Nifi Job Execution at this time. Please mark the job as Failed and Abandoned, if necessary.");
}
@Override
public void abandonJobExecution(Long executionId) throws JobExecutionException {
metadataAccess.commit(() -> {
BatchJobExecution execution = this.jobExecutionProvider.findByJobExecutionId(executionId);
if (execution != null) {
if (execution.getStartTime() == null) {
execution.setStartTime(DateTimeUtil.getNowUTCTime());
}
execution.setStatus(BatchJobExecution.JobStatus.ABANDONED);
if (execution.getEndTime() == null) {
execution.setEndTime(DateTimeUtil.getNowUTCTime());
}
String msg = execution.getExitMessage() != null ? execution.getExitMessage() + "\n" : "";
msg += "Job manually abandoned @ " + DateTimeUtil.getNowFormattedWithTimeZone();
execution.setExitMessage(msg);
//also stop any running steps??
this.jobExecutionProvider.save(execution);
}
return execution;
});
}
@Override
public void failJobExecution(Long executionId) {
metadataAccess.commit(() -> {
BatchJobExecution execution = this.jobExecutionProvider.findByJobExecutionId(executionId);
if (execution != null && !execution.isFailed()) {
Set<BatchStepExecution> steps = execution.getStepExecutions();
if (steps != null) {
for (BatchStepExecution step : steps) {
if (!step.isFinished()) {
step.setStatus(BatchStepExecution.StepStatus.FAILED);
step.setExitCode(ExecutionConstants.ExitCode.FAILED);
String msg = step.getExitMessage() != null ? step.getExitMessage() + "\n" : "";
msg += "Step manually failed @ " + DateTimeUtil.getNowFormattedWithTimeZone();
step.setExitMessage(msg);
execution.setExitMessage(msg);
}
}
}
if (execution.getStartTime() == null) {
execution.setStartTime(DateTimeUtil.getNowUTCTime());
}
execution.setStatus(BatchJobExecution.JobStatus.FAILED);
if (execution.getEndTime() == null) {
execution.setEndTime(DateTimeUtil.getNowUTCTime());
}
String msg = execution.getExitMessage() != null ? execution.getExitMessage() + "\n" : "";
msg += "Job manually failed @ " + DateTimeUtil.getNowFormattedWithTimeZone();
execution.setExitMessage(msg);
this.jobExecutionProvider.save(execution);
}
return execution;
});
}
}