diff options
author | gjoranv <gjoranv@gmail.com> | 2023-02-20 00:50:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-20 00:50:17 +0100 |
commit | 9fa6316729b5bdaa6a2c5df7f6fe92ea36011837 (patch) | |
tree | 253cdc80d83bb31fc247bfd5c7ba26342764c465 | |
parent | b963387d06e2f2b13cfefd9377265338e575ebc3 (diff) | |
parent | e1e62691a520feef8f77eaa30b4415633a4c9a1f (diff) |
Merge pull request #26103 from vespa-engine/finish-VersionedIpAddress
Finish versioned ip address
3 files changed, 97 insertions, 8 deletions
diff --git a/node-admin/pom.xml b/node-admin/pom.xml index 90bb72efbcd..0f153663e3d 100644 --- a/node-admin/pom.xml +++ b/node-admin/pom.xml @@ -86,6 +86,11 @@ <!-- Test --> <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava-testlib</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddress.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddress.java index 7499820aafd..03dd4d026ec 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddress.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddress.java @@ -5,10 +5,11 @@ import com.google.common.net.InetAddresses; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; +import java.util.Objects; /** * Encapsulates an IP address and its version along with some convenience methods. - * Sorted by version (IPv6 first), then by address. + * Default sorting is by version (IPv6 first), then by address. * * @author gjoranv */ @@ -18,7 +19,7 @@ public class VersionedIpAddress implements Comparable<VersionedIpAddress> { private final IPVersion version; private VersionedIpAddress(InetAddress address) { - this.address = address; + this.address = Objects.requireNonNull(address); version = getVersionOrThrow(address); } @@ -43,6 +44,33 @@ public class VersionedIpAddress implements Comparable<VersionedIpAddress> { return String.format(format, asString(), port); } + @Override + public int compareTo(VersionedIpAddress o) { + int version = version().compareTo(o.version()); + return (version != 0) ? version : asString().compareTo(o.asString()); + } + + @Override + public String toString() { + return "VersionedIpAddress{" + + "address=" + address + + ", version=" + version + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + VersionedIpAddress that = (VersionedIpAddress) o; + return address.equals(that.address) && version == that.version; + } + + @Override + public int hashCode() { + return Objects.hash(address, version); + } + private static IPVersion getVersionOrThrow(InetAddress address) { if (address instanceof Inet4Address) { return IPVersion.IPv4; @@ -53,10 +81,4 @@ public class VersionedIpAddress implements Comparable<VersionedIpAddress> { } } - @Override - public int compareTo(VersionedIpAddress o) { - int version = version().compareTo(o.version()); - return (version != 0) ? version : asString().compareTo(o.asString()); - } - } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddressTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddressTest.java new file mode 100644 index 00000000000..32fbcf9f6a4 --- /dev/null +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddressTest.java @@ -0,0 +1,62 @@ +package com.yahoo.vespa.hosted.node.admin.task.util.network; + +import com.google.common.testing.EqualsTester; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author gjoranv + */ +public class VersionedIpAddressTest { + + @Test + void ip4_address_can_be_generated_from_string() { + var ip4 = VersionedIpAddress.from("10.0.0.1"); + assertEquals(IPVersion.IPv4, ip4.version()); + assertEquals("10.0.0.1", ip4.asString()); + } + + @Test + void ip6_address_can_be_generated_from_string() { + var ip6 = VersionedIpAddress.from("::1"); + assertEquals(IPVersion.IPv6, ip6.version()); + assertEquals("::1", ip6.asString()); + } + + @Test + void they_are_sorted_by_version_then_by_address() { + var ip4 = VersionedIpAddress.from("10.0.0.1"); + var ip4_2 = VersionedIpAddress.from("127.0.0.1"); + var ip6 = VersionedIpAddress.from("::1"); + var ip6_2 = VersionedIpAddress.from("::2"); + + var sorted = Stream.of(ip4_2, ip6, ip4, ip6_2) + .sorted() + .toList(); + assertEquals(List.of(ip6, ip6_2, ip4, ip4_2), sorted); + } + + @Test + void endpoint_with_port_is_generated_correctly_for_both_versions() { + var ip4 = VersionedIpAddress.from("10.0.0.1"); + var ip6 = VersionedIpAddress.from("::1"); + + assertEquals("10.0.0.1:8080", ip4.asEndpoint(8080)); + assertEquals("[::1]:8080", ip6.asEndpoint(8080)); + } + + @Test + void equals_and_hashCode_are_implemented() { + new EqualsTester() + .addEqualityGroup(VersionedIpAddress.from("::1"), VersionedIpAddress.from("::1")) + .addEqualityGroup(VersionedIpAddress.from("::2")) + .addEqualityGroup(VersionedIpAddress.from("127.0.0.1"), VersionedIpAddress.from("127.0.0.1")) + .addEqualityGroup(VersionedIpAddress.from("10.0.0.1")) + .testEquals(); + } + +} |