package com.hubspot.baragon.agent.handlebars;
import java.util.Collection;
import com.github.jknack.handlebars.Options;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import com.hubspot.baragon.agent.config.BaragonAgentConfiguration;
import com.hubspot.baragon.models.BaragonAgentMetadata;
import com.hubspot.baragon.models.UpstreamInfo;
public class PreferSameRackWeightingHelper {
private final BaragonAgentConfiguration configuration;
private final BaragonAgentMetadata agentMetadata;
public PreferSameRackWeightingHelper(BaragonAgentConfiguration configuration, BaragonAgentMetadata agentMetadata) {
this.configuration = configuration;
this.agentMetadata = agentMetadata;
}
public CharSequence preferSameRackWeighting(Collection<UpstreamInfo> upstreams, UpstreamInfo currentUpstream, Options options) {
if (agentMetadata.getEc2().getAvailabilityZone().isPresent() && currentUpstream.getRackId().isPresent()) {
String currentRack = agentMetadata.getEc2().getAvailabilityZone().get();
int maxCount = 0;
Multiset<String> racks = HashMultiset.create();
for (UpstreamInfo upstreamInfo : upstreams) {
if (upstreamInfo.getRackId().isPresent()) {
racks.add(upstreamInfo.getRackId().get());
if (racks.count(upstreamInfo.getRackId().get()) > maxCount) {
maxCount = racks.count(upstreamInfo.getRackId().get());
}
}
}
if (racks.count(currentRack) == 0) {
return "";
}
if (racks.count(currentRack) == maxCount) {
if (currentUpstream.getRackId().get().equals(currentRack)) {
return "";
} else {
return configuration.getZeroWeightString();
}
} else {
if (currentUpstream.getRackId().get().equals(currentRack)) {
return String.format(configuration.getWeightingFormat(), configuration.getSameRackMultiplier());
}
}
}
return "";
}
}