summaryrefslogtreecommitdiffstats
path: root/config-model/src/main
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-08-24 18:39:36 +0200
committerJon Bratseth <bratseth@oath.com>2018-08-24 18:39:36 +0200
commit35e957f09c4018c2e1bab70da2e632130b0b43e6 (patch)
treeccc5414c93737c7b4ca3cd4362043ca65d9d12e3 /config-model/src/main
parent0c1bd91225452980d79f7a9a38d1e5fa5aba8644 (diff)
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.
Diffstat (limited to 'config-model/src/main')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java4
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/ConfigModelContext.java30
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/ConfigModelRepo.java24
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/ConfigModelRepoAdder.java2
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/builder/xml/ConfigModelBuilder.java5
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankProfileRegistry.java4
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/AttributeFields.java5
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java24
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java28
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java3
-rwxr-xr-xconfig-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java43
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java9
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/Content.java3
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java12
14 files changed, 148 insertions, 48 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 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<Abstra
}
// TODO: Do this as another config model depending on the other models
- public void setupRouting(ConfigModelRepo configModels) {
+ public void setupRouting(VespaModel vespaModel, ConfigModelRepo configModels) {
if (admin != null) {
Routing routing = configModels.getRouting();
if (routing == null) {
- routing = new Routing(ConfigModelContext.create(configModels, this, "routing"));
+ routing = new Routing(ConfigModelContext.create(vespaModel, configModels, this, "routing"));
configModels.add(routing);
}
this.routing = routing;
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 78a8c161c3b..eea0b16b8e1 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
@@ -5,6 +5,7 @@ import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.model.producer.AbstractConfigProducer;
+import com.yahoo.vespa.model.VespaModel;
import java.util.stream.Stream;
@@ -19,16 +20,18 @@ public final class ConfigModelContext {
private final AbstractConfigProducer parent;
private final String producerId;
private final DeployState deployState;
+ private final VespaModel vespaModel;
private final ConfigModelRepoAdder configModelRepoAdder;
private final ApplicationType applicationType;
private ConfigModelContext(ApplicationType applicationType,
DeployState deployState,
- ConfigModelRepoAdder configModelRepoAdder,
+ VespaModel vespaModel, ConfigModelRepoAdder configModelRepoAdder,
AbstractConfigProducer parent,
String producerId) {
this.applicationType = applicationType;
this.deployState = deployState;
+ this.vespaModel = vespaModel;
this.configModelRepoAdder = configModelRepoAdder;
this.parent = parent;
this.producerId = producerId;
@@ -40,18 +43,23 @@ public final class ConfigModelContext {
public DeployLogger getDeployLogger() { return deployState.getDeployLogger(); }
public DeployState getDeployState() { return deployState; }
public ApplicationType getApplicationType() { return applicationType; }
+ public VespaModel vespaModel() { return vespaModel; }
/** Returns write access to the config model repo, or null (only) if this is improperly initialized during testing */
public ConfigModelRepoAdder getConfigModelRepoAdder() { return configModelRepoAdder; }
/** Create a new context with a different parent */
public ConfigModelContext withParent(AbstractConfigProducer newParent) {
- return ConfigModelContext.create(deployState, configModelRepoAdder, newParent, producerId);
+ return ConfigModelContext.create(deployState, vespaModel, configModelRepoAdder, newParent, producerId);
}
/** Create a new context with a different config model producer id */
public ConfigModelContext withId(String producerId) {
- return ConfigModelContext.create(deployState, configModelRepoAdder, parent, producerId);
+ return ConfigModelContext.create(deployState, vespaModel, configModelRepoAdder, parent, producerId);
+ }
+
+ public ConfigModelContext with(VespaModel vespaModel) {
+ return ConfigModelContext.create(deployState, vespaModel, configModelRepoAdder, parent, producerId);
}
/**
@@ -61,9 +69,9 @@ public final class ConfigModelContext {
* @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(ConfigModelRepoAdder configModelRepoAdder,
+ public static ConfigModelContext create(VespaModel vespaModel, ConfigModelRepoAdder configModelRepoAdder,
AbstractConfigProducer parent, String producerId) {
- return create(parent.getRoot().getDeployState(), configModelRepoAdder, parent, producerId);
+ return create(parent.getRoot().getDeployState(), vespaModel, configModelRepoAdder, parent, producerId);
}
/**
@@ -74,9 +82,12 @@ public final class ConfigModelContext {
* @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(DeployState deployState, ConfigModelRepoAdder configModelRepoAdder,
- AbstractConfigProducer parent, String producerId) {
- return new ConfigModelContext(ApplicationType.DEFAULT, deployState, configModelRepoAdder, parent, producerId);
+ public static ConfigModelContext create(DeployState deployState,
+ VespaModel vespaModel,
+ ConfigModelRepoAdder configModelRepoAdder,
+ AbstractConfigProducer parent,
+ String producerId) {
+ return new ConfigModelContext(ApplicationType.DEFAULT, deployState, vespaModel, configModelRepoAdder, parent, producerId);
}
/**
@@ -90,10 +101,11 @@ public final class ConfigModelContext {
*/
public static ConfigModelContext create(ApplicationType applicationType,
DeployState deployState,
+ VespaModel vespaModel,
ConfigModelRepoAdder configModelRepoAdder,
AbstractConfigProducer parent,
String producerId) {
- return new ConfigModelContext(applicationType, deployState, configModelRepoAdder, parent, producerId);
+ return new ConfigModelContext(applicationType, deployState, vespaModel, configModelRepoAdder, parent, producerId);
}
public enum ApplicationType {
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 5ec34b62ca2..60089f04572 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
@@ -15,6 +15,7 @@ import com.yahoo.log.LogLevel;
import com.yahoo.path.Path;
import com.yahoo.text.XML;
import com.yahoo.config.model.producer.AbstractConfigProducer;
+import com.yahoo.vespa.model.VespaModel;
import com.yahoo.vespa.model.builder.VespaModelBuilder;
import com.yahoo.vespa.model.clients.Clients;
import com.yahoo.vespa.model.content.Content;
@@ -71,10 +72,13 @@ public class ConfigModelRepo implements ConfigModelRepoAdder, Serializable, Iter
public Map<String,ConfigModel> 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<ConfigModelBuilder, List<Element>> 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<Element> 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<MODEL extends ConfigModel> 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<String, RankProfile> 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<String, RawRankProfile> rankProfiles = new java.util.LinkedHashMap<>();
+ private final Map<String, RawRankProfile> 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<ServiceCluster> serviceClusters = new ArrayList<>();
/** The global rank profiles of this model */
- private final ImmutableList<RankProfile> 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<RankProfile> createGlobalRankProfiles(ImportedModels importedModels) {
+ private ImmutableList<RankProfile> createGlobalRankProfiles(ImportedModels importedModels,
+ RankProfileRegistry rankProfileRegistry) {
List<RankProfile> 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<String, RankingExpression> 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<Container> 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<String, String> 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<ContainerModel> {
}
}
- private ContainerCluster createContainerCluster(Element spec, final ConfigModelContext modelContext) {
+ 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());
+ 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<HostResource> hosts, String name, boolean multitenant) {
- ContainerCluster clusterControllers = new ContainerCluster(parent, name, name, new ClusterControllerClusterVerifier());
+ private ContainerCluster createClusterControllers(AbstractConfigProducer parent,
+ Collection<HostResource> hosts,
+ String name,
+ boolean multitenant) {
+ ContainerCluster clusterControllers = new ContainerCluster(parent,
+ name,
+ name,
+ new ClusterControllerClusterVerifier(),
+ RankProfileList.empty);
List<Container> containers = new ArrayList<>();
// Add a cluster controller on each config server (there is always at least one).
if (clusterControllers.getContainers().isEmpty()) {