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/src | |
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/src')
4 files changed, 132 insertions, 2 deletions
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(); + } + +} |