diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-11-22 11:11:22 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-11-22 11:11:22 +0100 |
commit | f55d830d8d56a28b6f81446a3a65c162094f4da2 (patch) | |
tree | d823d0ae8af8397970116511f3604efcb6b1e7b5 /controller-server/src/main/java/com/yahoo | |
parent | e83e90e93a4b012df3d30fd2cf6eab0f433ac645 (diff) |
Avoid duplicating endpoint URLs
When routing is configured through routing polices, one policy exists per
deployment, but the global endpoint URL may naturally be the same across
multiple deployments.
Diffstat (limited to 'controller-server/src/main/java/com/yahoo')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index c8f5720327a..c406ef0bbd8 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -109,6 +109,7 @@ import java.util.Arrays; import java.util.Base64; import java.util.Comparator; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -749,35 +750,42 @@ public class ApplicationApiHandler extends LoggingRequestHandler { })); } - // Rotation - Cursor globalRotationsArray = object.setArray("globalRotations"); + // Global endpoints + var globalEndpointUrls = new LinkedHashSet<String>(); + + // Add default global endpoints. These are backed by rotations. instance.endpointsIn(controller.system()) .scope(Endpoint.Scope.global) .legacy(false) // Hide legacy names .asList().stream() .map(Endpoint::url) .map(URI::toString) - .forEach(globalRotationsArray::addString); - - instance.rotations().stream() - .map(AssignedRotation::rotationId) - .findFirst() - .ifPresent(rotation -> object.setString("rotationId", rotation.asString())); + .forEach(globalEndpointUrls::add); - // Per-cluster rotations + // Per-cluster endpoints. These are backed by load balancers. Set<RoutingPolicy> routingPolicies = controller.applications().routingPolicies().get(instance.id()); - for (RoutingPolicy policy : routingPolicies) { + for (var policy : routingPolicies) { policy.rotationEndpointsIn(controller.system()).asList().stream() .map(Endpoint::url) .map(URI::toString) - .forEach(globalRotationsArray::addString); + .forEach(globalEndpointUrls::add); } + var globalRotationsArray = object.setArray("globalRotations"); + globalEndpointUrls.forEach(globalRotationsArray::addString); + + // Legacy field. Identifies the first assigned rotation, if any. + instance.rotations().stream() + .map(AssignedRotation::rotationId) + .findFirst() + .ifPresent(rotation -> object.setString("rotationId", rotation.asString())); + + // Deployments sorted according to deployment spec List<Deployment> deployments = deploymentSpec.instance(instance.name()) - .map(spec -> new DeploymentSteps(spec, controller::system)) - .map(steps -> steps.sortedDeployments(instance.deployments().values())) - .orElse(List.copyOf(instance.deployments().values())); + .map(spec -> new DeploymentSteps(spec, controller::system)) + .map(steps -> steps.sortedDeployments(instance.deployments().values())) + .orElse(List.copyOf(instance.deployments().values())); Cursor deploymentsArray = object.setArray("deployments"); for (Deployment deployment : deployments) { |