// Copyright Yahoo. 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.cloud.config.log.LogdConfig; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.builder.xml.test.DomBuilderTest; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.config.model.test.MockRoot; import com.yahoo.text.XML; import com.yahoo.vespa.model.HostResource; import com.yahoo.vespa.model.admin.Admin; import com.yahoo.vespa.model.admin.Configserver; import com.yahoo.vespa.model.admin.Slobrok; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.w3c.dom.Element; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author hmusum */ public class DomAdminV2BuilderTest extends DomBuilderTest { private static MockRoot root; @BeforeEach public void prepareTest() { root = new MockRoot("root"); } private Element servicesOverride() { return XML.getDocument( "" + " " + " " + " foobar" + " " + "").getDocumentElement(); } private Element servicesConfigservers() { return XML.getDocument( "" + " " + " " + " " + " " + "").getDocumentElement(); } private Element servicesYamas() { return XML.getDocument( "" + " " + " " + " " + " " + " " + "").getDocumentElement(); } private Element servicesNoYamas() { return XML.getDocument( "" + " " + " " + " " + " " + "").getDocumentElement(); } private Element servicesAdminServerOnly() { return XML.getDocument( "" + " " + "").getDocumentElement(); } private Element servicesYamasIntervalOverride() { return XML.getDocument( "" + " " + " " + " " + " " + " " + "").getDocumentElement(); } private Element servicesMultitenantAdminOnly() { return XML.getDocument( "" + " " + "").getDocumentElement(); } private Element servicesAdminNoAdminServerOrConfigServer() { return XML.getDocument("" + "").getDocumentElement(); } @Test void multitenant() { List configServerSpecs = Arrays.asList( new TestProperties.Spec("test1", 19070, 2181), new TestProperties.Spec("test2", 19070, 2181), new TestProperties.Spec("test3", 19070, 2181)); Admin admin = buildAdmin(servicesMultitenantAdminOnly(), true, configServerSpecs); assertEquals(3, admin.getConfigservers().size()); assertEquals(1, admin.getSlobroks().size()); assertTrue(admin.hostSystem().getAllHosts().stream().map(HostResource::getHost).anyMatch(host -> host.getHostname().equals("test1"))); for (Configserver configserver : admin.getConfigservers()) { for (Slobrok slobrok : admin.getSlobroks()) { assertNotEquals(configserver.getHostName(), slobrok.getHostName()); } } } /** * Tests that configservers/configserver works */ @Test void adminWithConfigserversElement() { Admin admin = buildAdmin(servicesConfigservers()); assertEquals(1, admin.getConfigservers().size()); } @Test void basicYamasNoXml() { Admin admin = buildAdmin(servicesNoYamas()); Monitoring y = admin.getMonitoring(); assertEquals("vespa", y.getClustername()); assertEquals(1, y.getInterval().intValue()); } @Test void testAdminServerOnly() { Admin admin = buildAdmin(servicesAdminServerOnly()); assertEquals(1, admin.getSlobroks().size()); } @Test void basicYamasXml() { Admin admin = buildAdmin(servicesYamas()); Monitoring y = admin.getMonitoring(); assertEquals("foo", y.getClustername()); assertEquals(1, y.getInterval().intValue()); } @Test void yamasWithIntervalOverride() { Admin admin = buildAdmin(servicesYamasIntervalOverride()); Monitoring y = admin.getMonitoring(); assertEquals("foo", y.getClustername()); assertEquals(5, y.getInterval().intValue()); } /** * Test that illegal yamas interval throws exception */ @Test void yamasElementInvalid() { assertThrows(IllegalArgumentException.class, () -> { Element servicesYamasIllegalInterval = XML.getDocument( "" + " " + " " + "").getDocumentElement(); Admin admin = buildAdmin(servicesYamasIllegalInterval); }); } @Test void configOverridesCanBeUsedInAdmin() { Admin admin = buildAdmin(servicesOverride()); assertEquals(1, admin.getUserConfigs().size()); LogdConfig.Builder logdBuilder = new LogdConfig.Builder(); admin.addUserConfig(logdBuilder); LogdConfig config = new LogdConfig(logdBuilder); assertEquals("foobar", config.logserver().host()); } @Test void noAdminServerOrConfigServer() { Admin admin = buildAdmin(servicesAdminNoAdminServerOrConfigServer()); assertEquals(1, admin.getConfigservers().size()); } private Admin buildAdmin(Element xml) { return buildAdmin(xml, false, new ArrayList<>()); } private Admin buildAdmin(Element xml, boolean multitenant, List configServerSpecs) { DeployState deployState = DeployState.createTestState(); final DomAdminV2Builder domAdminBuilder = new DomAdminV2Builder(ConfigModelContext.ApplicationType.DEFAULT, multitenant, configServerSpecs); Admin admin = domAdminBuilder.build(deployState, root, xml); admin.addPerHostServices(root.hostSystem().getHosts(), deployState); return admin; } }