summaryrefslogtreecommitdiffstats
path: root/node-admin/src
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2023-02-15 10:36:09 +0100
committergjoranv <gv@verizonmedia.com>2023-02-16 10:10:25 +0100
commit3d14175dcd99e567c6745b0239a79cdb29c7f7ad (patch)
tree7e5510598099b79198ebee9f8e69128b40965e70 /node-admin/src
parent3d8297aa6e6fda13d234d29a915d788e4b071fef (diff)
Implement nodes/v2/wireguard support in client.
Diffstat (limited to 'node-admin/src')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeRepository.java4
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java19
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/GetWireguardResponse.java48
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/wireguard/ConfigserverPeer.java22
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integration/NodeRepoMock.java6
5 files changed, 99 insertions, 0 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeRepository.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeRepository.java
index c4c9dd3f591..b423eb5dbdf 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeRepository.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeRepository.java
@@ -1,6 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.node.admin.configserver.noderepository;
+import com.yahoo.vespa.hosted.node.admin.wireguard.ConfigserverPeer;
+
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -22,6 +24,8 @@ public interface NodeRepository {
Map<String, Acl> getAcls(String hostname);
+ List<ConfigserverPeer> getConfigserverPeers();
+
void updateNodeAttributes(String hostName, NodeAttributes nodeAttributes);
void setNodeState(String hostName, NodeState nodeState);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java
index cc41825fd5b..68c4c17a0dd 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.DockerImage;
+import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.WireguardKey;
@@ -14,7 +15,10 @@ import com.yahoo.vespa.hosted.node.admin.configserver.HttpException;
import com.yahoo.vespa.hosted.node.admin.configserver.StandardConfigServerResponse;
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.bindings.GetAclResponse;
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.bindings.GetNodesResponse;
+import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.bindings.GetWireguardResponse;
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.bindings.NodeRepositoryNode;
+import com.yahoo.vespa.hosted.node.admin.task.util.network.VersionedIpAddress;
+import com.yahoo.vespa.hosted.node.admin.wireguard.ConfigserverPeer;
import java.net.URI;
import java.time.Instant;
@@ -125,6 +129,15 @@ public class RealNodeRepository implements NodeRepository {
}
@Override
+ public List<ConfigserverPeer> getConfigserverPeers() {
+ GetWireguardResponse nodeResponse = configServerApi.get("/nodes/v2/wireguard",
+ GetWireguardResponse.class);
+ return nodeResponse.configservers.stream()
+ .map(RealNodeRepository::createConfigserverPeer)
+ .toList();
+ }
+
+ @Override
public void updateNodeAttributes(String hostName, NodeAttributes nodeAttributes) {
configServerApi.patch("/nodes/v2/node/" + hostName,
nodeRepositoryNodeFromNodeAttributes(nodeAttributes),
@@ -325,4 +338,10 @@ public class RealNodeRepository implements NodeRepository {
return node;
}
+ private static ConfigserverPeer createConfigserverPeer(GetWireguardResponse.Configserver configServer) {
+ return new ConfigserverPeer(HostName.of(configServer.hostname),
+ configServer.ipAddresses.stream().map(VersionedIpAddress::from).toList(),
+ WireguardKey.from(configServer.wireguardPubkey));
+ }
+
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/GetWireguardResponse.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/GetWireguardResponse.java
new file mode 100644
index 00000000000..a71b2a74b31
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/GetWireguardResponse.java
@@ -0,0 +1,48 @@
+package com.yahoo.vespa.hosted.node.admin.configserver.noderepository.bindings;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+/**
+ * A response from the /nodes/v2/wireguard api.
+ *
+ * @author gjoranv
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class GetWireguardResponse {
+
+ public final List<Configserver> configservers;
+
+ @JsonCreator
+ public GetWireguardResponse(@JsonProperty("configservers") List<Configserver> configservers) {
+ this.configservers = configservers;
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static class Configserver {
+
+ @JsonProperty("hostname")
+ public final String hostname;
+
+ @JsonProperty("ipAddresses")
+ public final List<String> ipAddresses;
+
+ @JsonProperty("wireguardPubkey")
+ public final String wireguardPubkey;
+
+ @JsonCreator
+ public Configserver(@JsonProperty("hostname") String hostname,
+ @JsonProperty("ipAddresses") List<String> ipAddresses,
+ @JsonProperty("wireguardPubkey") String wireguardPubkey) {
+ this.hostname = hostname;
+ this.ipAddresses = ipAddresses;
+ this.wireguardPubkey = wireguardPubkey;
+ }
+ }
+
+}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/wireguard/ConfigserverPeer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/wireguard/ConfigserverPeer.java
new file mode 100644
index 00000000000..e21505d863a
--- /dev/null
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/wireguard/ConfigserverPeer.java
@@ -0,0 +1,22 @@
+package com.yahoo.vespa.hosted.node.admin.wireguard;
+
+import com.yahoo.config.provision.HostName;
+import com.yahoo.config.provision.WireguardKey;
+import com.yahoo.vespa.hosted.node.admin.task.util.network.VersionedIpAddress;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author gjoranv
+ */
+public record ConfigserverPeer(HostName hostname,
+ Collection<VersionedIpAddress> ipAddresses,
+ WireguardKey publicKey) {
+
+ public ConfigserverPeer {
+ if (ipAddresses.isEmpty()) throw new IllegalArgumentException("No IP addresses for configserver " + hostname.value());
+ ipAddresses = List.copyOf(ipAddresses);
+ }
+
+}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integration/NodeRepoMock.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integration/NodeRepoMock.java
index 997b613c337..06729083494 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integration/NodeRepoMock.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/integration/NodeRepoMock.java
@@ -8,6 +8,7 @@ import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeAttribu
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeRepository;
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeSpec;
import com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeState;
+import com.yahoo.vespa.hosted.node.admin.wireguard.ConfigserverPeer;
import java.util.List;
import java.util.Map;
@@ -47,6 +48,11 @@ public class NodeRepoMock implements NodeRepository {
}
@Override
+ public List<ConfigserverPeer> getConfigserverPeers() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void updateNodeAttributes(String hostName, NodeAttributes nodeAttributes) {
updateNodeSpec(new NodeSpec.Builder(getNode(hostName))
.updateFromNodeAttributes(nodeAttributes)