// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.model.api; import com.yahoo.component.Version; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.FileRegistry; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.Zone; import java.io.File; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.net.URI; import java.util.List; import java.util.Optional; import java.util.Set; /** * Model context containing state provided to model factories. * * @author Ulf Lilleengen */ public interface ModelContext { ApplicationPackage applicationPackage(); Optional previousModel(); Optional permanentApplicationPackage(); HostProvisioner getHostProvisioner(); Provisioned provisioned(); DeployLogger deployLogger(); ConfigDefinitionRepo configDefinitionRepo(); FileRegistry getFileRegistry(); default Optional reindexing() { return Optional.empty(); } Properties properties(); default Optional appDir() { return Optional.empty();} /** The Docker image repo we want to use for images for this deployment (optional, will use default if empty) */ default Optional wantedDockerImageRepo() { return Optional.empty(); } /** The Vespa version this model is built for */ Version modelVespaVersion(); /** The Vespa version we want nodes to become */ Version wantedNodeVespaVersion(); /** * How to remove a temporary feature flags: * 1) * - Remove flag definition from Flags * - Remove method implementation from ModelContextImpl.FeatureFlags * - Modify default implementation of below method to return the new default value * - Remove all usage of below method from config-model * * 2) * - (optional) Track Vespa version that introduced changes from 1) in annotation field 'removeAfter' * * 3) * - Remove below method once all config-model versions in hosted production include changes from 1) */ interface FeatureFlags { @ModelFeatureFlag(owners = {"bjorncs", "jonmv"}, removeAfter = "7.352") default boolean enableAutomaticReindexing() { return true; } @ModelFeatureFlag(owners = {"jonmv"}) default double reindexerWindowSizeIncrement() { return 0.2; } @ModelFeatureFlag(owners = {"baldersheim"}, comment = "Revisit in May or June 2021") default double defaultTermwiseLimit() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"vekterli"}) default boolean useThreePhaseUpdates() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}, comment = "Select sequencer type use while feeding") default String feedSequencerType() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}) default String responseSequencerType() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}) default int defaultNumResponseThreads() { return 2; } @ModelFeatureFlag(owners = {"baldersheim"}) default boolean skipCommunicationManagerThread() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}) default boolean skipMbusRequestThread() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}) default boolean skipMbusReplyThread() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"tokle"}) default boolean useAccessControlTlsHandshakeClientAuth() { return false; } @ModelFeatureFlag(owners = {"baldersheim"}) default boolean useAsyncMessageHandlingOnSchedule() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}, removeAfter = "7.350") default int mergeChunkSize() { return 0x2000000; } @ModelFeatureFlag(owners = {"baldersheim"}) default double feedConcurrency() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"baldersheim"}) default boolean useBucketExecutorForLidSpaceCompact() { throw new UnsupportedOperationException("TODO specify default value"); } @ModelFeatureFlag(owners = {"musum", "mpolden"}, comment = "Revisit in February 2021") default boolean reconfigurableZookeeperServer() { return false; } @ModelFeatureFlag(owners = {"bjorncs", "tokle"}) default boolean enableJdiscConnectionLog() { return false; } @ModelFeatureFlag(owners = {"bjorncs", "tokle", "baldersheim"}) default boolean enableZstdCompressionAccessLog() { return false; } @ModelFeatureFlag(owners = {"geirst"}) default boolean enableFeedBlockInDistributor() { return false; } @ModelFeatureFlag(owners = {"baldersheim", "geirst", "toregge"}) default double maxDeadBytesRatio() { return 0.2; } } /** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */ interface Properties { FeatureFlags featureFlags(); boolean multitenant(); ApplicationId applicationId(); List configServerSpecs(); HostName loadBalancerName(); URI ztsUrl(); String athenzDnsSuffix(); boolean hostedVespa(); Zone zone(); Set endpoints(); boolean isBootstrap(); boolean isFirstTimeDeployment(); default Optional endpointCertificateSecrets() { return Optional.empty(); } default Optional athenzDomain() { return Optional.empty(); } Optional applicationRoles(); default Quota quota() { return Quota.unlimited(); } /// Default setting for the gc-options attribute if not specified explicit by application String jvmGCOptions(); // TODO(somebody): Only needed for LbServicesProducerTest default boolean useDedicatedNodeForLogserver() { return true; } } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface ModelFeatureFlag { String[] owners(); String removeAfter() default ""; // On the form "7.100.10" String comment() default ""; } }