From 15c1d7d9af882a799b5e453ca669b9a3a22ca7e6 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 4 Oct 2018 13:34:41 +0200 Subject: Wire in DeployState as param --- .../com/yahoo/config/model/ConfigModelContext.java | 12 -- .../com/yahoo/config/model/admin/AdminModel.java | 4 +- .../model/producer/AbstractConfigProducer.java | 6 - .../java/com/yahoo/config/model/test/MockRoot.java | 3 +- .../com/yahoo/vespa/model/ConfigProducerRoot.java | 5 - .../java/com/yahoo/vespa/model/HostResource.java | 3 +- .../java/com/yahoo/vespa/model/VespaModel.java | 9 +- .../java/com/yahoo/vespa/model/admin/Admin.java | 11 +- .../ClusterControllerContainer.java | 7 +- .../vespa/model/builder/VespaModelBuilder.java | 3 +- .../model/builder/xml/dom/DomAdminBuilderBase.java | 20 +++- .../model/builder/xml/dom/DomAdminV2Builder.java | 46 +++---- .../model/builder/xml/dom/DomAdminV4Builder.java | 14 +-- .../builder/xml/dom/DomClientProviderBuilder.java | 5 +- .../model/builder/xml/dom/DomClientsBuilder.java | 4 +- .../model/builder/xml/dom/DomComponentBuilder.java | 14 ++- .../model/builder/xml/dom/DomHandlerBuilder.java | 8 +- .../builder/xml/dom/DomV20ClientsBuilder.java | 19 +-- .../builder/xml/dom/LegacyConfigModelBuilder.java | 2 +- .../model/builder/xml/dom/VespaDomBuilder.java | 32 +++-- .../builder/xml/dom/chains/ChainsBuilder.java | 19 +-- .../builder/xml/dom/chains/ComponentsBuilder.java | 32 +++-- .../xml/dom/chains/DomChainBuilderBase.java | 9 +- .../builder/xml/dom/chains/DomChainsBuilder.java | 20 ++-- .../dom/chains/docproc/DocprocChainsBuilder.java | 10 +- .../dom/chains/docproc/DomDocprocChainBuilder.java | 4 +- .../chains/docproc/DomDocprocChainsBuilder.java | 5 +- .../chains/processing/DomProcessingBuilder.java | 7 +- .../processing/DomProcessingChainBuilder.java | 5 +- .../chains/processing/ProcessingChainsBuilder.java | 11 +- .../search/DomFederationSearcherBuilder.java | 10 +- .../xml/dom/chains/search/DomProviderBuilder.java | 11 +- .../dom/chains/search/DomSearchChainBuilder.java | 3 +- .../dom/chains/search/DomSearchChainsBuilder.java | 5 +- .../xml/dom/chains/search/DomSourceBuilder.java | 3 +- .../xml/dom/chains/search/SearchChainsBuilder.java | 10 +- .../com/yahoo/vespa/model/container/Container.java | 16 +-- .../vespa/model/container/ContainerCluster.java | 9 -- .../model/container/http/xml/FilterBuilder.java | 6 +- .../container/http/xml/FilterChainBuilder.java | 3 +- .../container/http/xml/FilterChainsBuilder.java | 9 +- .../model/container/http/xml/HttpBuilder.java | 27 +++-- .../container/http/xml/JettyConnectorBuilder.java | 5 +- .../container/http/xml/JettyHttpServerBuilder.java | 5 +- .../model/container/xml/AccessLogBuilder.java | 5 +- .../model/container/xml/ContainerModelBuilder.java | 132 ++++++++++----------- .../container/xml/ContainerServiceBuilder.java | 5 +- .../com/yahoo/vespa/model/content/Content.java | 5 +- .../vespa/model/content/ContentSearchCluster.java | 43 ++++--- .../yahoo/vespa/model/content/StorageGroup.java | 41 +++---- .../model/content/cluster/ContentCluster.java | 69 ++++++----- .../model/content/engines/DummyPersistence.java | 3 +- .../model/content/engines/PersistenceEngine.java | 3 +- .../vespa/model/content/engines/ProtonEngine.java | 6 +- .../model/generic/GenericServicesBuilder.java | 4 +- .../model/generic/builder/DomModuleBuilder.java | 9 +- .../model/generic/builder/DomServiceBuilder.java | 7 +- .../generic/builder/DomServiceClusterBuilder.java | 7 +- .../com/yahoo/vespa/model/search/SearchNode.java | 21 ++-- .../yahoo/config/model/ConfigModelContextTest.java | 4 +- .../yahoo/config/model/graph/ModelGraphTest.java | 20 ++-- .../builder/xml/dom/DomAdminV2BuilderTest.java | 8 +- .../builder/xml/dom/DomComponentBuilderTest.java | 4 +- .../xml/dom/DomSearchTuningBuilderTest.java | 2 +- .../search/DomFederationSearcherBuilderTest.java | 4 +- .../dom/chains/search/DomProviderBuilderTest.java | 8 +- .../chains/search/DomSearchChainsBuilderTest.java | 5 +- .../model/container/ContainerClusterTest.java | 17 ++- .../model/container/http/FilterBindingsTest.java | 2 +- .../model/container/http/FilterChainsTest.java | 2 +- .../model/container/http/FilterConfigTest.java | 2 +- .../processing/test/ProcessingChainsTest.java | 2 +- .../search/searchchain/SearchChainsTest2.java | 3 +- .../search/searchchain/SearchChainsTestBase.java | 2 +- .../model/container/xml/AccessControlTest.java | 9 +- .../model/content/FleetControllerClusterTest.java | 3 +- .../model/content/utils/ContentClusterUtils.java | 9 +- .../model/generic/GenericServicesModelTest.java | 3 +- .../vespa/model/search/MultilevelDispatchTest.java | 2 +- .../vespa/model/search/test/SearchNodeTest.java | 11 +- .../com/yahoo/vespa/model/test/ApiConfigModel.java | 5 +- .../yahoo/vespa/model/test/SimpleConfigModel.java | 6 +- 82 files changed, 515 insertions(+), 449 deletions(-) (limited to 'config-model/src') diff --git a/config-model/src/main/java/com/yahoo/config/model/ConfigModelContext.java b/config-model/src/main/java/com/yahoo/config/model/ConfigModelContext.java index eea0b16b8e1..c39eb15b027 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ConfigModelContext.java +++ b/config-model/src/main/java/com/yahoo/config/model/ConfigModelContext.java @@ -62,18 +62,6 @@ public final class ConfigModelContext { return ConfigModelContext.create(deployState, vespaModel, configModelRepoAdder, parent, producerId); } - /** - * Create an application context from a parent producer and an id. - * - * @param parent the parent to be used for the config model. - * @param producerId the id to be used for the config model. - * @return a model context that can be passed to a model. - */ - public static ConfigModelContext create(VespaModel vespaModel, ConfigModelRepoAdder configModelRepoAdder, - AbstractConfigProducer parent, String producerId) { - return create(parent.getRoot().getDeployState(), vespaModel, configModelRepoAdder, parent, producerId); - } - /** * Create an application context from a parent producer and an id. * diff --git a/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java b/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java index 113262d0734..ff89cd8e41a 100644 --- a/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java +++ b/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java @@ -82,7 +82,7 @@ public class AdminModel extends ConfigModel { modelContext.getDeployState().getFileRegistry(), properties.multitenant(), properties.configServerSpecs()); - model.admin = domBuilder.build(parent, adminElement); + model.admin = domBuilder.build(modelContext.getDeployState(), parent, adminElement); // TODO: Is required since other models depend on admin. if (parent instanceof ApplicationConfigProducerRoot) { ((ApplicationConfigProducerRoot)parent).setupAdmin(model.admin); @@ -111,7 +111,7 @@ public class AdminModel extends ConfigModel { properties.multitenant(), properties.configServerSpecs(), model.getContainerModels()); - model.admin = domBuilder.build(parent, adminElement); + model.admin = domBuilder.build(modelContext.getDeployState(), parent, adminElement); // TODO: Is required since other models depend on admin. if (parent instanceof ApplicationConfigProducerRoot) { ((ApplicationConfigProducerRoot)parent).setupAdmin(model.admin); 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 8836e081267..71ee5d148a8 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 @@ -63,12 +63,6 @@ public abstract class AbstractConfigProducer()). - build(this, XML.getChildren(doc.getDocumentElement(), "admin").get(0))); + build(deployState, this, XML.getChildren(doc.getDocumentElement(), "admin").get(0))); } catch (SAXException | IOException e) { throw new RuntimeException(e); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProducerRoot.java b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProducerRoot.java index c686f22392a..2d4b8e9201f 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProducerRoot.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProducerRoot.java @@ -39,11 +39,6 @@ public interface ConfigProducerRoot extends ConfigProducer { * @return A config instance of the given type */ public CONFIGTYPE getConfig(Class clazz, String configId); - - /** - * Get the global deploy state of this model. - */ - DeployState getDeployState(); FileDistributor getFileDistributor(); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java index 5c5bbba301f..16335a435b9 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java @@ -10,7 +10,6 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -142,7 +141,7 @@ public class HostResource implements Comparable { int port = wantedPort + i; if (portDB.containsKey(port)) { AbstractService s = (AbstractService)portDB.get(port); - s.getRoot().getDeployState().getDeployLogger().log(Level.WARNING, service.getServiceName() +" cannot reserve port " + port + " on " + + s.getRoot().deployLogger().log(Level.WARNING, service.getServiceName() +" cannot reserve port " + port + " on " + this + ": Already reserved for " + s.getServiceName() + ". Using default port range from " + serviceBasePort); return false; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java index dc7efefe24b..0ae2fb32284 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java @@ -181,16 +181,16 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri this.deployState = deployState; configModelRepo.readConfigModels(deployState, this, builder, root, configModelRegistry); this.deployState = null; - addServiceClusters(deployState.getApplicationPackage(), builder); + addServiceClusters(deployState, builder); this.allocatedHosts = AllocatedHosts.withHosts(hostSystem.getHostSpecs()); // must happen after the two lines above setupRouting(deployState); this.fileDistributor = root.getFileDistributionConfigProducer().getFileDistributor(); getAdmin().addPerHostServices(hostSystem.getHosts(), deployState); - this.deployLogger = null; freezeModelTopology(); root.prepare(configModelRepo); configModelRepo.prepareConfigModels(deployState); validateWrapExceptions(); + this.deployLogger = null; } else { // create a model with no services instantiated and the given file distributor this.allocatedHosts = AllocatedHosts.withHosts(hostSystem.getHostSpecs()); @@ -222,8 +222,8 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri } /** Adds generic application specific clusters of services */ - private void addServiceClusters(ApplicationPackage app, VespaModelBuilder builder) { - serviceClusters.addAll(builder.getClusters(app, this)); + private void addServiceClusters(DeployState deployState, VespaModelBuilder builder) { + serviceClusters.addAll(builder.getClusters(deployState, this)); } /** @@ -502,7 +502,6 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri return ret; } - @Override public DeployState getDeployState() { if (deployState == null) throw new IllegalStateException("Cannot call getDeployState() once model has been built"); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index 1ac682558d5..863ddef8187 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -72,14 +72,11 @@ public class Admin extends AbstractConfigProducer implements Serializable { private FileDistributionConfigProducer fileDistribution; private final boolean multitenant; - public Admin(AbstractConfigProducer parent, - Monitoring monitoring, - Metrics metrics, - Map legacyMetricsConsumers, - boolean multitenant, - FileDistributionConfigProducer fileDistributionConfigProducer) { + public Admin(AbstractConfigProducer parent, Monitoring monitoring, Metrics metrics, + Map legacyMetricsConsumers, boolean multitenant, + FileDistributionConfigProducer fileDistributionConfigProducer,boolean isHostedVespa) { super(parent, "admin"); - this.isHostedVespa = stateIsHosted(deployStateFrom(parent)); + this.isHostedVespa = isHostedVespa; this.monitoring = monitoring; this.metrics = metrics; this.legacyMetricsConsumers = legacyMetricsConsumers; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java index 31e2c2e7a3b..ef180119ac0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java @@ -6,7 +6,6 @@ import com.yahoo.component.ComponentSpecification; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.container.BundlesConfig; import com.yahoo.container.bundle.BundleInstantiationSpecification; -import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.log.LogLevel; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.search.config.QrStartConfig; @@ -36,8 +35,8 @@ public class ClusterControllerContainer extends Container implements private final Set bundles = new TreeSet<>(); - public ClusterControllerContainer(AbstractConfigProducer parent, int index, boolean runStandaloneZooKeeper) { - super(parent, "" + index, index); + public ClusterControllerContainer(AbstractConfigProducer parent, int index, boolean runStandaloneZooKeeper, boolean isHosted) { + super(parent, "" + index, index, isHosted); this.index = index; addHandler( new Handler(new ComponentModel(new BundleInstantiationSpecification( @@ -70,7 +69,7 @@ public class ClusterControllerContainer extends Container implements addBundle("file:" + getDefaults().underVespaHome("lib/jars/zkfacade-jar-with-dependencies.jar")); log.log(LogLevel.DEBUG, "Adding access log for cluster controller ..."); - addComponent(new AccessLogComponent(AccessLogComponent.AccessLogType.queryAccessLog, "controller", stateIsHosted(deployStateFrom(parent)))); + addComponent(new AccessLogComponent(AccessLogComponent.AccessLogType.queryAccessLog, "controller", isHosted)); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/VespaModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/VespaModelBuilder.java index b7e45cc252a..4f175b2ec42 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/VespaModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/VespaModelBuilder.java @@ -5,7 +5,6 @@ import com.yahoo.config.model.ConfigModelRepo; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.model.ApplicationConfigProducerRoot; -import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.vespa.model.generic.service.ServiceCluster; import java.util.List; @@ -19,7 +18,7 @@ public abstract class VespaModelBuilder { public abstract ApplicationConfigProducerRoot getRoot(String name, DeployState deployState, AbstractConfigProducer parent); - public abstract List getClusters(ApplicationPackage pkg, AbstractConfigProducer parent); + public abstract List getClusters(DeployState pkg, AbstractConfigProducer parent); /** * Processing that requires access across plugins diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java index 35b69ab655f..fd5516ba77a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java @@ -3,12 +3,16 @@ package com.yahoo.vespa.model.builder.xml.dom; import com.yahoo.config.model.ConfigModelContext.ApplicationType; import com.yahoo.config.model.api.ConfigServerSpec; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; import com.yahoo.vespa.model.Host; import com.yahoo.vespa.model.HostResource; import com.yahoo.vespa.model.HostSystem; -import com.yahoo.vespa.model.admin.*; +import com.yahoo.vespa.model.admin.Admin; +import com.yahoo.vespa.model.admin.Configserver; +import com.yahoo.vespa.model.admin.LogForwarder; +import com.yahoo.vespa.model.admin.ModelConfigProvider; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.DefaultMonitoring; import com.yahoo.vespa.model.admin.monitoring.Monitoring; @@ -18,7 +22,10 @@ import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.config.application.api.FileRegistry; import org.w3c.dom.Element; -import java.util.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import static com.yahoo.vespa.model.admin.monitoring.builder.PredefinedMetricSets.predefinedMetricSets; import static java.util.logging.Level.WARNING; @@ -63,7 +70,7 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu } @Override - protected Admin doBuild(AbstractConfigProducer parent, Element adminElement) { + protected Admin doBuild(DeployState deployState, AbstractConfigProducer parent, Element adminElement) { Monitoring monitoring = getMonitoring(getChildWithFallback(adminElement, "monitoring", "yamas")); Metrics metrics = new MetricsBuilder(applicationType, predefinedMetricSets) .buildMetrics(XML.getChild(adminElement, "metrics")); @@ -74,9 +81,10 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu } FileDistributionConfigProducer fileDistributionConfigProducer = getFileDistributionConfigProducer(parent); - Admin admin = new Admin(parent, monitoring, metrics, legacyMetricsConsumers, multitenant, fileDistributionConfigProducer); + Admin admin = new Admin(parent, monitoring, metrics, legacyMetricsConsumers, multitenant, + fileDistributionConfigProducer, deployState.isHosted()); admin.setApplicationType(applicationType); - doBuildAdmin(admin, adminElement); + doBuildAdmin(deployState, admin, adminElement); new ModelConfigProvider(admin); return admin; @@ -92,7 +100,7 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu return XML.getChild(parent, alternativeChildName); } - protected abstract void doBuildAdmin(Admin admin, Element adminE); + protected abstract void doBuildAdmin(DeployState deployState, Admin admin, Element adminE); private Monitoring getMonitoring(Element monitoringElement) { if (monitoringElement == null) return new DefaultMonitoring(DEFAULT_CLUSTER_NAME, DEFAULT_INTERVAL); 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 9deb03495f2..6cd4bd19bd6 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 @@ -4,8 +4,8 @@ package com.yahoo.vespa.model.builder.xml.dom; import com.yahoo.config.application.api.FileRegistry; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.api.ConfigServerSpec; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.text.XML; import com.yahoo.log.LogLevel; import com.yahoo.vespa.model.SimpleConfigProducer; @@ -44,24 +44,24 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } @Override - protected void doBuildAdmin(Admin admin, Element adminE) { - List configservers = parseConfigservers(admin, adminE); - admin.setLogserver(parseLogserver(admin, adminE)); + protected void doBuildAdmin(DeployState deployState, Admin admin, Element adminE) { + List configservers = parseConfigservers(deployState, admin, adminE); + admin.setLogserver(parseLogserver(deployState, admin, adminE)); admin.addConfigservers(configservers); - admin.addSlobroks(getSlobroks(admin, XML.getChild(adminE, "slobroks"))); + admin.addSlobroks(getSlobroks(deployState, admin, XML.getChild(adminE, "slobroks"))); if ( ! admin.multitenant()) - admin.setClusterControllers(addConfiguredClusterControllers(admin, adminE)); + admin.setClusterControllers(addConfiguredClusterControllers(deployState, admin, adminE)); ModelElement adminElement = new ModelElement(adminE); addLogForwarders(adminElement.getChild("logforwarding"), admin); } - private List parseConfigservers(Admin admin, Element adminE) { + private List parseConfigservers(DeployState deployState, Admin admin, Element adminE) { List configservers; if (multitenant) { configservers = getConfigServersFromSpec(admin); } else { - configservers = getConfigServers(admin, adminE); + configservers = getConfigServers(deployState, admin, adminE); } int count = configservers.size(); if (count % 2 == 0) { @@ -71,15 +71,15 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { return configservers; } - private Logserver parseLogserver(Admin admin, Element adminE) { + private Logserver parseLogserver(DeployState deployState, Admin admin, Element adminE) { Element logserverE = XML.getChild(adminE, "logserver"); if (logserverE == null) { logserverE = XML.getChild(adminE, "adminserver"); } - return new LogserverBuilder().build(admin, logserverE); + return new LogserverBuilder().build(deployState, admin, logserverE); } - private ContainerCluster addConfiguredClusterControllers(AbstractConfigProducer parent, Element admin) { + private ContainerCluster addConfiguredClusterControllers(DeployState deployState, AbstractConfigProducer parent, Element admin) { Element controllersElements = XML.getChild(admin, "cluster-controllers"); if (controllersElements == null) return null; @@ -93,13 +93,13 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { ContainerCluster cluster = new ContainerCluster(parent, "cluster-controllers", "cluster-controllers", - new ClusterControllerClusterVerifier()); + new ClusterControllerClusterVerifier(), deployState); ContainerModelBuilder.addDefaultHandler_legacyBuilder(cluster); List containers = new ArrayList<>(); for (Element controller : controllers) { - ClusterControllerContainer clusterController = new ClusterControllerBuilder(containers.size(), standaloneZooKeeper).build(cluster, controller); + ClusterControllerContainer clusterController = new ClusterControllerBuilder(containers.size(), standaloneZooKeeper).build(deployState, cluster, controller); containers.add(clusterController); } @@ -108,7 +108,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } // Extra stupid because configservers tag is optional - private List getConfigServers(AbstractConfigProducer parent, Element adminE) { + private List getConfigServers(DeployState deployState, AbstractConfigProducer parent, Element adminE) { SimpleConfigProducer configServers = new SimpleConfigProducer(parent, "configservers"); List cfgs = new ArrayList<>(); Element configserversE = XML.getChild(adminE, "configservers"); @@ -119,7 +119,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } else { parent.deployLogger().log(LogLevel.INFO, "Specifying configserver without parent element configservers in services.xml is deprecated"); } - Configserver cfgs0 = new ConfigserverBuilder(0, configServerSpecs).build(configServers, configserverE); + Configserver cfgs0 = new ConfigserverBuilder(0, configServerSpecs).build(deployState, configServers, configserverE); cfgs0.setProp("index", 0); cfgs.add(cfgs0); return cfgs; @@ -127,7 +127,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { // configservers tag in use int i = 0; for (Element configserverE : XML.getChildren(configserversE, "configserver")) { - Configserver cfgsrv = new ConfigserverBuilder(i, configServerSpecs).build(configServers, configserverE); + Configserver cfgsrv = new ConfigserverBuilder(i, configServerSpecs).build(deployState, configServers, configserverE); cfgsrv.setProp("index", i); cfgs.add(cfgsrv); i++; @@ -135,20 +135,20 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { return cfgs; } - private List getSlobroks(AbstractConfigProducer parent, Element slobroksE) { + private List getSlobroks(DeployState deployState, AbstractConfigProducer parent, Element slobroksE) { List slobs = new ArrayList<>(); if (slobroksE != null) { - slobs = getExplicitSlobrokSetup(parent, slobroksE); + slobs = getExplicitSlobrokSetup(deployState, parent, slobroksE); } return slobs; } - private List getExplicitSlobrokSetup(AbstractConfigProducer parent, Element slobroksE) { + private List getExplicitSlobrokSetup(DeployState deployState, AbstractConfigProducer parent, Element slobroksE) { List slobs = new ArrayList<>(); List slobsE = XML.getChildren(slobroksE, "slobrok"); int i = 0; for (Element e : slobsE) { - Slobrok slob = new SlobrokBuilder(i).build(parent, e); + Slobrok slob = new SlobrokBuilder(i).build(deployState, parent, e); slobs.add(slob); i++; } @@ -208,9 +208,9 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } @Override - protected ClusterControllerContainer doBuild(AbstractConfigProducer parent, - Element spec) { - return new ClusterControllerContainer(parent, i, runStandaloneZooKeeper); + protected ClusterControllerContainer doBuild(DeployState deployState, AbstractConfigProducer parent, + Element spec) { + return new ClusterControllerContainer(parent, i, runStandaloneZooKeeper, deployState.isHosted()); } } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java index 26de67d4722..908b2ae81c7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java @@ -49,7 +49,7 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { } @Override - protected void doBuildAdmin(Admin admin, Element w3cAdminElement) { + protected void doBuildAdmin(DeployState deployState, Admin admin, Element w3cAdminElement) { ModelElement adminElement = new ModelElement(w3cAdminElement); admin.addConfigservers(getConfigServersFromSpec(admin)); @@ -61,7 +61,7 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { NodesSpecification.optionalDedicatedFromParent(adminElement.getChild("logservers"), context); assignSlobroks(requestedSlobroks.orElse(NodesSpecification.nonDedicated(3, context)), admin); - assignLogserver(requestedLogservers.orElse(createNodesSpecificationForLogserver()), admin); + assignLogserver(deployState, requestedLogservers.orElse(createNodesSpecificationForLogserver()), admin); addLogForwarders(adminElement.getChild("logforwarding"), admin); } @@ -75,7 +75,7 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { } } - private void assignLogserver(NodesSpecification nodesSpecification, Admin admin) { + private void assignLogserver(DeployState deployState, NodesSpecification nodesSpecification, Admin admin) { if (nodesSpecification.count() > 1) throw new IllegalArgumentException("You can only request a single log server"); if (nodesSpecification.isDedicated()) { @@ -83,7 +83,7 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { if (hosts.isEmpty()) return; // No log server can be created (and none is needed) Logserver logserver = createLogserver(admin, hosts); - createAdditionalContainerOnLogserverHost(admin, logserver.getHostResource()); + createAdditionalContainerOnLogserverHost(deployState, admin, logserver.getHostResource()); } else if (containerModels.iterator().hasNext()) { List hosts = sortedContainerHostsFrom(containerModels.iterator().next(), nodesSpecification.count(), false); if (hosts.isEmpty()) return; // No log server can be created (and none is needed) @@ -109,8 +109,8 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { // Creates a container cluster 'logserver-cluster' with 1 container on logserver host // for setting up a handler for getting logs from logserver - private void createAdditionalContainerOnLogserverHost(Admin admin, HostResource hostResource) { - ContainerCluster logServerCluster = new ContainerCluster(admin, "logserver-cluster", "logserver-cluster"); + private void createAdditionalContainerOnLogserverHost(DeployState deployState, Admin admin, HostResource hostResource) { + ContainerCluster logServerCluster = new ContainerCluster(admin, "logserver-cluster", "logserver-cluster", deployState); ContainerModel logserverClusterModel = new ContainerModel(context.withParent(admin).withId(logServerCluster.getSubId())); // Add base handlers and the log handler @@ -123,7 +123,7 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { logserverClusterModel.setCluster(logServerCluster); - Container container = new Container(logServerCluster, "" + 0, 0); + Container container = new Container(logServerCluster, "" + 0, 0, deployState.isHosted()); container.setHostResource(hostResource); container.initService(); logServerCluster.addContainer(container); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java index 5025b5a0a6c..f8f1f88e339 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.text.XML; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.container.component.Component; @@ -14,7 +15,7 @@ import org.w3c.dom.Element; public class DomClientProviderBuilder extends DomHandlerBuilder { @Override - protected Handler doBuild(AbstractConfigProducer ancestor, Element clientElement) { + protected Handler doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element clientElement) { Handler> client = getHandler(clientElement); for (Element binding : XML.getChildren(clientElement, "binding")) @@ -23,7 +24,7 @@ public class DomClientProviderBuilder extends DomHandlerBuilder { for (Element serverBinding : XML.getChildren(clientElement, "serverBinding")) client.addServerBindings(XML.getValue(serverBinding)); - DomComponentBuilder.addChildren(ancestor, clientElement, client); + DomComponentBuilder.addChildren(deployState, ancestor, clientElement, client); return client; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientsBuilder.java index efa62e19f05..24da87200b8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientsBuilder.java @@ -3,7 +3,7 @@ package com.yahoo.vespa.model.builder.xml.dom; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.builder.xml.ConfigModelId; -import com.yahoo.vespa.model.clients.*; +import com.yahoo.vespa.model.clients.Clients; import org.w3c.dom.Element; import java.util.Arrays; @@ -30,7 +30,7 @@ public class DomClientsBuilder extends LegacyConfigModelBuilder { String version = clientsE.getAttribute("version"); if (version.startsWith("2.")) { DomV20ClientsBuilder parser = new DomV20ClientsBuilder(clients, version); - parser.build(clientsE); + parser.build(modelContext.getDeployState(), clientsE); } else { throw new IllegalArgumentException("Version '" + version + "' of 'clients' not supported."); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilder.java index 81f19f00fbb..4beefb84b71 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom; import com.yahoo.component.ComponentId; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.config.model.producer.AbstractConfigProducer; @@ -28,9 +29,10 @@ public class DomComponentBuilder extends VespaDomBuilder.DomConfigProducerBuilde this.namespace = namespace; } - protected Component doBuild(AbstractConfigProducer ancestor, Element spec) { + @Override + protected Component doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { Component component = buildComponent(spec); - addChildren(ancestor, spec, component); + addChildren(deployState, ancestor, spec, component); return component; } @@ -41,14 +43,14 @@ public class DomComponentBuilder extends VespaDomBuilder.DomConfigProducerBuilde return new Component, ComponentModel>(new ComponentModel(bundleSpec)); } - public static void addChildren(AbstractConfigProducer ancestor, Element componentNode, Component, ?> component) { + public static void addChildren(DeployState deployState, AbstractConfigProducer ancestor, Element componentNode, Component, ?> component) { for (Element childNode : XML.getChildren(componentNode, elementName)) { - addAndInjectChild(ancestor, component, childNode); + addAndInjectChild(deployState, ancestor, component, childNode); } } - private static void addAndInjectChild(AbstractConfigProducer ancestor, Component, ?> component, Element childNode) { - Component child = new DomComponentBuilder(component.getComponentId()).build(ancestor, childNode); + private static void addAndInjectChild(DeployState deployState, AbstractConfigProducer ancestor, Component, ?> component, Element childNode) { + Component child = new DomComponentBuilder(component.getComponentId()).build(deployState, ancestor, childNode); component.addComponent(child); component.inject(child); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java index 28a4b9dfea5..558c4428d15 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.text.XML; @@ -16,7 +17,7 @@ import org.w3c.dom.Element; public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder { @Override - protected Handler doBuild(AbstractConfigProducer ancestor, Element handlerElement) { + protected Handler doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element handlerElement) { Handler> handler = getHandler(handlerElement); for (Element binding : XML.getChildren(handlerElement, "binding")) @@ -25,14 +26,13 @@ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder< for (Element clientBinding : XML.getChildren(handlerElement, "clientBinding")) handler.addClientBindings(XML.getValue(clientBinding)); - DomComponentBuilder.addChildren(ancestor, handlerElement, handler); + DomComponentBuilder.addChildren(deployState, ancestor, handlerElement, handler); return handler; } protected Handler> getHandler(Element handlerElement) { BundleInstantiationSpecification bundleSpec = BundleInstantiationSpecificationBuilder.build(handlerElement); - return new Handler<>( - new ComponentModel(bundleSpec)); + return new Handler<>(new ComponentModel(bundleSpec)); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java index 64e47ac4f85..68db7ce465b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomV20ClientsBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.spooler.SpoolerConfig; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; @@ -37,10 +38,10 @@ public class DomV20ClientsBuilder { this.clients = clients; } - public void build(Element spec) { + public void build(DeployState deployState, Element spec) { NodeList children = spec.getElementsByTagName("spoolers"); for (int i = 0; i < children.getLength(); i++) { - createSpoolers(clients.getConfigProducer(), (Element) children.item(i), clients); + createSpoolers(deployState, clients.getConfigProducer(), (Element) children.item(i), clients); } children = spec.getElementsByTagName("load-types"); @@ -59,13 +60,13 @@ public class DomV20ClientsBuilder { /** * Creates VespaSpooler objects using the given xml Element. */ - private void createSpoolers(AbstractConfigProducer pcp, Element element, Clients clients) { + private void createSpoolers(DeployState deployState, AbstractConfigProducer pcp, Element element, Clients clients) { String jvmArgs = null; if (element.hasAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME)) jvmArgs=element.getAttribute(VespaDomBuilder.JVMARGS_ATTRIB_NAME); SimpleConfigProducer spoolerCfg = new VespaDomBuilder.DomSimpleConfigProducerBuilder(element.getNodeName()). - build(pcp, element); + build(deployState, pcp, element); Element spoolersFeederOptions = findFeederOptions(element); - createSpoolMasters(spoolerCfg, element); + createSpoolMasters(deployState, spoolerCfg, element); for (Element e : XML.getChildren(element, "spooler")) { String configId = e.getAttribute("id").trim(); FeederConfig.Builder feederConfig = getFeederConfig(spoolersFeederOptions, e); @@ -73,21 +74,21 @@ public class DomV20ClientsBuilder { if (configId.length() == 0) { int index = clients.getVespaSpoolers().size(); VespaSpoolerService spoolerService = new VespaSpoolerServiceBuilder(index, new VespaSpooler(feederConfig, spoolConfig)). - build(spoolerCfg, e); + build(deployState, spoolerCfg, e); if ("".equals(spoolerService.getJvmArgs()) && jvmArgs!=null) spoolerService.setJvmArgs(jvmArgs); spoolerService.setProp("index", String.valueOf(index)); clients.getVespaSpoolers().add(spoolerService); } else { new VespaSpoolerProducerBuilder(configId, new VespaSpooler(feederConfig, spoolConfig)). - build(spoolerCfg, e); + build(deployState, spoolerCfg, e); } } } - private void createSpoolMasters(SimpleConfigProducer producer, Element element) { + private void createSpoolMasters(DeployState deployState, SimpleConfigProducer producer, Element element) { int i=0; for (Element e : XML.getChildren(element, "spoolmaster")) - new VespaSpoolMasterBuilder(i++).build(producer, e); + new VespaSpoolMasterBuilder(i++).build(deployState, producer, e); } private SpoolerConfig.Builder getSpoolConfig(Element conf) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilder.java index bd280bc0b49..4bff500d806 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilder.java @@ -24,7 +24,7 @@ public abstract class LegacyConfigModelBuilder extend @Override public MODEL build(ConfigModelInstanceFactory factory, Element spec, ConfigModelContext context) { VespaDomBuilder.DomSimpleConfigProducerBuilder builder = new VespaDomBuilder.DomSimpleConfigProducerBuilder(context.getProducerId()); - AbstractConfigProducer producer = builder.build(context.getParentProducer(), spec); + AbstractConfigProducer producer = builder.build(context.getDeployState(), context.getParentProducer(), spec); return super.build(factory, spec, context.withParent(producer)); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java index 0e29c69c53e..4dfb34a117b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/VespaDomBuilder.java @@ -10,7 +10,6 @@ import com.yahoo.config.model.deploy.DeployProperties; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.builder.xml.XmlHelper; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.model.producer.UserConfigRepo; import com.yahoo.log.LogLevel; import com.yahoo.text.XML; @@ -119,12 +118,8 @@ public class VespaDomBuilder extends VespaModelBuilder { public static abstract class DomConfigProducerBuilder { // TODO: find good way to provide access to app package - public final T build(AbstractConfigProducer ancestor, Element producerSpec) { - return build(ancestor.getRoot().getDeployState(), ancestor, producerSpec); - } - public final T build(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { - T t = doBuild(ancestor, producerSpec); + T t = doBuild(deployState, ancestor, producerSpec); if (t instanceof AbstractService) { initializeService((AbstractService)t, deployState, ancestor.getHostSystem(), producerSpec); @@ -135,11 +130,15 @@ public class VespaDomBuilder extends VespaModelBuilder { return t; } - protected abstract T doBuild(AbstractConfigProducer ancestor, Element producerSpec); + protected T doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + throw new IllegalArgumentException("DomConfigProducerBuilder.doBuild(AbstractConfigProducer ancestor, Element producerSpec) should never be called"); + } + + protected T doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { + return doBuild(ancestor, producerSpec); + } - private void initializeProducer(AbstractConfigProducer child, - DeployState deployState, - Element producerSpec) { + private void initializeProducer(AbstractConfigProducer child, DeployState deployState, Element producerSpec) { UserConfigRepo userConfigs = UserConfigBuilder.build(producerSpec, deployState, deployState.getDeployLogger()); // TODO: must be made to work: //userConfigs.applyWarnings(child); @@ -147,10 +146,9 @@ public class VespaDomBuilder extends VespaModelBuilder { child.mergeUserConfigs(userConfigs); } - private void initializeService(AbstractService t, - DeployState deployState, - HostSystem hostSystem, - Element producerSpec) { + private void initializeService(AbstractService t, DeployState deployState, + HostSystem hostSystem, Element producerSpec) + { initializeProducer(t, deployState, producerSpec); if (producerSpec != null) { if (producerSpec.hasAttribute(JVMARGS_ATTRIB_NAME)) { @@ -330,12 +328,12 @@ public class VespaDomBuilder extends VespaModelBuilder { } @Override - public List getClusters(ApplicationPackage pkg, AbstractConfigProducer parent) { + public List getClusters(DeployState deployState, AbstractConfigProducer parent) { List clusters = new ArrayList<>(); - Document services = XmlHelper.getDocument(pkg.getServices()); + Document services = XmlHelper.getDocument(deployState.getApplicationPackage().getServices()); for (Element clusterSpec : XML.getChildren(services.getDocumentElement(), "cluster")) { DomServiceClusterBuilder clusterBuilder = new DomServiceClusterBuilder(clusterSpec.getAttribute("name")); - clusters.add(clusterBuilder.build(parent.getRoot(), clusterSpec)); + clusters.add(clusterBuilder.build(deployState, parent.getRoot(), clusterSpec)); } return clusters; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ChainsBuilder.java index 332f75db339..6988c7dcf06 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ChainsBuilder.java @@ -1,13 +1,18 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom.chains; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.text.XML; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.container.component.chain.Chain; import com.yahoo.vespa.model.container.component.chain.ChainedComponent; import org.w3c.dom.Element; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * @author Tony Vaagenes @@ -19,38 +24,38 @@ public class ChainsBuilder, CHAIN extends private final Map>> chainType2BuilderClass; // NOTE: The chain type string (key in chainType2BuilderClass) must match the xml tag name for the chain. - public ChainsBuilder(AbstractConfigProducer ancestor, List chainsElems, + public ChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List chainsElems, Map outerComponentTypeByComponentName, Map>> chainType2BuilderClass) { this.chainType2BuilderClass = chainType2BuilderClass; - readChains(ancestor, chainsElems, outerComponentTypeByComponentName); + readChains(deployState, ancestor, chainsElems, outerComponentTypeByComponentName); } public Collection getChains() { return Collections.unmodifiableCollection(chains); } - private void readChains(AbstractConfigProducer ancestor, List chainsElems, + private void readChains(DeployState deployState, AbstractConfigProducer ancestor, List chainsElems, Map outerSearcherTypeByComponentName) { for (Map.Entry>> chainType : chainType2BuilderClass.entrySet()) { for (Element elemContainingChainElems : chainsElems) { for (Element chainElem : XML.getChildren(elemContainingChainElems, chainType.getKey())) { - readChain(ancestor, chainElem, chainType.getValue(), outerSearcherTypeByComponentName); + readChain(deployState, ancestor, chainElem, chainType.getValue(), outerSearcherTypeByComponentName); } } } } - private void readChain(AbstractConfigProducer ancestor, Element chainElem, + private void readChain(DeployState deployState, AbstractConfigProducer ancestor, Element chainElem, Class> builderClass, Map outerSearcherTypeByComponentName) { DomChainBuilderBase builder = DomBuilderCreator.create(builderClass, outerSearcherTypeByComponentName); - chains.add(builder.build(ancestor, chainElem)); + chains.add(builder.build(deployState, ancestor, chainElem)); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ComponentsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ComponentsBuilder.java index c94db473699..9777932c3cb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ComponentsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/ComponentsBuilder.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains; import com.yahoo.component.ComponentId; import com.yahoo.component.ComponentSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.text.XML; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.model.builder.xml.XmlHelper; @@ -19,7 +20,15 @@ import com.yahoo.vespa.model.container.docproc.DocumentProcessor; import com.yahoo.vespa.model.container.search.searchchain.Searcher; import org.w3c.dom.Element; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + /** * Creates component models and component references from xml for a given scope. @@ -29,7 +38,7 @@ public class ComponentsBuilder> { // NOTE: the 'name' string must match the xml tag name for the component in services. public static class ComponentType> { - static ArrayList values = new ArrayList<>(); + static List values = new ArrayList<>(); public static final ComponentType documentprocessor = new ComponentType<>("documentprocessor", DomDocumentProcessorBuilder.class); public static final ComponentType> searcher = new ComponentType<>("searcher", DomSearcherBuilder.class); public static final ComponentType processor = new ComponentType<>("processor", DomProcessorBuilder.class); @@ -63,15 +72,16 @@ public class ComponentsBuilder> { * @param outerComponentTypeByComponentName Use null if this is the outermost scope, i.e. * every component is a definition, not a reference. */ - ComponentsBuilder(AbstractConfigProducer ancestor, + ComponentsBuilder(DeployState deployState, + AbstractConfigProducer ancestor, Collection> componentTypes, List elementsContainingComponentElems, Map outerComponentTypeByComponentName) { - readComponents(ancestor, componentTypes, elementsContainingComponentElems, unmodifiable(outerComponentTypeByComponentName)); + readComponents(deployState, ancestor, componentTypes, elementsContainingComponentElems, unmodifiable(outerComponentTypeByComponentName)); } - private void readComponents(AbstractConfigProducer ancestor, + private void readComponents(DeployState deployState, AbstractConfigProducer ancestor, Collection> componentTypes, List elementsContainingComponentElems, Map outerComponentTypeByComponentName) { @@ -79,13 +89,13 @@ public class ComponentsBuilder> { for (ComponentType componentType : componentTypes) { for (Element elemContainingComponentElems : elementsContainingComponentElems) { for (Element componentElement : XML.getChildren(elemContainingComponentElems, componentType.name)) { - readComponent(ancestor, componentElement, componentType, outerComponentTypeByComponentName); + readComponent(deployState, ancestor, componentElement, componentType, outerComponentTypeByComponentName); } } } } - private void readComponent(AbstractConfigProducer ancestor, + private void readComponent(DeployState deployState, AbstractConfigProducer ancestor, Element componentElement, ComponentType componentType, Map outerComponentTypeByComponentName) { @@ -95,7 +105,7 @@ public class ComponentsBuilder> { if (outerComponentTypeByComponentName.containsKey(componentSpecification.getName())) { readComponentReference(componentElement, componentType, componentSpecification, outerComponentTypeByComponentName); } else { - readComponentDefinition(ancestor, componentElement, componentType); + readComponentDefinition(deployState, ancestor, componentElement, componentType); } } @@ -109,8 +119,8 @@ public class ComponentsBuilder> { outerComponentReferences.add(componentSpecification); } - private void readComponentDefinition(AbstractConfigProducer ancestor, Element componentElement, ComponentType componentType) { - T component = componentType.createBuilder().build(ancestor, componentElement); + private void readComponentDefinition(DeployState deployState, AbstractConfigProducer ancestor, Element componentElement, ComponentType componentType) { + T component = componentType.createBuilder().build(deployState, ancestor, componentElement); componentDefinitions.add(component); updateComponentTypes(component.getComponentId(), componentType); } @@ -139,7 +149,7 @@ public class ComponentsBuilder> { private Map unmodifiable(Map outerComponentTypeByComponentName) { return (outerComponentTypeByComponentName != null)? Collections.unmodifiableMap(outerComponentTypeByComponentName): - Collections.emptyMap(); + Collections.emptyMap(); } public Collection getComponentDefinitions() { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainBuilderBase.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainBuilderBase.java index acc07e77d75..6f5bc7f90fd 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainBuilderBase.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainBuilderBase.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.container.component.chain.Chain; @@ -28,13 +29,13 @@ public abstract class DomChainBuilderBase, this.outerComponentTypeByComponentName = outerComponentTypeByComponentName; } - public final CHAIN doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + public final CHAIN doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { ComponentsBuilder componentsBuilder = - new ComponentsBuilder<>(ancestor, allowedComponentTypes, Arrays.asList(producerSpec), outerComponentTypeByComponentName); + new ComponentsBuilder<>(deployState, ancestor, allowedComponentTypes, Arrays.asList(producerSpec), outerComponentTypeByComponentName); ChainSpecification specWithoutInnerComponents = new ChainSpecificationBuilder(producerSpec).build(componentsBuilder.getOuterComponentReferences()); - CHAIN chain = buildChain(ancestor, producerSpec, specWithoutInnerComponents); + CHAIN chain = buildChain(deployState, ancestor, producerSpec, specWithoutInnerComponents); addInnerComponents(chain, componentsBuilder.getComponentDefinitions()); return chain; @@ -46,6 +47,6 @@ public abstract class DomChainBuilderBase, } } - protected abstract CHAIN buildChain(AbstractConfigProducer ancestor, Element producerSpec, + protected abstract CHAIN buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainsBuilder.java index eb96221d839..1653612fc78 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/DomChainsBuilder.java @@ -2,7 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains; import com.yahoo.config.application.Xml; -import com.yahoo.text.XML; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder.ComponentType; @@ -41,13 +41,13 @@ class DomChainsBuilder, CHAIN extends Chai protected abstract CHAINS newChainsInstance(AbstractConfigProducer parent); @Override - protected final CHAINS doBuild(AbstractConfigProducer parent, Element chainsElement) { + protected final CHAINS doBuild(DeployState deployState, AbstractConfigProducer parent, Element chainsElement) { CHAINS chains = newChainsInstance(parent); - List allChainElements = allChainElements(parent, chainsElement); + List allChainElements = allChainElements(deployState, parent, chainsElement); if (! allChainElements.isEmpty()) { - ComponentsBuilder outerComponentsBuilder = readOuterComponents(chains, allChainElements); - ChainsBuilder chainsBuilder = readChains(chains, allChainElements, + ComponentsBuilder outerComponentsBuilder = readOuterComponents(deployState, chains, allChainElements); + ChainsBuilder chainsBuilder = readChains(deployState, chains, allChainElements, outerComponentsBuilder.getComponentTypeByComponentName()); addOuterComponents(chains, outerComponentsBuilder); @@ -56,24 +56,24 @@ class DomChainsBuilder, CHAIN extends Chai return chains; } - private List allChainElements(AbstractConfigProducer ancestor, Element chainsElement) { + private List allChainElements(DeployState deployState, AbstractConfigProducer ancestor, Element chainsElement) { List chainsElements = new ArrayList<>(); if (outerChainsElem != null) chainsElements.add(outerChainsElem); chainsElements.add(chainsElement); if (appPkgChainsDir != null) - chainsElements.addAll(Xml.allElemsFromPath(ancestor.getRoot().getDeployState().getApplicationPackage(), appPkgChainsDir)); + chainsElements.addAll(Xml.allElemsFromPath(deployState.getApplicationPackage(), appPkgChainsDir)); return chainsElements; } - private ComponentsBuilder readOuterComponents(AbstractConfigProducer ancestor, List chainsElems) { - return new ComponentsBuilder<>(ancestor, allowedComponentTypes, chainsElems, null); + private ComponentsBuilder readOuterComponents(DeployState deployState, AbstractConfigProducer ancestor, List chainsElems) { + return new ComponentsBuilder<>(deployState, ancestor, allowedComponentTypes, chainsElems, null); } protected abstract - ChainsBuilder readChains(AbstractConfigProducer ancestor, List allChainsElems, + ChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List allChainsElems, Map outerComponentTypeByComponentName); private void addOuterComponents(CHAINS chains, ComponentsBuilder outerComponentsBuilder) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DocprocChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DocprocChainsBuilder.java index dd61144bfba..e40932154a0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DocprocChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DocprocChainsBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom.chains.docproc; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.ChainsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; @@ -9,7 +10,10 @@ import com.yahoo.vespa.model.container.docproc.DocprocChain; import com.yahoo.vespa.model.container.docproc.DocumentProcessor; import org.w3c.dom.Element; -import java.util.*; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; /** * Creates all docproc chains from xml. @@ -25,9 +29,9 @@ public class DocprocChainsBuilder extends ChainsBuilder docprocChainsElements, + public DocprocChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List docprocChainsElements, Map outerSearcherTypeByComponentName) { - super(ancestor, docprocChainsElements, outerSearcherTypeByComponentName, chainType2builderClass); + super(deployState, ancestor, docprocChainsElements, outerSearcherTypeByComponentName, chainType2builderClass); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainBuilder.java index 32a5e627495..e6b2cb65b16 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainBuilder.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains.docproc; import com.yahoo.collections.Pair; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.DomChainBuilderBase; @@ -24,7 +25,8 @@ public class DomDocprocChainBuilder extends DomChainBuilderBase, String> fieldNameSchemaMap = DocumentProcessorModelBuilder.parseFieldNameSchemaMap(producerSpec); return new DocprocChain(specWithoutInnerComponents, fieldNameSchemaMap); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainsBuilder.java index b0d0c3d728e..fd2212d6637 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocprocChainsBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom.chains.docproc; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder.ComponentType; @@ -31,8 +32,8 @@ public class DomDocprocChainsBuilder extends DomChainsBuilder docprocChainsElements, + protected DocprocChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List docprocChainsElements, Map outerComponentTypeByComponentName) { - return new DocprocChainsBuilder(ancestor, docprocChainsElements, outerComponentTypeByComponentName); + return new DocprocChainsBuilder(deployState, ancestor, docprocChainsElements, outerComponentTypeByComponentName); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingBuilder.java index d81aa0f8dd3..5fb7853b9fb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom.chains.processing; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; @@ -32,9 +33,9 @@ public class DomProcessingBuilder extends DomChainsBuilder processingChainsElements, - Map outerComponentTypeByComponentName) { - return new ProcessingChainsBuilder(ancestor, processingChainsElements, outerComponentTypeByComponentName); + protected ProcessingChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List processingChainsElements, + Map outerComponentTypeByComponentName) { + return new ProcessingChainsBuilder(deployState, ancestor, processingChainsElements, outerComponentTypeByComponentName); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingChainBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingChainBuilder.java index 7724970d4d5..ff414dfd740 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingChainBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessingChainBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains.processing; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.DomChainBuilderBase; @@ -22,8 +23,8 @@ public class DomProcessingChainBuilder extends DomChainBuilderBase processingChainsElements, + public ProcessingChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List processingChainsElements, Map outerSearcherTypeByComponentName) { - super(ancestor, processingChainsElements, outerSearcherTypeByComponentName, chainType2builderClass); + super(deployState, ancestor, processingChainsElements, outerSearcherTypeByComponentName, chainType2builderClass); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilder.java index 947ae07342c..2cc29ad9b36 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilder.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains.search; import com.yahoo.component.ComponentId; import com.yahoo.component.ComponentSpecification; import com.yahoo.config.model.builder.xml.XmlHelper; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.search.searchchain.model.federation.FederationOptions; import com.yahoo.search.searchchain.model.federation.FederationSearcherModel; import com.yahoo.text.XML; @@ -70,18 +71,19 @@ public class DomFederationSearcherBuilder extends VespaDomBuilder.DomConfigProdu } } - protected FederationSearcher doBuild(AbstractConfigProducer ancestor, Element searcherElement) { + @Override + protected FederationSearcher doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element searcherElement) { FederationSearcherModel model = new FederationSearcherModelBuilder(searcherElement).build(); - Optional targetSelector = buildTargetSelector(ancestor, searcherElement, model.getComponentId()); + Optional targetSelector = buildTargetSelector(deployState, ancestor, searcherElement, model.getComponentId()); return new FederationSearcher(model, targetSelector); } - private Optional buildTargetSelector(AbstractConfigProducer ancestor, Element searcherElement, ComponentId namespace) { + private Optional buildTargetSelector(DeployState deployState, AbstractConfigProducer ancestor, Element searcherElement, ComponentId namespace) { Element targetSelectorElement = XML.getChild(searcherElement, "target-selector"); if (targetSelectorElement == null) return Optional.empty(); - return Optional.of(new DomComponentBuilder(namespace).build(ancestor, targetSelectorElement)); + return Optional.of(new DomComponentBuilder(namespace).build(deployState, ancestor, targetSelectorElement)); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilder.java index ffacb146cee..d5115622e74 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilder.java @@ -6,6 +6,7 @@ import com.yahoo.component.chain.dependencies.Dependencies; import com.yahoo.component.chain.model.ChainedComponentModel; import com.yahoo.component.ComponentId; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.search.searchchain.model.federation.FederationOptions; import com.yahoo.search.searchchain.model.federation.HttpProviderSpec; import com.yahoo.search.searchchain.model.federation.LocalProviderSpec; @@ -171,8 +172,8 @@ public class DomProviderBuilder extends DomGenericTargetBuilder { } @Override - protected Provider buildChain(AbstractConfigProducer ancestor, Element providerElement, - ChainSpecification specWithoutInnerComponents) { + protected Provider buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element providerElement, + ChainSpecification specWithoutInnerComponents) { ProviderReader providerReader = new ProviderReader(providerElement); if (providerReader.certificateApplicationId == null && providerReader.certificateProxy != null) { @@ -185,17 +186,17 @@ public class DomProviderBuilder extends DomGenericTargetBuilder { Provider provider = buildProvider(specWithoutInnerComponents, providerReader, federationOptions); - Collection sources = buildSources(ancestor, providerElement); + Collection sources = buildSources(deployState, ancestor, providerElement); addSources(provider, sources); return provider; } - private Collection buildSources(AbstractConfigProducer ancestor, Element providerElement) { + private Collection buildSources(DeployState deployState, AbstractConfigProducer ancestor, Element providerElement) { List sources = new ArrayList<>(); for (Element sourceElement : XML.getChildren(providerElement, "source")) { - sources.add(new DomSourceBuilder(outerComponentTypeByComponentName).build(ancestor, sourceElement)); + sources.add(new DomSourceBuilder(outerComponentTypeByComponentName).build(deployState, ancestor, sourceElement)); } return sources; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainBuilder.java index e5086ccd9f9..3950384a4d4 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains.search; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.DomChainBuilderBase; @@ -23,7 +24,7 @@ public class DomSearchChainBuilder extends DomChainBuilderBase, Sear outerSearcherTypeByComponentName); } - protected SearchChain buildChain(AbstractConfigProducer ancestor, Element producerSpec, + protected SearchChain buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { return new SearchChain(specWithoutInnerComponents); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilder.java index c5802f8e578..419eb00886a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom.chains.search; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder.ComponentType; @@ -37,9 +38,9 @@ public class DomSearchChainsBuilder extends DomChainsBuilder, Search } @Override - protected SearchChainsBuilder readChains(AbstractConfigProducer ancestor, List searchChainsElements, + protected SearchChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List searchChainsElements, Map outerComponentTypeByComponentName) { - return new SearchChainsBuilder(ancestor, searchChainsElements, outerComponentTypeByComponentName); + return new SearchChainsBuilder(deployState, ancestor, searchChainsElements, outerComponentTypeByComponentName); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSourceBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSourceBuilder.java index 177f77e9348..12c4714e27c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSourceBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSourceBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains.search; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.model.builder.xml.XmlHelper; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; @@ -19,7 +20,7 @@ public class DomSourceBuilder extends DomGenericTargetBuilder { super(outerSearcherTypeByComponentName); } - protected Source buildChain(AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { + protected Source buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { Source.GroupOption groupOption = XmlHelper.isReference(producerSpec) ? Source.GroupOption.participant : diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/SearchChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/SearchChainsBuilder.java index fad5a66be98..0106123666d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/SearchChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/SearchChainsBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom.chains.search; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.ChainsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; @@ -9,7 +10,10 @@ import com.yahoo.vespa.model.container.search.searchchain.SearchChain; import com.yahoo.vespa.model.container.search.searchchain.Searcher; import org.w3c.dom.Element; -import java.util.*; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; /** * @author Tony Vaagenes @@ -26,9 +30,9 @@ public class SearchChainsBuilder extends ChainsBuilder, SearchChain> put("provider", DomProviderBuilder.class); }}); - public SearchChainsBuilder(AbstractConfigProducer ancestor, List searchChainsElements, + public SearchChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List searchChainsElements, Map outerSearcherTypeByComponentName) { - super(ancestor, searchChainsElements, outerSearcherTypeByComponentName, chainType2builderClass); + super(deployState, ancestor, searchChainsElements, outerSearcherTypeByComponentName, chainType2builderClass); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java index 442d6bbf368..8317f46d4ee 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java @@ -76,20 +76,20 @@ public class Container extends AbstractService implements private static final int numRpcServerPorts = 2; private static final String defaultHostedJVMArgs = "-XX:+UseOSErrorReporting -XX:+SuppressFatalErrorMessage"; - public Container(AbstractConfigProducer parent, String name, int index) { - this(parent, name, Collections.emptyList(), index); + public Container(AbstractConfigProducer parent, String name, int index, boolean isHostedVespa) { + this(parent, name, Collections.emptyList(), index, isHostedVespa); } - public Container(AbstractConfigProducer parent, String name, boolean retired, int index) { - this(parent, name, retired, Collections.emptyList(), index); + public Container(AbstractConfigProducer parent, String name, boolean retired, int index, boolean isHostedVespa) { + this(parent, name, retired, Collections.emptyList(), index, isHostedVespa); } - public Container(AbstractConfigProducer parent, String name, List portOverrides, int index) { - this(parent, name, false, portOverrides, index); + public Container(AbstractConfigProducer parent, String name, List portOverrides, int index, boolean isHostedVespa) { + this(parent, name, false, portOverrides, index, isHostedVespa); } - public Container(AbstractConfigProducer parent, String name, boolean retired, List portOverrides, int index) { + public Container(AbstractConfigProducer parent, String name, boolean retired, List portOverrides, int index, boolean isHostedVespa) { super(parent, name); this.name = name; this.parent = parent; - this.isHostedVespa = stateIsHosted(deployStateFrom(parent)); + this.isHostedVespa = isHostedVespa; this.portOverrides = Collections.unmodifiableList(new ArrayList<>(portOverrides)); this.retired = retired; this.index = index; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index 8cca3c91dec..c077060cc96 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -196,19 +196,10 @@ public final class ContainerCluster } } - /** Creates a container cluster */ - public ContainerCluster(AbstractConfigProducer parent, String subId, String name) { - this(parent, subId, name, new AcceptAllVerifier()); - } public ContainerCluster(AbstractConfigProducer parent, String subId, String name, DeployState deployState) { this(parent, subId, name, new AcceptAllVerifier(), deployState); } - public ContainerCluster(AbstractConfigProducer parent, String subId, String name, ContainerClusterVerifier verifier) { - this(parent, subId, name, verifier, deployStateFrom(parent)); - } - - /** Creates a container cluster */ public ContainerCluster(AbstractConfigProducer parent, String subId, String name, ContainerClusterVerifier verifier, DeployState deployState) { super(parent, subId); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterBuilder.java index 137a59c1311..2fbe011d747 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.container.http.xml; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; import com.yahoo.vespa.model.builder.xml.dom.DomComponentBuilder; @@ -16,10 +17,11 @@ import org.w3c.dom.Element; */ public class FilterBuilder extends VespaDomBuilder.DomConfigProducerBuilder { - protected Filter doBuild(AbstractConfigProducer ancestor, Element filterElement) { + @Override + protected Filter doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element filterElement) { ChainedComponentModelBuilder modelBuilder = new ChainedComponentModelBuilder(filterElement); Filter filter = new Filter(modelBuilder.build()); - DomComponentBuilder.addChildren(ancestor, filterElement, filter); + DomComponentBuilder.addChildren(deployState, ancestor, filterElement, filter); addFilterConfig(filterElement, filter); return filter; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainBuilder.java index 8749968606b..2339574424e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.container.http.xml; import com.yahoo.component.chain.model.ChainSpecification; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.DomChainBuilderBase; import com.yahoo.vespa.model.container.component.chain.Chain; @@ -26,7 +27,7 @@ public class FilterChainBuilder extends DomChainBuilderBase buildChain(AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { + protected Chain buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { return new Chain<>(specWithoutInnerComponents); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainsBuilder.java index d5448d47ad0..e7f3d9de857 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/FilterChainsBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.container.http.xml; import com.google.common.collect.ImmutableMap; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.chains.ChainsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; @@ -13,7 +14,10 @@ import com.yahoo.vespa.model.container.http.Filter; import com.yahoo.vespa.model.container.http.FilterChains; import org.w3c.dom.Element; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * @author Tony Vaagenes @@ -37,9 +41,10 @@ public class FilterChainsBuilder extends DomChainsBuilder, @Override protected ChainsBuilder> readChains( + DeployState deployState, AbstractConfigProducer ancestor, List allChainsElems, Map outerComponentTypeByComponentName) { - return new ChainsBuilder<>(ancestor, allChainsElems, outerComponentTypeByComponentName, chainType2BuilderClass); + return new ChainsBuilder<>(deployState, ancestor, allChainsElems, outerComponentTypeByComponentName, chainType2BuilderClass); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java index 410e5fda491..ef69d40f325 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.container.http.xml; import com.yahoo.component.ComponentSpecification; +import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.builder.xml.XmlHelper; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; @@ -32,19 +33,19 @@ import static com.yahoo.vespa.model.container.http.AccessControl.ACCESS_CONTROL_ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder { @Override - protected Http doBuild(AbstractConfigProducer ancestor, Element spec) { + protected Http doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { FilterChains filterChains; List bindings = new ArrayList<>(); AccessControl accessControl = null; Element filteringElem = XML.getChild(spec, "filtering"); if (filteringElem != null) { - filterChains = new FilterChainsBuilder().build(ancestor, filteringElem); + filterChains = new FilterChainsBuilder().build(deployState, ancestor, filteringElem); bindings = readFilterBindings(filteringElem); Element accessControlElem = XML.getChild(filteringElem, "access-control"); if (accessControlElem != null) { - accessControl = buildAccessControl(ancestor, accessControlElem); + accessControl = buildAccessControl(deployState, ancestor, accessControlElem); bindings.addAll(accessControl.getBindings()); filterChains.add(new Chain<>(FilterChains.emptyChainSpec(ACCESS_CONTROL_CHAIN_ID))); } @@ -55,14 +56,14 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder Http http = new Http(bindings, accessControl); http.setFilterChains(filterChains); - buildHttpServers(ancestor, http, spec); + buildHttpServers(deployState, ancestor, http, spec); return http; } - private AccessControl buildAccessControl(AbstractConfigProducer ancestor, Element accessControlElem) { + private AccessControl buildAccessControl(DeployState deployState, AbstractConfigProducer ancestor, Element accessControlElem) { String application = XmlHelper.getOptionalChildValue(accessControlElem, "application") - .orElse(getDeployedApplicationId(ancestor).value()); + .orElse(getDeployedApplicationId(deployState, ancestor).value()); AccessControl.Builder builder = new AccessControl.Builder(accessControlElem.getAttribute("domain"), application); @@ -89,9 +90,9 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder /** * Returns the id of the deployed application, or the default value if not explicitly set (self-hosted). */ - private static ApplicationName getDeployedApplicationId(AbstractConfigProducer ancestor) { + private static ApplicationName getDeployedApplicationId(DeployState deployState, AbstractConfigProducer ancestor) { return getContainerCluster(ancestor) - .map(cluster -> cluster.getRoot().getDeployState().getProperties().applicationId().application()) + .map(cluster -> deployState.getProperties().applicationId().application()) .orElse(ApplicationId.defaultId().application()); } @@ -122,11 +123,11 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder return result; } - private void buildHttpServers(AbstractConfigProducer ancestor, Http http, Element spec) { - http.setHttpServer(new JettyHttpServerBuilder().build(ancestor, spec)); + private void buildHttpServers(DeployState deployState, AbstractConfigProducer ancestor, Http http, Element spec) { + http.setHttpServer(new JettyHttpServerBuilder().build(deployState, ancestor, spec)); } - static int readPort(Element spec, DeployState deployState) { + static int readPort(Element spec, boolean isHosted, DeployLogger deployLogger) { String portString = spec.getAttribute("port"); int port = Integer.parseInt(portString); @@ -134,8 +135,8 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder throw new IllegalArgumentException(String.format("Invalid port %d.", port)); int legalPortInHostedVespa = Container.BASEPORT; - if (deployState.isHosted() && port != legalPortInHostedVespa) { - deployState.getDeployLogger().log(LogLevel.WARNING, + if (isHosted && port != legalPortInHostedVespa) { + deployLogger.log(LogLevel.WARNING, String.format("Trying to set port to %d for http server with id %s. You cannot set port to anything else than %s", port, spec.getAttribute("id"), legalPortInHostedVespa)); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyConnectorBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyConnectorBuilder.java index 36736d66195..3f32bc592de 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyConnectorBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyConnectorBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.container.http.xml; import com.yahoo.config.model.builder.xml.XmlHelper; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; @@ -24,9 +25,9 @@ public class JettyConnectorBuilder extends VespaDomBuilder.DomConfigProducerBuil private static final Logger log = Logger.getLogger(JettyConnectorBuilder.class.getName()); @Override - protected ConnectorFactory doBuild(AbstractConfigProducer ancestor, Element serverSpec) { + protected ConnectorFactory doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element serverSpec) { String name = XmlHelper.getIdString(serverSpec); - int port = HttpBuilder.readPort(serverSpec, ancestor.getRoot().getDeployState()); + int port = HttpBuilder.readPort(serverSpec, deployState.isHosted(), deployState.getDeployLogger()); Element legacyServerConfig = XML.getChild(serverSpec, "config"); if (legacyServerConfig != null) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyHttpServerBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyHttpServerBuilder.java index fc5bb8940ac..d5d1de37444 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyHttpServerBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/JettyHttpServerBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.container.http.xml; import com.yahoo.component.ComponentId; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; @@ -15,10 +16,10 @@ import org.w3c.dom.Element; */ public class JettyHttpServerBuilder extends VespaDomBuilder.DomConfigProducerBuilder { @Override - protected JettyHttpServer doBuild(AbstractConfigProducer ancestor, Element http) { + protected JettyHttpServer doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element http) { JettyHttpServer jettyHttpServer = new JettyHttpServer(new ComponentId("jdisc-jetty")); for (Element serverSpec: XML.getChildren(http, "server")) { - ConnectorFactory connectorFactory = new JettyConnectorBuilder().build(ancestor, serverSpec); + ConnectorFactory connectorFactory = new JettyConnectorBuilder().build(deployState, ancestor, serverSpec); jettyHttpServer.addConnector(connectorFactory); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/AccessLogBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/AccessLogBuilder.java index 6afed7c9718..a8be0e6317c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/AccessLogBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/AccessLogBuilder.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.container.xml; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.container.core.AccessLogConfig; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; @@ -101,7 +102,7 @@ public class AccessLogBuilder { } } - public static Optional buildIfNotDisabled(ContainerCluster cluster, Element accessLogSpec) { + public static Optional buildIfNotDisabled(DeployState deployState, ContainerCluster cluster, Element accessLogSpec) { AccessLogTypeLiteral typeLiteral = getOptionalAttribute(accessLogSpec, "type"). map(AccessLogTypeLiteral::fromAttributeValue). @@ -111,6 +112,6 @@ public class AccessLogBuilder { return Optional.empty(); } boolean hosted = cluster.isHostedVespa(); - return Optional.of(new DomBuilder(logType, hosted).build(cluster, accessLogSpec)); + return Optional.of(new DomBuilder(logType, hosted).build(deployState, cluster, accessLogSpec)); } } 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 7802bd1eb65..6351535a6f9 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 @@ -30,6 +30,7 @@ import com.yahoo.text.XML; import com.yahoo.vespa.defaults.Defaults; import com.yahoo.vespa.model.AbstractService; import com.yahoo.vespa.model.HostResource; +import com.yahoo.vespa.model.HostSystem; import com.yahoo.vespa.model.builder.xml.dom.DomClientProviderBuilder; import com.yahoo.vespa.model.builder.xml.dom.DomComponentBuilder; import com.yahoo.vespa.model.builder.xml.dom.DomFilterBuilder; @@ -61,8 +62,6 @@ import com.yahoo.vespa.model.container.processing.ProcessingChains; import com.yahoo.vespa.model.container.search.ContainerSearch; import com.yahoo.vespa.model.container.search.GUIHandler; import com.yahoo.vespa.model.container.search.PageTemplates; -import com.yahoo.vespa.model.container.search.QueryProfiles; -import com.yahoo.vespa.model.container.search.SemanticRules; import com.yahoo.vespa.model.container.search.searchchain.SearchChains; import com.yahoo.vespa.model.container.xml.document.DocumentFactoryBuilder; import com.yahoo.vespa.model.content.StorageGroup; @@ -156,31 +155,32 @@ public class ContainerModelBuilder extends ConfigModelBuilder { } private void addClusterContent(ContainerCluster cluster, Element spec, ConfigModelContext context) { + DeployState deployState = context.getDeployState(); DocumentFactoryBuilder.buildDocumentFactories(cluster, spec); - addConfiguredComponents(cluster, spec); + addConfiguredComponents(deployState, cluster, spec); addSecretStore(cluster, spec); - addHandlers(cluster, spec); - addRestApis(spec, cluster); - addServlets(spec, cluster); - addProcessing(spec, cluster); - addSearch(spec, cluster, context.getDeployState().getQueryProfiles(), context.getDeployState().getSemanticRules()); + addHandlers(deployState, cluster, spec); + addRestApis(deployState, spec, cluster); + addServlets(deployState, spec, cluster); + addProcessing(deployState, spec, cluster); + addSearch(deployState, spec, cluster); addModelEvaluation(spec, cluster, context); - addDocproc(spec, cluster); + addDocproc(deployState, spec, cluster); addDocumentApi(spec, cluster); // NOTE: Must be done after addSearch addDefaultHandlers(cluster); addStatusHandlers(cluster, context); setDefaultMetricConsumerFactory(cluster); - addHttp(context.getDeployState(), spec, cluster); + addHttp(deployState, spec, cluster); - addAccessLogs(cluster, spec); - addRoutingAliases(cluster, spec, context.getDeployState().zone().environment()); + addAccessLogs(deployState, cluster, spec); + addRoutingAliases(cluster, spec, deployState.zone().environment()); addNodes(cluster, spec, context); - addClientProviders(spec, cluster); - addServerProviders(spec, cluster); - addLegacyFilters(spec, cluster); // TODO: Remove for Vespa 7 + addClientProviders(deployState, spec, cluster); + addServerProviders(deployState, spec, cluster); + addLegacyFilters(deployState, spec, cluster); // TODO: Remove for Vespa 7 addAthensCopperArgos(cluster, context); // Must be added after nodes. } @@ -244,12 +244,12 @@ public class ContainerModelBuilder extends ConfigModelBuilder { } } - private void addConfiguredComponents(ContainerCluster cluster, Element spec) { + private void addConfiguredComponents(DeployState deployState, ContainerCluster cluster, Element spec) { for (Element components : XML.getChildren(spec, "components")) { addIncludes(components); - addConfiguredComponents(cluster, components, "component"); + addConfiguredComponents(deployState, cluster, components, "component"); } - addConfiguredComponents(cluster, spec, "component"); + addConfiguredComponents(deployState, cluster, spec, "component"); } protected void setDefaultMetricConsumerFactory(ContainerCluster cluster) { @@ -288,37 +288,36 @@ public class ContainerModelBuilder extends ConfigModelBuilder { cluster.addStatisticsHandler(); } - private void addClientProviders(Element spec, ContainerCluster cluster) { + private void addClientProviders(DeployState deployState, Element spec, ContainerCluster cluster) { for (Element clientSpec: XML.getChildren(spec, "client")) { - cluster.addComponent(new DomClientProviderBuilder().build(cluster, clientSpec)); + cluster.addComponent(new DomClientProviderBuilder().build(deployState, cluster, clientSpec)); } } - private void addServerProviders(Element spec, ContainerCluster cluster) { - addConfiguredComponents(cluster, spec, "server"); + private void addServerProviders(DeployState deployState, Element spec, ContainerCluster cluster) { + addConfiguredComponents(deployState, cluster, spec, "server"); } - private void addLegacyFilters(Element spec, ContainerCluster cluster) { - for (Component component : buildLegacyFilters(cluster, spec)) { + private void addLegacyFilters(DeployState deployState, Element spec, ContainerCluster cluster) { + for (Component component : buildLegacyFilters(deployState, cluster, spec)) { cluster.addComponent(component); } } - private List buildLegacyFilters(AbstractConfigProducer ancestor, - Element spec) { + private List buildLegacyFilters(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { List components = new ArrayList<>(); for (Element node : XML.getChildren(spec, "filter")) { - components.add(new DomFilterBuilder().build(ancestor, node)); + components.add(new DomFilterBuilder().build(deployState, ancestor, node)); } return components; } - protected void addAccessLogs(ContainerCluster cluster, Element spec) { + protected void addAccessLogs(DeployState deployState, ContainerCluster cluster, Element spec) { List accessLogElements = getAccessLogElements(spec); for (Element accessLog : accessLogElements) { - AccessLogBuilder.buildIfNotDisabled(cluster, accessLog).ifPresent(cluster::addComponent); + AccessLogBuilder.buildIfNotDisabled(deployState, cluster, accessLog).ifPresent(cluster::addComponent); } if (accessLogElements.isEmpty() && cluster.getSearch() != null) @@ -346,16 +345,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder { return http; } - protected void addRestApis(Element spec, ContainerCluster cluster) { + protected void addRestApis(DeployState deployState, Element spec, ContainerCluster cluster) { for (Element restApiElem : XML.getChildren(spec, "rest-api")) { cluster.addRestApi( - new RestApiBuilder().build(cluster, restApiElem)); + new RestApiBuilder().build(deployState, cluster, restApiElem)); } } - private void addServlets(Element spec, ContainerCluster cluster) { + private void addServlets(DeployState deployState, Element spec, ContainerCluster cluster) { for (Element servletElem : XML.getChildren(spec, "servlet")) - cluster.addServlet(new ServletBuilder().build(cluster, servletElem)); + cluster.addServlet(new ServletBuilder().build(deployState, cluster, servletElem)); } private void addDocumentApi(Element spec, ContainerCluster cluster) { @@ -365,8 +364,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder { cluster.setDocumentApi(containerDocumentApi); } - private void addDocproc(Element spec, ContainerCluster cluster) { - ContainerDocproc containerDocproc = buildDocproc(cluster, spec); + private void addDocproc(DeployState deployState, Element spec, ContainerCluster cluster) { + ContainerDocproc containerDocproc = buildDocproc(deployState, cluster, spec); if (containerDocproc == null) return; cluster.setDocproc(containerDocproc); @@ -375,16 +374,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder { docprocOptions.maxConcurrentFactor, docprocOptions.documentExpansionFactor, docprocOptions.containerCoreMemory)); } - private void addSearch(Element spec, ContainerCluster cluster, QueryProfiles queryProfiles, SemanticRules semanticRules) { + private void addSearch(DeployState deployState, Element spec, ContainerCluster cluster) { Element searchElement = XML.getChild(spec, "search"); if (searchElement == null) return; addIncludes(searchElement); - cluster.setSearch(buildSearch(cluster, searchElement, queryProfiles, semanticRules)); + cluster.setSearch(buildSearch(deployState, cluster, searchElement)); addSearchHandler(cluster, searchElement); addGUIHandler(cluster); - validateAndAddConfiguredComponents(cluster, searchElement, "renderer", ContainerModelBuilder::validateRendererElement); + validateAndAddConfiguredComponents(deployState, cluster, searchElement, "renderer", ContainerModelBuilder::validateRendererElement); } private void addModelEvaluation(Element spec, ContainerCluster cluster, ConfigModelContext context) { @@ -396,25 +395,24 @@ public class ContainerModelBuilder extends ConfigModelBuilder { cluster.setModelEvaluation(new ContainerModelEvaluation(cluster, profiles)); } - private void addProcessing(Element spec, ContainerCluster cluster) { + private void addProcessing(DeployState deployState, Element spec, ContainerCluster cluster) { Element processingElement = XML.getChild(spec, "processing"); if (processingElement == null) return; addIncludes(processingElement); - cluster.setProcessingChains(new DomProcessingBuilder(null).build(cluster, processingElement), + cluster.setProcessingChains(new DomProcessingBuilder(null).build(deployState, cluster, processingElement), serverBindings(processingElement, ProcessingChains.defaultBindings)); - validateAndAddConfiguredComponents(cluster, processingElement, "renderer", ContainerModelBuilder::validateRendererElement); + validateAndAddConfiguredComponents(deployState, cluster, processingElement, "renderer", ContainerModelBuilder::validateRendererElement); } - private ContainerSearch buildSearch(ContainerCluster containerCluster, Element producerSpec, - QueryProfiles queryProfiles, SemanticRules semanticRules) { - SearchChains searchChains = new DomSearchChainsBuilder(null, false).build(containerCluster, producerSpec); + private ContainerSearch buildSearch(DeployState deployState, ContainerCluster containerCluster, Element producerSpec) { + SearchChains searchChains = new DomSearchChainsBuilder(null, false).build(deployState, containerCluster, producerSpec); ContainerSearch containerSearch = new ContainerSearch(containerCluster, searchChains, new ContainerSearch.Options()); - applyApplicationPackageDirectoryConfigs(containerCluster.getRoot().getDeployState().getApplicationPackage(), containerSearch); - containerSearch.setQueryProfiles(queryProfiles); - containerSearch.setSemanticRules(semanticRules); + applyApplicationPackageDirectoryConfigs(deployState.getApplicationPackage(), containerSearch); + containerSearch.setQueryProfiles(deployState.getQueryProfiles()); + containerSearch.setSemanticRules(deployState.getSemanticRules()); return containerSearch; } @@ -424,10 +422,10 @@ public class ContainerModelBuilder extends ConfigModelBuilder { containerSearch.setPageTemplates(PageTemplates.create(applicationPackage)); } - private void addHandlers(ContainerCluster cluster, Element spec) { + private void addHandlers(DeployState deployState, ContainerCluster cluster, Element spec) { for (Element component: XML.getChildren(spec, "handler")) { cluster.addComponent( - new DomHandlerBuilder().build(cluster, component)); + new DomHandlerBuilder().build(deployState, cluster, component)); } } @@ -447,14 +445,14 @@ public class ContainerModelBuilder extends ConfigModelBuilder { } private void addStandaloneNode(ContainerCluster cluster) { - Container container = new Container(cluster, "standalone", cluster.getContainers().size()); + Container container = new Container(cluster, "standalone", cluster.getContainers().size(), cluster.isHostedVespa()); cluster.addContainers(Collections.singleton(container)); } private void addNodesFromXml(ContainerCluster cluster, Element containerElement, ConfigModelContext context) { Element nodesElement = XML.getChild(containerElement, "nodes"); if (nodesElement == null) { // default single node on localhost - Container node = new Container(cluster, "container.0", 0); + Container node = new Container(cluster, "container.0", 0, cluster.isHostedVespa()); HostResource host = allocateSingleNodeHost(cluster, log, containerElement, context); node.setHostResource(host); node.initService(); @@ -481,7 +479,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder { else if (nodesElement.hasAttribute("of")) // hosted node spec referencing a content cluster return createNodesFromContentServiceReference(cluster, nodesElement, context); else // the non-hosted option - return createNodesFromNodeList(cluster, nodesElement); + return createNodesFromNodeList(context.getDeployState(), cluster, nodesElement); } private void applyRoutingAliasProperties(List result, ContainerCluster cluster) { @@ -517,7 +515,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder { /** Creates a single host when there is no nodes tag */ private HostResource allocateSingleNodeHost(ContainerCluster cluster, DeployLogger logger, Element containerElement, ConfigModelContext context) { - if (cluster.getRoot().getDeployState().isHosted()) { + DeployState deployState = context.getDeployState(); + HostSystem hostSystem = cluster.getHostSystem(); + if (deployState.isHosted()) { Optional singleContentHost = getHostResourceFromContentClusters(cluster, containerElement, context); if (singleContentHost.isPresent()) { // there is a content cluster; put the container on its first node return singleContentHost.get(); @@ -525,16 +525,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder { else { // request 1 node ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from(cluster.getName()), - context.getDeployState().getWantedNodeVespaVersion(), + deployState.getWantedNodeVespaVersion(), false); Capacity capacity = Capacity.fromNodeCount(1, Optional.empty(), false, - ! context.getDeployState().getProperties().isBootstrap()); - return cluster.getHostSystem().allocateHosts(clusterSpec, capacity, 1, logger).keySet().iterator().next(); + ! deployState.getProperties().isBootstrap()); + return hostSystem.allocateHosts(clusterSpec, capacity, 1, logger).keySet().iterator().next(); } } else { - return cluster.getHostSystem().getHost(Container.SINGLENODE_CONTAINER_SERVICESPEC); + return hostSystem.getHost(Container.SINGLENODE_CONTAINER_SERVICESPEC); } } @@ -623,7 +623,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder { List nodes = new ArrayList<>(); for (Map.Entry entry : hosts.entrySet()) { String id = "container." + entry.getValue().index(); - Container container = new Container(cluster, id, entry.getValue().retired(), entry.getValue().index()); + Container container = new Container(cluster, id, entry.getValue().retired(), entry.getValue().index(), cluster.isHostedVespa()); container.setHostResource(entry.getKey()); container.initService(); nodes.add(container); @@ -631,11 +631,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder { return nodes; } - private List createNodesFromNodeList(ContainerCluster cluster, Element nodesElement) { + private List createNodesFromNodeList(DeployState deployState, ContainerCluster cluster, Element nodesElement) { List nodes = new ArrayList<>(); int nodeIndex = 0; for (Element nodeElem: XML.getChildren(nodesElement, "node")) { - nodes.add(new ContainerServiceBuilder("container." + nodeIndex, nodeIndex).build(cluster, nodeElem)); + nodes.add(new ContainerServiceBuilder("container." + nodeIndex, nodeIndex).build(deployState, cluster, nodeElem)); nodeIndex++; } return nodes; @@ -719,13 +719,13 @@ public class ContainerModelBuilder extends ConfigModelBuilder { return new ContainerDocumentApi(cluster, documentApiOptions); } - private ContainerDocproc buildDocproc(ContainerCluster cluster, Element spec) { + private ContainerDocproc buildDocproc(DeployState deployState, ContainerCluster cluster, Element spec) { Element docprocElement = XML.getChild(spec, "document-processing"); if (docprocElement == null) return null; addIncludes(docprocElement); - DocprocChains chains = new DomDocprocChainsBuilder(null, false).build(cluster, docprocElement); + DocprocChains chains = new DomDocprocChainsBuilder(null, false).build(deployState, cluster, docprocElement); ContainerDocproc.Options docprocOptions = DocprocOptionsBuilder.build(docprocElement); return new ContainerDocproc(cluster, chains, docprocOptions, !standaloneBuilder); @@ -758,16 +758,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder { } } - public static void addConfiguredComponents(ContainerCluster cluster, Element spec, String componentName) { + public static void addConfiguredComponents(DeployState deployState, ContainerCluster cluster, Element spec, String componentName) { for (Element node : XML.getChildren(spec, componentName)) { - cluster.addComponent(new DomComponentBuilder().build(cluster, node)); + cluster.addComponent(new DomComponentBuilder().build(deployState, cluster, node)); } } - public static void validateAndAddConfiguredComponents(ContainerCluster cluster, Element spec, String componentName, Consumer elementValidator) { + public static void validateAndAddConfiguredComponents(DeployState deployState, ContainerCluster cluster, Element spec, String componentName, Consumer elementValidator) { for (Element node : XML.getChildren(spec, componentName)) { elementValidator.accept(node); // throws exception here if something is wrong - cluster.addComponent(new DomComponentBuilder().build(cluster, node)); + cluster.addComponent(new DomComponentBuilder().build(deployState, cluster, node)); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerServiceBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerServiceBuilder.java index 81dc6a5e4f9..43bc5fbfe65 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerServiceBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerServiceBuilder.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.model.container.xml; import com.yahoo.component.ComponentSpecification; import com.yahoo.config.model.ConfigModelUtils; import com.yahoo.config.model.builder.xml.XmlHelper; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; @@ -28,8 +29,8 @@ public class ContainerServiceBuilder extends VespaDomBuilder.DomConfigProducerBu } @Override - protected Container doBuild(AbstractConfigProducer parent, Element nodeElem) { - return new Container(parent, id, readServerPortOverrides(nodeElem), index); + protected Container doBuild(DeployState deployState, AbstractConfigProducer parent, Element nodeElem) { + return new Container(parent, id, readServerPortOverrides(nodeElem), index, deployState.isHosted()); } private List readServerPortOverrides(Element spec) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java index d268089e9c4..31e240b3ae3 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java @@ -307,7 +307,7 @@ public class Content extends ConfigModel { AbstractConfigProducer parent = root.getChildren().get(ContainerModel.DOCPROC_RESERVED_NAME); if (parent == null) parent = new SimpleConfigProducer(root, ContainerModel.DOCPROC_RESERVED_NAME); - ContainerCluster indexingCluster = new ContainerCluster(parent, "cluster." + indexerName, indexerName); + ContainerCluster indexingCluster = new ContainerCluster(parent, "cluster." + indexerName, indexerName, modelContext.getDeployState()); ContainerModel indexingClusterModel = new ContainerModel(modelContext.withParent(parent).withId(indexingCluster.getSubId())); indexingClusterModel.setCluster(indexingCluster); modelContext.getConfigModelRepoAdder().add(indexingClusterModel); @@ -324,7 +324,8 @@ public class Content extends ConfigModel { HostResource host = searchNode.getHostResource(); if (!processedHosts.contains(host)) { String containerName = String.valueOf(searchNode.getDistributionKey()); - Container docprocService = new Container(indexingCluster, containerName, index); + Container docprocService = new Container(indexingCluster, containerName, index, + modelContext.getDeployState().isHosted()); index++; docprocService.setBasePort(host.nextAvailableBaseport(docprocService.getPortCount())); docprocService.setHostResource(host); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java index 708c4930de1..b2291f3daa9 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java @@ -12,11 +12,26 @@ import com.yahoo.vespa.model.builder.xml.dom.ModelElement; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.content.cluster.ContentCluster; import com.yahoo.vespa.model.content.cluster.DomResourceLimitsBuilder; -import com.yahoo.vespa.model.search.*; +import com.yahoo.vespa.model.search.AbstractSearchCluster; +import com.yahoo.vespa.model.search.IndexedSearchCluster; +import com.yahoo.vespa.model.search.NodeSpec; +import com.yahoo.vespa.model.search.SearchCluster; +import com.yahoo.vespa.model.search.SearchDefinition; +import com.yahoo.vespa.model.search.SearchDefinitionXMLHandler; +import com.yahoo.vespa.model.search.SearchNode; +import com.yahoo.vespa.model.search.StreamingSearchCluster; +import com.yahoo.vespa.model.search.TransactionLogServer; +import com.yahoo.vespa.model.search.Tuning; import org.w3c.dom.Element; - -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.TreeMap; import java.util.stream.Collectors; /** @@ -28,7 +43,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot private final boolean flushOnShutdown; /** If this is set up for streaming search, it is modelled as one search cluster per search definition */ - private Map clusters = new TreeMap<>(); + private Map clusters = new TreeMap<>(); /** The single, indexed search cluster this sets up (supporting multiple document types), or null if none */ private IndexedSearchCluster indexedCluster; @@ -63,18 +78,17 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot } @Override - protected ContentSearchCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected ContentSearchCluster doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { ModelElement clusterElem = new ModelElement(producerSpec); String clusterName = ContentCluster.getClusterName(clusterElem); Boolean flushOnShutdownElem = clusterElem.childAsBoolean("engine.proton.flush-on-shutdown"); - DeployState deployState = AbstractConfigProducer.deployStateFrom(ancestor); ContentSearchCluster search = new ContentSearchCluster(ancestor, clusterName, documentDefinitions, globallyDistributedDocuments, getFlushOnShutdown(flushOnShutdownElem, deployState)); ModelElement tuning = clusterElem.getChildByPath("engine.proton.tuning"); if (tuning != null) { - search.setTuning(new DomSearchTuningBuilder().build(search, tuning.getXml())); + search.setTuning(new DomSearchTuningBuilder().build(deployState, search, tuning.getXml())); } ModelElement protonElem = clusterElem.getChildByPath("engine.proton"); if (protonElem != null) { @@ -90,7 +104,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot if (flushOnShutdownElem != null) { return flushOnShutdownElem; } - return (stateIsHosted(deployState) ? false : true); + return ! stateIsHosted(deployState); } private Double getQueryTimeout(ModelElement clusterElem) { @@ -165,7 +179,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot this.flushOnShutdown = flushOnShutdown; } - void addSearchCluster(DeployState deployState, SearchCluster cluster, Double queryTimeout, List documentDefs) { + private void addSearchCluster(DeployState deployState, SearchCluster cluster, Double queryTimeout, List documentDefs) { addSearchDefinitions(deployState, documentDefs, cluster); if (queryTimeout != null) { @@ -210,7 +224,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot return hasIndexedCluster() ? getIndexed().getSearchNodes() : nonIndexed; } - public void addSearchNode(ContentNode node, StorageGroup parentGroup, ModelElement element) { + public void addSearchNode(DeployState deployState, ContentNode node, StorageGroup parentGroup, ModelElement element) { AbstractConfigProducer parent = hasIndexedCluster() ? getIndexed() : this; NodeSpec spec = getNextSearchNodeSpec(parentGroup); @@ -218,7 +232,8 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot TransactionLogServer tls; Optional tuning = Optional.ofNullable(this.tuning); if (element == null) { - snode = SearchNode.create(parent, "" + node.getDistributionKey(), node.getDistributionKey(), spec, clusterName, node, flushOnShutdown, tuning); + snode = SearchNode.create(parent, "" + node.getDistributionKey(), node.getDistributionKey(), spec, + clusterName, node, flushOnShutdown, tuning, parentGroup.getOwner().isHostedVespa()); snode.setHostResource(node.getHostResource()); snode.initService(); @@ -226,8 +241,8 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot tls.setHostResource(snode.getHostResource()); tls.initService(); } else { - snode = new SearchNode.Builder(""+node.getDistributionKey(), spec, clusterName, node, flushOnShutdown, tuning).build(parent, element.getXml()); - tls = new TransactionLogServer.Builder(clusterName).build(snode, element.getXml()); + snode = new SearchNode.Builder(""+node.getDistributionKey(), spec, clusterName, node, flushOnShutdown, tuning).build(deployState, parent, element.getXml()); + tls = new TransactionLogServer.Builder(clusterName).build(deployState, snode, element.getXml()); } snode.setTls(tls); if (hasIndexedCluster()) { @@ -255,7 +270,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot tuning = t; } - public void setResourceLimits(ResourceLimits resourceLimits) { + private void setResourceLimits(ResourceLimits resourceLimits) { this.resourceLimits = Optional.of(resourceLimits); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/StorageGroup.java b/config-model/src/main/java/com/yahoo/vespa/model/content/StorageGroup.java index 1b5baefe4e4..98cd36c90fb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/StorageGroup.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/StorageGroup.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.content; import com.yahoo.config.model.ConfigModelContext; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.application.api.DeployLogger; @@ -202,7 +203,7 @@ public class StorageGroup { this.context = context; } - public StorageGroup buildRootGroup() { + public StorageGroup buildRootGroup(DeployState deployState) { Optional group = Optional.ofNullable(clusterElement.getChild("group")); Optional nodes = getNodes(clusterElement); @@ -213,9 +214,9 @@ public class StorageGroup { GroupBuilder groupBuilder = collectGroup(group, nodes, null, null); if (owner.isHostedVespa()) { - return groupBuilder.buildHosted(owner, Optional.empty()); + return groupBuilder.buildHosted(deployState, owner, Optional.empty()); } else { - return groupBuilder.buildNonHosted(owner, Optional.empty()); + return groupBuilder.buildNonHosted(deployState, owner, Optional.empty()); } } @@ -251,16 +252,16 @@ public class StorageGroup { * @param parent the parent storage group, or empty if this is the root group * @return the storage group build by this */ - public StorageGroup buildNonHosted(ContentCluster owner, Optional parent) { + public StorageGroup buildNonHosted(DeployState deployState, ContentCluster owner, Optional parent) { for (GroupBuilder subGroup : subGroups) { - storageGroup.subgroups.add(subGroup.buildNonHosted(owner, Optional.of(this))); + storageGroup.subgroups.add(subGroup.buildNonHosted(deployState, owner, Optional.of(this))); } for (XmlNodeBuilder nodeBuilder : nodeBuilders) { - storageGroup.nodes.add(nodeBuilder.build(owner, storageGroup)); + storageGroup.nodes.add(nodeBuilder.build(deployState, owner, storageGroup)); } if ( ! parent.isPresent() && subGroups.isEmpty() && nodeBuilders.isEmpty()) // no nodes or groups: create single node - storageGroup.nodes.add(buildSingleNode(owner)); + storageGroup.nodes.add(buildSingleNode(deployState, owner)); if ( ! parent.isPresent()) owner.redundancy().setTotalNodes(storageGroup.countNodes()); @@ -268,11 +269,11 @@ public class StorageGroup { return storageGroup; } - private StorageNode buildSingleNode(ContentCluster parent) { + private StorageNode buildSingleNode(DeployState deployState, ContentCluster parent) { int distributionKey = 0; StorageNode sNode = new StorageNode(parent.getStorageNodes(), 1.0, distributionKey , false); sNode.setHostResource(parent.getHostSystem().getHost(Container.SINGLENODE_CONTAINER_SERVICESPEC)); - PersistenceEngine provider = parent.getPersistence().create(sNode, storageGroup, null); + PersistenceEngine provider = parent.getPersistence().create(deployState, sNode, storageGroup, null); new Distributor(parent.getDistributorNodes(), distributionKey, null, provider); return sNode; } @@ -284,7 +285,7 @@ public class StorageGroup { * @param parent the parent storage group, or empty if this is the root group * @return the storage group build by this */ - public StorageGroup buildHosted(ContentCluster owner, Optional parent) { + public StorageGroup buildHosted(DeployState deployState, ContentCluster owner, Optional parent) { if (storageGroup.getIndex() != null) throw new IllegalArgumentException("Specifying individual groups is not supported on hosted applications"); Map hostMapping = @@ -310,17 +311,17 @@ public class StorageGroup { String groupIndex = String.valueOf(hostGroup.getKey().get().index()); StorageGroup subgroup = new StorageGroup(owner, groupIndex, groupIndex); for (Map.Entry host : hostGroup.getValue().entrySet()) { - subgroup.nodes.add(createStorageNode(owner, host.getKey(), subgroup, host.getValue())); + subgroup.nodes.add(createStorageNode(deployState, owner, host.getKey(), subgroup, host.getValue())); } storageGroup.subgroups.add(subgroup); } } else { // or otherwise just create the nodes directly on this group, or the explicitly enumerated subgroups for (Map.Entry host : hostMapping.entrySet()) { - storageGroup.nodes.add(createStorageNode(owner, host.getKey(), storageGroup, host.getValue())); + storageGroup.nodes.add(createStorageNode(deployState, owner, host.getKey(), storageGroup, host.getValue())); } for (GroupBuilder subGroup : subGroups) { - storageGroup.subgroups.add(subGroup.buildHosted(owner, Optional.of(this))); + storageGroup.subgroups.add(subGroup.buildHosted(deployState, owner, Optional.of(this))); } if ( ! parent.isPresent()) owner.redundancy().setTotalNodes(storageGroup.countNodes()); @@ -367,10 +368,10 @@ public class StorageGroup { this.element = element; } - public StorageNode build(ContentCluster parent, StorageGroup storageGroup) { - StorageNode sNode = new StorageNode.Builder().build(parent.getStorageNodes(), element.getXml()); - PersistenceEngine provider = parent.getPersistence().create(sNode, storageGroup, element); - new Distributor.Builder(clusterElement, provider).build(parent.getDistributorNodes(), element.getXml()); + public StorageNode build(DeployState deployState, ContentCluster parent, StorageGroup storageGroup) { + StorageNode sNode = new StorageNode.Builder().build(deployState, parent.getStorageNodes(), element.getXml()); + PersistenceEngine provider = parent.getPersistence().create(deployState, sNode, storageGroup, element); + new Distributor.Builder(clusterElement, provider).build(deployState, parent.getDistributorNodes(), element.getXml()); return sNode; } } @@ -410,7 +411,7 @@ public class StorageGroup { Optional nodeRequirement; if (nodesElement.isPresent() && nodesElement.get().getStringAttribute("count") != null ) // request these nodes nodeRequirement = Optional.of(NodesSpecification.from(nodesElement.get(), context)); - else if (! nodesElement.isPresent() && subGroups.isEmpty() && owner.getRoot().getDeployState().isHosted()) // request one node + else if (! nodesElement.isPresent() && subGroups.isEmpty() && context.getDeployState().isHosted()) // request one node nodeRequirement = Optional.of(NodesSpecification.nonDedicated(1, context)); else // Nodes or groups explicitly listed, and/opr not hosted - resolve in GroupBuilder nodeRequirement = Optional.empty(); @@ -466,13 +467,13 @@ public class StorageGroup { return subGroups; } - private static StorageNode createStorageNode(ContentCluster parent, HostResource hostResource, StorageGroup parentGroup, ClusterMembership clusterMembership) { + private static StorageNode createStorageNode(DeployState deployState, ContentCluster parent, HostResource hostResource, StorageGroup parentGroup, ClusterMembership clusterMembership) { StorageNode sNode = new StorageNode(parent.getStorageNodes(), null, clusterMembership.index(), clusterMembership.retired()); sNode.setHostResource(hostResource); sNode.initService(); // TODO: Supplying null as XML is not very nice - PersistenceEngine provider = parent.getPersistence().create(sNode, parentGroup, null); + PersistenceEngine provider = parent.getPersistence().create(deployState, sNode, parentGroup, null); Distributor d = new Distributor(parent.getDistributorNodes(), clusterMembership.index(), null, provider); d.setHostResource(sNode.getHostResource()); d.initService(); 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 699da07f159..c35bb468cbd 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 @@ -9,7 +9,6 @@ import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.Zone; -import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.vespa.config.content.MessagetyperouteselectorpolicyConfig; import com.yahoo.vespa.config.content.FleetcontrollerConfig; import com.yahoo.vespa.config.content.StorDistributionConfig; @@ -36,7 +35,18 @@ import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.ContainerModel; import com.yahoo.vespa.model.container.xml.ContainerModelBuilder; -import com.yahoo.vespa.model.content.*; +import com.yahoo.vespa.model.content.ClusterControllerConfig; +import com.yahoo.vespa.model.content.ContentSearch; +import com.yahoo.vespa.model.content.ContentSearchCluster; +import com.yahoo.vespa.model.content.DistributionBitCalculator; +import com.yahoo.vespa.model.content.DistributorCluster; +import com.yahoo.vespa.model.content.GlobalDistributionValidator; +import com.yahoo.vespa.model.content.IndexedHierarchicDistributionValidator; +import com.yahoo.vespa.model.content.Redundancy; +import com.yahoo.vespa.model.content.ReservedDocumentTypeNameValidator; +import com.yahoo.vespa.model.content.StorageGroup; +import com.yahoo.vespa.model.content.StorageNode; +import com.yahoo.vespa.model.content.TuningDispatch; import com.yahoo.vespa.model.content.engines.PersistenceEngine; import com.yahoo.vespa.model.content.engines.ProtonEngine; import com.yahoo.vespa.model.content.storagecluster.StorageCluster; @@ -45,7 +55,15 @@ import com.yahoo.vespa.model.search.MultilevelDispatchValidator; import com.yahoo.vespa.model.search.Tuning; import org.w3c.dom.Element; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; import java.util.logging.Level; import java.util.stream.Collectors; @@ -102,10 +120,10 @@ public class ContentCluster extends AbstractConfigProducer implements public ContentCluster build(Collection containers, ConfigModelContext context, Element w3cContentElement) { ModelElement contentElement = new ModelElement(w3cContentElement); - + DeployState deployState = context.getDeployState(); ModelElement documentsElement = contentElement.getChild("documents"); Map documentDefinitions = - new SearchDefinitionBuilder().build(context.getDeployState().getDocumentModel().getDocumentManager(), documentsElement); + new SearchDefinitionBuilder().build(deployState.getDocumentModel().getDocumentManager(), documentsElement); String routingSelection = new DocumentSelectionBuilder().build(documentsElement); Redundancy redundancy = new RedundancyBuilder().build(contentElement); @@ -113,13 +131,13 @@ public class ContentCluster extends AbstractConfigProducer implements ContentCluster c = new ContentCluster(context.getParentProducer(), getClusterName(contentElement), documentDefinitions, globallyDistributedDocuments, routingSelection, redundancy, - context.getDeployState().zone()); - c.clusterControllerConfig = new ClusterControllerConfig.Builder(getClusterName(contentElement), contentElement).build(c, contentElement.getXml()); - c.search = new ContentSearchCluster.Builder(documentDefinitions, globallyDistributedDocuments).build(c, contentElement.getXml()); + deployState.zone(), deployState.isHosted()); + c.clusterControllerConfig = new ClusterControllerConfig.Builder(getClusterName(contentElement), contentElement).build(deployState, c, contentElement.getXml()); + c.search = new ContentSearchCluster.Builder(documentDefinitions, globallyDistributedDocuments).build(deployState, c, contentElement.getXml()); c.persistenceFactory = new EngineFactoryBuilder().build(contentElement, c); - c.storageNodes = new StorageCluster.Builder().build(c, w3cContentElement); - c.distributorNodes = new DistributorCluster.Builder(c).build(c, w3cContentElement); - c.rootGroup = new StorageGroup.Builder(contentElement, c, context).buildRootGroup(); + c.storageNodes = new StorageCluster.Builder().build(deployState, c, w3cContentElement); + c.distributorNodes = new DistributorCluster.Builder(c).build(deployState, c, w3cContentElement); + c.rootGroup = new StorageGroup.Builder(contentElement, c, context).buildRootGroup(deployState); validateThatGroupSiblingsAreUnique(c.clusterName, c.rootGroup); redundancy.setExplicitGroups(c.getRootGroup().getNumberOfLeafGroups()); c.search.handleRedundancy(redundancy); @@ -255,7 +273,7 @@ public class ContentCluster extends AbstractConfigProducer implements } private void validateGroupSiblings(String cluster, StorageGroup group) { - HashSet siblings = new HashSet<>(); + Set siblings = new HashSet<>(); for (StorageGroup g : group.getSubgroups()) { String name = g.getName(); if (siblings.contains(name)) { @@ -299,8 +317,7 @@ public class ContentCluster extends AbstractConfigProducer implements Collection hosts = nodesSpecification.isDedicated() ? getControllerHosts(nodesSpecification, admin, clusterName, context) : drawControllerHosts(nodesSpecification.count(), rootGroup, containers); - - clusterControllers = createClusterControllers(new ClusterControllerCluster(contentCluster, "standalone"), hosts, clusterName, true); + clusterControllers = createClusterControllers(new ClusterControllerCluster(contentCluster, "standalone"), hosts, clusterName, true, context.getDeployState()); contentCluster.clusterControllers = clusterControllers; } else { @@ -310,7 +327,7 @@ public class ContentCluster extends AbstractConfigProducer implements if (hosts.size() > 1) { admin.deployLogger().log(Level.INFO, "When having content cluster(s) and more than 1 config server it is recommended to configure cluster controllers explicitly."); } - clusterControllers = createClusterControllers(admin, hosts, "cluster-controllers", false); + clusterControllers = createClusterControllers(admin, hosts, "cluster-controllers", false, context.getDeployState()); admin.setClusterControllers(clusterControllers); } } @@ -439,18 +456,17 @@ public class ContentCluster extends AbstractConfigProducer implements private ContainerCluster createClusterControllers(AbstractConfigProducer parent, Collection hosts, - String name, - boolean multitenant) { - ContainerCluster clusterControllers = new ContainerCluster(parent, - name, - name, - new ClusterControllerClusterVerifier()); + String name, boolean multitenant, + DeployState deployState) { + ContainerCluster clusterControllers = new ContainerCluster(parent, name, name, + new ClusterControllerClusterVerifier(), + deployState); List containers = new ArrayList<>(); // Add a cluster controller on each config server (there is always at least one). if (clusterControllers.getContainers().isEmpty()) { int index = 0; for (HostResource host : hosts) { - ClusterControllerContainer clusterControllerContainer = new ClusterControllerContainer(clusterControllers, index, multitenant); + ClusterControllerContainer clusterControllerContainer = new ClusterControllerContainer(clusterControllers, index, multitenant, deployState.isHosted()); clusterControllerContainer.setHostResource(host); clusterControllerContainer.initService(); clusterControllerContainer.setProp("clustertype", "admin") @@ -483,15 +499,12 @@ public class ContentCluster extends AbstractConfigProducer implements } - private ContentCluster(AbstractConfigProducer parent, - String clusterName, + private ContentCluster(AbstractConfigProducer parent, String clusterName, Map documentDefinitions, Set globallyDistributedDocuments, - String routingSelection, - Redundancy redundancy, - Zone zone) { + String routingSelection, Redundancy redundancy, Zone zone, boolean isHostedVespa) { super(parent, clusterName); - this.isHostedVespa = stateIsHosted(deployStateFrom(parent)); + this.isHostedVespa = isHostedVespa; this.clusterName = clusterName; this.documentDefinitions = documentDefinitions; this.globallyDistributedDocuments = globallyDistributedDocuments; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/engines/DummyPersistence.java b/config-model/src/main/java/com/yahoo/vespa/model/content/engines/DummyPersistence.java index 5b45e21d47e..e68ee938846 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/engines/DummyPersistence.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/engines/DummyPersistence.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.content.engines; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.core.StorServerConfig; import com.yahoo.vespa.model.builder.xml.dom.ModelElement; import com.yahoo.vespa.model.content.StorageGroup; @@ -20,7 +21,7 @@ public class DummyPersistence extends PersistenceEngine { public static class Factory implements PersistenceFactory { @Override - public PersistenceEngine create(StorageNode storageNode, StorageGroup parentGroup, ModelElement storageNodeElement) { + public PersistenceEngine create(DeployState deployState, StorageNode storageNode, StorageGroup parentGroup, ModelElement storageNodeElement) { return new DummyPersistence(storageNode); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/engines/PersistenceEngine.java b/config-model/src/main/java/com/yahoo/vespa/model/content/engines/PersistenceEngine.java index a39b9e9c7e3..d063d52f8cd 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/engines/PersistenceEngine.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/engines/PersistenceEngine.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.content.engines; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.core.StorServerConfig; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.ModelElement; @@ -19,7 +20,7 @@ public abstract class PersistenceEngine extends AbstractConfigProducer implement */ public interface PersistenceFactory { - PersistenceEngine create(StorageNode storageNode, StorageGroup parentGroup, ModelElement storageNodeElement); + PersistenceEngine create(DeployState deployState, StorageNode storageNode, StorageGroup parentGroup, ModelElement storageNodeElement); /** * If a write request succeeds on some nodes and fails on others, causing request to diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/engines/ProtonEngine.java b/config-model/src/main/java/com/yahoo/vespa/model/content/engines/ProtonEngine.java index df8cfc6f9bd..2a81ad79775 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/engines/ProtonEngine.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/engines/ProtonEngine.java @@ -1,12 +1,12 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.content.engines; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.model.builder.xml.dom.ModelElement; import com.yahoo.vespa.model.content.ContentSearchCluster; import com.yahoo.vespa.model.content.StorageGroup; import com.yahoo.vespa.model.content.StorageNode; import com.yahoo.vespa.model.content.cluster.ContentCluster; -import com.yahoo.vespa.model.search.SearchNode; /** * Initializes the engines engine on each storage node. May include creating other @@ -21,8 +21,8 @@ public class ProtonEngine { } @Override - public PersistenceEngine create(StorageNode storageNode, StorageGroup parentGroup, ModelElement storageNodeElement) { - search.addSearchNode(storageNode, parentGroup, storageNodeElement); + public PersistenceEngine create(DeployState deployState, StorageNode storageNode, StorageGroup parentGroup, ModelElement storageNodeElement) { + search.addSearchNode(deployState, storageNode, parentGroup, storageNodeElement); return new ProtonProvider(storageNode); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/generic/GenericServicesBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/generic/GenericServicesBuilder.java index 61ede0ed022..d2ce702c826 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/generic/GenericServicesBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/generic/GenericServicesBuilder.java @@ -26,8 +26,8 @@ public class GenericServicesBuilder extends ConfigModelBuilder> map = service.getChildren(); // Add only non-conflicting modules. Does not merge unspecified configs that are specified in root though. if (!map.containsKey(subServiceName)) - new DomModuleBuilder(subServiceName).build(service, subServiceSpec); + new DomModuleBuilder(subServiceName).build(deployState, service, subServiceSpec); } nodeIndex++; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java index b0767ce0987..5dcf60e5fac 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java @@ -81,8 +81,9 @@ public class SearchNode extends AbstractService implements } @Override - protected SearchNode doBuild(AbstractConfigProducer ancestor, Element producerSpec) { - return new SearchNode(ancestor, name, contentNode.getDistributionKey(), nodeSpec, clusterName, contentNode, flushOnShutdown, tuning); + protected SearchNode doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { + return new SearchNode(ancestor, name, contentNode.getDistributionKey(), nodeSpec, clusterName, contentNode, + flushOnShutdown, tuning, deployState.isHosted()); } } @@ -90,21 +91,25 @@ public class SearchNode extends AbstractService implements * Creates a SearchNode in elastic mode. */ public static SearchNode create(AbstractConfigProducer parent, String name, int distributionKey, NodeSpec nodeSpec, - String clusterName, AbstractService serviceLayerService, boolean flushOnShutdown, Optional tuning) { - return new SearchNode(parent, name, distributionKey, nodeSpec, clusterName, serviceLayerService, flushOnShutdown, tuning); + String clusterName, AbstractService serviceLayerService, boolean flushOnShutdown, + Optional tuning, boolean isHostedVespa) { + return new SearchNode(parent, name, distributionKey, nodeSpec, clusterName, serviceLayerService, + flushOnShutdown, tuning, isHostedVespa); } private SearchNode(AbstractConfigProducer parent, String name, int distributionKey, NodeSpec nodeSpec, - String clusterName, AbstractService serviceLayerService, boolean flushOnShutdown, Optional tuning) { - this(parent, name, nodeSpec, clusterName, flushOnShutdown, tuning); + String clusterName, AbstractService serviceLayerService, boolean flushOnShutdown, + Optional tuning, boolean isHostedVespa) { + this(parent, name, nodeSpec, clusterName, flushOnShutdown, tuning, isHostedVespa); this.distributionKey = distributionKey; this.serviceLayerService = serviceLayerService; setPropertiesElastic(clusterName, distributionKey); } - private SearchNode(AbstractConfigProducer parent, String name, NodeSpec nodeSpec, String clusterName, boolean flushOnShutdown, Optional tuning) { + private SearchNode(AbstractConfigProducer parent, String name, NodeSpec nodeSpec, String clusterName, + boolean flushOnShutdown, Optional tuning, boolean isHostedVespa) { super(parent, name); - this.isHostedVespa = stateIsHosted(deployStateFrom(parent)); + this.isHostedVespa = isHostedVespa; this.nodeSpec = nodeSpec; this.clusterName = clusterName; this.flushOnShutdown = flushOnShutdown; diff --git a/config-model/src/test/java/com/yahoo/config/model/ConfigModelContextTest.java b/config-model/src/test/java/com/yahoo/config/model/ConfigModelContextTest.java index cb51cf23830..3b4d51e1b57 100644 --- a/config-model/src/test/java/com/yahoo/config/model/ConfigModelContextTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/ConfigModelContextTest.java @@ -20,7 +20,7 @@ public class ConfigModelContextTest { @Test public void testConfigModelContext() { - AbstractConfigProducer root = new MockRoot(); + MockRoot root = new MockRoot(); String id = "foobar"; ApplicationPackage pkg = new MockApplicationPackage.Builder() .withServices("") @@ -32,7 +32,7 @@ public class ConfigModelContextTest { assertThat(ctx.getProducerId(), is(id)); assertThat(ctx.getParentProducer(), is(root)); assertThat(ctx.getDeployLogger(), is(logger)); - ctx = ConfigModelContext.create(null, null, root, id); + ctx = ConfigModelContext.create(root.getDeployState(), null, null, root, id); assertThat(ctx.getProducerId(), is(id)); assertThat(ctx.getParentProducer(), is(root)); AbstractConfigProducer newRoot = new MockRoot("bar"); diff --git a/config-model/src/test/java/com/yahoo/config/model/graph/ModelGraphTest.java b/config-model/src/test/java/com/yahoo/config/model/graph/ModelGraphTest.java index 000722756c5..8dae880a9dc 100644 --- a/config-model/src/test/java/com/yahoo/config/model/graph/ModelGraphTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/graph/ModelGraphTest.java @@ -1,7 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.model.graph; -import com.yahoo.config.model.ConfigModel; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.test.MockRoot; import org.junit.Rule; @@ -9,7 +8,6 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.List; -import java.util.Optional; import static org.hamcrest.Matchers.is; import static org.junit.Assert.*; @@ -64,10 +62,10 @@ public class ModelGraphTest { ModelGraph graph = new ModelGraphBuilder().addBuilder(new GraphMock.BC()).addBuilder(new GraphMock.BB()).addBuilder(new GraphMock.BA()).build(); List nodes = graph.topologicalSort(); MockRoot root = new MockRoot(); - GraphMock.A a = (GraphMock.A) nodes.get(0).createModel(ConfigModelContext.create(null, null, root, "first")); - GraphMock.B b = (GraphMock.B) nodes.get(1).createModel(ConfigModelContext.create(null, null, root, "second")); - GraphMock.B b2 = (GraphMock.B) nodes.get(1).createModel(ConfigModelContext.create(null, null, root, "second2")); - GraphMock.C c = (GraphMock.C) nodes.get(2).createModel(ConfigModelContext.create(null, null, root, "third")); + GraphMock.A a = (GraphMock.A) nodes.get(0).createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "first")); + GraphMock.B b = (GraphMock.B) nodes.get(1).createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "second")); + GraphMock.B b2 = (GraphMock.B) nodes.get(1).createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "second2")); + GraphMock.C c = (GraphMock.C) nodes.get(2).createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "third")); assertNotNull(a); assertNotNull(b); assertNotNull(b2); @@ -91,7 +89,8 @@ public class ModelGraphTest { expectedEx.expect(IllegalArgumentException.class); expectedEx.expectMessage("Constructor for " + GraphMock.Bad.class.getName() + " must have as its first argument a " + ConfigModelContext.class.getName()); ModelNode node = new ModelNode(new GraphMock.Bad.Builder()); - node.createModel(ConfigModelContext.create(null, null, new MockRoot(), "foo")); + MockRoot root = new MockRoot(); + node.createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "foo")); } @Test @@ -99,7 +98,8 @@ public class ModelGraphTest { expectedEx.expect(IllegalArgumentException.class); expectedEx.expectMessage("Unable to find constructor argument class java.lang.String for com.yahoo.config.model.graph.GraphMock$Bad2"); ModelNode node = new ModelNode(new GraphMock.Bad2.Builder()); - node.createModel(ConfigModelContext.create(null, null, new MockRoot(), "foo")); + MockRoot root = new MockRoot(); + node.createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "foo")); } @Test @@ -107,8 +107,8 @@ public class ModelGraphTest { ModelGraph graph = new ModelGraphBuilder().addBuilder(new GraphMock.BC()).addBuilder(new GraphMock.BA()).build(); List nodes = graph.topologicalSort(); MockRoot root = new MockRoot(); - GraphMock.A a = (GraphMock.A) nodes.get(0).createModel(ConfigModelContext.create(null, null, root, "first")); - GraphMock.C c = (GraphMock.C) nodes.get(1).createModel(ConfigModelContext.create(null, null, root, "second")); + GraphMock.A a = (GraphMock.A) nodes.get(0).createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "first")); + GraphMock.C c = (GraphMock.C) nodes.get(1).createModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "second")); assertThat(c.a, is(a)); assertTrue(c.b.isEmpty()); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2BuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2BuilderTest.java index 7402d75dbb0..38c7547c625 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2BuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2BuilderTest.java @@ -5,6 +5,7 @@ import com.yahoo.cloud.config.log.LogdConfig; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.builder.xml.test.DomBuilderTest; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.test.MockRoot; import com.yahoo.text.XML; import com.yahoo.vespa.model.admin.*; @@ -206,12 +207,13 @@ public class DomAdminV2BuilderTest extends DomBuilderTest { } private Admin buildAdmin(Element xml, boolean multitenant, List configServerSpecs) { + DeployState deployState = DeployState.createTestState(); final DomAdminV2Builder domAdminBuilder = new DomAdminV2Builder(ConfigModelContext.ApplicationType.DEFAULT, - root.getDeployState().getFileRegistry(), multitenant, + deployState.getFileRegistry(), multitenant, configServerSpecs); - Admin admin = domAdminBuilder.build(root, xml); - admin.addPerHostServices(root.getHostSystem().getHosts(), root.getDeployState()); + Admin admin = domAdminBuilder.build(deployState, root, xml); + admin.addPerHostServices(root.getHostSystem().getHosts(), deployState); return admin; } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilderTest.java index 08fa820a830..25f611cc9b7 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomComponentBuilderTest.java @@ -19,7 +19,7 @@ public class DomComponentBuilderTest extends DomBuilderTest { @Test public void ensureCorrectModel() { - Component handler = new DomComponentBuilder().doBuild(root, parse( + Component handler = new DomComponentBuilder().doBuild(root.getDeployState(), root, parse( "")); BundleInstantiationSpecification instantiationSpecification = handler.model.bundleInstantiationSpec; @@ -31,7 +31,7 @@ public class DomComponentBuilderTest extends DomBuilderTest { @Test @SuppressWarnings("unchecked") public void components_can_be_nested() { - Component, ?> parent = new DomComponentBuilder().doBuild(root, parse( + Component, ?> parent = new DomComponentBuilder().doBuild(root.getDeployState(), root, parse( "", " ", "")); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilderTest.java index 0126c58eec5..2ccf048df92 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilderTest.java @@ -39,7 +39,7 @@ public class DomSearchTuningBuilderTest extends DomBuilderTest { private Tuning createTuning(Element xml) { DomSearchTuningBuilder b = new DomSearchTuningBuilder(); - return b.build(root, xml); + return b.build(root.getDeployState(), root, xml); } String getProtonCfg(Tuning tuning) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilderTest.java index 93efadba451..810d915aa59 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomFederationSearcherBuilderTest.java @@ -27,7 +27,7 @@ public class DomFederationSearcherBuilderTest extends DomBuilderTest { @Test public void ensureCorrectModel() { - FederationSearcher searcher = new DomFederationSearcherBuilder().doBuild(root, parse( + FederationSearcher searcher = new DomFederationSearcherBuilder().doBuild(root.getDeployState(), root, parse( "", " p2", " ", @@ -59,7 +59,7 @@ public class DomFederationSearcherBuilderTest extends DomBuilderTest { @Test public void require_that_target_selector_can_be_configured() { - FederationSearcher searcher = new DomFederationSearcherBuilder().doBuild(root, parse( + FederationSearcher searcher = new DomFederationSearcherBuilder().doBuild(root.getDeployState(), root, parse( "", " ", "")); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilderTest.java index 9796ee91983..7dc0f881b33 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomProviderBuilderTest.java @@ -58,7 +58,7 @@ public class DomProviderBuilderTest extends DomBuilderTest { @Test public void testCertificateConfig_noProxy() { - provider = new DomProviderBuilder(new HashMap()).doBuild(root, noProxy); + provider = new DomProviderBuilder(new HashMap()).doBuild(root.getDeployState(), root, noProxy); ChainedComponent providerSearcher = provider.getInnerComponents().iterator().next(); assertThat(providerSearcher, instanceOf(HttpProviderSearcher.class)); @@ -72,7 +72,7 @@ public class DomProviderBuilderTest extends DomBuilderTest { @Test public void testCertificatewConfig_defaultProxy() { - provider = new DomProviderBuilder(new HashMap()).doBuild(root, defaultProxy); + provider = new DomProviderBuilder(new HashMap()).doBuild(root.getDeployState(), root, defaultProxy); ProviderConfig.Builder providerBuilder = new ProviderConfig.Builder(); ((HttpProvider)provider).getConfig(providerBuilder); @@ -86,7 +86,7 @@ public class DomProviderBuilderTest extends DomBuilderTest { @Test public void testCertificateConfig_proprietaryProxy() { - provider = new DomProviderBuilder(new HashMap()).doBuild(root, proprietaryProxy); + provider = new DomProviderBuilder(new HashMap()).doBuild(root.getDeployState(), root, proprietaryProxy); ProviderConfig.Builder providerBuilder = new ProviderConfig.Builder(); ((HttpProvider)provider).getConfig(providerBuilder); @@ -101,7 +101,7 @@ public class DomProviderBuilderTest extends DomBuilderTest { @Test public void testFail_ycaProxyWithoutId() { try { - provider = new DomProviderBuilder(new HashMap()).doBuild(root, illegal_proxyWithoutId); + provider = new DomProviderBuilder(new HashMap()).doBuild(root.getDeployState(), root, illegal_proxyWithoutId); fail("Expected exception upon illegal xml."); } catch (IllegalArgumentException e) { assertThat(e.getMessage(), is("Provider 'yca-provider' must have a certificate application ID, since a certificate store proxy is given")); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilderTest.java index a13f9252e5f..cc139913536 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearchChainsBuilderTest.java @@ -69,7 +69,7 @@ public class DomSearchChainsBuilderTest extends DomBuilderTest { @Before public void createSearchChains() { - searchChains = new DomSearchChainsBuilder().build(root, element); + searchChains = new DomSearchChainsBuilder().build(root.getDeployState(), root, element); } @Test @@ -88,7 +88,8 @@ public class DomSearchChainsBuilderTest extends DomBuilderTest { ""); try { - new DomSearchChainsBuilder().build(new MockRoot(), element); + MockRoot root = new MockRoot(); + new DomSearchChainsBuilder().build(root.getDeployState(), root, element); fail("Expected exception when referring to an outer 'federation' as a 'searcher'."); } catch (RuntimeException e) { assertThat(e.getMessage(), containsString("Two different types declared for the component with name 'federationSearcher'")); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java index 756a0c53485..1918b8afb8f 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java @@ -4,10 +4,8 @@ package com.yahoo.vespa.model.container; import com.yahoo.cloud.config.ClusterInfoConfig; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.cloud.config.RoutingProviderConfig; -import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.model.deploy.DeployProperties; import com.yahoo.config.model.deploy.DeployState; -import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.model.test.MockRoot; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; @@ -16,7 +14,6 @@ import com.yahoo.config.provision.Zone; import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.container.jdisc.config.MetricDefaultsConfig; import com.yahoo.search.config.QrStartConfig; -import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.vespa.model.Host; import com.yahoo.vespa.model.HostResource; import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerClusterVerifier; @@ -81,7 +78,7 @@ public class ContainerClusterTest { .zone(new Zone(SystemName.cd, Environment.test, RegionName.from("some-region"))) .build(); MockRoot root = new MockRoot("foo", state); - ContainerCluster cluster = new ContainerCluster(root, "container0", "container1"); + ContainerCluster cluster = new ContainerCluster(root, "container0", "container1", state); ConfigserverConfig.Builder builder = new ConfigserverConfig.Builder(); cluster.getConfig(builder); ConfigserverConfig config = new ConfigserverConfig(builder); @@ -112,8 +109,8 @@ public class ContainerClusterTest { MockRoot root = new MockRoot("foo", state); ContainerCluster cluster = extraComponents.isPresent() - ? new ContainerCluster(root, "container0", "container1", extraComponents.get()) - : new ContainerCluster(root, "container0", "container1"); + ? new ContainerCluster(root, "container0", "container1", extraComponents.get(), state) + : new ContainerCluster(root, "container0", "container1", state); if (isCombinedCluster) cluster.setHostClusterId("test-content-cluster"); cluster.setMemoryPercentage(memoryPercentage); @@ -258,7 +255,7 @@ public class ContainerClusterTest { public void requireThatRoutingProviderIsDisabledForNonHosted() { DeployState state = new DeployState.Builder().properties(new DeployProperties.Builder().hostedVespa(false).build()).build(); MockRoot root = new MockRoot("foo", state); - ContainerCluster cluster = new ContainerCluster(root, "container0", "container1"); + ContainerCluster cluster = new ContainerCluster(root, "container0", "container1", state); RoutingProviderConfig.Builder builder = new RoutingProviderConfig.Builder(); cluster.getConfig(builder); RoutingProviderConfig config = new RoutingProviderConfig(builder); @@ -268,21 +265,21 @@ public class ContainerClusterTest { private static void addContainer(ContainerCluster cluster, String name, String hostName) { - Container container = new Container(cluster, name, 0); + Container container = new Container(cluster, name, 0, cluster.isHostedVespa()); container.setHostResource(new HostResource(new Host(null, hostName))); container.initService(); cluster.addContainer(container); } private static void addClusterController(ContainerCluster cluster, String hostName) { - Container container = new ClusterControllerContainer(cluster, 1, false); + Container container = new ClusterControllerContainer(cluster, 1, false, cluster.isHostedVespa()); container.setHostResource(new HostResource(new Host(null, hostName))); container.initService(); cluster.addContainer(container); } private static ContainerCluster newContainerCluster() { - ContainerCluster cluster = new ContainerCluster(null, "subId", "name"); + ContainerCluster cluster = new ContainerCluster(null, "subId", "name", DeployState.createTestState()); addContainer(cluster, "c1", "host-c1"); addContainer(cluster, "c2", "host-c2"); return cluster; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterBindingsTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterBindingsTest.java index 9d5508cca75..643e65ffc61 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterBindingsTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterBindingsTest.java @@ -30,7 +30,7 @@ public class FilterBindingsTest extends DomBuilderTest { private static final String MY_CHAIN_BINDING = "http://*/my-chain-binding"; private Http buildHttp(Element xml) throws Exception { - Http http = new HttpBuilder().build(root, xml); + Http http = new HttpBuilder().build(root.getDeployState(), root, xml); root.freezeModelTopology(); http.validate(); return http; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterChainsTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterChainsTest.java index 26b9f025dba..95d952c6f2b 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterChainsTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterChainsTest.java @@ -24,7 +24,7 @@ public class FilterChainsTest extends DomBuilderTest { @Before public void setupFilterChains() { - http = new HttpBuilder().build(root, servicesXml()); + http = new HttpBuilder().build(root.getDeployState(), root, servicesXml()); root.freezeModelTopology(); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterConfigTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterConfigTest.java index 346afe92ead..88ee99b1a90 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterConfigTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/http/FilterConfigTest.java @@ -26,7 +26,7 @@ public class FilterConfigTest extends DomBuilderTest { @Before public void setupFilterChains() { - http = new HttpBuilder().build(root, servicesXml()); + http = new HttpBuilder().build(root.getDeployState(), root, servicesXml()); root.freezeModelTopology(); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/processing/test/ProcessingChainsTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/processing/test/ProcessingChainsTest.java index 36425aabaf0..d46f2a5e35f 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/processing/test/ProcessingChainsTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/processing/test/ProcessingChainsTest.java @@ -26,7 +26,7 @@ public class ProcessingChainsTest extends DomBuilderTest { @Before public void setupProcessingChains() { DomProcessingBuilder processingBuilder = new DomProcessingBuilder(null); - processingBuilder.build(root, servicesXml()); + processingBuilder.build(root.getDeployState(), root, servicesXml()); processingChains = (Chains)root.getChildren().get("processing"); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java b/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java index b4c9bd4d06f..9122e855461 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTest2.java @@ -33,7 +33,8 @@ public class SearchChainsTest2 { " ", ""); try { - SearchChains chains = new DomSearchChainsBuilder().build(new MockRoot(), searchElem); + MockRoot root = new MockRoot(); + SearchChains chains = new DomSearchChainsBuilder().build(root.getDeployState(), root, searchElem); chains.validate(); fail("Expected exception when inheriting a nonexistent search chain."); } catch (Exception e) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTestBase.java b/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTestBase.java index 91d2ffea4b8..9f7cbfd9a5b 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTestBase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/search/searchchain/SearchChainsTestBase.java @@ -15,7 +15,7 @@ public abstract class SearchChainsTestBase extends DomBuilderTest { @Before public void setupSearchChains() { - SearchChains searchChains = new DomSearchChainsBuilder().build(root, servicesXml()); + SearchChains searchChains = new DomSearchChainsBuilder().build(root.getDeployState(), root, servicesXml()); searchChains.initialize(MockSearchClusters.twoMockClusterSpecsByName(root), new BinaryScaledAmount(100, BinaryPrefix.mega)); root.freezeModelTopology(); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/AccessControlTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/AccessControlTest.java index c734addb8ce..52029d4c434 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/AccessControlTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/AccessControlTest.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.model.container.xml; import com.google.common.collect.ImmutableSet; import com.yahoo.collections.CollectionUtil; import com.yahoo.config.model.builder.xml.test.DomBuilderTest; -import com.yahoo.config.model.test.TestUtil; import com.yahoo.container.jdisc.state.StateHandler; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.http.AccessControl; @@ -61,7 +60,7 @@ public class AccessControlTest extends ContainerModelBuilderTestBase { " ", " "); - Http http = new HttpBuilder().build(root, clusterElem); + Http http = new HttpBuilder().build(root.getDeployState(), root, clusterElem); root.freezeModelTopology(); assertTrue(http.getFilterChains().hasChain(AccessControl.ACCESS_CONTROL_CHAIN_ID)); @@ -79,7 +78,7 @@ public class AccessControlTest extends ContainerModelBuilderTestBase { " ", " "); - Http http = new HttpBuilder().build(root, clusterElem); + Http http = new HttpBuilder().build(root.getDeployState(), root, clusterElem); root.freezeModelTopology(); AccessControl accessControl = http.getAccessControl().get(); @@ -97,7 +96,7 @@ public class AccessControlTest extends ContainerModelBuilderTestBase { " ", " "); - Http http = new HttpBuilder().build(root, clusterElem); + Http http = new HttpBuilder().build(root.getDeployState(), root, clusterElem); root.freezeModelTopology(); assertFalse("Wrong default value for read.", http.getAccessControl().get().readEnabled); @@ -113,7 +112,7 @@ public class AccessControlTest extends ContainerModelBuilderTestBase { " ", " "); - Http http = new HttpBuilder().build(root, clusterElem); + Http http = new HttpBuilder().build(root.getDeployState(), root, clusterElem); root.freezeModelTopology(); assertTrue("Given read value not honoured.", http.getAccessControl().get().readEnabled); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java index 419ee613a45..41fb4a3d35b 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java @@ -13,7 +13,8 @@ import static org.junit.Assert.assertEquals; public class FleetControllerClusterTest { ClusterControllerConfig parse(String xml) { Document doc = XML.getDocument(xml); - return new ClusterControllerConfig.Builder("storage", new ModelElement(doc.getDocumentElement())).build(new MockRoot(), + MockRoot root = new MockRoot(); + return new ClusterControllerConfig.Builder("storage", new ModelElement(doc.getDocumentElement())).build(root.getDeployState(), root, new ModelElement(doc.getDocumentElement()).getXml()); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java b/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java index 89d81ee262b..fd97bf1f7b2 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java @@ -59,9 +59,12 @@ public class ContentClusterUtils { public static ContentCluster createCluster(String clusterXml, MockRoot root) { Document doc = XML.getDocument(clusterXml); - Admin admin = new Admin(root, new DefaultMonitoring("vespa", 60), new Metrics(), Collections.emptyMap(), false, - new FileDistributionConfigProducer(root, new MockFileRegistry(), null)); - ConfigModelContext context = ConfigModelContext.create(null, root.getDeployState(), null,null, root, null); + Admin admin = new Admin(root, new DefaultMonitoring("vespa", 60), new Metrics(), + Collections.emptyMap(), false, + new FileDistributionConfigProducer(root, new MockFileRegistry(), null), + root.getDeployState().isHosted()); + ConfigModelContext context = ConfigModelContext.create(null, root.getDeployState(), + null,null, root, null); return new ContentCluster.Builder(admin).build(Collections.emptyList(), context, doc.getDocumentElement()); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/generic/GenericServicesModelTest.java b/config-model/src/test/java/com/yahoo/vespa/model/generic/GenericServicesModelTest.java index 11d06666eb1..5b03d33e568 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/generic/GenericServicesModelTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/generic/GenericServicesModelTest.java @@ -11,7 +11,6 @@ import org.junit.Test; import org.xml.sax.SAXException; import java.io.IOException; -import java.util.Optional; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -32,7 +31,7 @@ public class GenericServicesModelTest { @Test public void test_generic_services_model() { MockRoot root = new MockRoot(); - GenericServicesModel model = new GenericServicesModel(ConfigModelContext.create(null, null, root, "foo")); + GenericServicesModel model = new GenericServicesModel(ConfigModelContext.create(root.getDeployState(), null, null, root, "foo")); assertThat(model.serviceClusters().size(), is(0)); model.addCluster(new ServiceCluster(root, "mycluster", "/bin/foo")); assertThat(model.serviceClusters().size(), is(1)); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/MultilevelDispatchTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/MultilevelDispatchTest.java index ff611d4ad0c..84f414a3bae 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/MultilevelDispatchTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/MultilevelDispatchTest.java @@ -290,7 +290,7 @@ public class MultilevelDispatchTest { List searchNodes = new ArrayList<>(); MockRoot root = new MockRoot(""); for (int i = 0; i < numNodes; ++i) { - searchNodes.add(SearchNode.create(root, "mynode" + i, i, new NodeSpec(0, i), "mycluster", null, false, Optional.empty())); + searchNodes.add(SearchNode.create(root, "mynode" + i, i, new NodeSpec(0, i), "mycluster", null, false, Optional.empty(), root.getDeployState().isHosted())); } return searchNodes; } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java index 66cad9195e4..715676f712c 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java @@ -47,14 +47,15 @@ public class SearchNodeTest { root.freezeModelTopology(); } - private static SearchNode createSearchNode(AbstractConfigProducer parent, String name, int distributionKey, NodeSpec nodeSpec, boolean flushOnShutDown) { - return SearchNode.create(parent, name, distributionKey, nodeSpec, "mycluster", null, flushOnShutDown, Optional.empty()); + private static SearchNode createSearchNode(AbstractConfigProducer parent, String name, int distributionKey, + NodeSpec nodeSpec, boolean flushOnShutDown, boolean isHosted) { + return SearchNode.create(parent, name, distributionKey, nodeSpec, "mycluster", null, flushOnShutDown, Optional.empty(), isHosted); } @Test public void requireThatBasedirIsCorrectForElasticMode() { MockRoot root = new MockRoot(""); - SearchNode node = createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), false); + SearchNode node = createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), false, root.getDeployState().isHosted()); prepare(root, node); assertBaseDir(Defaults.getDefaults().underVespaHome("var/db/vespa/search/cluster.mycluster/n3"), node); } @@ -62,7 +63,7 @@ public class SearchNodeTest { @Test public void requireThatPreShutdownCommandIsEmptyWhenNotActivated() { MockRoot root = new MockRoot(""); - SearchNode node = createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), false); + SearchNode node = createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), false, root.getDeployState().isHosted()); node.setHostResource(new HostResource(new Host(node, "mynbode"))); node.initService(); assertFalse(node.getPreShutdownCommand().isPresent()); @@ -71,7 +72,7 @@ public class SearchNodeTest { @Test public void requireThatPreShutdownCommandUsesPrepareRestartWhenActivated() { MockRoot root = new MockRoot(""); - SearchNode node = createSearchNode(root, "mynode2", 4, new NodeSpec(7, 5), true); + SearchNode node = createSearchNode(root, "mynode2", 4, new NodeSpec(7, 5), true, root.getDeployState().isHosted()); node.setHostResource(new HostResource(new Host(node, "mynbode2"))); node.initService(); assertTrue(node.getPreShutdownCommand().isPresent()); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/ApiConfigModel.java b/config-model/src/test/java/com/yahoo/vespa/model/test/ApiConfigModel.java index 5c243fc7e72..c00ef7d8469 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/ApiConfigModel.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/ApiConfigModel.java @@ -54,12 +54,11 @@ public class ApiConfigModel extends ConfigModel { } @Override - public void doBuild(ApiConfigModel configModel, Element spec, ConfigModelContext modelContext) { + public void doBuild(ApiConfigModel configModel, Element spec, ConfigModelContext context) { NodeList pl = spec.getElementsByTagName("apiservice"); if (pl.getLength() > 0) { for (int i=0; i < pl.getLength(); i++) { - configModel.apiServices.add(new DomTestServiceBuilder.ApiServiceBuilder(i).build(modelContext.getParentProducer(), - (Element) pl.item(i))); + configModel.apiServices.add(new DomTestServiceBuilder.ApiServiceBuilder(i).build(context.getDeployState(), context.getParentProducer(), (Element) pl.item(i))); } } } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleConfigModel.java b/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleConfigModel.java index 0a1997cc3b6..8fe808582eb 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleConfigModel.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleConfigModel.java @@ -47,7 +47,7 @@ public class SimpleConfigModel extends ConfigModel implements TestApi { } @Override - public void doBuild(SimpleConfigModel configModel, Element spec, ConfigModelContext modelContext) { + public void doBuild(SimpleConfigModel configModel, Element spec, ConfigModelContext context) { int s,p; s=p=0; // Validate the services given in the config @@ -62,11 +62,11 @@ public class SimpleConfigModel extends ConfigModel implements TestApi { String service = e.getTagName(); if (service.equals("simpleservice")) { - configModel.simpleServices.add(new DomTestServiceBuilder.SimpleServiceBuilder(s).build(modelContext.getParentProducer(), e)); + configModel.simpleServices.add(new DomTestServiceBuilder.SimpleServiceBuilder(s).build(context.getDeployState(), context.getParentProducer(), e)); s++; } else if (service.equals("parentservice")) { - configModel.parentServices.add(new DomTestServiceBuilder.ParentServiceBuilder(p).build(modelContext.getParentProducer(), e)); + configModel.parentServices.add(new DomTestServiceBuilder.ParentServiceBuilder(p).build(context.getDeployState(), context.getParentProducer(), e)); p++; } else { -- cgit v1.2.3