diff options
author | freva <valerijf@yahoo-inc.com> | 2017-02-28 13:55:54 +0100 |
---|---|---|
committer | freva <valerijf@yahoo-inc.com> | 2017-02-28 14:49:12 +0100 |
commit | 9a9be0f7c96ca91dcc34c00982095c6a40cc47f1 (patch) | |
tree | 72926f09075b582bca4ed336b65250ef96d9cd8b /node-repository | |
parent | 7a83dce42f6dd192944a8600941ae2ed22a06bdd (diff) |
Add failRecursive and parkRecursive and use it in NodesApiHandler.
Diffstat (limited to 'node-repository')
8 files changed, 51 insertions, 11 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index 778c14229a6..a163cf6db7f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -342,6 +342,15 @@ public class NodeRepository extends AbstractComponent { } /** + * Fails all the nodes that are children of hostname before finally failing the hostname itself. + * + * @return List of all the failed nodes in their new state + */ + public List<Node> failRecursively(String hostname) { + return moveRecursively(hostname, Node.State.failed); + } + + /** * Parks this node and returns it in its new state. * * @return the node in its new state @@ -352,6 +361,15 @@ public class NodeRepository extends AbstractComponent { } /** + * Parks all the nodes that are children of hostname before finally parking the hostname itself. + * + * @return List of all the parked nodes in their new state + */ + public List<Node> parkRecursively(String hostname) { + return moveRecursively(hostname, Node.State.parked); + } + + /** * Moves a previously failed or parked node back to the active state. * * @return the node in its new state @@ -361,6 +379,14 @@ public class NodeRepository extends AbstractComponent { return move(hostname, Node.State.active); } + private List<Node> moveRecursively(String hostname, Node.State toState) { + List<Node> moved = getChildNodes(hostname).stream() + .map(child -> move(child, toState)) + .collect(Collectors.toList()); + + moved.add(move(hostname, toState)); + return moved; + } private Node move(String hostname, Node.State toState) { Node node = getNode(hostname).orElseThrow(() -> diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java index 301189ced4d..707db02e6e5 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java @@ -33,6 +33,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.Executor; import java.util.logging.Level; +import java.util.stream.Collectors; import static com.yahoo.vespa.config.SlimeUtils.optionalString; @@ -99,12 +100,14 @@ public class NodesApiHandler extends LoggingRequestHandler { return new MessageResponse("Moved " + lastElement(path) + " to ready"); } else if (path.startsWith("/nodes/v2/state/failed/")) { - nodeRepository.fail(lastElement(path)); - return new MessageResponse("Moved " + lastElement(path) + " to failed"); + List<Node> failedNodes = nodeRepository.failRecursively(lastElement(path)); + String failedHostnames = failedNodes.stream().map(Node::hostname).sorted().collect(Collectors.joining(", ")); + return new MessageResponse("Moved " + failedHostnames + " to failed"); } else if (path.startsWith("/nodes/v2/state/parked/")) { - nodeRepository.park(lastElement(path)); - return new MessageResponse("Moved " + lastElement(path) + " to parked"); + List<Node> parkedNodes = nodeRepository.parkRecursively(lastElement(path)); + String parkedHostnames = parkedNodes.stream().map(Node::hostname).sorted().collect(Collectors.joining(", ")); + return new MessageResponse("Moved " + parkedHostnames + " to parked"); } else if (path.startsWith("/nodes/v2/state/dirty/")) { nodeRepository.setDirty(lastElement(path)); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 6a9fc668452..1d3eeca32f8 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -65,13 +65,13 @@ public class MockNodeRepository extends NodeRepository { node4 = node4.with(node4.status().withDockerImage("image-12")); nodes.add(node4); - Node node5 = createNode("node5", "host5.yahoo.com", Optional.of("dockerhost"), flavors.getFlavorOrThrow("default"), NodeType.tenant); + Node node5 = createNode("node5", "host5.yahoo.com", Optional.of("parent1.yahoo.com"), flavors.getFlavorOrThrow("default"), NodeType.tenant); nodes.add(node5.with(node5.status().withDockerImage("image-123").withVespaVersion(new Version("1.2.3")))); nodes.add(createNode("node6", "host6.yahoo.com", Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant)); nodes.add(createNode("node7", "host7.yahoo.com", Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant)); // 8 and 9 are added by web service calls - Node node10 = createNode("node10", "host10.yahoo.com", Optional.of("parent.yahoo.com"), flavors.getFlavorOrThrow("default"), NodeType.tenant); + Node node10 = createNode("node10", "host10.yahoo.com", Optional.of("parent1.yahoo.com"), flavors.getFlavorOrThrow("default"), NodeType.tenant); Status node10newStatus = node10.status(); node10newStatus = node10newStatus .withVespaVersion(Version.fromString("5.104.142")) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index cde77c68433..58a1f7ee21c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -46,7 +46,7 @@ public class RestApiTest { assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&clusterType=content"), "active-nodes.json"); assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&clusterId=id2"), "application2-nodes.json"); assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&application=tenant2.application2.instance2"), "application2-nodes.json"); - assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&parentHost=parent.yahoo.com,parent.host.yahoo.com"), "parent-nodes.json"); + assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&parentHost=parent1.yahoo.com,parent.host.yahoo.com"), "parent-nodes.json"); // POST restart command assertRestart(1, new Request("http://localhost:8080/nodes/v2/command/restart?hostname=host2.yahoo.com", @@ -129,6 +129,16 @@ public class RestApiTest { new byte[0], Request.Method.PUT), "{\"message\":\"Moved host6.yahoo.com to dirty\"}"); + // Put a host in failed and make sure it's children are also failed + assertResponse(new Request("http://localhost:8080/nodes/v2/state/failed/parent1.yahoo.com", new byte[0], Request.Method.PUT), + "{\"message\":\"Moved host10.yahoo.com, host5.yahoo.com, parent1.yahoo.com to failed\"}"); + + assertResponse(new Request("http://localhost:8080/nodes/v2/state/failed"), "{\"nodes\":[" + + "{\"url\":\"http://localhost:8080/nodes/v2/node/parent1.yahoo.com\"}," + + "{\"url\":\"http://localhost:8080/nodes/v2/node/host5.yahoo.com\"}," + + "{\"url\":\"http://localhost:8080/nodes/v2/node/host10.yahoo.com\"}]}"); + + // Update (PATCH) a node (multiple fields can also be sent in one request body) assertResponse(new Request("http://localhost:8080/nodes/v2/node/host4.yahoo.com", Utf8.toBytes("{\"currentRestartGeneration\": 1}"), Request.Method.PATCH), diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json index 2702263b35c..9ff5d52b9fe 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json @@ -4,7 +4,7 @@ "state": "reserved", "type": "tenant", "hostname": "host10.yahoo.com", - "parentHostname": "parent.yahoo.com", + "parentHostname": "parent1.yahoo.com", "openStackId": "node10", "flavor": "default", "canonicalFlavor": "default", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json index 27246d9cb86..488bdd10c46 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json @@ -4,7 +4,7 @@ "state": "failed", "type": "tenant", "hostname": "host5.yahoo.com", - "parentHostname":"dockerhost", + "parentHostname":"parent1.yahoo.com", "openStackId": "node5", "flavor": "default", "canonicalFlavor": "default", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json index b8e9696242c..c103a52360c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json @@ -4,7 +4,7 @@ "state": "failed", "type": "tenant", "hostname": "host5.yahoo.com", - "parentHostname":"dockerhost", + "parentHostname":"parent1.yahoo.com", "openStackId": "node5", "flavor": "default", "canonicalFlavor": "default", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent-nodes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent-nodes.json index 7352c4f4455..81ca0465c4b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent-nodes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent-nodes.json @@ -1,5 +1,6 @@ { "nodes": [ - @include(node10.json) + @include(node10.json), + @include(node5.json) ] }
\ No newline at end of file |