aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgjoranv <gjoranv@gmail.com>2023-02-20 00:50:17 +0100
committerGitHub <noreply@github.com>2023-02-20 00:50:17 +0100
commit9fa6316729b5bdaa6a2c5df7f6fe92ea36011837 (patch)
tree253cdc80d83bb31fc247bfd5c7ba26342764c465
parentb963387d06e2f2b13cfefd9377265338e575ebc3 (diff)
parente1e62691a520feef8f77eaa30b4415633a4c9a1f (diff)
Merge pull request #26103 from vespa-engine/finish-VersionedIpAddress
Finish versioned ip address
-rw-r--r--node-admin/pom.xml5
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddress.java38
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/task/util/network/VersionedIpAddressTest.java62
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();
+ }
+
+}