diff options
author | Harald Musum <musum@verizonmedia.com> | 2022-03-15 12:39:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-15 12:39:46 +0100 |
commit | 6d803878dd20afc1500286f0382e7077f834abaf (patch) | |
tree | 782de433036edd9cbeff17e7554844e680381662 | |
parent | bbd8807e32787cf3ae0430d2e33084b586bf8bc6 (diff) | |
parent | 31ce004fc2092e5d3dac251f595a66bba0dd140e (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]
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( |