package io.fathom.cloud.compute.networks;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.protobuf.CloudModel.VirtualIpData;
import io.fathom.cloud.protobuf.CloudModel.VirtualIpPoolData;
import io.fathom.cloud.server.model.Project;
import java.net.InetAddress;
import java.util.List;
import com.google.common.collect.Lists;
import com.google.common.net.InetAddresses;
/**
* A pool of IP addresses that can be remapped, like IPs on a common Layer 2
* network, or EC2 Elastic IP, or OpenStack Floating IPs. This is used to
* implement Floating IPs. Compare with {@link HostNetworkPool}
*
*/
public class MappableIpNetworkPool extends NetworkPoolBase {
public class Allocation extends NetworkPoolAllocation {
final VirtualIpData data;
public Allocation(VirtualIpData data) {
this.data = data;
}
public VirtualIpData getData() {
return data;
}
@Override
public void releaseIp() throws CloudException {
MappableIpNetworkPool.this.releaseIp(data);
}
@Override
public InetAddress getAddress() {
return InetAddresses.forString(data.getIp());
}
public VirtualIp getVirtualIp() {
return new VirtualIp(poolData, data);
}
}
protected final VirtualIpPoolData poolData;
private final NetworkPools networkPools;
MappableIpNetworkPool(NetworkPools networkPools, VirtualIpPoolData data) {
this.networkPools = networkPools;
this.poolData = data;
}
@Override
public String getNetworkKey() {
return "_vip_" + poolData.getId();
}
public boolean isPublicNetwork() {
return true;
}
@Override
protected Allocation markIpAllocated0(Project project, InetAddress ip) throws CloudException {
VirtualIpData.Builder addr = VirtualIpData.newBuilder();
addr.setIp(InetAddresses.toAddrString(ip));
addr.setProjectId(project.getId());
VirtualIpData allocated = networkPools.networkStateStore.markIpAllocated(this, addr);
return new Allocation(allocated);
}
public long getPoolId() {
return poolData.getId();
}
@Override
protected IpRange getIpRange() {
if (!poolData.hasCidr()) {
throw new IllegalStateException();
}
return IpRange.parse(poolData.getCidr());
}
@Override
protected InetAddress getGateway() {
return null;
}
@Override
protected List<InetAddress> getAllocatedIps() throws CloudException {
List<InetAddress> ret = Lists.newArrayList();
for (VirtualIpData i : networkPools.repository.getAllocatedVips(poolData.getId()).list()) {
ret.add(InetAddresses.forString(i.getIp()));
}
return ret;
}
@Override
public void markIpNotAllocated(VirtualIp vip) throws CloudException {
releaseIp(vip.getData());
}
public void releaseIp(VirtualIpData data) throws CloudException {
networkPools.networkStateStore.releaseIp(MappableIpNetworkPool.this, data);
}
}