package io.fathom.cloud.compute.networks; import io.fathom.cloud.protobuf.CloudModel.VirtualIpData; import io.fathom.cloud.protobuf.CloudModel.VirtualIpPoolData; import java.net.InetAddress; import java.util.Collections; import java.util.List; import org.bouncycastle.util.Arrays; import com.google.common.collect.Lists; import com.google.common.net.InetAddresses; /** * A pool of EC2 floating IP addresses * */ public class Ec2IpNetworkPool extends MappableIpNetworkPool { Ec2IpNetworkPool(NetworkPools networkPools, VirtualIpPoolData data) { super(networkPools, data); } @Override protected IpRange getIpRange() { // We override the methods that call getIpRange throw new UnsupportedOperationException(); } @Override protected InetAddress convertSeedToIp(byte[] seed) { // Must be consistent, but this won't be meaningfully mapped to the // value int hashCode = Math.abs(Arrays.hashCode(seed)); List<InetAddress> ips = getPoolIpAddresses(); if (ips.isEmpty()) { throw new IllegalStateException("No EC2 IP addresses defined in pool"); } return ips.get(hashCode % ips.size()); } @Override protected List<InetAddress> getSystemReservedAddresses() { return Collections.emptyList(); } private List<InetAddress> getPoolIpAddresses() { List<InetAddress> addresses = Lists.newArrayList(); for (VirtualIpData ipData : poolData.getIpList()) { String ip = ipData.getIp(); addresses.add(InetAddresses.forString(ip)); } return addresses; } }