diff options
author | Bjørn Christian Seime <bjorn.christian@seime.no> | 2020-08-19 12:08:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-19 12:08:33 +0200 |
commit | 1ac3e32bf19482a04bca0309c5863ffeecf47f5d (patch) | |
tree | f060984542ade4696798c413fc46a07b5b256bf9 /config-model/src/main | |
parent | 045151edadc217d51f5a491e91c2f99cc20ef503 (diff) |
Revert "Bjorncs/validate binding patterns"
Diffstat (limited to 'config-model/src/main')
28 files changed, 169 insertions, 417 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java index 9ae9a158631..f9338f9cb35 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java @@ -7,7 +7,6 @@ import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; /** * @author hmusum @@ -40,7 +39,7 @@ public class LogserverContainerCluster extends ContainerCluster<LogserverContain private void addLogHandler() { Handler<?> logHandler = Handler.fromClassName(ContainerCluster.LOG_HANDLER_CLASS); - logHandler.addServerBindings(SystemBindingPattern.fromHttpPath("/logs")); + logHandler.addServerBindings("http://*/logs"); addComponent(logHandler); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java index 5b3e4e1479e..08f4e2fa12f 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java @@ -14,7 +14,6 @@ import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.component.AccessLogComponent; import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import com.yahoo.vespa.model.container.xml.PlatformBundles; import java.util.Set; @@ -37,10 +36,10 @@ public class ClusterControllerContainer extends Container implements super(parent, "" + index, index); addHandler("clustercontroller-status", "com.yahoo.vespa.clustercontroller.apps.clustercontroller.StatusHandler", - "/clustercontroller-status/*"); + "clustercontroller-status/*"); addHandler("clustercontroller-state-restapi-v2", "com.yahoo.vespa.clustercontroller.apps.clustercontroller.StateRestApiV2Handler", - "/cluster/v2/*"); + "cluster/v2/*"); if (runStandaloneZooKeeper) { addComponent("clustercontroller-zkrunner", "com.yahoo.vespa.zookeeper.VespaZooKeeperServerImpl", @@ -78,8 +77,8 @@ public class ClusterControllerContainer extends Container implements return ContainerServiceType.CLUSTERCONTROLLER_CONTAINER; } - private void addHandler(Handler h, String path) { - h.addServerBindings(SystemBindingPattern.fromHttpPath(path)); + private void addHandler(Handler h, String binding) { + h.addServerBindings("http://*/" + binding); super.addHandler(h); } @@ -97,8 +96,9 @@ public class ClusterControllerContainer extends Container implements addComponent(new Component<>(createComponentModel(id, className, bundle))); } - private void addHandler(String id, String className, String path) { - addHandler(new Handler(createComponentModel(id, className, CLUSTERCONTROLLER_BUNDLE)), path); + private void addHandler(String id, String className, String binding) { + addHandler(new Handler(createComponentModel(id, className, CLUSTERCONTROLLER_BUNDLE)), + binding); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java index b5936887b50..4dc9811a024 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java @@ -7,12 +7,12 @@ import ai.vespa.metricsproxy.core.MetricsConsumers; import ai.vespa.metricsproxy.core.MetricsManager; import ai.vespa.metricsproxy.core.MonitoringConfig; import ai.vespa.metricsproxy.core.VespaMetrics; +import ai.vespa.metricsproxy.http.metrics.MetricsV1Handler; import ai.vespa.metricsproxy.http.application.ApplicationMetricsHandler; import ai.vespa.metricsproxy.http.application.ApplicationMetricsRetriever; import ai.vespa.metricsproxy.http.application.MetricsNodesConfig; -import ai.vespa.metricsproxy.http.metrics.MetricsV1Handler; -import ai.vespa.metricsproxy.http.prometheus.PrometheusHandler; import ai.vespa.metricsproxy.http.yamas.YamasHandler; +import ai.vespa.metricsproxy.http.prometheus.PrometheusHandler; import ai.vespa.metricsproxy.metric.ExternalMetrics; import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensions; import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensionsConfig; @@ -38,7 +38,6 @@ import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import com.yahoo.vespa.model.container.xml.PlatformBundles; import java.nio.file.Path; @@ -130,9 +129,8 @@ public class MetricsProxyContainerCluster extends ContainerCluster<MetricsProxyC static Handler<AbstractConfigProducer<?>> createMetricsHandler(Class<? extends ThreadedHttpRequestHandler> clazz, String bindingPath) { Handler<AbstractConfigProducer<?>> metricsHandler = new Handler<>( new ComponentModel(clazz.getName(), null, METRICS_PROXY_BUNDLE_NAME, null)); - metricsHandler.addServerBindings( - SystemBindingPattern.fromHttpPath(bindingPath), - SystemBindingPattern.fromHttpPath(bindingPath + "/*")); + metricsHandler.addServerBindings("http://*" + bindingPath, + "http://*" + bindingPath + "/*"); return metricsHandler; } 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 deleted file mode 100644 index 249827b11d9..00000000000 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/UriBindingsValidator.java +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.application.validation; - -import com.yahoo.config.model.deploy.DeployState; -import com.yahoo.vespa.model.VespaModel; -import com.yahoo.vespa.model.container.ApplicationContainerCluster; -import com.yahoo.vespa.model.container.component.BindingPattern; -import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; -import com.yahoo.vespa.model.container.http.FilterBinding; -import com.yahoo.vespa.model.container.http.Http; - -import java.util.logging.Level; - -import static com.yahoo.config.model.ConfigModelContext.ApplicationType.HOSTED_INFRASTRUCTURE; - -/** - * Validates URI bindings for filters and handlers - * - * @author bjorncs - */ -class UriBindingsValidator extends Validator { - - @Override - public void validate(VespaModel model, DeployState deployState) { - for (ApplicationContainerCluster cluster : model.getContainerClusters().values()) { - for (Handler<?> handler : cluster.getHandlers()) { - for (BindingPattern binding : handler.getServerBindings()) { - validateUserBinding(binding, model, deployState); - } - } - Http http = cluster.getHttp(); - if (http != null) { - for (FilterBinding binding : cluster.getHttp().getBindings()) { - validateUserBinding(binding.binding(), model, deployState); - } - } - } - } - - private static void validateUserBinding(BindingPattern binding, VespaModel model, DeployState deployState) { - validateScheme(binding, deployState); - if (isHostedApplication(model, deployState)) { - validateHostedApplicationUserBinding(binding); - } - } - - private static void validateScheme(BindingPattern binding, DeployState deployState) { - if (binding.scheme().equals("https")) { - String message = createErrorMessage( - binding, "'https' bindings are deprecated, use 'http' instead to bind to both http and https traffic."); - deployState.getDeployLogger().log(Level.WARNING, message); - } - } - - private static void validateHostedApplicationUserBinding(BindingPattern binding) { - // only perform these validation for used-generated bindings - // bindings produced by the hosted config model amender will violate some of the rules below - if (binding instanceof SystemBindingPattern) return; - - if (binding.port().isPresent()) { - throw new IllegalArgumentException(createErrorMessage(binding, "binding with port is not allowed")); - } - if (!binding.host().equals(BindingPattern.WILDCARD_PATTERN)) { - throw new IllegalArgumentException(createErrorMessage(binding, "only binding with wildcard ('*') for hostname is allowed")); - } - if (!binding.scheme().equals("http") && !binding.scheme().equals("https")) { - throw new IllegalArgumentException(createErrorMessage(binding, "only 'http' is allowed as scheme")); - } - } - - private static boolean isHostedApplication(VespaModel model, DeployState deployState) { - return deployState.isHosted() && model.getAdmin().getApplicationType() != HOSTED_INFRASTRUCTURE; - } - - private static String createErrorMessage(BindingPattern binding, String message) { - return String.format("For binding '%s': %s", binding.patternString(), message); - } - -} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java index 3a4dee300da..22dd0289390 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java @@ -61,7 +61,6 @@ public class Validation { new AccessControlFilterValidator().validate(model, deployState); new CloudWatchValidator().validate(model, deployState); new AwsAccessControlValidator().validate(model, deployState); - new UriBindingsValidator().validate(model, deployState); List<ConfigChangeAction> result = Collections.emptyList(); if (deployState.getProperties().isFirstTimeDeployment()) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java index 0fdd1af56f3..11fab0ada29 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomClientProviderBuilder.java @@ -2,12 +2,11 @@ package com.yahoo.vespa.model.builder.xml.dom; import com.yahoo.config.model.deploy.DeployState; -import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.text.XML; +import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.container.ApplicationContainerCluster; import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.UserBindingPattern; import org.w3c.dom.Element; /** @@ -25,10 +24,10 @@ public class DomClientProviderBuilder extends DomHandlerBuilder { Handler<? super Component<?, ?>> client = createHandler(clientElement); for (Element binding : XML.getChildren(clientElement, "binding")) - client.addClientBindings(UserBindingPattern.fromPattern(XML.getValue(binding))); + client.addClientBindings(XML.getValue(binding)); for (Element serverBinding : XML.getChildren(clientElement, "serverBinding")) - client.addServerBindings(UserBindingPattern.fromPattern(XML.getValue(serverBinding))); + client.addServerBindings(XML.getValue(serverBinding)); DomComponentBuilder.addChildren(deployState, parent, clientElement, client); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java index 145535fe06f..ac6d089cf24 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java @@ -8,10 +8,8 @@ import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.text.XML; import com.yahoo.vespa.model.container.ApplicationContainerCluster; -import com.yahoo.vespa.model.container.component.BindingPattern; import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.UserBindingPattern; import com.yahoo.vespa.model.container.xml.BundleInstantiationSpecificationBuilder; import org.w3c.dom.Element; @@ -29,14 +27,11 @@ import static java.util.logging.Level.INFO; */ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Handler> { - private static final Set<BindingPattern> reservedBindings = - Set.of( - METRICS_V2_HANDLER_BINDING_1, - METRICS_V2_HANDLER_BINDING_2, - STATE_HANDLER_BINDING_1, - STATE_HANDLER_BINDING_2, - VIP_HANDLER_BINDING); - + private static final Set<String> reservedBindings = Set.of(METRICS_V2_HANDLER_BINDING_1, + METRICS_V2_HANDLER_BINDING_2, + STATE_HANDLER_BINDING_1, + STATE_HANDLER_BINDING_2, + VIP_HANDLER_BINDING); private final ApplicationContainerCluster cluster; public DomHandlerBuilder(ApplicationContainerCluster cluster) { @@ -48,10 +43,10 @@ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder< Handler<? super Component<?, ?>> handler = createHandler(handlerElement); for (Element binding : XML.getChildren(handlerElement, "binding")) - addServerBinding(handler, UserBindingPattern.fromPattern(XML.getValue(binding)), deployState.getDeployLogger()); + addServerBinding(handler, XML.getValue(binding), deployState.getDeployLogger()); for (Element clientBinding : XML.getChildren(handlerElement, "clientBinding")) - handler.addClientBindings(UserBindingPattern.fromPattern(XML.getValue(clientBinding))); + handler.addClientBindings(XML.getValue(clientBinding)); DomComponentBuilder.addChildren(deployState, parent, handlerElement, handler); @@ -63,30 +58,27 @@ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder< return new Handler<>(new ComponentModel(bundleSpec)); } - private void addServerBinding(Handler<? super Component<?, ?>> handler, BindingPattern binding, DeployLogger log) { + private void addServerBinding(Handler<? super Component<?, ?>> handler, String binding, DeployLogger log) { throwIfBindingIsReserved(binding, handler); handler.addServerBindings(binding); removeExistingServerBinding(binding, handler, log); } - private void throwIfBindingIsReserved(BindingPattern binding, Handler<?> newHandler) { + private void throwIfBindingIsReserved(String binding, Handler<?> newHandler) { for (var reserved : reservedBindings) { - if (binding.hasSamePattern(reserved)) { - throw new IllegalArgumentException("Binding '" + binding.patternString() + "' is a reserved Vespa binding and " + + if (binding.equals(reserved)) { + throw new IllegalArgumentException("Binding '" + binding + "' is a reserved Vespa binding and " + "cannot be used by handler: " + newHandler.getComponentId()); } } } - private void removeExistingServerBinding(BindingPattern binding, Handler<?> newHandler, DeployLogger log) { + private void removeExistingServerBinding(String binding, Handler<?> newHandler, DeployLogger log) { for (var handler : cluster.getHandlers()) { - for (BindingPattern serverBinding : handler.getServerBindings()) { - if (serverBinding.hasSamePattern(binding)) { - handler.removeServerBinding(serverBinding); - log.log(INFO, "Binding '" + binding.patternString() + "' was already in use by handler '" + - handler.getComponentId() + "', but will now be taken over by handler: " + newHandler.getComponentId()); - - } + if (handler.getServerBindings().contains(binding)) { + handler.removeServerBinding(binding); + log.log(INFO, "Binding '" + binding + "' was already in use by handler '" + + handler.getComponentId() + "', but will now be taken over by handler: " + newHandler.getComponentId()); } } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java b/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java index 159a87be27d..58f03bffb30 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/clients/ContainerDocumentApi.java @@ -6,8 +6,6 @@ import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; -import com.yahoo.vespa.model.container.component.UserBindingPattern; import java.util.Collection; import java.util.Collections; @@ -26,7 +24,7 @@ public class ContainerDocumentApi { } private void setupHandlers(ContainerCluster cluster) { - cluster.addComponent(newVespaClientHandler("com.yahoo.document.restapi.resource.RestApi", "/document/v1/*")); + cluster.addComponent(newVespaClientHandler("com.yahoo.document.restapi.resource.RestApi", "document/v1/*")); cluster.addComponent(newVespaClientHandler("com.yahoo.vespa.http.server.FeedHandler", ContainerCluster.RESERVED_URI_PREFIX + "/feedapi")); } @@ -34,18 +32,9 @@ public class ContainerDocumentApi { Handler<AbstractConfigProducer<?>> handler = new Handler<>(new ComponentModel( BundleInstantiationSpecification.getFromStrings(componentId, null, vespaClientBundleSpecification), "")); - if (options.bindings.isEmpty()) { - handler.addServerBindings( - SystemBindingPattern.fromHttpPath(bindingSuffix), - SystemBindingPattern.fromHttpPath(bindingSuffix + '/')); - } else { - for (String rootBinding : options.bindings) { - String pathWithoutLeadingSlash = bindingSuffix.substring(1); - handler.addServerBindings( - UserBindingPattern.fromPattern(rootBinding + pathWithoutLeadingSlash), - UserBindingPattern.fromPattern(rootBinding + pathWithoutLeadingSlash + '/')); - } - + for (String rootBinding : options.bindings) { + handler.addServerBindings(rootBinding + bindingSuffix, + rootBinding + bindingSuffix + '/'); } return handler; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java index 1427fa492dc..b0ac02d0fe8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java @@ -22,12 +22,10 @@ import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.config.search.RankProfilesConfig; import com.yahoo.vespa.config.search.core.RankingConstantsConfig; import com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainer; -import com.yahoo.vespa.model.container.component.BindingPattern; import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.ConfigProducerGroup; import com.yahoo.vespa.model.container.component.Handler; import com.yahoo.vespa.model.container.component.Servlet; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import com.yahoo.vespa.model.container.jersey.Jersey2Servlet; import com.yahoo.vespa.model.container.jersey.RestApi; import com.yahoo.vespa.model.container.xml.PlatformBundles; @@ -57,12 +55,12 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat MetricsProxyApiConfig.Producer { public static final String METRICS_V2_HANDLER_CLASS = MetricsV2Handler.class.getName(); - public static final BindingPattern METRICS_V2_HANDLER_BINDING_1 = SystemBindingPattern.fromHttpPath(MetricsV2Handler.V2_PATH); - public static final BindingPattern METRICS_V2_HANDLER_BINDING_2 = SystemBindingPattern.fromHttpPath(MetricsV2Handler.V2_PATH + "/*"); + public static final String METRICS_V2_HANDLER_BINDING_1 = "http://*" + MetricsV2Handler.V2_PATH; + public static final String METRICS_V2_HANDLER_BINDING_2 = METRICS_V2_HANDLER_BINDING_1 + "/*"; public static final String PROMETHEUS_V1_HANDLER_CLASS = PrometheusV1Handler.class.getName(); - private static final BindingPattern PROMETHEUS_V1_HANDLER_BINDING_1 = SystemBindingPattern.fromHttpPath(PrometheusV1Handler.V1_PATH); - private static final BindingPattern PROMETHEUS_V1_HANDLER_BINDING_2 = SystemBindingPattern.fromHttpPath(PrometheusV1Handler.V1_PATH + "/*"); + private static final String PROMETHEUS_V1_HANDLER_BINDING_1 = "http://*" + PrometheusV1Handler.V1_PATH; + private static final String PROMETHEUS_V1_HANDLER_BINDING_2 = PROMETHEUS_V1_HANDLER_BINDING_1 + "/*"; public static final int heapSizePercentageOfTotalNodeMemory = 60; public static final int heapSizePercentageOfTotalNodeMemoryWhenCombinedCluster = 17; @@ -127,7 +125,7 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat addMetricsHandler(PROMETHEUS_V1_HANDLER_CLASS, PROMETHEUS_V1_HANDLER_BINDING_1, PROMETHEUS_V1_HANDLER_BINDING_2); } - private void addMetricsHandler(String handlerClass, BindingPattern rootBinding, BindingPattern innerBinding) { + private void addMetricsHandler(String handlerClass, String rootBinding, String innerBinding) { Handler<AbstractConfigProducer<?>> handler = new Handler<>( new ComponentModel(handlerClass, null, null, null)); handler.addServerBindings(rootBinding, innerBinding); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index 8bb456ab7e7..240157fb7aa 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -39,7 +39,6 @@ import com.yahoo.vespa.model.Service; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.clients.ContainerDocumentApi; import com.yahoo.vespa.model.container.component.AccessLogComponent; -import com.yahoo.vespa.model.container.component.BindingPattern; import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.ComponentGroup; import com.yahoo.vespa.model.container.component.ComponentsConfigGenerator; @@ -48,7 +47,6 @@ import com.yahoo.vespa.model.container.component.FileStatusHandlerComponent; import com.yahoo.vespa.model.container.component.Handler; import com.yahoo.vespa.model.container.component.SimpleComponent; import com.yahoo.vespa.model.container.component.StatisticsComponent; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import com.yahoo.vespa.model.container.component.chain.ProcessingHandler; import com.yahoo.vespa.model.container.docproc.ContainerDocproc; import com.yahoo.vespa.model.container.docproc.DocprocChains; @@ -109,7 +107,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> * normal compatibility concerns only applies to libraries using the URIs in * question, not contents served from the URIs themselves. */ - public static final String RESERVED_URI_PREFIX = "/reserved-for-internal-use"; + public static final String RESERVED_URI_PREFIX = "reserved-for-internal-use"; public static final String APPLICATION_STATUS_HANDLER_CLASS = "com.yahoo.container.handler.observability.ApplicationStatusHandler"; public static final String BINDINGS_OVERVIEW_HANDLER_CLASS = BindingsOverviewHandler.class.getName(); @@ -119,13 +117,13 @@ public abstract class ContainerCluster<CONTAINER extends Container> public static final String G1GC = "-XX:+UseG1GC -XX:MaxTenuringThreshold=15"; public static final String STATE_HANDLER_CLASS = "com.yahoo.container.jdisc.state.StateHandler"; - public static final BindingPattern STATE_HANDLER_BINDING_1 = SystemBindingPattern.fromHttpPath(StateHandler.STATE_API_ROOT); - public static final BindingPattern STATE_HANDLER_BINDING_2 = SystemBindingPattern.fromHttpPath(StateHandler.STATE_API_ROOT + "/*"); + public static final String STATE_HANDLER_BINDING_1 = "http://*" + StateHandler.STATE_API_ROOT; + public static final String STATE_HANDLER_BINDING_2 = STATE_HANDLER_BINDING_1 + "/*"; public static final String ROOT_HANDLER_PATH = "/"; - public static final BindingPattern ROOT_HANDLER_BINDING = SystemBindingPattern.fromHttpPath(ROOT_HANDLER_PATH); + public static final String ROOT_HANDLER_BINDING = "http://*" + ROOT_HANDLER_PATH; - public static final BindingPattern VIP_HANDLER_BINDING = SystemBindingPattern.fromHttpPath("/status.html"); + public static final String VIP_HANDLER_BINDING = "http://*/status.html"; private final String name; @@ -236,7 +234,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> Handler<AbstractConfigProducer<?>> statusHandler = new Handler<>( new ComponentModel(BundleInstantiationSpecification.getInternalHandlerSpecificationFromStrings( APPLICATION_STATUS_HANDLER_CLASS, null), null)); - statusHandler.addServerBindings(SystemBindingPattern.fromHttpPath("/ApplicationStatus")); + statusHandler.addServerBindings("http://*/ApplicationStatus"); addComponent(statusHandler); } @@ -311,7 +309,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> containers.forEach(this::addContainer); } - public void setProcessingChains(ProcessingChains processingChains, BindingPattern... serverBindings) { + public void setProcessingChains(ProcessingChains processingChains, String... serverBindings) { if (this.processingChains != null) throw new IllegalStateException("ProcessingChains should only be set once."); @@ -322,7 +320,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> processingChains, "com.yahoo.processing.handler.ProcessingHandler"); - for (BindingPattern binding: serverBindings) + for (String binding: serverBindings) processingHandler.addServerBindings(binding); addComponent(processingHandler); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java index 72f1921e6a2..6b4f8d486ec 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java @@ -7,7 +7,6 @@ import com.yahoo.searchdefinition.derived.RankProfileList; import com.yahoo.vespa.config.search.RankProfilesConfig; import com.yahoo.vespa.config.search.core.RankingConstantsConfig; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import java.util.List; import java.util.Objects; @@ -22,7 +21,7 @@ public class ContainerModelEvaluation implements RankProfilesConfig.Producer, Ra private final static String BUNDLE_NAME = "model-evaluation"; private final static String EVALUATOR_NAME = ModelsEvaluator.class.getName(); private final static String REST_HANDLER_NAME = "ai.vespa.models.handler.ModelsEvaluationHandler"; - private final static String REST_BINDING_PATH = "/model-evaluation/v1"; + private final static String REST_BINDING = "model-evaluation/v1"; /** Global rank profiles, aka models */ private final RankProfileList rankProfileList; @@ -49,9 +48,8 @@ public class ContainerModelEvaluation implements RankProfilesConfig.Producer, Ra public static Handler<?> getHandler() { Handler<?> handler = new Handler<>(new ComponentModel(REST_HANDLER_NAME, null, BUNDLE_NAME)); - handler.addServerBindings( - SystemBindingPattern.fromHttpPath(REST_BINDING_PATH), - SystemBindingPattern.fromHttpPath(REST_BINDING_PATH + "/*")); + handler.addServerBindings("http://*/" + REST_BINDING, + "http://*/" + REST_BINDING + "/*"); return handler; } 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 deleted file mode 100644 index c8b9d3293a7..00000000000 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/BindingPattern.java +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright Verizon Media. 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.Comparator; -import java.util.Objects; -import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * URI binding pattern used by filter and handler bindings. - * - * @author bjorncs - */ -public abstract class BindingPattern implements Comparable<BindingPattern> { - - private static final Pattern BINDING_PATTERN = - Pattern.compile("([^:]+)://([^:/]+)(:((\\*)|([0-9]+)))?(/.*)", Pattern.UNICODE_CASE | Pattern.CANON_EQ); - - public static final String WILDCARD_PATTERN = "*"; - - private final String scheme; - private final String host; - private final String port; - private final String path; - - protected BindingPattern( - String scheme, - String host, - String port, - String path) { - this.scheme = Objects.requireNonNull(scheme, "Scheme in binding must be specified"); - this.host = Objects.requireNonNull(host, "Host must be specified"); - this.port = port; - this.path = validatePath(path); - } - - protected BindingPattern(String binding) { - Matcher matcher = BINDING_PATTERN.matcher(binding); - if (!matcher.matches()) throw new IllegalArgumentException("Invalid binding: " + binding); - this.scheme = matcher.group(1); - this.host = matcher.group(2); - this.port = matcher.group(4); - this.path = matcher.group(7); - } - - private static String validatePath(String path) { - Objects.requireNonNull(path, "Path must be specified"); - if (!path.startsWith("/")) throw new IllegalArgumentException("Path must have '/' as prefix:" + path); - return path; - } - - public String scheme() { return scheme; } - public String host() { return host; } - public Optional<String> port() { return Optional.ofNullable(port); } - public String path() { return path; } - - public String patternString() { - StringBuilder builder = new StringBuilder(scheme).append("://").append(host); - if (port != null) { - 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()); } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - BindingPattern that = (BindingPattern) o; - return Objects.equals(scheme, that.scheme) && - Objects.equals(host, that.host) && - Objects.equals(port, that.port) && - Objects.equals(path, that.path); - } - - @Override public int hashCode() { return Objects.hash(scheme, host, port, path); } - - @Override - public int compareTo(BindingPattern o) { - return Comparator.comparing(BindingPattern::scheme) - .thenComparing(BindingPattern::host) - .thenComparing(pattern -> pattern.port().orElse(null)) - .thenComparing(BindingPattern::path) - .compare(this, o); - } -} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/DiscBindingsConfigGenerator.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/DiscBindingsConfigGenerator.java index 02face328d9..d7e393ee474 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/DiscBindingsConfigGenerator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/DiscBindingsConfigGenerator.java @@ -1,16 +1,13 @@ // Copyright 2017 Yahoo Holdings. 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.Collection; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; import static com.yahoo.container.jdisc.JdiscBindingsConfig.Handlers; -import static java.util.stream.Collectors.toList; /** * @author gjoranv + * @since 5.1.8 */ public class DiscBindingsConfigGenerator { @@ -29,11 +26,7 @@ public class DiscBindingsConfigGenerator { return Collections.singletonMap(handler.model.getComponentId().stringValue(), new Handlers.Builder() - .serverBindings(toStrings(handler.getServerBindings())) - .clientBindings(toStrings(handler.getClientBindings()))); - } - - private static Collection<String> toStrings(Collection<BindingPattern> bindings) { - return bindings.stream().map(BindingPattern::patternString).collect(toList()); + .serverBindings(handler.getServerBindings()) + .clientBindings(handler.getClientBindings())); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/FileStatusHandlerComponent.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/FileStatusHandlerComponent.java index 839594502c6..3d9a1b2e665 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/FileStatusHandlerComponent.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/FileStatusHandlerComponent.java @@ -15,7 +15,7 @@ public class FileStatusHandlerComponent extends Handler implements VipStatusConf private final String fileName; - public FileStatusHandlerComponent(String id, String fileName, BindingPattern... bindings) { + public FileStatusHandlerComponent(String id, String fileName, String... bindings) { super(new ComponentModel(id, CLASS, null, null)); this.fileName = fileName; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java index efee5c6a9a0..82484e07773 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java @@ -1,8 +1,9 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.container.component; -import com.yahoo.config.model.producer.AbstractConfigProducer; +import com.yahoo.container.bundle.BundleInstantiationSpecification; import com.yahoo.osgi.provider.model.ComponentModel; +import com.yahoo.config.model.producer.AbstractConfigProducer; import java.util.ArrayList; import java.util.Arrays; @@ -22,8 +23,8 @@ import java.util.Set; */ public class Handler<CHILD extends AbstractConfigProducer<?>> extends Component<CHILD, ComponentModel> { - private final Set<BindingPattern> serverBindings = new LinkedHashSet<>(); - private final List<BindingPattern> clientBindings = new ArrayList<>(); + private Set<String> serverBindings = new LinkedHashSet<>(); + private List<String> clientBindings = new ArrayList<>(); public Handler(ComponentModel model) { super(model); @@ -33,23 +34,27 @@ public class Handler<CHILD extends AbstractConfigProducer<?>> extends Component< return new Handler<>(new ComponentModel(className, null, null, null)); } - public void addServerBindings(BindingPattern... bindings) { + public static Handler<AbstractConfigProducer<?>> getVespaHandlerFromClassName(String className) { + return new Handler<>(new ComponentModel(BundleInstantiationSpecification.getInternalHandlerSpecificationFromStrings(className, null), null)); + } + + public void addServerBindings(String... bindings) { serverBindings.addAll(Arrays.asList(bindings)); } - public void removeServerBinding(BindingPattern binding) { + public void removeServerBinding(String binding) { serverBindings.remove(binding); } - public void addClientBindings(BindingPattern... bindings) { + public void addClientBindings(String... bindings) { clientBindings.addAll(Arrays.asList(bindings)); } - public final Set<BindingPattern> getServerBindings() { + public final Set<String> getServerBindings() { return Collections.unmodifiableSet(serverBindings); } - public final List<BindingPattern> getClientBindings() { + public final List<String> getClientBindings() { return Collections.unmodifiableList(clientBindings); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/component/SystemBindingPattern.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/SystemBindingPattern.java deleted file mode 100644 index 559651b3b4f..00000000000 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/SystemBindingPattern.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.container.component; - -/** - * A {@link BindingPattern} which is implicitly constructed by the model, e.g for built-in handlers and filter chains. - * - * @author bjorncs - */ -public class SystemBindingPattern extends BindingPattern { - - private SystemBindingPattern(String scheme, String host, String port, String path) { super(scheme, host, port, path); } - private SystemBindingPattern(String binding) { super(binding); } - - public static SystemBindingPattern fromHttpPath(String path) { return new SystemBindingPattern("http", "*", null, path);} - public static SystemBindingPattern fromPattern(String binding) { return new SystemBindingPattern(binding);} - - @Override - public String toString() { - return "SystemBindingPattern{" + - "scheme='" + scheme() + '\'' + - ", host='" + host() + '\'' + - ", port='" + port().orElse(null) + '\'' + - ", path='" + path() + '\'' + - '}'; - } -} 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 deleted file mode 100644 index 43f57fa0343..00000000000 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/component/UserBindingPattern.java +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.container.component; - -/** - * A {@link BindingPattern} which is constructed directly from a user provided 'binding' element from services.xml. - * - * @author bjorncs - */ -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); } - - public static UserBindingPattern fromHttpPath(String path) { return new UserBindingPattern("http", "*", null, path); } - public static UserBindingPattern fromPattern(String binding) { return new UserBindingPattern(binding); } - - @Override - public String toString() { - return "UserBindingPattern{" + - "scheme='" + scheme() + '\'' + - ", host='" + host() + '\'' + - ", port='" + port().orElse(null) + '\'' + - ", path='" + path() + '\'' + - '}'; - } -} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/ContainerDocproc.java b/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/ContainerDocproc.java index 82061a0425f..d4b4dcea78e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/ContainerDocproc.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/ContainerDocproc.java @@ -9,7 +9,6 @@ import com.yahoo.container.jdisc.config.SessionConfig; import com.yahoo.docproc.jdisc.messagebus.MbusRequestContext; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.component.ContainerSubsystem; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import java.util.HashMap; import java.util.Map; @@ -45,7 +44,7 @@ public class ContainerDocproc extends ContainerSubsystem<DocprocChains> private void addSource( final ContainerCluster cluster, final String name, final SessionConfig.Type.Enum type) { final MbusClient mbusClient = new MbusClient(name, type); - mbusClient.addClientBindings(SystemBindingPattern.fromPattern("mbus://*/" + mbusClient.getSessionName())); + mbusClient.addClientBindings("mbus://*/" + mbusClient.getSessionName()); cluster.addComponent(mbusClient); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java b/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java index 68dc2518c23..5d08a0a6998 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/docproc/DocprocChains.java @@ -7,7 +7,6 @@ import com.yahoo.container.jdisc.config.SessionConfig; import com.yahoo.vespa.model.container.ApplicationContainerCluster; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.component.Component; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import com.yahoo.vespa.model.container.component.chain.Chains; import com.yahoo.vespa.model.container.component.chain.ProcessingHandler; @@ -39,12 +38,12 @@ public class DocprocChains extends Chains<DocprocChain> { } private void addServerAndClientForChain(ApplicationContainerCluster cluster, DocprocChain docprocChain) { - docprocHandler.addServerBindings(SystemBindingPattern.fromPattern("mbus://*/" + docprocChain.getSessionName())); + docprocHandler.addServerBindings("mbus://*/" + docprocChain.getSessionName()); cluster.addMbusServer(ComponentId.fromString(docprocChain.getSessionName())); MbusClient client = new MbusClient(docprocChain.getSessionName(), SessionConfig.Type.INTERMEDIATE); - client.addClientBindings(SystemBindingPattern.fromPattern("mbus://*/" + client.getSessionName())); + client.addClientBindings("mbus://*/" + client.getSessionName()); addComponent(client); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/AccessControl.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/AccessControl.java index 87c6d41c80d..9676b8b1e4a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/AccessControl.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/AccessControl.java @@ -3,13 +3,12 @@ package com.yahoo.vespa.model.container.http; import com.yahoo.component.ComponentId; import com.yahoo.component.ComponentSpecification; +import com.yahoo.config.application.api.DeployLogger; import com.yahoo.vespa.model.container.ApplicationContainerCluster; import com.yahoo.vespa.model.container.ContainerCluster; -import com.yahoo.vespa.model.container.component.BindingPattern; import com.yahoo.vespa.model.container.component.FileStatusHandlerComponent; import com.yahoo.vespa.model.container.component.Handler; import com.yahoo.vespa.model.container.component.Servlet; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import java.util.ArrayList; import java.util.Collection; @@ -44,12 +43,14 @@ public final class AccessControl { private String domain; private boolean readEnabled = false; private boolean writeEnabled = true; - private final Set<BindingPattern> excludeBindings = new LinkedHashSet<>(); + private final Set<String> excludeBindings = new LinkedHashSet<>(); private Collection<Handler<?>> handlers = Collections.emptyList(); private Collection<Servlet> servlets = Collections.emptyList(); + private final DeployLogger logger; - public Builder(String domain) { + public Builder(String domain, DeployLogger logger) { this.domain = domain; + this.logger = logger; } public Builder readEnabled(boolean readEnabled) { @@ -62,7 +63,7 @@ public final class AccessControl { return this; } - public Builder excludeBinding(BindingPattern binding) { + public Builder excludeBinding(String binding) { this.excludeBindings.add(binding); return this; } @@ -75,32 +76,35 @@ public final class AccessControl { public AccessControl build() { return new AccessControl(domain, writeEnabled, readEnabled, - excludeBindings, servlets, handlers); + excludeBindings, servlets, handlers, logger); } } public final String domain; public final boolean readEnabled; public final boolean writeEnabled; - private final Set<BindingPattern> excludedBindings; + private final Set<String> excludedBindings; private final Collection<Handler<?>> handlers; private final Collection<Servlet> servlets; + private final DeployLogger logger; private AccessControl(String domain, boolean writeEnabled, boolean readEnabled, - Set<BindingPattern> excludedBindings, + Set<String> excludedBindings, Collection<Servlet> servlets, - Collection<Handler<?>> handlers) { + Collection<Handler<?>> handlers, + DeployLogger logger) { this.domain = domain; this.readEnabled = readEnabled; this.writeEnabled = writeEnabled; this.excludedBindings = Collections.unmodifiableSet(excludedBindings); this.handlers = handlers; this.servlets = servlets; + this.logger = logger; } - public List<FilterBinding> getBindings() { + public List<Binding> getBindings() { return Stream.concat(getHandlerBindings(), getServletBindings()) .collect(Collectors.toCollection(ArrayList::new)); } @@ -109,18 +113,18 @@ public final class AccessControl { return cluster.getHandlers().stream().anyMatch(AccessControl::handlerNeedsProtection); } - private Stream<FilterBinding> getHandlerBindings() { + private Stream<Binding> getHandlerBindings() { return handlers.stream() .filter(this::shouldHandlerBeProtected) .flatMap(handler -> handler.getServerBindings().stream()) - .map(binding -> accessControlBinding(binding)); + .map(binding -> accessControlBinding(binding, logger)); } - private Stream<FilterBinding> getServletBindings() { + private Stream<Binding> getServletBindings() { return servlets.stream() .filter(this::shouldServletBeProtected) .flatMap(AccessControl::servletBindings) - .map(binding -> accessControlBinding(binding)); + .map(binding -> accessControlBinding(binding, logger)); } private boolean shouldHandlerBeProtected(Handler<?> handler) { @@ -136,12 +140,12 @@ public final class AccessControl { return servletBindings(servlet).noneMatch(excludedBindings::contains); } - private static FilterBinding accessControlBinding(BindingPattern binding) { - return FilterBinding.create(new ComponentSpecification(ACCESS_CONTROL_CHAIN_ID.stringValue()), binding); + private static Binding accessControlBinding(String binding, DeployLogger logger) { + return Binding.create(new ComponentSpecification(ACCESS_CONTROL_CHAIN_ID.stringValue()), binding, logger); } - private static Stream<BindingPattern> servletBindings(Servlet servlet) { - return Stream.of(SystemBindingPattern.fromHttpPath("/" + servlet.bindingPath)); + private static Stream<String> servletBindings(Servlet servlet) { + return Stream.of("http://*/").map(protocol -> protocol + servlet.bindingPath); } private static boolean handlerNeedsProtection(Handler<?> handler) { @@ -149,7 +153,7 @@ public final class AccessControl { } private static boolean hasNonMbusBinding(Handler<?> handler) { - return handler.getServerBindings().stream().anyMatch(binding -> ! binding.scheme().equals("mbus")); + return handler.getServerBindings().stream().anyMatch(binding -> ! binding.startsWith("mbus")); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/Binding.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/Binding.java new file mode 100644 index 00000000000..28f4949f210 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/Binding.java @@ -0,0 +1,39 @@ +// 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.container.http; + +import com.yahoo.component.ComponentSpecification; +import com.yahoo.config.application.api.DeployLogger; + +import java.util.logging.Level; + +/** + * @author bjorncs + */ +public class Binding { + + private final ComponentSpecification filterId; + private final String binding; + + private Binding(ComponentSpecification filterId, String binding) { + this.filterId = filterId; + this.binding = binding; + } + + public static Binding create(ComponentSpecification filterId, String binding, DeployLogger logger) { + if (binding.startsWith("https://")) { + logger.log(Level.WARNING, String.format("For binding '%s' on '%s': 'https' bindings are deprecated, " + + "use 'http' instead to bind to both http and https traffic.", + binding, filterId)); + } + return new Binding(filterId, binding); + } + + public ComponentSpecification filterId() { + return filterId; + } + + public String binding() { + return binding; + } + +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/FilterBinding.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/FilterBinding.java deleted file mode 100644 index 8ae06b7cebd..00000000000 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/FilterBinding.java +++ /dev/null @@ -1,32 +0,0 @@ -// 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.container.http; - -import com.yahoo.component.ComponentSpecification; -import com.yahoo.vespa.model.container.component.BindingPattern; - -/** - * @author bjorncs - */ -public class FilterBinding { - - private final ComponentSpecification filterId; - private final BindingPattern binding; - - private FilterBinding(ComponentSpecification filterId, BindingPattern binding) { - this.filterId = filterId; - this.binding = binding; - } - - public static FilterBinding create(ComponentSpecification filterId, BindingPattern binding) { - return new FilterBinding(filterId, binding); - } - - public ComponentSpecification filterId() { - return filterId; - } - - public BindingPattern binding() { - return binding; - } - -} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/Http.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/Http.java index 3155669527a..0fcf7b2d06c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/Http.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/Http.java @@ -21,7 +21,7 @@ import java.util.concurrent.CopyOnWriteArrayList; public class Http extends AbstractConfigProducer<AbstractConfigProducer<?>> implements ServerConfig.Producer { private final FilterChains filterChains; - private final List<FilterBinding> bindings = new CopyOnWriteArrayList<>(); + private final List<Binding> bindings = new CopyOnWriteArrayList<>(); private volatile JettyHttpServer httpServer; private volatile AccessControl accessControl; @@ -64,7 +64,7 @@ public class Http extends AbstractConfigProducer<AbstractConfigProducer<?>> impl setHttpServer(null); } - public List<FilterBinding> getBindings() { + public List<Binding> getBindings() { return bindings; } @@ -74,16 +74,16 @@ public class Http extends AbstractConfigProducer<AbstractConfigProducer<?>> impl @Override public void getConfig(ServerConfig.Builder builder) { - for (FilterBinding binding : bindings) { + for (Binding binding : bindings) { builder.filter(new ServerConfig.Filter.Builder() .id(binding.filterId().stringValue()) - .binding(binding.binding().patternString())); + .binding(binding.binding())); } } @Override public void validate() { - if (((Collection<FilterBinding>) bindings).isEmpty()) return; + if (((Collection<Binding>) bindings).isEmpty()) return; if (filterChains == null) throw new IllegalArgumentException("Null FilterChains are not allowed when there are filter bindings"); @@ -91,7 +91,7 @@ public class Http extends AbstractConfigProducer<AbstractConfigProducer<?>> impl ComponentRegistry<ChainedComponent<?>> filters = filterChains.componentsRegistry(); ComponentRegistry<Chain<Filter>> chains = filterChains.allChains(); - for (FilterBinding binding: bindings) { + for (Binding binding: bindings) { if (filters.getComponent(binding.filterId()) == null && chains.getComponent(binding.filterId()) == null) throw new RuntimeException("Can't find filter " + binding.filterId() + " for binding " + binding.binding()); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java index 9d5fead7dfb..bfde9b9add1 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/http/xml/HttpBuilder.java @@ -13,10 +13,9 @@ import com.yahoo.vespa.model.builder.xml.dom.ModelElement; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.container.ApplicationContainerCluster; import com.yahoo.vespa.model.container.Container; -import com.yahoo.vespa.model.container.component.UserBindingPattern; import com.yahoo.vespa.model.container.component.chain.Chain; import com.yahoo.vespa.model.container.http.AccessControl; -import com.yahoo.vespa.model.container.http.FilterBinding; +import com.yahoo.vespa.model.container.http.Binding; import com.yahoo.vespa.model.container.http.FilterChains; import com.yahoo.vespa.model.container.http.Http; import org.w3c.dom.Element; @@ -37,13 +36,13 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Http> @Override protected Http doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element spec) { FilterChains filterChains; - List<FilterBinding> bindings = new ArrayList<>(); + List<Binding> bindings = new ArrayList<>(); AccessControl accessControl = null; Element filteringElem = XML.getChild(spec, "filtering"); if (filteringElem != null) { filterChains = new FilterChainsBuilder().build(deployState, ancestor, filteringElem); - bindings = readFilterBindings(filteringElem); + bindings = readFilterBindings(filteringElem, deployState.getDeployLogger()); Element accessControlElem = XML.getChild(filteringElem, "access-control"); if (accessControlElem != null) { @@ -64,7 +63,7 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Http> private AccessControl buildAccessControl(DeployState deployState, AbstractConfigProducer ancestor, Element accessControlElem) { AthenzDomain domain = getAccessControlDomain(deployState, accessControlElem); - AccessControl.Builder builder = new AccessControl.Builder(domain.value()); + AccessControl.Builder builder = new AccessControl.Builder(domain.value(), deployState.getDeployLogger()); getContainerCluster(ancestor).ifPresent(builder::setHandlers); @@ -76,7 +75,7 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Http> Element excludeElem = XML.getChild(accessControlElem, "exclude"); if (excludeElem != null) { XML.getChildren(excludeElem, "binding").stream() - .map(xml -> UserBindingPattern.fromPattern(XML.getValue(xml))) + .map(XML::getValue) .forEach(builder::excludeBinding); } return builder.build(); @@ -114,8 +113,8 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Http> return Optional.of((ApplicationContainerCluster) currentProducer); } - private List<FilterBinding> readFilterBindings(Element filteringSpec) { - List<FilterBinding> result = new ArrayList<>(); + private List<Binding> readFilterBindings(Element filteringSpec, DeployLogger logger) { + List<Binding> result = new ArrayList<>(); for (Element child: XML.getChildren(filteringSpec)) { String tagName = child.getTagName(); @@ -124,7 +123,7 @@ public class HttpBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Http> for (Element bindingSpec: XML.getChildren(child, "binding")) { String binding = XML.getValue(bindingSpec); - result.add(FilterBinding.create(chainId, UserBindingPattern.fromPattern(binding))); + result.add(Binding.create(chainId, binding, logger)); } } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java index f6b24bf9635..4fd79a4f335 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java @@ -2,8 +2,6 @@ package com.yahoo.vespa.model.container.processing; import com.yahoo.config.model.producer.AbstractConfigProducer; -import com.yahoo.vespa.model.container.component.BindingPattern; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; import com.yahoo.vespa.model.container.component.chain.Chains; /** @@ -13,7 +11,7 @@ import com.yahoo.vespa.model.container.component.chain.Chains; */ public class ProcessingChains extends Chains<ProcessingChain> { - public static final BindingPattern[] defaultBindings = new BindingPattern[]{SystemBindingPattern.fromHttpPath("/processing/*")}; + public static final String[] defaultBindings = new String[] {"http://*/processing/*"}; public ProcessingChains(AbstractConfigProducer parent, String subId) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/GUIHandler.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/GUIHandler.java index f01bbcd3951..1e717f89819 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/GUIHandler.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/GUIHandler.java @@ -14,7 +14,7 @@ public class GUIHandler extends Handler<AbstractConfigProducer<?>> { public static final String BUNDLE = "container-search-gui"; public static final String CLASS = "com.yahoo.search.query.gui.GUIHandler"; - public static final String BINDING_PATH = "/querybuilder/*"; + public static final String BINDING = "*/querybuilder/*"; public GUIHandler() { super(new ComponentModel(bundleSpec(CLASS, BUNDLE))); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index d11e0f9a891..41e092c7ea5 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -29,6 +29,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; +import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.search.rendering.RendererRegistry; import com.yahoo.searchdefinition.derived.RankProfileList; @@ -56,11 +57,9 @@ import com.yahoo.vespa.model.container.ContainerModel; import com.yahoo.vespa.model.container.ContainerModelEvaluation; import com.yahoo.vespa.model.container.IdentityProvider; import com.yahoo.vespa.model.container.SecretStore; -import com.yahoo.vespa.model.container.component.BindingPattern; +import com.yahoo.vespa.model.container.component.Component; import com.yahoo.vespa.model.container.component.FileStatusHandlerComponent; import com.yahoo.vespa.model.container.component.Handler; -import com.yahoo.vespa.model.container.component.SystemBindingPattern; -import com.yahoo.vespa.model.container.component.UserBindingPattern; import com.yahoo.vespa.model.container.component.chain.Chain; import com.yahoo.vespa.model.container.component.chain.ProcessingHandler; import com.yahoo.vespa.model.container.docproc.ContainerDocproc; @@ -114,7 +113,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { private static final String ENVIRONMENT_VARIABLES_ELEMENT = "environment-variables"; static final String SEARCH_HANDLER_CLASS = com.yahoo.search.handler.SearchHandler.class.getName(); - static final BindingPattern SEARCH_HANDLER_BINDING = SystemBindingPattern.fromHttpPath("/search/*"); + static final String SEARCH_HANDLER_BINDING = "http://*/search/*"; public enum Networking { disable, enable } @@ -279,10 +278,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { String name = "status.html"; Optional<String> statusFile = Optional.ofNullable(System.getenv(HOSTED_VESPA_STATUS_FILE_SETTING)); cluster.addComponent( - new FileStatusHandlerComponent( - name + "-status-handler", - statusFile.orElse(HOSTED_VESPA_STATUS_FILE), - SystemBindingPattern.fromHttpPath("/" + name))); + new FileStatusHandlerComponent(name + "-status-handler", statusFile.orElse(HOSTED_VESPA_STATUS_FILE), + "http://*/" + name)); } else { cluster.addVipHandler(); } @@ -372,7 +369,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { AthenzDomain tenantDomain = deployState.getProperties().athenzDomain().orElse(null); if (tenantDomain == null) return; // tenant domain not present, cannot add access control. this should eventually be a failure. AccessControl accessControl = - new AccessControl.Builder(tenantDomain.value()) + new AccessControl.Builder(tenantDomain.value(), deployState.getDeployLogger()) .setHandlers(cluster) .readEnabled(false) .writeEnabled(false) @@ -798,8 +795,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { ProcessingHandler<SearchChains> searchHandler = new ProcessingHandler<>(cluster.getSearch().getChains(), "com.yahoo.search.handler.SearchHandler"); - BindingPattern[] defaultBindings = {SEARCH_HANDLER_BINDING}; - for (BindingPattern binding: serverBindings(searchElement, defaultBindings)) { + String[] defaultBindings = {SEARCH_HANDLER_BINDING}; + for (String binding: serverBindings(searchElement, defaultBindings)) { searchHandler.addServerBindings(binding); } @@ -808,12 +805,12 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { private void addGUIHandler(ApplicationContainerCluster cluster) { Handler<?> guiHandler = new GUIHandler(); - guiHandler.addServerBindings(SystemBindingPattern.fromHttpPath(GUIHandler.BINDING_PATH)); + guiHandler.addServerBindings("http://"+GUIHandler.BINDING); cluster.addComponent(guiHandler); } - private BindingPattern[] serverBindings(Element searchElement, BindingPattern... defaultBindings) { + private String[] serverBindings(Element searchElement, String... defaultBindings) { List<Element> bindings = XML.getChildren(searchElement, "binding"); if (bindings.isEmpty()) return defaultBindings; @@ -821,16 +818,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { return toBindingList(bindings); } - private BindingPattern[] toBindingList(List<Element> bindingElements) { - List<BindingPattern> result = new ArrayList<>(); + private String[] toBindingList(List<Element> bindingElements) { + List<String> result = new ArrayList<>(); for (Element element: bindingElements) { String text = element.getTextContent().trim(); if (!text.isEmpty()) - result.add(UserBindingPattern.fromPattern(text)); + result.add(text); } - return result.toArray(BindingPattern[]::new); + return result.toArray(new String[result.size()]); } private ContainerDocumentApi buildDocumentApi(ApplicationContainerCluster cluster, Element spec) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java index 61464799812..ae74dbdb4a7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/DocumentApiOptionsBuilder.java @@ -6,17 +6,19 @@ import com.yahoo.vespa.model.clients.ContainerDocumentApi; import org.w3c.dom.Element; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.logging.Logger; /** * @author Einar M R Rosenvinge + * @since 5.1.11 */ public class DocumentApiOptionsBuilder { private static final Logger log = Logger.getLogger(DocumentApiOptionsBuilder.class.getName()); - + private static final String[] DEFAULT_BINDINGS = {"http://*/"}; public static ContainerDocumentApi.Options build(Element spec) { return new ContainerDocumentApi.Options(getBindings(spec)); @@ -25,7 +27,8 @@ public class DocumentApiOptionsBuilder { private static List<String> getBindings(Element spec) { Collection<Element> bindingElems = XML.getChildren(spec, "binding"); if (bindingElems.isEmpty()) - return List.of(); + return Arrays.asList(DEFAULT_BINDINGS); + List<String> bindings = new ArrayList<>(); for (Element e :bindingElems) { String binding = getBinding(e); |