diff options
author | Jon Bratseth <jonbratseth@yahoo.com> | 2017-06-13 09:51:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-13 09:51:04 +0200 |
commit | 9fe6a9f635a5277d6d6c58ccbe5b279449e016c1 (patch) | |
tree | a16899b03d336a723d7b380d444762aeeee7ba60 | |
parent | 344730820bb8e6f23eb0784a0dd4b469657ab49e (diff) | |
parent | 8c1140d954d8e82520bdfe9310edcfd5bebbbb40 (diff) |
Merge pull request #2702 from yahoo/mpolden/docker-image-config
Docker image config
35 files changed, 132 insertions, 172 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java index 19fcce4b965..b7c942168d6 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java @@ -37,10 +37,6 @@ public final class ClusterSpec { public Version vespaVersion() { return vespaVersion; } - public String dockerImage() { - return DockerImage.defaultImage.withTag(vespaVersion).toString(); - } - /** Returns the group within the cluster this specifies, or empty to specify the whole cluster */ public Optional<Group> group() { return groupId; } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java b/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java index 2c6c9d82419..ba60e42e7d6 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java @@ -10,8 +10,6 @@ import com.yahoo.component.Version; */ public class DockerImage { - public static final DockerImage defaultImage = new DockerImage("docker-registry.ops.yahoo.com:4443/vespa/ci"); - private final String name; public DockerImage(String name) { @@ -20,9 +18,9 @@ public class DockerImage { /** Get Docker image tag as version */ public Version tagAsVersion() { - String[] parts = toString().split(":"); + String[] parts = asString().split(":"); if (parts.length < 2) { - throw new IllegalArgumentException("Could not parse tag from Docker image '" + toString() + "'"); + throw new IllegalArgumentException("Could not parse tag from Docker image '" + asString() + "'"); } return Version.fromString(parts[parts.length - 1]); } @@ -32,8 +30,8 @@ public class DockerImage { return new DockerImage(name + ":" + version.toFullString()); } - @Override - public String toString() { + public String asString() { return name; } + } diff --git a/config-provisioning/src/main/resources/configdefinitions/node-repository.def b/config-provisioning/src/main/resources/configdefinitions/node-repository.def new file mode 100644 index 00000000000..872f2e50f9c --- /dev/null +++ b/config-provisioning/src/main/resources/configdefinitions/node-repository.def @@ -0,0 +1,5 @@ +namespace=config.provisioning + +# Docker image to use in REST API responses. This must be a fully qualified name, including registry, but excluding +# version. Example: my-docker-registry.domain.tld:8080/dist/vespa +dockerImage string diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java index bd691afaf55..b4726022ebb 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java @@ -54,7 +54,6 @@ public class ProvisionInfoTest { assertTrue(!getHost(h1.hostname(), serializedInfo.getHosts()).membership().isPresent()); assertEquals("container/test/0", getHost(h3.hostname(), serializedInfo.getHosts()).membership().get().stringValue()); assertEquals(h3.membership().get().cluster().vespaVersion(), getHost(h3.hostname(), serializedInfo.getHosts()).membership().get().cluster().vespaVersion()); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.73.1", getHost(h3.hostname(), serializedInfo.getHosts()).membership().get().cluster().dockerImage()); } private HostSpec getHost(String hostname, Set<HostSpec> hosts) { 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 83b9a30b946..12670c0e8cc 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 @@ -109,8 +109,7 @@ public class HostedDeployTest { private void assertProvisionInfo(String vespaVersion, DeployTester tester, ApplicationId applicationId) { tester.getProvisionInfoFromDeployedApp(applicationId).getHosts().stream() - .forEach(h -> assertEquals(dockerRegistry + dockerVespaBaseImage + ":" + vespaVersion, - h.membership().get().cluster().dockerImage())); + .forEach(h -> assertEquals(vespaVersion, h.membership().get().cluster().vespaVersion())); } private static ConfigserverConfig createConfigserverConfig() { diff --git a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java index 0b52d54c0dd..96e5584fb4b 100644 --- a/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java +++ b/docker-api/src/test/java/com/yahoo/vespa/hosted/dockerapi/RunSystemTests.java @@ -30,7 +30,7 @@ import static org.junit.Assert.assertEquals; * * * Example usage: - DockerImage vespaDockerBase = new DockerImage("docker-registry.ops.yahoo.com:4443/vespa/ci:6.52.35"); + DockerImage vespaDockerBase = new DockerImage("docker-registry.domain.tld:8080/vespa/ci:6.52.35"); Path pathToSystemtestsInHost = Paths.get("/home/valerijf/dev/systemtests"); RunSystemTests runSystemTests = new RunSystemTests(vespaDockerBase, pathToSystemtestsInHost); diff --git a/node-admin/README.md b/node-admin/README.md index 8352cbd3c43..bab4c17ffbf 100644 --- a/node-admin/README.md +++ b/node-admin/README.md @@ -31,7 +31,7 @@ implements all of the basic methods you need to get started. To start a local zone, simply run: ``` - DockerImage dockerImage = new DockerImage("docker-registry.ops.yahoo.com:4443/vespa/ci:6.111.21"); + DockerImage dockerImage = new DockerImage("docker-registry.domain.tld:8080/vespa/ci:6.111.21"); Path pathToVespaRoot = Paths.get("/home/valerijf/dev/vespa"); Path pathToContainerStorage = Paths.get("/home/docker/container-storage"); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java index 15dce02f336..f5f98910694 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java @@ -83,14 +83,14 @@ public class NodeRepositoryImplTest { } @Test - public void testGetContainersToRunAPi() throws IOException, InterruptedException { + public void testGetContainersToRunApi() throws IOException, InterruptedException { waitForJdiscContainerToServe(); NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port, "dockerhost4"); final List<ContainerNodeSpec> containersToRun = nodeRepositoryApi.getContainersToRun(); assertThat(containersToRun.size(), is(1)); final ContainerNodeSpec nodeSpec = containersToRun.get(0); assertThat(nodeSpec.hostname, is("host4.yahoo.com")); - assertThat(nodeSpec.wantedDockerImage.get(), is(new DockerImage("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0"))); + assertThat(nodeSpec.wantedDockerImage.get(), is(new DockerImage("docker-registry.domain.tld:8080/dist/vespa:6.42.0"))); assertThat(nodeSpec.nodeState, is(Node.State.reserved)); assertThat(nodeSpec.wantedRestartGeneration.get(), is(0L)); assertThat(nodeSpec.currentRestartGeneration.get(), is(0L)); diff --git a/node-repository/src/main/config/node-repository.xml b/node-repository/src/main/config/node-repository.xml index 90f47e0acc8..0f39b190ed1 100644 --- a/node-repository/src/main/config/node-repository.xml +++ b/node-repository/src/main/config/node-repository.xml @@ -14,3 +14,4 @@ </handler> <preprocess:include file="node-flavors.xml" required="false" /> +<preprocess:include file="node-repository-config.xml" required="false" /> 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 e8a24b85714..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; @@ -17,8 +16,6 @@ public class Status { private final Generation reboot; private final Optional<Version> vespaVersion; - private final Optional<Version> hostedVersion; // TODO: Remove when all nodes have started using vespaVersion - private final Optional<String> stateVersion; // TODO: Remove when all nodes have started using vespaVersion private final int failCount; private final Optional<HardwareFailureType> hardwareFailure; private final boolean wantToRetire; @@ -37,16 +34,12 @@ public class Status { public Status(Generation generation, Optional<Version> vespaVersion, - Optional<Version> hostedVersion, - Optional<String> stateVersion, int failCount, Optional<HardwareFailureType> hardwareFailure, boolean wantToRetire, boolean wantToDeprovision) { this.reboot = generation; this.vespaVersion = vespaVersion; - this.hostedVersion = hostedVersion; - this.stateVersion = stateVersion; this.failCount = failCount; this.hardwareFailure = hardwareFailure; this.wantToRetire = wantToRetire; @@ -54,63 +47,34 @@ public class Status { } /** Returns a copy of this with the reboot generation changed */ - public Status withReboot(Generation reboot) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } + public Status withReboot(Generation reboot) { return new Status(reboot, vespaVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } /** Returns the reboot generation of this node */ public Generation reboot() { return reboot; } /** Returns a copy of this with the vespa version changed */ - public Status withVespaVersion(Version version) { return new Status(reboot, Optional.of(version), hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } + public Status withVespaVersion(Version version) { return new Status(reboot, Optional.of(version), failCount, hardwareFailure, wantToRetire, wantToDeprovision); } /** Returns the Vespa version installed on the node, if known */ public Optional<Version> vespaVersion() { return vespaVersion; } - /** Returns a copy of this with the hosted version changed */ - public Status withHostedVersion(Version version) { return new Status(reboot, vespaVersion, Optional.of(version), stateVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } + public Status withIncreasedFailCount() { return new Status(reboot, vespaVersion, failCount + 1, hardwareFailure, wantToRetire, wantToDeprovision); } - /** Returns the hosted version installed on the node, if known */ - public Optional<Version> hostedVersion() { return hostedVersion; } + public Status withDecreasedFailCount() { return new Status(reboot, vespaVersion, failCount - 1, hardwareFailure, wantToRetire, wantToDeprovision); } - /** Returns a copy of this with the state version changed */ - public Status withStateVersion(String version) { return new Status(reboot, vespaVersion, hostedVersion, Optional.of(version), failCount, hardwareFailure, wantToRetire, wantToDeprovision); } - - /** - * Returns the state version the node last successfully converged with. - * The state version contains the version-specific parts in identifying state - * files on dist, and is of the form HOSTEDVERSION. - * It's also used to uniquely identify a hosted Vespa release. - */ - public Optional<String> stateVersion() { return stateVersion; } - - /** 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, hostedVersion, stateVersion, 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, hostedVersion, stateVersion, failCount + 1, hardwareFailure, wantToRetire, wantToDeprovision); } - - public Status withDecreasedFailCount() { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount - 1, hardwareFailure, wantToRetire, wantToDeprovision); } - - public Status setFailCount(Integer value) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, value, hardwareFailure, wantToRetire, wantToDeprovision); } + public Status setFailCount(Integer value) { return new Status(reboot, vespaVersion, value, hardwareFailure, wantToRetire, wantToDeprovision); } /** Returns how many times this node has been moved to the failed state. */ public int failCount() { return failCount; } - public Status withHardwareFailure(Optional<HardwareFailureType> hardwareFailure) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } + public Status withHardwareFailure(Optional<HardwareFailureType> hardwareFailure) { return new Status(reboot, vespaVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } /** Returns the type of the last hardware failure detected on this node, or empty if none */ public Optional<HardwareFailureType> hardwareFailure() { return hardwareFailure; } /** Returns a copy of this with the want to retire flag changed */ public Status withWantToRetire(boolean wantToRetire) { - return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); + return new Status(reboot, vespaVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } /** @@ -121,19 +85,19 @@ public class Status { return wantToRetire; } - /** Returns a copy of this with the want to deprovision flag changed */ + /** Returns a copy of this with the want to de-provision flag changed */ public Status withWantToDeprovision(boolean wantToDeprovision) { - return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); + return new Status(reboot, vespaVersion, failCount, hardwareFailure, wantToRetire, wantToDeprovision); } /** - * Returns whether this node should be deprovisioned when possible. + * Returns whether this node should be de-provisioned when possible. */ public boolean wantToDeprovision() { return wantToDeprovision; } /** Returns the initial status of a newly provisioned node */ - public static Status initial() { return new Status(Generation.inital(), Optional.empty(), Optional.empty(), Optional.empty(), 0, Optional.empty(), false, false); } + public static Status initial() { return new Status(Generation.inital(), Optional.empty(), 0, Optional.empty(), false, false); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java index 582f97361b2..a090ee9f3e5 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java @@ -30,8 +30,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import static com.yahoo.vespa.config.SlimeUtils.optionalString; - /** * Serializes a node to/from JSON. * Instances of this are multithread safe and can be reused @@ -54,8 +52,6 @@ public class NodeSerializer { private static final String rebootGenerationKey = "rebootGeneration"; private static final String currentRebootGenerationKey = "currentRebootGeneration"; private static final String vespaVersionKey = "vespaVersion"; - private static final String hostedVersionKey = "hostedVersion"; - private static final String stateVersionKey = "stateVersion"; private static final String failCountKey = "failCount"; private static final String hardwareFailureKey = "hardwareFailure"; private static final String nodeTypeKey = "type"; @@ -108,8 +104,6 @@ public class NodeSerializer { object.setLong(rebootGenerationKey, node.status().reboot().wanted()); object.setLong(currentRebootGenerationKey, node.status().reboot().current()); node.status().vespaVersion().ifPresent(version -> object.setString(vespaVersionKey, version.toString())); - node.status().hostedVersion().ifPresent(version -> object.setString(hostedVersionKey, version.toString())); - node.status().stateVersion().ifPresent(version -> object.setString(stateVersionKey, version)); object.setLong(failCountKey, node.status().failCount()); node.status().hardwareFailure().ifPresent(failure -> object.setString(hardwareFailureKey, toString(failure))); object.setBool(wantToRetireKey, node.status().wantToRetire()); @@ -170,8 +164,6 @@ public class NodeSerializer { boolean wantToDeprovision = object.field(wantToDeprovisionKey).valid() && object.field(wantToDeprovisionKey).asBool(); return new Status(generationFromSlime(object, rebootGenerationKey, currentRebootGenerationKey), versionFromSlime(object.field(vespaVersionKey)), - versionFromSlime(object.field(hostedVersionKey)), - optionalString(object.field(stateVersionKey)), (int)object.field(failCountKey).asLong(), hardwareFailureFromSlime(object.field(hardwareFailureKey)), object.field(wantToRetireKey).asBool(), 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 b410b0c8ead..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; @@ -62,17 +63,22 @@ public class NodePatcher { private Node applyField(String name, Inspector value) { switch (name) { case "convergedStateVersion" : - return node.with(node.status().withStateVersion(asString(value))); + return node; // TODO: Ignored, can be removed when callers no longer include this field case "currentRebootGeneration" : return node.withCurrentRebootGeneration(asLong(value), clock.instant()); 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" : - return node.with(node.status().withHostedVersion(Version.fromString(asString(value)))); + return node; // TODO: Ignored, can be removed when callers no longer include this field case "failCount" : return node.with(node.status().setFailCount(asLong(value).intValue())); case "flavor" : 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 00bec80b758..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 @@ -1,7 +1,6 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.restapi.v2; -import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.NodeType; @@ -156,17 +155,20 @@ 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()); object.setLong("currentRebootGeneration", node.status().reboot().current()); - node.status().vespaVersion().ifPresent(version -> { - if (! version.equals(Version.emptyVersion)) object.setString("vespaVersion", version.toFullString()); - }); - node.status().hostedVersion().ifPresent(version -> object.setString("hostedVersion", version.toFullString())); - node.status().dockerImage().ifPresent(image -> object.setString("currentDockerImage", image)); - node.status().stateVersion().ifPresent(version -> object.setString("convergedStateVersion", version)); + node.status().vespaVersion() + .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()); + }); 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 adfccd1f874..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,17 +6,17 @@ 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; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.transaction.NestedTransaction; -import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import com.yahoo.config.provision.NodeFlavors; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.Status; import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; @@ -45,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(); @@ -66,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)); @@ -78,9 +78,7 @@ public class MockNodeRepository extends NodeRepository { Node node10 = createNode("node10", "host10.yahoo.com", ipAddresses, Optional.of("parent1.yahoo.com"), flavors.getFlavorOrThrow("default"), NodeType.tenant); Status node10newStatus = node10.status(); node10newStatus = node10newStatus - .withVespaVersion(Version.fromString("5.104.142")) - .withHostedVersion(Version.fromString("2.1.2408")) - .withStateVersion("5.104.142-2.1.2408"); + .withVespaVersion(Version.fromString("5.104.142")); node10 = node10.with(node10newStatus); nodes.add(node10); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java index 66e580d9039..8563d189658 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java @@ -1,12 +1,13 @@ package com.yahoo.vespa.hosted.provision; +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.test.ManualClock; import com.yahoo.config.provisioning.FlavorsConfig; +import com.yahoo.test.ManualClock; import com.yahoo.vespa.curator.mock.MockCurator; -import com.yahoo.config.provision.Flavor; -import com.yahoo.config.provision.NodeFlavors; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; @@ -32,7 +33,8 @@ public class NodeRepositoryTester { curator = new MockCurator(); curator.setConnectionSpec("server1:1234,server2:5678"); nodeRepository = new NodeRepository(nodeFlavors, curator, clock, Zone.defaultZone(), - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); } public NodeRepository nodeRepository() { return nodeRepository; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index bcb85af6f9c..35f83fffb03 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -6,9 +6,11 @@ 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.Environment; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; @@ -21,12 +23,11 @@ import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.curator.transaction.CuratorTransaction; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import com.yahoo.config.provision.NodeFlavors; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.Status; +import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; -import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import org.junit.Test; @@ -84,7 +85,8 @@ public class FailedExpirerTest { ManualClock clock = new ManualClock(); NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default", flavorName); NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, Zone.defaultZone(), - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, Zone.defaultZone(), clock, (x,y) -> {}); Flavor defaultFlavor = nodeFlavors.getFlavorOrThrow("default"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java index 573e14fa4f9..d0558296e7c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java @@ -1,5 +1,6 @@ package com.yahoo.vespa.hosted.provision.maintenance; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; @@ -31,7 +32,8 @@ public class MaintenanceTester { private final Zone zone = new Zone(Environment.prod, RegionName.from("us-east")); private final NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default"); public final NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); public NodeRepository nodeRepository() { return nodeRepository; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index ec85b72b61a..de2c68aa43e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -5,6 +5,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.Environment; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostSpec; @@ -21,8 +22,8 @@ import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.curator.transaction.CuratorTransaction; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; +import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import com.yahoo.vespa.hosted.provision.testutils.OrchestratorMock; @@ -69,7 +70,8 @@ public class NodeFailTester { private NodeFailTester() { clock = new ManualClock(); curator = new MockCurator(); - nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup()); + nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone); hostLivenessTracker = new TestHostLivenessTracker(clock); orchestrator = new OrchestratorMock(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java index 7622cbb1714..c18ebd67d62 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java @@ -5,6 +5,7 @@ import com.yahoo.component.Version; 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.Environment; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostSpec; @@ -68,7 +69,8 @@ public class NodeRetirerTester { private int nextNodeId = 0; NodeRetirerTester(NodeFlavors nodeFlavors) { - nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup()); + nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); jobControl = new JobControl(nodeRepository.database()); provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone); deployer = new MockDeployer(provisioner, apps); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index 3849c69b4e1..f2d31fb3b87 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.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.Environment; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; @@ -23,8 +24,8 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; -import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; +import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import org.junit.Test; @@ -54,7 +55,8 @@ public class OperatorChangeApplicationMaintainerTest { Curator curator = new MockCurator(); Zone zone = new Zone(Environment.prod, RegionName.from("us-east")); this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); this.fixture = new Fixture(zone, nodeRepository, nodeFlavors, curator); createReadyNodes(15, nodeRepository, nodeFlavors); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java index 8940bb94736..ef45831bdc3 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Deployer; import com.yahoo.config.provision.Deployment; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; @@ -25,8 +26,8 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; -import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; +import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import org.junit.Before; @@ -56,7 +57,8 @@ public class PeriodicApplicationMaintainerTest { Curator curator = new MockCurator(); Zone zone = new Zone(Environment.prod, RegionName.from("us-east")); this.nodeRepository = new NodeRepository(nodeFlavors, curator, new ManualClock(), zone, - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); this.fixture = new Fixture(zone, nodeRepository, nodeFlavors, curator); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java index e918681faee..0d21650343f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java @@ -5,6 +5,8 @@ import com.yahoo.component.Version; 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.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; import com.yahoo.test.ManualClock; @@ -12,9 +14,8 @@ import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import com.yahoo.config.provision.NodeFlavors; -import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; +import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import org.junit.Test; @@ -39,7 +40,8 @@ public class ReservationExpirerTest { ManualClock clock = new ManualClock(); NodeFlavors flavors = FlavorConfigBuilder.createDummies("default"); NodeRepository nodeRepository = new NodeRepository(flavors, curator, clock, Zone.defaultZone(), - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, flavors, Zone.defaultZone(), clock, (x,y) -> {}); List<Node> nodes = new ArrayList<>(2); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index 7f388057f6e..54b70c91a5d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.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.Environment; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; @@ -21,8 +22,8 @@ import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.curator.transaction.CuratorTransaction; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; -import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; +import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import com.yahoo.vespa.orchestrator.OrchestrationException; @@ -56,7 +57,8 @@ public class RetiredExpirerTest { Zone zone = new Zone(Environment.prod, RegionName.from("us-east")); NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default"); NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone); createReadyNodes(7, nodeRepository, nodeFlavors); @@ -95,7 +97,8 @@ public class RetiredExpirerTest { Zone zone = new Zone(Environment.prod, RegionName.from("us-east")); NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default"); NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone); createReadyNodes(8, nodeRepository, nodeFlavors); @@ -130,7 +133,8 @@ public class RetiredExpirerTest { Zone zone = new Zone(Environment.prod, RegionName.from("us-east")); NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default"); NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone); createReadyNodes(7, nodeRepository, nodeFlavors); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java index febda1300ee..8c12d5f1f2a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.provision.monitoring; import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; +import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; @@ -44,7 +45,8 @@ public class MetricsReporterTest { NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default"); Curator curator = new MockCurator(); NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, Clock.systemUTC(), Zone.defaultZone(), - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); Node node = nodeRepository.createNode("openStackId", "hostname", Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant); nodeRepository.addNodes(Collections.singletonList(node)); Node hostNode = nodeRepository.createNode("openStackId2", "parent", Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.proxy); @@ -78,7 +80,8 @@ public class MetricsReporterTest { NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("host", "docker", "docker2"); Curator curator = new MockCurator(); NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, Clock.systemUTC(), Zone.defaultZone(), - new MockNameResolver().mockAnyLookup()); + new MockNameResolver().mockAnyLookup(), + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); // Allow 4 containers Set<String> additionalIps = new HashSet<>(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java index 5674d5c3ff0..00120d5a8b0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java @@ -7,7 +7,6 @@ import com.yahoo.component.Vtag; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.ClusterMembership; -import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; @@ -17,7 +16,6 @@ import com.yahoo.text.Utf8; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.Node.State; import com.yahoo.vespa.hosted.provision.node.Agent; -import com.yahoo.vespa.hosted.provision.node.Allocation; import com.yahoo.vespa.hosted.provision.node.Generation; import com.yahoo.vespa.hosted.provision.node.History; import com.yahoo.vespa.hosted.provision.node.Status; @@ -218,25 +216,6 @@ public class SerializationTest { } @Test - public void serialize_docker_image() { - Node node = createNode(); - - Version version = new DockerImage("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0").tagAsVersion(); - ClusterMembership clusterMembership = ClusterMembership.from("content/myId/0", version); - - Node nodeWithAllocation = node.with( - new Allocation(ApplicationId.from(TenantName.from("myTenant"), - ApplicationName.from("myApplication"), - InstanceName.from("myInstance")), - clusterMembership, - new Generation(0, 0), - false)); - - Node deserializedNode = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(nodeWithAllocation)); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", deserializedNode.allocation().get().membership().cluster().dockerImage()); - } - - @Test public void serialize_parentHostname() { final String parentHostname = "parent.yahoo.com"; Node node = Node.create("myId", singleton("127.0.0.1"), Collections.emptySet(), "myHostname", Optional.of(parentHostname), nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant); @@ -296,7 +275,7 @@ public class SerializationTest { " },\n" + " \"restartGeneration\": 0,\n" + " \"currentRestartGeneration\": 0,\n" + - " \"wantedDockerImage\":\"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0\",\n" + + " \"wantedDockerImage\":\"foo:6.42.0\",\n" + " \"wantedVespaVersion\":\"6.42.0\",\n" + " \"rebootGeneration\": 1,\n" + " \"currentRebootGeneration\": 0,\n" + @@ -354,22 +333,6 @@ public class SerializationTest { "}"; Node node = nodeSerializer.fromJson(State.active, Utf8.toBytes(nodeWithWantedVespaVersion)); assertEquals("6.42.2", node.allocation().get().membership().cluster().vespaVersion().toString()); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.2", node.allocation().get().membership().cluster().dockerImage()); - } - - @Test - public void docker_image_is_derived_from_vespa_version() throws Exception { - String nodeData = - "{\n" + - " \"type\" : \"tenant\",\n" + - " \"flavor\" : \"large\",\n" + - " \"openStackId\" : \"myId\",\n" + - " \"hostname\" : \"myHostname\",\n" + - " \"ipAddresses\" : [\"127.0.0.1\"],\n" + - " \"vespaVersion\": \"6.42.1\"\n" + - "}"; - Node node = nodeSerializer.fromJson(State.active, Utf8.toBytes(nodeData)); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1", node.status().dockerImage().get()); } private byte[] createNodeJson(String hostname, String... ipAddress) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index 1bfe533b6c0..58d2507f9b8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -5,6 +5,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.Flavor; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.HostSpec; @@ -76,7 +77,8 @@ public class ProvisioningTester implements AutoCloseable { this.nodeFlavors = new NodeFlavors(config); this.clock = new ManualClock(); this.curator = curator; - this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, nameResolver); + this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, nameResolver, + new DockerImage("docker-registry.domain.tld:8080/dist/vespa")); this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, clock, (x,y) -> allocationSnapshots.add(new AllocationSnapshot(new NodeList(x), "Provision tester", y))); this.capacityPolicies = new CapacityPolicies(zone, nodeFlavors); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json index 3fbe1d900c5..5879a612791 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node1.json @@ -26,7 +26,7 @@ }, "restartGeneration": 0, "currentRestartGeneration": 0, - "wantedDockerImage":"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage":"docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion":"6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json index f6368c58196..55342de4c9e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node10.json @@ -27,14 +27,14 @@ }, "restartGeneration": 0, "currentRestartGeneration": 0, - "wantedDockerImage":"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage":"docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion": "6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, "vespaVersion": "5.104.142", - "hostedVersion": "2.1.2408", - "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:5.104.142", - "convergedStateVersion": "5.104.142-2.1.2408", + "currentDockerImage": "docker-registry.domain.tld:8080/dist/vespa:5.104.142", + "hostedVersion": "5.104.142", + "convergedStateVersion": "5.104.142", "failCount": 0, "hardwareFailure" : false, "wantToRetire" : false, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json index faaff6337db..2e599fe6add 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node2.json @@ -26,7 +26,7 @@ }, "restartGeneration": 0, "currentRestartGeneration": 0, - "wantedDockerImage":"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage":"docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion":"6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json index dd9213b9110..955d469a3f8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node3.json @@ -24,7 +24,7 @@ }, "restartGeneration": 0, "currentRestartGeneration": 0, - "wantedDockerImage":"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage":"docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion":"6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json index cc907a2280c..d0103b79b7b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4-after-changes.json @@ -27,14 +27,14 @@ }, "restartGeneration": 0, "currentRestartGeneration": 1, - "wantedDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage": "docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion": "6.42.0", "rebootGeneration": 2, "currentRebootGeneration": 1, "vespaVersion": "6.43.0", - "hostedVersion": "2.1.2408", - "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:6.43.0", - "convergedStateVersion": "5.104.142-2.1.2408", + "currentDockerImage": "docker-registry.domain.tld:8080/dist/vespa:6.43.0", + "hostedVersion": "6.43.0", + "convergedStateVersion": "6.43.0", "failCount": 0, "hardwareFailure": true, "hardwareFailureType": "memory_mcelog", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json index e416634bbe5..06e0bcac683 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node4.json @@ -27,12 +27,14 @@ }, "restartGeneration": 0, "currentRestartGeneration": 0, - "wantedDockerImage":"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage":"docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion": "6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, "vespaVersion": "6.41.0", - "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:6.41.0", + "currentDockerImage": "docker-registry.domain.tld:8080/dist/vespa:6.41.0", + "hostedVersion": "6.41.0", + "convergedStateVersion": "6.41.0", "failCount": 0, "hardwareFailure" : false, "wantToRetire" : false, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json index f8e18a08ae6..bd13e305e1d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node5.json @@ -16,7 +16,9 @@ "rebootGeneration": 1, "currentRebootGeneration": 0, "vespaVersion": "1.2.3", - "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:1.2.3", + "currentDockerImage": "docker-registry.domain.tld:8080/dist/vespa:1.2.3", + "hostedVersion": "1.2.3", + "convergedStateVersion": "1.2.3", "failCount": 1, "hardwareFailure" : false, "wantToRetire" : false, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json index 6910c132206..a78ece62469 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node6.json @@ -26,7 +26,7 @@ }, "restartGeneration": 0, "currentRestartGeneration": 0, - "wantedDockerImage":"docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", + "wantedDockerImage":"docker-registry.domain.tld:8080/dist/vespa:6.42.0", "wantedVespaVersion":"6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, |