summaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-11-06 10:21:34 +0100
committerGitHub <noreply@github.com>2020-11-06 10:21:34 +0100
commit894f4a8d3e82b4f5d1027ce6c9c284b1e740110f (patch)
tree2bf988194076eadd9e78a3e0f67e5f652e84b011 /node-repository/src/main/java
parent2e44cf6e622f3933ecb6cde48839af3b45bc4887 (diff)
parent7c5646844e0eea6a02a933e7b2d330ee613808da (diff)
Merge pull request #15200 from vespa-engine/mpolden/image-replacement
Replace image atomically
Diffstat (limited to 'node-repository/src/main/java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java7
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ContainerImages.java31
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());
+ }
+
}