From 35e957f09c4018c2e1bab70da2e632130b0b43e6 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Fri, 24 Aug 2018 18:39:36 +0200 Subject: Generate a global rank profile config This makes available to all regular container clusters a config containing a set of rank profiles containing the expressions resulting from converting all the ml models added in the models/ directory in the application package. --- .../model/ApplicationConfigProducerRoot.java | 4 +- .../com/yahoo/config/model/ConfigModelContext.java | 30 ++++++++++----- .../com/yahoo/config/model/ConfigModelRepo.java | 24 ++++++++---- .../yahoo/config/model/ConfigModelRepoAdder.java | 2 +- .../model/builder/xml/ConfigModelBuilder.java | 5 ++- .../searchdefinition/RankProfileRegistry.java | 4 +- .../searchdefinition/derived/AttributeFields.java | 5 ++- .../searchdefinition/derived/RankProfileList.java | 24 ++++++++---- .../java/com/yahoo/vespa/model/VespaModel.java | 28 ++++++++++---- .../model/builder/xml/dom/DomAdminV2Builder.java | 3 +- .../vespa/model/container/ContainerCluster.java | 43 ++++++++++++++++++++-- .../model/container/xml/ContainerModelBuilder.java | 9 ++++- .../com/yahoo/vespa/model/content/Content.java | 3 +- .../model/content/cluster/ContentCluster.java | 12 +++++- .../yahoo/config/model/ConfigModelContextTest.java | 9 ++--- .../yahoo/config/model/graph/ModelGraphTest.java | 16 ++++---- .../xml/dom/LegacyConfigModelBuilderTest.java | 2 +- .../model/container/ContainerClusterTest.java | 11 +++--- .../configserver/ConfigserverClusterTest.java | 2 +- .../docproc/StandaloneDocprocContainerTest.java | 5 +-- .../model/container/http/FilterBindingsTest.java | 2 +- .../container/xml/ContainerModelBuilderTest.java | 2 +- .../xml/ContainerModelBuilderTestBase.java | 11 +++--- .../model/container/xml/DocprocBuilderTest.java | 2 +- .../model/container/xml/IdentityBuilderTest.java | 2 +- .../model/container/xml/RoutingBuilderTest.java | 2 +- .../model/content/utils/ContentClusterUtils.java | 4 +- .../model/generic/GenericServicesModelTest.java | 2 +- 28 files changed, 183 insertions(+), 85 deletions(-) (limited to 'config-model') 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 912968747df..7a5969585e9 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 @@ -125,11 +125,11 @@ public class ApplicationConfigProducerRoot extends AbstractConfigProducer asMap() { return Collections.unmodifiableMap(configModelMap); } /** Initialize part 1.: Reads the config models used in the application package. */ - public void readConfigModels(DeployState deployState, VespaModelBuilder builder, - ApplicationConfigProducerRoot root, ConfigModelRegistry configModelRegistry) throws IOException, SAXException { + public void readConfigModels(DeployState deployState, + VespaModel vespaModel, + VespaModelBuilder builder, + ApplicationConfigProducerRoot root, + ConfigModelRegistry configModelRegistry) throws IOException, SAXException { Element userServicesElement = getServicesFromApp(deployState.getApplicationPackage()); - readConfigModels(root, userServicesElement, deployState, configModelRegistry); + readConfigModels(root, userServicesElement, deployState, vespaModel, configModelRegistry); builder.postProc(root, this); } @@ -104,7 +108,11 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter * @param servicesRoot XML root node of the services file */ @SuppressWarnings("deprecation") - private void readConfigModels(ApplicationConfigProducerRoot root, Element servicesRoot, DeployState deployState, ConfigModelRegistry configModelRegistry) throws IOException, SAXException { + private void readConfigModels(ApplicationConfigProducerRoot root, + Element servicesRoot, + DeployState deployState, + VespaModel vespaModel, + ConfigModelRegistry configModelRegistry) throws IOException, SAXException { final Map> model2Element = new LinkedHashMap<>(); ModelGraphBuilder graphBuilder = new ModelGraphBuilder(); @@ -140,7 +148,7 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter } for (ModelNode node : graphBuilder.build().topologicalSort()) - buildModels(node, getApplicationType(servicesRoot), deployState, root, model2Element.get(node.builder)); + buildModels(node, getApplicationType(servicesRoot), deployState, vespaModel, root, model2Element.get(node.builder)); for (ConfigModel model : configModels) model.initialize(ConfigModelRepo.this); // XXX deprecated } @@ -174,10 +182,11 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter private void buildModels(ModelNode node, ApplicationType applicationType, DeployState deployState, + VespaModel vespaModel, AbstractConfigProducer parent, List elements) { for (Element servicesElement : elements) { - ConfigModel model = buildModel(node, applicationType, deployState, parent, servicesElement); + ConfigModel model = buildModel(node, applicationType, deployState, vespaModel, parent, servicesElement); if (model.isServing()) add(model); } @@ -186,10 +195,11 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter private ConfigModel buildModel(ModelNode node, ApplicationType applicationType, DeployState deployState, + VespaModel vespaModel, AbstractConfigProducer parent, Element servicesElement) { ConfigModelBuilder builder = node.builder; - ConfigModelContext context = ConfigModelContext.create(applicationType, deployState, this, parent, getIdString(servicesElement)); + ConfigModelContext context = ConfigModelContext.create(applicationType, deployState, vespaModel, this, parent, getIdString(servicesElement)); return builder.build(node, servicesElement, context); } diff --git a/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepoAdder.java b/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepoAdder.java index b16b65b9540..731cae48881 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepoAdder.java +++ b/config-model/src/main/java/com/yahoo/config/model/ConfigModelRepoAdder.java @@ -5,7 +5,7 @@ package com.yahoo.config.model; * An interface which provides addition of new config models. * This exists because some models need to add additional models during the build phase so *write* access * to the config model repo is needed. *Read* access, on the other hand needs to happen through config model dependency - * inkection to avoid circular dependencies or undeclared dependencies working by accident. + * injection to avoid circular dependencies or undeclared dependencies working by accident. * * @author bratseth */ diff --git a/config-model/src/main/java/com/yahoo/config/model/builder/xml/ConfigModelBuilder.java b/config-model/src/main/java/com/yahoo/config/model/builder/xml/ConfigModelBuilder.java index bb0d24f9b26..b1e197db4eb 100644 --- a/config-model/src/main/java/com/yahoo/config/model/builder/xml/ConfigModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/config/model/builder/xml/ConfigModelBuilder.java @@ -9,6 +9,7 @@ import com.yahoo.config.model.ConfigModelRepo; import com.yahoo.config.model.api.ConfigModelPlugin; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; +import com.yahoo.vespa.model.VespaModel; import org.w3c.dom.Element; import java.lang.reflect.Constructor; @@ -54,9 +55,9 @@ public abstract class ConfigModelBuilder extends Abst * @param parent the root config producer this should be added to * @param spec the XML element this is constructed from */ - public final MODEL build(DeployState deployState, ConfigModelRepo configModelRepo, + public final MODEL build(DeployState deployState, VespaModel vespaModel, ConfigModelRepo configModelRepo, AbstractConfigProducer parent, Element spec) { - ConfigModelContext context = ConfigModelContext.create(deployState, configModelRepo, parent, getIdString(spec)); + ConfigModelContext context = ConfigModelContext.create(deployState, vespaModel, configModelRepo, parent, getIdString(spec)); return build(new DefaultModelInstanceFactory(), spec, context); } diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java index 599eef57b2f..53afebfd93b 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java @@ -66,7 +66,9 @@ public class RankProfileRegistry { * @return the RankProfile to return. */ public RankProfile get(Search search, String name) { - return rankProfiles.get(search).get(name); + Map profiles = rankProfiles.get(search); + if (profiles == null) return null; + return profiles.get(name); } /** diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java index 55f3a94bb70..a3580a404a3 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java @@ -41,8 +41,11 @@ public class AttributeFields extends Derived implements AttributesConfig.Produce /** Whether this has any position attribute */ private boolean hasPosition = false; + public static final AttributeFields empty = new AttributeFields(null); + public AttributeFields(Search search) { - derive(search); + if (search != null) + derive(search); } /** Derives everything from a field */ diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java index a0bac42d9b9..0417a879969 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java @@ -12,11 +12,16 @@ import java.util.Map; /** * The derived rank profiles of a search definition * - * @author bratseth + * @author bratseth */ public class RankProfileList extends Derived implements RankProfilesConfig.Producer { - private Map rankProfiles = new java.util.LinkedHashMap<>(); + private final Map rankProfiles = new java.util.LinkedHashMap<>(); + + public static RankProfileList empty = new RankProfileList(); + + private RankProfileList() { + } /** * Creates a rank profile @@ -29,7 +34,7 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ RankProfileRegistry rankProfileRegistry, QueryProfileRegistry queryProfiles, ImportedModels importedModels) { - setName(search.getName()); + setName(search == null ? "default" : search.getName()); deriveRankProfiles(rankProfileRegistry, queryProfiles, importedModels, search, attributeFields); } @@ -38,11 +43,13 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ ImportedModels importedModels, Search search, AttributeFields attributeFields) { - RawRankProfile defaultProfile = new RawRankProfile(rankProfileRegistry.get(search, "default"), - queryProfiles, - importedModels, - attributeFields); - rankProfiles.put(defaultProfile.getName(), defaultProfile); + if (search != null) { // profiles belonging to a search have a default profile + RawRankProfile defaultProfile = new RawRankProfile(rankProfileRegistry.get(search, "default"), + queryProfiles, + importedModels, + attributeFields); + rankProfiles.put(defaultProfile.getName(), defaultProfile); + } for (RankProfile rank : rankProfileRegistry.rankProfilesOf(search)) { if ("default".equals(rank.getName())) continue; @@ -70,4 +77,5 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ rank.getConfig(builder); } } + } 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 ffb36bccf7f..675c3044609 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 @@ -27,7 +27,10 @@ import com.yahoo.config.model.producer.UserConfigRepo; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.log.LogLevel; 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.searchlib.rankingexpression.RankingExpression; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModel; import com.yahoo.searchlib.rankingexpression.integration.ml.ImportedModels; @@ -106,7 +109,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri private List serviceClusters = new ArrayList<>(); /** The global rank profiles of this model */ - private final ImmutableList rankProfiles; + private final RankProfileList rankProfileList; /** The global ranking constants of this model */ private final RankingConstants rankingConstants = new RankingConstants(); @@ -159,10 +162,17 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri this.applicationPackage = deployState.getApplicationPackage(); root = builder.getRoot(VespaModel.ROOT_CONFIGID, deployState, this); if (complete) { // create a a completed, frozen model - configModelRepo.readConfigModels(deployState, builder, root, configModelRegistry); + configModelRepo.readConfigModels(deployState, this, builder, root, configModelRegistry); addServiceClusters(deployState.getApplicationPackage(), builder); - this.rankProfiles = createGlobalRankProfiles(deployState.getImportedModels()); this.allocatedHosts = AllocatedHosts.withHosts(root.getHostSystem().getHostSpecs()); // must happen after the two lines above + + createGlobalRankProfiles(deployState.getImportedModels(), deployState.rankProfileRegistry()); + this.rankProfileList = new RankProfileList(null, // null search -> global + AttributeFields.empty, + deployState.rankProfileRegistry(), + deployState.getQueryProfiles().getRegistry(), + deployState.getImportedModels()); + setupRouting(); this.fileDistributor = root.getFileDistributionConfigProducer().getFileDistributor(); getAdmin().addPerHostServices(getHostSystem().getHosts(), deployState); @@ -175,7 +185,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri else { // create a model with no services instantiated and the given file distributor this.allocatedHosts = AllocatedHosts.withHosts(root.getHostSystem().getHostSpecs()); this.fileDistributor = fileDistributor; - this.rankProfiles = ImmutableList.of(); + this.rankProfileList = RankProfileList.empty; } } @@ -209,10 +219,11 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri /** * Creates a rank profile not attached to any search definition, for each imported model in the application package */ - private ImmutableList createGlobalRankProfiles(ImportedModels importedModels) { + private ImmutableList createGlobalRankProfiles(ImportedModels importedModels, + RankProfileRegistry rankProfileRegistry) { List profiles = new ArrayList<>(); for (ImportedModel model : importedModels.all()) { - RankProfile profile = new RankProfile(model.name(), this, deployState.rankProfileRegistry()); + RankProfile profile = new RankProfile(model.name(), this, rankProfileRegistry); for (Pair entry : model.outputExpressions(model.name())) { profile.addMacro(entry.getFirst(), false).setRankingExpression(entry.getSecond()); } @@ -220,8 +231,11 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri return ImmutableList.copyOf(profiles); } + /** Returns the global rank profiles as a rank profile list */ + public RankProfileList rankProfileList() { return rankProfileList; } + private void setupRouting() { - root.setupRouting(configModelRepo); + root.setupRouting(this, configModelRepo); } /** Returns the one and only HostSystem of this VespaModel */ 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 75cd755a91d..d67cb0c29c3 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 @@ -5,6 +5,7 @@ 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.producer.AbstractConfigProducer; +import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.text.XML; import com.yahoo.log.LogLevel; import com.yahoo.vespa.model.SimpleConfigProducer; @@ -89,7 +90,7 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { if (standaloneZooKeeper) { parent = new ClusterControllerCluster(parent, "standalone"); } - ContainerCluster cluster = new ContainerCluster(parent, "cluster-controllers", "cluster-controllers", new ClusterControllerClusterVerifier()); + ContainerCluster cluster = new ContainerCluster(parent, "cluster-controllers", "cluster-controllers", new ClusterControllerClusterVerifier(), RankProfileList.empty); ContainerModelBuilder.addDefaultHandler_legacyBuilder(cluster); List containers = new ArrayList<>(); 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 469b6781bae..dea900539b7 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 @@ -40,6 +40,10 @@ import com.yahoo.search.config.IndexInfoConfig; import com.yahoo.search.config.QrStartConfig; import com.yahoo.search.pagetemplates.PageTemplatesConfig; import com.yahoo.search.query.profile.config.QueryProfilesConfig; +import com.yahoo.searchdefinition.RankProfileRegistry; +import com.yahoo.searchdefinition.derived.AttributeFields; +import com.yahoo.searchdefinition.derived.RankProfileList; +import com.yahoo.vespa.config.search.RankProfilesConfig; import com.yahoo.vespa.configdefinition.IlscriptsConfig; import com.yahoo.vespa.model.PortsMeta; import com.yahoo.vespa.model.Service; @@ -65,6 +69,7 @@ import com.yahoo.vespa.model.container.jersey.JerseyHandler; import com.yahoo.vespa.model.container.jersey.RestApi; import com.yahoo.vespa.model.container.processing.ProcessingChains; import com.yahoo.vespa.model.container.search.ContainerSearch; +import com.yahoo.vespa.model.container.search.QueryProfiles; import com.yahoo.vespa.model.container.search.searchchain.SearchChains; import com.yahoo.vespa.model.content.Content; import com.yahoo.vespa.model.search.AbstractSearchCluster; @@ -122,7 +127,9 @@ public final class ContainerCluster ServletPathsConfig.Producer, RoutingProviderConfig.Producer, ConfigserverConfig.Producer, - ThreadpoolConfig.Producer + ThreadpoolConfig.Producer, + RankProfilesConfig.Producer + { /** @@ -169,6 +176,9 @@ public final class ContainerCluster private final ContainerClusterVerifier clusterVerifier; private final boolean isHostedVespa; + /** Global rank profiles, aka models */ + private final RankProfileList rankProfileList; + private Map concreteDocumentTypes = new LinkedHashMap<>(); private MetricDefaultsConfig.Factory.Enum defaultMetricConsumerFactory; @@ -193,11 +203,30 @@ public final class ContainerCluster } } - public ContainerCluster(AbstractConfigProducer parent, String subId, String name) { - this(parent, subId, name, new AcceptAllVerifier()); + /** + * Creates a container cluster + * + * @param rankProfileList the list ofd global rank profiles containing models that should be available in + * container clusters + */ + public ContainerCluster(AbstractConfigProducer parent, + String subId, + String name, + RankProfileList rankProfileList) { + this(parent, subId, name, new AcceptAllVerifier(), rankProfileList); } - public ContainerCluster(AbstractConfigProducer parent, String subId, String name, ContainerClusterVerifier verifier) { + /** + * Creates a container cluster + * + * @param rankProfileList the list ofd global rank profiles containing models that should be available in + * container clusters + */ + public ContainerCluster(AbstractConfigProducer parent, + String subId, + String name, + ContainerClusterVerifier verifier, + RankProfileList rankProfileList) { super(parent, subId); this.clusterVerifier = verifier; this.name = name; @@ -207,6 +236,7 @@ public final class ContainerCluster componentGroup = new ComponentGroup<>(this, "component"); restApiGroup = new ConfigProducerGroup<>(this, "rest-api"); servletGroup = new ConfigProducerGroup<>(this, "servlet"); + this.rankProfileList = rankProfileList; addComponent(new StatisticsComponent()); addSimpleComponent(AccessLog.class); @@ -694,6 +724,11 @@ public final class ContainerCluster containerDocproc.getConfig(builder); } + @Override + public void getConfig(RankProfilesConfig.Builder builder) { + rankProfileList.getConfig(builder); + } + public void setMbusParams(MbusParams mbusParams) { this.mbusParams = mbusParams; } 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 d81026c54d1..cb4cf92a223 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 @@ -25,6 +25,7 @@ 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; @@ -143,11 +144,15 @@ public class ContainerModelBuilder extends ConfigModelBuilder { } } - private ContainerCluster createContainerCluster(Element spec, final ConfigModelContext modelContext) { + private ContainerCluster createContainerCluster(Element spec, ConfigModelContext modelContext) { return new VespaDomBuilder.DomConfigProducerBuilder() { @Override protected ContainerCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) { - return new ContainerCluster(ancestor, modelContext.getProducerId(), modelContext.getProducerId()); + return new ContainerCluster(ancestor, + modelContext.getProducerId(), + modelContext.getProducerId(), + modelContext.vespaModel() != null ? modelContext.vespaModel().rankProfileList() + : RankProfileList.empty); } }.build(modelContext.getParentProducer(), spec); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java index 7bd70bba87a..d3709e88f29 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 @@ -14,6 +14,7 @@ import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; 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.admin.Admin; import com.yahoo.vespa.model.container.Container; @@ -298,7 +299,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, RankProfileList.empty); ContainerModel indexingClusterModel = new ContainerModel(modelContext.withParent(parent).withId(indexingCluster.getSubId())); indexingClusterModel.setCluster(indexingCluster); modelContext.getConfigModelRepoAdder().add(indexingClusterModel); 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 154f719ff10..cce367ed611 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 @@ -8,6 +8,7 @@ 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; @@ -435,8 +436,15 @@ public class ContentCluster extends AbstractConfigProducer implements return sortedHosts; } - private ContainerCluster createClusterControllers(AbstractConfigProducer parent, Collection hosts, String name, boolean multitenant) { - ContainerCluster clusterControllers = new ContainerCluster(parent, name, name, new ClusterControllerClusterVerifier()); + private ContainerCluster createClusterControllers(AbstractConfigProducer parent, + Collection hosts, + String name, + boolean multitenant) { + ContainerCluster clusterControllers = new ContainerCluster(parent, + name, + name, + new ClusterControllerClusterVerifier(), + RankProfileList.empty); List containers = new ArrayList<>(); // Add a cluster controller on each config server (there is always at least one). if (clusterControllers.getContainers().isEmpty()) { 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 aa17ea894bf..cb51cf23830 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 @@ -9,15 +9,12 @@ import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.model.test.MockRoot; import org.junit.Test; -import java.util.Optional; - import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertThat; /** - * @author lulf - * @since 5.1 + * @author Ulf Lilleengen */ public class ConfigModelContextTest { @@ -30,12 +27,12 @@ public class ConfigModelContextTest { .build(); DeployState deployState = DeployState.createTestState(pkg); DeployLogger logger = deployState.getDeployLogger(); - ConfigModelContext ctx = ConfigModelContext.create(deployState, null, root, id); + ConfigModelContext ctx = ConfigModelContext.create(deployState, null, null, root, id); assertThat(ctx.getApplicationPackage(), is(pkg)); assertThat(ctx.getProducerId(), is(id)); assertThat(ctx.getParentProducer(), is(root)); assertThat(ctx.getDeployLogger(), is(logger)); - ctx = ConfigModelContext.create(null, root, id); + ctx = ConfigModelContext.create(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 34da6e588be..85c5f5ece45 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 @@ -64,10 +64,10 @@ public class ModelGraphTest { ModelGraph graph = new ModelGraphBuilder().addBuilder(new GraphMock.BC()).addBuilder(new GraphMock.BB()).addBuilder(new GraphMock.BA()).build(); List nodes = graph.topologicalSort(); MockRoot root = new MockRoot(); - GraphMock.A a = (GraphMock.A) nodes.get(0).createModel(ConfigModelContext.create(null, root, "first")); - GraphMock.B b = (GraphMock.B) nodes.get(1).createModel(ConfigModelContext.create(null, root, "second")); - GraphMock.B b2 = (GraphMock.B) nodes.get(1).createModel(ConfigModelContext.create(null, root, "second2")); - GraphMock.C c = (GraphMock.C) nodes.get(2).createModel(ConfigModelContext.create(null, root, "third")); + 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")); assertNotNull(a); assertNotNull(b); assertNotNull(b2); @@ -91,7 +91,7 @@ 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, new MockRoot(), "foo")); + node.createModel(ConfigModelContext.create(null, null, new MockRoot(), "foo")); } @Test @@ -99,7 +99,7 @@ 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, new MockRoot(), "foo")); + node.createModel(ConfigModelContext.create(null, null, new MockRoot(), "foo")); } @Test @@ -107,8 +107,8 @@ public class ModelGraphTest { ModelGraph graph = new ModelGraphBuilder().addBuilder(new GraphMock.BC()).addBuilder(new GraphMock.BA()).build(); List nodes = graph.topologicalSort(); MockRoot root = new MockRoot(); - GraphMock.A a = (GraphMock.A) nodes.get(0).createModel(ConfigModelContext.create(null, root, "first")); - GraphMock.C c = (GraphMock.C) nodes.get(1).createModel(ConfigModelContext.create(null, root, "second")); + 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")); assertThat(c.a, is(a)); assertTrue(c.b.isEmpty()); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilderTest.java index 8070c4ef1bd..76182076ee5 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/builder/xml/dom/LegacyConfigModelBuilderTest.java @@ -27,7 +27,7 @@ public class LegacyConfigModelBuilderTest { String services = "value"; ModelBuilder builder = new ModelBuilder(); Model model = builder.build(DeployState.createTestState(new MockApplicationPackage.Builder().withServices(services).build()), - null, new MockRoot(), XML.getDocument(services).getDocumentElement()); + null, null, new MockRoot(), XML.getDocument(services).getDocumentElement()); assertThat(model.getContext().getParentProducer().getUserConfigs().size(), is(1)); } 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 d9c151480fe..850fd91e151 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 @@ -16,6 +16,7 @@ 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; @@ -80,7 +81,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", RankProfileList.empty); ConfigserverConfig.Builder builder = new ConfigserverConfig.Builder(); cluster.getConfig(builder); ConfigserverConfig config = new ConfigserverConfig(builder); @@ -111,8 +112,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(), RankProfileList.empty) + : new ContainerCluster(root, "container0", "container1", RankProfileList.empty); if (isCombinedCluster) cluster.setHostClusterId("test-content-cluster"); cluster.setMemoryPercentage(memoryPercentage); @@ -257,7 +258,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", RankProfileList.empty); RoutingProviderConfig.Builder builder = new RoutingProviderConfig.Builder(); cluster.getConfig(builder); RoutingProviderConfig config = new RoutingProviderConfig(builder); @@ -281,7 +282,7 @@ public class ContainerClusterTest { } private static ContainerCluster newContainerCluster() { - ContainerCluster cluster = new ContainerCluster(null, "subId", "name"); + ContainerCluster cluster = new ContainerCluster(null, "subId", "name", RankProfileList.empty); 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/configserver/ConfigserverClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/configserver/ConfigserverClusterTest.java index d4209c9c788..b4ad2ddbd21 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/configserver/ConfigserverClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/configserver/ConfigserverClusterTest.java @@ -38,7 +38,7 @@ public class ConfigserverClusterTest { new ConfigServerContainerModelBuilder(new TestOptions().rpcPort(12345).useVespaVersionInRequest(true) .hostedVespa(true).environment("test").region("bar") .numParallelTenantLoaders(99)) - .build(new DeployState.Builder().build(), null, root, XML.getDocument(services).getDocumentElement()); + .build(new DeployState.Builder().build(), null, null, root, XML.getDocument(services).getDocumentElement()); root.freezeModelTopology(); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/docproc/StandaloneDocprocContainerTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/docproc/StandaloneDocprocContainerTest.java index 8995d6b80b0..3edc70833d8 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/docproc/StandaloneDocprocContainerTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/docproc/StandaloneDocprocContainerTest.java @@ -18,14 +18,13 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; /** - * @author Einar M R Rosenvinge - * @since 5.1.14 + * @author Einar M R Rosenvinge */ public class StandaloneDocprocContainerTest extends DomBuilderTest { public ContainerCluster setupCluster(boolean standalone) { ContainerModelBuilder builder = new ContainerModelBuilder(standalone, Networking.disable); - ContainerModel model = builder.build(DeployState.createTestState(), null, root, servicesXml()); + ContainerModel model = builder.build(DeployState.createTestState(), null, null, root, servicesXml()); if (!standalone) model.getCluster().getDocproc().getChains().addServersAndClientsForChains(); 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 420115627dc..9d5508cca75 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 @@ -38,7 +38,7 @@ public class FilterBindingsTest extends DomBuilderTest { private void buildContainerCluster(Element containerElem) throws SAXException, IOException { - ContainerModel model = new ContainerModelBuilder(true, Networking.enable).build(DeployState.createTestState(), null, root, containerElem); + ContainerModel model = new ContainerModelBuilder(true, Networking.enable).build(DeployState.createTestState(), null, null, root, containerElem); root.freezeModelTopology(); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java index e3dfa093735..f94ebab42a9 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java @@ -513,7 +513,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { ""); DeployState deployState = new DeployState.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east-1"))).build(); - createModel(root, deployState, clusterElem); + createModel(root, deployState, null, clusterElem); assertEquals(0, getContainerCluster("default").serviceAliases().size()); assertEquals(0, getContainerCluster("default").endpointAliases().size()); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTestBase.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTestBase.java index 47f8a1bbe29..e46e736dcd6 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTestBase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTestBase.java @@ -5,6 +5,7 @@ import com.yahoo.component.ComponentId; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.test.MockRoot; import com.yahoo.container.ComponentsConfig; +import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.ContainerModel; import com.yahoo.vespa.model.container.component.Component; @@ -22,7 +23,6 @@ import java.util.Collections; * not be done when using this class * * @author gjoranv - * @since 5.5 */ public abstract class ContainerModelBuilderTestBase { @@ -32,17 +32,18 @@ public abstract class ContainerModelBuilderTestBase { " "; protected MockRoot root; - public static void createModel(MockRoot root, DeployState deployState, Element... containerElems) throws SAXException, IOException { + public static void createModel(MockRoot root, DeployState deployState, VespaModel vespaModel, Element... containerElems) { for (Element containerElem : containerElems) { - ContainerModel model = new ContainerModelBuilder(false, ContainerModelBuilder.Networking.enable).build(deployState, null, root, containerElem); + ContainerModel model = new ContainerModelBuilder(false, ContainerModelBuilder.Networking.enable) + .build(deployState, vespaModel, null, root, containerElem); ContainerCluster cluster = model.getCluster(); generateDefaultSearchChains(cluster); } root.freezeModelTopology(); } - public static void createModel(MockRoot root, Element... containerElems) throws SAXException, IOException { - createModel(root, DeployState.createTestState(), containerElems); + public static void createModel(MockRoot root, Element... containerElems) { + createModel(root, DeployState.createTestState(), null, containerElems); } private static void generateDefaultSearchChains(ContainerCluster cluster) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java index 31191d0c5fb..f4d3fbc782c 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/DocprocBuilderTest.java @@ -49,7 +49,7 @@ public class DocprocBuilderTest extends DomBuilderTest { @Before public void setupCluster() { - ContainerModel model = new ContainerModelBuilder(false, Networking.disable).build(DeployState.createTestState(), null, root, servicesXml()); + ContainerModel model = new ContainerModelBuilder(false, Networking.disable).build(DeployState.createTestState(), null, null, root, servicesXml()); cluster = model.getCluster(); cluster.getDocproc().getChains().addServersAndClientsForChains(); root.freezeModelTopology(); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java index d3ad2ccc721..0fd138a7943 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java @@ -34,7 +34,7 @@ public class IdentityBuilderTest extends ContainerModelBuilderTestBase { .withDeploymentSpec(deploymentXml) .build(); - createModel(root, DeployState.createTestState(applicationPackage), clusterElem); + createModel(root, DeployState.createTestState(applicationPackage), null, clusterElem); IdentityConfig identityConfig = root.getConfig(IdentityConfig.class, "default/component/" + IdentityProvider.CLASS); assertEquals("domain", identityConfig.domain()); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java index a2f32694340..3d61ec3a3af 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java @@ -70,7 +70,7 @@ public class RoutingBuilderTest extends ContainerModelBuilderTestBase { .build(); root = new MockRoot("root", deployState); - createModel(root, deployState, clusterElem); + createModel(root, deployState, null, clusterElem); ContainerCluster cluster = getContainerCluster("default"); return cluster.getContainers().get(0); 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 b0d6c94947a..89d81ee262b 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 @@ -61,8 +61,8 @@ public class ContentClusterUtils { 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, root, null); - + 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 21521ba6b7e..91e9e5e656f 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 @@ -32,7 +32,7 @@ public class GenericServicesModelTest { @Test public void test_generic_services_model() { MockRoot root = new MockRoot(); - GenericServicesModel model = new GenericServicesModel(ConfigModelContext.create(null, root, "foo")); + GenericServicesModel model = new GenericServicesModel(ConfigModelContext.create(null, null, root, "foo")); assertThat(model.serviceClusters().size(), is(0)); model.addCluster(new ServiceCluster(root, "mycluster", "/bin/foo")); assertThat(model.serviceClusters().size(), is(1)); -- cgit v1.2.3