diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-08-28 09:33:13 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-08-28 09:33:13 +0200 |
commit | fc2f74f461fe2a049f3c7c362f83b48c0d3ae68b (patch) | |
tree | f37c4837ee3bb13eb0d1a3d3f5f1bce9eb52d208 /config-provisioning | |
parent | de0d1ef384f75c8c0fc08503d75cfcaa5e494a5a (diff) |
Allocation consistency between model versions
Diffstat (limited to 'config-provisioning')
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()); |