summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-10-06 23:40:08 +0200
committerJon Bratseth <bratseth@gmail.com>2021-10-06 23:40:08 +0200
commit3840e31d1973cdf5d3af17c368154b2bb539d8b4 (patch)
tree750e13f23162e86bc4dbbf00c5075d4b54f719e8 /config-model
parente39ac9a9abddb4706716c04ed009a8f31b3ae75f (diff)
Create config server when not configured explicitly
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerCluster.java9
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java81
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerTest.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java2
6 files changed, 54 insertions, 44 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java b/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java
index decc6e98bc4..b8e1247d2b9 100644
--- a/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java
+++ b/config-model/src/main/java/com/yahoo/config/model/producer/AbstractConfigProducer.java
@@ -385,7 +385,7 @@ public abstract class AbstractConfigProducer<CHILD extends AbstractConfigProduce
public void validate() throws Exception {
assert (childrenBySubId.isFrozen());
- for (AbstractConfigProducer child : childrenBySubId.values()) {
+ for (AbstractConfigProducer<?> child : childrenBySubId.values()) {
child.validate();
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerCluster.java
index e72f74829d3..6e2818673c7 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerCluster.java
@@ -16,6 +16,7 @@ import com.yahoo.vespa.model.container.Container;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@@ -78,17 +79,19 @@ public class ClusterControllerCluster extends AbstractConfigProducer<ClusterCont
@Override
public void validate() {
- assert(containerCluster != null);
+ Objects.requireNonNull(containerCluster);
for (Container c1 : containerCluster.getContainers()) {
assert(c1 instanceof ClusterControllerContainer);
for (Service service : c1.getHostResource().getServices()) {
if (service instanceof Configserver) {
- throw new IllegalArgumentException("Error validating cluster controller cluster: cluster controller '" + c1.getConfigId() + "' is set to run on the same host as a configserver");
+ throw new IllegalArgumentException("Error validating cluster controller cluster: cluster controller '" +
+ c1.getConfigId() + "' is set to run on the same host as a configserver");
}
}
for (Container c2 : containerCluster.getContainers()) {
if (c1 != c2 && c1.getHostName().equals(c2.getHostName())) {
- throw new IllegalArgumentException("Error validating cluster controller cluster: cluster controllers '" + c1.getConfigId() + "' and '" + c2.getConfigId() + "' share the same host");
+ throw new IllegalArgumentException("Error validating cluster controller cluster: cluster controllers '" +
+ c1.getConfigId() + "' and '" + c2.getConfigId() + "' share the same host");
}
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java
index 8e3451540f9..c3cffa018fa 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java
@@ -15,6 +15,7 @@ import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerCluster;
import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainer;
import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainerCluster;
import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder.DomConfigProducerBuilder;
+import com.yahoo.vespa.model.container.Container;
import org.w3c.dom.Element;
import java.util.ArrayList;
@@ -44,8 +45,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
admin.addConfigservers(configservers);
admin.addSlobroks(getSlobroks(deployState, admin, XML.getChild(adminE, "slobroks")));
if ( ! admin.multitenant())
- admin.setClusterControllers(addConfiguredClusterControllers(deployState, admin, adminE),
- deployState);
+ admin.setClusterControllers(addConfiguredClusterControllers(deployState, admin, adminE), deployState);
ModelElement adminElement = new ModelElement(adminE);
addLogForwarders(adminElement.child("logforwarding"), admin);
@@ -57,16 +57,17 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
private List<Configserver> parseConfigservers(DeployState deployState, Admin admin, Element adminE) {
List<Configserver> configservers;
- if (multitenant) {
+ if (multitenant)
configservers = getConfigServersFromSpec(deployState.getDeployLogger(), admin);
- } else {
+ else
configservers = getConfigServers(deployState, admin, adminE);
- }
- int count = configservers.size();
- if (count % 2 == 0) {
- deployState.getDeployLogger().logApplicationPackage(Level.WARNING, "An even number (" + count + ") of config servers have been configured. " +
- "This is discouraged, see doc for configuration server ");
- }
+ if (configservers.isEmpty() && ! multitenant)
+ configservers = createSingleConfigServer(deployState, admin);
+ if (configservers.size() % 2 == 0)
+ deployState.getDeployLogger().logApplicationPackage(Level.WARNING,
+ "An even number (" + configservers.size() +
+ ") of config servers have been configured. " +
+ "This is discouraged, see doc for configuration server ");
return configservers;
}
@@ -78,7 +79,9 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
return new LogserverBuilder().build(deployState, admin, logserverE);
}
- private ClusterControllerContainerCluster addConfiguredClusterControllers(DeployState deployState, AbstractConfigProducer parent, Element admin) {
+ private ClusterControllerContainerCluster addConfiguredClusterControllers(DeployState deployState,
+ AbstractConfigProducer<?> parent,
+ Element admin) {
Element controllersElements = XML.getChild(admin, "cluster-controllers");
if (controllersElements == null) return null;
@@ -105,40 +108,41 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
return cluster;
}
- // Extra stupid because configservers tag is optional
- private List<Configserver> getConfigServers(DeployState deployState, AbstractConfigProducer parent, Element adminE) {
- SimpleConfigProducer configServers = new SimpleConfigProducer(parent, "configservers");
- List<Configserver> cfgs = new ArrayList<>();
+ private List<Configserver> getConfigServers(DeployState deployState, AbstractConfigProducer<?> parent, Element adminE) {
+ SimpleConfigProducer<?> configServers = new SimpleConfigProducer<>(parent, "configservers");
Element configserversE = XML.getChild(adminE, "configservers");
if (configserversE == null) {
Element configserverE = XML.getChild(adminE, "configserver");
- if (configserverE == null) {
+ if (configserverE == null)
configserverE = XML.getChild(adminE, "adminserver");
- } else {
- deployState.getDeployLogger().logApplicationPackage(Level.INFO, "Specifying configserver without parent element configservers in services.xml is deprecated");
- }
- Configserver cfgs0 = new ConfigserverBuilder(0, configServerSpecs).build(deployState, configServers, configserverE);
- cfgs0.setProp("index", 0);
- cfgs.add(cfgs0);
- return cfgs;
+ else
+ deployState.getDeployLogger().logApplicationPackage(Level.INFO,
+ "Specifying configserver without parent element configservers in services.xml is deprecated");
+ return List.of(new ConfigserverBuilder(0, configServerSpecs).build(deployState, configServers, configserverE));
}
- // configservers tag in use
- int i = 0;
- for (Element configserverE : XML.getChildren(configserversE, "configserver")) {
- Configserver cfgsrv = new ConfigserverBuilder(i, configServerSpecs).build(deployState, configServers, configserverE);
- cfgsrv.setProp("index", i);
- cfgs.add(cfgsrv);
- i++;
+ else {
+ List<Configserver> configservers = new ArrayList<>();
+ int i = 0;
+ for (Element configserverE : XML.getChildren(configserversE, "configserver"))
+ configservers.add(new ConfigserverBuilder(i++, configServerSpecs).build(deployState, configServers, configserverE));
+ return configservers;
}
- return cfgs;
+ }
+
+ /** Fallback when no config server is specified */
+ private List<Configserver> createSingleConfigServer(DeployState deployState, AbstractConfigProducer<?> parent) {
+ SimpleConfigProducer<?> configServers = new SimpleConfigProducer<>(parent, "configservers");
+ Configserver configServer = new Configserver(configServers, "configserver", Configserver.defaultRpcPort);
+ configServer.setHostResource(parent.hostSystem().getHost(Container.SINGLENODE_CONTAINER_SERVICESPEC));
+ configServer.initService(deployState.getDeployLogger());
+ return List.of(configServer);
}
private List<Slobrok> getSlobroks(DeployState deployState, AbstractConfigProducer<?> parent, Element slobroksE) {
- List<Slobrok> slobs = new ArrayList<>();
- if (slobroksE != null) {
- slobs = getExplicitSlobrokSetup(deployState, parent, slobroksE);
- }
- return slobs;
+ List<Slobrok> slobroks = new ArrayList<>();
+ if (slobroksE != null)
+ slobroks = getExplicitSlobrokSetup(deployState, parent, slobroksE);
+ return slobroks;
}
private List<Slobrok> getExplicitSlobrokSetup(DeployState deployState, AbstractConfigProducer<?> parent, Element slobroksE) {
@@ -174,7 +178,9 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
@Override
protected Configserver doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) {
- return new Configserver(parent, "configserver." + i, rpcPort);
+ var configServer = new Configserver(parent, "configserver." + i, rpcPort);
+ configServer.setProp("index", i);
+ return configServer;
}
}
@@ -207,4 +213,5 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
return new ClusterControllerContainer(parent, i, runStandaloneZooKeeper, deployState, false);
}
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java
index f70ab5a711d..12a7b72f5fd 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java
@@ -287,7 +287,7 @@ public class ContentCluster extends AbstractConfigProducer<AbstractConfigProduce
}
else if (admin.multitenant()) { // system tests: Put on logserver
if (admin.getClusterControllers() == null) {
- // TODO: logserver== null only obtains in unit tests, disallow it
+ // TODO: logserver == null only obtains in unit tests, disallow it
List<HostResource> host = admin.getLogserver() == null ? List.of() : List.of(admin.getLogserver().getHostResource());
admin.setClusterControllers(createClusterControllers(new ClusterControllerCluster(admin, "standalone", deployState),
host,
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerTest.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerTest.java
index a84f73dfd5a..1cf79fc5977 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerTest.java
@@ -144,7 +144,7 @@ public class MetricsProxyContainerTest {
@Test
public void vespa_services_config_has_all_services() {
VespaServicesConfig vespaServicesConfig = getVespaServicesConfig(hostedServicesWithContent());
- assertEquals(8, vespaServicesConfig.service().size());
+ assertEquals(9, vespaServicesConfig.service().size());
for (var service : vespaServicesConfig.service()) {
if (service.configId().equals("admin/cluster-controllers/0")) {
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java
index 7e34e9efbbf..4645decea50 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java
@@ -182,7 +182,7 @@ public class VespaModelTester {
new SingleNodeProvisioner();
TestProperties properties = new TestProperties()
- .setMultitenant(true)
+ .setMultitenant(hosted) // Note: system tests are multitenant but not hosted
.setHostedVespa(hosted)
.setApplicationId(applicationId)
.setUseDedicatedNodeForLogserver(useDedicatedNodeForLogserver);