package com.thinkbiganalytics.jobrepo.query.model.transform; /*- * #%L * thinkbig-job-repository-core * %% * 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.jobrepo.common.constants.CheckDataStepConstants; import com.thinkbiganalytics.jobrepo.query.model.CheckDataJob; import com.thinkbiganalytics.jobrepo.query.model.DefaultCheckDataJob; import com.thinkbiganalytics.jobrepo.query.model.DefaultExecutedJob; import com.thinkbiganalytics.jobrepo.query.model.DefaultExecutedStep; import com.thinkbiganalytics.jobrepo.query.model.ExecutedJob; import com.thinkbiganalytics.jobrepo.query.model.ExecutedStep; import com.thinkbiganalytics.jobrepo.query.model.ExecutionStatus; import com.thinkbiganalytics.jobrepo.query.model.ExitStatus; import com.thinkbiganalytics.metadata.api.feed.LatestFeedJobExecution; import com.thinkbiganalytics.metadata.api.feed.OpsManagerFeed; import com.thinkbiganalytics.metadata.api.jobrepo.job.BatchJobExecution; import com.thinkbiganalytics.metadata.api.jobrepo.nifi.NifiEventStepExecution; import com.thinkbiganalytics.metadata.api.jobrepo.step.BatchStepExecution; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** */ public class JobModelTransform { public static ExecutedJob executedJob(BatchJobExecution jobExecution) { DefaultExecutedJob job = (DefaultExecutedJob) executedJobSimple(jobExecution); Map<String, String> jobExecutionContext = jobExecution.getJobExecutionContextAsMap(); if (jobExecutionContext != null) { job.setExecutionContext(new HashMap<>(jobExecutionContext)); } OpsManagerFeed feed = jobExecution.getJobInstance().getFeed(); if (feed != null) { job.setJobType(feed.getFeedType().name()); } Map<String, String> jobParams = jobExecution.getJobParametersAsMap(); if (jobParams != null) { job.setJobParameters(new HashMap<>(jobParams)); } job.setExecutedSteps(executedSteps(jobExecution.getStepExecutions())); return job; } public static ExecutedJob executedJobSimple(BatchJobExecution jobExecution) { DefaultExecutedJob job = new DefaultExecutedJob(); job.setExecutionId(jobExecution.getJobExecutionId()); job.setStartTime(jobExecution.getStartTime()); job.setEndTime(jobExecution.getEndTime()); job.setCreateTime(jobExecution.getCreateTime()); job.setExitCode(jobExecution.getExitCode().name()); job.setExitStatus(jobExecution.getExitMessage()); job.setStatus(ExecutionStatus.valueOf(jobExecution.getStatus().name())); job.setJobName(jobExecution.getJobInstance().getJobName()); job.setRunTime(ModelUtils.runTime(jobExecution.getStartTime(), jobExecution.getEndTime())); job.setTimeSinceEndTime(ModelUtils.timeSince(jobExecution.getStartTime(), jobExecution.getEndTime())); job.setInstanceId(jobExecution.getJobInstance().getJobInstanceId()); if (jobExecution.getJobInstance() != null && jobExecution.getJobInstance().getFeed() != null) { job.setFeedName(jobExecution.getJobInstance().getFeed().getName()); } return job; } public static ExecutedStep executedStep(BatchStepExecution stepExecution) { DefaultExecutedStep step = new DefaultExecutedStep(); NifiEventStepExecution nifiEventStepExecution = stepExecution.getNifiEventStepExecution(); if (nifiEventStepExecution != null) { step.setNifiEventId(nifiEventStepExecution.getEventId()); } step.setRunning(!stepExecution.isFinished()); step.setStartTime(stepExecution.getStartTime()); step.setEndTime(stepExecution.getEndTime()); step.setLastUpdateTime(stepExecution.getLastUpdated()); step.setVersion(stepExecution.getVersion().intValue()); step.setStepName(stepExecution.getStepName()); step.setExitDescription(stepExecution.getExitMessage()); step.setExitCode(stepExecution.getExitCode().name()); step.setId(stepExecution.getStepExecutionId()); step.setTimeSinceEndTime(ModelUtils.timeSince(stepExecution.getStartTime(), stepExecution.getEndTime())); step.setRunTime(ModelUtils.runTime(stepExecution.getStartTime(), stepExecution.getEndTime())); Map<String, String> stepExecutionContext = stepExecution.getStepExecutionContextAsMap(); if (stepExecutionContext != null) { step.setExecutionContext(new HashMap<>(stepExecutionContext)); } return step; } public static ExecutedJob executedJob(LatestFeedJobExecution jobExecution) { DefaultExecutedJob executedJob = new DefaultExecutedJob(); executedJob.setExecutionId(jobExecution.getJobExecutionId()); executedJob.setStartTime(jobExecution.getStartTime()); executedJob.setEndTime(jobExecution.getEndTime()); executedJob.setExitCode(jobExecution.getExitCode().name()); executedJob.setExitStatus(jobExecution.getExitMessage()); executedJob.setStatus(ExecutionStatus.valueOf(jobExecution.getStatus().name())); executedJob.setJobName(jobExecution.getFeedName()); executedJob.setRunTime(ModelUtils.runTime(jobExecution.getStartTime(), jobExecution.getEndTime())); executedJob.setTimeSinceEndTime(ModelUtils.timeSince(jobExecution.getStartTime(), jobExecution.getEndTime())); executedJob.setInstanceId(jobExecution.getJobInstanceId()); return executedJob; } public static List<ExecutedStep> executedSteps(Collection<? extends BatchStepExecution> steps) { if (steps != null && !steps.isEmpty()) { return steps.stream().map(stepExecution -> executedStep(stepExecution)).collect(Collectors.toList()); } else { return Collections.emptyList(); } } public static List<ExecutedJob> executedJobs(Collection<? extends BatchJobExecution> jobs) { if (jobs != null && !jobs.isEmpty()) { return jobs.stream().map(jobExecution -> executedJob(jobExecution)).collect(Collectors.toList()); } else { return Collections.emptyList(); } } public static List<ExecutedJob> executedJobsSimple(Collection<? extends BatchJobExecution> jobs) { if (jobs != null && !jobs.isEmpty()) { return jobs.stream().map(jobExecution -> executedJobSimple(jobExecution)).collect(Collectors.toList()); } else { return Collections.emptyList(); } } public static CheckDataJob checkDataJob(LatestFeedJobExecution latestFeedJobExecution) { ExecutedJob job = executedJob(latestFeedJobExecution); CheckDataJob checkDataJob = new DefaultCheckDataJob(job); boolean valid = false; String msg = "Unknown"; Map<String, String> jobExecutionContext = latestFeedJobExecution.getJobExecution().getJobExecutionContextAsMap(); if (BatchJobExecution.JobStatus.ABANDONED.equals(latestFeedJobExecution.getStatus())) { valid = true; msg = latestFeedJobExecution.getExitMessage(); } else if (jobExecutionContext != null) { msg = jobExecutionContext.get(CheckDataStepConstants.VALIDATION_MESSAGE_KEY); String isValid = jobExecutionContext.get(CheckDataStepConstants.VALIDATION_KEY); if (msg == null) { msg = job.getExitStatus(); } if (StringUtils.isBlank(isValid)) { valid = ExitStatus.COMPLETED.getExitCode().equals(job.getExitStatus()); } else { valid = BooleanUtils.toBoolean(isValid); } } checkDataJob.setValidationMessage(msg); checkDataJob.setIsValid(valid); return checkDataJob; } }