diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-06-13 15:10:50 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-06-13 15:20:42 +0200 |
commit | 15e633f78e1524fab38361b50d641a28e701ede0 (patch) | |
tree | 0f34ebc79b0bc98618380bb9b43ec80808674fcc | |
parent | a8588e074f7f556eb275c631a2b1d67299d21aba (diff) |
Identify node-admin requests
4 files changed, 18 insertions, 11 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java index d66e9ea7937..59a03381891 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/ConfigServerApiImpl.java @@ -245,7 +245,7 @@ public class ConfigServerApiImpl implements ConfigServerApi { .setDefaultRequestConfig(DEFAULT_REQUEST_CONFIG) .disableAutomaticRetries() .disableConnectionState() // Share connections between subsequent requests. - .setUserAgent("node-admin") + .setUserAgent("node-admin") // Node-repository depends on this value to identify agent of node-admin/host-admin requests .setConnectionManager(cm) .build(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Agent.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Agent.java index e03b77b91b8..d8c1344416c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Agent.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Agent.java @@ -11,6 +11,7 @@ public enum Agent { operator, // A hosted Vespa operator. Some logic recognizes these events. application, // An application package change deployment system, // An unspecified system agent + nodeAdmin, // A hosted Vespa node // Specific system agents: NodeFailer, diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java index 514689d3d4e..f52ce5d690d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java @@ -475,6 +475,7 @@ public class NodeSerializer { case "operator" -> Agent.operator; case "application" -> Agent.application; case "system" -> Agent.system; + case "nodeAdmin" -> Agent.nodeAdmin; case "DirtyExpirer" -> Agent.DirtyExpirer; case "DynamicProvisioningMaintainer", "HostCapacityMaintainer" -> Agent.HostCapacityMaintainer; case "HostResumeProvisioner" -> Agent.HostResumeProvisioner; @@ -500,6 +501,7 @@ public class NodeSerializer { case operator -> "operator"; case application -> "application"; case system -> "system"; + case nodeAdmin -> "nodeAdmin"; case DirtyExpirer -> "DirtyExpirer"; case HostCapacityMaintainer -> "DynamicProvisioningMaintainer"; case HostResumeProvisioner -> "HostResumeProvisioner"; 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 e04d21d3012..28f99b02e60 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 @@ -139,28 +139,28 @@ public class NodesV2ApiHandler extends ThreadedHttpRequestHandler { Path path = new Path(request.getUri()); // Check paths to disallow illegal state changes if (path.matches("/nodes/v2/state/ready/{hostname}")) { - nodeRepository.nodes().markNodeAvailableForNewAllocation(path.get("hostname"), Agent.operator, "Readied through the nodes/v2 API"); + nodeRepository.nodes().markNodeAvailableForNewAllocation(path.get("hostname"), agent(request), "Readied through the nodes/v2 API"); return new MessageResponse("Moved " + path.get("hostname") + " to " + Node.State.ready); } else if (path.matches("/nodes/v2/state/failed/{hostname}")) { - var failedOrMarkedNodes = NodeList.copyOf(nodeRepository.nodes().failOrMarkRecursively(path.get("hostname"), Agent.operator, "Failed through the nodes/v2 API")); + var failedOrMarkedNodes = NodeList.copyOf(nodeRepository.nodes().failOrMarkRecursively(path.get("hostname"), agent(request), "Failed through the nodes/v2 API")); return new MessageResponse("Moved " + hostnamesAsString(failedOrMarkedNodes.state(Node.State.failed).asList()) + " to " + Node.State.failed + " and marked " + hostnamesAsString(failedOrMarkedNodes.failing().asList()) + " as wantToFail"); } else if (path.matches("/nodes/v2/state/parked/{hostname}")) { - List<Node> parkedNodes = nodeRepository.nodes().parkRecursively(path.get("hostname"), Agent.operator, "Parked through the nodes/v2 API"); + List<Node> parkedNodes = nodeRepository.nodes().parkRecursively(path.get("hostname"), agent(request), "Parked through the nodes/v2 API"); return new MessageResponse("Moved " + hostnamesAsString(parkedNodes) + " to " + Node.State.parked); } else if (path.matches("/nodes/v2/state/dirty/{hostname}")) { - List<Node> dirtiedNodes = nodeRepository.nodes().deallocateRecursively(path.get("hostname"), Agent.operator, "Dirtied through the nodes/v2 API"); + List<Node> dirtiedNodes = nodeRepository.nodes().deallocateRecursively(path.get("hostname"), agent(request), "Dirtied through the nodes/v2 API"); return new MessageResponse("Moved " + hostnamesAsString(dirtiedNodes) + " to " + Node.State.dirty); } else if (path.matches("/nodes/v2/state/active/{hostname}")) { - nodeRepository.nodes().reactivate(path.get("hostname"), Agent.operator, "Reactivated through nodes/v2 API"); + nodeRepository.nodes().reactivate(path.get("hostname"), agent(request), "Reactivated through nodes/v2 API"); return new MessageResponse("Moved " + path.get("hostname") + " to " + Node.State.active); } else if (path.matches("/nodes/v2/state/breakfixed/{hostname}")) { - List<Node> breakfixedNodes = nodeRepository.nodes().breakfixRecursively(path.get("hostname"), Agent.operator, "Breakfixed through the nodes/v2 API"); + List<Node> breakfixedNodes = nodeRepository.nodes().breakfixRecursively(path.get("hostname"), agent(request), "Breakfixed through the nodes/v2 API"); return new MessageResponse("Moved " + hostnamesAsString(breakfixedNodes) + " to " + Node.State.breakfixed); } @@ -218,7 +218,7 @@ public class NodesV2ApiHandler extends ThreadedHttpRequestHandler { return new MessageResponse("Scheduled reboot of " + rebootCount + " matching nodes"); } if (path.matches("/nodes/v2/node")) { - int addedNodes = addNodes(toSlime(request)); + int addedNodes = addNodes(request); return new MessageResponse("Added " + addedNodes + " nodes to the provisioned state"); } if (path.matches("/nodes/v2/maintenance/run/{job}")) return runJob(path.get("job")); @@ -261,9 +261,9 @@ public class NodesV2ApiHandler extends ThreadedHttpRequestHandler { } } - public int addNodes(Inspector inspector) { - List<Node> nodes = createNodesFromSlime(inspector); - return nodeRepository.nodes().addNodes(nodes, Agent.operator).size(); + public int addNodes(HttpRequest request) { + List<Node> nodes = createNodesFromSlime(toSlime(request)); + return nodeRepository.nodes().addNodes(nodes, agent(request)).size(); } private Inspector toSlime(HttpRequest request) { @@ -488,6 +488,10 @@ public class NodesV2ApiHandler extends ThreadedHttpRequestHandler { return new SlimeJsonResponse(slime); } + private static Agent agent(HttpRequest request) { + return "node-admin".equalsIgnoreCase(request.getHeader("User-Agent")) ? Agent.nodeAdmin : Agent.operator; + } + private static void toSlime(Load load, Cursor object) { object.setDouble("cpu", load.cpu()); object.setDouble("memory", load.memory()); |