From 3c20a4031452f23293aa26e1f1b4f22652379db1 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Wed, 25 Nov 2020 11:18:56 +0100 Subject: Support configuring ZooKeeper service in container --- .../model/container/xml/ContainerModelBuilder.java | 25 +++++++++++++++++++++- .../src/main/resources/schema/containercluster.rnc | 5 +++++ 2 files changed, 29 insertions(+), 1 deletion(-) (limited to 'config-model/src/main') diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index b95571de936..b7d64483e57 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -112,6 +112,10 @@ public class ContainerModelBuilder extends ConfigModelBuilder { private static final String DEPRECATED_CONTAINER_TAG = "jdisc"; private static final String ENVIRONMENT_VARIABLES_ELEMENT = "environment-variables"; + // The node count to enforce in a cluster running ZooKeeper + private static final int MIN_ZOOKEEPER_NODE_COUNT = 3; + private static final int MAX_ZOOKEEPER_NODE_COUNT = 7; + public enum Networking { disable, enable } private ApplicationPackage app; @@ -195,7 +199,26 @@ public class ContainerModelBuilder extends ConfigModelBuilder { addClientProviders(deployState, spec, cluster); addServerProviders(deployState, spec, cluster); - addAthensCopperArgos(cluster, context); // Must be added after nodes. + // Must be added after nodes: + addAthensCopperArgos(cluster, context); + addZooKeeper(cluster, spec); + } + + private void addZooKeeper(ApplicationContainerCluster cluster, Element spec) { + Element zkElement = XML.getChild(spec, "zookeeper"); + if (zkElement == null) return; + Element nodesElement = XML.getChild(spec, "nodes"); + boolean isCombined = nodesElement != null && nodesElement.hasAttribute("of"); + if (isCombined) { + throw new IllegalArgumentException("A combined cluster cannot run ZooKeeper"); + } + int nodeCount = cluster.getContainers().size(); + if (nodeCount < MIN_ZOOKEEPER_NODE_COUNT || nodeCount > MAX_ZOOKEEPER_NODE_COUNT || nodeCount % 2 == 0) { + throw new IllegalArgumentException("Clusters running ZooKeeper must have an odd number of nodes, between " + + MIN_ZOOKEEPER_NODE_COUNT + " and " + MAX_ZOOKEEPER_NODE_COUNT); + } + cluster.addSimpleComponent("com.yahoo.vespa.curator.Curator", null, "zkfacade"); + // TODO: Add server component } private void addSecretStore(ApplicationContainerCluster cluster, Element spec) { diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc index 25d10e0d9b3..ca7efd5a938 100644 --- a/config-model/src/main/resources/schema/containercluster.rnc +++ b/config-model/src/main/resources/schema/containercluster.rnc @@ -27,6 +27,7 @@ ContainerServices = Http? & AccessLog* & SecretStore? & + ZooKeeper? & GenericConfig* # TODO(ogronnesby): Change this configuration syntax @@ -91,6 +92,10 @@ SecretStore = element secret-store { } + } +ZooKeeper = element zookeeper { + empty +} + ModelEvaluation = element model-evaluation { empty } -- cgit v1.2.3