summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorfreva <valerijf@yahoo-inc.com>2017-02-28 13:55:54 +0100
committerfreva <valerijf@yahoo-inc.com>2017-02-28 14:49:12 +0100
commit9a9be0f7c96ca91dcc34c00982095c6a40cc47f1 (patch)
tree72926f09075b582bca4ed336b65250ef96d9cd8b /node-repository
parent7a83dce42f6dd192944a8600941ae2ed22a06bdd (diff)
Add failRecursive and parkRecursive and use it in NodesApiHandler.
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java26
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java11
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java12
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5-after-changes.json2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent-nodes.json3
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