summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-03-02 12:29:46 +0100
committerMartin Polden <mpolden@mpolden.no>2020-03-02 13:09:05 +0100
commit8dc031111d0ec7ff77273a3a21e0f23c7d4aceca (patch)
tree38855a8dfc04fd1203efaf5f979973f1c3c733ea /config-provisioning
parent9ac4f3d18e1dbb11678b8d61fa50c9ad1cdf61d2 (diff)
Add combined ID to ClusterSpec
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/abi-spec.json3
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/ClusterMembership.java14
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java31
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/ClusterMembershipTest.java25
4 files changed, 59 insertions, 14 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json
index 9a091f1161c..fa7773a54f1 100644
--- a/config-provisioning/abi-spec.json
+++ b/config-provisioning/abi-spec.json
@@ -271,11 +271,14 @@
"public com.yahoo.config.provision.ClusterSpec$Id id()",
"public com.yahoo.component.Version vespaVersion()",
"public java.util.Optional group()",
+ "public java.util.Optional combinedId()",
"public boolean isExclusive()",
"public com.yahoo.config.provision.ClusterSpec with(java.util.Optional)",
"public com.yahoo.config.provision.ClusterSpec exclusive(boolean)",
"public static com.yahoo.config.provision.ClusterSpec request(com.yahoo.config.provision.ClusterSpec$Type, com.yahoo.config.provision.ClusterSpec$Id, com.yahoo.component.Version, boolean)",
+ "public static com.yahoo.config.provision.ClusterSpec request(com.yahoo.config.provision.ClusterSpec$Type, com.yahoo.config.provision.ClusterSpec$Id, com.yahoo.component.Version, boolean, java.util.Optional)",
"public static com.yahoo.config.provision.ClusterSpec from(com.yahoo.config.provision.ClusterSpec$Type, com.yahoo.config.provision.ClusterSpec$Id, com.yahoo.config.provision.ClusterSpec$Group, com.yahoo.component.Version, boolean)",
+ "public static com.yahoo.config.provision.ClusterSpec from(com.yahoo.config.provision.ClusterSpec$Type, com.yahoo.config.provision.ClusterSpec$Id, com.yahoo.config.provision.ClusterSpec$Group, com.yahoo.component.Version, boolean, java.util.Optional)",
"public java.lang.String toString()",
"public int hashCode()",
"public boolean equals(java.lang.Object)",
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 f041823bf04..0fb78b59aaf 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
@@ -3,9 +3,11 @@ package com.yahoo.config.provision;
import com.yahoo.component.Version;
+import java.util.Optional;
+
/**
* A node's membership in a cluster. This is a value object.
- * The format is "clusterType/clusterId/groupId/index[/exclusive][/retired]"
+ * The format is "clusterType/clusterId/groupId/index[/exclusive][/retired][/combinedId]"
*
* @author bratseth
*/
@@ -22,21 +24,24 @@ public class ClusterMembership {
String[] components = stringValue.split("/");
if (components.length < 4)
throw new RuntimeException("Could not parse '" + stringValue + "' to a cluster membership. " +
- "Expected 'clusterType/clusterId/groupId/index[/retired][/exclusive]'");
+ "Expected 'clusterType/clusterId/groupId/index[/retired][/exclusive][/combinedId]'");
boolean exclusive = false;
+ var combinedId = Optional.<String>empty();
if (components.length > 4) {
for (int i = 4; i < components.length; i++) {
String component = components[i];
switch (component) {
case "exclusive": exclusive = true; break;
case "retired": retired = true; break;
+ default: combinedId = Optional.of(component); break;
}
}
}
this.cluster = ClusterSpec.from(ClusterSpec.Type.valueOf(components[0]), ClusterSpec.Id.from(components[1]),
- ClusterSpec.Group.from(Integer.valueOf(components[2])), vespaVersion, exclusive);
+ ClusterSpec.Group.from(Integer.parseInt(components[2])), vespaVersion,
+ exclusive, combinedId.map(ClusterSpec.Id::from));
this.index = Integer.parseInt(components[3]);
this.stringValue = toStringValue();
}
@@ -54,7 +59,8 @@ public class ClusterMembership {
(cluster.group().isPresent() ? "/" + cluster.group().get().index() : "") +
"/" + index +
( cluster.isExclusive() ? "/exclusive" : "") +
- ( retired ? "/retired" : "");
+ ( retired ? "/retired" : "") +
+ ( cluster.combinedId().isPresent() ? "/" + cluster.combinedId().get().value() : "");
}
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 5aed5d8e2e7..e1a28e3f8d7 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
@@ -21,13 +21,19 @@ public final class ClusterSpec {
private final Optional<Group> groupId;
private final Version vespaVersion;
private boolean exclusive;
+ private final Optional<Id> combinedId;
- private ClusterSpec(Type type, Id id, Optional<Group> groupId, Version vespaVersion, boolean exclusive) {
+ private ClusterSpec(Type type, Id id, Optional<Group> groupId, Version vespaVersion, boolean exclusive, Optional<Id> combinedId) {
this.type = type;
this.id = id;
this.groupId = groupId;
this.vespaVersion = vespaVersion;
this.exclusive = exclusive;
+ // TODO(mpolden): Require combinedId to always be present for type combined after April 2020
+ if (type != Type.combined && combinedId.isPresent()) {
+ throw new IllegalArgumentException("combinedId must be empty for cluster of type " + type);
+ }
+ this.combinedId = combinedId;
}
/** Returns the cluster type */
@@ -42,6 +48,11 @@ public final class ClusterSpec {
/** Returns the group within the cluster this specifies, or empty to specify the whole cluster */
public Optional<Group> group() { return groupId; }
+ /** Returns the ID of the container cluster that is combined with this. This is only present for combined clusters */
+ public Optional<Id> combinedId() {
+ return combinedId;
+ }
+
/**
* Returns whether the physical hosts running the nodes of this application can
* also run nodes of other applications. Using exclusive nodes for containers increases security
@@ -50,19 +61,29 @@ public final class ClusterSpec {
public boolean isExclusive() { return exclusive; }
public ClusterSpec with(Optional<Group> newGroup) {
- return new ClusterSpec(type, id, newGroup, vespaVersion, exclusive);
+ return new ClusterSpec(type, id, newGroup, vespaVersion, exclusive, combinedId);
}
public ClusterSpec exclusive(boolean exclusive) {
- return new ClusterSpec(type, id, groupId, vespaVersion, exclusive);
+ return new ClusterSpec(type, id, groupId, vespaVersion, exclusive, combinedId);
}
+ // TODO(mpolden): Remove after April 2020
public static ClusterSpec request(Type type, Id id, Version vespaVersion, boolean exclusive) {
- return new ClusterSpec(type, id, Optional.empty(), vespaVersion, exclusive);
+ return request(type, id, vespaVersion, exclusive, Optional.empty());
}
+ public static ClusterSpec request(Type type, Id id, Version vespaVersion, boolean exclusive, Optional<Id> combinedId) {
+ return new ClusterSpec(type, id, Optional.empty(), vespaVersion, exclusive, combinedId);
+ }
+
+ // TODO(mpolden): Remove after April 2020
public static ClusterSpec from(Type type, Id id, Group groupId, Version vespaVersion, boolean exclusive) {
- return new ClusterSpec(type, id, Optional.of(groupId), vespaVersion, exclusive);
+ return new ClusterSpec(type, id, Optional.of(groupId), vespaVersion, exclusive, Optional.empty());
+ }
+
+ public static ClusterSpec from(Type type, Id id, Group groupId, Version vespaVersion, boolean exclusive, Optional<Id> combinedId) {
+ return new ClusterSpec(type, id, Optional.of(groupId), vespaVersion, exclusive, combinedId);
}
@Override
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 3a36afcfdce..aa22747c165 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
@@ -5,6 +5,8 @@ import com.yahoo.component.Version;
import com.yahoo.component.Vtag;
import org.junit.Test;
+import java.util.Optional;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -16,28 +18,41 @@ public class ClusterMembershipTest {
@Test
public void testContainerServiceInstance() {
- ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1"), Version.fromString("6.42"), false);
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1"), Version.fromString("6.42"), false, Optional.empty());
assertContainerService(ClusterMembership.from(cluster, 3));
}
@Test
- public void testContainerInstanceWithOptionalParts() {
+ public void testSerializationWithOptionalParts() {
{
ClusterMembership instance = ClusterMembership.from("container/id1/4/37/exclusive/retired", Vtag.currentVersion);
+ ClusterMembership serialized = ClusterMembership.from(instance.stringValue(), Vtag.currentVersion);
+ assertEquals(instance, serialized);
assertTrue(instance.retired());
assertTrue(instance.cluster().isExclusive());
+ assertFalse(instance.cluster().combinedId().isPresent());
}
-
{
ClusterMembership instance = ClusterMembership.from("container/id1/4/37/exclusive", Vtag.currentVersion);
+ ClusterMembership serialized = ClusterMembership.from(instance.stringValue(), Vtag.currentVersion);
+ assertEquals(instance, serialized);
+ assertFalse(instance.retired());
+ assertTrue(instance.cluster().isExclusive());
+ assertFalse(instance.cluster().combinedId().isPresent());
+ }
+ {
+ ClusterMembership instance = ClusterMembership.from("combined/id1/4/37/exclusive/containerId1", Vtag.currentVersion);
+ ClusterMembership serialized = ClusterMembership.from(instance.stringValue(), Vtag.currentVersion);
+ assertEquals(instance, serialized);
assertFalse(instance.retired());
assertTrue(instance.cluster().isExclusive());
+ assertEquals(ClusterSpec.Id.from("containerId1"), instance.cluster().combinedId().get());
}
}
@Test
public void testServiceInstance() {
- ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Version.fromString("6.42"), false);
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Version.fromString("6.42"), false, Optional.empty());
assertContentService(ClusterMembership.from(cluster, 37));
}
@@ -55,7 +70,7 @@ public class ClusterMembershipTest {
@Test
public void testServiceInstanceWithRetire() {
- ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Version.fromString("6.42"), false);
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("id1"), Version.fromString("6.42"), false, Optional.empty());
assertContentServiceWithRetire(ClusterMembership.retiredFrom(cluster, 37));
}