summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-08-31 16:09:17 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-08-31 16:09:17 +0200
commitd8b7307f8b60792d8f0028551a555764085b867f (patch)
treedda99e1b990a88dd289dd2b58132dd8d1e9a2dcb /node-repository
parent7cdae87d004cb9cc796356ee203cb339556c55d3 (diff)
Allow all application hosts to talk to ZooKeeper
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java24
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java64
2 files changed, 83 insertions, 5 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 0533538b016..287f311163e 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
@@ -14,6 +14,7 @@ import com.yahoo.vespa.hosted.provision.node.filter.NodeFilter;
import com.yahoo.vespa.hosted.provision.node.filter.NodeListFilter;
import com.yahoo.vespa.hosted.provision.node.filter.StateFilter;
import com.yahoo.vespa.hosted.provision.persistence.CuratorDatabaseClient;
+import com.yahoo.vespa.zookeeper.ZooKeeperServer;
import java.time.Clock;
import java.util.ArrayList;
@@ -126,7 +127,9 @@ public class NodeRepository extends AbstractComponent {
throw new IllegalArgumentException("Cannot add " + node.hostname() + ": A node with this name already exists");
}
try (Mutex lock = lockUnallocated()) {
- return zkClient.addNodes(nodes);
+ List<Node> addedNodes = zkClient.addNodes(nodes);
+ updateAllowedHosts();
+ return addedNodes;
}
}
@@ -244,14 +247,16 @@ public class NodeRepository extends AbstractComponent {
/**
* Removes a node. A node must be in the failed or parked state before it can be removed.
*
- * @return true if the node was removed, false if it was not found
+ * @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);
- if ( ! nodeToRemove.isPresent())
- return false;
+ if ( ! nodeToRemove.isPresent()) return false;
+
try (Mutex lock = lock(nodeToRemove.get())) {
- return zkClient.removeNode(nodeToRemove.get().state(), hostname);
+ boolean removed = zkClient.removeNode(nodeToRemove.get().state(), hostname);
+ updateAllowedHosts();
+ return removed;
}
}
@@ -342,5 +347,14 @@ public class NodeRepository extends AbstractComponent {
private Mutex lock(Node node) {
return node.allocation().isPresent() ? lock(node.allocation().get().owner()) : lockUnallocated();
}
+
+ private void updateAllowedHosts() {
+ StringBuilder s = new StringBuilder();
+ for (Node node : getNodes(Node.Type.tenant))
+ s.append(node.hostname()).append(",");
+ if (s.length() > 0)
+ s.setLength(s.length()-1); // remove last comma
+ System.setProperty(ZooKeeperServer.ZOOKEEPER_VESPA_CLIENTS_PROPERTY, s.toString());
+ }
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java
new file mode 100644
index 00000000000..a8c839a6f44
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java
@@ -0,0 +1,64 @@
+package com.yahoo.vespa.hosted.provision;
+
+import com.yahoo.test.ManualClock;
+import com.yahoo.vespa.config.nodes.NodeRepositoryConfig;
+import com.yahoo.vespa.curator.mock.MockCurator;
+import com.yahoo.vespa.hosted.provision.node.Configuration;
+import com.yahoo.vespa.hosted.provision.node.NodeFlavors;
+import com.yahoo.vespa.hosted.provision.testutils.FlavorConfigBuilder;
+import com.yahoo.vespa.zookeeper.ZooKeeperServer;
+import org.junit.Test;
+import java.time.Clock;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * tests basic operation of the node repository
+ *
+ * @author bratseth
+ */
+public class NodeRepositoryTest {
+
+ @Test
+ public void nodeRepositoryTest() {
+ NodeFlavors nodeFlavors = new NodeFlavors(createConfig());
+ Clock clock = new ManualClock();
+ NodeRepository nodeRepository = new NodeRepository(nodeFlavors, new MockCurator(), clock);
+
+ assertEquals(0, nodeRepository.getNodes(Node.Type.tenant).size());
+
+ List<Node> nodes = new ArrayList<>();
+ nodes.add(nodeRepository.createNode("id1", "host1", Optional.empty(), new Configuration(nodeFlavors.getFlavorOrThrow("default")), Node.Type.tenant));
+ nodes.add(nodeRepository.createNode("id2", "host2", Optional.empty(), new Configuration(nodeFlavors.getFlavorOrThrow("default")), Node.Type.tenant));
+ nodes.add(nodeRepository.createNode("id3", "host3", Optional.empty(), new Configuration(nodeFlavors.getFlavorOrThrow("default")), Node.Type.tenant));
+ nodeRepository.addNodes(nodes);
+
+ assertEquals(3, nodeRepository.getNodes(Node.Type.tenant).size());
+ assertEquals(asSet("host1,host2,host3"), asSet(System.getProperty(ZooKeeperServer.ZOOKEEPER_VESPA_CLIENTS_PROPERTY)));
+
+ nodeRepository.move("host2", Node.State.parked);
+ assertTrue(nodeRepository.remove("host2"));
+
+ assertEquals(2, nodeRepository.getNodes(Node.Type.tenant).size());
+ assertEquals(asSet("host1,host3"), asSet(System.getProperty(ZooKeeperServer.ZOOKEEPER_VESPA_CLIENTS_PROPERTY)));
+ }
+
+ private Set<String> asSet(String s) {
+ return new HashSet<>(Arrays.asList(s.split(",")));
+ }
+
+ private NodeRepositoryConfig createConfig() {
+ FlavorConfigBuilder b = new FlavorConfigBuilder();
+ b.addFlavor("default", 2., 4., 100, "BARE_METAL").cost(3);
+ b.addFlavor("small", 1., 2., 50, "BARE_METAL").cost(2);
+ return b.build();
+ }
+
+}