diff options
author | Jon Bratseth <bratseth@gmail.com> | 2022-06-17 15:49:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-17 15:49:13 +0200 |
commit | 18c3cafd1af56339daa739ffc78b11d017ab8fcc (patch) | |
tree | bd583b2ed62762e3c24d0e33a2d7ac4d58e991ab /configserver | |
parent | 1500c4c724bb89c2fa92c3c5bb2f994a6ac6f9c7 (diff) | |
parent | b654fdaf1afd47190bb620052919e0d37c9c2c77 (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')
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); |