diff options
author | gjoranv <gv@verizonmedia.com> | 2020-03-13 15:20:18 +0100 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2020-03-13 23:47:35 +0100 |
commit | cd9235879bf6c5df5c679afe6982d1649af8f2d1 (patch) | |
tree | d5e262935615522b6b7328ddc1322cf671b140d8 /config-model | |
parent | ec679bcaaf11279f7aee52583538fe579ecdd4fe (diff) |
Allow user handlers to take over bindings from builtin handlers.
- Fail if a user handler tries take a reserved binding.
Diffstat (limited to 'config-model')
-rw-r--r-- | config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomHandlerBuilder.java | 33 | ||||
-rw-r--r-- | config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java | 4 |
2 files changed, 36 insertions, 1 deletions
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 d531569d287..45a044a2aa8 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 @@ -1,6 +1,7 @@ // 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.builder.xml.dom; +import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.container.bundle.BundleInstantiationSpecification; @@ -12,11 +13,16 @@ import com.yahoo.vespa.model.container.component.Handler; import com.yahoo.vespa.model.container.xml.BundleInstantiationSpecificationBuilder; import org.w3c.dom.Element; +import java.util.Set; +import static java.util.logging.Level.INFO; + /** * @author gjoranv */ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder<Handler> { + private static final Set<String> reservedBindings = Set.of(); + private final ApplicationContainerCluster cluster; public DomHandlerBuilder(ApplicationContainerCluster cluster) { @@ -28,7 +34,7 @@ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder< Handler<? super Component<?, ?>> handler = createHandler(handlerElement); for (Element binding : XML.getChildren(handlerElement, "binding")) - handler.addServerBindings(XML.getValue(binding)); + addServerBinding(handler, XML.getValue(binding), deployState.getDeployLogger()); for (Element clientBinding : XML.getChildren(handlerElement, "clientBinding")) handler.addClientBindings(XML.getValue(clientBinding)); @@ -43,4 +49,29 @@ public class DomHandlerBuilder extends VespaDomBuilder.DomConfigProducerBuilder< return new Handler<>(new ComponentModel(bundleSpec)); } + private void addServerBinding(Handler<? super Component<?, ?>> handler, String binding, DeployLogger log) { + throwIfBindingIsReserved(binding, handler); + handler.addServerBindings(binding); + removeExistingServerBinding(binding, handler, log); + } + + private void throwIfBindingIsReserved(String binding, Handler<?> newHandler) { + for (var reserved : reservedBindings) { + 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(String binding, Handler<?> newHandler, DeployLogger log) { + for (var handler : cluster.getHandlers()) { + 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/container/component/Handler.java b/config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java index fd1a03f13a8..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 @@ -42,6 +42,10 @@ public class Handler<CHILD extends AbstractConfigProducer<?>> extends Component< serverBindings.addAll(Arrays.asList(bindings)); } + public void removeServerBinding(String binding) { + serverBindings.remove(binding); + } + public void addClientBindings(String... bindings) { clientBindings.addAll(Arrays.asList(bindings)); } |