From 942a0c395008f2a765eff19d5dea0139a9906576 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Wed, 28 Apr 2021 18:28:10 +0200 Subject: Add Slobroks to admin cluster controllers --- .../com/yahoo/config/model/admin/AdminModel.java | 2 +- .../java/com/yahoo/vespa/model/admin/Admin.java | 18 +++++++++++++++- .../java/com/yahoo/vespa/model/admin/Slobrok.java | 2 +- .../model/builder/xml/dom/DomAdminV2Builder.java | 3 ++- .../model/builder/xml/dom/DomAdminV4Builder.java | 11 +++++++--- .../model/content/cluster/ContentCluster.java | 9 +++++--- .../model/provision/ModelProvisioningTest.java | 24 +++++++++++++++++----- 7 files changed, 54 insertions(+), 15 deletions(-) (limited to 'config-model/src') diff --git a/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java b/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java index ec1038c67db..59aa7e48639 100644 --- a/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java +++ b/config-model/src/main/java/com/yahoo/config/model/admin/AdminModel.java @@ -81,7 +81,7 @@ public class AdminModel extends ConfigModel { new BuilderV4().doBuild(model, adminElement, modelContext); return; } - AbstractConfigProducer parent = modelContext.getParentProducer(); + AbstractConfigProducer parent = modelContext.getParentProducer(); ModelContext.Properties properties = modelContext.getDeployState().getProperties(); DomAdminV2Builder domBuilder = new DomAdminV2Builder(modelContext.getApplicationType(), modelContext.getDeployState().getFileRegistry(), diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index efae00096df..2b850d8f3eb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -15,6 +15,7 @@ import com.yahoo.vespa.model.ConfigProxy; import com.yahoo.vespa.model.ConfigSentinel; import com.yahoo.vespa.model.HostResource; import com.yahoo.vespa.model.Logd; +import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainer; import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainerCluster; import com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainer; import com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainerCluster; @@ -27,6 +28,7 @@ import com.yahoo.vespa.model.filedistribution.FileDistributor; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -142,8 +144,22 @@ public class Admin extends AbstractConfigProducer implements Serializable public ClusterControllerContainerCluster getClusterControllers() { return clusterControllers; } - public void setClusterControllers(ClusterControllerContainerCluster clusterControllers) { + public void setClusterControllers(ClusterControllerContainerCluster clusterControllers, DeployLogger deployLogger) { this.clusterControllers = clusterControllers; + if (isHostedVespa) + addSlobroks(createSlobroksOn(clusterControllers, deployLogger)); + } + + private List createSlobroksOn(ClusterControllerContainerCluster clusterControllers, DeployLogger deployLogger) { + List slobroks = new ArrayList<>(); + int index = this.slobroks.size(); + for (ClusterControllerContainer clusterController : clusterControllers.getContainers()) { + Slobrok slobrok = new Slobrok(this, index++); + slobrok.setHostResource(clusterController.getHostResource()); + slobroks.add(slobrok); + slobrok.initService(deployLogger); + } + return slobroks; } public Optional getLogServerContainerCluster() { return logServerContainerCluster; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java index 43f02f8b6d4..eed886b707f 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java @@ -22,7 +22,7 @@ public class Slobrok extends AbstractService implements StateserverConfig.Produc } /** - * @param parent The parent ConfigProducer. + * @param parent the parent ConfigProducer. * @param index unique index for all slobroks */ public Slobrok(AbstractConfigProducer parent, int index) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java index d6e419cf63f..a1329b2a5b4 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java @@ -46,7 +46,8 @@ public class DomAdminV2Builder extends DomAdminBuilderBase { admin.addConfigservers(configservers); admin.addSlobroks(getSlobroks(deployState, admin, XML.getChild(adminE, "slobroks"))); if ( ! admin.multitenant()) - admin.setClusterControllers(addConfiguredClusterControllers(deployState, admin, adminE)); + admin.setClusterControllers(addConfiguredClusterControllers(deployState, admin, adminE), + deployState.getDeployLogger()); ModelElement adminElement = new ModelElement(adminE); addLogForwarders(adminElement.child("logforwarding"), admin); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java index f7b838de911..a0673824907 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java @@ -13,6 +13,7 @@ import com.yahoo.vespa.model.admin.Logserver; import com.yahoo.vespa.model.admin.LogserverContainer; import com.yahoo.vespa.model.admin.LogserverContainerCluster; import com.yahoo.vespa.model.admin.Slobrok; +import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainer; import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerModel; import org.w3c.dom.Element; @@ -62,10 +63,14 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { private void assignSlobroks(DeployLogger deployLogger, NodesSpecification nodesSpecification, Admin admin) { if (nodesSpecification.isDedicated()) { - createSlobroks(deployLogger, admin, allocateHosts(admin.hostSystem(), "slobroks", nodesSpecification)); + createSlobroks(deployLogger, + admin, + allocateHosts(admin.hostSystem(), "slobroks", nodesSpecification)); } - else { - createSlobroks(deployLogger, admin, pickContainerHostsForSlobrok(nodesSpecification.minResources().nodes(), 2)); + else { // TODO: Remove + createSlobroks(deployLogger, + admin, + pickContainerHostsForSlobrok(nodesSpecification.minResources().nodes(), 2)); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index d9bd413f053..f6a45842bd9 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java @@ -302,7 +302,8 @@ public class ContentCluster extends AbstractConfigProducer implements host, "cluster-controllers", true, - deployState)); + deployState), + deployState.getDeployLogger()); } clusterControllers = admin.getClusterControllers(); } @@ -318,7 +319,8 @@ public class ContentCluster extends AbstractConfigProducer implements hosts, "cluster-controllers", false, - deployState)); + deployState), + deployState.getDeployLogger()); } clusterControllers = admin.getClusterControllers(); } @@ -351,7 +353,8 @@ public class ContentCluster extends AbstractConfigProducer implements hosts, "cluster-controllers", true, - context.getDeployState())); + context.getDeployState()), + deployState.getDeployLogger()); } return admin.getClusterControllers(); } 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 86668fe3098..13c0b1e8256 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 @@ -39,6 +39,7 @@ import org.junit.Ignore; import org.junit.Test; import java.io.StringReader; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -491,9 +492,12 @@ public class ModelProvisioningTest { // Check admin clusters Admin admin = model.getAdmin(); + Set clusterControllerHosts = admin.getClusterControllers().getContainers() + .stream().map(cc -> cc.getHostResource()).collect(Collectors.toSet()); Set slobrokHosts = admin.getSlobroks().stream().map(Slobrok::getHost).collect(Collectors.toSet()); - assertEquals(3, slobrokHosts.size()); - assertTrue("Slobroks are assigned from container nodes", containerHosts.containsAll(slobrokHosts)); + assertEquals(6, slobrokHosts.size()); + assertTrue("Slobroks are assigned from container and cluster controller nodes", + union(containerHosts, 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()); @@ -596,9 +600,12 @@ public class ModelProvisioningTest { // Check admin clusters Admin admin = model.getAdmin(); + Set clusterControllerHosts = admin.getClusterControllers().getContainers() + .stream().map(cc -> cc.getHostResource()).collect(Collectors.toSet()); Set slobrokHosts = admin.getSlobroks().stream().map(Slobrok::getHost).collect(Collectors.toSet()); - assertEquals(3, slobrokHosts.size()); - assertTrue("Slobroks are assigned from container nodes", containerHosts.containsAll(slobrokHosts)); + assertEquals(6, slobrokHosts.size()); + assertTrue("Slobroks are assigned from container and cluster controller nodes", + union(containerHosts, 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(3, admin.getClusterControllers().getContainers().size()); @@ -1503,7 +1510,7 @@ public class ModelProvisioningTest { tester.addHosts(6); VespaModel model = tester.createModel(services, true); assertEquals(6, model.getRoot().hostSystem().getHosts().size()); - assertEquals(2, model.getAdmin().getSlobroks().size()); + assertEquals(5, model.getAdmin().getSlobroks().size()); assertEquals(2, model.getContainerClusters().get("foo").getContainers().size()); assertEquals(1, model.getContentClusters().get("bar").getRootGroup().countNodes()); } @@ -2028,4 +2035,11 @@ public class ModelProvisioningTest { assertProvisioned(nodeCount, id, null, type, model); } + private Set union(Set a, Set b) { + Set union = new HashSet<>(); + union.addAll(a); + union.addAll(b); + return union; + } + } -- cgit v1.2.3