package com.hubspot.baragon.data;
import java.util.Collection;
import java.util.Collections;
import org.apache.curator.framework.CuratorFramework;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.codahale.metrics.annotation.Timed;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.hubspot.baragon.config.ZooKeeperConfiguration;
import com.hubspot.baragon.models.BaragonKnownAgentMetadata;
@Singleton
public class BaragonKnownAgentsDatastore extends AbstractDataStore {
private static final Logger LOG = LoggerFactory.getLogger(BaragonKnownAgentsDatastore.class);
public static final String KNOWN_AGENTS_GROUP_HOSTS_FORMAT = "/load-balancer/%s/known-agents";
public static final String KNOWN_AGENTS_GROUP_HOST_FORMAT = KNOWN_AGENTS_GROUP_HOSTS_FORMAT + "/%s";
@Inject
public BaragonKnownAgentsDatastore(CuratorFramework curatorFramework, ObjectMapper objectMapper, ZooKeeperConfiguration zooKeeperConfiguration) {
super(curatorFramework, objectMapper, zooKeeperConfiguration);
}
@Timed
public Collection<BaragonKnownAgentMetadata> getKnownAgentsMetadata(String clusterName) {
final Collection<String> nodes = getChildren(String.format(KNOWN_AGENTS_GROUP_HOSTS_FORMAT, clusterName));
if (nodes.isEmpty()) {
return Collections.emptyList();
}
final Collection<BaragonKnownAgentMetadata> metadata = Lists.newArrayListWithCapacity(nodes.size());
for (String node : nodes) {
metadata.addAll(readFromZk(String.format(KNOWN_AGENTS_GROUP_HOST_FORMAT, clusterName, node), BaragonKnownAgentMetadata.class).asSet());
}
return metadata;
}
@Timed
public Optional<BaragonKnownAgentMetadata> getKnownAgentMetadata(String clusterName, String agentId) {
return readFromZk(String.format(KNOWN_AGENTS_GROUP_HOST_FORMAT, clusterName, agentId), BaragonKnownAgentMetadata.class);
}
@Timed
public void addKnownAgent(String clusterName, BaragonKnownAgentMetadata agentMetadata) {
writeToZk(String.format(KNOWN_AGENTS_GROUP_HOST_FORMAT, clusterName, agentMetadata.getAgentId()), agentMetadata);
}
@Timed
public void removeKnownAgent(String clusterName, String agentId) {
deleteNode(String.format(KNOWN_AGENTS_GROUP_HOST_FORMAT, clusterName, agentId));
}
@Timed
public void updateKnownAgentLastSeenAt(String clusterName, String agentId, long time) {
Optional<BaragonKnownAgentMetadata> maybeAgent = getKnownAgentMetadata(clusterName, agentId);
if (maybeAgent.isPresent()) {
maybeAgent.get().setLastSeenAt(time);
writeToZk(String.format(KNOWN_AGENTS_GROUP_HOST_FORMAT, clusterName, maybeAgent.get().getAgentId()), maybeAgent.get());
} else {
LOG.error("Could not fetch known agent metadata to update lastSeenAt time");
}
}
}