com.yahoo.config.model.api.Model Maven / Gradle / Ivy
// Copyright Vespa.ai. 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.ConfigInstance;
import com.yahoo.config.FileReference;
import com.yahoo.config.provision.AllocatedHosts;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.buildergen.ConfigDefinition;
import java.time.Instant;
import java.util.Map;
import java.util.Set;
import java.util.Collection;
/**
* A {@link Model} represents the interface towards the model of an entire tenant, and defines methods
* for querying this model.
*
* @author Ulf Lilleengen
*/
public interface Model {
/**
* Resolves config for a given key and config definition
*
* @param configKey the key to resolve
* @param configDefinition the config definition to use for the schema
*/
ConfigInstance.Builder getConfigInstance(ConfigKey> configKey, ConfigDefinition configDefinition);
/** Produces a set of the valid config keys for this model. */
Set> allConfigsProduced();
/** Returns information about all hosts used in this model. */
Collection getHosts();
/** Returns all the config ids available for this model. */
Set allConfigIds();
/** The set of files that should be distributed to the hosts in this model. */
Set fileReferences();
/**
* Gets the allocated hosts for this model.
*
* @return {@link AllocatedHosts} instance, if available
*/
AllocatedHosts allocatedHosts();
/**
* Returns whether this application allows serving config request for a different version.
* This is a validation override which is useful when we skip loading old config models
* due to some problem, or when we need to try a newer version of the platform on some node.
*/
default boolean allowModelVersionMismatch(Instant now) { return false; }
/**
* Returns whether old config models should be loaded (default) or not.
* Skipping old config models is a validation override which is useful when the old model
* version is known to contain some incompatibility with the application package
* and it is believed that the latest model version will deliver usable config for old versions
* requesting config.
*
* If a model returns true to this it should also return true to {@link #allowModelVersionMismatch}
* or clients requesting config for those old models will not get config at all.
*/
default boolean skipOldConfigModels(Instant now) { return false; }
/** Returns the version of this model. */
default Version version() { return Version.emptyVersion; }
/** Returns the wanted node version of this model. */
default Version wantedNodeVersion() { return Version.emptyVersion; }
/** Returns the provisioned hosts of this. */
default Provisioned provisioned() { return new Provisioned(); }
/** Returns the set of document types in each content cluster. */
default Map> documentTypesByCluster() { return Map.of(); }
/** Returns the set of document types in each cluster, that have an index for one of more fields. */
default Map> indexedDocumentTypesByCluster() { return Map.of(); }
/** Returns the set of container clusters */
default Set applicationClusterInfo() { return Set.of(); }
}