summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2022-03-15 10:53:00 +0100
committerHarald Musum <musum@yahooinc.com>2022-03-15 10:53:00 +0100
commit31ce004fc2092e5d3dac251f595a66bba0dd140e (patch)
tree9370193d25f6cff2ceda6e7a4e11200dc939b4e4
parentd6f599c41830a79614197158b13cdfb86e3b9777 (diff)
Add feature flag for node architecture for admin clusters
Flag value will be used for implicitly created nodes in admin clusters (cluster controllers only for now)
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java1
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java7
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java5
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java43
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java7
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java3
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java7
7 files changed, 71 insertions, 2 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
index 956ba2fdcf7..e3446002888 100644
--- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
@@ -118,6 +118,7 @@ public interface ModelContext {
@ModelFeatureFlag(owners = {"arnej"}) default boolean avoidRenamingSummaryFeatures() { return false; }
@ModelFeatureFlag(owners = {"bjorncs", "baldersheim"}) default boolean mergeGroupingResultInSearchInvoker() { return false; }
@ModelFeatureFlag(owners = {"arnej"}) default boolean experimentalSdParsing() { return false; }
+ @ModelFeatureFlag(owners = {"hmusum"}) default String adminClusterNodeArchitecture() { return "x86_64"; } // TODO: Cluster controllers only for now
}
/** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
index 2c028c52bf8..575080d3025 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java
@@ -81,6 +81,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
private List<String> environmentVariables = List.of();
private boolean avoidRenamingSummaryFeatures = false;
private boolean experimentalSdParsing = false;
+ private String adminClusterNodeResourcesArchitecture = "x86_64";
@Override public ModelContext.FeatureFlags featureFlags() { return this; }
@Override public boolean multitenant() { return multitenant; }
@@ -142,6 +143,7 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
@Override public List<String> environmentVariables() { return environmentVariables; }
@Override public boolean avoidRenamingSummaryFeatures() { return this.avoidRenamingSummaryFeatures; }
@Override public boolean experimentalSdParsing() { return this.experimentalSdParsing; }
+ @Override public String adminClusterNodeArchitecture() { return adminClusterNodeResourcesArchitecture; }
public TestProperties maxUnCommittedMemory(int maxUnCommittedMemory) {
this.maxUnCommittedMemory = maxUnCommittedMemory;
@@ -389,6 +391,11 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea
return this;
}
+ public TestProperties setAdminClusterNodeResourcesArchitecture(String architectureFunction) {
+ this.adminClusterNodeResourcesArchitecture = architectureFunction;
+ return this;
+ }
+
public static class Spec implements ConfigServerSpec {
private final String hostName;
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 80514d9698a..ce2bc351d2b 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
@@ -62,6 +62,7 @@ import java.util.Set;
import java.util.TreeMap;
import java.util.logging.Level;
+import static com.yahoo.config.provision.NodeResources.Architecture;
import static com.yahoo.config.provision.NodeResources.DiskSpeed;
import static com.yahoo.config.provision.NodeResources.StorageType;
import static java.util.stream.Collectors.toList;
@@ -336,8 +337,10 @@ public class ContentCluster extends AbstractConfigProducer<AbstractConfigProduce
DeployState deployState,
String clusterName) {
if (admin.getClusterControllers() == null) {
+ NodeResources nodeResources = clusterControllerResources
+ .with(Architecture.valueOf(deployState.featureFlags().adminClusterNodeArchitecture()));
NodesSpecification spec = NodesSpecification.requiredFromSharedParents(deployState.zone().environment().isProduction() ? 3 : 1,
- clusterControllerResources,
+ nodeResources,
contentElement,
context);
Collection<HostResource> hosts = spec.provision(admin.hostSystem(),
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 97a27c92617..91aff3935ab 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
@@ -1474,6 +1474,49 @@ public class ModelProvisioningTest {
}
@Test
+ public void testUseArm64NodesForClusterControllers() {
+ String services =
+ "<?xml version='1.0' encoding='utf-8' ?>" +
+ "<services>" +
+ " <container version='1.0' id='container'>" +
+ " <nodes count='2'>" +
+ " <resources vcpu='2' memory='8Gb' disk='30Gb'/>" +
+ " </nodes>" +
+ " </container>" +
+ " <content version='1.0' id='foo'>" +
+ " <documents>" +
+ " <document type='type1' mode='index'/>" +
+ " </documents>" +
+ " <nodes count='2'>" +
+ " <resources vcpu='2' memory='8Gb' disk='30Gb'/>" +
+ " </nodes>" +
+ " </content>" +
+ "</services>";
+
+ VespaModelTester tester = new VespaModelTester();
+ tester.setHosted(true);
+ tester.setAdminClusterArchitecture("arm64");
+ tester.addHosts(new NodeResources(13.5, 100, 1000, 0.3), 6);
+ tester.addHosts(new NodeResources(85, 200, 1000_000_000, 0.3), 20);
+ tester.addHosts(new NodeResources(0.5, 2, 10, 0.3, NodeResources.DiskSpeed.any, NodeResources.StorageType.any, NodeResources.Architecture.arm64), 3);
+ VespaModel model = tester.createModel(services, true, true);
+ List<HostResource> hosts = model.getRoot().hostSystem().getHosts();
+ assertEquals(7, hosts.size());
+ Set<HostResource> clusterControllerResources =
+ hosts.stream()
+ .filter(host -> host.getHostInfo().getServices().stream()
+ .anyMatch(service -> service.getServiceType().equals("container-clustercontroller")))
+ .collect(Collectors.toSet());
+ assertEquals(3, clusterControllerResources.size());
+ assertTrue(clusterControllerResources.stream().allMatch(host -> host.realResources().architecture().name().equals("arm64")));
+
+ // Other hosts should be x86_64
+ assertTrue(hosts.stream()
+ .filter(host -> !clusterControllerResources.contains(host))
+ .allMatch(host -> host.realResources().architecture().name().equals("x86_64")));
+ }
+
+ @Test
public void testContainerOnly() {
String services =
"<?xml version='1.0' encoding='utf-8' ?>\n" +
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java
index 77c790e7082..b9a5fde9301 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java
@@ -53,6 +53,7 @@ public class VespaModelTester {
private final Map<NodeResources, Collection<Host>> hostsByResources = new HashMap<>();
private ApplicationId applicationId = ApplicationId.defaultId();
private boolean useDedicatedNodeForLogserver = false;
+ private String adminClusterArchitecture = "x86_64";
private HostProvisioner provisioner;
public VespaModelTester() {
@@ -100,6 +101,9 @@ public class VespaModelTester {
/** Sets whether this sets up a model for a hosted system. Default: true */
public void setHosted(boolean hosted) { this.hosted = hosted; }
+ /** Sets architecture to use for admin clusters. Default: x86_64 */
+ public void setAdminClusterArchitecture(String architecture) { this.adminClusterArchitecture = architecture; }
+
/** Sets the tenant, application name, and instance name of the model being built. */
public void setApplicationId(String tenant, String applicationName, String instanceName) {
applicationId = ApplicationId.from(tenant, applicationName, instanceName);
@@ -198,7 +202,8 @@ public class VespaModelTester {
.setMultitenant(hosted) // Note: system tests are multitenant but not hosted
.setHostedVespa(hosted)
.setApplicationId(applicationId)
- .setUseDedicatedNodeForLogserver(useDedicatedNodeForLogserver);
+ .setUseDedicatedNodeForLogserver(useDedicatedNodeForLogserver)
+ .setAdminClusterNodeResourcesArchitecture(adminClusterArchitecture);
DeployState.Builder deployState = deployStatebuilder
.applicationPackage(appPkg)
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
index 75ee9d66b4a..48106d702b9 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java
@@ -211,6 +211,7 @@ public class ModelContextImpl implements ModelContext {
private final boolean avoidRenamingSummaryFeatures;
private final boolean mergeGroupingResultInSearchInvoker;
private final boolean experimentalSdParsing;
+ private final String adminClusterNodeResourcesArchitecture;
public FeatureFlags(FlagSource source, ApplicationId appId, Version version) {
this.defaultTermwiseLimit = flagValue(source, appId, version, Flags.DEFAULT_TERM_WISE_LIMIT);
@@ -260,6 +261,7 @@ public class ModelContextImpl implements ModelContext {
this.avoidRenamingSummaryFeatures = flagValue(source, appId, version, Flags.AVOID_RENAMING_SUMMARY_FEATURES);
this.mergeGroupingResultInSearchInvoker = flagValue(source, appId, version, Flags.MERGE_GROUPING_RESULT_IN_SEARCH_INVOKER);
this.experimentalSdParsing = flagValue(source, appId, version, Flags.EXPERIMENTAL_SD_PARSING);
+ this.adminClusterNodeResourcesArchitecture = flagValue(source, appId, version, ClusterSpec.Type.admin, PermanentFlags.ADMIN_CLUSTER_NODE_ARCHITECTURE);
}
@Override public double defaultTermwiseLimit() { return defaultTermwiseLimit; }
@@ -311,6 +313,7 @@ public class ModelContextImpl implements ModelContext {
@Override public boolean avoidRenamingSummaryFeatures() { return avoidRenamingSummaryFeatures; }
@Override public boolean mergeGroupingResultInSearchInvoker() { return mergeGroupingResultInSearchInvoker; }
@Override public boolean experimentalSdParsing() { return experimentalSdParsing; }
+ @Override public String adminClusterNodeArchitecture() { return adminClusterNodeResourcesArchitecture; }
private static <V> V flagValue(FlagSource source, ApplicationId appId, Version vespaVersion, UnboundFlag<? extends V, ?, ?> flag) {
return flag.bindTo(source)
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java b/flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java
index 225c45fbfdb..b7217f6cb6c 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java
@@ -247,6 +247,13 @@ public class PermanentFlags {
"version, the config server will refuse to serve config to nodes still running on older major versions",
"Takes effect immediately");
+ public static final UnboundStringFlag ADMIN_CLUSTER_NODE_ARCHITECTURE = defineStringFlag(
+ "admin-cluster-node-architecture", "x86_64",
+ "Architecture to use for node resources. Used when implicitly creating admin clusters " +
+ "(logserver, clustercontroller). Valid values: x86_64, arm64",
+ "Takes effect on next redeployment",
+ ZONE_ID, APPLICATION_ID, CLUSTER_ID, CLUSTER_TYPE);
+
private PermanentFlags() {}
private static UnboundBooleanFlag defineFeatureFlag(