diff options
Diffstat (limited to 'config-model/src/test/java/com/yahoo/config/model/provision')
4 files changed, 220 insertions, 161 deletions
diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/HostSpecTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/HostSpecTest.java index 810e2c643f3..e678aaa673a 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/HostSpecTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/HostSpecTest.java @@ -2,15 +2,15 @@ package com.yahoo.config.model.provision; import com.yahoo.config.provision.HostSpec; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; /** * @author Ulf Lilleengen @@ -18,31 +18,31 @@ import static org.junit.Assert.assertTrue; public class HostSpecTest { @Test - public void testEquals() { + void testEquals() { HostSpec h1 = new HostSpec("foo", List.of(), Optional.empty()); HostSpec h2 = new HostSpec("foo", List.of(), Optional.empty()); HostSpec h3 = new HostSpec("foo", List.of("my", "alias"), Optional.empty()); HostSpec h4 = new HostSpec("bar", List.of(), Optional.empty()); - assertTrue(h1.equals(h1)); - assertTrue(h1.equals(h2)); - assertTrue(h1.equals(h3)); - assertFalse(h1.equals(h4)); - - assertTrue(h2.equals(h1)); - assertTrue(h2.equals(h2)); - assertTrue(h2.equals(h3)); - assertFalse(h2.equals(h4)); - - assertTrue(h3.equals(h1)); - assertTrue(h3.equals(h2)); - assertTrue(h3.equals(h3)); - assertFalse(h3.equals(h4)); - - assertFalse(h4.equals(h1)); - assertFalse(h4.equals(h2)); - assertFalse(h4.equals(h3)); - assertTrue(h4.equals(h4)); + assertEquals(h1, h1); + assertEquals(h1, h2); + assertEquals(h1, h3); + assertNotEquals(h1, h4); + + assertEquals(h2, h1); + assertEquals(h2, h2); + assertEquals(h2, h3); + assertNotEquals(h2, h4); + + assertEquals(h3, h1); + assertEquals(h3, h2); + assertEquals(h3, h3); + assertNotEquals(h3, h4); + + assertNotEquals(h4, h1); + assertNotEquals(h4, h2); + assertNotEquals(h4, h3); + assertEquals(h4, h4); } } diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java index 558e61fc1c2..05b8681b5fa 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/HostsXmlProvisionerTest.java @@ -3,7 +3,7 @@ package com.yahoo.config.model.provision; import com.yahoo.config.provision.HostSpec; import com.yahoo.vespa.model.container.Container; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.StringReader; import java.util.ArrayList; @@ -15,8 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; /** * @author hmusum @@ -46,7 +45,7 @@ public class HostsXmlProvisionerTest { "</hosts>"; @Test - public void require_basic_works() { + void require_basic_works() { HostsXmlProvisioner hostProvisioner = createProvisioner(threeHosts); // 4 services, 2 host aliases, mapping to 2 host. @@ -71,14 +70,16 @@ public class HostsXmlProvisionerTest { assertEquals(3, map.size()); assertCorrectNumberOfHosts(map, 3); assertTrue(map.keySet().containsAll(aliases)); - + assertEquals("", System.getProperty("zookeeper.vespa.clients")); } - @Test(expected = IllegalArgumentException.class) - public void require_exception_when_unknown_hosts_alias() { - HostsXmlProvisioner hostProvisioner = createProvisioner(oneHost); - hostProvisioner.allocateHost("unknown"); + @Test + void require_exception_when_unknown_hosts_alias() { + assertThrows(IllegalArgumentException.class, () -> { + HostsXmlProvisioner hostProvisioner = createProvisioner(oneHost); + hostProvisioner.allocateHost("unknown"); + }); } private void assertCorrectNumberOfHosts(Map<String, HostSpec> hostToServiceMap, int expectedHostCount) { @@ -97,7 +98,7 @@ public class HostsXmlProvisionerTest { return createAliases(new ArrayList<>()); } - // Admin services on node1, qrserver on node2 + additional specs + // Admin services on node1, container on node2 + additional specs private List<String> createAliases(Collection<String> additionalAliases) { ArrayList<String> aliases = new ArrayList<>(); aliases.add("node1"); @@ -117,7 +118,7 @@ public class HostsXmlProvisionerTest { } @Test - public void require_singlenode_HostAlias_is_used_if_hosts_xml() { + void require_singlenode_HostAlias_is_used_if_hosts_xml() { HostsXmlProvisioner hostProvisioner = createProvisioner(oneHost); HostSpec hostSpec = hostProvisioner.allocateHost(Container.SINGLENODE_CONTAINER_SERVICESPEC); assertEquals("test1.yahoo.com", hostSpec.hostname()); diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java index 5e56efc4460..30b848da7f1 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java @@ -4,6 +4,7 @@ package com.yahoo.config.model.provision; import com.yahoo.cloud.config.ZookeeperServerConfig; import com.yahoo.cloud.config.log.LogdConfig; import com.yahoo.config.application.api.ApplicationPackage; +import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.api.container.ContainerServiceType; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; @@ -37,14 +38,16 @@ import com.yahoo.vespa.model.search.SearchNode; import com.yahoo.vespa.model.test.VespaModelTester; import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithMockPkg; import com.yahoo.yolean.Exceptions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.StringReader; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Function; +import java.util.logging.Level; import java.util.stream.Collectors; import static com.yahoo.config.model.test.TestUtil.joinLines; @@ -55,12 +58,13 @@ import static com.yahoo.vespa.defaults.Defaults.getDefaults; import static com.yahoo.vespa.model.search.NodeResourcesTuning.GB; import static com.yahoo.vespa.model.search.NodeResourcesTuning.reservedMemoryGb; import static com.yahoo.vespa.model.test.utils.ApplicationPackageUtils.generateSchemas; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; /** * Test cases for provisioning nodes to entire Vespa models. @@ -217,10 +221,10 @@ public class ModelProvisioningTest { tester.addHosts(8); VespaModel model = tester.createModel(xmlWithNodes, true); - assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); - assertEquals("Nodes in container1", 1, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Nodes in cluster without ID", 2, model.getContentClusters().get("content").getRootGroup().getNodes().size()); - assertEquals("Heap size for container", 70, physicalMemoryPercentage(model.getContainerClusters().get("container1"))); + assertEquals(2, model.getContentClusters().get("content1").getRootGroup().getNodes().size(), "Nodes in content1"); + assertEquals(1, model.getContainerClusters().get("container1").getContainers().size(), "Nodes in container1"); + assertEquals(2, model.getContentClusters().get("content").getRootGroup().getNodes().size(), "Nodes in cluster without ID"); + assertEquals(70, physicalMemoryPercentage(model.getContainerClusters().get("container1")), "Heap size for container"); assertProvisioned(2, ClusterSpec.Id.from("content1"), ClusterSpec.Type.content, model); assertProvisioned(1, ClusterSpec.Id.from("container1"), ClusterSpec.Type.container, model); assertProvisioned(2, ClusterSpec.Id.from("content"), ClusterSpec.Type.content, model); @@ -268,16 +272,19 @@ public class ModelProvisioningTest { "</services>"; VespaModelTester tester = new VespaModelTester(); tester.addHosts(5); - VespaModel model = tester.createModel(xmlWithNodes, true); - assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); - assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Heap size is lowered with combined clusters", - 18, physicalMemoryPercentage(model.getContainerClusters().get("container1"))); - assertEquals("Memory for proton is lowered to account for the jvm heap", - (long) ((3 - reservedMemoryGb) * (Math.pow(1024, 3)) * (1 - 0.18)), protonMemorySize(model.getContentClusters() - .get("content1"))); + TestLogger logger = new TestLogger(); + VespaModel model = tester.createModel(xmlWithNodes, true, new DeployState.Builder().deployLogger(logger)); + assertEquals(2, model.getContentClusters().get("content1").getRootGroup().getNodes().size(), "Nodes in content1"); + assertEquals(2, model.getContainerClusters().get("container1").getContainers().size(), "Nodes in container1"); + assertEquals(18, physicalMemoryPercentage(model.getContainerClusters().get("container1")), "Heap size is lowered with combined clusters"); + assertEquals((long) ((3 - reservedMemoryGb) * (Math.pow(1024, 3)) * (1 - 0.18)), protonMemorySize(model.getContentClusters() + .get("content1")), "Memory for proton is lowered to account for the jvm heap"); assertProvisioned(0, ClusterSpec.Id.from("container1"), ClusterSpec.Type.container, model); assertProvisioned(2, ClusterSpec.Id.from("content1"), ClusterSpec.Id.from("container1"), ClusterSpec.Type.combined, model); + assertEquals(1, logger.msgs().size()); + assertEquals("Declaring combined cluster with <nodes of=\"...\"> is deprecated without replacement, " + + "and the feature will be removed in Vespa 9. Use separate container and content clusters instead", + logger.msgs().get(0).message); } @Test @@ -304,13 +311,11 @@ public class ModelProvisioningTest { VespaModelTester tester = new VespaModelTester(); tester.addHosts(5); VespaModel model = tester.createModel(xmlWithNodes, true); - assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); - assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Heap size is lowered with combined clusters", - 30, physicalMemoryPercentage(model.getContainerClusters().get("container1"))); - assertEquals("Memory for proton is lowered to account for the jvm heap", - (long) ((3 - reservedMemoryGb) * (Math.pow(1024, 3)) * (1 - 0.30)), protonMemorySize(model.getContentClusters() - .get("content1"))); + assertEquals(2, model.getContentClusters().get("content1").getRootGroup().getNodes().size(), "Nodes in content1"); + assertEquals(2, model.getContainerClusters().get("container1").getContainers().size(), "Nodes in container1"); + assertEquals(30, physicalMemoryPercentage(model.getContainerClusters().get("container1")), "Heap size is lowered with combined clusters"); + assertEquals((long) ((3 - reservedMemoryGb) * (Math.pow(1024, 3)) * (1 - 0.30)), protonMemorySize(model.getContentClusters() + .get("content1")), "Memory for proton is lowered to account for the jvm heap"); assertProvisioned(0, ClusterSpec.Id.from("container1"), ClusterSpec.Type.container, model); assertProvisioned(2, ClusterSpec.Id.from("content1"), ClusterSpec.Id.from("container1"), ClusterSpec.Type.combined, model); } @@ -338,12 +343,10 @@ public class ModelProvisioningTest { VespaModelTester tester = new VespaModelTester(); tester.addHosts(7); VespaModel model = tester.createModel(xmlWithNodes, true); - assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); - assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Heap size is normal", - 70, physicalMemoryPercentage(model.getContainerClusters().get("container1"))); - assertEquals("Memory for proton is normal", - (long) ((3 - reservedMemoryGb) * (Math.pow(1024, 3))), protonMemorySize(model.getContentClusters().get("content1"))); + assertEquals(2, model.getContentClusters().get("content1").getRootGroup().getNodes().size(), "Nodes in content1"); + assertEquals(2, model.getContainerClusters().get("container1").getContainers().size(), "Nodes in container1"); + assertEquals(70, physicalMemoryPercentage(model.getContainerClusters().get("container1")), "Heap size is normal"); + assertEquals((long) ((3 - reservedMemoryGb) * (Math.pow(1024, 3))), protonMemorySize(model.getContentClusters().get("content1")), "Memory for proton is normal"); } @Test @@ -369,8 +372,8 @@ public class ModelProvisioningTest { tester.addHosts(5); VespaModel model = tester.createModel(xmlWithNodes, true); - assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); - assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); + assertEquals(2, model.getContentClusters().get("content1").getRootGroup().getNodes().size(), "Nodes in content1"); + assertEquals(2, model.getContainerClusters().get("container1").getContainers().size(), "Nodes in container1"); for (Container container : model.getContainerClusters().get("container1").getContainers()) assertTrue(container.getJvmOptions().contains("testoption")); } @@ -405,10 +408,10 @@ public class ModelProvisioningTest { tester.addHosts(8); VespaModel model = tester.createModel(xmlWithNodes, true); - assertEquals("Nodes in content1", 2, model.getContentClusters().get("content1").getRootGroup().getNodes().size()); - assertEquals("Nodes in container1", 2, model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Nodes in content2", 3, model.getContentClusters().get("content2").getRootGroup().getNodes().size()); - assertEquals("Nodes in container2", 3, model.getContainerClusters().get("container2").getContainers().size()); + assertEquals(2, model.getContentClusters().get("content1").getRootGroup().getNodes().size(), "Nodes in content1"); + assertEquals(2, model.getContainerClusters().get("container1").getContainers().size(), "Nodes in container1"); + assertEquals(3, model.getContentClusters().get("content2").getRootGroup().getNodes().size(), "Nodes in content2"); + assertEquals(3, model.getContainerClusters().get("container2").getContainers().size(), "Nodes in container2"); } @Test @@ -528,10 +531,10 @@ public class ModelProvisioningTest { .stream().map(cc -> cc.getHostResource()).collect(Collectors.toSet()); Set<HostResource> slobrokHosts = admin.getSlobroks().stream().map(Slobrok::getHost).collect(Collectors.toSet()); assertEquals(3, slobrokHosts.size()); - assertTrue("Slobroks are assigned on cluster controller nodes", clusterControllerHosts.containsAll(slobrokHosts)); - assertTrue("Logserver is assigned from container nodes", containerHosts.contains(admin.getLogserver().getHost())); - assertEquals("No in-cluster config servers in a hosted environment", 0, admin.getConfigservers().size()); - assertEquals("Dedicated admin cluster controllers when hosted", 3, admin.getClusterControllers().getContainers().size()); + assertTrue(clusterControllerHosts.containsAll(slobrokHosts), "Slobroks are assigned on cluster controller nodes"); + assertTrue(containerHosts.contains(admin.getLogserver().getHost()), "Logserver is assigned from container nodes"); + assertEquals(0, admin.getConfigservers().size(), "No in-cluster config servers in a hosted environment"); + assertEquals(3, admin.getClusterControllers().getContainers().size(), "Dedicated admin cluster controllers when hosted"); // Check content clusters ContentCluster cluster = model.getContentClusters().get("bar"); @@ -619,10 +622,10 @@ public class ModelProvisioningTest { Admin admin = model.getAdmin(); Set<HostResource> slobrokHosts = admin.getSlobroks().stream().map(Slobrok::getHost).collect(Collectors.toSet()); assertEquals(3, slobrokHosts.size()); - assertTrue("Slobroks are assigned from container nodes", - containerHosts.containsAll(slobrokHosts)); - assertTrue("Logserver is assigned from container nodes", containerHosts.contains(admin.getLogserver().getHost())); - assertEquals("No in-cluster config servers in a hosted environment", 0, admin.getConfigservers().size()); + assertTrue(containerHosts.containsAll(slobrokHosts), + "Slobroks are assigned from container nodes"); + assertTrue(containerHosts.contains(admin.getLogserver().getHost()), "Logserver is assigned from container nodes"); + assertEquals(0, admin.getConfigservers().size(), "No in-cluster config servers in a hosted environment"); } @Test @@ -669,9 +672,9 @@ public class ModelProvisioningTest { .stream().map(cc -> cc.getHostResource()).collect(Collectors.toSet()); Set<HostResource> slobrokHosts = admin.getSlobroks().stream().map(Slobrok::getHost).collect(Collectors.toSet()); assertEquals(3, slobrokHosts.size()); - assertTrue("Slobroks are assigned on cluster controller nodes", clusterControllerHosts.containsAll(slobrokHosts)); - assertTrue("Logserver is assigned from container nodes", containerHosts.contains(admin.getLogserver().getHost())); - assertEquals("No in-cluster config servers in a hosted environment", 0, admin.getConfigservers().size()); + assertTrue(clusterControllerHosts.containsAll(slobrokHosts), "Slobroks are assigned on cluster controller nodes"); + assertTrue(containerHosts.contains(admin.getLogserver().getHost()), "Logserver is assigned from container nodes"); + assertEquals(0, admin.getConfigservers().size(), "No in-cluster config servers in a hosted environment"); assertEquals(3, admin.getClusterControllers().getContainers().size()); // Check content clusters @@ -807,11 +810,11 @@ public class ModelProvisioningTest { assertEquals(numberOfHosts, model.getRoot().hostSystem().getHosts().size()); // Check slobroks clusters - assertEquals("Includes retired node", 1+3, model.getAdmin().getSlobroks().size()); + assertEquals(1+3, model.getAdmin().getSlobroks().size(), "Includes retired node"); assertEquals("node-1-3-50-11", model.getAdmin().getSlobroks().get(0).getHostName()); assertEquals("node-1-3-50-10", model.getAdmin().getSlobroks().get(1).getHostName()); assertEquals("node-1-3-50-08", model.getAdmin().getSlobroks().get(2).getHostName()); - assertEquals("Included in addition because it is retired", "node-1-3-50-09", model.getAdmin().getSlobroks().get(3).getHostName()); + assertEquals("node-1-3-50-09", model.getAdmin().getSlobroks().get(3).getHostName(), "Included in addition because it is retired"); } @Test @@ -832,12 +835,12 @@ public class ModelProvisioningTest { assertEquals(10+2, model.getRoot().hostSystem().getHosts().size()); // Check slobroks clusters - assertEquals("Includes retired node", 3+2, model.getAdmin().getSlobroks().size()); + assertEquals(3+2, model.getAdmin().getSlobroks().size(), "Includes retired node"); assertEquals("node-1-3-50-12", model.getAdmin().getSlobroks().get(0).getHostName()); assertEquals("node-1-3-50-11", model.getAdmin().getSlobroks().get(1).getHostName()); assertEquals("node-1-3-50-10", model.getAdmin().getSlobroks().get(2).getHostName()); - assertEquals("Included in addition because it is retired", "node-1-3-50-04", model.getAdmin().getSlobroks().get(3).getHostName()); - assertEquals("Included in addition because it is retired", "node-1-3-50-03", model.getAdmin().getSlobroks().get(4).getHostName()); + assertEquals("node-1-3-50-04", model.getAdmin().getSlobroks().get(3).getHostName(), "Included in addition because it is retired"); + assertEquals("node-1-3-50-03", model.getAdmin().getSlobroks().get(4).getHostName(), "Included in addition because it is retired"); } @Test @@ -862,14 +865,14 @@ public class ModelProvisioningTest { // Check slobroks clusters // ... from cluster default - assertEquals("Includes retired node", 7, model.getAdmin().getSlobroks().size()); + assertEquals(7, model.getAdmin().getSlobroks().size(), "Includes retired node"); assertEquals("node-1-3-50-16", model.getAdmin().getSlobroks().get(0).getHostName()); assertEquals("node-1-3-50-14", model.getAdmin().getSlobroks().get(1).getHostName()); - assertEquals("Included in addition because it is retired", "node-1-3-50-15", model.getAdmin().getSlobroks().get(2).getHostName()); + assertEquals("node-1-3-50-15", model.getAdmin().getSlobroks().get(2).getHostName(), "Included in addition because it is retired"); // ... from cluster bar assertEquals("node-1-3-50-03", model.getAdmin().getSlobroks().get(3).getHostName()); - assertEquals("Included in addition because it is retired", "node-1-3-50-05", model.getAdmin().getSlobroks().get(5).getHostName()); - assertEquals("Included in addition because it is retired", "node-1-3-50-04", model.getAdmin().getSlobroks().get(6).getHostName()); + assertEquals("node-1-3-50-05", model.getAdmin().getSlobroks().get(5).getHostName(), "Included in addition because it is retired"); + assertEquals("node-1-3-50-04", model.getAdmin().getSlobroks().get(6).getHostName(), "Included in addition because it is retired"); } @Test @@ -1248,44 +1251,48 @@ public class ModelProvisioningTest { assertEquals("bar/storage/0", cluster.getRootGroup().getNodes().get(0).getConfigId()); } - @Test(expected = IllegalArgumentException.class) + @Test public void testRequiringMoreNodesThanAreAvailable() { - String services = - "<?xml version='1.0' encoding='utf-8' ?>\n" + - "<services>" + - " <content version='1.0' id='bar'>" + - " <redundancy>1</redundancy>" + - " <documents>" + - " <document type='type1' mode='index'/>" + - " </documents>" + - " <nodes count='3' required='true'/>" + - " </content>" + - "</services>"; - - int numberOfHosts = 2; - VespaModelTester tester = new VespaModelTester(); - tester.addHosts(numberOfHosts); - tester.createModel(services, false); + assertThrows(IllegalArgumentException.class, () -> { + String services = + "<?xml version='1.0' encoding='utf-8' ?>\n" + + "<services>" + + " <content version='1.0' id='bar'>" + + " <redundancy>1</redundancy>" + + " <documents>" + + " <document type='type1' mode='index'/>" + + " </documents>" + + " <nodes count='3' required='true'/>" + + " </content>" + + "</services>"; + + int numberOfHosts = 2; + VespaModelTester tester = new VespaModelTester(); + tester.addHosts(numberOfHosts); + tester.createModel(services, false); + }); } - @Test(expected = IllegalArgumentException.class) + @Test public void testRequiredNodesAndDedicatedClusterControllers() { - String services = - "<?xml version='1.0' encoding='utf-8' ?>\n" + - "<services>" + - " <content version='1.0' id='foo'>" + - " <redundancy>1</redundancy>" + - " <documents>" + - " <document type='type1' mode='index'/>" + - " </documents>" + - " <nodes count='2' required='true'/>" + - " </content>" + - "</services>"; - - int numberOfHosts = 4; // needs 2 for foo and 3 for cluster controllers. - VespaModelTester tester = new VespaModelTester(); - tester.addHosts(numberOfHosts); - tester.createModel(services, false); + assertThrows(IllegalArgumentException.class, () -> { + String services = + "<?xml version='1.0' encoding='utf-8' ?>\n" + + "<services>" + + " <content version='1.0' id='foo'>" + + " <redundancy>1</redundancy>" + + " <documents>" + + " <document type='type1' mode='index'/>" + + " </documents>" + + " <nodes count='2' required='true'/>" + + " </content>" + + "</services>"; + + int numberOfHosts = 4; // needs 2 for foo and 3 for cluster controllers. + VespaModelTester tester = new VespaModelTester(); + tester.addHosts(numberOfHosts); + tester.createModel(services, false); + }); } @Test @@ -1647,13 +1654,44 @@ public class ModelProvisioningTest { tester.setHosted(true); tester.addHosts(4); VespaModel model = tester.createModel(new Zone(Environment.dev, RegionName.from("us-central-1")), services, true); - assertEquals("We get 1 node per cluster and no admin node apart from the dedicated cluster controller", 3, model.getHosts().size()); + assertEquals(3, model.getHosts().size(), "We get 1 node per cluster and no admin node apart from the dedicated cluster controller"); assertEquals(1, model.getContainerClusters().size()); assertEquals(1, model.getContainerClusters().get("foo").getContainers().size()); assertEquals(1, model.getContentClusters().get("bar").getRootGroup().countNodes(true)); assertEquals(1, model.getAdmin().getClusterControllers().getContainers().size()); } + @Test + public void testThatStandaloneSyntaxWithClusterControllerWorksOnHostedManuallyDeployed() { + String services = + "<?xml version='1.0' encoding='utf-8' ?>" + + "<services>" + + " <container id='foo' version='1.0'>" + + " <nodes count=\"2\" />" + + " </container>" + + " <content id='bar' version='1.0'>" + + " <documents>" + + " <document type='type1' mode='index'/>" + + " </documents>" + + " <redundancy>1</redundancy>" + + " <nodes>" + + " <group>" + + " <node distribution-key='0' hostalias='node3'/>" + + " </group>" + + " </nodes>" + + " </content>" + + "</services>"; + VespaModelTester tester = new VespaModelTester(); + tester.setHosted(true); + tester.addHosts(4); + try { + VespaModel model = tester.createModel(new Zone(Environment.staging, RegionName.from("us-central-1")), services, true); + fail("expected failure"); + } catch (IllegalArgumentException e) { + assertTrue(e.getMessage().startsWith("Clusters in hosted environments must have a <nodes count='N'> tag")); + } + } + /** Deploying an application with "nodes count" standalone should give a single-node deployment */ @Test public void testThatHostedSyntaxWorksOnStandalone() { @@ -1677,10 +1715,12 @@ public class ModelProvisioningTest { tester.addHosts(3); VespaModel model = tester.createModel(services, true); - assertEquals("Nodes in container cluster", 1, - model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Nodes in content cluster (downscaled)", 1, - model.getContentClusters().get("content").getRootGroup().getNodes().size()); + assertEquals(1, + model.getContainerClusters().get("container1").getContainers().size(), + "Nodes in container cluster"); + assertEquals(1, + model.getContentClusters().get("content").getRootGroup().getNodes().size(), + "Nodes in content cluster (downscaled)"); assertEquals(1, model.getAdmin().getSlobroks().size()); @@ -1733,10 +1773,12 @@ public class ModelProvisioningTest { tester.addHosts(3); VespaModel model = tester.createModel(services, hosts, true); - assertEquals("Nodes in container cluster", 1, - model.getContainerClusters().get("container1").getContainers().size()); - assertEquals("Nodes in content cluster (downscaled)", 1, - model.getContentClusters().get("content").getRootGroup().getNodes().size()); + assertEquals(1, + model.getContainerClusters().get("container1").getContainers().size(), + "Nodes in container cluster"); + assertEquals(1, + model.getContentClusters().get("content").getRootGroup().getNodes().size(), + "Nodes in content cluster (downscaled)"); assertEquals(1, model.getAdmin().getSlobroks().size()); @@ -2073,10 +2115,10 @@ public class ModelProvisioningTest { .collect(Collectors.groupingBy(h -> h.spec().membership().get().cluster().id().value())); tests.forEach((clusterId, stateful) -> { List<HostResource> hosts = hostsByCluster.getOrDefault(clusterId, List.of()); - assertFalse("Hosts are provisioned for '" + clusterId + "'", hosts.isEmpty()); - assertEquals("Hosts in cluster '" + clusterId + "' are " + (stateful ? "" : "not ") + "stateful", - stateful, - hosts.stream().allMatch(h -> h.spec().membership().get().cluster().isStateful())); + assertFalse(hosts.isEmpty(), "Hosts are provisioned for '" + clusterId + "'"); + assertEquals(stateful, + hosts.stream().allMatch(h -> h.spec().membership().get().cluster().isStateful()), + "Hosts in cluster '" + clusterId + "' are " + (stateful ? "" : "not ") + "stateful"); }); } @@ -2118,7 +2160,7 @@ public class ModelProvisioningTest { ZookeeperServerConfig.Builder config = new ZookeeperServerConfig.Builder(); cluster.getContainers().forEach(c -> c.getConfig(config)); cluster.getConfig(config); - assertTrue("Initial servers are not joining", config.build().server().stream().noneMatch(ZookeeperServerConfig.Server::joining)); + assertTrue(config.build().server().stream().noneMatch(ZookeeperServerConfig.Server::joining), "Initial servers are not joining"); } { VespaModel nextModel = tester.createModel(Zone.defaultZone(), servicesXml.apply(3), true, false, false, 0, Optional.of(model), new DeployState.Builder(), "node-1-3-50-04", "node-1-3-50-03"); @@ -2126,22 +2168,22 @@ public class ModelProvisioningTest { ZookeeperServerConfig.Builder config = new ZookeeperServerConfig.Builder(); cluster.getContainers().forEach(c -> c.getConfig(config)); cluster.getConfig(config); - assertEquals("New nodes are joining", - Map.of(0, false, + assertEquals(Map.of(0, false, 1, false, 2, false, 3, true, 4, true), config.build().server().stream().collect(Collectors.toMap(ZookeeperServerConfig.Server::id, - ZookeeperServerConfig.Server::joining))); - assertEquals("Retired nodes are retired", - Map.of(0, false, + ZookeeperServerConfig.Server::joining)), + "New nodes are joining"); + assertEquals(Map.of(0, false, 1, true, 2, true, 3, false, 4, false), config.build().server().stream().collect(Collectors.toMap(ZookeeperServerConfig.Server::id, - ZookeeperServerConfig.Server::retired))); + ZookeeperServerConfig.Server::retired)), + "Retired nodes are retired"); } } @@ -2284,15 +2326,31 @@ public class ModelProvisioningTest { private static void assertProvisioned(int nodeCount, ClusterSpec.Id id, ClusterSpec.Id combinedId, ClusterSpec.Type type, VespaModel model) { - assertEquals("Nodes in cluster " + id + " with type " + type + (combinedId != null ? ", combinedId " + combinedId : ""), nodeCount, + assertEquals(nodeCount, model.hostSystem().getHosts().stream() .map(h -> h.spec().membership().get().cluster()) .filter(spec -> spec.id().equals(id) && spec.type().equals(type) && spec.combinedId().equals(Optional.ofNullable(combinedId))) - .count()); + .count(), + "Nodes in cluster " + id + " with type " + type + (combinedId != null ? ", combinedId " + combinedId : "")); } private static void assertProvisioned(int nodeCount, ClusterSpec.Id id, ClusterSpec.Type type, VespaModel model) { assertProvisioned(nodeCount, id, null, type, model); } + record TestLogger(List<LogMessage> msgs) implements DeployLogger { + + public TestLogger() { + this(new ArrayList<>()); + } + + @Override + public void log(Level level, String message) { + msgs.add(new LogMessage(level, message)); + } + + record LogMessage(Level level, String message) {} + + } + } diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/SingleNodeProvisionerTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/SingleNodeProvisionerTest.java index 446350a734f..e5f6235552f 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/SingleNodeProvisionerTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/SingleNodeProvisionerTest.java @@ -6,7 +6,7 @@ import com.yahoo.config.model.api.HostProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.provision.HostSpec; import com.yahoo.vespa.model.VespaModel; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; import java.io.IOException; @@ -21,7 +21,7 @@ import java.util.Set; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author hmusum @@ -29,7 +29,7 @@ import static org.junit.Assert.assertTrue; public class SingleNodeProvisionerTest { @Test - public void require_basic_works() { + void require_basic_works() { SingleNodeProvisioner hostProvisioner = new SingleNodeProvisioner(); // 4 services, 2 host aliases, mapping to 2 host. @@ -56,16 +56,16 @@ public class SingleNodeProvisionerTest { } @Test - public void require_allocate_clustermembership_works() throws IOException, SAXException { + void require_allocate_clustermembership_works() throws IOException, SAXException { String servicesXml = "<services version='1.0'>" - + " <admin version='3.0'>" - + " <nodes count='1' />" - + " </admin>" - + " <container version='1.0'>" - + " <search />" - + " <nodes count='1' />" - + " </container>" - + "</services>"; + + " <admin version='3.0'>" + + " <nodes count='1' />" + + " </admin>" + + " <container version='1.0'>" + + " <search />" + + " <nodes count='1' />" + + " </container>" + + "</services>"; ApplicationPackage app = new MockApplicationPackage.Builder().withServices(servicesXml).build(); VespaModel model = new VespaModel(app); assertThat(model.getHosts().size(), is(1)); @@ -93,7 +93,7 @@ public class SingleNodeProvisionerTest { return createAliases(new ArrayList<String>()); } - // Admin services on node1, qrserver on node2 + additional specs + // Admin services on node1, container on node2 + additional specs private List<String> createAliases(Collection<String> additionalAliases) { List<String> aliases = new ArrayList<>(); aliases.add("node1"); |