summaryrefslogtreecommitdiffstats
path: root/config-model
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-model
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-model')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java7
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/HostResource.java60
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java20
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/Logd.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/NetworkPortRequestor.java53
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/Service.java35
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java1
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/Container.java30
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/generic/service/Service.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java6
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java5
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java15
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ConfigValueChangeValidatorTest.java3
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/StartupCommandChangeValidatorTest.java3
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/ApiService.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/ModelAmendingTestCase.java2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/ParentService.java3
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/SimpleService.java5
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/utils/FileSenderTest.java3
27 files changed, 245 insertions, 56 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java b/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java
index 60a49598c42..daa237d90c1 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java
@@ -482,8 +482,8 @@ public abstract class AbstractService extends AbstractConfigProducer<AbstractCon
* Must be done this way since the system test framework
* currently uses the first port as container http port.
*/
- public void reservePortPrepended(int port) {
- hostResource.reservePort(this, port);
+ public void reservePortPrepended(int port, String suffix) {
+ hostResource.reservePort(this, port, suffix);
ports.add(0, port);
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java
index c540a5f62d2..7ab28faa434 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java
@@ -47,6 +47,11 @@ public class ConfigProxy extends AbstractService {
*/
public int getPortCount() { return 1; }
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{"rpc"};
+ }
+
/**
* The config proxy is not started by the config system!
*/
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java b/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java
index cd92f27cc50..1b5c5e4a579 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java
@@ -26,7 +26,7 @@ public class ConfigSentinel extends AbstractService implements SentinelConfig.Pr
super(host, "sentinel");
this.applicationId = applicationId;
this.zone = zone;
- portsMeta.on(0).tag("rpc").tag("notyet");
+ portsMeta.on(0).tag("rpc").tag("admin");
portsMeta.on(1).tag("telnet").tag("interactive").tag("http").tag("state");
setProp("clustertype", "hosts");
setProp("clustername", "admin");
@@ -48,6 +48,11 @@ public class ConfigSentinel extends AbstractService implements SentinelConfig.Pr
public int getPortCount() { return 2; }
@Override
+ public String[] getPortSuffixes() {
+ return new String[]{ "rpc", "http" };
+ }
+
+ @Override
public int getHealthPort() {return getRelativePort(1); }
/**
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java
index a27b33173ee..3a8cc5c2e4c 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java
@@ -6,6 +6,7 @@ import com.yahoo.config.application.api.DeployLogger;
import com.yahoo.config.model.api.HostInfo;
import com.yahoo.config.provision.ClusterMembership;
import com.yahoo.config.provision.Flavor;
+import com.yahoo.config.provision.NetworkPorts;
import javax.annotation.Nullable;
import java.util.ArrayList;
@@ -36,10 +37,23 @@ public class HostResource implements Comparable<HostResource> {
/** Map from "sentinel name" to service */
private final Map<String, Service> services = new LinkedHashMap<>();
- private final Map<Integer, Service> portDB = new LinkedHashMap<>();
+ private final Map<Integer, NetworkPortRequestor> portDB = new LinkedHashMap<>();
private int allocatedPorts = 0;
+ static class PortReservation {
+ int gotPort;
+ NetworkPortRequestor service;
+ String suffix;
+ PortReservation(int port, NetworkPortRequestor svc, String suf) {
+ this.gotPort = port;
+ this.service = svc;
+ this.suffix = suf;
+ }
+ }
+
+ private List<PortReservation> portReservations = new ArrayList<>();
+
private Set<ClusterMembership> clusterMemberships = new LinkedHashSet<>();
// Empty for self-hosted Vespa.
@@ -48,6 +62,12 @@ public class HostResource implements Comparable<HostResource> {
/** The current Vespa version running on this node, or empty if not known */
private final Optional<Version> version;
+ private Optional<NetworkPorts> networkPortsList = Optional.empty();
+
+ public Optional<NetworkPorts> networkPorts() { return networkPortsList; }
+
+ public void addNetworkPorts(NetworkPorts ports) { this.networkPortsList = Optional.of(ports); }
+
/**
* Create a new {@link HostResource} bound to a specific {@link com.yahoo.vespa.model.Host}.
*
@@ -108,22 +128,22 @@ public class HostResource implements Comparable<HostResource> {
return ports;
}
- private List<Integer> allocatePorts(DeployLogger deployLogger, AbstractService service, int wantedPort) {
+ private List<Integer> allocatePorts(DeployLogger deployLogger, NetworkPortRequestor service, int wantedPort) {
List<Integer> ports = new ArrayList<>();
if (service.getPortCount() < 1)
return ports;
int serviceBasePort = BASE_PORT + allocatedPorts;
if (wantedPort > 0) {
- if (service.getPortCount() < 1) {
- throw new RuntimeException(service + " wants baseport " + wantedPort +
- ", but it has not reserved any ports, so it cannot name a desired baseport.");
- }
if (service.requiresWantedPort() || canUseWantedPort(deployLogger, service, wantedPort, serviceBasePort))
serviceBasePort = wantedPort;
}
+ String[] suffixes = service.getPortSuffixes();
+ if (suffixes.length != service.getPortCount()) {
+ throw new IllegalArgumentException("service "+service+" had "+suffixes.length+" port suffixes, but port count "+service.getPortCount()+", mismatch");
+ }
- reservePort(service, serviceBasePort);
+ reservePort(service, serviceBasePort, suffixes[0]);
ports.add(serviceBasePort);
int remainingPortsStart = service.requiresConsecutivePorts() ?
@@ -131,17 +151,30 @@ public class HostResource implements Comparable<HostResource> {
BASE_PORT + allocatedPorts;
for (int i = 0; i < service.getPortCount() - 1; i++) {
int port = remainingPortsStart + i;
- reservePort(service, port);
+ reservePort(service, port, suffixes[i+1]);
ports.add(port);
}
+ if (suffixes.length != service.getPortCount()) {
+ throw new IllegalArgumentException("service "+service+" had "+suffixes.length+" port suffixes, but port count "+service.getPortCount()+", mismatch");
+ }
return ports;
}
- private boolean canUseWantedPort(DeployLogger deployLogger, AbstractService service, int wantedPort, int serviceBasePort) {
+ public void flushPortReservations() {
+ List<NetworkPorts.Allocation> list = new ArrayList<>();
+ for (PortReservation pr : portReservations) {
+ String servType = pr.service.getServiceType();
+ String configId = pr.service.getConfigId();
+ list.add(new NetworkPorts.Allocation(pr.gotPort, servType, configId, pr.suffix));
+ }
+ this.networkPortsList = Optional.of(new NetworkPorts(list));
+ }
+
+ private boolean canUseWantedPort(DeployLogger deployLogger, NetworkPortRequestor service, int wantedPort, int serviceBasePort) {
for (int i = 0; i < service.getPortCount(); i++) {
int port = wantedPort + i;
if (portDB.containsKey(port)) {
- AbstractService s = (AbstractService)portDB.get(port);
+ NetworkPortRequestor s = portDB.get(port);
deployLogger.log(Level.WARNING, service.getServiceName() +" cannot reserve port " + port + " on " +
this + ": Already reserved for " + s.getServiceName() +
". Using default port range from " + serviceBasePort);
@@ -159,7 +192,7 @@ public class HostResource implements Comparable<HostResource> {
* @param service the service that wishes to reserve the port.
* @param port the port to be reserved.
*/
- void reservePort(AbstractService service, int port) {
+ void reservePort(NetworkPortRequestor service, int port, String suffix) {
if (portDB.containsKey(port)) {
portAlreadyReserved(service, port);
} else {
@@ -170,6 +203,7 @@ public class HostResource implements Comparable<HostResource> {
}
}
portDB.put(port, service);
+ portReservations.add(new PortReservation(port, service, suffix));
}
}
@@ -178,8 +212,8 @@ public class HostResource implements Comparable<HostResource> {
port < BASE_PORT + MAX_PORTS;
}
- private void portAlreadyReserved(AbstractService service, int port) {
- AbstractService otherService = (AbstractService)portDB.get(port);
+ private void portAlreadyReserved(NetworkPortRequestor service, int port) {
+ NetworkPortRequestor otherService = portDB.get(port);
int nextAvailablePort = nextAvailableBaseport(service.getPortCount());
if (nextAvailablePort == 0) {
noMoreAvailablePorts();
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java
index fdfe4f01790..a1b030ffc61 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/HostSystem.java
@@ -8,6 +8,7 @@ import com.yahoo.config.provision.Capacity;
import com.yahoo.config.provision.ClusterMembership;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.HostSpec;
+import com.yahoo.config.provision.NetworkPorts;
import com.yahoo.config.provision.ProvisionLogger;
import java.net.UnknownHostException;
@@ -126,9 +127,11 @@ public class HostSystem extends AbstractConfigProducer<Host> {
private HostResource addNewHost(HostSpec hostSpec) {
Host host = Host.createHost(this, hostSpec.hostname());
- HostResource hostResource = new HostResource(host, hostSpec.version());
+ HostResource hostResource = new HostResource(host,
+ hostSpec.version());
hostResource.setFlavor(hostSpec.flavor());
hostSpec.membership().ifPresent(hostResource::addClusterMembership);
+ hostSpec.networkPorts().ifPresent(hostResource::addNetworkPorts);
hostname2host.put(host.getHostname(), hostResource);
log.log(DEBUG, () -> "Added new host resource for " + host.getHostname() + " with flavor " + hostResource.getFlavor());
return hostResource;
@@ -141,6 +144,19 @@ public class HostSystem extends AbstractConfigProducer<Host> {
.collect(Collectors.toList());
}
+ public void dumpPortAllocations() {
+ for (HostResource hr : getHosts()) {
+ hr.flushPortReservations();
+/*
+ System.out.println("port allocations for: "+hr.getHostname());
+ NetworkPorts ports = hr.networkPorts().get();
+ for (NetworkPorts.Allocation allocation: ports.allocations()) {
+ System.out.println("port="+allocation.port+" [type="+allocation.serviceType+", cfgId="+allocation.configId+", suffix="+allocation.portSuffix+"]");
+ }
+*/
+ }
+ }
+
public Map<HostResource, ClusterMembership> allocateHosts(ClusterSpec cluster, Capacity capacity, int groups, DeployLogger logger) {
List<HostSpec> allocatedHosts = provisioner.prepare(cluster, capacity, groups, new ProvisionDeployLogger(logger));
// TODO: Even if HostResource owns a set of memberships, we need to return a map because the caller needs the current membership.
@@ -177,7 +193,7 @@ public class HostSystem extends AbstractConfigProducer<Host> {
Set<HostSpec> getHostSpecs() {
return getHosts().stream()
.map(host -> new HostSpec(host.getHostname(), Collections.emptyList(),
- host.getFlavor(), host.primaryClusterMembership(), host.version()))
+ host.getFlavor(), host.primaryClusterMembership(), host.version(), host.networkPorts()))
.collect(Collectors.toCollection(LinkedHashSet::new));
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/Logd.java b/config-model/src/main/java/com/yahoo/vespa/model/Logd.java
index 0f7418582a3..3c7f1ba6cfa 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/Logd.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/Logd.java
@@ -32,6 +32,11 @@ public class Logd
*/
public int getPortCount() { return 1; }
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{"http"};
+ }
+
/** Returns the desired base port for this service. */
public int getWantedPort() { return 19089; }
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/NetworkPortRequestor.java b/config-model/src/main/java/com/yahoo/vespa/model/NetworkPortRequestor.java
new file mode 100644
index 00000000000..52319f71810
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/vespa/model/NetworkPortRequestor.java
@@ -0,0 +1,53 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package com.yahoo.vespa.model;
+
+/**
+ * Interface implemented by services using network ports, identifying its requirements.
+ * @author arnej
+ */
+public interface NetworkPortRequestor {
+
+ /** Returns the type of service */
+ String getServiceType();
+
+ /** Returns the name that identifies this service for the config-sentinel */
+ String getServiceName();
+
+ /** Returns the config id */
+ String getConfigId();
+
+ /**
+ * Returns the desired base port for this service, or '0' if this
+ * service should use the default port allocation mechanism.
+ *
+ * @return The desired base port for this service.
+ */
+ default int getWantedPort() { return 0; }
+
+ /** Returns the number of ports needed by this service. */
+ int getPortCount();
+
+ /**
+ * Returns true if the desired base port (returned by
+ * getWantedPort()) for this service is the only allowed base
+ * port.
+ *
+ * @return true if this Service requires the wanted base port.
+ */
+ default boolean requiresWantedPort() { return false; }
+
+ /**
+ * Override if the services does not require consecutive port numbers. I.e. if any ports
+ * in addition to the baseport should be allocated from Vespa's default port range.
+ *
+ * @return true by default
+ */
+ default boolean requiresConsecutivePorts() { return true; }
+
+ /**
+ * Return names for each port requested.
+ * The size of the returned array must be equal to getPortCount().
+ **/
+ String[] getPortSuffixes();
+}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/Service.java b/config-model/src/main/java/com/yahoo/vespa/model/Service.java
index d5d33a08b5d..0af4355764c 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/Service.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/Service.java
@@ -11,7 +11,7 @@ import java.util.Optional;
*
* @author gjoranv
*/
-public interface Service extends ConfigProducer {
+public interface Service extends ConfigProducer, NetworkPortRequestor {
/**
* Services that should be started by config-sentinel must return
@@ -44,39 +44,6 @@ public interface Service extends ConfigProducer {
boolean getAutorestartFlag();
/**
- * Returns the type of service. E.g. the class-name without the
- * package prefix.
- */
- String getServiceType();
-
- /**
- * Returns the name that identifies this service for the config-sentinel.
- */
- String getServiceName();
-
- /**
- * Returns the desired base port for this service, or '0' if this
- * service should use the default port allocation mechanism.
- *
- * @return The desired base port for this service.
- */
- int getWantedPort();
-
- /**
- * Returns true if the desired base port (returned by
- * getWantedPort()) for this service is the only allowed base
- * port.
- *
- * @return true if this Service requires the wanted base port.
- */
- boolean requiresWantedPort();
-
- /**
- * Returns the number of ports needed by this service.
- */
- int getPortCount();
-
- /**
* Returns a PortsMeta object, giving access to more information
* about the different ports of this service.
*/
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
index 20089dc3980..6f53cc3ca6c 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
@@ -180,6 +180,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
root.prepare(configModelRepo);
configModelRepo.prepareConfigModels(deployState);
validateWrapExceptions();
+ hostSystem.dumpPortAllocations();
}
else { // create a model with no services instantiated and the given file distributor
this.allocatedHosts = AllocatedHosts.withHosts(hostSystem.getHostSpecs());
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java
index 2a32549b6bf..a2839ec0fb6 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java
@@ -51,6 +51,11 @@ public class Configserver extends AbstractService {
*/
public int getPortCount() { return 2; }
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{ "rpc", "http" };
+ }
+
/**
* The configserver is not started by the config system!
*/
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java
index 2693a4c7409..d766507c75f 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogForwarder.java
@@ -55,6 +55,11 @@ public class LogForwarder extends AbstractService implements LogforwarderConfig.
*/
public int getPortCount() { return 0; }
+ @Override
+ public String[] getPortSuffixes() {
+ return null;
+ }
+
/**
* @return The command used to start LogForwarder
*/
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java
index c354445b690..4dcbfb5b3c3 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java
@@ -70,4 +70,9 @@ public class Logserver extends AbstractService {
return 4;
}
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{ "unused", "logtp", "last.errors", "replicator" };
+ }
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java
index 12a0d35de5e..99738c13d4a 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java
@@ -56,6 +56,11 @@ public class Slobrok extends AbstractService implements StateserverConfig.Produc
return 2;
}
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[] { "rpc", "http" };
+ }
+
/**
* @return The port on which this slobrok should respond, as a String.
*/
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java
index dc962ed5931..f61fc3d4df8 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java
@@ -174,7 +174,7 @@ public class Container extends AbstractService implements
private void reserveHttpPortsPrepended() {
if (getHttp().getHttpServer() != null) {
for (ConnectorFactory connectorFactory : getHttp().getHttpServer().getConnectorFactories()) {
- reservePortPrepended(getPort(connectorFactory));
+ reservePortPrepended(getPort(connectorFactory), "http/" + connectorFactory.getName());
}
}
}
@@ -240,6 +240,34 @@ public class Container extends AbstractService implements
return httpPorts + rpcPorts;
}
+ @Override
+ public String[] getPortSuffixes() {
+ // TODO clean up this mess
+ int n = getPortCount();
+ String[] suffixes = new String[n];
+ int off = 0;
+ int httpPorts = (getHttp() != null) ? 0 : numHttpServerPorts;
+ if (httpPorts > 0) {
+ suffixes[off++] = "http";
+ }
+ for (int i = 1; i < httpPorts; i++) {
+ suffixes[off++] = "http/" + i;
+ }
+ int rpcPorts = (rpcServerEnabled()) ? numRpcServerPorts : 0;
+ if (rpcPorts > 0) {
+ suffixes[off++] = "messaging";
+ }
+ if (rpcPorts > 1) {
+ suffixes[off++] = "rpc";
+ }
+ while (off < n) {
+ suffixes[off] = "unused/" + off;
+ ++off;
+ }
+ assert (off == n);
+ return suffixes;
+ }
+
/**
* @return the actual search port
* TODO: Remove. Use {@link #getPortsMeta()} and check tags in conjunction with {@link #getRelativePort(int)}.
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java
index c75421c9636..dc9372c463b 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java
@@ -57,6 +57,10 @@ public abstract class ContentNode extends AbstractService
@Override
public int getPortCount() { return 3; }
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[] { "messaging", "rpc", "http" };
+ }
@Override
public void getConfig(StorCommunicationmanagerConfig.Builder builder) {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/generic/service/Service.java b/config-model/src/main/java/com/yahoo/vespa/model/generic/service/Service.java
index 9ccf5103175..0d30bade53c 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/generic/service/Service.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/generic/service/Service.java
@@ -24,6 +24,11 @@ public class Service extends AbstractService {
}
@Override
+ public String[] getPortSuffixes() {
+ return null;
+ }
+
+ @Override
public String getStartupCommand() {
return ((ServiceCluster) getParent()).getCommand();
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java b/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java
index b9c937b4a4c..9b4fe93d6ea 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java
@@ -234,4 +234,10 @@ public class Dispatch extends AbstractService implements SearchInterface,
* @return the number of ports needed
*/
public int getPortCount() { return 3; }
+
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{ "rpc", "fs4", "health" };
+ }
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java
index 5be51310504..934184d5972 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java
@@ -160,6 +160,11 @@ public class SearchNode extends AbstractService implements
return 5;
}
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[] { "rpc", "fs4", "future/4", "unused/3", "health" };
+ }
+
/**
* Returns the RPC port used by this searchnode.
*
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java
index 61cac8afb91..c42579085a5 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java
@@ -38,6 +38,11 @@ public class TransactionLogServer extends AbstractService {
return 1;
}
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{"tls"};
+ }
+
/**
* Returns the port used by the TLS.
*
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java b/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java
index abf4ec02a3e..d16bbe72a95 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/HostResourceTest.java
@@ -37,7 +37,7 @@ public class HostResourceTest {
public void next_available_baseport_is_BASE_PORT_plus_one_when_one_port_has_been_reserved() {
MockRoot root = new MockRoot();
HostResource host = mockHostResource(root);
- host.reservePort(new TestService(1), HostResource.BASE_PORT);
+ host.reservePort(new TestService(1), HostResource.BASE_PORT, "foo");
assertThat(host.nextAvailableBaseport(1), is(HostResource.BASE_PORT + 1));
}
@@ -47,12 +47,12 @@ public class HostResourceTest {
HostResource host = mockHostResource(root);
for (int p = HostResource.BASE_PORT; p < HostResource.BASE_PORT + HostResource.MAX_PORTS; p += 2) {
- host.reservePort(new TestService(1), p);
+ host.reservePort(new TestService(1), p, "foo");
}
assertThat(host.nextAvailableBaseport(2), is(0));
try {
- host.reservePort(new TestService(2), HostResource.BASE_PORT);
+ host.reservePort(new TestService(2), HostResource.BASE_PORT, "bar");
} catch (RuntimeException e) {
assertThat(e.getMessage(), containsString("Too many ports are reserved"));
}
@@ -181,5 +181,14 @@ public class HostResourceTest {
@Override
public int getPortCount() { return portCount; }
+
+ @Override
+ public String[] getPortSuffixes() {
+ String[] suffixes = new String[portCount];
+ for (int i = 0; i < portCount; i++) {
+ suffixes[i] = "generic." + i;
+ }
+ return suffixes;
+ }
}
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ConfigValueChangeValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ConfigValueChangeValidatorTest.java
index 2456113f40d..f13f53e8648 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ConfigValueChangeValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ConfigValueChangeValidatorTest.java
@@ -246,6 +246,9 @@ public class ConfigValueChangeValidatorTest {
public int getPortCount() {
return 0;
}
+
+ @Override
+ public String[] getPortSuffixes() { return null; }
}
private static class SimpleConfigProducer extends AbstractConfigProducer<AbstractConfigProducer<?>>
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/StartupCommandChangeValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/StartupCommandChangeValidatorTest.java
index 4f6a1ddf7b3..2b04b026ee7 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/StartupCommandChangeValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/StartupCommandChangeValidatorTest.java
@@ -75,5 +75,8 @@ public class StartupCommandChangeValidatorTest {
public int getPortCount() {
return 0;
}
+
+ @Override
+ public String[] getPortSuffixes() { return null; }
}
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/ApiService.java b/config-model/src/test/java/com/yahoo/vespa/model/test/ApiService.java
index 28c56e1e45f..6f06eb3e482 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/test/ApiService.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/test/ApiService.java
@@ -36,4 +36,6 @@ public class ApiService extends AbstractService implements com.yahoo.test.Standa
public int getPortCount() { return 0; }
+ @Override
+ public String[] getPortSuffixes() { return null; }
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/ModelAmendingTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/test/ModelAmendingTestCase.java
index 57b0606457d..82da14f0d29 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/test/ModelAmendingTestCase.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/test/ModelAmendingTestCase.java
@@ -129,6 +129,8 @@ public class ModelAmendingTestCase {
return 0;
}
+ @Override
+ public String[] getPortSuffixes() { return null; }
}
public static class AdminModelAmender extends ConfigModel {
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/ParentService.java b/config-model/src/test/java/com/yahoo/vespa/model/test/ParentService.java
index 325cc78a361..c7559c68592 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/test/ParentService.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/test/ParentService.java
@@ -58,4 +58,7 @@ public class ParentService extends AbstractService implements com.yahoo.test.Sta
}
public int getPortCount() { return 0; }
+
+ @Override
+ public String[] getPortSuffixes() { return null; }
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleService.java b/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleService.java
index 0037e40a20f..a38916463c4 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleService.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/test/SimpleService.java
@@ -38,6 +38,11 @@ public class SimpleService extends AbstractService implements com.yahoo.test.Sta
public int getWantedPort(){ return 10000; }
public int getPortCount() { return 5; }
+ @Override
+ public String[] getPortSuffixes() {
+ return new String[]{ "a", "b", "c", "d", "e" };
+ }
+
// Make sure this service is listed in the sentinel config
public String getStartupCommand() { return "sleep 0"; }
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/utils/FileSenderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/utils/FileSenderTest.java
index 9b5bd71274a..79646dacaa9 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/utils/FileSenderTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/utils/FileSenderTest.java
@@ -172,5 +172,8 @@ public class FileSenderTest {
public int getPortCount() {
return 0;
}
+
+ @Override
+ public String[] getPortSuffixes() { return null; }
}
}