summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-05-02 11:53:51 +0200
committerJon Bratseth <bratseth@oath.com>2018-05-02 11:53:51 +0200
commit7e1972e4d8cfd85944cdea941844ec0efe1a04af (patch)
tree4a466b56c8f0bb0cc022f58c7a72fa99a7c4eca0 /configserver
parent3158c62af78e2d0b5870219beed5a4a10a4406b1 (diff)
Don't require an existing model when preparing
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java1
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java27
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java63
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java13
4 files changed, 43 insertions, 61 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java
index c2b4d2f9e62..a73fc95eb05 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java
@@ -33,7 +33,6 @@ import java.util.Set;
* and other queries against the model.
*
* @author Harald Musum
- * @since 2010-12-08
*/
public class Application implements ModelResult {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java
index 7d46152dd4d..b4346498f0c 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.application;
import com.yahoo.config.model.api.HostInfo;
+import com.yahoo.config.model.api.Model;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Version;
@@ -33,27 +34,39 @@ public final class ApplicationSet {
latestVersion = applications.keySet().stream().max((a, b) -> a.compareTo(b)).get();
}
+ /**
+ * Returns the specified version, or the latest if not specified, or if the given version is not
+ * available and the latest is a permissible substitution.
+ *
+ * @throws VersionDoesNotExistException if the specified version is not available and the latest version is not
+ * a permissible substitution
+ */
public Application getForVersionOrLatest(Optional<Version> optionalVersion, Instant now) {
- return resolveForVersion(optionalVersion.orElse(latestVersion), now);
+ Version version = optionalVersion.orElse(latestVersion);
+ return resolveForVersion(version, now)
+ .orElseThrow(() -> new VersionDoesNotExistException(applicationId + " has no model for Vespa version " + version));
}
- private Application resolveForVersion(Version vespaVersion, Instant now) {
+ private Optional<Application> resolveForVersion(Version vespaVersion, Instant now) {
Application application = applications.get(vespaVersion);
if (application != null)
- return application;
+ return Optional.of(application);
// Does the latest version specify we can use it regardless?
Application latest = applications.get(latestVersion);
if (latest.getModel().allowModelVersionMismatch(now))
- return latest;
+ return Optional.of(latest);
- throw new VersionDoesNotExistException(String.format("No application with vespa version %s exists", vespaVersion.toString()));
+ return Optional.empty();
}
- public ApplicationId getId() {
- return applicationId;
+ /** Returns the application for the given version, if available */
+ public Optional<Application> get(Version version) {
+ return Optional.ofNullable(applications.get(version));
}
+ public ApplicationId getId() { return applicationId; }
+
public static ApplicationSet fromList(List<Application> applications) {
return new ApplicationSet(applications);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
index 2f05c1a2259..1aaddfce6fc 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
@@ -74,19 +74,13 @@ public class ModelContextImpl implements ModelContext {
}
@Override
- public ApplicationPackage applicationPackage() {
- return applicationPackage;
- }
+ public ApplicationPackage applicationPackage() { return applicationPackage; }
@Override
- public Optional<Model> previousModel() {
- return previousModel;
- }
+ public Optional<Model> previousModel() { return previousModel; }
@Override
- public Optional<ApplicationPackage> permanentApplicationPackage() {
- return permanentApplicationPackage;
- }
+ public Optional<ApplicationPackage> permanentApplicationPackage() { return permanentApplicationPackage; }
/**
* Returns the host provisioner to use, or empty to use the default provisioner,
@@ -94,34 +88,22 @@ public class ModelContextImpl implements ModelContext {
*/
// TODO: Don't allow empty here but create the right provisioner when this is set up instead
@Override
- public Optional<HostProvisioner> hostProvisioner() {
- return hostProvisioner;
- }
+ public Optional<HostProvisioner> hostProvisioner() { return hostProvisioner; }
@Override
- public DeployLogger deployLogger() {
- return deployLogger;
- }
+ public DeployLogger deployLogger() { return deployLogger; }
@Override
- public ConfigDefinitionRepo configDefinitionRepo() {
- return configDefinitionRepo;
- }
+ public ConfigDefinitionRepo configDefinitionRepo() { return configDefinitionRepo; }
@Override
- public FileRegistry getFileRegistry() {
- return fileRegistry;
- }
+ public FileRegistry getFileRegistry() { return fileRegistry; }
@Override
- public ModelContext.Properties properties() {
- return properties;
- }
+ public ModelContext.Properties properties() { return properties; }
@Override
- public Optional<File> appDir() {
- return appDir;
- }
+ public Optional<File> appDir() { return appDir; }
@Override
public Version modelVespaVersion() { return modelVespaVersion; }
@@ -129,9 +111,6 @@ public class ModelContextImpl implements ModelContext {
@Override
public Version wantedNodeVespaVersion() { return wantedNodeVespaVersion; }
- /**
- * @author Ulf Lilleengen
- */
public static class Properties implements ModelContext.Properties {
private final ApplicationId applicationId;
@@ -159,34 +138,22 @@ public class ModelContextImpl implements ModelContext {
}
@Override
- public boolean multitenant() {
- return multitenant;
- }
+ public boolean multitenant() { return multitenant; }
@Override
- public ApplicationId applicationId() {
- return applicationId;
- }
+ public ApplicationId applicationId() { return applicationId; }
@Override
- public List<ConfigServerSpec> configServerSpecs() {
- return configServerSpecs;
- }
+ public List<ConfigServerSpec> configServerSpecs() { return configServerSpecs; }
@Override
- public HostName loadBalancerName() {
- return loadBalancerName;
- }
+ public HostName loadBalancerName() { return loadBalancerName; }
@Override
- public boolean hostedVespa() {
- return hostedVespa;
- }
+ public boolean hostedVespa() { return hostedVespa; }
@Override
- public Zone zone() {
- return zone;
- }
+ public Zone zone() { return zone; }
@Override
public Set<Rotation> rotations() { return rotations; }
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java
index d7b84d75b5c..0d9346101e9 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java
@@ -15,6 +15,7 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.AllocatedHosts;
import com.yahoo.config.provision.Version;
import com.yahoo.log.LogLevel;
+import com.yahoo.vespa.config.server.application.Application;
import com.yahoo.vespa.config.server.application.ApplicationSet;
import com.yahoo.vespa.config.server.host.HostValidator;
import com.yahoo.vespa.config.server.application.PermanentApplicationPackage;
@@ -89,17 +90,14 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
FileDistributionProvider fileDistributionProvider = fileDistributionFactory.createProvider(context.getServerDBSessionDir());
// Use empty on non-hosted systems, use already allocated hosts if available, create connection to a host provisioner otherwise
- Optional<HostProvisioner> hostProvisioner = createHostProvisioner(allocatedHosts);
- Optional<Model> previousModel = currentActiveApplicationSet
- .map(set -> set.getForVersionOrLatest(Optional.of(modelVersion), now).getModel());
ModelContext modelContext = new ModelContextImpl(
applicationPackage,
- previousModel,
+ modelOf(modelVersion),
permanentApplicationPackage.applicationPackage(),
logger,
configDefinitionRepo,
fileDistributionProvider.getFileRegistry(),
- hostProvisioner,
+ createHostProvisioner(allocatedHosts),
properties,
getAppDir(applicationPackage),
new com.yahoo.component.Version(modelVersion.toString()),
@@ -112,6 +110,11 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
return new PreparedModelsBuilder.PreparedModelResult(modelVersion, result.getModel(), fileDistributionProvider, result.getConfigChangeActions());
}
+ private Optional<Model> modelOf(Version version) {
+ if ( ! currentActiveApplicationSet.isPresent()) return Optional.empty();
+ return currentActiveApplicationSet.get().get(version).map(Application::getModel);
+ }
+
// This method is an excellent demonstration of what happens when one is too liberal with Optional
// -bratseth, who had to write the below :-\
private Optional<HostProvisioner> createHostProvisioner(Optional<AllocatedHosts> allocatedHosts) {