summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-08-28 09:33:13 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2017-08-28 09:33:13 +0200
commitfc2f74f461fe2a049f3c7c362f83b48c0d3ae68b (patch)
treef37c4837ee3bb13eb0d1a3d3f5f1bce9eb52d208 /config-provisioning
parentde0d1ef384f75c8c0fc08503d75cfcaa5e494a5a (diff)
Allocation consistency between model versions
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java16
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java55
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java16
3 files changed, 43 insertions, 44 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java b/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java
index 5d6b3fcaca4..a94660e142e 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java
@@ -5,11 +5,13 @@ import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Optional;
/**
* A specification of a host and its role.
- * The identity of a host is determined by its name.
+ * This is a value object: Immutable and the identity is determined by all the content.
+ * Host specs are ordered by host name.
*
* @author hmusum
*/
@@ -19,7 +21,7 @@ public class HostSpec implements Comparable<HostSpec> {
private final String hostname;
/** Aliases of this host */
- private final List<String> aliases;
+ private final ImmutableList<String> aliases;
/** The current membership role of this host in the cluster it belongs to */
private final Optional<ClusterMembership> membership;
@@ -70,14 +72,20 @@ public class HostSpec implements Comparable<HostSpec> {
@Override
public boolean equals(Object o) {
+ if (o == this) return true;
if ( ! (o instanceof HostSpec)) return false;
+
HostSpec other = (HostSpec) o;
- return this.hostname().equals(other.hostname());
+ if ( ! this.hostname.equals(other.hostname)) return false;
+ if ( ! this.aliases.equals(other.aliases)) return false;
+ if ( ! this.membership.equals(other.membership)) return false;
+ if ( ! this.flavor.equals(other.flavor)) return false;
+ return true;
}
@Override
public int hashCode() {
- return hostname.hashCode();
+ return Objects.hash(hostname, aliases, membership, flavor);
}
@Override
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java
index 8bef1f7c9b7..4506f52e085 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.provision;
+import com.google.common.collect.ImmutableSet;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
@@ -14,10 +15,12 @@ import java.util.Optional;
import java.util.Set;
/**
- * Information about hosts provisioned for an application, and (de)serialization of this information to/from JSON.
+ * The hosts allocated to an application (a better name would be "AllocatedHosts").
+ * This can be serialized to/from JSON.
+ * This is immutable.
*
- * @author lulf
- * @since 5.12
+ * @author Ulf Lilleengen
+ * @author bratseth
*/
public class ProvisionInfo {
@@ -28,10 +31,10 @@ public class ProvisionInfo {
private static final String hostSpecFlavor = "flavor";
private static final String hostSpecVespaVersion = "vespaVersion";
- private final Set<HostSpec> hosts = new LinkedHashSet<>();
+ private final ImmutableSet<HostSpec> hosts;
private ProvisionInfo(Set<HostSpec> hosts) {
- this.hosts.addAll(hosts);
+ this.hosts = ImmutableSet.copyOf(hosts);
}
public static ProvisionInfo withHosts(Set<HostSpec> hosts) {
@@ -40,13 +43,11 @@ public class ProvisionInfo {
private void toSlime(Cursor cursor) {
Cursor array = cursor.setArray(mappingKey);
- for (HostSpec host : hosts) {
- Cursor object = array.addObject();
- serializeHostSpec(object.setObject(hostSpecKey), host);
- }
+ for (HostSpec host : hosts)
+ toSlime(host, array.addObject().setObject(hostSpecKey));
}
- private void serializeHostSpec(Cursor cursor, HostSpec host) {
+ private void toSlime(HostSpec host, Cursor cursor) {
cursor.setString(hostSpecHostName, host.hostname());
if (host.membership().isPresent()) {
cursor.setString(hostSpecMembership, host.membership().get().stringValue());
@@ -56,9 +57,8 @@ public class ProvisionInfo {
cursor.setString(hostSpecFlavor, host.flavor().get().name());
}
- public Set<HostSpec> getHosts() {
- return Collections.unmodifiableSet(hosts);
- }
+ /** Returns the hosts of this allocation */
+ public Set<HostSpec> getHosts() { return hosts; }
private static ProvisionInfo fromSlime(Inspector inspector, Optional<NodeFlavors> nodeFlavors) {
Inspector array = inspector.field(mappingKey);
@@ -66,27 +66,27 @@ public class ProvisionInfo {
array.traverse(new ArrayTraverser() {
@Override
public void entry(int i, Inspector inspector) {
- hosts.add(deserializeHostSpec(inspector.field(hostSpecKey), nodeFlavors));
+ hosts.add(hostsFromSlime(inspector.field(hostSpecKey), nodeFlavors));
}
});
return new ProvisionInfo(hosts);
}
- private static HostSpec deserializeHostSpec(Inspector object, Optional<NodeFlavors> nodeFlavors) {
+ private static HostSpec hostsFromSlime(Inspector object, Optional<NodeFlavors> nodeFlavors) {
Optional<ClusterMembership> membership =
- object.field(hostSpecMembership).valid() ? Optional.of(readMembership(object)) : Optional.empty();
+ object.field(hostSpecMembership).valid() ? Optional.of(membershipFromSlime(object)) : Optional.empty();
Optional<Flavor> flavor =
- object.field(hostSpecFlavor).valid() ? readFlavor(object, nodeFlavors) : Optional.empty();
+ object.field(hostSpecFlavor).valid() ? flavorFromSlime(object, nodeFlavors) : Optional.empty();
return new HostSpec(object.field(hostSpecHostName).asString(),Collections.emptyList(), flavor, membership);
}
- private static ClusterMembership readMembership(Inspector object) {
+ private static ClusterMembership membershipFromSlime(Inspector object) {
return ClusterMembership.from(object.field(hostSpecMembership).asString(),
com.yahoo.component.Version.fromString(object.field(hostSpecVespaVersion).asString()));
}
- private static Optional<Flavor> readFlavor(Inspector object, Optional<NodeFlavors> nodeFlavors) {
+ private static Optional<Flavor> flavorFromSlime(Inspector object, Optional<NodeFlavors> nodeFlavors) {
return nodeFlavors.map(flavorMapper -> flavorMapper.getFlavor(object.field(hostSpecFlavor).asString()))
.orElse(Optional.empty());
}
@@ -100,12 +100,17 @@ public class ProvisionInfo {
public static ProvisionInfo fromJson(byte[] json, Optional<NodeFlavors> nodeFlavors) {
return fromSlime(SlimeUtils.jsonToSlime(json).get(), nodeFlavors);
}
-
- public ProvisionInfo merge(ProvisionInfo provisionInfo) {
- Set<HostSpec> mergedSet = new LinkedHashSet<>();
- mergedSet.addAll(this.hosts);
- mergedSet.addAll(provisionInfo.getHosts());
- return ProvisionInfo.withHosts(mergedSet);
+
+ @Override
+ public boolean equals(Object other) {
+ if (other == this) return true;
+ if ( ! (other instanceof ProvisionInfo)) return false;
+ return ((ProvisionInfo) other).hosts.equals(this.hosts);
+ }
+
+ @Override
+ public int hashCode() {
+ return hosts.hashCode();
}
}
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 4fa69eb77e0..435b6e3a28a 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
@@ -13,8 +13,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
- * @author lulf
- * @since 5.12
+ * @author Ulf Lilleengen
*/
public class ProvisionInfoTest {
@@ -32,19 +31,6 @@ public class ProvisionInfoTest {
assertProvisionInfo(info);
}
- @Test
- public void testProvisionInfoMerging() throws IOException {
- Set<HostSpec> hostsA = new LinkedHashSet<>(Collections.singleton(h1));
- Set<HostSpec> hostsB = new LinkedHashSet<>();
- hostsB.add(h2);
- hostsB.add(h3);
-
- ProvisionInfo infoA = ProvisionInfo.withHosts(hostsA);
- ProvisionInfo infoB = ProvisionInfo.withHosts(hostsB);
- assertProvisionInfo(infoA.merge(infoB));
- assertProvisionInfo(infoB.merge(infoA));
- }
-
private void assertProvisionInfo(ProvisionInfo info) throws IOException {
ProvisionInfo serializedInfo = ProvisionInfo.fromJson(info.toJson(), Optional.empty());
assertEquals(info.getHosts().size(), serializedInfo.getHosts().size());