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-model | |
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-model')
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; } } } |