package com.thinkbiganalytics.scheduler.rest.controller;
import com.thinkbiganalytics.jobrepo.security.OperationsAccessControl;
/*-
* #%L
* thinkbig-scheduler-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.rest.model.RestResponseStatus;
import com.thinkbiganalytics.scheduler.JobInfo;
import com.thinkbiganalytics.scheduler.JobScheduler;
import com.thinkbiganalytics.scheduler.JobSchedulerException;
import com.thinkbiganalytics.scheduler.rest.Model;
import com.thinkbiganalytics.scheduler.rest.model.ScheduleIdentifier;
import com.thinkbiganalytics.scheduler.rest.model.ScheduledJob;
import com.thinkbiganalytics.scheduler.rest.model.TriggerInfo;
import com.thinkbiganalytics.security.AccessController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
/**
* Rest Controller for Quartz Scheduler
*/
@Api(tags = "Operations Manager - Scheduler", produces = "application/json")
@Path("/v1/scheduler")
public class SchedulerRestController {
@Inject
private JobScheduler quartzScheduler;
@Inject
private AccessController accessController;
@GET
@Path("/metadata")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Gets the scheduler status.")
@ApiResponses(
@ApiResponse(code = 200, message = "Returns the metadata.", response = Map.class)
)
public Map<String, Object> getMetaData() throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ACCESS_OPS);
return quartzScheduler.getMetaData();
}
@POST
@Path("/pause")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Pauses the scheduler.")
@ApiResponses(
@ApiResponse(code = 200, message = "The scheduler is paused.", response = RestResponseStatus.class)
)
public RestResponseStatus standByScheduler() throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.pauseScheduler();
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/resume")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Starts the scheduler.")
@ApiResponses(
@ApiResponse(code = 200, message = "The scheduler is started.", response = RestResponseStatus.class)
)
public RestResponseStatus startScheduler() throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.startScheduler();
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/triggers/update")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Updates the trigger for a job.")
@ApiResponses(
@ApiResponse(code = 200, message = "The trigger is updated.", response = RestResponseStatus.class)
)
public RestResponseStatus rescheduleTrigger(TriggerInfo trigger) throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
//convert to Domain Code
quartzScheduler
.updateTrigger(Model.TRIGGER_IDENTIFIER_TO_DOMAIN.apply(trigger.getTriggerIdentifier()), trigger.getCronExpression());
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/triggers/pause")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Pauses the trigger for a job.")
@ApiResponses(
@ApiResponse(code = 200, message = "The trigger is paused.", response = RestResponseStatus.class)
)
public RestResponseStatus pauseTrigger(ScheduleIdentifier triggerIdentifier) throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.pauseTrigger(Model.TRIGGER_IDENTIFIER_TO_DOMAIN.apply(triggerIdentifier));
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/triggers/resume")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Starts the trigger for a job.")
@ApiResponses(
@ApiResponse(code = 200, message = "The trigger is started.", response = RestResponseStatus.class)
)
public RestResponseStatus resumeTrigger(ScheduleIdentifier triggerIdentifier) throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.resumeTrigger(Model.TRIGGER_IDENTIFIER_TO_DOMAIN.apply(triggerIdentifier));
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/jobs/trigger")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Executes the specified job.")
@ApiResponses(
@ApiResponse(code = 200, message = "The job is started.", response = RestResponseStatus.class)
)
public RestResponseStatus triggerJob(ScheduleIdentifier jobIdentifier) throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.triggerJob(Model.JOB_IDENTIFIER_TO_DOMAIN.apply(jobIdentifier));
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/jobs/pause")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Pauses all triggers for the specified job.")
@ApiResponses(
@ApiResponse(code = 200, message = "The triggers are paused.", response = RestResponseStatus.class)
)
public RestResponseStatus pauseJob(ScheduleIdentifier jobIdentifier) throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.pauseTriggersOnJob(Model.JOB_IDENTIFIER_TO_DOMAIN.apply(jobIdentifier));
return RestResponseStatus.SUCCESS;
}
@POST
@Path("/jobs/resume")
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Starts all triggers for the specified job.")
@ApiResponses(
@ApiResponse(code = 200, message = "The triggers are started.", response = RestResponseStatus.class)
)
public RestResponseStatus resumeJob(ScheduleIdentifier jobIdentifier) throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ADMIN_OPS);
quartzScheduler.resumeTriggersOnJob(Model.JOB_IDENTIFIER_TO_DOMAIN.apply(jobIdentifier));
return RestResponseStatus.SUCCESS;
}
@GET
@Path("/jobs")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("Gets the list of all jobs")
@ApiResponses(
@ApiResponse(code = 200, message = "Returns the list of jobs.", response = RestResponseStatus.class)
)
public List<ScheduledJob> getJobs() throws JobSchedulerException {
this.accessController.checkPermission(AccessController.SERVICES, OperationsAccessControl.ACCESS_OPS);
List<ScheduledJob> quartzScheduledJobs = new ArrayList<ScheduledJob>();
List<JobInfo> jobs = quartzScheduler.getJobs();
if (jobs != null && !jobs.isEmpty()) {
for (JobInfo jobInfo : jobs) {
ScheduledJob jobBean = Model.DOMAIN_TO_SCHEDULED_JOB.apply(jobInfo);
quartzScheduledJobs.add(jobBean);
}
}
return quartzScheduledJobs;
}
}