summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-06-17 15:49:13 +0200
committerGitHub <noreply@github.com>2022-06-17 15:49:13 +0200
commit18c3cafd1af56339daa739ffc78b11d017ab8fcc (patch)
treebd583b2ed62762e3c24d0e33a2d7ac4d58e991ab /configserver
parent1500c4c724bb89c2fa92c3c5bb2f994a6ac6f9c7 (diff)
parentb654fdaf1afd47190bb620052919e0d37c9c2c77 (diff)
Merge pull request #23147 from vespa-engine/bratseth/flag-version-from-model
Get the Vespa version for flags from the model version
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);