summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorArne Juul <arnej@yahoo-inc.com>2019-02-06 14:37:43 +0000
committerArne Juul <arnej@yahoo-inc.com>2019-02-20 10:30:08 +0000
commit92599c56d62226a32e1e4df4321123c9691db73d (patch)
tree7e981d971920da1536443289d511198af265b432 /config-provisioning
parent85e394563c8b711a1a0307c8ac5953c1817f5629 (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')
-rw-r--r--config-provisioning/abi-spec.json45
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/AllocatedHosts.java7
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java14
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPorts.java57
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/NetworkPortsSerializer.java56
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();
+ }
+
+}