package com.intrbiz.bergamot.updater.handler;
import java.util.UUID;
import com.intrbiz.Util;
import com.intrbiz.bergamot.model.message.api.check.ExecuteAdhocCheck;
import com.intrbiz.bergamot.model.message.api.check.ExecutedAdhocCheck;
import com.intrbiz.bergamot.model.message.api.error.APIError;
import com.intrbiz.bergamot.model.message.check.ExecuteCheck;
import com.intrbiz.bergamot.queue.key.WorkerKey;
import com.intrbiz.bergamot.updater.context.ClientContext;
import com.intrbiz.queue.RoutedProducer;
public class ExecuteAdhocChecksHandler extends RequestHandler<ExecuteAdhocCheck>
{
public ExecuteAdhocChecksHandler()
{
super(new Class<?>[] { ExecuteAdhocCheck.class });
}
@Override
public void onRequest(ClientContext context, ExecuteAdhocCheck request)
{
UUID adhocId = context.var("adhocId");
if (adhocId == null)
{
context.send(new APIError(request, "You must register for adhoc results first"));
return;
}
// validate the check
if (request.getCheck() == null)
{
context.send(new APIError(request, "You must give a check to execute"));
return;
}
if (Util.isEmpty(request.getCheck().getEngine()) && Util.isEmpty(request.getEngine()))
{
context.send(new APIError(request, "You must specify the check engine"));
return;
}
// clamp the ttl
long ttl = request.getTtl() <= 500L || request.getTtl() > 300_000L ? 30_000L : request.getTtl();
// random checkId
UUID checkId = UUID.randomUUID();
// get the producer - setup by register for adhoc results
RoutedProducer<ExecuteCheck, WorkerKey> producer = context.var("adhocCheckProducer");
// compute the worker key
WorkerKey key = new WorkerKey(context.getSite().getId(), request.getWorkerPool(), Util.coalesceEmpty(request.getEngine(), request.getCheck().getEngine()), request.getAgentId());
// setup the check
ExecuteCheck check = request.getCheck();
check.setAdhocId(adhocId);
check.setId(checkId);
// publish
producer.publish(key, check, ttl);
// respond
context.send(new ExecutedAdhocCheck(request, checkId));
}
}