summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-06-17 09:49:26 +0200
committerJon Bratseth <bratseth@gmail.com>2022-06-17 09:49:26 +0200
commitb654fdaf1afd47190bb620052919e0d37c9c2c77 (patch)
treeb851b7eb91ec213946b8d29a8c4f7b2da3cf3ac9 /configserver
parent767fdc8b3e6cf90410a7b8146506eccca25f1fa8 (diff)
Get the Vespa version for flags from the model version
A flag value which depends on Vespa version should not take effect immediately when a deployment wants that version but only for nodes which are actually upgraded to that version. Take the flag version from the Vespa model version to achieve this.
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java8
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java51
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java31
4 files changed, 61 insertions, 33 deletions
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 30116b7ee69..d4be7bb7b31 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
@@ -380,7 +380,7 @@ public class ModelContextImpl implements ModelContext {
private final Optional<CloudAccount> cloudAccount;
public Properties(ApplicationId applicationId,
- Version nodeVespaVersion,
+ Version modelVersion,
ConfigserverConfig configserverConfig,
Zone zone,
Set<ContainerEndpoint> endpoints,
@@ -394,7 +394,7 @@ public class ModelContextImpl implements ModelContext {
SecretStore secretStore,
List<X509Certificate> operatorCertificates,
Optional<CloudAccount> cloudAccount) {
- this.featureFlags = new FeatureFlags(flagSource, applicationId, nodeVespaVersion);
+ this.featureFlags = new FeatureFlags(flagSource, applicationId, modelVersion);
this.applicationId = applicationId;
this.multitenant = configserverConfig.multitenant() || configserverConfig.hostedVespa() || Boolean.getBoolean("multitenant");
this.configServerSpecs = fromConfig(configserverConfig);
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
index 468dda605c6..019b0386695 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
@@ -99,7 +99,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
Version wantedNodeVespaVersion) {
log.log(Level.FINE, () -> String.format("Loading model version %s for session %s application %s",
modelFactory.version(), applicationGeneration, applicationId));
- ModelContext.Properties modelContextProperties = createModelContextProperties(applicationId, wantedNodeVespaVersion, applicationPackage);
+ ModelContext.Properties modelContextProperties = createModelContextProperties(applicationId, modelFactory.version(), applicationPackage);
Provisioned provisioned = new Provisioned();
ModelContext modelContext = new ModelContextImpl(
applicationPackage,
@@ -143,9 +143,11 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
return Optional.of(value);
}
- private ModelContext.Properties createModelContextProperties(ApplicationId applicationId, Version wantedNodeVespaVersion, ApplicationPackage applicationPackage) {
+ private ModelContext.Properties createModelContextProperties(ApplicationId applicationId,
+ Version modelVersion,
+ ApplicationPackage applicationPackage) {
return new ModelContextImpl.Properties(applicationId,
- wantedNodeVespaVersion,
+ modelVersion,
configserverConfig,
zone(),
ImmutableSet.copyOf(new ContainerEndpointsCache(TenantRepository.getTenantPath(tenant), curator).read(applicationId)),
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 51e61edfff3..e6ae5c491c0 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
@@ -8,6 +8,8 @@ import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.config.application.api.FileRegistry;
import com.yahoo.config.model.api.ConfigChangeAction;
import com.yahoo.config.model.api.ConfigDefinitionRepo;
+import com.yahoo.config.model.api.ContainerEndpoint;
+import com.yahoo.config.model.api.EndpointCertificateSecrets;
import com.yahoo.config.model.api.HostInfo;
import com.yahoo.config.model.api.HostProvisioner;
import com.yahoo.config.model.api.Model;
@@ -22,6 +24,8 @@ import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.provision.AllocatedHosts;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.DockerImage;
+import com.yahoo.config.provision.Zone;
+import com.yahoo.container.jdisc.secretstore.SecretStore;
import com.yahoo.vespa.config.server.application.Application;
import com.yahoo.vespa.config.server.application.ApplicationCuratorDatabase;
import com.yahoo.vespa.config.server.application.ApplicationSet;
@@ -31,6 +35,7 @@ import com.yahoo.vespa.config.server.host.HostValidator;
import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.curator.Curator;
+import com.yahoo.vespa.flags.FlagSource;
import java.io.File;
import java.io.IOException;
@@ -38,6 +43,7 @@ import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -51,17 +57,24 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
private static final Logger log = Logger.getLogger(PreparedModelsBuilder.class.getName());
private final PermanentApplicationPackage permanentApplicationPackage;
+ private final FlagSource flagSource;
+ private final SecretStore secretStore;
+ private final List<ContainerEndpoint> containerEndpoints;
+ private final Optional<EndpointCertificateSecrets> endpointCertificateSecrets;
private final ConfigDefinitionRepo configDefinitionRepo;
private final HostValidator<ApplicationId> hostValidator;
private final PrepareParams params;
private final FileRegistry fileRegistry;
private final Optional<ApplicationSet> currentActiveApplicationSet;
- private final ModelContext.Properties properties;
private final Curator curator;
private final ExecutorService executor;
public PreparedModelsBuilder(ModelFactoryRegistry modelFactoryRegistry,
PermanentApplicationPackage permanentApplicationPackage,
+ FlagSource flagSource,
+ SecretStore secretStore,
+ List<ContainerEndpoint> containerEndpoints,
+ Optional<EndpointCertificateSecrets> endpointCertificateSecrets,
ConfigDefinitionRepo configDefinitionRepo,
FileRegistry fileRegistry,
ExecutorService executor,
@@ -71,17 +84,20 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
DeployLogger deployLogger,
PrepareParams params,
Optional<ApplicationSet> currentActiveApplicationSet,
- ModelContext.Properties properties,
- ConfigserverConfig configserverConfig) {
- super(modelFactoryRegistry, configserverConfig, properties.zone(), hostProvisionerProvider, deployLogger);
+ ConfigserverConfig configserverConfig,
+ Zone zone) {
+ super(modelFactoryRegistry, configserverConfig, zone, hostProvisionerProvider, deployLogger);
this.permanentApplicationPackage = permanentApplicationPackage;
+ this.flagSource = flagSource;
+ this.secretStore = secretStore;
+ this.containerEndpoints = containerEndpoints;
+ this.endpointCertificateSecrets = endpointCertificateSecrets;
this.configDefinitionRepo = configDefinitionRepo;
this.fileRegistry = fileRegistry;
this.hostValidator = hostValidator;
this.curator = curator;
this.params = params;
this.currentActiveApplicationSet = currentActiveApplicationSet;
- this.properties = properties;
this.executor = executor;
}
@@ -107,7 +123,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
new ApplicationCuratorDatabase(applicationId.tenant(), curator).readReindexingStatus(applicationId),
createHostProvisioner(applicationPackage, provisioned),
provisioned,
- properties,
+ createModelContextProperties(modelFactory.version(), applicationPackage),
getAppDir(applicationPackage),
wantedDockerImageRepository,
modelVersion,
@@ -118,7 +134,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
}
private ModelCreateResult createAndValidateModel(ModelFactory modelFactory, ApplicationId applicationId, Version modelVersion, ModelContext modelContext) {
- log.log(properties.zone().system().isCd() ? Level.INFO : Level.FINE,
+ log.log(zone().system().isCd() ? Level.INFO : Level.FINE,
() -> "Create and validate model " + modelVersion + " for " + applicationId + ", previous model is " +
modelOf(modelVersion).map(Model::version).map(Version::toFullString).orElse("non-existing"));
ValidationParameters validationParameters =
@@ -139,7 +155,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
private HostProvisioner createHostProvisioner(ApplicationPackage applicationPackage, Provisioned provisioned) {
HostProvisioner defaultHostProvisioner = DeployState.getDefaultModelHostProvisioner(applicationPackage);
// Note: nodeRepositoryProvisioner will always be present when hosted is true
- Optional<HostProvisioner> nodeRepositoryProvisioner = createNodeRepositoryProvisioner(properties.applicationId(), provisioned);
+ Optional<HostProvisioner> nodeRepositoryProvisioner = createNodeRepositoryProvisioner(params.getApplicationId(), provisioned);
Optional<AllocatedHosts> allocatedHosts = applicationPackage.getAllocatedHosts();
if (allocatedHosts.isEmpty()) return nodeRepositoryProvisioner.orElse(defaultHostProvisioner);
@@ -184,6 +200,25 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P
throw exception;
}
+ private ModelContext.Properties createModelContextProperties(Version modelVersion,
+ ApplicationPackage applicationPackage) {
+ return new ModelContextImpl.Properties(params.getApplicationId(),
+ modelVersion,
+ configserverConfig,
+ zone(),
+ Set.copyOf(containerEndpoints),
+ params.isBootstrap(),
+ currentActiveApplicationSet.isEmpty(),
+ LegacyFlags.from(applicationPackage, flagSource),
+ endpointCertificateSecrets,
+ params.athenzDomain(),
+ params.quota(),
+ params.tenantSecretStores(),
+ secretStore,
+ params.operatorCertificates(),
+ params.cloudAccount());
+ }
+
/** The result of preparing a single model version */
public static class PreparedModelResult implements ModelResult {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java
index 4c1da9dc3af..1e073ac3458 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java
@@ -26,6 +26,7 @@ import com.yahoo.config.provision.Zone;
import com.yahoo.container.jdisc.secretstore.SecretStore;
import com.yahoo.net.HostName;
import com.yahoo.path.Path;
+import com.yahoo.vespa.config.server.ConfigServerSpec;
import com.yahoo.vespa.config.server.TimeoutBudget;
import com.yahoo.vespa.config.server.application.ApplicationSet;
import com.yahoo.vespa.config.server.application.PermanentApplicationPackage;
@@ -61,6 +62,8 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
+import static com.yahoo.vespa.config.server.ConfigServerSpec.fromConfig;
+
/**
* A SessionPreparer is responsible for preparing a session given an application package.
*
@@ -157,7 +160,6 @@ public class SessionPreparer {
final ContainerEndpointsCache containerEndpointsCache;
final List<ContainerEndpoint> containerEndpoints;
- final ModelContext.Properties properties;
private final EndpointCertificateMetadataStore endpointCertificateMetadataStore;
private final Optional<EndpointCertificateMetadata> endpointCertificateMetadata;
private final Optional<AthenzDomain> athenzDomain;
@@ -191,24 +193,13 @@ public class SessionPreparer {
.flatMap(endpointCertificateRetriever::readEndpointCertificateSecrets);
this.containerEndpoints = readEndpointsIfNull(params.containerEndpoints());
this.athenzDomain = params.athenzDomain();
- this.properties = new ModelContextImpl.Properties(params.getApplicationId(),
- vespaVersion,
- configserverConfig,
- zone,
- Set.copyOf(containerEndpoints),
- params.isBootstrap(),
- currentActiveApplicationSet.isEmpty(),
- LegacyFlags.from(applicationPackage, flagSource),
- endpointCertificateSecrets,
- athenzDomain,
- params.quota(),
- params.tenantSecretStores(),
- secretStore,
- params.operatorCertificates(),
- params.cloudAccount());
this.fileRegistry = fileDistributionFactory.createFileRegistry(serverDbSessionDir);
this.preparedModelsBuilder = new PreparedModelsBuilder(modelFactoryRegistry,
permanentApplicationPackage,
+ flagSource,
+ secretStore,
+ containerEndpoints,
+ endpointCertificateSecrets,
configDefinitionRepo,
fileRegistry,
executor,
@@ -218,8 +209,8 @@ public class SessionPreparer {
logger,
params,
currentActiveApplicationSet,
- properties,
- configserverConfig);
+ configserverConfig,
+ zone);
}
void checkTimeout(String step) {
@@ -236,7 +227,7 @@ public class SessionPreparer {
FileDistribution fileDistribution = fileDistributionFactory.createFileDistribution();
log.log(Level.FINE, () -> "Ask other config servers to download application package for " +
applicationId + " (" + fileReference + ")");
- properties.configServerSpecs()
+ ConfigServerSpec.fromConfig(configserverConfig)
.stream()
.filter(spec -> !spec.getHostName().equals(HostName.getLocalhost()))
.forEach(spec -> fileDistribution.startDownload(spec.getHostName(), spec.getConfigServerPort(), Set.of(fileReference)));
@@ -247,7 +238,7 @@ public class SessionPreparer {
void preprocess() {
try {
- this.preprocessedApplicationPackage = applicationPackage.preprocess(properties.zone(), logger);
+ this.preprocessedApplicationPackage = applicationPackage.preprocess(zone, logger);
} catch (IOException | RuntimeException e) {
throw new IllegalArgumentException("Error preprocessing application package for " + applicationId +
", session " + sessionZooKeeperClient.sessionId(), e);