summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-12-02 19:22:02 +0100
committerMartin Polden <mpolden@mpolden.no>2020-12-02 19:26:17 +0100
commit079a183dfca7a290cf697e4c7ee2d479e04f4d39 (patch)
tree7d29c21a54003ac82f53ee06739ea07c3da0c9d2 /controller-server
parent99bcfff52bf4982e214e31a75cab31651b03490c (diff)
Handle hosts registered under a different hostname
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdater.java19
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdaterTest.java35
2 files changed, 46 insertions, 8 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdater.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdater.java
index b703607020b..4065645ee57 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdater.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdater.java
@@ -5,6 +5,7 @@ import com.yahoo.config.provision.SystemName;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository;
+import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService;
import com.yahoo.vespa.hosted.controller.api.integration.entity.NodeEntity;
import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeRepositoryNode;
@@ -13,6 +14,8 @@ import java.util.EnumSet;
import java.util.Map;
import java.util.function.Function;
import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -22,7 +25,8 @@ import java.util.stream.Collectors;
*/
public class HostSwitchUpdater extends ControllerMaintainer {
- private static final Logger log = Logger.getLogger(HostSwitchUpdater.class.getName());
+ private static final Logger LOG = Logger.getLogger(HostSwitchUpdater.class.getName());
+ private static final Pattern HOST_PATTERN = Pattern.compile("^(proxy|cfg|controller)host(.+)$");
private final NodeRepository nodeRepository;
@@ -40,7 +44,7 @@ public class HostSwitchUpdater extends ControllerMaintainer {
try {
for (var zone : controller().zoneRegistry().zones().controllerUpgraded().all().ids()) {
for (var node : nodeRepository.list(zone)) {
- NodeEntity nodeEntity = nodeEntities.get(node.hostname().value());
+ NodeEntity nodeEntity = nodeEntities.get(registeredHostnameOf(node));
if (!shouldUpdate(node, nodeEntity)) continue;
NodeRepositoryNode updatedNode = new NodeRepositoryNode();
@@ -51,12 +55,21 @@ public class HostSwitchUpdater extends ControllerMaintainer {
}
} finally {
if (nodesUpdated > 0) {
- log.info("Updated switch hostname for " + nodesUpdated + " node(s)");
+ LOG.info("Updated switch hostname for " + nodesUpdated + " node(s)");
}
}
return true;
}
+ /** Returns the hostname that given host is registered under in the {@link EntityService} */
+ private static String registeredHostnameOf(Node host) {
+ String hostname = host.hostname().value();
+ if (!host.type().isHost()) return hostname;
+ Matcher matcher = HOST_PATTERN.matcher(hostname);
+ if (!matcher.matches()) return hostname;
+ return matcher.replaceFirst("$1$2");
+ }
+
private static boolean shouldUpdate(Node node, NodeEntity nodeEntity) {
if (nodeEntity == null) return false;
if (nodeEntity.switchHostname().isEmpty()) return false;
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdaterTest.java
index d87eb69b6f7..f7ff52a54ad 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdaterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostSwitchUpdaterTest.java
@@ -1,6 +1,9 @@
// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.maintenance;
+import com.yahoo.config.provision.HostName;
+import com.yahoo.config.provision.NodeType;
+import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.ControllerTester;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.entity.NodeEntity;
@@ -9,7 +12,6 @@ import org.junit.Test;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Supplier;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -51,14 +53,33 @@ public class HostSwitchUpdaterTest {
// Host is updated
tester.serviceRegistry().configServer().nodeRepository().allowPatching(true);
maintainer.maintain();
- Supplier<Node> updatedHost = () -> allNodes(tester).stream().filter(node -> node.hostname().equals(host.hostname())).findFirst().get();
- assertEquals(newSwitch, updatedHost.get().switchHostname().get());
+ assertEquals(newSwitch, getNode(host.hostname(), tester).switchHostname().get());
// Host keeps old switch hostname if removed from the node entity
nodeEntity = new NodeEntity(host.hostname().value(), "", "", "");
tester.serviceRegistry().entityService().addNodeEntity(nodeEntity);
maintainer.maintain();
- assertEquals(newSwitch, updatedHost.get().switchHostname().get());
+ assertEquals(newSwitch, getNode(host.hostname(), tester).switchHostname().get());
+
+ // Updates node registered under a different hostname
+ ZoneId zone = tester.zoneRegistry().zones().controllerUpgraded().all().ids().get(0);
+ String hostnameSuffix = ".prod." + zone.value();
+ Node configHost = new Node.Builder().hostname(HostName.from("cfghost3" + hostnameSuffix))
+ .type(NodeType.confighost)
+ .build();
+ tester.serviceRegistry().configServer().nodeRepository().putNodes(zone, configHost);
+ String switchHostname = switchHostname(configHost);
+ NodeEntity configNodeEntity = new NodeEntity("cfg3" + hostnameSuffix, "", "", switchHostname);
+ tester.serviceRegistry().entityService().addNodeEntity(configNodeEntity);
+ maintainer.maintain();
+ assertEquals(switchHostname, getNode(configHost.hostname(), tester).switchHostname().get());
+ }
+
+ private static Node getNode(HostName hostname, ControllerTester tester) {
+ return allNodes(tester).stream()
+ .filter(node -> node.hostname().equals(hostname))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("No such node: " + hostname));
}
private static List<Node> allNodes(ControllerTester tester) {
@@ -69,10 +90,14 @@ public class HostSwitchUpdaterTest {
return nodes;
}
+ private static String switchHostname(Node node) {
+ return "tor-" + node.hostname().value();
+ }
+
private static void addNodeEntities(ControllerTester tester) {
for (var node : allNodes(tester)) {
if (!node.type().isHost()) continue;
- NodeEntity nodeEntity = new NodeEntity(node.hostname().value(), "", "", "tor-" + node.hostname().value());
+ NodeEntity nodeEntity = new NodeEntity(node.hostname().value(), "", "", switchHostname(node));
tester.serviceRegistry().entityService().addNodeEntity(nodeEntity);
}
}