diff options
author | Martin Polden <martin.polden@gmail.com> | 2017-04-03 15:47:22 +0200 |
---|---|---|
committer | Martin Polden <martin.polden@gmail.com> | 2017-04-04 08:33:18 +0200 |
commit | 0600de82408eba591a1ee35a69d5acfe5c682794 (patch) | |
tree | 8862d2676e6b0b156ce5195b7113b71132875eb9 /config-provisioning | |
parent | 7f4eb92c847daea4148624407ea162268a7b8cdb (diff) |
Persist wanted Vespa version in node-repository
Diffstat (limited to 'config-provisioning')
5 files changed, 94 insertions, 38 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java index d8ad7295b1c..ff7ff0b4971 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java @@ -1,6 +1,8 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; +import com.yahoo.component.Version; + import java.util.Optional; /** @@ -18,7 +20,7 @@ public class ClusterMembership { protected ClusterMembership() {} - private ClusterMembership(String stringValue, Optional<String> dockerImage) { + private ClusterMembership(String stringValue, Optional<Version> vespaVersion) { String restValue; if (stringValue.endsWith("/retired")) { retired = true; @@ -32,9 +34,9 @@ public class ClusterMembership { String[] components = restValue.split("/"); if ( components.length == 3) // Aug 2016: This should never happen any more - initWithoutGroup(components, dockerImage); + initWithoutGroup(components, vespaVersion); else if (components.length == 4) - initWithGroup(components, dockerImage); + initWithGroup(components, vespaVersion); else throw new RuntimeException("Could not parse '" + stringValue + "' to a cluster membership. " + "Expected 'id/type.index[/group]'"); @@ -49,16 +51,16 @@ public class ClusterMembership { this.stringValue = toStringValue(); } - private void initWithoutGroup(String[] components, Optional<String> dockerImage) { - this.cluster = ClusterSpec.request(ClusterSpec.Type.valueOf(components[0]), - ClusterSpec.Id.from(components[1]), - dockerImage); + private void initWithoutGroup(String[] components, Optional<Version> vespaVersion) { + this.cluster = ClusterSpec.requestVersion(ClusterSpec.Type.valueOf(components[0]), + ClusterSpec.Id.from(components[1]), + vespaVersion); this.index = Integer.parseInt(components[2]); } - private void initWithGroup(String[] components, Optional<String> dockerImage) { + private void initWithGroup(String[] components, Optional<Version> vespaVersion) { this.cluster = ClusterSpec.from(ClusterSpec.Type.valueOf(components[0]), ClusterSpec.Id.from(components[1]), - ClusterSpec.Group.from(Integer.valueOf(components[2])), dockerImage); + ClusterSpec.Group.from(Integer.valueOf(components[2])), vespaVersion); this.index = Integer.parseInt(components[3]); } @@ -110,8 +112,14 @@ public class ClusterMembership { @Override public String toString() { return stringValue(); } + @Deprecated + // TODO: April 2017 - Remove this when no version older than 6.92 is in production public static ClusterMembership from(String stringValue, Optional<String> dockerImage) { - return new ClusterMembership(stringValue, dockerImage); + return fromVersion(stringValue, dockerImage.map(DockerImage::new).map(DockerImage::tagAsVersion)); + } + + public static ClusterMembership fromVersion(String stringValue, Optional<Version> vespaVersion) { + return new ClusterMembership(stringValue, vespaVersion); } public static ClusterMembership from(ClusterSpec cluster, int index) { 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 79d4a5afc74..25c83d288eb 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 @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; +import com.yahoo.component.Version; import java.util.Objects; import java.util.Optional; @@ -18,13 +19,13 @@ public final class ClusterSpec { /** The group id of these hosts, or empty if this is represents a request for hosts */ private final Optional<Group> groupId; - private final Optional<String> dockerImage; + private final Optional<Version> vespaVersion; - private ClusterSpec(Type type, Id id, Optional<Group> groupId, Optional<String> dockerImage) { + private ClusterSpec(Type type, Id id, Optional<Group> groupId, Optional<Version> vespaVersion) { this.type = type; this.id = id; this.groupId = groupId; - this.dockerImage = dockerImage; + this.vespaVersion = vespaVersion; } /** Returns the cluster type */ @@ -33,27 +34,39 @@ public final class ClusterSpec { /** Returns the cluster id */ public Id id() { return id; } - public Optional<String> dockerImage() { return dockerImage; } + public Optional<Version> vespaVersion() { return vespaVersion; } + + public Optional<String> dockerImage() { + return vespaVersion.map(DockerImage.defaultImage::withTag).map(DockerImage::toString); + } /** Returns the group within the cluster this specifies, or empty to specify the whole cluster */ public Optional<Group> group() { return groupId; } - public ClusterSpec changeGroup(Optional<Group> newGroup) { return new ClusterSpec(type, id, newGroup, dockerImage); } + public ClusterSpec changeGroup(Optional<Group> newGroup) { return new ClusterSpec(type, id, newGroup, vespaVersion); } - /** Create a specification <b>specifying</b> an existing cluster group having these attributes */ - public static ClusterSpec from(Type type, Id id, Group groupId, Optional<String> dockerImage) { - return new ClusterSpec(type, id, Optional.of(groupId), dockerImage); + /** Create a specification <b>requesting</b> a cluster with these attributes */ + @Deprecated + // TODO: April 2017 - Remove this we no longer have old config-models using it + public static ClusterSpec request(Type type, Id id, Optional<String> dockerImage) { + return requestVersion(type, id, dockerImage.map(DockerImage::new).map(DockerImage::tagAsVersion)); } /** Create a specification <b>requesting</b> a cluster with these attributes */ - public static ClusterSpec request(Type type, Id id, Optional<String> dockerImage) { - return new ClusterSpec(type, id, Optional.empty(), dockerImage); + public static ClusterSpec requestVersion(Type type, Id id, Optional<Version> vespaVersion) { + return new ClusterSpec(type, id, Optional.empty(), vespaVersion); + } + + /** Create a specification <b>specifying</b> an existing cluster group having these attributes */ + public static ClusterSpec from(Type type, Id id, Group groupId, Optional<Version> vespaVersion) { + return new ClusterSpec(type, id, Optional.of(groupId), vespaVersion); } @Override public String toString() { - return String.join(" ", type.toString(), id.toString(), - groupId.map(Group::toString).orElse(""), dockerImage.orElse("")); + return String.join(" ", type.toString(), id.toString(), + groupId.map(Group::toString).orElse(""), + vespaVersion.orElse(Version.emptyVersion).toString()); } @Override @@ -67,12 +80,12 @@ public final class ClusterSpec { if ( ! other.type.equals(this.type)) return false; if ( ! other.id.equals(this.id)) return false; if ( ! other.groupId.equals(this.groupId)) return false; - if ( ! other.dockerImage.equals(this.dockerImage)) return false; + if ( ! other.vespaVersion.equals(this.vespaVersion)) return false; return true; } - /** Returns whether this is equal, disregarding the group value and wanted docker image */ - public boolean equalsIgnoringGroupAndDockerImage(Object o) { + /** Returns whether this is equal, disregarding the group value and wanted Vespa version */ + public boolean equalsIgnoringGroupAndVespaVersion(Object o) { if (o == this) return true; if ( ! (o instanceof ClusterSpec)) return false; ClusterSpec other = (ClusterSpec)o; 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 new file mode 100644 index 00000000000..2c6c9d82419 --- /dev/null +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java @@ -0,0 +1,39 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config.provision; + +import com.yahoo.component.Version; + +/** + * A Docker image. + * + * @author mpolden + */ +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) { + this.name = name; + } + + /** Get Docker image tag as version */ + public Version tagAsVersion() { + String[] parts = toString().split(":"); + if (parts.length < 2) { + throw new IllegalArgumentException("Could not parse tag from Docker image '" + toString() + "'"); + } + return Version.fromString(parts[parts.length - 1]); + } + + /** Returns the Docker image tagged with the given version */ + public DockerImage withTag(Version version) { + return new DockerImage(name + ":" + version.toFullString()); + } + + @Override + public String toString() { + return name; + } +} diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterMembershipTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterMembershipTest.java index 7cf0abecc2d..56da6dbcaa7 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterMembershipTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ClusterMembershipTest.java @@ -2,12 +2,12 @@ package com.yahoo.config.provision; import org.junit.Test; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; import java.util.Optional; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; /** * @author bratseth @@ -16,24 +16,24 @@ public class ClusterMembershipTest { @Test public void testContainerServiceInstance() { - ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1"), Optional.empty()); + ClusterSpec cluster = ClusterSpec.requestVersion(ClusterSpec.Type.container, ClusterSpec.Id.from("id1"), Optional.empty()); assertContainerService(ClusterMembership.from(cluster, 3)); } @Test public void testContainerServiceInstanceFromString() { - assertContainerService(ClusterMembership.from("container/id1/3", Optional.empty())); + assertContainerService(ClusterMembership.fromVersion("container/id1/3", Optional.empty())); } @Test public void testServiceInstance() { - ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Optional.empty()); + ClusterSpec cluster = ClusterSpec.requestVersion(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Optional.empty()); assertContentService(ClusterMembership.from(cluster, 37)); } @Test public void testServiceInstanceFromString() { - assertContentService(ClusterMembership.from("content/id1/37", Optional.empty())); + assertContentService(ClusterMembership.fromVersion("content/id1/37", Optional.empty())); } @Test @@ -50,7 +50,7 @@ public class ClusterMembershipTest { @Test public void testServiceInstanceWithRetire() { - ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Optional.empty()); + ClusterSpec cluster = ClusterSpec.requestVersion(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Optional.empty()); assertContentServiceWithRetire(ClusterMembership.retiredFrom(cluster, 37)); } 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 b4239f2b3bd..52b4f6853b8 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 @@ -10,10 +10,6 @@ import java.util.Optional; import java.util.Set; import static org.junit.Assert.assertEquals; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; /** @@ -25,7 +21,7 @@ public class ProvisionInfoTest { private final HostSpec h1 = new HostSpec("host1", Optional.empty()); private final HostSpec h2 = new HostSpec("host2", Optional.empty()); private final HostSpec h3 = new HostSpec("host3", Optional.of(ClusterMembership.from("container/test/0", Optional.empty()))); - private final HostSpec h4 = new HostSpec("host4", Optional.of(ClusterMembership.from("container/test/1", Optional.of("dockerImg")))); + private final HostSpec h4 = new HostSpec("host4", Optional.of(ClusterMembership.from("container/test/1", Optional.of("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1")))); @Test public void testProvisionInfoSerialization() throws IOException { @@ -61,7 +57,7 @@ public class ProvisionInfoTest { assertTrue(serializedInfo.getHosts().contains(h4)); assertTrue(!getHost(h1.hostname(), serializedInfo.getHosts()).membership().isPresent()); assertEquals("container/test/0", getHost(h3.hostname(), serializedInfo.getHosts()).membership().get().stringValue()); - assertEquals("dockerImg", getHost(h4.hostname(), serializedInfo.getHosts()).membership().get().cluster().dockerImage().get()); + assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1", getHost(h4.hostname(), serializedInfo.getHosts()).membership().get().cluster().dockerImage().get()); } private HostSpec getHost(String hostname, Set<HostSpec> hosts) { |