summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-04-19 13:00:52 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2017-04-19 13:00:52 +0200
commit43ccb0583cf52cfdc75df493bda4b60dd5263eed (patch)
tree05c9c77f55fd60be96bcb673e2c0fd7c25aeaa76 /config-model
parent16b11bcc414e23d1f901a98d712212f1c7c9d2df (diff)
Always pass wanted Vespa version
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/DeployProperties.java1
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java25
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java12
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java28
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java22
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/Content.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/StorageGroup.java13
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java35
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/MapConfigModelRegistryTest.java7
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java4
-rw-r--r--config-model/src/test/java/com/yahoo/searchdefinition/derived/SummaryTestCase.java3
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java3
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java24
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/utils/ContentClusterUtils.java7
16 files changed, 117 insertions, 75 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployProperties.java
index c734e5a9c42..ccf300aedbd 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployProperties.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployProperties.java
@@ -51,6 +51,7 @@ public class DeployProperties {
return hostedVespa;
}
+ /** Returns the config model version this is building */
public Version vespaVersion() {
return vespaVersion;
}
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
index 968e690fac3..14f42a56bc3 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
@@ -1,6 +1,8 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.model.deploy;
+import com.yahoo.component.Version;
+import com.yahoo.component.Vtag;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.config.application.api.FileRegistry;
@@ -47,7 +49,7 @@ import java.util.Set;
import java.util.logging.Logger;
/**
- * Contains various state during deploy that should be reachable to all builders of a {@link com.yahoo.config.model.ConfigModel}
+ * Contains various state during deploy that should be available in all builders of a {@link com.yahoo.config.model.ConfigModel}
*
* @author lulf
* @since 5.8
@@ -68,6 +70,7 @@ public class DeployState implements ConfigDefinitionStore {
private final QueryProfiles queryProfiles;
private final SemanticRules semanticRules;
private final ValidationOverrides validationOverrides;
+ private final Version wantedNodeVespaVersion;
private final HostProvisioner provisioner;
@@ -83,18 +86,14 @@ public class DeployState implements ConfigDefinitionStore {
FileRegistry fileRegistry, DeployLogger deployLogger, Optional<HostProvisioner> hostProvisioner, DeployProperties properties,
Optional<ApplicationPackage> permanentApplicationPackage, Optional<ConfigDefinitionRepo> configDefinitionRepo,
java.util.Optional<Model> previousModel, Set<Rotation> rotations, Zone zone, QueryProfiles queryProfiles,
- SemanticRules semanticRules, Instant now) {
+ SemanticRules semanticRules, Instant now, Version wantedNodeVespaVersion) {
this.logger = deployLogger;
this.fileRegistry = fileRegistry;
this.rankProfileRegistry = rankProfileRegistry;
this.applicationPackage = applicationPackage;
this.properties = properties;
this.previousModel = previousModel;
- if (hostProvisioner.isPresent()) {
- this.provisioner = hostProvisioner.get();
- } else {
- this.provisioner = getDefaultModelHostProvisioner(applicationPackage);
- }
+ this.provisioner = hostProvisioner.orElse(getDefaultModelHostProvisioner(applicationPackage));
this.searchDefinitions = searchDocumentModel.getSearchDefinitions();
this.documentModel = searchDocumentModel.getDocumentModel();
this.permanentApplicationPackage = permanentApplicationPackage;
@@ -104,7 +103,7 @@ public class DeployState implements ConfigDefinitionStore {
this.queryProfiles = queryProfiles; // TODO: Remove this by seeing how pagetemplates are propagated
this.semanticRules = semanticRules; // TODO: Remove this by seeing how pagetemplates are propagated
this.validationOverrides = new ValidationOverridesXMLReader().read(applicationPackage.getValidationOverrides(), now);
-
+ this.wantedNodeVespaVersion = wantedNodeVespaVersion;
}
public static HostProvisioner getDefaultModelHostProvisioner(ApplicationPackage applicationPackage) {
@@ -212,6 +211,8 @@ public class DeployState implements ConfigDefinitionStore {
public QueryProfiles getQueryProfiles() { return queryProfiles; }
public SemanticRules getSemanticRules() { return semanticRules; }
+
+ public Version getWantedNodeVespaVersion() { return wantedNodeVespaVersion; }
public static class Builder {
@@ -226,6 +227,7 @@ public class DeployState implements ConfigDefinitionStore {
private Set<Rotation> rotations = new HashSet<>();
private Zone zone = Zone.defaultZone();
private Instant now = Instant.now();
+ private Version wantedNodeVespaVersion = Vtag.currentVersion;
public Builder applicationPackage(ApplicationPackage applicationPackage) {
this.applicationPackage = applicationPackage;
@@ -281,6 +283,11 @@ public class DeployState implements ConfigDefinitionStore {
this.now = now;
return this;
}
+
+ public Builder wantedNodeVespaVersion(Version version) {
+ this.wantedNodeVespaVersion = version;
+ return this;
+ }
public DeployState build() {
RankProfileRegistry rankProfileRegistry = new RankProfileRegistry();
@@ -288,7 +295,7 @@ public class DeployState implements ConfigDefinitionStore {
SemanticRules semanticRules = new SemanticRuleBuilder().build(applicationPackage);
SearchDocumentModel searchDocumentModel = createSearchDocumentModel(rankProfileRegistry, logger, queryProfiles);
return new DeployState(applicationPackage, searchDocumentModel, rankProfileRegistry, fileRegistry, logger, hostProvisioner,
- properties, permanentApplicationPackage, configDefinitionRepo, previousModel, rotations, zone, queryProfiles, semanticRules, now);
+ properties, permanentApplicationPackage, configDefinitionRepo, previousModel, rotations, zone, queryProfiles, semanticRules, now, wantedNodeVespaVersion);
}
private SearchDocumentModel createSearchDocumentModel(RankProfileRegistry rankProfileRegistry, DeployLogger logger, QueryProfiles queryProfiles) {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java
index 8e384b6e875..36071c4387e 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java
@@ -70,6 +70,7 @@ public class VespaModelFactory implements ModelFactory {
this.clock = clock;
}
+ /** Returns the version this model is build for */
@Override
public Version getVersion() {
return Version.fromIntValues(VespaVersion.major, VespaVersion.minor, VespaVersion.micro);
@@ -129,7 +130,8 @@ public class VespaModelFactory implements ModelFactory {
.modelHostProvisioner(createHostProvisioner(modelContext))
.rotations(modelContext.properties().rotations())
.zone(zone)
- .now(clock.instant());
+ .now(clock.instant())
+ .wantedNodeVespaVersion(modelContext.wantedNodeVespaVersion());
modelContext.previousModel().ifPresent(builder::previousModel);
return builder.build();
}
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 0a433cbc122..260d8f72270 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
@@ -63,21 +63,21 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu
}
@Override
- protected Admin doBuild(AbstractConfigProducer parent, Element adminE) {
- Yamas yamas = getYamas(XML.getChild(adminE, "yamas"));
+ protected Admin doBuild(AbstractConfigProducer parent, Element adminElement) {
+ Yamas yamas = getYamas(XML.getChild(adminElement, "yamas"));
Metrics metrics = new MetricsBuilder(applicationType, predefinedMetricSets)
- .buildMetrics(XML.getChild(adminE, "metrics"));
+ .buildMetrics(XML.getChild(adminElement, "metrics"));
Map<String, MetricsConsumer> legacyMetricsConsumers = DomMetricBuilderHelper
- .buildMetricsConsumers(XML.getChild(adminE, "metric-consumers"));
+ .buildMetricsConsumers(XML.getChild(adminElement, "metric-consumers"));
Admin admin = new Admin(parent, yamas, metrics, legacyMetricsConsumers, multitenant);
- doBuildAdmin(admin, adminE);
+ doBuildAdmin(admin, adminElement);
new ModelConfigProvider(admin);
- FileDistributionOptions fileDistributionOptions = new DomFileDistributionOptionsBuilder().build(XML.getChild(adminE, "filedistribution"));
+ FileDistributionOptions fileDistributionOptions = new DomFileDistributionOptionsBuilder().build(XML.getChild(adminElement, "filedistribution"));
admin.setFileDistribution(new FileDistributionConfigProducer.Builder(fileDistributionOptions).build(parent, fileRegistry));
return admin;
}
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 760fe246fc5..08843d306b7 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
@@ -1,6 +1,7 @@
// Copyright 2016 Yahoo Inc. 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.component.Version;
import com.yahoo.config.model.api.ConfigServerSpec;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.application.api.DeployLogger;
@@ -28,25 +29,29 @@ import java.util.Optional;
public class DomAdminV4Builder extends DomAdminBuilderBase {
private final Collection<ContainerModel> containerModels;
- private final DeployLogger deployLogger;
+ private final ConfigModelContext context;
- public DomAdminV4Builder(ConfigModelContext modelContext, boolean multitenant, List<ConfigServerSpec> configServerSpecs, Collection<ContainerModel> containerModels) {
- super(modelContext.getApplicationType(), modelContext.getDeployState().getFileRegistry(), multitenant, configServerSpecs);
+ public DomAdminV4Builder(ConfigModelContext context, boolean multitenant, List<ConfigServerSpec> configServerSpecs, Collection<ContainerModel> containerModels) {
+ super(context.getApplicationType(), context.getDeployState().getFileRegistry(), multitenant, configServerSpecs);
this.containerModels = containerModels;
- this.deployLogger = modelContext.getDeployLogger();
+ this.context = context;
}
@Override
protected void doBuildAdmin(Admin admin, Element w3cAdminElement) {
ModelElement adminElement = new ModelElement(w3cAdminElement);
admin.addConfigservers(getConfigServersFromSpec(admin));
-
+ Version version = context.getDeployState().getWantedNodeVespaVersion();
+
// Note: These two elements only exists in admin version 4.0
// This build handles admin version 3.0 by ignoring its content (as the content is not useful)
- Optional<NodesSpecification> requestedSlobroks = NodesSpecification.optionalDedicatedFromParent(adminElement.getChild("slobroks"));
- Optional<NodesSpecification> requestedLogservers = NodesSpecification.optionalDedicatedFromParent(adminElement.getChild("logservers"));
- assignSlobroks(requestedSlobroks.orElse(NodesSpecification.nonDedicated(3)), admin);
- assignLogserver(requestedLogservers.orElse(NodesSpecification.nonDedicated(1)), admin);
+ Optional<NodesSpecification> requestedSlobroks =
+ NodesSpecification.optionalDedicatedFromParent(adminElement.getChild("slobroks"), version);
+ Optional<NodesSpecification> requestedLogservers =
+ NodesSpecification.optionalDedicatedFromParent(adminElement.getChild("logservers"), version);
+
+ assignSlobroks(requestedSlobroks.orElse(NodesSpecification.nonDedicated(3, version)), admin);
+ assignLogserver(requestedLogservers.orElse(NodesSpecification.nonDedicated(1, version)), admin);
}
private void assignSlobroks(NodesSpecification nodesSpecification, Admin admin) {
@@ -71,7 +76,10 @@ public class DomAdminV4Builder extends DomAdminBuilderBase {
}
private Collection<HostResource> allocateHosts(HostSystem hostSystem, String clusterId, NodesSpecification nodesSpecification) {
- return nodesSpecification.provision(hostSystem, ClusterSpec.Type.admin, ClusterSpec.Id.from(clusterId), deployLogger).keySet();
+ return nodesSpecification.provision(hostSystem,
+ ClusterSpec.Type.admin,
+ ClusterSpec.Id.from(clusterId),
+ context.getDeployLogger()).keySet();
}
/**
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java
index c29990b02e6..eeb6d286da4 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java
@@ -111,7 +111,7 @@ public class NodesSpecification {
public int groups() { return groups; }
public Map<HostResource, ClusterMembership> provision(HostSystem hostSystem, ClusterSpec.Type clusterType, ClusterSpec.Id clusterId, DeployLogger logger) {
- ClusterSpec cluster = ClusterSpec.request(clusterType, clusterId, version, dockerImage);
+ ClusterSpec cluster = ClusterSpec.request(clusterType, clusterId, version);
return hostSystem.allocateHosts(cluster, Capacity.fromNodeCount(count, flavor, required), groups, logger);
}
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 c39b3247be1..32811fdcb78 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
@@ -400,9 +400,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
private List<Container> createNodes(ContainerCluster cluster, Element nodesElement, ConfigModelContext context) {
if (nodesElement.hasAttribute("count")) // regular, hosted node spec
- return createNodesFromNodeCount(cluster, nodesElement);
+ return createNodesFromNodeCount(cluster, nodesElement, context);
else if (nodesElement.hasAttribute("type")) // internal use for hosted system infrastructure nodes
- return createNodesFromNodeType(cluster, nodesElement);
+ return createNodesFromNodeType(cluster, nodesElement, context);
else if (nodesElement.hasAttribute("of")) // hosted node spec referencing a content cluster
return createNodesFromContentServiceReference(cluster, nodesElement, context);
else // the non-hosted option
@@ -448,7 +448,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
return singleContentHost.get();
}
else { // request 1 node
- ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from(cluster.getName()), Optional.empty());
+ ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from(cluster.getName()), context.getDeployState().getWantedNodeVespaVersion());
return cluster.getHostSystem().allocateHosts(clusterSpec, Capacity.fromNodeCount(1), 1, logger).keySet().iterator().next();
}
} else {
@@ -456,8 +456,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
}
}
- private List<Container> createNodesFromNodeCount(ContainerCluster cluster, Element nodesElement) {
- NodesSpecification nodesSpecification = NodesSpecification.from(new ModelElement(nodesElement));
+ private List<Container> createNodesFromNodeCount(ContainerCluster cluster, Element nodesElement, ConfigModelContext context) {
+ NodesSpecification nodesSpecification = NodesSpecification.from(new ModelElement(nodesElement),
+ context.getDeployState().getWantedNodeVespaVersion());
Map<HostResource, ClusterMembership> hosts = nodesSpecification.provision(cluster.getRoot().getHostSystem(),
ClusterSpec.Type.container,
ClusterSpec.Id.from(cluster.getName()),
@@ -465,11 +466,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
return createNodesFromHosts(hosts, cluster);
}
- private List<Container> createNodesFromNodeType(ContainerCluster cluster, Element nodesElement) {
+ private List<Container> createNodesFromNodeType(ContainerCluster cluster, Element nodesElement, ConfigModelContext context) {
NodeType type = NodeType.valueOf(nodesElement.getAttribute("type"));
ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container,
ClusterSpec.Id.from(cluster.getName()),
- Optional.empty());
+ context.getDeployState().getWantedNodeVespaVersion());
Map<HostResource, ClusterMembership> hosts =
cluster.getRoot().getHostSystem().allocateHosts(clusterSpec,
Capacity.fromRequiredNodeType(type), 1, log);
@@ -492,7 +493,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
cluster.setHostClusterId(referenceId);
Map<HostResource, ClusterMembership> hosts =
- StorageGroup.provisionHosts(NodesSpecification.from(new ModelElement(referencedNodesElement)),
+ StorageGroup.provisionHosts(NodesSpecification.from(new ModelElement(referencedNodesElement),
+ context.getDeployState().getWantedNodeVespaVersion()),
referenceId,
cluster.getRoot().getHostSystem(),
context.getDeployLogger());
@@ -514,9 +516,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
NodesSpecification nodesSpec;
if (contentNodesElementOrNull == null)
- nodesSpec = NodesSpecification.nonDedicated(1);
+ nodesSpec = NodesSpecification.nonDedicated(1, context.getDeployState().getWantedNodeVespaVersion());
else
- nodesSpec = NodesSpecification.from(new ModelElement(contentNodesElementOrNull));
+ nodesSpec = NodesSpecification.from(new ModelElement(contentNodesElementOrNull), context.getDeployState().getWantedNodeVespaVersion());
Map<HostResource, ClusterMembership> hosts =
StorageGroup.provisionHosts(nodesSpec,
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 7625374b0a0..681dba789ca 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
@@ -215,7 +215,7 @@ public class Content extends ConfigModel {
@Override
public void doBuild(Content content, Element xml, ConfigModelContext modelContext) {
Admin admin = content.adminModel != null ? content.adminModel.getAdmin() : null; // This is null in tests only
- content.cluster = new ContentCluster.Builder(admin, modelContext.getDeployLogger()).build(content.containers, modelContext.getParentProducer(), xml);
+ content.cluster = new ContentCluster.Builder(admin).build(content.containers, modelContext, xml);
buildIndexingClusters(content, modelContext,
(ApplicationConfigProducerRoot)modelContext.getParentProducer());
}
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 2b23939d8ed..8e065b7d73d 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
@@ -1,6 +1,7 @@
// Copyright 2016 Yahoo Inc. 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.ConfigModelContext;
import com.yahoo.config.provision.ClusterMembership;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.application.api.DeployLogger;
@@ -189,12 +190,12 @@ public class StorageGroup {
private final ModelElement clusterElement;
private final ContentCluster owner;
- private final DeployLogger deployLogger;
+ private final ConfigModelContext context;
- public Builder(ModelElement clusterElement, ContentCluster owner, DeployLogger deployLogger) {
+ public Builder(ModelElement clusterElement, ContentCluster owner, ConfigModelContext context) {
this.clusterElement = clusterElement;
this.owner = owner;
- this.deployLogger = deployLogger;
+ this.context = context;
}
public StorageGroup buildRootGroup() {
@@ -404,13 +405,13 @@ public class StorageGroup {
Optional<NodesSpecification> nodeRequirement;
if (nodesElement.isPresent() && nodesElement.get().getStringAttribute("count") != null ) // request these nodes
- nodeRequirement = Optional.of(NodesSpecification.from(nodesElement.get()));
+ nodeRequirement = Optional.of(NodesSpecification.from(nodesElement.get(), context.getDeployState().getWantedNodeVespaVersion()));
else if (! nodesElement.isPresent() && subGroups.isEmpty() && owner.getRoot().getDeployState().isHosted()) // request one node
- nodeRequirement = Optional.of(NodesSpecification.nonDedicated(1));
+ nodeRequirement = Optional.of(NodesSpecification.nonDedicated(1, context.getDeployState().getWantedNodeVespaVersion()));
else // Nodes or groups explicitly listed, and/opr not hosted - resolve in GroupBuilder
nodeRequirement = Optional.empty();
- return new GroupBuilder(group, subGroups, explicitNodes, nodeRequirement, deployLogger);
+ return new GroupBuilder(group, subGroups, explicitNodes, nodeRequirement, context.getDeployLogger());
}
private Optional<String> childAsString(Optional<ModelElement> element, String childTagName) {
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 bb1d8d37d60..ca8af6ce18d 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
@@ -3,6 +3,8 @@ 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.api.ModelContext;
import com.yahoo.config.model.producer.AbstractConfigProducerRoot;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.application.api.DeployLogger;
@@ -88,35 +90,32 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri
/** The admin model of this system or null if none (which only happens in tests) */
private final Admin admin;
- private final DeployLogger deployLogger;
- public Builder(Admin admin, DeployLogger deployLogger) {
+ public Builder(Admin admin) {
this.admin = admin;
- this.deployLogger = deployLogger;
}
- public ContentCluster build(Collection<ContainerModel> containers,
- AbstractConfigProducer ancestor, Element w3cContentElement) {
+ public ContentCluster build(Collection<ContainerModel> containers, ConfigModelContext context, Element w3cContentElement) {
ModelElement contentElement = new ModelElement(w3cContentElement);
ModelElement documentsElement = contentElement.getChild("documents");
Map<String, NewDocumentType> documentDefinitions =
- new SearchDefinitionBuilder().build(ancestor.getRoot().getDeployState().getDocumentModel().getDocumentManager(), documentsElement);
+ new SearchDefinitionBuilder().build(context.getParentProducer().getRoot().getDeployState().getDocumentModel().getDocumentManager(), documentsElement);
String routingSelection = new DocumentSelectionBuilder().build(documentsElement);
Redundancy redundancy = new RedundancyBuilder().build(contentElement);
Set<NewDocumentType> globallyDistributedDocuments = new GlobalDistributionBuilder(documentDefinitions).build(documentsElement);
- ContentCluster c = new ContentCluster(ancestor, getClusterName(contentElement), documentDefinitions,
+ ContentCluster c = new ContentCluster(context.getParentProducer(), getClusterName(contentElement), documentDefinitions,
globallyDistributedDocuments, routingSelection, redundancy,
- ancestor.getRoot().getDeployState().getProperties().zone());
+ context.getParentProducer().getRoot().getDeployState().getProperties().zone());
c.clusterControllerConfig = new ClusterControllerConfig.Builder(getClusterName(contentElement), contentElement).build(c, contentElement.getXml());
c.search = new ContentSearchCluster.Builder(documentDefinitions, globallyDistributedDocuments).build(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, deployLogger).buildRootGroup();
+ c.rootGroup = new StorageGroup.Builder(contentElement, c, context).buildRootGroup();
validateThatGroupSiblingsAreUnique(c.clusterName, c.rootGroup);
redundancy.setExplicitGroups(c.getRootGroup().getNumberOfLeafGroups());
c.search.handleRedundancy(redundancy);
@@ -144,10 +143,9 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri
setupTuning(c, tuning);
}
- AbstractConfigProducerRoot root = ancestor.getRoot();
- if (root == null) return c;
+ if (context.getParentProducer().getRoot() == null) return c;
- addClusterControllers(containers, root, c.rootGroup, contentElement, c.clusterName, c);
+ addClusterControllers(containers, context, c.rootGroup, contentElement, c.clusterName, c);
return c;
}
@@ -263,7 +261,7 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri
}
}
- private void addClusterControllers(Collection<ContainerModel> containers, AbstractConfigProducerRoot root,
+ private void addClusterControllers(Collection<ContainerModel> containers, ConfigModelContext context,
StorageGroup rootGroup, ModelElement contentElement,
String contentClusterName, ContentCluster contentCluster) {
if (admin == null) return; // only in tests
@@ -271,7 +269,7 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri
ContainerCluster clusterControllers;
- ContentCluster overlappingCluster = findOverlappingCluster(root, contentCluster);
+ ContentCluster overlappingCluster = findOverlappingCluster(context.getParentProducer().getRoot(), contentCluster);
if (overlappingCluster != null && overlappingCluster.getClusterControllers() != null) {
// Borrow the cluster controllers of the other cluster in this case.
// This condition only obtains on non-hosted systems with a shared config server,
@@ -281,9 +279,10 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri
else if (admin.multitenant()) {
String clusterName = contentClusterName + "-controllers";
NodesSpecification nodesSpecification =
- NodesSpecification.optionalDedicatedFromParent(contentElement.getChild("controllers")).orElse(NodesSpecification.nonDedicated(3));
+ NodesSpecification.optionalDedicatedFromParent(contentElement.getChild("controllers"), context.getDeployState().getWantedNodeVespaVersion())
+ .orElse(NodesSpecification.nonDedicated(3, context.getDeployState().getWantedNodeVespaVersion()));
Collection<HostResource> hosts = nodesSpecification.isDedicated() ?
- getControllerHosts(nodesSpecification, admin, clusterName) :
+ getControllerHosts(nodesSpecification, admin, clusterName, context) :
drawControllerHosts(nodesSpecification.count(), rootGroup, containers);
clusterControllers = createClusterControllers(new ClusterControllerCluster(contentCluster, "standalone"), hosts, clusterName, true);
@@ -319,8 +318,8 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri
return ! Sets.intersection(c1Hosts, c2Hosts).isEmpty();
}
- private Collection<HostResource> getControllerHosts(NodesSpecification nodesSpecification, Admin admin, String clusterName) {
- return nodesSpecification.provision(admin.getHostSystem(), ClusterSpec.Type.admin, ClusterSpec.Id.from(clusterName), deployLogger).keySet();
+ private Collection<HostResource> getControllerHosts(NodesSpecification nodesSpecification, Admin admin, String clusterName, ConfigModelContext context) {
+ return nodesSpecification.provision(admin.getHostSystem(), ClusterSpec.Type.admin, ClusterSpec.Id.from(clusterName), context.getDeployLogger()).keySet();
}
private List<HostResource> drawControllerHosts(int count, StorageGroup rootGroup, Collection<ContainerModel> containers) {
diff --git a/config-model/src/test/java/com/yahoo/config/model/MapConfigModelRegistryTest.java b/config-model/src/test/java/com/yahoo/config/model/MapConfigModelRegistryTest.java
index ea32feff8a9..8edde5e3d22 100644
--- a/config-model/src/test/java/com/yahoo/config/model/MapConfigModelRegistryTest.java
+++ b/config-model/src/test/java/com/yahoo/config/model/MapConfigModelRegistryTest.java
@@ -8,6 +8,7 @@ import org.w3c.dom.Element;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import static org.junit.Assert.*;
@@ -47,7 +48,7 @@ public class MapConfigModelRegistryTest {
}
@Override
- public List<ConfigModelId> handlesElements() { return Arrays.asList(ConfigModelId.fromName("modelB")); }
+ public List<ConfigModelId> handlesElements() { return Collections.singletonList(ConfigModelId.fromName("modelB")); }
@Override
public void doBuild(ModelB model, Element spec, ConfigModelContext modelContext) { }
}
@@ -57,7 +58,7 @@ public class MapConfigModelRegistryTest {
super(ModelB.class);
}
@Override
- public List<ConfigModelId> handlesElements() { return Arrays.asList(ConfigModelId.fromName("modelB")); }
+ public List<ConfigModelId> handlesElements() { return Collections.singletonList(ConfigModelId.fromName("modelB")); }
@Override
public void doBuild(ModelB model, Element spec, ConfigModelContext modelContext) { }
}
@@ -73,7 +74,7 @@ public class MapConfigModelRegistryTest {
super(ModelA.class);
}
@Override
- public List<ConfigModelId> handlesElements() { return Arrays.asList(ConfigModelId.fromName("modelA")); }
+ public List<ConfigModelId> handlesElements() { return Collections.singletonList(ConfigModelId.fromName("modelA")); }
@Override
public void doBuild(ModelA model, Element spec, ConfigModelContext modelContext) { }
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java
index 09899f4796f..97cbb7b1f37 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/derived/AttributeListTestCase.java
@@ -20,9 +20,9 @@ import static org.junit.Assert.assertTrue;
* @author bratseth
*/
public class AttributeListTestCase extends SearchDefinitionTestCase {
+
@Test
public void testDeriving() throws IOException, ParseException {
-
// Test attribute importing
Search search = SearchBuilder.buildFromFile("src/test/examples/simple.sd");
@@ -66,6 +66,6 @@ public class AttributeListTestCase extends SearchDefinitionTestCase {
assertEquals(Attribute.CollectionType.SINGLE, attribute.getCollectionType());
assertTrue(!attributes.hasNext());
-
}
+
}
diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/derived/SummaryTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/derived/SummaryTestCase.java
index 6220ab9f7d5..f2c1286ce34 100644
--- a/config-model/src/test/java/com/yahoo/searchdefinition/derived/SummaryTestCase.java
+++ b/config-model/src/test/java/com/yahoo/searchdefinition/derived/SummaryTestCase.java
@@ -21,13 +21,14 @@ import static org.junit.Assert.assertNull;
* @author bratseth
*/
public class SummaryTestCase extends SearchDefinitionTestCase {
+
@Test
public void testDeriving() throws IOException, ParseException {
Search search = SearchBuilder.buildFromFile("src/test/examples/simple.sd");
SummaryClass summary=new SummaryClass(search,search.getSummary("default"), new BaseDeployLogger());
assertEquals("default",summary.getName());
- Iterator fields=summary.fieldIterator();
+ Iterator<SummaryClassField> fields=summary.fieldIterator();
SummaryClassField field;
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java b/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java
index 16c63bc5251..cc7a38a828d 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java
@@ -1,6 +1,7 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model;
+import com.yahoo.component.Version;
import com.yahoo.config.model.test.MockRoot;
import com.yahoo.config.provision.ClusterMembership;
import com.yahoo.config.provision.ClusterSpec;
@@ -143,7 +144,7 @@ public class HostResourceTest {
}
private static ClusterSpec clusterSpec(ClusterSpec.Type type, String id) {
- return ClusterSpec.from(type, ClusterSpec.Id.from(id), ClusterSpec.Group.from(0), Optional.empty());
+ return ClusterSpec.from(type, ClusterSpec.Id.from(id), ClusterSpec.Group.from(0), Version.fromString("6.42"));
}
private HostResource mockHostResource() {
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java
index 8671f44ad6a..c0040875ec3 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/VespaModelFactoryTest.java
@@ -1,13 +1,29 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model;
+import com.yahoo.component.Version;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.model.MockModelContext;
import com.yahoo.config.model.NullConfigModelRegistry;
-import com.yahoo.config.model.api.*;
+import com.yahoo.config.model.api.ConfigServerSpec;
+import com.yahoo.config.model.api.HostInfo;
import com.yahoo.config.model.api.HostProvisioner;
+import com.yahoo.config.model.api.Model;
+import com.yahoo.config.model.api.ModelContext;
+import com.yahoo.config.model.api.ModelCreateResult;
+import com.yahoo.config.model.api.ServiceInfo;
import com.yahoo.config.model.test.MockApplicationPackage;
-import com.yahoo.config.provision.*;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.ApplicationName;
+import com.yahoo.config.provision.Capacity;
+import com.yahoo.config.provision.ClusterMembership;
+import com.yahoo.config.provision.ClusterSpec;
+import com.yahoo.config.provision.HostSpec;
+import com.yahoo.config.provision.InstanceName;
+import com.yahoo.config.provision.ProvisionLogger;
+import com.yahoo.config.provision.Rotation;
+import com.yahoo.config.provision.TenantName;
+import com.yahoo.config.provision.Zone;
import org.junit.Before;
import org.junit.Test;
@@ -100,7 +116,7 @@ public class VespaModelFactoryTest {
ClusterMembership.from(ClusterSpec.from(ClusterSpec.Type.admin,
new ClusterSpec.Id(routingClusterName),
ClusterSpec.Group.from(0),
- Optional.empty()),
+ Version.fromString("6.42")),
0));
}
@@ -111,7 +127,7 @@ public class VespaModelFactoryTest {
ClusterMembership.from(ClusterSpec.from(ClusterSpec.Type.container,
new ClusterSpec.Id(routingClusterName),
ClusterSpec.Group.from(0),
- Optional.empty()),
+ Version.fromString("6.42")),
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 8a3d241a79b..595013c506e 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
@@ -3,6 +3,7 @@ package com.yahoo.vespa.model.content.utils;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.config.model.ConfigModelContext;
import com.yahoo.config.model.api.HostProvisioner;
import com.yahoo.config.model.application.provider.BaseDeployLogger;
import com.yahoo.config.model.deploy.DeployState;
@@ -23,6 +24,7 @@ import java.util.Optional;
/**
* For testing purposes only.
+ *
* @author geirst
*/
public class ContentClusterUtils {
@@ -51,8 +53,9 @@ public class ContentClusterUtils {
public static ContentCluster createCluster(String clusterXml, MockRoot root) throws Exception {
Document doc = XML.getDocument(clusterXml);
Admin admin = new Admin(root, new Yamas("vespa", 60), new Metrics(), Collections.emptyMap(), false);
- DeployLogger deployLogger = new BaseDeployLogger();
- return new ContentCluster.Builder(admin, deployLogger).build(Collections.emptyList(), root, doc.getDocumentElement());
+ ConfigModelContext context = ConfigModelContext.create(null, DeployState.createTestState(), null, root, null);
+
+ return new ContentCluster.Builder(admin).build(Collections.emptyList(), context, doc.getDocumentElement());
}
public static ContentCluster createCluster(String clusterXml, List<String> searchDefinitions) throws Exception {