diff options
author | gjoranv <gv@verizonmedia.com> | 2023-02-08 18:05:33 +0100 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2023-02-10 15:49:18 +0100 |
commit | caa42719324894082bafdfa1e6256d88eda2b914 (patch) | |
tree | 80afc9f9ccbb53e18a4d694cc921a4e848426fed | |
parent | f20c863d11530a3200a2be5fbffdd6607918b2c3 (diff) |
Add nodes/v2/wireguard/
.. to allow tenant nodes to get peer config for configservers.
5 files changed, 55 insertions, 3 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java index b1a66e34c9e..543901621d0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java @@ -115,7 +115,7 @@ public class NodesV2ApiHandler extends ThreadedHttpRequestHandler { private HttpResponse handleGET(HttpRequest request) { Path path = new Path(request.getUri()); String pathS = request.getUri().getPath(); - if (path.matches( "/nodes/v2")) return new ResourceResponse(request.getUri(), "node", "state", "acl", "command", "archive", "locks", "maintenance", "upgrade", "capacity", "application", "stats"); + if (path.matches( "/nodes/v2")) return new ResourceResponse(request.getUri(), "node", "state", "acl", "command", "archive", "locks", "maintenance", "upgrade", "capacity", "application", "stats", "wireguard"); if (path.matches( "/nodes/v2/node")) return new NodesResponse(ResponseType.nodeList, request, orchestrator, nodeRepository); if (pathS.startsWith("/nodes/v2/node/")) return new NodesResponse(ResponseType.singleNode, request, orchestrator, nodeRepository); if (path.matches( "/nodes/v2/state")) return new NodesResponse(ResponseType.stateList, request, orchestrator, nodeRepository); @@ -130,6 +130,7 @@ public class NodesV2ApiHandler extends ThreadedHttpRequestHandler { if (path.matches( "/nodes/v2/application")) return applicationList(request.getUri()); if (path.matches( "/nodes/v2/application/{applicationId}")) return application(path.get("applicationId"), request.getUri()); if (path.matches( "/nodes/v2/stats")) return stats(); + if (path.matches( "/nodes/v2/wireguard")) return new WireguardResponse(nodeRepository); throw new NotFoundException("Nothing at " + path); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/WireguardResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/WireguardResponse.java new file mode 100644 index 00000000000..0bac6f09029 --- /dev/null +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/WireguardResponse.java @@ -0,0 +1,36 @@ +package com.yahoo.vespa.hosted.provision.restapi; + +import com.yahoo.config.provision.NodeType; +import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.slime.Cursor; +import com.yahoo.vespa.hosted.provision.Node; +import com.yahoo.vespa.hosted.provision.NodeList; +import com.yahoo.vespa.hosted.provision.NodeRepository; + +/** + * @author gjoranv + */ +public class WireguardResponse extends SlimeJsonResponse { + + public WireguardResponse(NodeRepository nodeRepository) { + Cursor root = slime.setObject(); + Cursor cfgArray = root.setArray("configservers"); + + NodeList configservers = nodeRepository.nodes() + .list(Node.State.active) + .nodeType(NodeType.config); + + configservers.forEach( + configserver -> addConfigserver(cfgArray.addObject(), configserver)); + } + + private void addConfigserver(Cursor cfgEntry, Node configserver) { + cfgEntry.setString("hostname", configserver.hostname()); + + configserver.wireguardPubKey().ifPresent( + key -> cfgEntry.setString("wireguardPubkey", key.value())); + + NodesResponse.ipAddressesToSlime(configserver.ipConfig().primary(), cfgEntry.setArray("ipAddresses")); + } + +} diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java index 7758305deee..1d7b7ec7454 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java @@ -65,6 +65,7 @@ public class NodesV2ApiTest { assertFile(new Request("http://localhost:8080/nodes/v2/node/host2.yahoo.com"), "node2.json"); assertFile(new Request("http://localhost:8080/nodes/v2/stats"), "stats.json"); assertFile(new Request("http://localhost:8080/nodes/v2/maintenance/"), "maintenance.json"); + assertFile(new Request("http://localhost:8080/nodes/v2/wireguard/"), "wireguard.json"); // GET with filters assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&hostname=host6.yahoo.com%20host2.yahoo.com"), "application2-nodes.json"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/root.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/root.json index 201cc47d66e..a41fa72f2e0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/root.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/root.json @@ -32,6 +32,8 @@ }, { "url":"http://localhost:8080/nodes/v2/stats/" - } - ] + }, + { + "url":"http://localhost:8080/nodes/v2/wireguard/" + } ] }
\ No newline at end of file diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/wireguard.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/wireguard.json new file mode 100644 index 00000000000..bc6c9301da8 --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/wireguard.json @@ -0,0 +1,12 @@ +{ + "configservers": + [ + { + "hostname":"cfg1.yahoo.com", + "ipAddresses":["127.0.201.1","::201:1"]}, + { + "hostname":"cfg2.yahoo.com", + "ipAddresses":["127.0.202.1","::202:1"] + } + ] +} |