package org.zstack.network.l3;
import org.springframework.beans.factory.annotation.Autowired;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.errorcode.ErrorFacade;
import org.zstack.header.errorcode.OperationFailureException;
import org.zstack.header.network.l3.*;
import org.zstack.utils.CollectionUtils;
import org.zstack.utils.function.Function;
import org.zstack.utils.network.NetworkUtils;
import java.util.List;
/**
*/
public abstract class AbstractIpAllocatorStrategy implements IpAllocatorStrategy {
@Autowired
protected DatabaseFacade dbf;
@Autowired
protected L3NetworkManager l3NwMgr;
@Autowired
protected ErrorFacade errf;
protected UsedIpInventory allocateRequiredIp(IpAllocateMessage msg) {
SimpleQuery<IpRangeVO> q = dbf.createQuery(IpRangeVO.class);
q.add(IpRangeVO_.l3NetworkUuid, SimpleQuery.Op.EQ, msg.getL3NetworkUuid());
List<IpRangeVO> iprs = q.list();
final long rip = NetworkUtils.ipv4StringToLong(msg.getRequiredIp());
IpRangeVO ipr = CollectionUtils.find(iprs, new Function<IpRangeVO, IpRangeVO>() {
@Override
public IpRangeVO call(IpRangeVO arg) {
long s = NetworkUtils.ipv4StringToLong(arg.getStartIp());
long e = NetworkUtils.ipv4StringToLong(arg.getEndIp());
return s <= rip && rip <= e ? arg : null;
}
});
if (ipr == null) {
throw new OperationFailureException(errf.instantiateErrorCode(L3Errors.ALLOCATE_IP_ERROR,
String.format("cannot find ip range that has ip[%s] in l3Network[uuid:%s]", msg.getRequiredIp(), msg.getL3NetworkUuid())
));
}
return l3NwMgr.reserveIp(IpRangeInventory.valueOf(ipr), msg.getRequiredIp());
}
}