diff options
author | Arne Juul <arnej@yahoo-inc.com> | 2019-02-06 14:37:43 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahoo-inc.com> | 2019-02-20 10:30:08 +0000 |
commit | 92599c56d62226a32e1e4df4321123c9691db73d (patch) | |
tree | 7e981d971920da1536443289d511198af265b432 /config-provisioning | |
parent | 85e394563c8b711a1a0307c8ac5953c1817f5629 (diff) |
add list of network port allocations
* add port suffixes to identify individual ports for a service
* stash port reservations from current config model
Diffstat (limited to 'config-provisioning')
5 files changed, 177 insertions, 2 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json index 5372e18e109..349d1d23e76 100644 --- a/config-provisioning/abi-spec.json +++ b/config-provisioning/abi-spec.json @@ -462,11 +462,13 @@ "public void <init>(java.lang.String, java.util.List, com.yahoo.config.provision.ClusterMembership)", "public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional)", "public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional, java.util.Optional)", + "public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional, java.util.Optional, java.util.Optional)", "public java.lang.String hostname()", "public java.util.List aliases()", "public java.util.Optional flavor()", "public java.util.Optional version()", "public java.util.Optional membership()", + "public java.util.Optional networkPorts()", "public java.lang.String toString()", "public boolean equals(java.lang.Object)", "public int hashCode()", @@ -497,6 +499,49 @@ ], "fields": [] }, + "com.yahoo.config.provision.NetworkPorts$Allocation": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>(int, java.lang.String, java.lang.String, java.lang.String)", + "public java.lang.String key()", + "public java.lang.String toString()" + ], + "fields": [ + "public final int port", + "public final java.lang.String serviceType", + "public final java.lang.String configId", + "public final java.lang.String portSuffix" + ] + }, + "com.yahoo.config.provision.NetworkPorts": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>(java.util.Collection)", + "public java.util.Collection allocations()" + ], + "fields": [] + }, + "com.yahoo.config.provision.NetworkPortsSerializer": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public" + ], + "methods": [ + "public void <init>()", + "public static void toSlime(com.yahoo.config.provision.NetworkPorts, com.yahoo.slime.Cursor)", + "public static java.util.Optional fromSlime(com.yahoo.slime.Inspector)" + ], + "fields": [] + }, "com.yahoo.config.provision.NodeFlavors": { "superClass": "java.lang.Object", "interfaces": [], diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java b/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java index 4c1798c549f..28c5d475e19 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java @@ -35,6 +35,7 @@ public class AllocatedHosts { /** Current version */ private static final String hostSpecCurrentVespaVersion = "currentVespaVersion"; + private static final String hostSpecNetworkPorts = "ports"; private final ImmutableSet<HostSpec> hosts; @@ -60,6 +61,7 @@ public class AllocatedHosts { }); host.flavor().ifPresent(flavor -> cursor.setString(hostSpecFlavor, flavor.name())); host.version().ifPresent(version -> cursor.setString(hostSpecCurrentVespaVersion, version.toFullString())); + host.networkPorts().ifPresent(ports -> NetworkPortsSerializer.toSlime(ports, cursor.setArray(hostSpecNetworkPorts))); } /** Returns the hosts of this allocation */ @@ -84,8 +86,9 @@ public class AllocatedHosts { object.field(hostSpecFlavor).valid() ? flavorFromSlime(object, nodeFlavors) : Optional.empty(); Optional<com.yahoo.component.Version> version = optionalString(object.field(hostSpecCurrentVespaVersion)).map(com.yahoo.component.Version::new); - - return new HostSpec(object.field(hostSpecHostName).asString(), Collections.emptyList(), flavor, membership, version); + Optional<NetworkPorts> networkPorts = + NetworkPortsSerializer.fromSlime(object.field(hostSpecNetworkPorts)); + return new HostSpec(object.field(hostSpecHostName).asString(), Collections.emptyList(), flavor, membership, version, networkPorts); } private static ClusterMembership membershipFromSlime(Inspector object) { 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 f0e8774759d..e5d4aadb988 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 @@ -29,6 +29,8 @@ public class HostSpec implements Comparable<HostSpec> { private final Optional<com.yahoo.component.Version> version; + private final Optional<NetworkPorts> networkPorts; + public HostSpec(String hostname, Optional<ClusterMembership> membership) { this(hostname, new ArrayList<>(), Optional.empty(), membership); } @@ -40,6 +42,7 @@ public class HostSpec implements Comparable<HostSpec> { public HostSpec(String hostname, List<String> aliases) { this(hostname, aliases, Optional.empty(), Optional.empty()); } + public HostSpec(String hostname, List<String> aliases, Flavor flavor) { this(hostname, aliases, Optional.of(flavor), Optional.empty()); } @@ -54,13 +57,21 @@ public class HostSpec implements Comparable<HostSpec> { public HostSpec(String hostname, List<String> aliases, Optional<Flavor> flavor, Optional<ClusterMembership> membership, Optional<com.yahoo.component.Version> version) { + this(hostname, aliases, flavor, membership, version, Optional.empty()); + } + + public HostSpec(String hostname, List<String> aliases, Optional<Flavor> flavor, + Optional<ClusterMembership> membership, Optional<com.yahoo.component.Version> version, + Optional<NetworkPorts> networkPorts) { if (hostname == null || hostname.isEmpty()) throw new IllegalArgumentException("Hostname must be specified"); Objects.requireNonNull(version, "Version cannot be null but can be empty"); + Objects.requireNonNull(networkPorts, "Network ports cannot be null but can be empty"); this.hostname = hostname; this.aliases = ImmutableList.copyOf(aliases); this.flavor = flavor; this.membership = membership; this.version = version; + this.networkPorts = networkPorts; } /** Returns the name identifying this host */ @@ -77,6 +88,9 @@ public class HostSpec implements Comparable<HostSpec> { /** Returns the membership of this host, or an empty value if not present */ public Optional<ClusterMembership> membership() { return membership; } + /** Returns the network port allocations on this host, or empty if not present */ + public Optional<NetworkPorts> networkPorts() { return networkPorts; } + @Override public String toString() { return hostname + diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPorts.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPorts.java new file mode 100644 index 00000000000..1c83c4314d9 --- /dev/null +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPorts.java @@ -0,0 +1,57 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.config.provision; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +/** + * Models an immutable list of network port allocations + * @author arnej + */ +public class NetworkPorts { + + public static class Allocation { + public final int port; + public final String serviceType; + public final String configId; + public final String portSuffix; + + public Allocation(int port, String serviceType, String configId, String portSuffix) { + this.port = port; + this.serviceType = serviceType; + this.configId = configId; + this.portSuffix = portSuffix; + } + public String key() { + StringBuilder buf = new StringBuilder(); + buf.append("t=").append(serviceType); + buf.append(" cfg=").append(configId); + buf.append(" suf=").append(portSuffix); + return buf.toString(); + } + public String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("[port=").append(port); + buf.append(" serviceType=").append(serviceType); + buf.append(" configId=").append(configId); + buf.append(" suffix=").append(portSuffix); + buf.append("]"); + return buf.toString(); + } + } + + private final List<Allocation> allocations; + + public NetworkPorts(Collection<Allocation> allocations) { + this.allocations = new ArrayList<>(allocations.size()); + this.allocations.addAll(allocations); + } + + public Collection<Allocation> allocations() { + return Collections.unmodifiableList(this.allocations); + } +} diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPortsSerializer.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPortsSerializer.java new file mode 100644 index 00000000000..d3af337e9be --- /dev/null +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPortsSerializer.java @@ -0,0 +1,56 @@ +// Copyright 2019 Oath 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.slime.ArrayTraverser; +import com.yahoo.slime.Cursor; +import com.yahoo.slime.Inspector; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +/** + * Serializes network port allocations to/from JSON. + * + * @author arnej + */ +public class NetworkPortsSerializer { + + // Network port fields + private static final String portNumberKey = "port"; + private static final String serviceTypeKey = "type"; + private static final String configIdKey = "cfg"; + private static final String portSuffixKey = "suf"; + + // ---------------- Serialization ---------------------------------------------------- + + public static void toSlime(NetworkPorts networkPorts, Cursor array) { + for (NetworkPorts.Allocation allocation : networkPorts.allocations()) { + Cursor object = array.addObject(); + object.setLong(portNumberKey, allocation.port); + object.setString(serviceTypeKey, allocation.serviceType); + object.setString(configIdKey, allocation.configId); + object.setString(portSuffixKey, allocation.portSuffix); + } + } + + // ---------------- Deserialization -------------------------------------------------- + + public static Optional<NetworkPorts> fromSlime(Inspector array) { + List<NetworkPorts.Allocation> list = new ArrayList<>(array.entries()); + array.traverse((ArrayTraverser) (int i, Inspector item) -> { + list.add(new NetworkPorts.Allocation((int)item.field(portNumberKey).asLong(), + item.field(serviceTypeKey).asString(), + item.field(configIdKey).asString(), + item.field(portSuffixKey).asString())); + } + ); + if (list.size() > 0) { + NetworkPorts allocator = new NetworkPorts(list); + return Optional.of(allocator); + } + return Optional.empty(); + } + +} |