diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-12-02 19:22:02 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-12-02 19:26:17 +0100 |
commit | 079a183dfca7a290cf697e4c7ee2d479e04f4d39 (patch) | |
tree | 7d29c21a54003ac82f53ee06739ea07c3da0c9d2 /controller-server | |
parent | 99bcfff52bf4982e214e31a75cab31651b03490c (diff) |
Handle hosts registered under a different hostname
Diffstat (limited to 'controller-server')
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); } } |