diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-04-19 13:00:52 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-04-19 13:00:52 +0200 |
commit | 43ccb0583cf52cfdc75df493bda4b60dd5263eed (patch) | |
tree | 05c9c77f55fd60be96bcb673e2c0fd7c25aeaa76 /config-model | |
parent | 16b11bcc414e23d1f901a98d712212f1c7c9d2df (diff) |
Always pass wanted Vespa version
Diffstat (limited to 'config-model')
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 { |