aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2020-03-13 15:20:18 +0100
committergjoranv <gv@verizonmedia.com>2020-03-13 23:47:35 +0100
commitcd9235879bf6c5df5c679afe6982d1649af8f2d1 (patch)
treed5e262935615522b6b7328ddc1322cf671b140d8 /config-model
parentec679bcaaf11279f7aee52583538fe579ecdd4fe (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.java33
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/component/Handler.java4
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));
}