diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-11-06 10:21:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-06 10:21:34 +0100 |
commit | 894f4a8d3e82b4f5d1027ce6c9c284b1e740110f (patch) | |
tree | 2bf988194076eadd9e78a3e0f67e5f652e84b011 /node-repository/src/main/java | |
parent | 2e44cf6e622f3933ecb6cde48839af3b45bc4887 (diff) | |
parent | 7c5646844e0eea6a02a933e7b2d330ee613808da (diff) |
Merge pull request #15200 from vespa-engine/mpolden/image-replacement
Replace image atomically
Diffstat (limited to 'node-repository/src/main/java')
2 files changed, 23 insertions, 15 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index d8ea19b7677..845d2763501 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -127,7 +127,8 @@ public class NodeRepository extends AbstractComponent { Clock.systemUTC(), zone, new DnsNameResolver(), - DockerImage.fromString(config.containerImage()), + DockerImage.fromString(config.containerImage()) + .withReplacedBy(DockerImage.fromString(config.containerImageReplacement())), flagSource, config.useCuratorClientCache(), zone.environment().isProduction() && !zone.getCloud().dynamicProvisioning() ? 1 : 0, @@ -144,7 +145,7 @@ public class NodeRepository extends AbstractComponent { Clock clock, Zone zone, NameResolver nameResolver, - DockerImage dockerImage, + DockerImage containerImage, FlagSource flagSource, boolean useCuratorClientCache, int spareCount, @@ -164,7 +165,7 @@ public class NodeRepository extends AbstractComponent { this.osVersions = new OsVersions(this); this.infrastructureVersions = new InfrastructureVersions(db); this.firmwareChecks = new FirmwareChecks(db, clock); - this.containerImages = new ContainerImages(db, dockerImage); + this.containerImages = new ContainerImages(db, containerImage, flagSource); this.jobControl = new JobControl(new JobControlFlags(db, flagSource)); this.applications = new Applications(db); this.spareCount = spareCount; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImages.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImages.java index 92518239258..45156c57481 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImages.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImages.java @@ -6,6 +6,9 @@ import com.google.common.base.Suppliers; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.curator.Lock; +import com.yahoo.vespa.flags.BooleanFlag; +import com.yahoo.vespa.flags.FlagSource; +import com.yahoo.vespa.flags.Flags; import com.yahoo.vespa.hosted.provision.persistence.CuratorDatabaseClient; import java.time.Duration; @@ -23,12 +26,12 @@ import java.util.logging.Logger; */ public class ContainerImages { - private static final Duration defaultCacheTtl = Duration.ofMinutes(1); + private static final Duration cacheTtl = Duration.ofMinutes(1); private static final Logger log = Logger.getLogger(ContainerImages.class.getName()); private final CuratorDatabaseClient db; private final DockerImage defaultImage; - private final Duration cacheTtl; + private final BooleanFlag replaceImage; /** * The container image is read on every request to /nodes/v2/node/[fqdn]. Cache current images to avoid @@ -37,14 +40,10 @@ public class ContainerImages { */ private volatile Supplier<Map<NodeType, DockerImage>> images; - public ContainerImages(CuratorDatabaseClient db, DockerImage defaultImage) { - this(db, defaultImage, defaultCacheTtl); - } - - ContainerImages(CuratorDatabaseClient db, DockerImage defaultImage, Duration cacheTtl) { + public ContainerImages(CuratorDatabaseClient db, DockerImage defaultImage, FlagSource flagSource) { this.db = db; this.defaultImage = defaultImage; - this.cacheTtl = cacheTtl; + this.replaceImage = Flags.REGIONAL_CONTAINER_REGISTRY.bindTo(flagSource); createCache(); } @@ -58,15 +57,14 @@ public class ContainerImages { return images.get(); } - /** Returns the current docker image for given node type, or the type for corresponding child nodes - * if it is a Docker host, or default */ + /** Returns the container image to use for given node type */ public DockerImage imageFor(NodeType type) { NodeType typeToUseForLookup = type.isHost() ? type.childNodeType() : type; DockerImage image = getImages().get(typeToUseForLookup); if (image == null) { - return defaultImage; + image = defaultImage; } - return image.withRegistry(defaultImage.registry()); // Always use the registry configured for this zone. + return rewriteRegistry(image); } /** Set the docker image for nodes of given type */ @@ -84,4 +82,13 @@ public class ContainerImages { } } + /** Rewrite the registry part of given image, using this zone's default image */ + private DockerImage rewriteRegistry(DockerImage image) { + DockerImage zoneImage = defaultImage; + if (zoneImage.replacedBy().isPresent() && replaceImage.value()) { + zoneImage = zoneImage.replacedBy().get(); + } + return image.withRegistry(zoneImage.registry()); + } + } |