diff options
author | gjoranv <gv@verizonmedia.com> | 2023-02-15 10:36:09 +0100 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2023-02-16 10:10:25 +0100 |
commit | 3d14175dcd99e567c6745b0239a79cdb29c7f7ad (patch) | |
tree | 7e5510598099b79198ebee9f8e69128b40965e70 /node-admin/src/main/java | |
parent | 3d8297aa6e6fda13d234d29a915d788e4b071fef (diff) |
Implement nodes/v2/wireguard support in client.
Diffstat (limited to 'node-admin/src/main/java')
4 files changed, 93 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); + } + +} |