diff options
author | Martin Polden <martin.polden@gmail.com> | 2017-04-04 12:41:32 +0200 |
---|---|---|
committer | Martin Polden <martin.polden@gmail.com> | 2017-04-04 13:02:47 +0200 |
commit | 2132e0bf56e09016f6e2ae020ab42352e56072cc (patch) | |
tree | 811225d2d1eaa67f81b6aced43ea6d54846e9372 /node-repository | |
parent | 9b43f1a3707664da3ab78e4fb4692ce6e924e2cf (diff) |
Stop persisting current Docker image
Diffstat (limited to 'node-repository')
9 files changed, 47 insertions, 25 deletions
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 37c80c574d8..1d8a1356836 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,6 +2,7 @@ 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; @@ -16,9 +17,8 @@ public class Status { private final Generation reboot; private final Optional<Version> vespaVersion; - private final Optional<Version> hostedVersion; - private final Optional<String> stateVersion; - private final Optional<String> dockerImage; + 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; @@ -41,7 +41,6 @@ public class Status { Optional<Version> vespaVersion, Optional<Version> hostedVersion, Optional<String> stateVersion, - Optional<String> dockerImage, int failCount, Optional<HardwareFailureType> hardwareFailure, boolean wantToRetire) { @@ -49,32 +48,31 @@ public class Status { this.vespaVersion = vespaVersion; this.hostedVersion = hostedVersion; this.stateVersion = stateVersion; - this.dockerImage = dockerImage; this.failCount = failCount; this.hardwareFailure = hardwareFailure; this.wantToRetire = wantToRetire; } /** Returns a copy of this with the reboot generation changed */ - public Status withReboot(Generation reboot) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, dockerImage, failCount, hardwareFailure, wantToRetire); } + public Status withReboot(Generation reboot) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire); } /** 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, dockerImage, failCount, hardwareFailure, wantToRetire); } + public Status withVespaVersion(Version version) { return new Status(reboot, Optional.of(version), hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire); } /** 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, dockerImage, failCount, hardwareFailure, wantToRetire); } + public Status withHostedVersion(Version version) { return new Status(reboot, vespaVersion, Optional.of(version), stateVersion, failCount, hardwareFailure, wantToRetire); } /** Returns the hosted version installed on the node, if known */ public Optional<Version> hostedVersion() { return hostedVersion; } /** Returns a copy of this with the state version changed */ - public Status withStateVersion(String version) { return new Status(reboot, vespaVersion, hostedVersion, Optional.of(version), dockerImage, failCount, hardwareFailure, wantToRetire); } + public Status withStateVersion(String version) { return new Status(reboot, vespaVersion, hostedVersion, Optional.of(version), failCount, hardwareFailure, wantToRetire); } /** * Returns the state version the node last successfully converged with. @@ -85,28 +83,34 @@ public class Status { public Optional<String> stateVersion() { return stateVersion; } /** Returns a copy of this with the docker image changed */ - public Status withDockerImage(String dockerImage) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, Optional.of(dockerImage), failCount, hardwareFailure, wantToRetire); } + 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); + } /** Returns the current docker image the node is running, if known. */ - public Optional<String> dockerImage() { return dockerImage; } + public Optional<String> dockerImage() { return vespaVersion.map(DockerImage.defaultImage::withTag).map(DockerImage::toString); } - public Status withIncreasedFailCount() { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, dockerImage, failCount + 1, hardwareFailure, wantToRetire); } + public Status withIncreasedFailCount() { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount + 1, hardwareFailure, wantToRetire); } - public Status withDecreasedFailCount() { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, dockerImage, failCount - 1, hardwareFailure, wantToRetire); } + public Status withDecreasedFailCount() { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount - 1, hardwareFailure, wantToRetire); } - public Status setFailCount(Integer value) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, dockerImage, value, hardwareFailure, wantToRetire); } + public Status setFailCount(Integer value) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, value, hardwareFailure, wantToRetire); } /** 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, dockerImage, failCount, hardwareFailure, wantToRetire); } + public Status withHardwareFailure(Optional<HardwareFailureType> hardwareFailure) { return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire); } /** 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, dockerImage, failCount, hardwareFailure, wantToRetire); + return new Status(reboot, vespaVersion, hostedVersion, stateVersion, failCount, hardwareFailure, wantToRetire); } /** @@ -118,6 +122,6 @@ public class Status { } /** Returns the initial status of a newly provisioned node */ - public static Status initial() { return new Status(Generation.inital(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), 0, Optional.empty(), false); } + public static Status initial() { return new Status(Generation.inital(), Optional.empty(), Optional.empty(), Optional.empty(), 0, Optional.empty(), 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 090c4e6bfef..5e9d1ddd6a1 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 @@ -109,7 +109,6 @@ public class NodeSerializer { 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)); - node.status().dockerImage().ifPresent(image -> object.setString(dockerImageKey, image)); object.setLong(failCountKey, node.status().failCount()); node.status().hardwareFailure().ifPresent(failure -> object.setString(hardwareFailureKey, toString(failure))); object.setBool(wantToRetireKey, node.status().wantToRetire()); @@ -169,7 +168,6 @@ public class NodeSerializer { softwareVersionFromSlime(object.field(vespaVersionKey)), softwareVersionFromSlime(object.field(hostedVersionKey)), optionalString(object.field(stateVersionKey)), - optionalString(object.field(dockerImageKey)), (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/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index ef9639ed460..2b5d8cb1708 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 @@ -71,11 +71,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")); + node4 = node4.with(node4.status().withDockerImage("image-12: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").withVespaVersion(new Version("1.2.3")))); + nodes.add(node5.with(node5.status().withDockerImage("image-123:1.2.3").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)); 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 940715db8b4..97610e17b45 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 @@ -299,6 +299,21 @@ public class SerializationTest { assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.2", node.allocation().get().membership().cluster().dockerImage().get()); } + @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) { String ipAddressJsonPart = ""; if (ipAddress.length > 0) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index 1ef453eaecf..fbc0ea96fb6 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -170,6 +170,9 @@ public class RestApiTest { assertResponse(new Request("http://localhost:8080/nodes/v2/node/host4.yahoo.com", Utf8.toBytes("{\"wantToRetire\": true}"), Request.Method.PATCH), "{\"message\":\"Updated host4.yahoo.com\"}"); + assertResponse(new Request("http://localhost:8080/nodes/v2/node/host4.yahoo.com", + Utf8.toBytes("{\"currentDockerImage\": \"ignored-image-name:4443/vespa/ci:6.43.0\"}"), Request.Method.PATCH), + "{\"message\":\"Updated host4.yahoo.com\"}"); assertFile(new Request("http://localhost:8080/nodes/v2/node/host4.yahoo.com"), "node4-after-changes.json"); } 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 bfa88681879..9d37e94e623 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 @@ -33,6 +33,7 @@ "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", "failCount": 0, "hardwareFailure" : false, 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 281a87ea372..6e0ac0c9e2b 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 @@ -31,9 +31,9 @@ "wantedVespaVersion": "6.42.0", "rebootGeneration": 2, "currentRebootGeneration": 1, - "vespaVersion": "5.104.142", + "vespaVersion": "6.43.0", "hostedVersion": "2.1.2408", - "currentDockerImage": "image-12", + "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:6.43.0", "convergedStateVersion": "5.104.142-2.1.2408", "failCount": 0, "hardwareFailure": true, 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 04db01226da..5278f0dd6bf 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 @@ -31,7 +31,8 @@ "wantedVespaVersion": "6.42.0", "rebootGeneration": 1, "currentRebootGeneration": 0, - "currentDockerImage":"image-12", + "vespaVersion": "6.41.0", + "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci: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 082c79f8a6d..6ec3a7562ac 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,7 @@ "rebootGeneration": 1, "currentRebootGeneration": 0, "vespaVersion": "1.2.3", - "currentDockerImage":"image-123", + "currentDockerImage": "docker-registry.ops.yahoo.com:4443/vespa/ci:1.2.3", "failCount": 1, "hardwareFailure" : false, "wantToRetire" : false, |