summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2022-03-15 12:39:46 +0100
committerGitHub <noreply@github.com>2022-03-15 12:39:46 +0100
commit6d803878dd20afc1500286f0382e7077f834abaf (patch)
tree782de433036edd9cbeff17e7554844e680381662
parentbbd8807e32787cf3ae0430d2e33084b586bf8bc6 (diff)
parent31ce004fc2092e5d3dac251f595a66bba0dd140e (diff)
Merge pull request #21688 from vespa-engine/hmusum/add-feature-flag-for-node-architecture-for-admin-clusters
Add feature flag for node architecture for admin clusters [run-systemtest]
-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.java28
-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/admin/AdminTestCase.java21
-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
8 files changed, 85 insertions, 32 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 0d8f7148758..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,9 @@ 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;
/**
@@ -282,9 +285,11 @@ public class ContentCluster extends AbstractConfigProducer<AbstractConfigProduce
DeployState deployState) {
if (admin == null) return; // only in tests
if (contentCluster.getPersistence() == null) return;
+
ClusterControllerContainerCluster clusterControllers;
+ String clusterName = "cluster-controllers";
if (context.properties().hostedVespa()) {
- clusterControllers = getDedicatedSharedControllers(contentElement, admin, context, deployState);
+ clusterControllers = getDedicatedSharedControllers(contentElement, admin, context, deployState, clusterName);
}
else if (admin.multitenant()) { // system tests: Put on logserver
if (admin.getClusterControllers() == null) {
@@ -292,7 +297,7 @@ public class ContentCluster extends AbstractConfigProducer<AbstractConfigProduce
List<HostResource> host = admin.getLogserver() == null ? List.of() : List.of(admin.getLogserver().getHostResource());
admin.setClusterControllers(createClusterControllers(new ClusterControllerCluster(admin, "standalone", deployState),
host,
- "cluster-controllers",
+ clusterName,
true,
deployState),
deployState);
@@ -324,26 +329,29 @@ public class ContentCluster extends AbstractConfigProducer<AbstractConfigProduce
}
}
- public static final NodeResources clusterControllerResources = new NodeResources(0.25, 1, 10, 0.3, NodeResources.DiskSpeed.any, NodeResources.StorageType.any);
+ public static final NodeResources clusterControllerResources = new NodeResources(0.25, 1, 10, 0.3, DiskSpeed.any, StorageType.any);
- private ClusterControllerContainerCluster getDedicatedSharedControllers(ModelElement contentElement, Admin admin,
- ConfigModelContext context, DeployState deployState) {
+ private ClusterControllerContainerCluster getDedicatedSharedControllers(ModelElement contentElement,
+ Admin admin,
+ ConfigModelContext context,
+ 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(),
ClusterSpec.Type.admin,
- ClusterSpec.Id.from("cluster-controllers"),
+ ClusterSpec.Id.from(clusterName),
context.getDeployLogger(),
true)
.keySet();
-
admin.setClusterControllers(createClusterControllers(new ClusterControllerCluster(admin, "standalone", deployState),
hosts,
- "cluster-controllers",
+ clusterName,
true,
context.getDeployState()),
deployState);
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/admin/AdminTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java
index 7d12b9d6386..96f6c7999cc 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java
@@ -277,25 +277,4 @@ public class AdminTestCase {
assertTrue(configIds.toString(), configIds.contains("hosts/myhost0/logforwarder"));
}
- @Test
- public void testDisableFileDistributorForAllApps() {
- DeployState state = new DeployState.Builder()
- .zone(new Zone(Environment.dev, RegionName.from("baz")))
- .properties(
- new TestProperties().
- setApplicationId(new ApplicationId.Builder().
- tenant("quux").
- applicationName("foo").instanceName("bim")
- .build()))
- .build();
- TestRoot root = new TestDriver().buildModel(state);
- String localhost = HostName.getLocalhost();
- SentinelConfig sentinelConfig = root.getConfig(SentinelConfig.class, "hosts/" + localhost);
- assertEquals(4, sentinelConfig.service().size());
- assertEquals("logserver", sentinelConfig.service(0).name());
- assertEquals("slobrok", sentinelConfig.service(1).name());
- assertEquals(METRICS_PROXY_CONTAINER.serviceName, sentinelConfig.service(2).name());
- assertEquals("logd", sentinelConfig.service(3).name());
- }
-
}
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 72a16a37a8f..a38c0a490cd 100644
--- a/flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java
+++ b/flags/src/main/java/com/yahoo/vespa/flags/PermanentFlags.java
@@ -261,6 +261,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(