diff options
Diffstat (limited to 'node-repository')
2 files changed, 45 insertions, 10 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java index 93f0b75dcdf..e2b70608d58 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java @@ -1,7 +1,6 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.maintenance; -import com.yahoo.config.provision.ClusterSpec; import com.yahoo.log.LogLevel; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; @@ -131,15 +130,7 @@ public class LoadBalancerExpirer extends Maintainer { } private List<Node> allocatedNodes(LoadBalancerId loadBalancer) { - return nodeRepository().list() - .owner(loadBalancer.application()) - .cluster(loadBalancer.cluster()) - // TODO(mpolden): Remove after March 2020. This ignores nodes in combined clusters so - // that inactive load balancers for combined clusters with wrong ID are - // eventually removed. - .filter(node -> node.allocation().isPresent() && - node.allocation().get().membership().cluster().type() != ClusterSpec.Type.combined) - .asList(); + return nodeRepository().list().owner(loadBalancer.application()).cluster(loadBalancer.cluster()).asList(); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index 1ab94e852ba..a0f0cd26f59 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -671,6 +671,50 @@ public class ProvisioningTest { assertEquals(version2, node.allocation().get().membership().cluster().vespaVersion())); } + @Test + public void change_to_and_from_combined_cluster_does_not_change_node_allocation() { + var tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); + var application = tester.makeApplicationId(); + + tester.makeReadyNodes(4, defaultResources); + + // Application allocates two content nodes initially, with cluster type content + ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, + ClusterSpec.Id.from("music"), + Version.fromString("1.2.3"), + false); + var initalNodes = tester.activate(application, tester.prepare(application, cluster, + Capacity.fromCount(2, defaultResources, false, false), + 1)); + + // Application is redeployed with cluster type combined + cluster = ClusterSpec.request(ClusterSpec.Type.combined, + ClusterSpec.Id.from("music"), + Version.fromString("1.2.3"), + false); + var newNodes = tester.activate(application, tester.prepare(application, cluster, + Capacity.fromCount(2, defaultResources, false, false), + 1)); + + assertEquals("Node allocation remains the same", initalNodes, newNodes); + assertEquals("Cluster type is updated", + Set.of(ClusterSpec.Type.combined), + newNodes.stream().map(n -> n.membership().get().cluster().type()).collect(Collectors.toSet())); + + // Application is redeployed with cluster type content again + cluster = ClusterSpec.request(ClusterSpec.Type.content, + ClusterSpec.Id.from("music"), + Version.fromString("1.2.3"), + false); + newNodes = tester.activate(application, tester.prepare(application, cluster, + Capacity.fromCount(2, defaultResources, false, false), + 1)); + assertEquals("Node allocation remains the same", initalNodes, newNodes); + assertEquals("Cluster type is updated", + Set.of(ClusterSpec.Type.content), + newNodes.stream().map(n -> n.membership().get().cluster().type()).collect(Collectors.toSet())); + } + private SystemState prepare(ApplicationId application, int container0Size, int container1Size, int content0Size, int content1Size, NodeResources flavor, ProvisioningTester tester) { return prepare(application, container0Size, container1Size, content0Size, content1Size, flavor, |