// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.model.deploy; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.api.ContainerEndpoint; import com.yahoo.config.model.api.EndpointCertificateSecrets; import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.api.Quota; import com.yahoo.config.model.api.TenantSecretStore; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; import com.yahoo.config.provision.CloudAccount; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.DataplaneToken; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.model.container.ApplicationContainerCluster; import java.net.URI; import java.security.cert.X509Certificate; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.Set; /** * A test-only Properties class * *

Unfortunately this has to be placed in non-test source tree since lots of code already have test code (fix later) * * @author hakonhall */ public class TestProperties implements ModelContext.Properties, ModelContext.FeatureFlags { private boolean multitenant = false; private ApplicationId applicationId = ApplicationId.defaultId(); private List configServerSpecs = List.of(); private boolean hostedVespa = false; private Zone zone = Zone.defaultZone(); private final Set endpoints = Set.of(); private boolean useDedicatedNodeForLogserver = false; private double defaultTermwiseLimit = 1.0; private String jvmGCOptions = null; private String queryDispatchPolicy = "adaptive"; private String summaryDecodePolicy = "eager"; private String sequencerType = "THROUGHPUT"; private boolean firstTimeDeployment = false; private String responseSequencerType = "ADAPTIVE"; private int responseNumThreads = 2; private Optional endpointCertificateSecrets = Optional.empty(); private AthenzDomain athenzDomain; private Quota quota = Quota.unlimited(); private boolean useAsyncMessageHandlingOnSchedule = false; private double feedConcurrency = 0.5; private double feedNiceness = 0.0; private int maxActivationInhibitedOutOfSyncGroups = 0; private List tenantSecretStores = List.of(); private boolean allowDisableMtls = true; private List operatorCertificates = List.of(); private double resourceLimitDisk = 0.75; private double resourceLimitMemory = 0.8; private double minNodeRatioPerGroup = 0.0; private boolean containerDumpHeapOnShutdownTimeout = false; private double containerShutdownTimeout = 50.0; private int maxUnCommittedMemory = 123456; private List zoneDnsSuffixes = List.of(); private int maxCompactBuffers = 1; private boolean useV8GeoPositions = true; private List environmentVariables = List.of(); private boolean loadCodeAsHugePages = false; private boolean sharedStringRepoNoReclaim = false; private int mbus_java_num_targets = 2; private int mbus_java_events_before_wakeup = 1; private int mbus_cpp_num_targets = 2; private int mbus_cpp_events_before_wakeup = 1; private int rpc_num_targets = 2; private int rpc_events_before_wakeup = 1; private int mbus_network_threads = 1; private int heapSizePercentage = ApplicationContainerCluster.defaultHeapSizePercentageOfAvailableMemory; private Optional cloudAccount = Optional.empty(); private boolean allowUserFilters = true; private List dataplaneTokens; private int contentLayerMetadataFeatureLevel = 0; private int persistenceThreadMaxFeedOpBatchSize = 1; private boolean logserverOtelCol = false; private boolean symmetricPutAndActivateReplicaSelection = false; private boolean enforceStrictlyIncreasingClusterStateVersions = false; private boolean launchApplicationAthenzService = false; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @Override public boolean multitenant() { return multitenant; } @Override public ApplicationId applicationId() { return applicationId; } @Override public List configServerSpecs() { return configServerSpecs; } @Override public HostName loadBalancerName() { return null; } @Override public URI ztsUrl() { return null; } @Override public String athenzDnsSuffix() { return null; } @Override public boolean hostedVespa() { return hostedVespa; } @Override public Zone zone() { return zone; } @Override public Set endpoints() { return endpoints; } @Override public String jvmGCOptions(Optional clusterType) { return jvmGCOptions; } @Override public String feedSequencerType() { return sequencerType; } @Override public boolean isBootstrap() { return false; } @Override public boolean isFirstTimeDeployment() { return firstTimeDeployment; } @Override public boolean useDedicatedNodeForLogserver() { return useDedicatedNodeForLogserver; } @Override public Optional endpointCertificateSecrets() { return endpointCertificateSecrets; } @Override public double defaultTermwiseLimit() { return defaultTermwiseLimit; } @Override public Optional athenzDomain() { return Optional.ofNullable(athenzDomain); } @Override public String responseSequencerType() { return responseSequencerType; } @Override public int defaultNumResponseThreads() { return responseNumThreads; } @Override public Quota quota() { return quota; } @Override public boolean useAsyncMessageHandlingOnSchedule() { return useAsyncMessageHandlingOnSchedule; } @Override public double feedConcurrency() { return feedConcurrency; } @Override public double feedNiceness() { return feedNiceness; } @Override public int maxActivationInhibitedOutOfSyncGroups() { return maxActivationInhibitedOutOfSyncGroups; } @Override public List tenantSecretStores() { return tenantSecretStores; } @Override public boolean allowDisableMtls() { return allowDisableMtls; } @Override public List operatorCertificates() { return operatorCertificates; } @Override public double resourceLimitDisk() { return resourceLimitDisk; } @Override public double resourceLimitMemory() { return resourceLimitMemory; } @Override public double minNodeRatioPerGroup() { return minNodeRatioPerGroup; } @Override public double containerShutdownTimeout() { return containerShutdownTimeout; } @Override public boolean containerDumpHeapOnShutdownTimeout() { return containerDumpHeapOnShutdownTimeout; } @Override public int maxUnCommittedMemory() { return maxUnCommittedMemory; } @Override public List zoneDnsSuffixes() { return zoneDnsSuffixes; } @Override public int maxCompactBuffers() { return maxCompactBuffers; } @Override public boolean useV8GeoPositions() { return useV8GeoPositions; } @Override public List environmentVariables() { return environmentVariables; } @Override public boolean sharedStringRepoNoReclaim() { return sharedStringRepoNoReclaim; } @Override public boolean loadCodeAsHugePages() { return loadCodeAsHugePages; } @Override public int mbusNetworkThreads() { return mbus_network_threads; } @Override public int mbusJavaRpcNumTargets() { return mbus_java_num_targets; } @Override public int mbusJavaEventsBeforeWakeup() { return mbus_java_events_before_wakeup; } @Override public int mbusCppRpcNumTargets() { return mbus_cpp_num_targets; } @Override public int mbusCppEventsBeforeWakeup() { return mbus_cpp_events_before_wakeup; } @Override public int rpcNumTargets() { return rpc_num_targets; } @Override public int heapSizePercentage() { return heapSizePercentage; } @Override public int rpcEventsBeforeWakeup() { return rpc_events_before_wakeup; } @Override public String queryDispatchPolicy() { return queryDispatchPolicy; } @Override public String summaryDecodePolicy() { return summaryDecodePolicy; } @Override public Optional cloudAccount() { return cloudAccount; } @Override public boolean allowUserFilters() { return allowUserFilters; } @Override public List dataplaneTokens() { return dataplaneTokens; } @Override public int contentLayerMetadataFeatureLevel() { return contentLayerMetadataFeatureLevel; } @Override public int persistenceThreadMaxFeedOpBatchSize() { return persistenceThreadMaxFeedOpBatchSize; } @Override public boolean logserverOtelCol() { return logserverOtelCol; } @Override public boolean symmetricPutAndActivateReplicaSelection() { return symmetricPutAndActivateReplicaSelection; } @Override public boolean enforceStrictlyIncreasingClusterStateVersions() { return enforceStrictlyIncreasingClusterStateVersions; } @Override public boolean launchApplicationAthenzService() { return launchApplicationAthenzService; } public TestProperties sharedStringRepoNoReclaim(boolean sharedStringRepoNoReclaim) { this.sharedStringRepoNoReclaim = sharedStringRepoNoReclaim; return this; } public TestProperties loadCodeAsHugePages(boolean loadCodeAsHugePages) { this.loadCodeAsHugePages = loadCodeAsHugePages; return this; } public TestProperties maxUnCommittedMemory(int maxUnCommittedMemory) { this.maxUnCommittedMemory = maxUnCommittedMemory; return this; } public TestProperties containerDumpHeapOnShutdownTimeout(boolean value) { containerDumpHeapOnShutdownTimeout = value; return this; } public TestProperties containerShutdownTimeout(double value) { containerShutdownTimeout = value; return this; } public TestProperties setFeedConcurrency(double feedConcurrency) { this.feedConcurrency = feedConcurrency; return this; } public TestProperties setFeedNiceness(double feedNiceness) { this.feedNiceness = feedNiceness; return this; } public TestProperties setHeapSizePercentage(int percentage) { this.heapSizePercentage = percentage; return this; } public TestProperties setAsyncMessageHandlingOnSchedule(boolean value) { useAsyncMessageHandlingOnSchedule = value; return this; } public TestProperties setJvmGCOptions(String gcOptions) { jvmGCOptions = gcOptions; return this; } public TestProperties setQueryDispatchPolicy(String policy) { queryDispatchPolicy = policy; return this; } public TestProperties setSummaryDecodePolicy(String type) { summaryDecodePolicy = type; return this; } public TestProperties setFeedSequencerType(String type) { sequencerType = type; return this; } public TestProperties setResponseSequencerType(String type) { responseSequencerType = type; return this; } public TestProperties setFirstTimeDeployment(boolean firstTimeDeployment) { this.firstTimeDeployment = firstTimeDeployment; return this; } public TestProperties setResponseNumThreads(int numThreads) { responseNumThreads = numThreads; return this; } public TestProperties setDefaultTermwiseLimit(double limit) { defaultTermwiseLimit = limit; return this; } public TestProperties setApplicationId(ApplicationId applicationId) { this.applicationId = applicationId; return this; } public TestProperties setHostedVespa(boolean hostedVespa) { this.hostedVespa = hostedVespa; return this; } public TestProperties setMultitenant(boolean multitenant) { this.multitenant = multitenant; return this; } public TestProperties setConfigServerSpecs(List configServerSpecs) { this.configServerSpecs = List.copyOf(configServerSpecs); return this; } public TestProperties setUseDedicatedNodeForLogserver(boolean useDedicatedNodeForLogserver) { this.useDedicatedNodeForLogserver = useDedicatedNodeForLogserver; return this; } public TestProperties setEndpointCertificateSecrets(Optional endpointCertificateSecrets) { this.endpointCertificateSecrets = endpointCertificateSecrets; return this; } public TestProperties setZone(Zone zone) { this.zone = zone; return this; } public TestProperties setAthenzDomain(AthenzDomain domain) { this.athenzDomain = domain; return this; } public TestProperties setQuota(Quota quota) { this.quota = quota; return this; } public TestProperties maxActivationInhibitedOutOfSyncGroups(int nGroups) { maxActivationInhibitedOutOfSyncGroups = nGroups; return this; } public TestProperties setTenantSecretStores(List secretStores) { this.tenantSecretStores = List.copyOf(secretStores); return this; } public TestProperties allowDisableMtls(boolean value) { this.allowDisableMtls = value; return this; } public TestProperties setOperatorCertificates(List operatorCertificates) { this.operatorCertificates = List.copyOf(operatorCertificates); return this; } public TestProperties setResourceLimitDisk(double value) { this.resourceLimitDisk = value; return this; } public TestProperties setResourceLimitMemory(double value) { this.resourceLimitMemory = value; return this; } public TestProperties setMinNodeRatioPerGroup(double value) { this.minNodeRatioPerGroup = value; return this; } public TestProperties setZoneDnsSuffixes(List zoneDnsSuffixes) { this.zoneDnsSuffixes = List.copyOf(zoneDnsSuffixes); return this; } public TestProperties maxCompactBuffers(int maxCompactBuffers) { this.maxCompactBuffers = maxCompactBuffers; return this; } public TestProperties setUseV8GeoPositions(boolean value) { this.useV8GeoPositions = value; return this; } public TestProperties setEnvironmentVariables(List value) { this.environmentVariables = value; return this; } public TestProperties setMbusNetworkThreads(int value) { this.mbus_network_threads = value; return this; } public TestProperties setMbusJavaRpcNumTargets(int value) { this.mbus_java_num_targets = value; return this; } public TestProperties setMbusJavaEventsBeforeWakeup(int value) { this.mbus_java_events_before_wakeup = value; return this; } public TestProperties setMbusCppEventsBeforeWakeup(int value) { this.mbus_cpp_events_before_wakeup = value; return this; } public TestProperties setMbusCppRpcNumTargets(int value) { this.mbus_cpp_num_targets = value; return this; } public TestProperties setRpcNumTargets(int value) { this.rpc_num_targets = value; return this; } public TestProperties setRpcEventsBeforeWakeup(int value) { this.rpc_events_before_wakeup = value; return this; } public TestProperties setCloudAccount(CloudAccount cloudAccount) { this.cloudAccount = Optional.ofNullable(cloudAccount); return this; } public TestProperties setAllowUserFilters(boolean b) { this.allowUserFilters = b; return this; } public TestProperties setDataplaneTokens(Collection tokens) { this.dataplaneTokens = List.copyOf(tokens); return this; } public TestProperties setContentLayerMetadataFeatureLevel(int level) { this.contentLayerMetadataFeatureLevel = level; return this; } public TestProperties setPersistenceThreadMaxFeedOpBatchSize(int maxBatchSize) { this.persistenceThreadMaxFeedOpBatchSize = maxBatchSize; return this; } public TestProperties setLogserverOtelCol(boolean logserverOtelCol) { this.logserverOtelCol = logserverOtelCol; return this; } public TestProperties setSymmetricPutAndActivateReplicaSelection(boolean symmetricReplicaSelection) { this.symmetricPutAndActivateReplicaSelection = symmetricReplicaSelection; return this; } public TestProperties setEnforceStrictlyIncreasingClusterStateVersions(boolean enforce) { this.enforceStrictlyIncreasingClusterStateVersions = enforce; return this; } public TestProperties setLaunchApplicationAthenzService(boolean launch) { this.launchApplicationAthenzService = launch; return this; } public static class Spec implements ConfigServerSpec { private final String hostName; private final int configServerPort; private final int zooKeeperPort; public String getHostName() { return hostName; } public int getConfigServerPort() { return configServerPort; } public int getZooKeeperPort() { return zooKeeperPort; } @Override public boolean equals(Object o) { if (o instanceof ConfigServerSpec rhsSpec) { return hostName.equals(rhsSpec.getHostName()) && configServerPort == rhsSpec.getConfigServerPort() && zooKeeperPort == rhsSpec.getZooKeeperPort(); } else { return false; } } @Override public int hashCode() { return hostName.hashCode(); } public Spec(String hostName, int configServerPort, int zooKeeperPort) { this.hostName = hostName; this.configServerPort = configServerPort; this.zooKeeperPort = zooKeeperPort; } } }