From 77d1abc804072f22845ac5d9f071eb883fee13d6 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Wed, 11 Nov 2015 12:14:09 +0100 Subject: [PATCH] CLOUDSTACK-9054 use of google-optional as PoC --- .../com/cloud/network/NetworkModelImpl.java | 4 ++-- .../java/com/cloud/utils/net/NetUtils.java | 23 +++++++++++-------- .../com/cloud/utils/net/NetUtilsTest.java | 9 ++++---- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index 154e666c7a3f..bde9f49b3c23 100644 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -629,8 +629,8 @@ public boolean isIP6AddressAvailableInVlan(long vlanId) { } long existedCount = _ipv6Dao.countExistedIpsInVlan(vlanId); BigInteger existedInt = BigInteger.valueOf(existedCount); - BigInteger rangeInt = NetUtils.countIp6InRange(vlan.getIp6Range()); - return (existedInt.compareTo(rangeInt) < 0); + BigInteger rangeInt = NetUtils.countIp6InRange(vlan.getIp6Range()).get();// old behaviour npe on the next line + return (existedInt.compareTo(rangeInt) < 0);// new behaviour IllegalState Exception on the previous line } @Override diff --git a/utils/src/main/java/com/cloud/utils/net/NetUtils.java b/utils/src/main/java/com/cloud/utils/net/NetUtils.java index 883129b20ffa..7af1d95dfed6 100644 --- a/utils/src/main/java/com/cloud/utils/net/NetUtils.java +++ b/utils/src/main/java/com/cloud/utils/net/NetUtils.java @@ -48,6 +48,7 @@ import com.cloud.utils.IteratorUtil; import com.cloud.utils.Pair; import com.cloud.utils.script.Script; +import com.google.common.base.Optional; import com.googlecode.ipv6.IPv6Address; import com.googlecode.ipv6.IPv6AddressRange; import com.googlecode.ipv6.IPv6Network; @@ -1263,7 +1264,11 @@ public static String getIp6FromRange(final String ip6Range) { final String[] ips = ip6Range.split("-"); final String startIp = ips[0]; final IPv6Address start = IPv6Address.fromString(startIp); - final BigInteger gap = countIp6InRange(ip6Range); + final Optional gapOption = countIp6InRange(ip6Range); + if (! gapOption.isPresent()) { + return null; + } + final BigInteger gap = gapOption.get(); BigInteger next = new BigInteger(gap.bitLength(), s_rand); while (next.compareTo(gap) >= 0) { next = new BigInteger(gap.bitLength(), s_rand); @@ -1302,26 +1307,26 @@ private static BigInteger convertIPv6AddressToBigInteger(final IPv6Address addr) } // Can cover 127 bits - public static BigInteger countIp6InRange(final String ip6Range) { + public static Optional countIp6InRange(final String ip6Range) { if (ip6Range == null) { - return null; + return Optional.fromNullable(null); } final String[] ips = ip6Range.split("-"); - final String startIp = ips[0]; - String endIp = ips[0]; - if (ips.length > 1) { - endIp = ips[1]; + if(ips[0].equals("")) { + return Optional.fromNullable(null); } + final String startIp = ips[0]; + final String endIp = (ips.length > 1) ? ips[1] : ips[0]; try { final BigInteger startInt = convertIPv6AddressToBigInteger(IPv6Address.fromString(startIp)); final BigInteger endInt = convertIPv6AddressToBigInteger(IPv6Address.fromString(endIp)); if (endInt != null && startInt != null && startInt.compareTo(endInt) <= 0) { - return endInt.subtract(startInt).add(BigInteger.ONE); + return Optional.of(endInt.subtract(startInt).add(BigInteger.ONE)); } } catch (final IllegalArgumentException ex) { s_logger.error("Failed to convert a string to an IPv6 address", ex); } - return null; + return Optional.fromNullable(null); } public static boolean isIp6InRange(final String ip6, final String ip6Range) { diff --git a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java index 1ab4459d6aca..c67c34c4b689 100644 --- a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java +++ b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java @@ -38,6 +38,7 @@ import org.apache.log4j.Logger; import org.junit.Test; +import com.google.common.base.Optional; import com.googlecode.ipv6.IPv6Address; public class NetUtilsTest { @@ -139,22 +140,22 @@ public void testGetIp6FromRange() { @Test public void testCountIp6InRange() { - assertEquals(new BigInteger("2"), NetUtils.countIp6InRange("1234:5678::1-1234:5678::2")); + assertEquals(Optional.of(new BigInteger("2")), NetUtils.countIp6InRange("1234:5678::1-1234:5678::2")); } @Test public void testCountIp6InRangeWithInvalidRange() { - assertEquals(null, NetUtils.countIp6InRange("1234:5678::2-1234:5678::0")); + assertEquals(Optional.absent(), NetUtils.countIp6InRange("1234:5678::2-1234:5678::0")); } @Test public void testCountIp6InRangeWithNullStart() { - assertEquals(null, NetUtils.countIp6InRange("-1234:5678::0")); + assertEquals(Optional.absent(), NetUtils.countIp6InRange("-1234:5678::0")); } @Test public void testCountIp6InRangeWithNoEnd() { - assertEquals(new BigInteger("1"), NetUtils.countIp6InRange("1234:5678::2")); + assertEquals(Optional.of(new BigInteger("1")), NetUtils.countIp6InRange("1234:5678::2")); } @Test