diff options
author | Martin Polden <martin.polden@gmail.com> | 2017-06-12 11:17:13 +0200 |
---|---|---|
committer | Martin Polden <martin.polden@gmail.com> | 2017-06-12 11:34:59 +0200 |
commit | 81be9eb7c62743fb9245f6e73a8a844f50e06e3f (patch) | |
tree | 2aaf1281419ad738e4323acab8ea2ce20ac44c36 /node-repository/src/main/java | |
parent | 44352dabe868bccf2aab2db0f426a88b5ed3c27a (diff) |
Use config to specify Docker image in node-repository
Diffstat (limited to 'node-repository/src/main/java')
5 files changed, 24 insertions, 22 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 14d5549d0b2..2dd632ce45a 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 @@ -6,10 +6,12 @@ import com.google.inject.Inject; import com.yahoo.collections.ListMap; import com.yahoo.component.AbstractComponent; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; +import com.yahoo.config.provisioning.NodeRepositoryConfig; import com.yahoo.path.Path; import com.yahoo.transaction.Mutex; import com.yahoo.transaction.NestedTransaction; @@ -73,26 +75,29 @@ public class NodeRepository extends AbstractComponent { private final Clock clock; private final NodeFlavors flavors; private final NameResolver nameResolver; + private final DockerImage dockerImage; /** * Creates a node repository form a zookeeper provider. * This will use the system time to make time-sensitive decisions */ @Inject - public NodeRepository(NodeFlavors flavors, Curator curator, Zone zone) { - this(flavors, curator, Clock.systemUTC(), zone, new DnsNameResolver()); + public NodeRepository(NodeRepositoryConfig config, NodeFlavors flavors, Curator curator, Zone zone) { + this(flavors, curator, Clock.systemUTC(), zone, new DnsNameResolver(), new DockerImage(config.dockerImage())); } /** * Creates a node repository form a zookeeper provider and a clock instance * which will be used for time-sensitive decisions. */ - public NodeRepository(NodeFlavors flavors, Curator curator, Clock clock, Zone zone, NameResolver nameResolver) { + public NodeRepository(NodeFlavors flavors, Curator curator, Clock clock, Zone zone, NameResolver nameResolver, + DockerImage dockerImage) { this.db = new CuratorDatabaseClient(flavors, curator, clock, zone); this.curator = curator; this.clock = clock; this.flavors = flavors; this.nameResolver = nameResolver; + this.dockerImage = dockerImage; // read and write all nodes to make sure they are stored in the latest version of the serialized format for (Node.State state : Node.State.values()) @@ -101,6 +106,9 @@ public class NodeRepository extends AbstractComponent { /** Returns the curator database client used by this */ public CuratorDatabaseClient database() { return db; } + + /** Returns the Docker image to use for nodes in this */ + public DockerImage dockerImage() { return dockerImage; } // ---------------- Query API ---------------------------------------------------------------- diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Status.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Status.java index 24216370d63..c1d7ee0cae2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Status.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Status.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.hosted.provision.node; import com.yahoo.component.Version; -import com.yahoo.config.provision.DockerImage; import javax.annotation.concurrent.Immutable; import java.util.Optional; @@ -59,18 +58,6 @@ public class Status { /** Returns the Vespa version installed on the node, if known */ public Optional<Version> vespaVersion() { return vespaVersion; } - /** Returns a copy of this with the docker image changed */ - public Status withDockerImage(String dockerImage) { - Optional<Version> vespaVersion = Optional.of(dockerImage) - .filter(image -> !image.isEmpty()) - .map(DockerImage::new) - .map(DockerImage::tagAsVersion); - return new Status(reboot, vespaVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); - } - - /** Returns the current docker image the node is running, if known. */ - public Optional<String> dockerImage() { return vespaVersion.map(DockerImage.defaultImage::withTag).map(DockerImage::toString); } - public Status withIncreasedFailCount() { return new Status(reboot, vespaVersion, failCount + 1, hardwareFailure, wantToRetire, wantToDeprovision); } public Status withDecreasedFailCount() { return new Status(reboot, vespaVersion, failCount - 1, hardwareFailure, wantToRetire, wantToDeprovision); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java index 091f5654636..d21ab77e403 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.provision.restapi.v2; import com.yahoo.component.Version; +import com.yahoo.config.provision.DockerImage; import com.yahoo.io.IOUtils; import com.yahoo.slime.Inspector; import com.yahoo.slime.Type; @@ -68,7 +69,12 @@ public class NodePatcher { case "currentRestartGeneration" : return patchCurrentRestartGeneration(asLong(value)); case "currentDockerImage" : - return node.with(node.status().withDockerImage(asString(value))); + Version versionFromImage = Optional.of(asString(value)) + .filter(s -> !s.isEmpty()) + .map(DockerImage::new) + .map(DockerImage::tagAsVersion) + .orElse(Version.emptyVersion); + return node.with(node.status().withVespaVersion(versionFromImage)); case "currentVespaVersion" : return node.with(node.status().withVespaVersion(Version.fromString(asString(value)))); case "currentHostedVersion" : diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java index 6d66cdd3764..3360ce3ffe1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java @@ -155,7 +155,7 @@ class NodesResponse extends HttpResponse { toSlime(node.allocation().get().membership(), object.setObject("membership")); object.setLong("restartGeneration", node.allocation().get().restartGeneration().wanted()); object.setLong("currentRestartGeneration", node.allocation().get().restartGeneration().current()); - object.setString("wantedDockerImage", node.allocation().get().membership().cluster().dockerImage()); + object.setString("wantedDockerImage", nodeRepository.dockerImage().withTag(node.allocation().get().membership().cluster().vespaVersion()).asString()); object.setString("wantedVespaVersion", node.allocation().get().membership().cluster().vespaVersion().toFullString()); } object.setLong("rebootGeneration", node.status().reboot().wanted()); @@ -164,11 +164,11 @@ class NodesResponse extends HttpResponse { .filter(version -> !version.isEmpty()) .ifPresent(version -> { object.setString("vespaVersion", version.toFullString()); + object.setString("currentDockerImage", nodeRepository.dockerImage().withTag(version).asString()); // TODO: Remove these when they are no longer read object.setString("hostedVersion", version.toFullString()); object.setString("convergedStateVersion", version.toFullString()); }); - node.status().dockerImage().ifPresent(image -> object.setString("currentDockerImage", image)); object.setLong("failCount", node.status().failCount()); object.setBool("hardwareFailure", node.status().hardwareFailure().isPresent()); node.status().hardwareFailure().ifPresent(failure -> object.setString("hardwareFailureType", toString(failure))); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 96604fca233..12b687c7646 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.NodeFlavors; @@ -44,7 +45,7 @@ public class MockNodeRepository extends NodeRepository { */ public MockNodeRepository(MockCurator curator, NodeFlavors flavors) throws Exception { super(flavors, curator, Clock.fixed(Instant.ofEpochMilli(123), ZoneId.of("Z")), Zone.defaultZone(), - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); this.flavors = flavors; curator.setConnectionSpec("cfg1:1234,cfg2:1234,cfg3:1234"); populate(); @@ -65,11 +66,11 @@ public class MockNodeRepository extends NodeRepository { // TODO: Use docker flavor Node node4 = createNode("node4", "host4.yahoo.com", ipAddresses, Optional.of("dockerhost4"), flavors.getFlavorOrThrow("default"), NodeType.tenant); - node4 = node4.with(node4.status().withDockerImage("image-12:6.41.0")); + node4 = node4.with(node4.status().withVespaVersion(new Version("6.41.0"))); nodes.add(node4); Node node5 = createNode("node5", "host5.yahoo.com", ipAddresses, Optional.of("parent1.yahoo.com"), flavors.getFlavorOrThrow("default"), NodeType.tenant); - nodes.add(node5.with(node5.status().withDockerImage("image-123:1.2.3").withVespaVersion(new Version("1.2.3")))); + nodes.add(node5.with(node5.status().withVespaVersion(new Version("1.2.3")))); nodes.add(createNode("node6", "host6.yahoo.com", ipAddresses, Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant)); nodes.add(createNode("node7", "host7.yahoo.com", ipAddresses, Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant)); |