@Override public Set<Long> getAvailableIps(Network network, String requestedIp) { if (network.getCidr() == null) { return Collections.emptySet(); } String[] cidr = network.getCidr().split("/"); List<String> ips = getUsedIpsInNetwork(network); Set<Long> usedIps = new TreeSet<Long>(); for (String ip : ips) { if (requestedIp != null && requestedIp.equals(ip)) { s_logger.warn("Requested ip address " + requestedIp + " is already in use in network" + network); return null; } usedIps.add(NetUtils.ip2Long(ip)); } Set<Long> allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1]), usedIps); String gateway = network.getGateway(); if ((gateway != null) && (allPossibleIps.contains(NetUtils.ip2Long(gateway)))) allPossibleIps.remove(NetUtils.ip2Long(gateway)); return allPossibleIps; }
private List<Pair<String, String>> getIpAddressRanges(Network network) { List<Pair<String, String>> ipAddressRanges = Lists.newArrayList(); String subnet = NetUtils.getCidrSubNet(network.getCidr()); String netmask = NetUtils.getCidrNetmask(network.getCidr()); long cidrSize = NetUtils.getCidrSize(netmask); Set<Long> allIPsInCidr = NetUtils.getAllIpsFromCidr(subnet, cidrSize, new HashSet<Long>()); if (allIPsInCidr == null || !(allIPsInCidr instanceof TreeSet)) { throw new IllegalStateException("The IPs in CIDR for subnet " + subnet + " where null or returned in a non-ordered set."); } Iterator<Long> ipIterator = allIPsInCidr.iterator(); long ip = ipIterator.next(); long gatewayIp = NetUtils.ip2Long(network.getGateway()); String lastIp = NetUtils.getIpRangeEndIpFromCidr(subnet, cidrSize); if (gatewayIp == ip) { ip = ipIterator.next(); ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), lastIp)); } else if (!network.getGateway().equals(lastIp)) { ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), NetUtils.long2Ip(gatewayIp - 1))); ipAddressRanges.add(Pair.of(NetUtils.long2Ip(gatewayIp + 1), lastIp)); } else { ipAddressRanges.add(Pair.of(NetUtils.long2Ip(ip), NetUtils.long2Ip(gatewayIp - 1))); } return ipAddressRanges; }
@Test public void testGetAllIpsFromCidr() throws Exception { final Set<Long> emptyList = new HashSet<>(); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0", 24L, emptyList).size() == 254); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0", 25L, emptyList).size() == 126); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0", 30L, emptyList).size() == 2); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0/31", emptyList).size() == 0); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0/32", emptyList).size() == 0); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0", 23L, emptyList).size() == 510); assertTrue(NetUtils.getAllIpsFromCidr("10.0.0.0", 16L, emptyList).size() == 65534); }
public static SortedSet<Long> getAllIpsFromCidr(final String cidr, final Set<Long> usedIps) { final String cidrIp = getCidr(cidr).first(); final Integer cidrSize = getCidr(cidr).second(); return getAllIpsFromCidr(cidrIp, cidrSize, usedIps); }