diff options
author | Harald Musum <musum@yahooinc.com> | 2022-03-15 10:53:00 +0100 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2022-03-15 10:53:00 +0100 |
commit | 31ce004fc2092e5d3dac251f595a66bba0dd140e (patch) | |
tree | 9370193d25f6cff2ceda6e7a4e11200dc939b4e4 | |
parent | d6f599c41830a79614197158b13cdfb86e3b9777 (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)
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( |