package io.fathom.cloud.compute.networks;
import io.fathom.cloud.CloudException;
import io.fathom.cloud.compute.scheduler.SchedulerHost;
import io.fathom.cloud.compute.scheduler.SchedulerHost.SchedulerHostNetwork;
import io.fathom.cloud.protobuf.CloudModel.InstanceData;
import io.fathom.cloud.protobuf.CloudModel.NetworkAddressData;
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 are locked to a host, like with most 'simple'
* dedicated servers or virtual servers. This is currently used for 'normal' IP
* allocation when an instance starts up and gets private IP addresses. Compare
* with {@link MappableIpNetworkPool}
*/
public class HostNetworkPool extends NetworkPoolBase {
public class Allocation extends NetworkPoolAllocation {
final NetworkAddressData data;
public Allocation(NetworkAddressData data) {
this.data = data;
}
public NetworkAddressData getData() {
return data;
}
@Override
public void releaseIp() throws CloudException {
networkPools.networkStateStore.releaseIp(HostNetworkPool.this, data);
}
@Override
public InetAddress getAddress() {
return InetAddresses.forString(data.getIp());
}
}
private final SchedulerHost host;
private final SchedulerHostNetwork network;
private final NetworkPools networkPools;
private final InstanceData instance;
HostNetworkPool(NetworkPools networkPools, SchedulerHost host, SchedulerHostNetwork network, InstanceData instance) {
this.networkPools = networkPools;
this.host = host;
this.network = network;
this.instance = instance;
}
public long getHostId() {
return host.getId();
}
@Override
public String getNetworkKey() {
return network.getKey();
}
@Override
public IpRange getIpRange() {
return network.getIpRange();
}
@Override
public InetAddress getGateway() {
return network.getGateway();
}
public boolean isPublicNetwork() {
return network.isPublicNetwork();
}
@Override
protected NetworkPoolAllocation markIpAllocated0(Project project, InetAddress ip) throws CloudException {
IpRange ipRange = getIpRange();
NetworkAddressData.Builder addr = NetworkAddressData.newBuilder();
addr.setIp(InetAddresses.toAddrString(ip));
addr.setGateway(InetAddresses.toAddrString(getGateway()));
addr.setPrefixLength(ipRange.getNetmaskLength());
addr.setPublicAddress(isPublicNetwork());
addr.setNetworkKey(getNetworkKey());
addr.setProjectId(instance.getProjectId());
addr.setInstanceId(instance.getId());
NetworkAddressData allocated = networkPools.networkStateStore.markIpAllocated(this, addr);
return new Allocation(allocated);
}
@Override
public List<InetAddress> getAllocatedIps() throws CloudException {
List<InetAddress> ret = Lists.newArrayList();
for (NetworkAddressData i : networkPools.repository.getHostIps(host.getId(), getNetworkKey()).list()) {
ret.add(InetAddresses.forString(i.getIp()));
}
return ret;
}
@Override
public void markIpNotAllocated(VirtualIp vip) throws CloudException {
throw new UnsupportedOperationException();
}
}