All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.elasticsearch.plugins.Plugin Maven / Gradle / Ivy

There is a newer version: 8.13.4
Show newest version
/*
 * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 * or more contributor license agreements. Licensed under the Elastic License
 * 2.0 and the Server Side Public License, v 1; you may not use this file except
 * in compliance with, at your election, the Elastic License 2.0 or the Server
 * Side Public License, v 1.
 */

package org.elasticsearch.plugins;

import org.elasticsearch.bootstrap.BootstrapCheck;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.metadata.IndexTemplateMetadata;
import org.elasticsearch.cluster.metadata.Metadata;
import org.elasticsearch.cluster.node.DiscoveryNodeRole;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.component.LifecycleComponent;
import org.elasticsearch.common.inject.Module;
import org.elasticsearch.common.io.stream.NamedWriteable;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.SettingUpgrader;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.env.Environment;
import org.elasticsearch.env.NodeEnvironment;
import org.elasticsearch.index.IndexModule;
import org.elasticsearch.index.shard.IndexSettingProvider;
import org.elasticsearch.repositories.RepositoriesService;
import org.elasticsearch.script.ScriptService;
import org.elasticsearch.threadpool.ExecutorBuilder;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.watcher.ResourceWatcherService;

import java.io.Closeable;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;

/**
 * An extension point allowing to plug in custom functionality. This class has a number of extension points that are available to all
 * plugins, in addition you can implement any of the following interfaces to further customize Elasticsearch:
 * 
    *
  • {@link ActionPlugin} *
  • {@link AnalysisPlugin} *
  • {@link ClusterPlugin} *
  • {@link DiscoveryPlugin} *
  • {@link IngestPlugin} *
  • {@link MapperPlugin} *
  • {@link NetworkPlugin} *
  • {@link RepositoryPlugin} *
  • {@link ScriptPlugin} *
  • {@link SearchPlugin} *
  • {@link ReloadablePlugin} *
*/ public abstract class Plugin implements Closeable { /** * A feature exposed by the plugin. This should be used if a plugin exposes {@link ClusterState.Custom} or {@link Metadata.Custom}; see * also {@link ClusterState.FeatureAware}. * * @return a feature set represented by this plugin, or the empty optional if the plugin does not expose cluster state or metadata * customs */ protected Optional getFeature() { return Optional.empty(); } /** * Node level guice modules. */ public Collection createGuiceModules() { return Collections.emptyList(); } /** * Node level services that will be automatically started/stopped/closed. This classes must be constructed * by injection with guice. */ public Collection> getGuiceServiceClasses() { return Collections.emptyList(); } /** * Returns components added by this plugin. * * Any components returned that implement {@link LifecycleComponent} will have their lifecycle managed. * Note: To aid in the migration away from guice, all objects returned as components will be bound in guice * to themselves. * * @param client A client to make requests to the system * @param clusterService A service to allow watching and updating cluster state * @param threadPool A service to allow retrieving an executor to run an async action * @param resourceWatcherService A service to watch for changes to node local files * @param scriptService A service to allow running scripts on the local node * @param xContentRegistry the registry for extensible xContent parsing * @param environment the environment for path and setting configurations * @param nodeEnvironment the node environment used coordinate access to the data paths * @param namedWriteableRegistry the registry for {@link NamedWriteable} object parsing * @param indexNameExpressionResolver A service that resolves expression to index and alias names * @param repositoriesServiceSupplier A supplier for the service that manages snapshot repositories; will return null when this method * is called, but will return the repositories service once the node is initialized. */ public Collection createComponents(Client client, ClusterService clusterService, ThreadPool threadPool, ResourceWatcherService resourceWatcherService, ScriptService scriptService, NamedXContentRegistry xContentRegistry, Environment environment, NodeEnvironment nodeEnvironment, NamedWriteableRegistry namedWriteableRegistry, IndexNameExpressionResolver indexNameExpressionResolver, Supplier repositoriesServiceSupplier) { return Collections.emptyList(); } /** * Additional node settings loaded by the plugin. Note that settings that are explicit in the nodes settings can't be * overwritten with the additional settings. These settings added if they don't exist. */ public Settings additionalSettings() { return Settings.Builder.EMPTY_SETTINGS; } /** * Returns parsers for {@link NamedWriteable} this plugin will use over the transport protocol. * @see NamedWriteableRegistry */ public List getNamedWriteables() { return Collections.emptyList(); } /** * Returns parsers for named objects this plugin will parse from {@link XContentParser#namedObject(Class, String, Object)}. * @see NamedWriteableRegistry */ public List getNamedXContent() { return Collections.emptyList(); } /** * Called before a new index is created on a node. The given module can be used to register index-level * extensions. */ public void onIndexModule(IndexModule indexModule) {} /** * Returns a list of additional {@link Setting} definitions for this plugin. */ public List> getSettings() { return Collections.emptyList(); } /** * Returns a list of additional settings filter for this plugin */ public List getSettingsFilter() { return Collections.emptyList(); } /** * Get the setting upgraders provided by this plugin. * * @return the settings upgraders */ public List> getSettingUpgraders() { return Collections.emptyList(); } /** * Provides a function to modify index template meta data on startup. *

* Plugins should return the input template map via {@link UnaryOperator#identity()} if no upgrade is required. *

* The order of the template upgrader calls is undefined and can change between runs so, it is expected that * plugins will modify only templates owned by them to avoid conflicts. *

* @return Never {@code null}. The same or upgraded {@code IndexTemplateMetadata} map. * @throws IllegalStateException if the node should not start because at least one {@code IndexTemplateMetadata} * cannot be upgraded */ public UnaryOperator> getIndexTemplateMetadataUpgrader() { return UnaryOperator.identity(); } /** * Provides the list of this plugin's custom thread pools, empty if * none. * * @param settings the current settings * @return executors builders for this plugin's custom thread pools */ public List> getExecutorBuilders(Settings settings) { return Collections.emptyList(); } /** * Returns a list of checks that are enforced when a node starts up once a node has the transport protocol bound to a non-loopback * interface. In this case we assume the node is running in production and all bootstrap checks must pass. This allows plugins * to provide a better out of the box experience by pre-configuring otherwise (in production) mandatory settings or to enforce certain * configurations like OS settings or 3rd party resources. */ public List getBootstrapChecks() { return Collections.emptyList(); } public Set getRoles() { return Collections.emptySet(); } /** * Close the resources opened by this plugin. * * @throws IOException if the plugin failed to close its resources */ @Override public void close() throws IOException { } /** * An {@link IndexSettingProvider} allows hooking in to parts of an index * lifecycle to provide explicit default settings for newly created indices. Rather than changing * the default values for an index-level setting, these act as though the setting has been set * explicitly, but still allow the setting to be overridden by a template or creation request body. */ public Collection getAdditionalIndexSettingProviders() { return Collections.emptyList(); } }