From aae1b7b4dd03f5d06da63d1a644dd65089ce3dfc Mon Sep 17 00:00:00 2001 From: Morten Tokle Date: Fri, 4 Aug 2023 12:22:50 +0200 Subject: Keep original port when restricting bindings to dataplane port --- .../validation/UriBindingsValidator.java | 2 +- .../model/container/component/BindingPattern.java | 12 +++++++++- .../container/component/UserBindingPattern.java | 27 +++++++++++++++++++--- .../validation/UriBindingsValidatorTest.java | 6 ----- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/UriBindingsValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/UriBindingsValidator.java index feb7ce36171..f869d578dcb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/UriBindingsValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/UriBindingsValidator.java @@ -73,7 +73,7 @@ class UriBindingsValidator extends Validator { } private static String createErrorMessage(BindingPattern binding, String message) { - return String.format("For binding '%s': %s", binding.patternString(), message); + return String.format("For binding '%s': %s", binding.originalPatternString(), message); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/BindingPattern.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/BindingPattern.java index c3dae7e4c8a..791b59f82a6 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/BindingPattern.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/BindingPattern.java @@ -63,11 +63,21 @@ public abstract class BindingPattern implements Comparable { return builder.append(path).toString(); } + public String originalPatternString() { + StringBuilder builder = new StringBuilder(scheme).append("://").append(host); + originalPort().ifPresent(port -> builder.append(':').append(port)); + return builder.append(path).toString(); + } + /** Compares the underlying pattern string for equality */ public boolean hasSamePattern(BindingPattern other) { return this.patternString().equals(other.patternString()); } /** Returns true if pattern will match any port (if present) in uri **/ - public boolean matchesAnyPort() { return port().filter(p -> !p.equals(WILDCARD_PATTERN)).isEmpty(); } + public boolean matchesAnyPort() { return originalPort().filter(p -> !p.equals(WILDCARD_PATTERN)).isEmpty(); } + + protected Optional originalPort() { + return port(); + } @Override public boolean equals(Object o) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/UserBindingPattern.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/UserBindingPattern.java index 182eca835c1..0f2480a6812 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/UserBindingPattern.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/UserBindingPattern.java @@ -1,6 +1,9 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.container.component; +import java.util.Objects; +import java.util.Optional; + /** * A {@link BindingPattern} which is constructed directly from a user provided 'binding' element from services.xml. * @@ -8,12 +11,30 @@ package com.yahoo.vespa.model.container.component; */ public class UserBindingPattern extends BindingPattern { - private UserBindingPattern(String scheme, String host, String port, String path) { super(scheme, host, port, path); } - private UserBindingPattern(String binding) { super(binding); } + private final Optional originalPort; + + private UserBindingPattern(String scheme, String host, String port, String path) { + super(scheme, host, port, path); + this.originalPort = null; + } + private UserBindingPattern(String scheme, String host, String port, Optional originalPort, String path) { + super(scheme, host, port, path); + this.originalPort = originalPort; + } + private UserBindingPattern(String binding) { + super(binding); + this.originalPort = null; + } public static UserBindingPattern fromHttpPath(String path) { return new UserBindingPattern("http", "*", null, path); } public static UserBindingPattern fromPattern(String binding) { return new UserBindingPattern(binding); } - public UserBindingPattern withPort(int port) { return new UserBindingPattern(scheme(), host(), Integer.toString(port), path()); } + public UserBindingPattern withPort(int port) { return new UserBindingPattern(scheme(), host(), Integer.toString(port), port(), path()); } + + protected Optional originalPort() { + return Objects.isNull(originalPort) + ? port() + : originalPort; + } @Override public String toString() { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/UriBindingsValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/UriBindingsValidatorTest.java index fa359d0f2db..a56b268eeab 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/UriBindingsValidatorTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/UriBindingsValidatorTest.java @@ -57,12 +57,6 @@ public class UriBindingsValidatorTest { runUriBindingValidator(true, createServicesXmlWithHandler("http://*/my-handler")); } - @Test - void allows_portbinding_when_restricting_data_plane() throws IOException, SAXException { - runUriBindingValidator(new TestProperties().setHostedVespa(true), createServicesXmlWithHandler("http://*:4443/my-handler")); - } - - @Test void allows_user_binding_with_wildcard_port() throws IOException, SAXException { runUriBindingValidator(true, createServicesXmlWithHandler("http://*:*/my-handler")); } -- cgit v1.2.3