package com.hubspot.baragon.service.resources;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Optional;
import com.google.inject.Inject;
import com.hubspot.baragon.auth.NoAuth;
import com.hubspot.baragon.data.BaragonLoadBalancerDatastore;
import com.hubspot.baragon.models.AgentCheckInResponse;
import com.hubspot.baragon.models.BaragonAgentMetadata;
import com.hubspot.baragon.models.BaragonGroup;
import com.hubspot.baragon.models.TrafficSourceState;
import com.hubspot.baragon.service.managers.ElbManager;
@Path("/checkin")
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.APPLICATION_JSON)
public class AgentCheckinResource {
private static final Logger LOG = LoggerFactory.getLogger(AgentCheckinResource.class);
private final ElbManager elbManager;
private final BaragonLoadBalancerDatastore loadBalancerDatastore;
@Inject
public AgentCheckinResource(ElbManager elbManager,
BaragonLoadBalancerDatastore loadBalancerDatastore) {
this.elbManager = elbManager;
this.loadBalancerDatastore = loadBalancerDatastore;
}
@POST
@Path("/{clusterName}/startup")
public AgentCheckInResponse addAgent(@PathParam("clusterName") String clusterName,
@QueryParam("status") boolean status,
BaragonAgentMetadata agent) {
LOG.info(String.format("Notified of startup for agent %s", agent.getAgentId()));
AgentCheckInResponse response;
try {
if (elbManager.isElbConfigured()) {
response = elbManager.attemptAddAgent(agent, loadBalancerDatastore.getLoadBalancerGroup(clusterName), clusterName, status);
} else {
response = new AgentCheckInResponse(TrafficSourceState.DONE, Optional.absent(), 0L);
}
} catch (Exception e) {
LOG.error("Could not register agent startup", e);
response = new AgentCheckInResponse(TrafficSourceState.ERROR, Optional.of(e.getMessage()), 0L);
}
return response;
}
@POST
@Path("/{clusterName}/shutdown")
public AgentCheckInResponse removeAgent(@PathParam("clusterName") String clusterName,
@QueryParam("status") boolean status,
BaragonAgentMetadata agent) {
LOG.info(String.format("Notified of shutdown for agent %s", agent.getAgentId()));
AgentCheckInResponse response;
try {
if (elbManager.isElbConfigured()) {
response = elbManager.attemptRemoveAgent(agent, loadBalancerDatastore.getLoadBalancerGroup(clusterName), clusterName, status);
} else {
response = new AgentCheckInResponse(TrafficSourceState.DONE, Optional.absent(), 0L);
}
} catch (Exception e) {
LOG.error("Could not register agent shutdown", e);
response = new AgentCheckInResponse(TrafficSourceState.ERROR, Optional.of(e.getMessage()), 0L);
}
return response;
}
@GET
@NoAuth
@Produces(MediaType.TEXT_PLAIN)
@Path("/{clusterName}/can-shutdown")
public String canShutdownAgent(@PathParam("clusterName") String clusterName, @QueryParam("agentId") String agentId) {
Optional<BaragonAgentMetadata> maybeAgent = loadBalancerDatastore.getAgent(clusterName, agentId);
Optional<BaragonGroup> maybeGroup = loadBalancerDatastore.getLoadBalancerGroup(clusterName);
if (maybeAgent.isPresent()) {
if (elbManager.isElbEnabledAgent(maybeAgent.get(), maybeGroup, clusterName)) {
if (elbManager.isActiveAndHealthy(maybeGroup, maybeAgent.get())) {
return "0";
}
}
}
return "1";
}
}