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; }
public int size() { if (getIpVersion() == IPv6Constants.IPv4) { return NetworkUtils.getTotalIpInRange(getStartIp(), getEndIp()); } else { return 0; } }
@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); } }
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()); } }
@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 (!rangeVOS.get(0).getAddressMode().equals(ipr.getAddressMode())) { throw new ApiMessageInterceptionException(argerr("addressMode[%s] is different from L3Netowork address mode[%s]", ipr.getAddressMode(), rangeVOS.get(0).getAddressMode())); List<IpRangeVO> ranges = q.list(); for (IpRangeVO r : ranges) { if (IPv6NetworkUtils.isIpv6RangeOverlap(ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())) { throw new ApiMessageInterceptionException(argerr("new ip range [startip :%s, endip :%s] is overlaped with old ip range[startip :%s, endip :%s]", ipr.getStartIp(), ipr.getEndIp(), r.getStartIp(), r.getEndIp())); if (!r.getL3NetworkUuid().equals(ipr.getL3NetworkUuid())) { continue; if (!r.getNetworkCidr().equals(ipr.getNetworkCidr())) { throw new ApiMessageInterceptionException(argerr("new network CIDR [%s] is different from old network cidr [%s]", r.getNetworkCidr(), ipr.getNetworkCidr())); if (!r.getGateway().equals(ipr.getGateway())) { throw new ApiMessageInterceptionException(argerr("new add ip range gateway %s is different from old gateway %s", ipr.getGateway(), r.getGateway()));
private void isVipInVmNicSubnet(String vipUuid, String guestIpUuid) { VipVO vip = dbf.findByUuid(vipUuid, VipVO.class); UsedIpVO vipIp = dbf.findByUuid(vip.getUsedIpUuid(), UsedIpVO.class); IpRangeVO vipRange = dbf.findByUuid(vipIp.getIpRangeUuid(), IpRangeVO.class); UsedIpVO guestIp = dbf.findByUuid(guestIpUuid, UsedIpVO.class); IpRangeVO guestRange = dbf.findByUuid(guestIp.getIpRangeUuid(), IpRangeVO.class); if (vipIp.getIpVersion() != guestIp.getIpVersion()) { throw new ApiMessageInterceptionException(operr("vip ipVersion [%d] is different from guestIp ipVersion [%d].", vipIp.getIpVersion(), guestIp.getIpVersion())); } if (vipIp.getIpVersion() == IPv6Constants.IPv4) { SubnetUtils guestSub = new SubnetUtils(guestRange.getGateway(), guestRange.getNetmask()); if (guestSub.getInfo().isInRange(vipIp.getIp())) { throw new ApiMessageInterceptionException(operr("Vip[%s] is in the guest ip range [%s, %s]", vipIp.getIp(), guestRange.getStartIp(), guestRange.getEndIp())); } } else { if (IPv6NetworkUtils.isIpv6InCidrRange(vipIp.getIp(), guestRange.getNetworkCidr())){ throw new ApiMessageInterceptionException(operr("Vip[%s] is in the guest ip range [%s, %s]", vipIp.getIp(), guestRange.getStartIp(), guestRange.getEndIp())); } } }
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())); } } }
List<IpRangeVO> ranges = q.list(); 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())); if (!r.getL3NetworkUuid().equals(ipr.getL3NetworkUuid())) { continue; 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)); if (!r.getGateway().equals(ipr.getGateway())) { throw new ApiMessageInterceptionException(argerr("new add ip range gateway %s is different from old gateway %s", ipr.getGateway(), r.getGateway()));
@Override public void updateIpAllocationMsg(AllocateIpMsg msg, String mac) { if (msg.getRequiredIp() != null) { return; } List<IpRangeVO> iprs = Q.New(IpRangeVO.class).eq(IpRangeVO_.l3NetworkUuid, msg.getL3NetworkUuid()).list(); if (iprs.get(0).getIpVersion() == IPv6Constants.IPv4) { return; } if (!iprs.get(0).getAddressMode().equals(IPv6Constants.Stateful_DHCP)) { msg.setRequiredIp(IPv6NetworkUtils.getIPv6AddresFromMac(iprs.get(0).getNetworkCidr(), mac)); } }
private String allocateIp(IpRangeVO vo) { BigInteger start = IPv6NetworkUtils.ipv6AddressToBigInteger(vo.getStartIp()); 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; } });
private void handle(APIGetAttachablePublicL3ForVRouterMsg msg) { APIGetAttachablePublicL3ForVRouterReply reply = new APIGetAttachablePublicL3ForVRouterReply(); List<L3NetworkVO> l3NetworkVOS = Q.New(L3NetworkVO.class).notEq(L3NetworkVO_.category, L3NetworkCategory.Private).list(); List<VmNicVO> vmNicVOS = Q.New(VmNicVO.class).eq(VmNicVO_.vmInstanceUuid, msg.getVmInstanceUuid()).list(); if (l3NetworkVOS == null || l3NetworkVOS.isEmpty()) { reply.setInventories(new ArrayList<L3NetworkInventory>()); bus.reply(msg, reply); return; } Set<L3NetworkVO> attachableL3NetworkVOS = new HashSet<>(l3NetworkVOS); for (L3NetworkVO l3NetworkVO : l3NetworkVOS) { for (VmNicVO vmNicVO : vmNicVOS) { if (l3NetworkVO.getIpRanges() == null || l3NetworkVO.getIpRanges().isEmpty()) { attachableL3NetworkVOS.remove(l3NetworkVO); } String vmNicCidr = NetworkUtils.getCidrFromIpMask(vmNicVO.getIp(), vmNicVO.getNetmask()); if (NetworkUtils.isCidrOverlap(l3NetworkVO.getIpRanges().stream().findFirst().get().getNetworkCidr(), vmNicCidr)) { attachableL3NetworkVOS.remove(l3NetworkVO); } attachableL3NetworkVOS.removeAll(attachableL3NetworkVOS.stream() .filter(vo -> vo.getUuid().equals(vmNicVO.getL3NetworkUuid())) .collect(Collectors.toSet())); } } reply.setInventories(L3NetworkInventory.valueOf(attachableL3NetworkVOS)); bus.reply(msg, reply); }
private void checkIfManagementNetworkReachable(String managementNetworkUuid) { SimpleQuery<IpRangeVO> q = dbf.createQuery(IpRangeVO.class); q.add(IpRangeVO_.l3NetworkUuid, Op.EQ, managementNetworkUuid); List<IpRangeVO> iprs = q.list(); if (iprs.isEmpty()) { throw new ApiMessageInterceptionException(operr("the management network[uuid:%s] doesn't have any IP range", managementNetworkUuid)); } String startIp = iprs.get(0).getStartIp(); if (!NetworkUtils.isIpRoutedByDefaultGateway(startIp)) { // the mgmt server is in the same subnet of the mgmt network return; } String gateway = iprs.get(0).getGateway(); for (int i=0; i<3; i++) { ShellResult ret = ShellUtils.runAndReturn(String.format("ping -c 1 -W 2 %s", gateway)); if (ret.isReturnCode(0)) { return; } } throw new ApiMessageInterceptionException(argerr("the management network[uuid:%s, gateway:%s] is not reachable", managementNetworkUuid, gateway)); }
if (ipr.getIpVersion() == IPv6Constants.IPv6 && (ipr.getAddressMode().equals(IPv6Constants.SLAAC))) { return res;
@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()); } }
@Override public void prepareDbInitialValue() { List<IpRangeVO> ipRangeVOS = Q.New(IpRangeVO.class).isNull(IpRangeVO_.prefixLen).list(); for (IpRangeVO ipr : ipRangeVOS) { ipr.setPrefixLen(NetworkUtils.getPrefixLengthFromNetwork(ipr.getNetmask())); } if (!ipRangeVOS.isEmpty()) { dbf.updateCollection(ipRangeVOS); } List<VmNicVO> nics = Q.New(VmNicVO.class).notNull(VmNicVO_.usedIpUuid).list(); List<UsedIpVO> ips = new ArrayList<>(); for (VmNicVO nic : nics) { UsedIpVO ip = Q.New(UsedIpVO.class).eq(UsedIpVO_.uuid, nic.getUsedIpUuid()).isNull(UsedIpVO_.vmNicUuid).find(); if (ip != null) { ip.setVmNicUuid(nic.getUuid()); ips.add(ip); } } if (!ips.isEmpty()) { dbf.updateCollection(ips); } } }
@MessageSafe private void dealMessage(FlatDhcpAcquireDhcpServerIpMsg msg) { FlatDhcpAcquireDhcpServerIpReply reply = new FlatDhcpAcquireDhcpServerIpReply(); String ip = allocateDhcpIp(msg.getL3NetworkUuid()); if (ip != null) { List<IpRangeVO> iprs = Q.New(IpRangeVO.class).eq(IpRangeVO_.l3NetworkUuid, msg.getL3NetworkUuid()).list(); if (iprs == null || iprs.isEmpty()) { reply.setError(operr("L3 network[uuid:%s] does not have any iprange", msg.getL3NetworkUuid())); bus.reply(msg, reply); return; } reply.setIp(ip); reply.setNetmask(iprs.get(0).getNetmask()); reply.setIpr(IpRangeInventory.valueOf(iprs.get(0))); } bus.reply(msg, reply); }
private void handle(final APIGetL3NetworkRouterInterfaceIpMsg msg) { APIGetL3NetworkRouterInterfaceIpReply reply = new APIGetL3NetworkRouterInterfaceIpReply(); if (L3NetworkSystemTags.ROUTER_INTERFACE_IP.hasTag(msg.getL3NetworkUuid())) { reply.setRouterInterfaceIp(L3NetworkSystemTags.ROUTER_INTERFACE_IP.getTokenByResourceUuid(msg.getL3NetworkUuid(), L3NetworkSystemTags.ROUTER_INTERFACE_IP_TOKEN)); bus.reply(msg, reply); return; } List<IpRangeVO> ipRangeVOS = Q.New(IpRangeVO.class).eq(IpRangeVO_.l3NetworkUuid, msg.getL3NetworkUuid()).list(); if (ipRangeVOS == null || ipRangeVOS.isEmpty()) { reply.setRouterInterfaceIp(null); bus.reply(msg, reply); } else { reply.setRouterInterfaceIp(ipRangeVOS.get(0).getGateway()); bus.reply(msg, reply); } }