diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-10-04 15:31:17 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-04 15:31:17 +0200 |
commit | 883291ae26588cbfab6b8f6aeea9375dee83ca7b (patch) | |
tree | 96ad10e1ff9b7da4ff55b2941c7791f137405cf9 /config-model | |
parent | 52d9e1b1cfc4c920a8fd83d064c18aeefddfadd1 (diff) | |
parent | 16d5f6b46dc8f2f0c899cab07cf23be6f767fcb1 (diff) |
Merge pull request #7196 from vespa-engine/revert-7195-revert-7190-balder/reduce-usage-of-complex-deploystate
Revert "Revert "Balder/reduce usage of complex deploystate""
Diffstat (limited to 'config-model')
107 files changed, 695 insertions, 631 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java b/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java index 7a5969585e9..da79e34b3ad 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java +++ b/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java @@ -2,6 +2,7 @@ package com.yahoo.config.model; import com.yahoo.cloud.config.*; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Version; import com.yahoo.vespa.config.content.LoadTypeConfig; @@ -125,11 +126,11 @@ public class ApplicationConfigProducerRoot extends AbstractConfigProducer<Abstra } // TODO: Do this as another config model depending on the other models - public void setupRouting(VespaModel vespaModel, ConfigModelRepo configModels) { + public void setupRouting(DeployState deployState, VespaModel vespaModel, ConfigModelRepo configModels) { if (admin != null) { Routing routing = configModels.getRouting(); if (routing == null) { - routing = new Routing(ConfigModelContext.create(vespaModel, configModels, this, "routing")); + routing = new Routing(ConfigModelContext.create(deployState, vespaModel, configModels, this, "routing")); configModels.add(routing); } this.routing = routing; diff --git a/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java b/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java index 385cd883da4..b4a5a865b9e 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java +++ b/config-model/src/main/java/com/yahoo/config/model/ConfigModel.java @@ -1,6 +1,8 @@ // 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; +import com.yahoo.config.model.deploy.DeployState; + /** * A config model is an abstract representation of a subsystem, which is used * by the builder of that subsystem to derive a config producer tree for the subsystem, and by other @@ -52,7 +54,7 @@ public abstract class ConfigModel { * * @param configModelRepo The ConfigModelRepo of the system model */ - public void prepare(ConfigModelRepo configModelRepo) { return; } + public void prepare(ConfigModelRepo configModelRepo, DeployState deployState) { return; } /** * <p>Returns whether this model must be maintained in memory for serving config requests. 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 @@ -64,18 +64,6 @@ public final class ConfigModelContext { /** * 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. * * @param deployState the global deploy state for this model * @param parent the parent to be used for the config model diff --git a/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java b/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java index 60089f04572..f14a1ea3c2c 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java +++ b/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java @@ -215,9 +215,9 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter * Initialize part 2.: * Prepare all config models for starting. Must be called after plugins are loaded and frozen. */ - public void prepareConfigModels() { + public void prepareConfigModels(DeployState deployState) { for (ConfigModel model : configModels) { - model.prepare(ConfigModelRepo.this); + model.prepare(this, deployState); } } 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 8fff69e11a6..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 @@ -9,6 +9,7 @@ import com.yahoo.config.model.ApplicationConfigProducerRoot; import com.yahoo.config.model.deploy.DeployProperties; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.admin.Admin; import com.yahoo.vespa.model.builder.xml.dom.DomAdminV2Builder; @@ -44,12 +45,12 @@ public class AdminModel extends ConfigModel { private Collection<ContainerModel> getContainerModels() { return containerModels; } @Override - public void prepare(ConfigModelRepo configModelRepo) { + public void prepare(ConfigModelRepo configModelRepo, DeployState deployState) { verifyClusterControllersOnlyDefinedForContent(configModelRepo); if (admin == null) return; if (admin.getClusterControllers() != null) - admin.getClusterControllers().prepare(); - admin.getLogServerContainerCluster().ifPresent(ContainerCluster::prepare); + admin.getClusterControllers().prepare(deployState); + admin.getLogServerContainerCluster().ifPresent((ContainerCluster cc) -> cc.prepare(deployState)); } private void verifyClusterControllersOnlyDefinedForContent(ConfigModelRepo configModelRepo) { @@ -81,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); @@ -110,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<CHILD extends AbstractConfigProduce return (deployState != null) && deployState.isHosted(); } - protected static DeployState deployStateFrom(AbstractConfigProducer parent) { - if (parent == null) return null; - if (parent.getRoot() == null) return null; - return parent.getRoot().getDeployState(); - } - /** * Creates a new AbstractConfigProducer with the given parent and subId. * This constructor will add the resulting producer to the children of parent. diff --git a/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java b/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java index 29d151857cc..aae1b6445c0 100644 --- a/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java +++ b/config-model/src/main/java/com/yahoo/config/model/test/MockRoot.java @@ -111,7 +111,6 @@ public class MockRoot extends AbstractConfigProducerRoot { throw new RuntimeException("Missing builder"); } - @Override public DeployState getDeployState() { return deployState; } @@ -148,7 +147,7 @@ public class MockRoot extends AbstractConfigProducerRoot { Document doc = XmlHelper.getDocumentBuilder().parse(new InputSource(new StringReader(servicesXml))); setAdmin(new DomAdminV2Builder(ConfigModelContext.ApplicationType.DEFAULT, deployState.getFileRegistry(), false, new ArrayList<>()). - 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/searchdefinition/derived/DerivedConfiguration.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java index 7c2d9a3b0ad..0c5c7733dda 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java @@ -16,7 +16,6 @@ import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModels; import java.io.IOException; import java.io.Writer; -import java.util.List; /** * A set of all derived configuration of a search definition. Use this as a facade to individual configurations when @@ -51,7 +50,7 @@ public class DerivedConfiguration { RankProfileRegistry rankProfileRegistry, QueryProfileRegistry queryProfiles, ImportedModels importedModels) { - this(search, null, new BaseDeployLogger(), rankProfileRegistry, queryProfiles, importedModels); + this(search, new BaseDeployLogger(), rankProfileRegistry, queryProfiles, importedModels); } /** @@ -60,15 +59,12 @@ public class DerivedConfiguration { * @param search The search to derive a configuration from. Derived objects will be snapshots, but this * argument is live. Which means that this object will be inconsistent when the given * search definition is later modified. - * @param abstractSearchList Search definition this one inherits from, only superclass configuration should be - * generated. Null or empty list if there is none. * @param deployLogger a {@link DeployLogger} for logging when * doing operations on this * @param rankProfileRegistry a {@link com.yahoo.searchdefinition.RankProfileRegistry} * @param queryProfiles the query profiles of this application */ public DerivedConfiguration(Search search, - List<Search> abstractSearchList, DeployLogger deployLogger, RankProfileRegistry rankProfileRegistry, QueryProfileRegistry queryProfiles, 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 extends ConfigInstance> CONFIGTYPE getConfig(Class<CONFIGTYPE> 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/Host.java b/config-model/src/main/java/com/yahoo/vespa/model/Host.java index 624a9fd4da7..ac56875270d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/Host.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/Host.java @@ -37,10 +37,10 @@ public final class Host extends AbstractConfigProducer<AbstractConfigProducer<?> this.runsConfigServer = runsConfigServer; this.hostname = hostname; if (parent instanceof HostSystem) - checkName((HostSystem) parent, hostname); + checkName(hostname); } - private void checkName(HostSystem parent, String hostname) { + private void checkName(String hostname) { // Give a warning if the host does not exist try { Object address = java.net.InetAddress.getByName(hostname); 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<HostResource> { 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 67067b37c5d..e243778d56e 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 @@ -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.vespa.model; -import com.google.common.collect.ImmutableList; import com.yahoo.config.ConfigBuilder; import com.yahoo.config.ConfigInstance; import com.yahoo.config.ConfigInstance.Builder; @@ -26,17 +25,14 @@ import com.yahoo.config.model.producer.AbstractConfigProducerRoot; import com.yahoo.config.model.producer.UserConfigRepo; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.log.LogLevel; -import com.yahoo.search.query.profile.QueryProfileRegistry; import com.yahoo.searchdefinition.RankProfile; import com.yahoo.searchdefinition.RankProfileRegistry; import com.yahoo.searchdefinition.RankingConstants; import com.yahoo.searchdefinition.derived.AttributeFields; import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.searchdefinition.processing.Processing; -import com.yahoo.searchlib.rankingexpression.ExpressionFunction; import com.yahoo.vespa.model.container.search.QueryProfiles; import com.yahoo.vespa.model.ml.ConvertedModel; -import com.yahoo.searchlib.rankingexpression.RankingExpression; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModel; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModels; import com.yahoo.vespa.config.ConfigDefinitionKey; @@ -99,18 +95,18 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri private static final long serialVersionUID = 1L; public static final Logger log = Logger.getLogger(VespaModel.class.getPackage().toString()); - private ConfigModelRepo configModelRepo = new ConfigModelRepo(); + private final ConfigModelRepo configModelRepo = new ConfigModelRepo(); private final AllocatedHosts allocatedHosts; /** The config id for the root config producer */ public static final String ROOT_CONFIGID = ""; - private ApplicationConfigProducerRoot root; + private final ApplicationConfigProducerRoot root; private final ApplicationPackage applicationPackage; /** Generic service instances - service clusters which have no specific model */ - private List<ServiceCluster> serviceClusters = new ArrayList<>(); + private final List<ServiceCluster> serviceClusters = new ArrayList<>(); /** The global rank profiles of this model */ private final RankProfileList rankProfileList; @@ -118,7 +114,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri /** The global ranking constants of this model */ private final RankingConstants rankingConstants = new RankingConstants(); - private DeployState deployState; + private DeployLogger deployLogger; /** The validation overrides of this. This is never null. */ private final ValidationOverrides validationOverrides; @@ -159,16 +155,15 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri private VespaModel(ConfigModelRegistry configModelRegistry, DeployState deployState, boolean complete, FileDistributor fileDistributor) throws IOException, SAXException { super("vespamodel"); - this.deployState = deployState; this.validationOverrides = deployState.validationOverrides(); configModelRegistry = new VespaConfigModelRegistry(configModelRegistry); VespaModelBuilder builder = new VespaDomBuilder(); this.applicationPackage = deployState.getApplicationPackage(); root = builder.getRoot(VespaModel.ROOT_CONFIGID, deployState, this); - createGlobalRankProfiles(deployState.getImportedModels(), - deployState.rankProfileRegistry(), - deployState.getQueryProfiles()); + HostSystem hostSystem = root.getHostSystem(); + createGlobalRankProfiles(deployState.getDeployLogger(), deployState.getImportedModels(), + deployState.rankProfileRegistry(), deployState.getQueryProfiles()); this.rankProfileList = new RankProfileList(null, // null search -> global rankingConstants, AttributeFields.empty, @@ -177,22 +172,23 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri deployState.getImportedModels()); if (complete) { // create a a completed, frozen model + this.deployLogger = deployState.getDeployLogger(); configModelRepo.readConfigModels(deployState, this, builder, root, configModelRegistry); - addServiceClusters(deployState.getApplicationPackage(), builder); - this.allocatedHosts = AllocatedHosts.withHosts(root.getHostSystem().getHostSpecs()); // must happen after the two lines above - - setupRouting(); + 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(getHostSystem().getHosts(), deployState); + getAdmin().addPerHostServices(hostSystem.getHosts(), deployState); freezeModelTopology(); root.prepare(configModelRepo); - configModelRepo.prepareConfigModels(); + configModelRepo.prepareConfigModels(deployState); validateWrapExceptions(); - this.deployState = null; + this.deployLogger = null; } else { // create a model with no services instantiated and the given file distributor - this.allocatedHosts = AllocatedHosts.withHosts(root.getHostSystem().getHostSpecs()); + this.allocatedHosts = AllocatedHosts.withHosts(hostSystem.getHostSpecs()); this.fileDistributor = fileDistributor; + this.deployLogger = deployState.getDeployLogger(); } } @@ -218,15 +214,15 @@ 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)); } /** * Creates a rank profile not attached to any search definition, for each imported model in the application package, * and adds it to the given rank profile registry. */ - private void createGlobalRankProfiles(ImportedModels importedModels, + private void createGlobalRankProfiles(DeployLogger deployLogger, ImportedModels importedModels, RankProfileRegistry rankProfileRegistry, QueryProfiles queryProfiles) { if ( ! importedModels.all().isEmpty()) { // models/ directory is available @@ -249,16 +245,14 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri convertedModel.expressions().values().forEach(f -> profile.addFunction(f, false)); } } - new Processing().processRankProfiles(deployState.getDeployLogger(), - rankProfileRegistry, - queryProfiles, true, false); + new Processing().processRankProfiles(deployLogger, rankProfileRegistry, queryProfiles, true, false); } /** Returns the global rank profiles as a rank profile list */ public RankProfileList rankProfileList() { return rankProfileList; } - private void setupRouting() { - root.setupRouting(this, configModelRepo); + private void setupRouting(DeployState deployState) { + root.setupRouting(deployState, this, configModelRepo); } /** Returns the one and only HostSystem of this VespaModel */ @@ -269,9 +263,9 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri /** Return a collection of all hostnames used in this application */ @Override public Set<HostInfo> getHosts() { - return root.getHostSystem().getHosts().stream() - .map(HostResource::getHostInfo) - .collect(Collectors.toCollection(LinkedHashSet::new)); + return getHostSystem().getHosts().stream() + .map(HostResource::getHostInfo) + .collect(Collectors.toCollection(LinkedHashSet::new)); } public FileDistributor getFileDistributor() { @@ -316,7 +310,6 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri } } - /** * Populates an instance of configClass with config produced by configProducer. */ @@ -501,13 +494,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"); - return deployState; - } - /** * @return an unmodifiable copy of the set of configIds in this VespaModel. */ @@ -616,7 +602,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri @Override public DeployLogger deployLogger() { - return getDeployState().getDeployLogger(); + return deployLogger; } } 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<String, MetricsConsumer> legacyMetricsConsumers, - boolean multitenant, - FileDistributionConfigProducer fileDistributionConfigProducer) { + public Admin(AbstractConfigProducer parent, Monitoring monitoring, Metrics metrics, + Map<String, MetricsConsumer> 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<String> 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<ServiceCluster> getClusters(ApplicationPackage pkg, AbstractConfigProducer parent); + public abstract List<ServiceCluster> 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..e38cc5da872 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<Configserver> configservers = parseConfigservers(admin, adminE); - admin.setLogserver(parseLogserver(admin, adminE)); + protected void doBuildAdmin(DeployState deployState, Admin admin, Element adminE) { + List<Configserver> 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<Configserver> parseConfigservers(Admin admin, Element adminE) { + private List<Configserver> parseConfigservers(DeployState deployState, Admin admin, Element adminE) { List<Configserver> 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<Container> 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<Configserver> getConfigServers(AbstractConfigProducer parent, Element adminE) { + private List<Configserver> getConfigServers(DeployState deployState, AbstractConfigProducer parent, Element adminE) { SimpleConfigProducer configServers = new SimpleConfigProducer(parent, "configservers"); List<Configserver> 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<Slobrok> getSlobroks(AbstractConfigProducer parent, Element slobroksE) { + private List<Slobrok> getSlobroks(DeployState deployState, AbstractConfigProducer parent, Element slobroksE) { List<Slobrok> slobs = new ArrayList<>(); if (slobroksE != null) { - slobs = getExplicitSlobrokSetup(parent, slobroksE); + slobs = getExplicitSlobrokSetup(deployState, parent, slobroksE); } return slobs; } - private List<Slobrok> getExplicitSlobrokSetup(AbstractConfigProducer parent, Element slobroksE) { + private List<Slobrok> getExplicitSlobrokSetup(DeployState deployState, AbstractConfigProducer parent, Element slobroksE) { List<Slobrok> slobs = new ArrayList<>(); List<Element> 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++; } @@ -160,7 +160,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } @Override - protected Logserver doBuild(AbstractConfigProducer parent, Element producerSpec) { + protected Logserver doBuild(DeployState deployState, AbstractConfigProducer parent, Element producerSpec) { return new Logserver(parent); } } @@ -179,7 +179,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } @Override - protected Configserver doBuild(AbstractConfigProducer parent, Element spec) { + protected Configserver doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new Configserver(parent, "configserver." + i, rpcPort); } } @@ -192,8 +192,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { } @Override - protected Slobrok doBuild(AbstractConfigProducer parent, - Element spec) { + protected Slobrok doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new Slobrok(parent, i); } } @@ -208,9 +207,8 @@ 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 16dd1970ed1..2e636478da2 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 @@ -48,7 +48,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)); @@ -60,7 +60,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); } @@ -74,7 +74,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()) { @@ -82,7 +82,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<HostResource> hosts = sortedContainerHostsFrom(containerModels.iterator().next(), nodesSpecification.count(), false); if (hosts.isEmpty()) return; // No log server can be created (and none is needed) @@ -108,8 +108,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 @@ -122,7 +122,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<? super Component<?, ?>> 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<Clients> { 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<Component<?, ?>, ComponentModel>(new ComponentModel(bundleSpec)); } - public static void addChildren(AbstractConfigProducer ancestor, Element componentNode, Component<? super Component<?, ?>, ?> component) { + public static void addChildren(DeployState deployState, AbstractConfigProducer ancestor, Element componentNode, Component<? super 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<? super Component<?, ?>, ?> component, Element childNode) { - Component<?, ?> child = new DomComponentBuilder(component.getComponentId()).build(ancestor, childNode); + private static void addAndInjectChild(DeployState deployState, AbstractConfigProducer ancestor, Component<? super 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/DomFilterBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomFilterBuilder.java index 74cc2b8421c..7e97944612d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomFilterBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomFilterBuilder.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.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.HttpFilter; @@ -12,7 +13,7 @@ import org.w3c.dom.Element; */ public class DomFilterBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Component> { @Override - protected Component doBuild(AbstractConfigProducer ancestor, Element element) { + protected Component doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element element) { return new HttpFilter(BundleInstantiationSpecificationBuilder.build(element)); } } 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<Handler> { @Override - protected Handler doBuild(AbstractConfigProducer ancestor, Element handlerElement) { + protected Handler doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element handlerElement) { Handler<? super Component<?, ?>> 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<? super Component<?, ?>> 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/DomSearchTuningBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilder.java index d7d9517a98b..4d122480cd0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomSearchTuningBuilder.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.search.Tuning; @@ -16,7 +17,7 @@ import java.util.logging.Level; public class DomSearchTuningBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Tuning> { @Override - protected Tuning doBuild(AbstractConfigProducer parent, Element spec) { + protected Tuning doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { Tuning tuning = new Tuning(parent); for (Element e : XML.getChildren(spec)) { if (equals("dispatch", e)) { 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..01dd6495d13 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) { @@ -187,8 +188,7 @@ public class DomV20ClientsBuilder { } @Override - protected VespaSpoolerService doBuild(AbstractConfigProducer parent, - Element spec) { + protected VespaSpoolerService doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new VespaSpoolerService(parent, index, spoolerConfig); } } @@ -203,8 +203,7 @@ public class DomV20ClientsBuilder { } @Override - protected VespaSpoolerProducer doBuild(AbstractConfigProducer parent, - Element producerSpec) { + protected VespaSpoolerProducer doBuild(DeployState deployState, AbstractConfigProducer parent, Element producerSpec) { return new VespaSpoolerProducer(parent, name, spooler); } } @@ -218,8 +217,7 @@ public class DomV20ClientsBuilder { } @Override - protected VespaSpoolMaster doBuild(AbstractConfigProducer parent, - Element spec) { + protected VespaSpoolMaster doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new VespaSpoolMaster(parent, index); } } 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<MODEL extends ConfigModel> extend @Override public MODEL build(ConfigModelInstanceFactory<MODEL> 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/ServletBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/ServletBuilder.java index d2d9e9d2ca6..6996103ae3b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/ServletBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/ServletBuilder.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.config.model.producer.AbstractConfigProducer; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.text.XML; @@ -19,7 +20,7 @@ import java.util.Map; */ public class ServletBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Servlet> { @Override - protected ServletProvider doBuild(AbstractConfigProducer ancestor, Element servletElement) { + protected ServletProvider doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element servletElement) { SimpleComponent servlet = createServletComponent(servletElement); ServletProvider servletProvider = createServletProvider(servletElement, servlet); 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 1e41fc70104..2bf19accaa9 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 @@ -1,18 +1,20 @@ // 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.*; -import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.config.model.api.HostProvisioner; -import com.yahoo.config.model.deploy.DeployProperties; +import com.yahoo.config.model.ApplicationConfigProducerRoot; +import com.yahoo.config.model.ConfigModel; +import com.yahoo.config.model.ConfigModelRepo; 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.UserConfigRepo; import com.yahoo.log.LogLevel; import com.yahoo.text.XML; -import com.yahoo.vespa.documentmodel.DocumentModel; -import com.yahoo.vespa.model.*; +import com.yahoo.vespa.model.AbstractService; +import com.yahoo.vespa.model.Affinity; +import com.yahoo.vespa.model.Client; +import com.yahoo.vespa.model.HostSystem; +import com.yahoo.vespa.model.SimpleConfigProducer; import com.yahoo.vespa.model.builder.UserConfigBuilder; import com.yahoo.vespa.model.builder.VespaModelBuilder; import com.yahoo.vespa.model.container.ContainerCluster; @@ -87,8 +89,8 @@ public class VespaDomBuilder extends VespaModelBuilder { @Override public ApplicationConfigProducerRoot getRoot(String name, DeployState deployState, AbstractConfigProducer parent) { try { - return new DomRootBuilder(name, deployState). - build(parent, XmlHelper.getDocument(deployState.getApplicationPackage().getServices()).getDocumentElement()); + return new DomRootBuilder(name). + build(deployState, parent, XmlHelper.getDocument(deployState.getApplicationPackage().getServices()).getDocumentElement()); } catch (Exception e) { throw new IllegalArgumentException(e); } @@ -112,34 +114,32 @@ public class VespaDomBuilder extends VespaModelBuilder { public static abstract class DomConfigProducerBuilder<T extends AbstractConfigProducer> { // TODO: find good way to provide access to app package - public final T build(AbstractConfigProducer ancestor, Element producerSpec) { - T t = doBuild(ancestor, producerSpec); + public final T build(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { + T t = doBuild(deployState, ancestor, producerSpec); if (t instanceof AbstractService) { - initializeService((AbstractService)t, ancestor, producerSpec); + initializeService((AbstractService)t, deployState, ancestor.getHostSystem(), producerSpec); } else { - initializeProducer(t, ancestor, producerSpec); + initializeProducer(t, deployState, producerSpec); } return t; } - protected abstract T doBuild(AbstractConfigProducer ancestor, Element producerSpec); + protected abstract T doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec); - private void initializeProducer(AbstractConfigProducer child, - AbstractConfigProducer ancestor, - Element producerSpec) { - UserConfigRepo userConfigs = UserConfigBuilder.build(producerSpec, ancestor.getRoot().getDeployState(), ancestor.getRoot().deployLogger()); + 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); log.log(LogLevel.DEBUG, "Adding user configs " + userConfigs + " for " + producerSpec); child.mergeUserConfigs(userConfigs); } - private void initializeService(AbstractService t, - AbstractConfigProducer ancestor, - Element producerSpec) { - initializeProducer(t, ancestor, 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)) { t.appendJvmArgs(producerSpec.getAttribute(JVMARGS_ATTRIB_NAME)); @@ -172,7 +172,7 @@ public class VespaDomBuilder extends VespaModelBuilder { if (port > 0) { t.setBasePort(port); } - allocateHost(t, ancestor.getHostSystem(), producerSpec); + allocateHost(t, hostSystem, producerSpec); } // This depends on which constructor in AbstractService is used, but the best way // is to let this method do initialize. @@ -209,36 +209,28 @@ public class VespaDomBuilder extends VespaModelBuilder { } @Override - protected SimpleConfigProducer doBuild(AbstractConfigProducer parent, - Element producerSpec) { + protected SimpleConfigProducer doBuild(DeployState deployState, AbstractConfigProducer parent, Element producerSpec) { return new SimpleConfigProducer(parent, configId); } } public static class DomRootBuilder extends VespaDomBuilder.DomConfigProducerBuilder<ApplicationConfigProducerRoot> { private final String name; - private final DeployProperties deployProperties; - private final DocumentModel documentModel; - private final HostProvisioner provisioner; /** * @param name The name of the Vespa to create. Usually 'root' when there is only one. */ - public DomRootBuilder(String name, DeployState deployState) { + public DomRootBuilder(String name) { this.name = name; - this.deployProperties = deployState.getProperties(); - this.documentModel = deployState.getDocumentModel(); - this.provisioner = deployState.getProvisioner(); } @Override - protected ApplicationConfigProducerRoot doBuild(AbstractConfigProducer parent, Element producerSpec) { - ApplicationConfigProducerRoot root = new ApplicationConfigProducerRoot(parent, - name, - documentModel, - deployProperties.vespaVersion(), - deployProperties.applicationId()); - root.setHostSystem(new HostSystem(root, "hosts", provisioner)); + protected ApplicationConfigProducerRoot doBuild(DeployState deployState, AbstractConfigProducer parent, Element producerSpec) { + ApplicationConfigProducerRoot root = new ApplicationConfigProducerRoot(parent, name, + deployState.getDocumentModel(), + deployState.getProperties().vespaVersion(), + deployState.getProperties().applicationId()); + root.setHostSystem(new HostSystem(root, "hosts", deployState.getProvisioner())); new Client(root); return root; } @@ -319,13 +311,12 @@ public class VespaDomBuilder extends VespaModelBuilder { } @Override - public List<ServiceCluster> getClusters(ApplicationPackage pkg, - AbstractConfigProducer parent) { + public List<ServiceCluster> getClusters(DeployState deployState, AbstractConfigProducer parent) { List<ServiceCluster> 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<COMPONENT extends ChainedComponent<?>, CHAIN extends private final Map<String, Class<? extends DomChainBuilderBase<? extends COMPONENT, ? extends CHAIN>>> chainType2BuilderClass; // NOTE: The chain type string (key in chainType2BuilderClass) must match the xml tag name for the chain. - public ChainsBuilder(AbstractConfigProducer ancestor, List<Element> chainsElems, + public ChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List<Element> chainsElems, Map<String, ComponentsBuilder.ComponentType> outerComponentTypeByComponentName, Map<String, Class<? extends DomChainBuilderBase<? extends COMPONENT, ? extends CHAIN>>> chainType2BuilderClass) { this.chainType2BuilderClass = chainType2BuilderClass; - readChains(ancestor, chainsElems, outerComponentTypeByComponentName); + readChains(deployState, ancestor, chainsElems, outerComponentTypeByComponentName); } public Collection<CHAIN> getChains() { return Collections.unmodifiableCollection(chains); } - private void readChains(AbstractConfigProducer ancestor, List<Element> chainsElems, + private void readChains(DeployState deployState, AbstractConfigProducer ancestor, List<Element> chainsElems, Map<String, ComponentsBuilder.ComponentType> outerSearcherTypeByComponentName) { for (Map.Entry<String, Class<? extends DomChainBuilderBase<? extends COMPONENT, ? extends CHAIN>>> 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<? extends DomChainBuilderBase<? extends COMPONENT, ? extends CHAIN>> builderClass, Map<String, ComponentsBuilder.ComponentType> outerSearcherTypeByComponentName) { DomChainBuilderBase<? extends COMPONENT, ? extends CHAIN> 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<T extends ChainedComponent<?>> { // NOTE: the 'name' string must match the xml tag name for the component in services. public static class ComponentType<T extends ChainedComponent<?>> { - static ArrayList<ComponentType> values = new ArrayList<>(); + static List<ComponentType> values = new ArrayList<>(); public static final ComponentType<DocumentProcessor> documentprocessor = new ComponentType<>("documentprocessor", DomDocumentProcessorBuilder.class); public static final ComponentType<Searcher<?>> searcher = new ComponentType<>("searcher", DomSearcherBuilder.class); public static final ComponentType<Processor> processor = new ComponentType<>("processor", DomProcessorBuilder.class); @@ -63,15 +72,16 @@ public class ComponentsBuilder<T extends ChainedComponent<?>> { * @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<ComponentType<T>> componentTypes, List<Element> elementsContainingComponentElems, Map<String, ComponentType> 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<ComponentType<T>> componentTypes, List<Element> elementsContainingComponentElems, Map<String, ComponentType> outerComponentTypeByComponentName) { @@ -79,13 +89,13 @@ public class ComponentsBuilder<T extends ChainedComponent<?>> { for (ComponentType<T> 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<T> componentType, Map<String, ComponentType> outerComponentTypeByComponentName) { @@ -95,7 +105,7 @@ public class ComponentsBuilder<T extends ChainedComponent<?>> { 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<T extends ChainedComponent<?>> { outerComponentReferences.add(componentSpecification); } - private void readComponentDefinition(AbstractConfigProducer ancestor, Element componentElement, ComponentType<T> componentType) { - T component = componentType.createBuilder().build(ancestor, componentElement); + private void readComponentDefinition(DeployState deployState, AbstractConfigProducer ancestor, Element componentElement, ComponentType<T> componentType) { + T component = componentType.createBuilder().build(deployState, ancestor, componentElement); componentDefinitions.add(component); updateComponentTypes(component.getComponentId(), componentType); } @@ -139,7 +149,7 @@ public class ComponentsBuilder<T extends ChainedComponent<?>> { private Map<String, ComponentType> unmodifiable(Map<String, ComponentType> outerComponentTypeByComponentName) { return (outerComponentTypeByComponentName != null)? Collections.unmodifiableMap(outerComponentTypeByComponentName): - Collections.<String, ComponentType>emptyMap(); + Collections.emptyMap(); } public Collection<T> 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<COMPONENT extends ChainedComponent<?>, this.outerComponentTypeByComponentName = outerComponentTypeByComponentName; } - public final CHAIN doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + public final CHAIN doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { ComponentsBuilder<COMPONENT> 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<COMPONENT extends ChainedComponent<?>, } } - 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<COMPONENT extends ChainedComponent<?>, 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<Element> allChainElements = allChainElements(parent, chainsElement); + List<Element> allChainElements = allChainElements(deployState, parent, chainsElement); if (! allChainElements.isEmpty()) { - ComponentsBuilder<COMPONENT> outerComponentsBuilder = readOuterComponents(chains, allChainElements); - ChainsBuilder<COMPONENT, CHAIN> chainsBuilder = readChains(chains, allChainElements, + ComponentsBuilder<COMPONENT> outerComponentsBuilder = readOuterComponents(deployState, chains, allChainElements); + ChainsBuilder<COMPONENT, CHAIN> chainsBuilder = readChains(deployState, chains, allChainElements, outerComponentsBuilder.getComponentTypeByComponentName()); addOuterComponents(chains, outerComponentsBuilder); @@ -56,24 +56,24 @@ class DomChainsBuilder<COMPONENT extends ChainedComponent<?>, CHAIN extends Chai return chains; } - private List<Element> allChainElements(AbstractConfigProducer ancestor, Element chainsElement) { + private List<Element> allChainElements(DeployState deployState, AbstractConfigProducer ancestor, Element chainsElement) { List<Element> 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<COMPONENT> readOuterComponents(AbstractConfigProducer ancestor, List<Element> chainsElems) { - return new ComponentsBuilder<>(ancestor, allowedComponentTypes, chainsElems, null); + private ComponentsBuilder<COMPONENT> readOuterComponents(DeployState deployState, AbstractConfigProducer ancestor, List<Element> chainsElems) { + return new ComponentsBuilder<>(deployState, ancestor, allowedComponentTypes, chainsElems, null); } protected abstract - ChainsBuilder<COMPONENT, CHAIN> readChains(AbstractConfigProducer ancestor, List<Element> allChainsElems, + ChainsBuilder<COMPONENT, CHAIN> readChains(DeployState deployState, AbstractConfigProducer ancestor, List<Element> allChainsElems, Map<String, ComponentsBuilder.ComponentType> outerComponentTypeByComponentName); private void addOuterComponents(CHAINS chains, ComponentsBuilder<COMPONENT> 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<DocumentProcessor, Docpr put("chain", DomDocprocChainBuilder.class); }}); - public DocprocChainsBuilder(AbstractConfigProducer ancestor, List<Element> docprocChainsElements, + public DocprocChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List<Element> docprocChainsElements, Map<String, ComponentsBuilder.ComponentType> 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<DocumentProcesso super(Arrays.asList(ComponentsBuilder.ComponentType.documentprocessor), outerComponentTypeByComponentName); } - protected DocprocChain buildChain(AbstractConfigProducer ancestor, Element producerSpec, + @Override + protected DocprocChain buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { Map<Pair<String, String>, 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<DocumentProcessor } @Override - protected DocprocChainsBuilder readChains(AbstractConfigProducer ancestor, List<Element> docprocChainsElements, + protected DocprocChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List<Element> docprocChainsElements, Map<String, ComponentType> 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/docproc/DomDocumentProcessorBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocumentProcessorBuilder.java index e4a2691f5c3..cc393913c1a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocumentProcessorBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/docproc/DomDocumentProcessorBuilder.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.VespaDomBuilder; import com.yahoo.vespa.model.container.docproc.DocumentProcessor; @@ -13,7 +14,8 @@ import org.w3c.dom.Element; */ public class DomDocumentProcessorBuilder extends VespaDomBuilder.DomConfigProducerBuilder<DocumentProcessor> { - protected DocumentProcessor doBuild(AbstractConfigProducer ancestor, Element documentProcessorElement) { + @Override + protected DocumentProcessor doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element documentProcessorElement) { DocumentProcessorModelBuilder modelBuilder = new DocumentProcessorModelBuilder(documentProcessorElement); return new DocumentProcessor(modelBuilder.build()); } 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<Processor, Processing } @Override - protected ProcessingChainsBuilder readChains(AbstractConfigProducer ancestor, List<Element> processingChainsElements, - Map<String, ComponentsBuilder.ComponentType> outerComponentTypeByComponentName) { - return new ProcessingChainsBuilder(ancestor, processingChainsElements, outerComponentTypeByComponentName); + protected ProcessingChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List<Element> processingChainsElements, + Map<String, ComponentsBuilder.ComponentType> 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<Processor, Pr super(Arrays.asList(ComponentsBuilder.ComponentType.processor), outerComponentTypeByComponentName); } - protected ProcessingChain buildChain(AbstractConfigProducer ancestor, Element producerSpec, - ChainSpecification specWithoutInnerComponents) { + protected ProcessingChain buildChain(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec, + ChainSpecification specWithoutInnerComponents) { return new ProcessingChain(specWithoutInnerComponents); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessorBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessorBuilder.java index 16cef24dad0..d7ac9729855 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessorBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/DomProcessorBuilder.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.vespa.model.builder.xml.dom.chains.ChainedComponentModelBuilder; import com.yahoo.vespa.model.container.processing.Processor; import com.yahoo.config.model.producer.AbstractConfigProducer; @@ -15,7 +16,8 @@ import org.w3c.dom.Element; */ public class DomProcessorBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Processor> { - protected Processor doBuild(AbstractConfigProducer ancestor, Element processorElement) { + @Override + protected Processor doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element processorElement) { ChainedComponentModelBuilder modelBuilder = new ChainedComponentModelBuilder(processorElement); return new Processor(modelBuilder.build()); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/ProcessingChainsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/ProcessingChainsBuilder.java index 9c6199ff24a..f3f44d45b51 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/ProcessingChainsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/processing/ProcessingChainsBuilder.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.vespa.model.builder.xml.dom.chains.ChainsBuilder; import com.yahoo.vespa.model.builder.xml.dom.chains.ComponentsBuilder; @@ -9,7 +10,11 @@ import com.yahoo.vespa.model.container.processing.ProcessingChain; import com.yahoo.vespa.model.container.processing.Processor; 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 processing chains from xml. @@ -25,9 +30,9 @@ public class ProcessingChainsBuilder extends ChainsBuilder<Processor, Processing put("chain", DomProcessingChainBuilder.class); }}); - public ProcessingChainsBuilder(AbstractConfigProducer ancestor, List<Element> processingChainsElements, + public ProcessingChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List<Element> processingChainsElements, Map<String, ComponentsBuilder.ComponentType> 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<Component> targetSelector = buildTargetSelector(ancestor, searcherElement, model.getComponentId()); + Optional<Component> targetSelector = buildTargetSelector(deployState, ancestor, searcherElement, model.getComponentId()); return new FederationSearcher(model, targetSelector); } - private Optional<Component> buildTargetSelector(AbstractConfigProducer ancestor, Element searcherElement, ComponentId namespace) { + private Optional<Component> 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<Provider> { } @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 provider = buildProvider(specWithoutInnerComponents, providerReader, federationOptions); - Collection<Source> sources = buildSources(ancestor, providerElement); + Collection<Source> sources = buildSources(deployState, ancestor, providerElement); addSources(provider, sources); return provider; } - private Collection<Source> buildSources(AbstractConfigProducer ancestor, Element providerElement) { + private Collection<Source> buildSources(DeployState deployState, AbstractConfigProducer ancestor, Element providerElement) { List<Source> 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<Searcher<?>, 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<Searcher<?>, Search } @Override - protected SearchChainsBuilder readChains(AbstractConfigProducer ancestor, List<Element> searchChainsElements, + protected SearchChainsBuilder readChains(DeployState deployState, AbstractConfigProducer ancestor, List<Element> searchChainsElements, Map<String, ComponentType> 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/DomSearcherBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearcherBuilder.java index 86c30fc13d0..52971f9b461 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearcherBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearcherBuilder.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.builder.xml.dom.chains.search; import com.yahoo.component.chain.model.ChainedComponentModel; +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.ChainedComponentModelBuilder; @@ -14,7 +15,8 @@ import org.w3c.dom.Element; */ public class DomSearcherBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Searcher<?>> { - protected Searcher<ChainedComponentModel> doBuild(AbstractConfigProducer ancestor, Element searcherElement) { + @Override + protected Searcher<ChainedComponentModel> doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element searcherElement) { ChainedComponentModelBuilder modelBuilder = new ChainedComponentModelBuilder(searcherElement); return new Searcher<>(modelBuilder.build()); } 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<Source> { 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<Searcher<?>, SearchChain> put("provider", DomProviderBuilder.class); }}); - public SearchChainsBuilder(AbstractConfigProducer ancestor, List<Element> searchChainsElements, + public SearchChainsBuilder(DeployState deployState, AbstractConfigProducer ancestor, List<Element> searchChainsElements, Map<String, ComponentsBuilder.ComponentType> 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<PortOverride> portOverrides, int index) { - this(parent, name, false, portOverrides, index); + public Container(AbstractConfigProducer parent, String name, List<PortOverride> portOverrides, int index, boolean isHostedVespa) { + this(parent, name, false, portOverrides, index, isHostedVespa); } - public Container(AbstractConfigProducer parent, String name, boolean retired, List<PortOverride> portOverrides, int index) { + public Container(AbstractConfigProducer parent, String name, boolean retired, List<PortOverride> 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 f0724306e9c..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,20 +196,15 @@ 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); } - /** Creates a container cluster */ - public ContainerCluster(AbstractConfigProducer<?> parent, - String subId, - String name, - ContainerClusterVerifier verifier) { + public ContainerCluster(AbstractConfigProducer<?> parent, String subId, String name, + ContainerClusterVerifier verifier, DeployState deployState) { super(parent, subId); this.clusterVerifier = verifier; this.name = name; - DeployState deployState = deployStateFrom(parent); this.isHostedVespa = stateIsHosted(deployState); this.zone = (deployState != null) ? deployState.zone() : Zone.defaultZone(); componentGroup = new ComponentGroup<>(this, "component"); @@ -338,18 +333,18 @@ public final class ContainerCluster addComponent(new SimpleComponent(className)); } - public void prepare() { - addAndSendApplicationBundles(); + public void prepare(DeployState deployState) { + addAndSendApplicationBundles(deployState); if (modelEvaluation != null) modelEvaluation.prepare(containers); - sendUserConfiguredFiles(); - setApplicationMetaData(); + sendUserConfiguredFiles(deployState); + setApplicationMetaData(deployState); for (RestApi restApi : restApiGroup.getComponents()) restApi.prepare(); } - private void setApplicationMetaData() { - applicationMetaData = getRoot().getDeployState().getApplicationPackage().getMetaData(); + private void setApplicationMetaData(DeployState deployState) { + applicationMetaData = deployState.getApplicationPackage().getMetaData(); } public void addMbusServer(ComponentId chainId) { @@ -362,17 +357,17 @@ public final class ContainerCluster null)))); } - private void addAndSendApplicationBundles() { - for (ComponentInfo component : getRoot().getDeployState().getApplicationPackage().getComponentsInfo(getRoot().getDeployState().getProperties().vespaVersion())) { + private void addAndSendApplicationBundles(DeployState deployState) { + for (ComponentInfo component : deployState.getApplicationPackage().getComponentsInfo(deployState.getProperties().vespaVersion())) { FileReference reference = FileSender.sendFileToServices(component.getPathRelativeToAppDir(), containers); applicationBundles.add(reference); } } - private void sendUserConfiguredFiles() { + private void sendUserConfiguredFiles(DeployState deployState) { // Files referenced from user configs to all components. for (Component<?, ?> component : getAllComponents()) { - FileSender.sendUserConfiguredFiles(component, containers, deployLogger()); + FileSender.sendUserConfiguredFiles(component, containers, deployState.getDeployLogger()); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java index 83d749067b4..cefccca5ec8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModel.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.model.container; import com.yahoo.config.model.ConfigModel; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.ConfigModelRepo; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.model.content.Content; import com.yahoo.vespa.model.search.AbstractSearchCluster; @@ -35,9 +36,9 @@ public class ContainerModel extends ConfigModel { public ContainerCluster getCluster() { return containerCluster; } @Override - public void prepare(ConfigModelRepo plugins) { + public void prepare(ConfigModelRepo plugins, DeployState deployState) { assert (getCluster() != null) : "Null container cluster!"; - getCluster().prepare(); + getCluster().prepare(deployState); } @Override 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<Filter> { - 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<Filter, Chain<Filter } @Override - protected Chain<Filter> buildChain(AbstractConfigProducer ancestor, Element producerSpec, ChainSpecification specWithoutInnerComponents) { + protected Chain<Filter> 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<Filter, Chain<Filter>, @Override protected ChainsBuilder<Filter, Chain<Filter>> readChains( + DeployState deployState, AbstractConfigProducer ancestor, List<Element> allChainsElems, Map<String, ComponentsBuilder.ComponentType> 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<Http> { @Override - protected Http doBuild(AbstractConfigProducer ancestor, Element spec) { + protected Http doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { FilterChains filterChains; List<Binding> 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 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<Http> /** * 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<Http> 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<Http> 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<JettyHttpServer> { @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/jersey/xml/RestApiBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/jersey/xml/RestApiBuilder.java index 6728f0be29f..4aa5882119f 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/jersey/xml/RestApiBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/jersey/xml/RestApiBuilder.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.jersey.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.VespaDomBuilder; @@ -20,12 +21,11 @@ import java.util.Map; public class RestApiBuilder extends VespaDomBuilder.DomConfigProducerBuilder<RestApi> { @Override - protected RestApi doBuild(AbstractConfigProducer ancestor, Element spec) { + protected RestApi doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { String bindingPath = spec.getAttribute("path"); RestApi restApi = new RestApi(bindingPath); - restApi.setRestApiContext( - createRestApiContext(ancestor, spec, bindingPath)); + restApi.setRestApiContext(createRestApiContext(ancestor, spec, bindingPath)); return restApi; } @@ -46,8 +46,7 @@ public class RestApiBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Res } private RestApiContext.BundleInfo getBundle(Element bundleElement) { - RestApiContext.BundleInfo bundle = new RestApiContext.BundleInfo( - bundleElement.getAttribute("bundle")); + RestApiContext.BundleInfo bundle = new RestApiContext.BundleInfo(bundleElement.getAttribute("bundle")); for (Element packageElement : XML.getChildren(bundleElement, "package")) bundle.addPackageToScan(XML.getValue(packageElement)); 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..ddea1a189bc 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; @@ -53,7 +54,7 @@ public class AccessLogBuilder { } @Override - protected AccessLogComponent doBuild(AbstractConfigProducer ancestor, Element spec) { + protected AccessLogComponent doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { return new AccessLogComponent( accessLogType, fileNamePattern(spec), @@ -101,7 +102,7 @@ public class AccessLogBuilder { } } - public static Optional<AccessLogComponent> buildIfNotDisabled(ContainerCluster cluster, Element accessLogSpec) { + public static Optional<AccessLogComponent> 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 2d3f3036ccc..6bd672701c3 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 @@ -12,6 +12,7 @@ import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.application.provider.IncludeDirs; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.provision.AthenzService; import com.yahoo.config.provision.Capacity; @@ -23,13 +24,13 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Rotation; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.config.MetricDefaultsConfig; -import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.search.rendering.RendererRegistry; import com.yahoo.searchdefinition.derived.RankProfileList; 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; @@ -148,38 +147,40 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { private ContainerCluster createContainerCluster(Element spec, ConfigModelContext modelContext) { return new VespaDomBuilder.DomConfigProducerBuilder<ContainerCluster>() { @Override - protected ContainerCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) { - return new ContainerCluster(ancestor, modelContext.getProducerId(), modelContext.getProducerId()); + protected ContainerCluster doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { + return new ContainerCluster(ancestor, modelContext.getProducerId(), + modelContext.getProducerId(), deployState); } - }.build(modelContext.getParentProducer(), spec); + }.build(modelContext.getDeployState(), modelContext.getParentProducer(), spec); } 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(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. } @@ -243,12 +244,12 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } } - 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) { @@ -287,37 +288,36 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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<Component> buildLegacyFilters(AbstractConfigProducer ancestor, - Element spec) { + private List<Component> buildLegacyFilters(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { List<Component> 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<Element> 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) @@ -329,15 +329,15 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } - protected void addHttp(Element spec, ContainerCluster cluster) { + protected final void addHttp(DeployState deployState, Element spec, ContainerCluster cluster) { Element httpElement = XML.getChild(spec, "http"); if (httpElement != null) { - cluster.setHttp(buildHttp(cluster, httpElement)); + cluster.setHttp(buildHttp(deployState, cluster, httpElement)); } } - private Http buildHttp(ContainerCluster cluster, Element httpElement) { - Http http = new HttpBuilder().build(cluster, httpElement); + private Http buildHttp(DeployState deployState, ContainerCluster cluster, Element httpElement) { + Http http = new HttpBuilder().build(deployState, cluster, httpElement); if (networking == Networking.disable) http.removeAllServers(); @@ -345,16 +345,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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) { @@ -364,8 +364,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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); @@ -374,16 +374,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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) { @@ -395,25 +395,24 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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; } @@ -423,10 +422,10 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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)); } } @@ -446,14 +445,14 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } 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(); @@ -480,7 +479,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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<Container> result, ContainerCluster cluster) { @@ -516,7 +515,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { /** 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<HostResource> singleContentHost = getHostResourceFromContentClusters(cluster, containerElement, context); if (singleContentHost.isPresent()) { // there is a content cluster; put the container on its first node return singleContentHost.get(); @@ -524,16 +525,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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); } } @@ -622,7 +623,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { List<Container> nodes = new ArrayList<>(); for (Map.Entry<HostResource, ClusterMembership> 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); @@ -630,11 +631,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { return nodes; } - private List<Container> createNodesFromNodeList(ContainerCluster cluster, Element nodesElement) { + private List<Container> createNodesFromNodeList(DeployState deployState, ContainerCluster cluster, Element nodesElement) { List<Container> 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; @@ -718,13 +719,13 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { 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); @@ -757,16 +758,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } } - 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<Element> elementValidator) { + public static void validateAndAddConfiguredComponents(DeployState deployState, ContainerCluster cluster, Element spec, String componentName, Consumer<Element> 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<Container.PortOverride> readServerPortOverrides(Element spec) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java index e9bd4d2d074..176ba31857b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ClusterControllerConfig.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; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.FleetcontrollerConfig; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.model.producer.AbstractConfigProducerRoot; @@ -27,7 +28,7 @@ public class ClusterControllerConfig extends AbstractConfigProducer implements F } @Override - protected ClusterControllerConfig doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected ClusterControllerConfig doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { ModelElement tuning = null; ModelElement clusterTuning = clusterElement.getChild("tuning"); 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 ec68243ec9d..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 @@ -12,10 +12,12 @@ import com.yahoo.config.model.ConfigModelRepo; import com.yahoo.config.model.admin.AdminModel; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.log.LogLevel; -import com.yahoo.searchdefinition.derived.RankProfileList; -import com.yahoo.vespa.model.*; +import com.yahoo.vespa.model.AbstractService; +import com.yahoo.vespa.model.HostResource; +import com.yahoo.vespa.model.SimpleConfigProducer; import com.yahoo.vespa.model.admin.Admin; import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerCluster; @@ -31,7 +33,13 @@ import com.yahoo.vespa.model.search.IndexingDocprocChain; import com.yahoo.vespa.model.search.SearchNode; import org.w3c.dom.Element; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; import java.util.logging.Logger; /** @@ -158,7 +166,7 @@ public class Content extends ConfigModel { } @Override - public void prepare(ConfigModelRepo models) { + public void prepare(ConfigModelRepo models, DeployState deployState) { if (cluster.getRootGroup().useCpuSocketAffinity()) { setCpuSocketAffinity(); } @@ -192,7 +200,7 @@ public class Content extends ConfigModel { s.setVespaMallocDebugStackTrace(cluster.getRootGroup().getVespaMallocDebugStackTrace().get()); } } - cluster.prepare(); + cluster.prepare(deployState); } private void setCpuSocketAffinity() { @@ -299,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); @@ -316,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 c611cdc3dc1..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<String, AbstractSearchCluster> clusters = new TreeMap<>(); + private Map<String, AbstractSearchCluster> clusters = new TreeMap<>(); /** The single, indexed search cluster this sets up (supporting multiple document types), or null if none */ private IndexedSearchCluster indexedCluster; @@ -63,25 +78,25 @@ 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"); ContentSearchCluster search = new ContentSearchCluster(ancestor, clusterName, documentDefinitions, globallyDistributedDocuments, - getFlushOnShutdown(flushOnShutdownElem, AbstractConfigProducer.deployStateFrom(ancestor))); + 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) { search.setResourceLimits(DomResourceLimitsBuilder.build(protonElem)); } - buildAllStreamingSearchClusters(clusterElem, clusterName, search); - buildIndexedSearchCluster(clusterElem, clusterName, search); + buildAllStreamingSearchClusters(deployState, clusterElem, clusterName, search); + buildIndexedSearchCluster(deployState, clusterElem, clusterName, search); return search; } @@ -89,14 +104,14 @@ 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) { return clusterElem.childAsDouble("engine.proton.query-timeout"); } - private void buildAllStreamingSearchClusters(ModelElement clusterElem, String clusterName, ContentSearchCluster search) { + private void buildAllStreamingSearchClusters(DeployState deployState, ModelElement clusterElem, String clusterName, ContentSearchCluster search) { ModelElement docElem = clusterElem.getChild("documents"); if (docElem == null) { @@ -106,20 +121,20 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot for (ModelElement docType : docElem.subElements("document")) { String mode = docType.getStringAttribute("mode"); if ("streaming".equals(mode)) { - buildStreamingSearchCluster(clusterElem, clusterName, search, docType); + buildStreamingSearchCluster(deployState, clusterElem, clusterName, search, docType); } } } - private void buildStreamingSearchCluster(ModelElement clusterElem, String clusterName, ContentSearchCluster search, ModelElement docType) { + private void buildStreamingSearchCluster(DeployState deployState, ModelElement clusterElem, String clusterName, + ContentSearchCluster search, ModelElement docType) { String docTypeName = docType.getStringAttribute("type"); StreamingSearchCluster cluster = new StreamingSearchCluster(search, clusterName + "." + docTypeName, 0, docTypeName, clusterName); - search.addSearchCluster(cluster, getQueryTimeout(clusterElem), Arrays.asList(docType)); + search.addSearchCluster(deployState, cluster, getQueryTimeout(clusterElem), Arrays.asList(docType)); } - private void buildIndexedSearchCluster(ModelElement clusterElem, - String clusterName, - ContentSearchCluster search) { + private void buildIndexedSearchCluster(DeployState deployState, ModelElement clusterElem, + String clusterName, ContentSearchCluster search) { List<ModelElement> indexedDefs = getIndexedSearchDefinitions(clusterElem); if (!indexedDefs.isEmpty()) { IndexedSearchCluster isc = new IndexedSearchCluster(search, clusterName, 0); @@ -130,7 +145,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot isc.setVisibilityDelay(visibilityDelay); } - search.addSearchCluster(isc, getQueryTimeout(clusterElem), indexedDefs); + search.addSearchCluster(deployState, isc, getQueryTimeout(clusterElem), indexedDefs); } } @@ -164,29 +179,29 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot this.flushOnShutdown = flushOnShutdown; } - void addSearchCluster(SearchCluster cluster, Double queryTimeout, List<ModelElement> documentDefs) { - addSearchDefinitions(documentDefs, cluster); + private void addSearchCluster(DeployState deployState, SearchCluster cluster, Double queryTimeout, List<ModelElement> documentDefs) { + addSearchDefinitions(deployState, documentDefs, cluster); if (queryTimeout != null) { cluster.setQueryTimeout(queryTimeout); } cluster.defaultDocumentsConfig(); - cluster.deriveSearchDefinitions(new ArrayList<>()); + cluster.deriveSearchDefinitions(deployState); addCluster(cluster); } - private void addSearchDefinitions(List<ModelElement> searchDefs, AbstractSearchCluster sc) { + private void addSearchDefinitions(DeployState deployState, List<ModelElement> searchDefs, AbstractSearchCluster sc) { for (ModelElement e : searchDefs) { SearchDefinitionXMLHandler searchDefinitionXMLHandler = new SearchDefinitionXMLHandler(e); SearchDefinition searchDefinition = - searchDefinitionXMLHandler.getResponsibleSearchDefinition(sc.getRoot().getDeployState().getSearchDefinitions()); + searchDefinitionXMLHandler.getResponsibleSearchDefinition(deployState.getSearchDefinitions()); if (searchDefinition == null) throw new RuntimeException("Search definition parsing error or file does not exist: '" + searchDefinitionXMLHandler.getName() + "'"); // TODO: remove explicit building of user configs when the complete content model is built using builders. sc.getLocalSDS().add(new AbstractSearchCluster.SearchDefinitionSpec(searchDefinition, - UserConfigBuilder.build(e.getXml(), sc.getRoot().getDeployState(), sc.getRoot().deployLogger()))); + UserConfigBuilder.build(e.getXml(), deployState, sc.getRoot().deployLogger()))); //need to get the document names from this sdfile sc.addDocumentNames(searchDefinition); } @@ -209,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); @@ -217,7 +232,8 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot TransactionLogServer tls; Optional<Tuning> 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(); @@ -225,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()) { @@ -254,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/Distributor.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java index 7da6ab9bd99..ddc816d2c17 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Distributor.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; +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; @@ -25,7 +26,7 @@ public class Distributor extends ContentNode { } @Override - protected Distributor doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected Distributor doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { return new Distributor((DistributorCluster)ancestor, new ModelElement(producerSpec).getIntegerAttribute("distribution-key"), clusterXml.getIntegerAttribute("distributor-base-port"), persistenceProvider); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java index 659a07cfd5c..5aea75049ac 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/DistributorCluster.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; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.core.StorDistributormanagerConfig; import com.yahoo.vespa.config.content.core.StorServerConfig; import com.yahoo.document.select.DocumentSelector; @@ -93,7 +94,7 @@ public class DistributorCluster extends AbstractConfigProducer<Distributor> impl } @Override - protected DistributorCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected DistributorCluster doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { final ModelElement clusterElement = new ModelElement(producerSpec); final ModelElement documentsNode = clusterElement.getChild("documents"); final GcOptions gc = parseGcOptions(documentsNode); 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<ModelElement> group = Optional.ofNullable(clusterElement.getChild("group")); Optional<ModelElement> 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<GroupBuilder> parent) { + public StorageGroup buildNonHosted(DeployState deployState, ContentCluster owner, Optional<GroupBuilder> 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<GroupBuilder> parent) { + public StorageGroup buildHosted(DeployState deployState, ContentCluster owner, Optional<GroupBuilder> parent) { if (storageGroup.getIndex() != null) throw new IllegalArgumentException("Specifying individual groups is not supported on hosted applications"); Map<HostResource, ClusterMembership> 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<HostResource, ClusterMembership> 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<HostResource, ClusterMembership> 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<NodesSpecification> 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/StorageNode.java b/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.java index 74576b45584..537eca5d7b8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/StorageNode.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; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.StorFilestorConfig; import com.yahoo.vespa.config.content.core.StorBucketmoverConfig; import com.yahoo.vespa.config.content.core.StorServerConfig; @@ -27,7 +28,7 @@ public class StorageNode extends ContentNode implements StorServerConfig.Produce public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<StorageNode> { @Override - protected StorageNode doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected StorageNode doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { ModelElement e = new ModelElement(producerSpec); return new StorageNode((StorageCluster)ancestor, e.getDoubleAttribute("capacity"), e.getIntegerAttribute("distribution-key"), false); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index f15ba547894..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 @@ -4,11 +4,11 @@ package com.yahoo.vespa.model.content.cluster; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import com.yahoo.config.model.ConfigModelContext; +import com.yahoo.config.model.deploy.DeployState; 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; @@ -35,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; @@ -44,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; @@ -101,10 +120,10 @@ public class ContentCluster extends AbstractConfigProducer implements public ContentCluster build(Collection<ContainerModel> containers, ConfigModelContext context, Element w3cContentElement) { ModelElement contentElement = new ModelElement(w3cContentElement); - + DeployState deployState = context.getDeployState(); ModelElement documentsElement = contentElement.getChild("documents"); Map<String, NewDocumentType> 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); @@ -112,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); @@ -254,7 +273,7 @@ public class ContentCluster extends AbstractConfigProducer implements } private void validateGroupSiblings(String cluster, StorageGroup group) { - HashSet<String> siblings = new HashSet<>(); + Set<String> siblings = new HashSet<>(); for (StorageGroup g : group.getSubgroups()) { String name = g.getName(); if (siblings.contains(name)) { @@ -298,8 +317,7 @@ public class ContentCluster extends AbstractConfigProducer implements Collection<HostResource> 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 { @@ -309,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); } } @@ -438,18 +456,17 @@ public class ContentCluster extends AbstractConfigProducer implements private ContainerCluster createClusterControllers(AbstractConfigProducer parent, Collection<HostResource> 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<Container> 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") @@ -482,15 +499,12 @@ public class ContentCluster extends AbstractConfigProducer implements } - private ContentCluster(AbstractConfigProducer parent, - String clusterName, + private ContentCluster(AbstractConfigProducer parent, String clusterName, Map<String, NewDocumentType> documentDefinitions, Set<NewDocumentType> 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; @@ -499,11 +513,11 @@ public class ContentCluster extends AbstractConfigProducer implements this.zone = zone; } - public void prepare() { + public void prepare(DeployState deployState) { search.prepare(); if (clusterControllers != null) { - clusterControllers.prepare(); + clusterControllers.prepare(deployState); } } 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/content/storagecluster/StorageCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java index 10f39d1f499..cd99f46646b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/storagecluster/StorageCluster.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.storagecluster; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.vespa.config.content.core.StorIntegritycheckerConfig; import com.yahoo.vespa.config.content.core.StorBucketmoverConfig; import com.yahoo.vespa.config.content.core.StorVisitorConfig; @@ -29,7 +30,7 @@ public class StorageCluster extends AbstractConfigProducer<StorageNode> { public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<StorageCluster> { @Override - protected StorageCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected StorageCluster doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { final ModelElement clusterElem = new ModelElement(producerSpec); final ContentCluster cluster = (ContentCluster)ancestor; 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<GenericServicesMo } @Override - public void doBuild(GenericServicesModel model, Element spec, ConfigModelContext modelContext) { + public void doBuild(GenericServicesModel model, Element spec, ConfigModelContext context) { String name = spec.getAttribute("name"); - model.addCluster(new DomServiceClusterBuilder(name).build(modelContext.getParentProducer(), spec)); + model.addCluster(new DomServiceClusterBuilder(name).build(context.getDeployState(), context.getParentProducer(), spec)); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomModuleBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomModuleBuilder.java index 6510a3cfbbd..212363c6667 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomModuleBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomModuleBuilder.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.generic.builder; +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; @@ -17,16 +18,16 @@ public class DomModuleBuilder extends VespaDomBuilder.DomConfigProducerBuilder<M this.name = name; } - private void addChildren(Module s, Element subServiceSpec) { + private void addChildren(DeployState deployState, Module s, Element subServiceSpec) { for (Element nodeSpec : XML.getChildren(subServiceSpec, "module")) { - new DomModuleBuilder(nodeSpec.getAttribute("name")).build(s, nodeSpec); + new DomModuleBuilder(nodeSpec.getAttribute("name")).build(deployState, s, nodeSpec); } } @Override - protected Module doBuild(AbstractConfigProducer ancestor, Element subServiceSpec) { + protected Module doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element subServiceSpec) { Module s = new Module(ancestor, name); - addChildren(s, subServiceSpec); + addChildren(deployState, s, subServiceSpec); return s; } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceBuilder.java index 25f6ce0dbde..1f44f61e86c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceBuilder.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.generic.builder; +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; @@ -20,12 +21,12 @@ public class DomServiceBuilder extends VespaDomBuilder.DomConfigProducerBuilder< } @Override - protected com.yahoo.vespa.model.generic.service.Service doBuild(AbstractConfigProducer parent, - Element serviceSpec) { + protected com.yahoo.vespa.model.generic.service.Service doBuild(DeployState deployState, AbstractConfigProducer parent, + Element serviceSpec) { ServiceCluster sc = (ServiceCluster) parent; com.yahoo.vespa.model.generic.service.Service service = new com.yahoo.vespa.model.generic.service.Service(sc, i + ""); for (Element subServiceSpec : XML.getChildren(serviceSpec, "module")) { - new DomModuleBuilder(subServiceSpec.getAttribute("name")).build(service, subServiceSpec); + new DomModuleBuilder(subServiceSpec.getAttribute("name")).build(deployState, service, subServiceSpec); } return service; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceClusterBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceClusterBuilder.java index da8d0a441ff..200a1d175a3 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceClusterBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/generic/builder/DomServiceClusterBuilder.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.generic.builder; +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; @@ -21,11 +22,11 @@ public class DomServiceClusterBuilder extends VespaDomBuilder.DomConfigProducerB } @Override - protected ServiceCluster doBuild(AbstractConfigProducer ancestor, Element spec) { + protected ServiceCluster doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { ServiceCluster cluster = new ServiceCluster(ancestor, name, spec.getAttribute("command")); int nodeIndex = 0; for (Element nodeSpec : XML.getChildren(spec, "node")) { - com.yahoo.vespa.model.generic.service.Service service = new DomServiceBuilder(nodeIndex).build(cluster, nodeSpec); + com.yahoo.vespa.model.generic.service.Service service = new DomServiceBuilder(nodeIndex).build(deployState, cluster, nodeSpec); // TODO: Currently creates the config for each service. Should instead build module tree first // and store them in ServiceCluster. Then have some way of referencing them from each service. @@ -34,7 +35,7 @@ public class DomServiceClusterBuilder extends VespaDomBuilder.DomConfigProducerB Map<String, AbstractConfigProducer<?>> 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/IndexedSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java index c46a662b682..e0dffcbc537 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.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.search; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.search.AttributesConfig; import com.yahoo.vespa.config.search.DispatchConfig; @@ -282,19 +283,16 @@ public class IndexedSearchCluster extends SearchCluster } } } - protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, - List<com.yahoo.searchdefinition.Search> globalSearches) { + @Override + protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, DeployState deployState) { for (SearchDefinitionSpec spec : localSearches) { com.yahoo.searchdefinition.Search search = spec.getSearchDefinition().getSearch(); if ( ! (search instanceof DocumentOnlySearch)) { - DocumentDatabase db = new DocumentDatabase(this, - search.getName(), - new DerivedConfiguration(search, - globalSearches, - deployLogger(), - getRoot().getDeployState().rankProfileRegistry(), - getRoot().getDeployState().getQueryProfiles().getRegistry(), - getRoot().getDeployState().getImportedModels())); + DocumentDatabase db = new DocumentDatabase(this, search.getName(), + new DerivedConfiguration(search, deployLogger(), + deployState.rankProfileRegistry(), + deployState.getQueryProfiles().getRegistry(), + deployState.getImportedModels())); // TODO: remove explicit adding of user configs when the complete content model is built using builders. db.mergeUserConfigs(spec.getUserConfigs()); documentDbs.add(db); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java index 379c4c84e16..34a2fc7ab0e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchCluster.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.search; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.searchdefinition.derived.RawRankProfile; import com.yahoo.searchdefinition.derived.SummaryMap; import com.yahoo.vespa.config.search.RankProfilesConfig; @@ -48,8 +49,8 @@ public abstract class SearchCluster extends AbstractSearchCluster * Also stores the document names contained in the search * definitions. */ - public void deriveSearchDefinitions(List<com.yahoo.searchdefinition.Search> global) { - deriveAllSearchDefinitions(getLocalSDS(), global); + public void deriveSearchDefinitions(DeployState deployState) { + deriveAllSearchDefinitions(getLocalSDS(), deployState); } @Override @@ -139,8 +140,7 @@ public abstract class SearchCluster extends AbstractSearchCluster return false; } - protected abstract void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, - List<com.yahoo.searchdefinition.Search> globalSearches); + protected abstract void deriveAllSearchDefinitions(List<SearchDefinitionSpec> localSearches, DeployState deployState); public abstract void defaultDocumentsConfig(); public abstract DerivedConfiguration getSdConfig(); 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> tuning) { - return new SearchNode(parent, name, distributionKey, nodeSpec, clusterName, serviceLayerService, flushOnShutdown, tuning); + String clusterName, AbstractService serviceLayerService, boolean flushOnShutdown, + Optional<Tuning> 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> tuning) { - this(parent, name, nodeSpec, clusterName, flushOnShutdown, tuning); + String clusterName, AbstractService serviceLayerService, boolean flushOnShutdown, + Optional<Tuning> 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> tuning) { + private SearchNode(AbstractConfigProducer parent, String name, NodeSpec nodeSpec, String clusterName, + boolean flushOnShutdown, Optional<Tuning> 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/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java index 66553ebadf6..7f177babf26 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/StreamingSearchCluster.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.search; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.prelude.fastsearch.DocumentdbInfoConfig; import com.yahoo.searchdefinition.derived.AttributeFields; @@ -89,23 +90,22 @@ public class StreamingSearchCluster extends SearchCluster implements } } - protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> local, - List<com.yahoo.searchdefinition.Search> global) { + @Override + protected void deriveAllSearchDefinitions(List<SearchDefinitionSpec> local, DeployState deployState) { if (local.size() == 1) { - deriveSingleSearchDefinition(local.get(0).getSearchDefinition().getSearch(), global); + deriveSingleSearchDefinition(local.get(0).getSearchDefinition().getSearch(), deployState); } else if (local.size() > 1){ throw new IllegalStateException("Logical indexes are not supported: Got " + local.size() + " search definitions, expected 1"); } } - private void deriveSingleSearchDefinition(com.yahoo.searchdefinition.Search localSearch, - List<com.yahoo.searchdefinition.Search> globalSearches) { + private void deriveSingleSearchDefinition(com.yahoo.searchdefinition.Search localSearch, DeployState deployState) { if (!localSearch.getName().equals(docTypeName)) { throw new IllegalStateException("Mismatch between document type name (" + docTypeName + ") and name of search definition (" + localSearch.getName() + ")"); } - this.sdConfig = new DerivedConfiguration(localSearch, globalSearches, deployLogger(), - getRoot().getDeployState().rankProfileRegistry(), - getRoot().getDeployState().getQueryProfiles().getRegistry(), - getRoot().getDeployState().getImportedModels()); + this.sdConfig = new DerivedConfiguration(localSearch, deployLogger(), + deployState.rankProfileRegistry(), + deployState.getQueryProfiles().getRegistry(), + deployState.getImportedModels()); } @Override public DerivedConfiguration getSdConfig() { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java index a558baf0ee5..61cac8afb91 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.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.search; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.searchlib.TranslogserverConfig; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.AbstractService; @@ -28,7 +29,7 @@ public class TransactionLogServer extends AbstractService { } @Override - protected TransactionLogServer doBuild(AbstractConfigProducer ancestor, Element producerSpec) { + protected TransactionLogServer doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { return new TransactionLogServer(ancestor, clusterName); } } 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("<services version=\"1.0\"><admin version=\"2.0\" /></services>") @@ -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<ModelNode> 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<ModelNode> 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<ConfigServerSpec> 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( "<handler id='theId' class='theClass' bundle='theBundle' />")); BundleInstantiationSpecification instantiationSpecification = handler.model.bundleInstantiationSpec; @@ -31,7 +31,7 @@ public class DomComponentBuilderTest extends DomBuilderTest { @Test @SuppressWarnings("unchecked") public void components_can_be_nested() { - Component<Component<?, ?>, ?> parent = new DomComponentBuilder().doBuild(root, parse( + Component<Component<?, ?>, ?> parent = new DomComponentBuilder().doBuild(root.getDeployState(), root, parse( "<component id='parent'>", " <component id='child' />", "</component>")); 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( "<federation id='theId'>", " <provides>p2</provides>", " <source-set inherits=\"default\" />", @@ -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( "<federation id='federation-id'>", " <target-selector id='my-id' class='my-class' />", "</federation>")); 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<String, ComponentsBuilder.ComponentType>()).doBuild(root, noProxy); + provider = new DomProviderBuilder(new HashMap<String, ComponentsBuilder.ComponentType>()).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<String, ComponentsBuilder.ComponentType>()).doBuild(root, defaultProxy); + provider = new DomProviderBuilder(new HashMap<String, ComponentsBuilder.ComponentType>()).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<String, ComponentsBuilder.ComponentType>()).doBuild(root, proprietaryProxy); + provider = new DomProviderBuilder(new HashMap<String, ComponentsBuilder.ComponentType>()).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<String, ComponentsBuilder.ComponentType>()).doBuild(root, illegal_proxyWithoutId); + provider = new DomProviderBuilder(new HashMap<String, ComponentsBuilder.ComponentType>()).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 { "</searchchains>"); 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/builder/xml/dom/chains/search/DomSearcherBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearcherBuilderTest.java index 96d51677213..68579a5e3e4 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearcherBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/chains/search/DomSearcherBuilderTest.java @@ -16,7 +16,7 @@ public class DomSearcherBuilderTest extends DomBuilderTest { @Test public void ensureCorrectModel() { - ChainedComponent<ChainedComponentModel> searcher = new DomSearcherBuilder().doBuild(root, parse( + ChainedComponent<ChainedComponentModel> searcher = new DomSearcherBuilder().doBuild(root.getDeployState(), root, parse( "<searcher id='theId' class='theclassid' bundle='thebundle' provides='p1'>", " <provides>p2</provides>", "</searcher>")); 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/jersey/xml/RestApiTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java index 503b38b79b4..e954e6343de 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/jersey/xml/RestApiTest.java @@ -55,7 +55,7 @@ public class RestApiTest extends ContainerModelBuilderTestBase { public void setup() throws Exception { createModel(root, restApiXml); root.validate(); - getContainerCluster(CLUSTER_ID).prepare(); + getContainerCluster(CLUSTER_ID).prepare(root.getDeployState()); restApi = getContainerCluster(CLUSTER_ID).getRestApiMap().values().iterator().next(); servlet = restApi.getJersey2Servlet(); context = restApi.getContext(); 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<ProcessingChain>)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 { " <chain id='default' inherits='nonexistent' />", "</search>"); 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 { " </filtering>", " </http>"); - 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 { " </filtering>", " </http>"); - 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 { " </filtering>", " </http>"); - 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 { " </filtering>", " </http>"); - 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<SearchNode> 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/DomTestServiceBuilder.java b/config-model/src/test/java/com/yahoo/vespa/model/test/DomTestServiceBuilder.java index 75c220d7247..fb997e5be1e 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/DomTestServiceBuilder.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/DomTestServiceBuilder.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.test; +import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import org.w3c.dom.Element; @@ -11,8 +12,7 @@ import org.w3c.dom.Element; public class DomTestServiceBuilder { - static class SimpleServiceBuilder - extends VespaDomBuilder.DomConfigProducerBuilder<SimpleService> { + static class SimpleServiceBuilder extends VespaDomBuilder.DomConfigProducerBuilder<SimpleService> { int i; public SimpleServiceBuilder(int i) { @@ -20,14 +20,12 @@ public class DomTestServiceBuilder { } @Override - protected SimpleService doBuild(AbstractConfigProducer parent, - Element spec) { + protected SimpleService doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new SimpleService(parent, "simpleservice." + i); } } - static class ApiServiceBuilder - extends VespaDomBuilder.DomConfigProducerBuilder<ApiService> { + static class ApiServiceBuilder extends VespaDomBuilder.DomConfigProducerBuilder<ApiService> { int i; public ApiServiceBuilder(int i) { @@ -35,14 +33,12 @@ public class DomTestServiceBuilder { } @Override - protected ApiService doBuild(AbstractConfigProducer parent, - Element spec) { + protected ApiService doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new ApiService(parent, "apiservice." + i); } } - static class ParentServiceBuilder - extends VespaDomBuilder.DomConfigProducerBuilder<ParentService> { + static class ParentServiceBuilder extends VespaDomBuilder.DomConfigProducerBuilder<ParentService> { int i; public ParentServiceBuilder(int i) { @@ -50,8 +46,7 @@ public class DomTestServiceBuilder { } @Override - protected ParentService doBuild(AbstractConfigProducer parent, - Element spec) { + protected ParentService doBuild(DeployState deployState, AbstractConfigProducer parent, Element spec) { return new ParentService(parent, "parentservice." + i, spec); } } 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 { |