package com.nvarghese.beowulf.sfc.services;
import org.bson.types.ObjectId;
import org.msgpack.rpc.Request;
import org.msgpack.rpc.Server;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.quartz.JobBuilder.*;
import com.nvarghese.beowulf.common.rpc.BwControllerRpcInterface;
import com.nvarghese.beowulf.sfc.SfcQuartzSchedulerManager;
import com.nvarghese.beowulf.sfc.quartz.ScanMonitorJob;
import com.nvarghese.beowulf.sfc.quartz.TimeBasedRepeatableTriggerBuilder;
public class ScanInstanceServer implements BwControllerRpcInterface {
private Server server;
private ObjectId webScanObjId;
static Logger logger = LoggerFactory.getLogger(ScanInstanceServer.class);
public ScanInstanceServer(Server server, ObjectId webScanObjId) {
this.server = server;
this.webScanObjId = webScanObjId;
}
@Override
public String sayHello(String name) {
return "Welcome " + name;
}
public void sayHello(Request request, String name) {
request.sendResult(sayHello(name));
}
/**
* Starts scan monitoring with a back end quartz job
*
* @return
*/
public boolean startScanMonitoring() {
boolean scheduled = false;
String jobId = "scanMonitor-" + webScanObjId.toString();
String triggerId = "scanMonitorTrigger-" + webScanObjId.toString();
JobDetail jobDetail = newJob(ScanMonitorJob.class).withIdentity(jobId, "scanMonitorGroup")
.usingJobData(ScanMonitorJob.WEBSCANOBJID, webScanObjId.toString()).build();
TimeBasedRepeatableTriggerBuilder triggerBuilder = new TimeBasedRepeatableTriggerBuilder(triggerId, "scanMonitorGroup", 20);
try {
SfcQuartzSchedulerManager.scheduleJob(jobDetail, triggerBuilder.build());
scheduled = true;
} catch (SchedulerException e) {
logger.error("Failed to schedule scan monitor for webscanId: {}", webScanObjId, e);
scheduled = false;
}
return scheduled;
}
/**
*
* @return
*/
public boolean stopScanMonitoring() {
boolean unscheduled = false;
try {
String jobId = "scanMonitor-" + webScanObjId.toString();
unscheduled = SfcQuartzSchedulerManager.unScheduleJob(new JobKey(jobId, "scanMonitorGroup"));
logger.info("Submitted request to unschedule scan monitoring. Status: {}", unscheduled);
} catch (SchedulerException e) {
logger.error("Failed to unschedule scan monitor for webscanId: {}", webScanObjId, e);
unscheduled = false;
}
return unscheduled;
}
public void terminateServer() {
logger.info("Received request to stop the controller server instance for webscanId: {}", webScanObjId);
server.getEventLoop().getWorkerExecutor().shutdownNow();
server.getEventLoop().getIoExecutor().shutdownNow();
server.getEventLoop().getWorkerExecutor().shutdownNow();
server.getEventLoop().shutdown();
server.close();
logger.info("Stopped the controller server instance for webscanId: {}", webScanObjId);
}
}