@Override public List<BigInteger> getUsedIpInRange(IpRangeVO vo) { if (vo.getIpVersion() == IPv6Constants.IPv4) { SimpleQuery<UsedIpVO> query = dbf.createQuery(UsedIpVO.class); query.select(UsedIpVO_.ipInLong); query.add(UsedIpVO_.ipRangeUuid, Op.EQ, vo.getUuid()); List<Long> used = query.listValue(); Collections.sort(used); return used.stream().map(l -> new BigInteger(String.valueOf(l))).collect(Collectors.toList()); } else { SimpleQuery<UsedIpVO> query = dbf.createQuery(UsedIpVO.class); query.select(UsedIpVO_.ip); query.add(UsedIpVO_.ipRangeUuid, Op.EQ, vo.getUuid()); List<String> used = query.listValue(); return used.stream().map(IPv6NetworkUtils::getBigIntegerFromString).sorted().collect(Collectors.toList()); } }
private String allocateIp(IpRangeVO vo) { int total = vo.size(); Random random = new Random(); long s = random.nextInt(total) + NetworkUtils.ipv4StringToLong(vo.getStartIp()); long e = NetworkUtils.ipv4StringToLong(vo.getEndIp()); String ret = steppingAllocate(s ,e, total, vo.getUuid()); if (ret != null) { return ret; } e = s; s = NetworkUtils.ipv4StringToLong(vo.getStartIp()); return steppingAllocate(s ,e, total, vo.getUuid()); } }
BigInteger end = IPv6NetworkUtils.ipv6AddressToBigInteger(vo.getEndIp()); long cnt = Q.New(UsedIpVO.class).eq(UsedIpVO_.ipRangeUuid, vo.getUuid()).count(); BigInteger num = start.add(new BigInteger(String.valueOf(cnt))); if (num.compareTo(end) > 0) { List<UsedIpVO> ips = Q.New(UsedIpVO.class).eq(UsedIpVO_.ipRangeUuid, vo.getUuid()).list(); Set<BigInteger> usedIps = new HashSet<>(); for (UsedIpVO ip : ips) {
@Override public FreeIpInventory call(String arg) { FreeIpInventory f = new FreeIpInventory(); f.setGateway(ipr.getGateway()); f.setIp(arg); f.setNetmask(ipr.getNetmask()); f.setIpRangeUuid(ipr.getUuid()); return f; } });
tagMgr.createTagsFromAPICreateMessage(msg, vo.getUuid(), IpRangeVO.class.getSimpleName());
private List<FreeIpInventory> getFreeIp(final IpRangeVO ipr, int limit, String start) { SimpleQuery<UsedIpVO> q = dbf.createQuery(UsedIpVO.class); q.select(UsedIpVO_.ip); q.add(UsedIpVO_.ipRangeUuid, Op.EQ, ipr.getUuid()); List<String> used = q.listValue(); List<String> spareIps = new ArrayList<>(); if (ipr.getIpVersion() == IPv6Constants.IPv6) { spareIps.addAll(NetworkUtils.getFreeIpv6InRange(ipr.getStartIp(), ipr.getEndIp(), used, limit, start)); } else { spareIps.addAll(NetworkUtils.getFreeIpInRange(ipr.getStartIp(), ipr.getEndIp(), used, limit, start)); } return CollectionUtils.transformToList(spareIps, new Function<FreeIpInventory, String>() { @Override public FreeIpInventory call(String arg) { FreeIpInventory f = new FreeIpInventory(); f.setGateway(ipr.getGateway()); f.setIp(arg); f.setNetmask(ipr.getNetmask()); f.setIpRangeUuid(ipr.getUuid()); return f; } }); }
@Override public boolean isIpRangeFull(IpRangeVO vo) { SimpleQuery<UsedIpVO> query = dbf.createQuery(UsedIpVO.class); query.add(UsedIpVO_.ipRangeUuid, Op.EQ, vo.getUuid()); long used = query.count(); if (vo.getIpVersion() == IPv6Constants.IPv4) { int total = NetworkUtils.getTotalIpInRange(vo.getStartIp(), vo.getEndIp()); return used >= total; } else { return IPv6NetworkUtils.isIpv6RangeFull(vo.getStartIp(), vo.getEndIp(), used); } }
logger.debug(String.format("Ip range[uuid:%s, name: %s] is exhausted, try next one", r.getUuid(), r.getName())); continue;
logger.debug(String.format("Ip range[uuid:%s, name: %s] is exhausted, try next one", r.getUuid(), r.getName())); continue;
private void validate(APISetL3NetworkRouterInterfaceIpMsg msg) { if (!NetworkUtils.isIpv4Address(msg.getRouterInterfaceIp())) { throw new ApiMessageInterceptionException(argerr("invalid IP[%s]", msg.getRouterInterfaceIp())); } List<IpRangeVO> ipRangeVOS = Q.New(IpRangeVO.class).eq(IpRangeVO_.l3NetworkUuid, msg.getL3NetworkUuid()).list(); if (ipRangeVOS == null || ipRangeVOS.isEmpty()) { throw new ApiMessageInterceptionException(argerr("no ip range in l3[%s]", msg.getL3NetworkUuid())); } for (IpRangeVO ipRangeVO : ipRangeVOS) { if (!NetworkUtils.isIpv4InCidr(msg.getRouterInterfaceIp(), ipRangeVO.getNetworkCidr())) { throw new ApiMessageInterceptionException(argerr("ip[%s] is not in the cidr of ip range[uuid:%s, cidr:%s] which l3 network[%s] attached", msg.getRouterInterfaceIp(), ipRangeVO.getUuid(), ipRangeVO.getNetworkCidr(), msg.getL3NetworkUuid())); } if (NetworkUtils.isInRange(msg.getRouterInterfaceIp(), ipRangeVO.getStartIp(), ipRangeVO.getEndIp())) { throw new ApiMessageInterceptionException(argerr("ip[%s] in ip range[uuid:%s, startIp:%s, endIp:%s] which l3 network[%s] attached, this is not allowed", msg.getRouterInterfaceIp(), ipRangeVO.getUuid(), ipRangeVO.getStartIp(), ipRangeVO.getEndIp(), msg.getL3NetworkUuid())); } } }
public static IpRangeInventory valueOf(IpRangeVO vo) { IpRangeInventory inv = new IpRangeInventory(); inv.setCreateDate(vo.getCreateDate()); inv.setDescription(vo.getDescription()); inv.setEndIp(vo.getEndIp()); inv.setGateway(vo.getGateway()); inv.setL3NetworkUuid(vo.getL3NetworkUuid()); inv.setName(vo.getName()); inv.setNetmask(vo.getNetmask()); inv.setStartIp(vo.getStartIp()); inv.setUuid(vo.getUuid()); inv.setLastOpDate(vo.getLastOpDate()); inv.setNetworkCidr(vo.getNetworkCidr()); inv.setIpVersion(vo.getIpVersion()); inv.setAddressMode(vo.getAddressMode()); inv.setPrefixLen(vo.getPrefixLen()); return inv; }
for (IpRangeVO r : ranges) { if (NetworkUtils.isIpv4RangeOverlap(ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())) { throw new ApiMessageInterceptionException(argerr("overlap with ip range[uuid:%s, start ip:%s, end ip: %s]", r.getUuid(), r.getStartIp(), r.getEndIp())); throw new ApiMessageInterceptionException(argerr("multiple CIDR on the same L3 network is not allowed. There has been a IP" + " range[uuid:%s, CIDR:%s], the new IP range[CIDR:%s] is not in the CIDR with the existing one", r.getUuid(), rcidr, cidr));