package com.hubspot.baragon.service.elb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import com.amazonaws.services.elasticloadbalancing.model.Instance;
import com.google.common.base.Optional;
import com.hubspot.baragon.data.BaragonKnownAgentsDatastore;
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.BaragonKnownAgentMetadata;
import com.hubspot.baragon.service.config.ElbConfiguration;
import com.hubspot.baragon.service.exceptions.BaragonExceptionNotifier;
public abstract class ElasticLoadBalancer {
protected final Optional<ElbConfiguration> configuration;
protected final BaragonExceptionNotifier exceptionNotifier;
protected final BaragonLoadBalancerDatastore loadBalancerDatastore;
protected final BaragonKnownAgentsDatastore knownAgentsDatastore;
public ElasticLoadBalancer(Optional<ElbConfiguration> configuration,
BaragonExceptionNotifier exceptionNotifier,
BaragonLoadBalancerDatastore loadBalancerDatastore,
BaragonKnownAgentsDatastore knownAgentsDatastore) {
this.configuration = configuration;
this.exceptionNotifier = exceptionNotifier;
this.loadBalancerDatastore = loadBalancerDatastore;
this.knownAgentsDatastore = knownAgentsDatastore;
}
public abstract boolean isInstanceHealthy(String instanceId, String name);
public abstract AgentCheckInResponse removeInstance(Instance instance, String elbName, String agentId);
public abstract AgentCheckInResponse checkRemovedInstance(Instance instance, String elbName, String agentId);
public abstract AgentCheckInResponse registerInstance(Instance instance, String elbName, BaragonAgentMetadata agent);
public abstract AgentCheckInResponse checkRegisteredInstance(Instance instance, String elbName, BaragonAgentMetadata agent);
public abstract void syncAll(Collection<BaragonGroup> groups);
Optional<BaragonKnownAgentMetadata> knownAgent(BaragonGroup group, String instanceId) {
Collection<BaragonKnownAgentMetadata> knownAgents = knownAgentsDatastore.getKnownAgentsMetadata(group.getName());
for (BaragonKnownAgentMetadata agent : knownAgents) {
if (agent.getEc2().getInstanceId().isPresent() && agent.getEc2().getInstanceId().get().equals(instanceId)) {
return Optional.of(agent);
}
}
return Optional.absent();
}
List<String> agentInstanceIds(Collection<BaragonAgentMetadata> agents) {
List<String> instanceIds = new ArrayList<>();
for (BaragonAgentMetadata agent : agents) {
if (agent.getEc2().getInstanceId().isPresent()) {
instanceIds.add(agent.getEc2().getInstanceId().get());
} else {
throw new IllegalArgumentException(String.format("Cannot have an absent Agent Instance Id (agent: %s)", agent.getAgentId()));
}
}
return instanceIds;
}
boolean canDeregisterAgent(BaragonGroup group, String instanceId) {
Optional<BaragonKnownAgentMetadata> agent = knownAgent(group, instanceId);
if (!agent.isPresent()) {
return true;
} else {
if (configuration.get().isRemoveKnownAgentEnabled()) {
Date lastSeen = new Date(agent.get().getLastSeenAt());
Date threshold = new Date(System.currentTimeMillis() - (configuration.get().getRemoveKnownAgentMinutes() * 60000L));
return lastSeen.before(threshold);
} else {
return false;
}
}
}
}