diff options
18 files changed, 76 insertions, 52 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java index 86360d482a6..4f7cf8575c4 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java @@ -7,6 +7,7 @@ import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.FileRegistry; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.Zone; @@ -34,9 +35,13 @@ public interface ModelContext { Properties properties(); default Optional<File> appDir() { return Optional.empty();} + // TODO: Remove when 7.211 is oldest model version in use /** The Docker image repo we want to use for images for this deployment (optional, will use default if empty) */ default Optional<String> wantedDockerImageRepository() { return Optional.empty(); } + /** The Docker image repo we want to use for images for this deployment (optional, will use default if empty) */ + default Optional<DockerImage> wantedDockerImageRepo() { return Optional.empty(); } + /** The Vespa version this model is built for */ Version modelVespaVersion(); 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 3fb7ba6bc3a..c52ea1ef092 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 @@ -23,6 +23,7 @@ import com.yahoo.config.model.application.provider.MockFileRegistry; import com.yahoo.config.model.provision.HostsXmlProvisioner; import com.yahoo.config.model.provision.SingleNodeProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Zone; import com.yahoo.io.IOUtils; import com.yahoo.io.reader.NamedReader; @@ -77,7 +78,7 @@ public class DeployState implements ConfigDefinitionStore { private final ImportedMlModels importedModels; private final ValidationOverrides validationOverrides; private final Version wantedNodeVespaVersion; - private final Optional<String> wantedDockerImageRepo; + private final Optional<DockerImage> wantedDockerImageRepo; private final Instant now; private final HostProvisioner provisioner; private final Provisioned provisioned; @@ -114,7 +115,7 @@ public class DeployState implements ConfigDefinitionStore { Instant now, Version wantedNodeVespaVersion, boolean accessLoggingEnabledByDefault, - Optional<String> wantedDockerImageRepo) { + Optional<DockerImage> wantedDockerImageRepo) { this.logger = deployLogger; this.fileRegistry = fileRegistry; this.rankProfileRegistry = rankProfileRegistry; @@ -266,7 +267,7 @@ public class DeployState implements ConfigDefinitionStore { public Version getWantedNodeVespaVersion() { return wantedNodeVespaVersion; } - public Optional<String> getWantedDockerImageRepo() { return wantedDockerImageRepo; } + public Optional<DockerImage> getWantedDockerImageRepo() { return wantedDockerImageRepo; } public Instant now() { return now; } @@ -306,7 +307,7 @@ public class DeployState implements ConfigDefinitionStore { private Instant now = Instant.now(); private Version wantedNodeVespaVersion = Vtag.currentVersion; private boolean accessLoggingEnabledByDefault = true; - private Optional<String> wantedDockerImageRepo = Optional.empty(); + private Optional<DockerImage> wantedDockerImageRepo = Optional.empty(); public Builder applicationPackage(ApplicationPackage applicationPackage) { this.applicationPackage = applicationPackage; @@ -383,7 +384,7 @@ public class DeployState implements ConfigDefinitionStore { return this; } - public Builder wantedDockerImageRepo(Optional<String> dockerImageRepo) { + public Builder wantedDockerImageRepo(Optional<DockerImage> dockerImageRepo) { this.wantedDockerImageRepo = dockerImageRepo; return this; } 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 631f4dab1a7..6a2ba5ed005 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 @@ -152,7 +152,7 @@ public class VespaModelFactory implements ModelFactory { .zone(zone) .now(clock.instant()) .wantedNodeVespaVersion(modelContext.wantedNodeVespaVersion()) - .wantedDockerImageRepo(modelContext.wantedDockerImageRepository()); + .wantedDockerImageRepo(modelContext.wantedDockerImageRepo()); modelContext.previousModel().ifPresent(builder::previousModel); return builder.build(validationParameters); } 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 5418ba1a6ee..ea47e490b12 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 @@ -49,7 +49,7 @@ public class NodesSpecification { private final boolean exclusive; /** The repo part of a docker image (without tag), optional */ - private final Optional<String> dockerImageRepo; + private final Optional<DockerImage> dockerImageRepo; /** The ID of the cluster referencing this node specification, if any */ private final Optional<String> combinedId; @@ -58,7 +58,7 @@ public class NodesSpecification { ClusterResources max, boolean dedicated, Version version, boolean required, boolean canFail, boolean exclusive, - Optional<String> dockerImageRepo, + Optional<DockerImage> dockerImageRepo, Optional<String> combinedId) { if (max.smallerThan(min)) throw new IllegalArgumentException("Min resources must be larger or equal to max resources, but " + @@ -84,7 +84,7 @@ public class NodesSpecification { } private static NodesSpecification create(boolean dedicated, boolean canFail, Version version, - ModelElement nodesElement, Optional<String> dockerImageRepo) { + ModelElement nodesElement, Optional<DockerImage> dockerImageRepo) { var resolvedElement = resolveElement(nodesElement); var combinedId = findCombinedId(nodesElement, resolvedElement); var resources = toResources(resolvedElement); @@ -209,7 +209,7 @@ public class NodesSpecification { .vespaVersion(version) .exclusive(exclusive) .combinedId(combinedId.map(ClusterSpec.Id::from)) - .dockerImageRepository(dockerImageRepo.map(DockerImage::fromString)) + .dockerImageRepository(dockerImageRepo) .build(); return hostSystem.allocateHosts(cluster, Capacity.from(min, max, required, canFail), logger); } @@ -370,9 +370,9 @@ public class NodesSpecification { return new IllegalArgumentException("referenced service '" + referenceId + "' is not defined"); } - private static Optional<String> dockerImageToUse(ModelElement nodesElement, Optional<String> dockerImage) { + private static Optional<DockerImage> dockerImageToUse(ModelElement nodesElement, Optional<DockerImage> dockerImage) { String dockerImageFromElement = nodesElement.stringAttribute("docker-image"); - return dockerImageFromElement == null ? dockerImage : Optional.of(dockerImageFromElement); + return dockerImageFromElement == null ? dockerImage : Optional.of(DockerImage.fromString(dockerImageFromElement)); } /** Parses a value ("value") or value range ("[min-value, max-value]") */ 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 78ef475653d..2fba8189046 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 @@ -25,7 +25,6 @@ import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.ClusterResources; import com.yahoo.config.provision.ClusterSpec; -import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeResources; @@ -659,7 +658,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from(cluster.getName())) .vespaVersion(deployState.getWantedNodeVespaVersion()) - .dockerImageRepository(deployState.getWantedDockerImageRepo().map(DockerImage::fromString)) + .dockerImageRepository(deployState.getWantedDockerImageRepo()) .build(); int nodeCount = deployState.zone().environment().isProduction() ? 2 : 1; Capacity capacity = Capacity.from(new ClusterResources(nodeCount, 1, NodeResources.unspecified), @@ -691,7 +690,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { NodeType type = NodeType.valueOf(nodesElement.getAttribute("type")); ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from(cluster.getName())) .vespaVersion(context.getDeployState().getWantedNodeVespaVersion()) - .dockerImageRepository(context.getDeployState().getWantedDockerImageRepo().map(DockerImage::fromString)) + .dockerImageRepository(context.getDeployState().getWantedDockerImageRepo()) .build(); Map<HostResource, ClusterMembership> hosts = cluster.getRoot().hostSystem().allocateHosts(clusterSpec, diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java index ede777265b7..af4e85109e6 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java @@ -5,6 +5,7 @@ import com.yahoo.component.Version; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.Provisioner; import java.util.logging.Level; @@ -49,7 +50,7 @@ public class Deployment implements com.yahoo.config.provision.Deployment { private final DeployLogger logger = new SilentDeployLogger(); /** The repository part of docker image this application should run on. Version is separate from image repo */ - Optional<String> dockerImageRepository; + Optional<DockerImage> dockerImageRepository; /** The Vespa version this application should run on */ private final Version version; 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 0f141dee5b4..cd06f7208e4 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 @@ -16,6 +16,7 @@ import com.yahoo.config.model.api.Provisioned; import com.yahoo.config.model.api.TlsSecrets; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.flags.FetchVector; @@ -46,7 +47,7 @@ public class ModelContextImpl implements ModelContext { private final ModelContext.Properties properties; private final Optional<File> appDir; - private final Optional<String> wantedDockerImageRepository; + private final Optional<DockerImage> wantedDockerImageRepository; /** The version of Vespa we are building a model for */ private final Version modelVespaVersion; @@ -70,7 +71,7 @@ public class ModelContextImpl implements ModelContext { Provisioned provisioned, ModelContext.Properties properties, Optional<File> appDir, - Optional<String> wantedDockerImageRepository, + Optional<DockerImage> wantedDockerImageRepository, Version modelVespaVersion, Version wantedNodeVespaVersion) { this.applicationPackage = applicationPackage; @@ -124,7 +125,10 @@ public class ModelContextImpl implements ModelContext { public Optional<File> appDir() { return appDir; } @Override - public Optional<String> wantedDockerImageRepository() { return wantedDockerImageRepository; } + public Optional<String> wantedDockerImageRepository() { return wantedDockerImageRepository.map(DockerImage::repository); } + + @Override + public Optional<DockerImage> wantedDockerImageRepo() { return wantedDockerImageRepository; } @Override public Version modelVespaVersion() { return modelVespaVersion; } 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 77d84206fec..0b83e927c39 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 @@ -12,6 +12,7 @@ import com.yahoo.config.model.api.Provisioned; import com.yahoo.config.model.application.provider.MockFileRegistry; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.secretstore.SecretStore; @@ -84,7 +85,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { protected Application buildModelVersion(ModelFactory modelFactory, ApplicationPackage applicationPackage, ApplicationId applicationId, - Optional<String> wantedDockerImageRepository, + Optional<DockerImage> wantedDockerImageRepository, Version wantedNodeVespaVersion, Optional<AllocatedHosts> ignored, // Ignored since we have this in the app package for activated models Instant now) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java index 6c6b352361f..455731d9cb6 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java @@ -5,12 +5,12 @@ import com.google.common.util.concurrent.UncheckedTimeoutException; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.model.api.HostProvisioner; -import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.api.ModelFactory; import com.yahoo.config.model.api.Provisioned; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationLockException; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.OutOfCapacityException; import com.yahoo.component.Version; import com.yahoo.config.provision.TransientException; @@ -73,7 +73,7 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { * and assigns to this SettableOptional such that it can be used after this method returns */ public List<MODELRESULT> buildModels(ApplicationId applicationId, - Optional<String> dockerImageRepository, + Optional<DockerImage> dockerImageRepository, Version wantedNodeVespaVersion, ApplicationPackage applicationPackage, SettableOptional<AllocatedHosts> allocatedHosts, @@ -149,7 +149,7 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { // versions is the set of versions for one particular major version private List<MODELRESULT> buildModelVersions(Set<Version> versions, ApplicationId applicationId, - Optional<String> wantedDockerImageRepository, + Optional<DockerImage> wantedDockerImageRepository, Version wantedNodeVespaVersion, ApplicationPackage applicationPackage, SettableOptional<AllocatedHosts> allocatedHosts, @@ -244,7 +244,7 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { } protected abstract MODELRESULT buildModelVersion(ModelFactory modelFactory, ApplicationPackage applicationPackage, - ApplicationId applicationId, Optional<String> dockerImageRepository, + ApplicationId applicationId, Optional<DockerImage> dockerImageRepository, Version wantedNodeVespaVersion, Optional<AllocatedHosts> allocatedHosts, Instant now); 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 34d7d8641ea..b8e7d68ea5e 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 @@ -18,6 +18,7 @@ import com.yahoo.config.model.application.provider.FilesApplicationPackage; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.component.Version; +import com.yahoo.config.provision.DockerImage; import java.util.logging.Level; import com.yahoo.vespa.config.server.application.Application; import com.yahoo.vespa.config.server.application.ApplicationSet; @@ -84,7 +85,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P protected PreparedModelResult buildModelVersion(ModelFactory modelFactory, ApplicationPackage applicationPackage, ApplicationId applicationId, - Optional<String> wantedDockerImageRepository, + Optional<DockerImage> wantedDockerImageRepository, Version wantedNodeVespaVersion, Optional<AllocatedHosts> allocatedHosts, Instant now) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java index 825ae0d8d92..4946c24efbc 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java @@ -8,6 +8,7 @@ import com.yahoo.config.application.api.ApplicationMetaData; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.transaction.AbstractTransaction; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; @@ -139,7 +140,7 @@ public class LocalSession extends Session implements Comparable<LocalSession> { zooKeeperClient.writeVespaVersion(version); } - public void setDockerImageRepository(Optional<String> dockerImageRepository) { + public void setDockerImageRepository(Optional<DockerImage> dockerImageRepository) { zooKeeperClient.writeDockerImageRepository(dockerImageRepository); } @@ -157,7 +158,7 @@ public class LocalSession extends Session implements Comparable<LocalSession> { public ApplicationId getApplicationId() { return zooKeeperClient.readApplicationId(); } - public Optional<String> getDockerImageRepository() { return zooKeeperClient.readDockerImageRepository(); } + public Optional<DockerImage> getDockerImageRepository() { return zooKeeperClient.readDockerImageRepository(); } public Version getVespaVersion() { return zooKeeperClient.readVespaVersion(); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java index f7ed801ddbd..e5d4cf9b1ff 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java @@ -6,9 +6,9 @@ import com.yahoo.config.model.api.ContainerEndpoint; import com.yahoo.config.model.api.EndpointCertificateMetadata; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.HttpRequest; -import com.yahoo.slime.Slime; import com.yahoo.slime.SlimeUtils; import com.yahoo.vespa.config.server.TimeoutBudget; import com.yahoo.vespa.config.server.http.SessionHandler; @@ -49,14 +49,14 @@ public final class PrepareParams { private final List<ContainerEndpoint> containerEndpoints; private final Optional<String> tlsSecretsKeyName; private final Optional<EndpointCertificateMetadata> endpointCertificateMetadata; - private final Optional<String> dockerImageRepository; + private final Optional<DockerImage> dockerImageRepository; private final Optional<AthenzDomain> athenzDomain; private PrepareParams(ApplicationId applicationId, TimeoutBudget timeoutBudget, boolean ignoreValidationErrors, boolean dryRun, boolean verbose, boolean isBootstrap, Optional<Version> vespaVersion, List<ContainerEndpoint> containerEndpoints, Optional<String> tlsSecretsKeyName, Optional<EndpointCertificateMetadata> endpointCertificateMetadata, - Optional<String> dockerImageRepository, Optional<AthenzDomain> athenzDomain) { + Optional<DockerImage> dockerImageRepository, Optional<AthenzDomain> athenzDomain) { this.timeoutBudget = timeoutBudget; this.applicationId = applicationId; this.ignoreValidationErrors = ignoreValidationErrors; @@ -83,7 +83,7 @@ public final class PrepareParams { private List<ContainerEndpoint> containerEndpoints = List.of(); private Optional<String> tlsSecretsKeyName = Optional.empty(); private Optional<EndpointCertificateMetadata> endpointCertificateMetadata = Optional.empty(); - private Optional<String> dockerImageRepository = Optional.empty(); + private Optional<DockerImage> dockerImageRepository = Optional.empty(); private Optional<AthenzDomain> athenzDomain = Optional.empty(); public Builder() { } @@ -133,9 +133,9 @@ public final class PrepareParams { } public Builder containerEndpoints(String serialized) { - if (serialized == null) return this; - Slime slime = SlimeUtils.jsonToSlime(serialized); - containerEndpoints = ContainerEndpointSerializer.endpointListFromSlime(slime); + this.containerEndpoints = (serialized == null) + ? List.of() + : ContainerEndpointSerializer.endpointListFromSlime(SlimeUtils.jsonToSlime(serialized)); return this; } @@ -146,15 +146,21 @@ public final class PrepareParams { } public Builder endpointCertificateMetadata(String serialized) { - if(serialized == null) return this; - Slime slime = SlimeUtils.jsonToSlime(serialized); - endpointCertificateMetadata = Optional.of(EndpointCertificateMetadataSerializer.fromSlime(slime.get())); + this.endpointCertificateMetadata = (serialized == null) + ? Optional.empty() + : Optional.of(EndpointCertificateMetadataSerializer.fromSlime(SlimeUtils.jsonToSlime(serialized).get())); return this; } public Builder dockerImageRepository(String dockerImageRepository) { - if (dockerImageRepository == null) return this; - this.dockerImageRepository = Optional.of(dockerImageRepository); + this.dockerImageRepository = (dockerImageRepository == null) + ? Optional.empty() + : Optional.of(DockerImage.fromString(dockerImageRepository)); + return this; + } + + public Builder dockerImageRepository(DockerImage dockerImageRepository) { + this.dockerImageRepository = Optional.ofNullable(dockerImageRepository); return this; } @@ -164,7 +170,7 @@ public final class PrepareParams { } public Builder athenzDomain(AthenzDomain athenzDomain) { - this.athenzDomain = Optional.of(athenzDomain); + this.athenzDomain = Optional.ofNullable(athenzDomain); return this; } @@ -249,7 +255,7 @@ public final class PrepareParams { return endpointCertificateMetadata; } - public Optional<String> dockerImageRepository() { + public Optional<DockerImage> dockerImageRepository() { return dockerImageRepository; } 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 c28d432ea08..00cafb77f6d 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 @@ -18,6 +18,7 @@ import com.yahoo.config.model.api.EndpointCertificateSecrets; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.secretstore.SecretStore; @@ -141,7 +142,7 @@ public class SessionPreparer { final ApplicationId applicationId; /** The repository part of docker image to be used for this deployment */ - final Optional<String> dockerImageRepository; + final Optional<DockerImage> dockerImageRepository; /** The version of Vespa the application to be prepared specifies for its nodes */ final Version vespaVersion; @@ -291,7 +292,7 @@ public class SessionPreparer { private void writeStateToZooKeeper(SessionZooKeeperClient zooKeeperClient, ApplicationPackage applicationPackage, ApplicationId applicationId, - Optional<String> dockerImageRepository, + Optional<DockerImage> dockerImageRepository, Version vespaVersion, DeployLogger deployLogger, Map<Version, FileRegistry> fileRegistryMap, diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java index 1a366063bae..3a248a5c3b9 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java @@ -9,6 +9,7 @@ import com.yahoo.config.model.api.ConfigDefinitionRepo; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.NodeFlavors; import java.util.logging.Level; import com.yahoo.path.Path; @@ -185,14 +186,14 @@ public class SessionZooKeeperClient { return new Version(configCurator.getData(versionPath())); } - public Optional<String> readDockerImageRepository() { + public Optional<DockerImage> readDockerImageRepository() { if ( ! configCurator.exists(dockerImageRepositoryPath())) return Optional.empty(); String dockerImageRepository = configCurator.getData(dockerImageRepositoryPath()); - return dockerImageRepository.isEmpty() ? Optional.empty() : Optional.of(dockerImageRepository); + return dockerImageRepository.isEmpty() ? Optional.empty() : Optional.of(DockerImage.fromString(dockerImageRepository)); } - public void writeDockerImageRepository(Optional<String> dockerImageRepository) { - dockerImageRepository.ifPresent(repo -> configCurator.putData(dockerImageRepositoryPath(), repo)); + public void writeDockerImageRepository(Optional<DockerImage> dockerImageRepository) { + dockerImageRepository.ifPresent(repo -> configCurator.putData(dockerImageRepositoryPath(), repo.repository())); } // in seconds diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java index 03c6bad79a8..20e8524b9b8 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java @@ -81,7 +81,7 @@ public class ModelContextImplTest { assertThat(context.properties().endpoints(), equalTo(endpoints)); assertThat(context.properties().isFirstTimeDeployment(), equalTo(false)); - assertEquals(Optional.empty(), context.wantedDockerImageRepository()); + assertEquals(Optional.empty(), context.wantedDockerImageRepo()); assertEquals(new Version(7), context.modelVespaVersion()); assertEquals(new Version(8), context.wantedNodeVespaVersion()); assertEquals(1.0, context.properties().defaultTermwiseLimit(), 0.0); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java index 7e700b78bf7..d8534774e33 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java @@ -15,6 +15,7 @@ import com.yahoo.config.model.provision.Hosts; import com.yahoo.config.model.provision.InMemoryProvisioner; import com.yahoo.config.model.test.HostedConfigModelRegistry; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; @@ -101,7 +102,7 @@ public class HostedDeployTest { assertTrue(deployment.isPresent()); deployment.get().activate(); assertEquals("4.5.6", ((Deployment) deployment.get()).session().getVespaVersion().toString()); - assertEquals(dockerImageRepository, ((Deployment) deployment.get()).session().getDockerImageRepository().get()); + assertEquals(DockerImage.fromString(dockerImageRepository), ((Deployment) deployment.get()).session().getDockerImageRepository().get()); assertEquals("foo", ((Deployment) deployment.get()).session().getAthenzDomain().get().value()); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java index a2e0b1e9443..a1e252c8130 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java @@ -9,6 +9,7 @@ import com.yahoo.config.model.application.provider.FilesApplicationPackage; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.ProvisionLogger; @@ -101,7 +102,7 @@ public class SessionHandlerTest { private ConfigChangeActions actions = new ConfigChangeActions(); private long createTime = System.currentTimeMillis() / 1000; private ApplicationId applicationId; - private Optional<String> dockerImageRepository; + private Optional<DockerImage> dockerImageRepository; public MockSession(long id, ApplicationPackage app) { this(id, app, new InMemoryFlagSource()); @@ -174,7 +175,7 @@ public class SessionHandlerTest { public void delete(NestedTransaction transaction) { } @Override - public Optional<String> getDockerImageRepository() { + public Optional<DockerImage> getDockerImageRepository() { return dockerImageRepository; } } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java index 11cbdb03ccf..94276b30f42 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java @@ -9,6 +9,7 @@ import com.yahoo.config.model.api.ServiceInfo; import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationLockException; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.OutOfCapacityException; import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.HttpResponse; @@ -336,7 +337,7 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest { localRepo.addSession(session); String dockerImageRepository = "https://foo.bar.com:4443/baz"; request(HttpRequest.Method.PUT, 1L, Map.of("dockerImageRepository", dockerImageRepository)); - assertEquals(dockerImageRepository, localRepo.getSession(1).getDockerImageRepository().get()); + assertEquals(DockerImage.fromString(dockerImageRepository), localRepo.getSession(1).getDockerImageRepository().get()); } private Slime getData(HttpResponse response) throws IOException { |