diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-08-31 16:09:17 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-08-31 16:09:17 +0200 |
commit | d8b7307f8b60792d8f0028551a555764085b867f (patch) | |
tree | dda99e1b990a88dd289dd2b58132dd8d1e9a2dcb /node-repository | |
parent | 7cdae87d004cb9cc796356ee203cb339556c55d3 (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.java | 24 | ||||
-rw-r--r-- | node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java | 64 |
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(); + } + +} |