/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.kylin.rest.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.kylin.job.JobInstance;
import org.apache.kylin.job.constant.JobStatusEnum;
import org.apache.kylin.job.constant.JobTimeFilterEnum;
import org.apache.kylin.rest.exception.InternalErrorException;
import org.apache.kylin.rest.request.JobListRequest;
import org.apache.kylin.rest.service.JobService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping(value = "jobs")
public class JobController extends BasicController {
private static final Logger logger = LoggerFactory.getLogger(JobController.class);
@Autowired
private JobService jobService;
/**
* get all cube jobs
*
* @return
* @throws IOException
*/
@RequestMapping(value = "", method = { RequestMethod.GET })
@ResponseBody
public List<JobInstance> list(JobListRequest jobRequest) {
List<JobInstance> jobInstanceList = Collections.emptyList();
List<JobStatusEnum> statusList = new ArrayList<JobStatusEnum>();
if (null != jobRequest.getStatus()) {
for (int status : jobRequest.getStatus()) {
statusList.add(JobStatusEnum.getByCode(status));
}
}
JobTimeFilterEnum timeFilter = JobTimeFilterEnum.getByCode(jobRequest.getTimeFilter());
try {
jobInstanceList = jobService.searchJobs(jobRequest.getCubeName(), jobRequest.getProjectName(), statusList, jobRequest.getLimit(), jobRequest.getOffset(), timeFilter);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
return jobInstanceList;
}
/**
* Get a cube job
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}", method = { RequestMethod.GET })
@ResponseBody
public JobInstance get(@PathVariable String jobId) {
JobInstance jobInstance = null;
try {
jobInstance = jobService.getJobInstance(jobId);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
return jobInstance;
}
/**
* Get a job step output
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}/steps/{stepId}/output", method = { RequestMethod.GET })
@ResponseBody
public Map<String, String> getStepOutput(@PathVariable String jobId, @PathVariable String stepId) {
Map<String, String> result = new HashMap<String, String>();
result.put("jobId", jobId);
result.put("stepId", String.valueOf(stepId));
result.put("cmd_output", jobService.getExecutableManager().getOutput(stepId).getVerboseMsg());
return result;
}
/**
* Resume a cube job
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}/resume", method = { RequestMethod.PUT })
@ResponseBody
public JobInstance resume(@PathVariable String jobId) {
try {
final JobInstance jobInstance = jobService.getJobInstance(jobId);
jobService.resumeJob(jobInstance);
return jobService.getJobInstance(jobId);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
}
/**
* Cancel/discard a job
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}/cancel", method = { RequestMethod.PUT })
@ResponseBody
public JobInstance cancel(@PathVariable String jobId) {
try {
final JobInstance jobInstance = jobService.getJobInstance(jobId);
return jobService.cancelJob(jobInstance);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
}
/**
* Pause a job
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}/pause", method = { RequestMethod.PUT })
@ResponseBody
public JobInstance pause(@PathVariable String jobId) {
try {
final JobInstance jobInstance = jobService.getJobInstance(jobId);
return jobService.pauseJob(jobInstance);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
}
/**
* Rollback a job to the given step
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}/steps/{stepId}/rollback", method = { RequestMethod.PUT })
@ResponseBody
public JobInstance rollback(@PathVariable String jobId, @PathVariable String stepId) {
try {
final JobInstance jobInstance = jobService.getJobInstance(jobId);
jobService.rollbackJob(jobInstance, stepId);
return jobService.getJobInstance(jobId);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
}
/**
* Drop a cube job
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/{jobId}/drop", method = { RequestMethod.DELETE })
@ResponseBody
public JobInstance dropJob(@PathVariable String jobId) {
JobInstance jobInstance = null;
try {
jobInstance = jobService.getJobInstance(jobId);
jobService.dropJob(jobInstance);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException(e);
}
return jobInstance;
}
public void setJobService(JobService jobService) {
this.jobService = jobService;
}
}