summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorMartin Polden <martin.polden@gmail.com>2017-04-03 15:47:22 +0200
committerMartin Polden <martin.polden@gmail.com>2017-04-04 08:33:18 +0200
commit0600de82408eba591a1ee35a69d5acfe5c682794 (patch)
tree8862d2676e6b0b156ce5195b7113b71132875eb9 /config-provisioning
parent7f4eb92c847daea4148624407ea162268a7b8cdb (diff)
Persist wanted Vespa version in node-repository
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java28
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java43
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java39
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/ClusterMembershipTest.java14
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java8
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) {