summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <martin.polden@gmail.com>2017-04-24 09:23:49 +0200
committerMartin Polden <martin.polden@gmail.com>2017-04-24 09:23:49 +0200
commit9b3064c298f85e81211f1599f7b1af5f0a7b9248 (patch)
tree93a8800fa30980ba63e0d7190a71fbf066062a60
parentd138de4930b6c10a66263c062babdc1de7512cef (diff)
Allow nodes in state provisioned to be deleted
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java11
3 files changed, 11 insertions, 6 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 3bc9b84003b..51172c7045d 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
@@ -425,12 +425,12 @@ public class NodeRepository extends AbstractComponent {
}
/**
- * Removes a node. A node must be in the failed or parked state before it can be removed.
+ * Removes a node. A node must be in the provisioned, failed or parked state before it can be removed.
*
* @return true if the node was removed, false if it was not found in one of these states
*/
public boolean remove(String hostname) {
- Optional<Node> nodeToRemove = getNode(hostname, Node.State.failed, Node.State.parked);
+ Optional<Node> nodeToRemove = getNode(hostname, Node.State.provisioned, Node.State.failed, Node.State.parked);
if ( ! nodeToRemove.isPresent()) return false;
try (Mutex lock = lock(nodeToRemove.get())) {
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 56184ecc092..c126a1f29ec 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
@@ -154,7 +154,7 @@ public class NodesApiHandler extends LoggingRequestHandler {
if (nodeRepository.remove(hostname))
return new MessageResponse("Removed " + hostname);
else
- throw new NotFoundException("No node in the failed state with hostname " + hostname);
+ throw new NotFoundException("No node in the provisioned, parked or failed state with hostname " + hostname);
}
throw new NotFoundException("Nothing at path '" + request.getUri().getPath() + "'");
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 fbc0ea96fb6..5038a6311c1 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
@@ -82,6 +82,11 @@ public class RestApiTest {
assertFile(new Request("http://localhost:8080/nodes/v2/node/host11.yahoo.com"), "node11.json");
assertFile(new Request("http://localhost:8080/nodes/v2/node/parent2.yahoo.com"), "parent2.json");
+ // DELETE a provisioned node
+ assertResponse(new Request("http://localhost:8080/nodes/v2/node/host11.yahoo.com",
+ new byte[0], Request.Method.DELETE),
+ "{\"message\":\"Removed host11.yahoo.com\"}");
+
// PUT nodes ready
assertResponse(new Request("http://localhost:8080/nodes/v2/state/dirty/host8.yahoo.com",
new byte[0], Request.Method.PUT),
@@ -352,10 +357,10 @@ public class RestApiTest {
new byte[0], Request.Method.PUT),
"{\"message\":\"Moved host2.yahoo.com to ready\"}");
- // Attempt to DELETE a node which is not put in failed first
- assertResponse(new Request("http://localhost:8080/nodes/v2/node/host8.yahoo.com",
+ // Attempt to DELETE a node which is not put in a deletable state first
+ assertResponse(new Request("http://localhost:8080/nodes/v2/node/host2.yahoo.com",
new byte[0], Request.Method.DELETE),
- 404, "{\"error-code\":\"NOT_FOUND\",\"message\":\"No node in the failed state with hostname host8.yahoo.com\"}");
+ 404, "{\"error-code\":\"NOT_FOUND\",\"message\":\"No node in the provisioned, parked or failed state with hostname host2.yahoo.com\"}");
// PUT current restart generation with string instead of long
assertResponse(new Request("http://localhost:8080/nodes/v2/node/host4.yahoo.com",