instrumentationMethods) {
+ this.classNameSuffix = classNameSuffix;
+ this.instrumentationMethods = instrumentationMethods;
+ }
+
+ public ClassFileInfo instrumentClassFile(Class> clazz) throws IOException {
+ ClassFileInfo initial = getClassFileInfo(clazz);
+ return new ClassFileInfo(initial.fileName(), instrumentClass(Type.getInternalName(clazz), initial.bytecodes()));
+ }
+
+ public static ClassFileInfo getClassFileInfo(Class> clazz) throws IOException {
+ String internalName = Type.getInternalName(clazz);
+ String fileName = "/" + internalName + ".class";
+ byte[] originalBytecodes;
+ try (InputStream classStream = clazz.getResourceAsStream(fileName)) {
+ if (classStream == null) {
+ throw new IllegalStateException("Classfile not found in jar: " + fileName);
+ }
+ originalBytecodes = classStream.readAllBytes();
+ }
+ return new ClassFileInfo(fileName, originalBytecodes);
+ }
+
+ @Override
+ public byte[] instrumentClass(String className, byte[] classfileBuffer) {
+ ClassReader reader = new ClassReader(classfileBuffer);
+ ClassWriter writer = new ClassWriter(reader, COMPUTE_FRAMES | COMPUTE_MAXS);
+ ClassVisitor visitor = new EntitlementClassVisitor(Opcodes.ASM9, writer, className);
+ reader.accept(visitor, 0);
+ return writer.toByteArray();
+ }
+
+ class EntitlementClassVisitor extends ClassVisitor {
+ final String className;
+
+ EntitlementClassVisitor(int api, ClassVisitor classVisitor, String className) {
+ super(api, classVisitor);
+ this.className = className;
+ }
+
+ @Override
+ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+ super.visit(version, access, name + classNameSuffix, signature, superName, interfaces);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
+ var mv = super.visitMethod(access, name, descriptor, signature, exceptions);
+ boolean isStatic = (access & ACC_STATIC) != 0;
+ var key = new MethodKey(
+ className,
+ name,
+ Stream.of(Type.getArgumentTypes(descriptor)).map(Type::getInternalName).toList(),
+ isStatic
+ );
+ var instrumentationMethod = instrumentationMethods.get(key);
+ if (instrumentationMethod != null) {
+ // LOGGER.debug("Will instrument method {}", key);
+ return new EntitlementMethodVisitor(Opcodes.ASM9, mv, isStatic, descriptor, instrumentationMethod);
+ } else {
+ // LOGGER.trace("Will not instrument method {}", key);
+ }
+ return mv;
+ }
+ }
+
+ static class EntitlementMethodVisitor extends MethodVisitor {
+ private final boolean instrumentedMethodIsStatic;
+ private final String instrumentedMethodDescriptor;
+ private final Method instrumentationMethod;
+ private boolean hasCallerSensitiveAnnotation = false;
+
+ EntitlementMethodVisitor(
+ int api,
+ MethodVisitor methodVisitor,
+ boolean instrumentedMethodIsStatic,
+ String instrumentedMethodDescriptor,
+ Method instrumentationMethod
+ ) {
+ super(api, methodVisitor);
+ this.instrumentedMethodIsStatic = instrumentedMethodIsStatic;
+ this.instrumentedMethodDescriptor = instrumentedMethodDescriptor;
+ this.instrumentationMethod = instrumentationMethod;
+ }
+
+ @Override
+ public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
+ if (visible && descriptor.endsWith("CallerSensitive;")) {
+ hasCallerSensitiveAnnotation = true;
+ }
+ return super.visitAnnotation(descriptor, visible);
+ }
+
+ @Override
+ public void visitCode() {
+ pushEntitlementChecksObject();
+ pushCallerClass();
+ forwardIncomingArguments();
+ invokeInstrumentationMethod();
+ super.visitCode();
+ }
+
+ private void pushEntitlementChecksObject() {
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "org/elasticsearch/entitlement/api/EntitlementProvider",
+ "checks",
+ "()Lorg/elasticsearch/entitlement/api/EntitlementChecks;",
+ false
+ );
+ }
+
+ private void pushCallerClass() {
+ if (hasCallerSensitiveAnnotation) {
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ "jdk/internal/reflect/Reflection",
+ "getCallerClass",
+ Type.getMethodDescriptor(Type.getType(Class.class)),
+ false
+ );
+ } else {
+ mv.visitFieldInsn(
+ GETSTATIC,
+ Type.getInternalName(StackWalker.Option.class),
+ "RETAIN_CLASS_REFERENCE",
+ Type.getDescriptor(StackWalker.Option.class)
+ );
+ mv.visitMethodInsn(
+ INVOKESTATIC,
+ Type.getInternalName(StackWalker.class),
+ "getInstance",
+ Type.getMethodDescriptor(Type.getType(StackWalker.class), Type.getType(StackWalker.Option.class)),
+ false
+ );
+ mv.visitMethodInsn(
+ INVOKEVIRTUAL,
+ Type.getInternalName(StackWalker.class),
+ "getCallerClass",
+ Type.getMethodDescriptor(Type.getType(Class.class)),
+ false
+ );
+ }
+ }
+
+ private void forwardIncomingArguments() {
+ int localVarIndex = 0;
+ if (instrumentedMethodIsStatic == false) {
+ mv.visitVarInsn(Opcodes.ALOAD, localVarIndex++);
+ }
+ for (Type type : Type.getArgumentTypes(instrumentedMethodDescriptor)) {
+ mv.visitVarInsn(type.getOpcode(Opcodes.ILOAD), localVarIndex);
+ localVarIndex += type.getSize();
+ }
+
+ }
+
+ private void invokeInstrumentationMethod() {
+ mv.visitMethodInsn(
+ INVOKEINTERFACE,
+ Type.getInternalName(instrumentationMethod.getDeclaringClass()),
+ instrumentationMethod.getName(),
+ Type.getMethodDescriptor(instrumentationMethod),
+ true
+ );
+ }
+ }
+
+ // private static final Logger LOGGER = LogManager.getLogger(Instrumenter.class);
+
+ public record ClassFileInfo(String fileName, byte[] bytecodes) {}
+}
diff --git a/distribution/tools/entitlement-agent/impl/src/main/resources/META-INF/services/org.elasticsearch.entitlement.instrumentation.InstrumentationService b/distribution/tools/entitlement-agent/impl/src/main/resources/META-INF/services/org.elasticsearch.entitlement.instrumentation.InstrumentationService
new file mode 100644
index 0000000000000..da2e1bc1e67ba
--- /dev/null
+++ b/distribution/tools/entitlement-agent/impl/src/main/resources/META-INF/services/org.elasticsearch.entitlement.instrumentation.InstrumentationService
@@ -0,0 +1,10 @@
+#
+ # 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ # License v3.0 only", or the "Server Side Public License, v 1".
+#
+
+org.elasticsearch.entitlement.instrumentation.impl.InstrumentationServiceImpl
diff --git a/distribution/tools/entitlement-agent/impl/src/test/java/org/elasticsearch/entitlement/instrumentation/impl/ASMUtils.java b/distribution/tools/entitlement-agent/impl/src/test/java/org/elasticsearch/entitlement/instrumentation/impl/ASMUtils.java
new file mode 100644
index 0000000000000..d7aaa6d854e9c
--- /dev/null
+++ b/distribution/tools/entitlement-agent/impl/src/test/java/org/elasticsearch/entitlement/instrumentation/impl/ASMUtils.java
@@ -0,0 +1,31 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.instrumentation.impl;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.util.Printer;
+import org.objectweb.asm.util.Textifier;
+import org.objectweb.asm.util.TraceClassVisitor;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class ASMUtils {
+ public static String bytecode2text(byte[] classBytes) {
+ ClassReader classReader = new ClassReader(classBytes);
+ StringWriter stringWriter = new StringWriter();
+ try (PrintWriter printWriter = new PrintWriter(stringWriter)) {
+ Printer printer = new Textifier(); // For a textual representation
+ TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, printer, printWriter);
+ classReader.accept(traceClassVisitor, 0);
+ return stringWriter.toString();
+ }
+ }
+}
diff --git a/distribution/tools/entitlement-agent/impl/src/test/java/org/elasticsearch/entitlement/instrumentation/impl/InstrumenterTests.java b/distribution/tools/entitlement-agent/impl/src/test/java/org/elasticsearch/entitlement/instrumentation/impl/InstrumenterTests.java
new file mode 100644
index 0000000000000..e807ecee4f103
--- /dev/null
+++ b/distribution/tools/entitlement-agent/impl/src/test/java/org/elasticsearch/entitlement/instrumentation/impl/InstrumenterTests.java
@@ -0,0 +1,153 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.instrumentation.impl;
+
+import org.elasticsearch.entitlement.api.EntitlementChecks;
+import org.elasticsearch.entitlement.api.EntitlementProvider;
+import org.elasticsearch.entitlement.instrumentation.InstrumentationService;
+import org.elasticsearch.entitlement.instrumentation.MethodKey;
+import org.elasticsearch.logging.LogManager;
+import org.elasticsearch.logging.Logger;
+import org.elasticsearch.test.ESTestCase;
+import org.junit.Before;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+import static org.elasticsearch.entitlement.instrumentation.impl.ASMUtils.bytecode2text;
+
+/**
+ * This tests {@link InstrumenterImpl} in isolation, without a java agent.
+ * It causes the methods to be instrumented, and verifies that the instrumentation is called as expected.
+ * Problems with bytecode generation are easier to debug this way than in the context of an agent.
+ */
+@ESTestCase.WithoutSecurityManager
+public class InstrumenterTests extends ESTestCase {
+ final InstrumentationService instrumentationService = new InstrumentationServiceImpl();
+
+ private static TestEntitlementManager getTestChecks() {
+ return (TestEntitlementManager) EntitlementProvider.checks();
+ }
+
+ @Before
+ public void initialize() {
+ getTestChecks().isActive = false;
+ }
+
+ /**
+ * Contains all the virtual methods from {@link ClassToInstrument},
+ * allowing this test to call them on the dynamically loaded instrumented class.
+ */
+ public interface Testable {}
+
+ /**
+ * This is a placeholder for real class library methods.
+ * Without the java agent, we can't instrument the real methods, so we instrument this instead.
+ *
+ * Methods of this class must have the same signature and the same static/virtual condition as the corresponding real method.
+ * They should assert that the arguments came through correctly.
+ * They must not throw {@link TestException}.
+ */
+ public static class ClassToInstrument implements Testable {
+ public static void systemExit(int status) {
+ assertEquals(123, status);
+ }
+ }
+
+ static final class TestException extends RuntimeException {}
+
+ /**
+ * We're not testing the permission checking logic here.
+ * This is a trivial implementation of {@link EntitlementChecks} that just always throws,
+ * just to demonstrate that the injected bytecodes succeed in calling these methods.
+ */
+ public static class TestEntitlementManager implements EntitlementChecks {
+ /**
+ * This allows us to test that the instrumentation is correct in both cases:
+ * if the check throws, and if it doesn't.
+ */
+ volatile boolean isActive;
+
+ @Override
+ public void checkSystemExit(Class> callerClass, int status) {
+ assertSame(InstrumenterTests.class, callerClass);
+ assertEquals(123, status);
+ throwIfActive();
+ }
+
+ private void throwIfActive() {
+ if (isActive) {
+ throw new TestException();
+ }
+ }
+ }
+
+ public void test() throws Exception {
+ // This test doesn't replace ClassToInstrument in-place but instead loads a separate
+ // class ClassToInstrument_NEW that contains the instrumentation. Because of this,
+ // we need to configure the Transformer to use a MethodKey and instrumentationMethod
+ // with slightly different signatures (using the common interface Testable) which
+ // is not what would happen when it's run by the agent.
+
+ MethodKey k1 = instrumentationService.methodKeyForTarget(ClassToInstrument.class.getMethod("systemExit", int.class));
+ Method v1 = EntitlementChecks.class.getMethod("checkSystemExit", Class.class, int.class);
+ var instrumenter = new InstrumenterImpl("_NEW", Map.of(k1, v1));
+
+ byte[] newBytecode = instrumenter.instrumentClassFile(ClassToInstrument.class).bytecodes();
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Bytecode after instrumentation:\n{}", bytecode2text(newBytecode));
+ }
+
+ Class> newClass = new TestLoader(Testable.class.getClassLoader()).defineClassFromBytes(
+ ClassToInstrument.class.getName() + "_NEW",
+ newBytecode
+ );
+
+ // Before checking is active, nothing should throw
+ callStaticSystemExit(newClass, 123);
+
+ getTestChecks().isActive = true;
+
+ // After checking is activated, everything should throw
+ assertThrows(TestException.class, () -> callStaticSystemExit(newClass, 123));
+ }
+
+ /**
+ * Calling a static method of a dynamically loaded class is significantly more cumbersome
+ * than calling a virtual method.
+ */
+ private static void callStaticSystemExit(Class> c, int status) throws NoSuchMethodException, IllegalAccessException {
+ try {
+ c.getMethod("systemExit", int.class).invoke(null, status);
+ } catch (InvocationTargetException e) {
+ Throwable cause = e.getCause();
+ if (cause instanceof TestException n) {
+ // Sometimes we're expecting this one!
+ throw n;
+ } else {
+ throw new AssertionError(cause);
+ }
+ }
+ }
+
+ static class TestLoader extends ClassLoader {
+ TestLoader(ClassLoader parent) {
+ super(parent);
+ }
+
+ public Class> defineClassFromBytes(String name, byte[] bytes) {
+ return defineClass(name, bytes, 0, bytes.length);
+ }
+ }
+
+ private static final Logger logger = LogManager.getLogger(InstrumenterTests.class);
+}
diff --git a/distribution/tools/entitlement-agent/impl/src/test/resources/META-INF/services/org.elasticsearch.entitlement.api.EntitlementChecks b/distribution/tools/entitlement-agent/impl/src/test/resources/META-INF/services/org.elasticsearch.entitlement.api.EntitlementChecks
new file mode 100644
index 0000000000000..983585190b35a
--- /dev/null
+++ b/distribution/tools/entitlement-agent/impl/src/test/resources/META-INF/services/org.elasticsearch.entitlement.api.EntitlementChecks
@@ -0,0 +1,10 @@
+#
+ # 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ # License v3.0 only", or the "Server Side Public License, v 1".
+#
+
+org.elasticsearch.entitlement.instrumentation.impl.InstrumenterTests$TestEntitlementManager
diff --git a/distribution/tools/entitlement-agent/src/main/java/module-info.java b/distribution/tools/entitlement-agent/src/main/java/module-info.java
new file mode 100644
index 0000000000000..0eb87aeee3f6c
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/main/java/module-info.java
@@ -0,0 +1,19 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+import org.elasticsearch.entitlement.instrumentation.InstrumentationService;
+
+module org.elasticsearch.entitlement.agent {
+ requires java.instrument;
+ requires org.elasticsearch.base; // for @SuppressForbidden
+
+ exports org.elasticsearch.entitlement.instrumentation to org.elasticsearch.entitlement.agent.impl;
+
+ uses InstrumentationService;
+}
diff --git a/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/agent/EntitlementAgent.java b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/agent/EntitlementAgent.java
new file mode 100644
index 0000000000000..acb11af97bb5b
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/agent/EntitlementAgent.java
@@ -0,0 +1,61 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.agent;
+
+import org.elasticsearch.core.SuppressForbidden;
+import org.elasticsearch.core.internal.provider.ProviderLocator;
+import org.elasticsearch.entitlement.instrumentation.InstrumentationService;
+import org.elasticsearch.entitlement.instrumentation.MethodKey;
+
+import java.io.IOException;
+import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.JarFile;
+
+public class EntitlementAgent {
+
+ public static void premain(String agentArgs, Instrumentation inst) throws Exception {
+ // Add the bridge library (the one with the entitlement checking interface) to the bootstrap classpath.
+ // We can't actually reference the classes here for real before this point because they won't resolve.
+ var bridgeJarName = System.getProperty("es.entitlements.bridgeJar");
+ if (bridgeJarName == null) {
+ throw new IllegalArgumentException("System property es.entitlements.bridgeJar is required");
+ }
+ addJarToBootstrapClassLoader(inst, bridgeJarName);
+
+ Method targetMethod = System.class.getMethod("exit", int.class);
+ Method instrumentationMethod = Class.forName("org.elasticsearch.entitlement.api.EntitlementChecks")
+ .getMethod("checkSystemExit", Class.class, int.class);
+ Map methodMap = Map.of(INSTRUMENTER_FACTORY.methodKeyForTarget(targetMethod), instrumentationMethod);
+
+ inst.addTransformer(new Transformer(INSTRUMENTER_FACTORY.newInstrumenter("", methodMap), Set.of(internalName(System.class))), true);
+ inst.retransformClasses(System.class);
+ }
+
+ @SuppressForbidden(reason = "The appendToBootstrapClassLoaderSearch method takes a JarFile")
+ private static void addJarToBootstrapClassLoader(Instrumentation inst, String jarString) throws IOException {
+ inst.appendToBootstrapClassLoaderSearch(new JarFile(jarString));
+ }
+
+ private static String internalName(Class> c) {
+ return c.getName().replace('.', '/');
+ }
+
+ private static final InstrumentationService INSTRUMENTER_FACTORY = (new ProviderLocator<>(
+ "entitlement-agent",
+ InstrumentationService.class,
+ "org.elasticsearch.entitlement.agent.impl",
+ Set.of("org.objectweb.nonexistent.asm")
+ )).get();
+
+ // private static final Logger LOGGER = LogManager.getLogger(EntitlementAgent.class);
+}
diff --git a/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/agent/Transformer.java b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/agent/Transformer.java
new file mode 100644
index 0000000000000..bd9bb5bf2e5c6
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/agent/Transformer.java
@@ -0,0 +1,49 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.agent;
+
+import org.elasticsearch.entitlement.instrumentation.Instrumenter;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.security.ProtectionDomain;
+import java.util.Set;
+
+/**
+ * A {@link ClassFileTransformer} that applies an {@link Instrumenter} to the appropriate classes.
+ */
+public class Transformer implements ClassFileTransformer {
+ private final Instrumenter instrumenter;
+ private final Set classesToTransform;
+
+ public Transformer(Instrumenter instrumenter, Set classesToTransform) {
+ this.instrumenter = instrumenter;
+ this.classesToTransform = classesToTransform;
+ // TODO: Should warn if any MethodKey doesn't match any methods
+ }
+
+ @Override
+ public byte[] transform(
+ ClassLoader loader,
+ String className,
+ Class> classBeingRedefined,
+ ProtectionDomain protectionDomain,
+ byte[] classfileBuffer
+ ) {
+ if (classesToTransform.contains(className)) {
+ // System.out.println("Transforming " + className);
+ return instrumenter.instrumentClass(className, classfileBuffer);
+ } else {
+ // System.out.println("Not transforming " + className);
+ return classfileBuffer;
+ }
+ }
+
+ // private static final Logger LOGGER = LogManager.getLogger(Transformer.class);
+}
diff --git a/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/InstrumentationService.java b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/InstrumentationService.java
new file mode 100644
index 0000000000000..25fa84ec7c4ba
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/InstrumentationService.java
@@ -0,0 +1,25 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.instrumentation;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * The SPI service entry point for instrumentation.
+ */
+public interface InstrumentationService {
+ Instrumenter newInstrumenter(String classNameSuffix, Map instrumentationMethods);
+
+ /**
+ * @return a {@link MethodKey} suitable for looking up the given {@code targetMethod} in the entitlements trampoline
+ */
+ MethodKey methodKeyForTarget(Method targetMethod);
+}
diff --git a/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/Instrumenter.java b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/Instrumenter.java
new file mode 100644
index 0000000000000..9f39cbbbd0df0
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/Instrumenter.java
@@ -0,0 +1,14 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.instrumentation;
+
+public interface Instrumenter {
+ byte[] instrumentClass(String className, byte[] classfileBuffer);
+}
diff --git a/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/MethodKey.java b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/MethodKey.java
new file mode 100644
index 0000000000000..54e09c10bcc57
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/main/java/org/elasticsearch/entitlement/instrumentation/MethodKey.java
@@ -0,0 +1,18 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.instrumentation;
+
+import java.util.List;
+
+/**
+ *
+ * @param className the "internal name" of the class: includes the package info, but with periods replaced by slashes
+ */
+public record MethodKey(String className, String methodName, List parameterTypes, boolean isStatic) {}
diff --git a/distribution/tools/entitlement-agent/src/test/java/org/elasticsearch/entitlement/agent/EntitlementAgentTests.java b/distribution/tools/entitlement-agent/src/test/java/org/elasticsearch/entitlement/agent/EntitlementAgentTests.java
new file mode 100644
index 0000000000000..cf7991626029a
--- /dev/null
+++ b/distribution/tools/entitlement-agent/src/test/java/org/elasticsearch/entitlement/agent/EntitlementAgentTests.java
@@ -0,0 +1,52 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.agent;
+
+import com.carrotsearch.randomizedtesting.annotations.SuppressForbidden;
+
+import org.elasticsearch.entitlement.runtime.api.ElasticsearchEntitlementManager;
+import org.elasticsearch.entitlement.runtime.api.NotEntitledException;
+import org.elasticsearch.entitlement.runtime.internals.EntitlementInternals;
+import org.elasticsearch.test.ESTestCase;
+import org.elasticsearch.test.ESTestCase.WithoutSecurityManager;
+import org.junit.After;
+
+/**
+ * This is an end-to-end test of the agent and entitlement runtime.
+ * It runs with the agent installed, and exhaustively tests every instrumented method
+ * to make sure it works with the entitlement granted and throws without it.
+ * The only exception is {@link System#exit}, where we can't that it works without
+ * terminating the JVM.
+ *
+ * If you're trying to debug the instrumentation code, take a look at {@code InstrumenterTests}.
+ * That tests the bytecode portion without firing up an agent, which makes everything easier to troubleshoot.
+ *
+ * See {@code build.gradle} for how we set the command line arguments for this test.
+ */
+@WithoutSecurityManager
+public class EntitlementAgentTests extends ESTestCase {
+
+ public static final ElasticsearchEntitlementManager ENTITLEMENT_MANAGER = ElasticsearchEntitlementManager.get();
+
+ @After
+ public void resetEverything() {
+ EntitlementInternals.reset();
+ }
+
+ /**
+ * We can't really check that this one passes because it will just exit the JVM.
+ */
+ @SuppressForbidden("Specifically testing System.exit")
+ public void testSystemExitNotEntitled() {
+ ENTITLEMENT_MANAGER.activate();
+ assertThrows(NotEntitledException.class, () -> System.exit(123));
+ }
+
+}
diff --git a/distribution/tools/entitlement-bridge/README.md b/distribution/tools/entitlement-bridge/README.md
new file mode 100644
index 0000000000000..7204d1d2c98cf
--- /dev/null
+++ b/distribution/tools/entitlement-bridge/README.md
@@ -0,0 +1,11 @@
+### Entitlement Bridge
+
+This is the code called directly from instrumented methods.
+It's a minimal code stub that is loaded into the boot classloader by the entitlement agent
+so that it is callable from the class library methods instrumented by the agent.
+Its job is to forward the entitlement checks to the actual runtime library,
+which is loaded normally.
+
+It is not responsible for injecting the bytecode instrumentation (that's the agent)
+nor for implementing the permission checks (that's the runtime library).
+
diff --git a/distribution/tools/entitlement-bridge/build.gradle b/distribution/tools/entitlement-bridge/build.gradle
new file mode 100644
index 0000000000000..29969a8629648
--- /dev/null
+++ b/distribution/tools/entitlement-bridge/build.gradle
@@ -0,0 +1,18 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+apply plugin: 'elasticsearch.build'
+
+dependencies {
+}
+
+tasks.named('forbiddenApisMain').configure {
+ replaceSignatureFiles 'jdk-signatures'
+}
+
diff --git a/distribution/tools/entitlement-bridge/src/main/java/module-info.java b/distribution/tools/entitlement-bridge/src/main/java/module-info.java
new file mode 100644
index 0000000000000..7091ae34ce1e1
--- /dev/null
+++ b/distribution/tools/entitlement-bridge/src/main/java/module-info.java
@@ -0,0 +1,14 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+module org.elasticsearch.entitlement.bridge {
+ uses org.elasticsearch.entitlement.api.EntitlementChecks;
+
+ exports org.elasticsearch.entitlement.api;
+}
diff --git a/distribution/tools/entitlement-bridge/src/main/java/org/elasticsearch/entitlement/api/EntitlementChecks.java b/distribution/tools/entitlement-bridge/src/main/java/org/elasticsearch/entitlement/api/EntitlementChecks.java
new file mode 100644
index 0000000000000..b45313eb018a7
--- /dev/null
+++ b/distribution/tools/entitlement-bridge/src/main/java/org/elasticsearch/entitlement/api/EntitlementChecks.java
@@ -0,0 +1,14 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.api;
+
+public interface EntitlementChecks {
+ void checkSystemExit(Class> callerClass, int status);
+}
diff --git a/distribution/tools/entitlement-bridge/src/main/java/org/elasticsearch/entitlement/api/EntitlementProvider.java b/distribution/tools/entitlement-bridge/src/main/java/org/elasticsearch/entitlement/api/EntitlementProvider.java
new file mode 100644
index 0000000000000..bc10adcd086e9
--- /dev/null
+++ b/distribution/tools/entitlement-bridge/src/main/java/org/elasticsearch/entitlement/api/EntitlementProvider.java
@@ -0,0 +1,34 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.api;
+
+import java.util.List;
+import java.util.ServiceLoader;
+
+public class EntitlementProvider {
+ private static final EntitlementChecks CHECKS = lookupEntitlementChecksImplementation();
+
+ public static EntitlementChecks checks() {
+ return CHECKS;
+ }
+
+ private static EntitlementChecks lookupEntitlementChecksImplementation() {
+ List candidates = ServiceLoader.load(EntitlementChecks.class).stream().map(ServiceLoader.Provider::get).toList();
+ if (candidates.isEmpty()) {
+ throw new IllegalStateException("No EntitlementChecks service");
+ } else if (candidates.size() >= 2) {
+ throw new IllegalStateException(
+ "Multiple EntitlementChecks services: " + candidates.stream().map(e -> e.getClass().getSimpleName()).toList()
+ );
+ } else {
+ return candidates.get(0);
+ }
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/README.md b/distribution/tools/entitlement-runtime/README.md
new file mode 100644
index 0000000000000..3e064705c3aef
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/README.md
@@ -0,0 +1,7 @@
+### Entitlement runtime
+
+This module implements mechanisms to grant and check permissions under the _entitlements_ system.
+
+The entitlements system provides an alternative to the legacy `SecurityManager` system, which is deprecated for removal.
+The `entitlement-agent` tool instruments sensitive class library methods with calls to this module, in order to enforce the controls.
+
diff --git a/distribution/tools/entitlement-runtime/build.gradle b/distribution/tools/entitlement-runtime/build.gradle
new file mode 100644
index 0000000000000..55471272c1b5f
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/build.gradle
@@ -0,0 +1,22 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+apply plugin: 'elasticsearch.build'
+apply plugin: 'elasticsearch.publish'
+
+dependencies {
+ compileOnly project(':libs:elasticsearch-core') // For @SuppressForbidden
+ compileOnly project(":libs:elasticsearch-x-content") // for parsing policy files
+ compileOnly project(':server') // To access the main server module for special permission checks
+ compileOnly project(':distribution:tools:entitlement-bridge')
+ testImplementation project(":test:framework")
+}
+
+tasks.named('forbiddenApisMain').configure {
+ replaceSignatureFiles 'jdk-signatures'
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/module-info.java b/distribution/tools/entitlement-runtime/src/main/java/module-info.java
new file mode 100644
index 0000000000000..12e6905014512
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/module-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+module org.elasticsearch.entitlement.runtime {
+ requires org.elasticsearch.entitlement.bridge;
+ requires org.elasticsearch.xcontent;
+ requires org.elasticsearch.server;
+
+ exports org.elasticsearch.entitlement.runtime.api;
+
+ provides org.elasticsearch.entitlement.api.EntitlementChecks
+ with
+ org.elasticsearch.entitlement.runtime.api.ElasticsearchEntitlementManager;
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/api/ElasticsearchEntitlementManager.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/api/ElasticsearchEntitlementManager.java
new file mode 100644
index 0000000000000..a80d412f5dbd7
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/api/ElasticsearchEntitlementManager.java
@@ -0,0 +1,77 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.api;
+
+import org.elasticsearch.entitlement.api.EntitlementChecks;
+import org.elasticsearch.entitlement.api.EntitlementProvider;
+
+import java.util.Optional;
+
+import static org.elasticsearch.entitlement.runtime.internals.EntitlementInternals.isActive;
+
+/**
+ * Implementation of the {@link EntitlementChecks} interface, providing additional
+ * API methods for managing the checks.
+ * The trampoline module loads this object via SPI.
+ */
+public class ElasticsearchEntitlementManager implements EntitlementChecks {
+ /**
+ * @return the same instance of {@link ElasticsearchEntitlementManager} returned by {@link EntitlementProvider}.
+ */
+ public static ElasticsearchEntitlementManager get() {
+ return (ElasticsearchEntitlementManager) EntitlementProvider.checks();
+ }
+
+ /**
+ * Causes entitlements to be enforced.
+ */
+ public void activate() {
+ isActive = true;
+ }
+
+ @Override
+ public void checkSystemExit(Class> callerClass, int status) {
+ var requestingModule = requestingModule(callerClass);
+ if (isTriviallyAllowed(requestingModule)) {
+ // System.out.println(" - Trivially allowed");
+ return;
+ }
+ // Hard-forbidden until we develop the permission granting scheme
+ throw new NotEntitledException("Missing entitlement for " + requestingModule);
+ }
+
+ private static Module requestingModule(Class> callerClass) {
+ if (callerClass != null) {
+ Module callerModule = callerClass.getModule();
+ if (callerModule.getLayer() != ModuleLayer.boot()) {
+ // fast path
+ return callerModule;
+ }
+ }
+ int framesToSkip = 1 // getCallingClass (this method)
+ + 1 // the checkXxx method
+ + 1 // the runtime config method
+ + 1 // the instrumented method
+ ;
+ Optional module = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE)
+ .walk(
+ s -> s.skip(framesToSkip)
+ .map(f -> f.getDeclaringClass().getModule())
+ .filter(m -> m.getLayer() != ModuleLayer.boot())
+ .findFirst()
+ );
+ return module.orElse(null);
+ }
+
+ private static boolean isTriviallyAllowed(Module requestingModule) {
+ return isActive == false || (requestingModule == null) || requestingModule == System.class.getModule();
+ }
+
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/api/NotEntitledException.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/api/NotEntitledException.java
new file mode 100644
index 0000000000000..5afffc84f77a8
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/api/NotEntitledException.java
@@ -0,0 +1,20 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.api;
+
+public class NotEntitledException extends RuntimeException {
+ public NotEntitledException(String message) {
+ super(message);
+ }
+
+ public NotEntitledException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/internals/EntitlementInternals.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/internals/EntitlementInternals.java
new file mode 100644
index 0000000000000..ea83caf198b0a
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/internals/EntitlementInternals.java
@@ -0,0 +1,24 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.internals;
+
+/**
+ * Don't export this from the module. Just don't.
+ */
+public class EntitlementInternals {
+ /**
+ * When false, entitlement rules are not enforced; all operations are allowed.
+ */
+ public static volatile boolean isActive = false;
+
+ public static void reset() {
+ isActive = false;
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Entitlement.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Entitlement.java
new file mode 100644
index 0000000000000..5b53c399cc1b7
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Entitlement.java
@@ -0,0 +1,19 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+/**
+ * Marker interface to ensure that only {@link Entitlement} are
+ * part of a {@link Policy}. All entitlement classes should implement
+ * this.
+ */
+public interface Entitlement {
+
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/ExternalEntitlement.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/ExternalEntitlement.java
new file mode 100644
index 0000000000000..bb1205696b49e
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/ExternalEntitlement.java
@@ -0,0 +1,36 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation indicates an {@link Entitlement} is available
+ * to "external" classes such as those used in plugins. Any {@link Entitlement}
+ * using this annotation is considered parseable as part of a policy file
+ * for entitlements.
+ */
+@Target(ElementType.CONSTRUCTOR)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExternalEntitlement {
+
+ /**
+ * This is the list of parameter names that are
+ * parseable in {@link PolicyParser#parseEntitlement(String, String)}.
+ * The number and order of parameter names much match the number and order
+ * of constructor parameters as this is how the parser will pass in the
+ * parsed values from a policy file. However, the names themselves do NOT
+ * have to match the parameter names of the constructor.
+ */
+ String[] parameterNames() default {};
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileEntitlement.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileEntitlement.java
new file mode 100644
index 0000000000000..8df199591d3e4
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/FileEntitlement.java
@@ -0,0 +1,67 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Describes a file entitlement with a path and actions.
+ */
+public class FileEntitlement implements Entitlement {
+
+ public static final int READ_ACTION = 0x1;
+ public static final int WRITE_ACTION = 0x2;
+
+ private final String path;
+ private final int actions;
+
+ @ExternalEntitlement(parameterNames = { "path", "actions" })
+ public FileEntitlement(String path, List actionsList) {
+ this.path = path;
+ int actionsInt = 0;
+
+ for (String actionString : actionsList) {
+ if ("read".equals(actionString)) {
+ if ((actionsInt & READ_ACTION) == READ_ACTION) {
+ throw new IllegalArgumentException("file action [read] specified multiple times");
+ }
+ actionsInt |= READ_ACTION;
+ } else if ("write".equals(actionString)) {
+ if ((actionsInt & WRITE_ACTION) == WRITE_ACTION) {
+ throw new IllegalArgumentException("file action [write] specified multiple times");
+ }
+ actionsInt |= WRITE_ACTION;
+ } else {
+ throw new IllegalArgumentException("unknown file action [" + actionString + "]");
+ }
+ }
+
+ this.actions = actionsInt;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ FileEntitlement that = (FileEntitlement) o;
+ return actions == that.actions && Objects.equals(path, that.path);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(path, actions);
+ }
+
+ @Override
+ public String toString() {
+ return "FileEntitlement{" + "path='" + path + '\'' + ", actions=" + actions + '}';
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Policy.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Policy.java
new file mode 100644
index 0000000000000..e8bd7a3fff357
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Policy.java
@@ -0,0 +1,46 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A holder for scoped entitlements.
+ */
+public class Policy {
+
+ public final String name;
+ public final List scopes;
+
+ public Policy(String name, List scopes) {
+ this.name = Objects.requireNonNull(name);
+ this.scopes = Collections.unmodifiableList(Objects.requireNonNull(scopes));
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Policy policy = (Policy) o;
+ return Objects.equals(name, policy.name) && Objects.equals(scopes, policy.scopes);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, scopes);
+ }
+
+ @Override
+ public String toString() {
+ return "Policy{" + "name='" + name + '\'' + ", scopes=" + scopes + '}';
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyParser.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyParser.java
new file mode 100644
index 0000000000000..229ccec3b8b2c
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyParser.java
@@ -0,0 +1,176 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import org.elasticsearch.xcontent.ParseField;
+import org.elasticsearch.xcontent.XContentParser;
+import org.elasticsearch.xcontent.XContentParserConfiguration;
+import org.elasticsearch.xcontent.yaml.YamlXContent;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UncheckedIOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import static org.elasticsearch.entitlement.runtime.policy.PolicyParserException.newPolicyParserException;
+
+/**
+ * A parser to parse policy files for entitlements.
+ */
+public class PolicyParser {
+
+ protected static final ParseField ENTITLEMENTS_PARSEFIELD = new ParseField("entitlements");
+
+ protected static final String entitlementPackageName = Entitlement.class.getPackage().getName();
+
+ protected final XContentParser policyParser;
+ protected final String policyName;
+
+ public PolicyParser(InputStream inputStream, String policyName) throws IOException {
+ this.policyParser = YamlXContent.yamlXContent.createParser(XContentParserConfiguration.EMPTY, Objects.requireNonNull(inputStream));
+ this.policyName = policyName;
+ }
+
+ public Policy parsePolicy() {
+ try {
+ if (policyParser.nextToken() != XContentParser.Token.START_OBJECT) {
+ throw newPolicyParserException("expected object ");
+ }
+ List scopes = new ArrayList<>();
+ while (policyParser.nextToken() != XContentParser.Token.END_OBJECT) {
+ if (policyParser.currentToken() != XContentParser.Token.FIELD_NAME) {
+ throw newPolicyParserException("expected object ");
+ }
+ String scopeName = policyParser.currentName();
+ Scope scope = parseScope(scopeName);
+ scopes.add(scope);
+ }
+ return new Policy(policyName, scopes);
+ } catch (IOException ioe) {
+ throw new UncheckedIOException(ioe);
+ }
+ }
+
+ protected Scope parseScope(String scopeName) throws IOException {
+ try {
+ if (policyParser.nextToken() != XContentParser.Token.START_OBJECT) {
+ throw newPolicyParserException(scopeName, "expected object [" + ENTITLEMENTS_PARSEFIELD.getPreferredName() + "]");
+ }
+ if (policyParser.nextToken() != XContentParser.Token.FIELD_NAME
+ || policyParser.currentName().equals(ENTITLEMENTS_PARSEFIELD.getPreferredName()) == false) {
+ throw newPolicyParserException(scopeName, "expected object [" + ENTITLEMENTS_PARSEFIELD.getPreferredName() + "]");
+ }
+ if (policyParser.nextToken() != XContentParser.Token.START_ARRAY) {
+ throw newPolicyParserException(scopeName, "expected array of ");
+ }
+ List entitlements = new ArrayList<>();
+ while (policyParser.nextToken() != XContentParser.Token.END_ARRAY) {
+ if (policyParser.currentToken() != XContentParser.Token.START_OBJECT) {
+ throw newPolicyParserException(scopeName, "expected object ");
+ }
+ if (policyParser.nextToken() != XContentParser.Token.FIELD_NAME) {
+ throw newPolicyParserException(scopeName, "expected object ");
+ }
+ String entitlementType = policyParser.currentName();
+ Entitlement entitlement = parseEntitlement(scopeName, entitlementType);
+ entitlements.add(entitlement);
+ if (policyParser.nextToken() != XContentParser.Token.END_OBJECT) {
+ throw newPolicyParserException(scopeName, "expected closing object");
+ }
+ }
+ if (policyParser.nextToken() != XContentParser.Token.END_OBJECT) {
+ throw newPolicyParserException(scopeName, "expected closing object");
+ }
+ return new Scope(scopeName, entitlements);
+ } catch (IOException ioe) {
+ throw new UncheckedIOException(ioe);
+ }
+ }
+
+ protected Entitlement parseEntitlement(String scopeName, String entitlementType) throws IOException {
+ Class> entitlementClass;
+ try {
+ entitlementClass = Class.forName(
+ entitlementPackageName
+ + "."
+ + Character.toUpperCase(entitlementType.charAt(0))
+ + entitlementType.substring(1)
+ + "Entitlement"
+ );
+ } catch (ClassNotFoundException cnfe) {
+ throw newPolicyParserException(scopeName, "unknown entitlement type [" + entitlementType + "]");
+ }
+ if (Entitlement.class.isAssignableFrom(entitlementClass) == false) {
+ throw newPolicyParserException(scopeName, "unknown entitlement type [" + entitlementType + "]");
+ }
+ Constructor> entitlementConstructor = entitlementClass.getConstructors()[0];
+ ExternalEntitlement entitlementMetadata = entitlementConstructor.getAnnotation(ExternalEntitlement.class);
+ if (entitlementMetadata == null) {
+ throw newPolicyParserException(scopeName, "unknown entitlement type [" + entitlementType + "]");
+ }
+
+ if (policyParser.nextToken() != XContentParser.Token.START_OBJECT) {
+ throw newPolicyParserException(scopeName, entitlementType, "expected entitlement parameters");
+ }
+ Map parsedValues = policyParser.map();
+
+ Class>[] parameterTypes = entitlementConstructor.getParameterTypes();
+ String[] parametersNames = entitlementMetadata.parameterNames();
+ Object[] parameterValues = new Object[parameterTypes.length];
+ for (int parameterIndex = 0; parameterIndex < parameterTypes.length; ++parameterIndex) {
+ String parameterName = parametersNames[parameterIndex];
+ Object parameterValue = parsedValues.remove(parameterName);
+ if (parameterValue == null) {
+ throw newPolicyParserException(scopeName, entitlementType, "missing entitlement parameter [" + parameterName + "]");
+ }
+ Class> parameterType = parameterTypes[parameterIndex];
+ if (parameterType.isAssignableFrom(parameterValue.getClass()) == false) {
+ throw newPolicyParserException(
+ scopeName,
+ entitlementType,
+ "unexpected parameter type [" + parameterType.getSimpleName() + "] for entitlement parameter [" + parameterName + "]"
+ );
+ }
+ parameterValues[parameterIndex] = parameterValue;
+ }
+ if (parsedValues.isEmpty() == false) {
+ throw newPolicyParserException(scopeName, entitlementType, "extraneous entitlement parameter(s) " + parsedValues);
+ }
+
+ try {
+ return (Entitlement) entitlementConstructor.newInstance(parameterValues);
+ } catch (InvocationTargetException | InstantiationException | IllegalAccessException e) {
+ throw new IllegalStateException("internal error");
+ }
+ }
+
+ protected PolicyParserException newPolicyParserException(String message) {
+ return PolicyParserException.newPolicyParserException(policyParser.getTokenLocation(), policyName, message);
+ }
+
+ protected PolicyParserException newPolicyParserException(String scopeName, String message) {
+ return PolicyParserException.newPolicyParserException(policyParser.getTokenLocation(), policyName, scopeName, message);
+ }
+
+ protected PolicyParserException newPolicyParserException(String scopeName, String entitlementType, String message) {
+ return PolicyParserException.newPolicyParserException(
+ policyParser.getTokenLocation(),
+ policyName,
+ scopeName,
+ entitlementType,
+ message
+ );
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserException.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserException.java
new file mode 100644
index 0000000000000..5dfa12f11d0be
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserException.java
@@ -0,0 +1,92 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import org.elasticsearch.xcontent.XContentLocation;
+
+/**
+ * An exception specifically for policy parsing errors.
+ */
+public class PolicyParserException extends RuntimeException {
+
+ public static PolicyParserException newPolicyParserException(XContentLocation location, String policyName, String message) {
+ return new PolicyParserException(
+ "[" + location.lineNumber() + ":" + location.columnNumber() + "] policy parsing error for [" + policyName + "]: " + message
+ );
+ }
+
+ public static PolicyParserException newPolicyParserException(
+ XContentLocation location,
+ String policyName,
+ String scopeName,
+ String message
+ ) {
+ if (scopeName == null) {
+ return new PolicyParserException(
+ "[" + location.lineNumber() + ":" + location.columnNumber() + "] policy parsing error for [" + policyName + "]: " + message
+ );
+ } else {
+ return new PolicyParserException(
+ "["
+ + location.lineNumber()
+ + ":"
+ + location.columnNumber()
+ + "] policy parsing error for ["
+ + policyName
+ + "] in scope ["
+ + scopeName
+ + "]: "
+ + message
+ );
+ }
+ }
+
+ public static PolicyParserException newPolicyParserException(
+ XContentLocation location,
+ String policyName,
+ String scopeName,
+ String entitlementType,
+ String message
+ ) {
+ if (scopeName == null) {
+ return new PolicyParserException(
+ "["
+ + location.lineNumber()
+ + ":"
+ + location.columnNumber()
+ + "] policy parsing error for ["
+ + policyName
+ + "] for entitlement type ["
+ + entitlementType
+ + "]: "
+ + message
+ );
+ } else {
+ return new PolicyParserException(
+ "["
+ + location.lineNumber()
+ + ":"
+ + location.columnNumber()
+ + "] policy parsing error for ["
+ + policyName
+ + "] in scope ["
+ + scopeName
+ + "] for entitlement type ["
+ + entitlementType
+ + "]: "
+ + message
+ );
+ }
+ }
+
+ private PolicyParserException(String message) {
+ super(message);
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Scope.java b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Scope.java
new file mode 100644
index 0000000000000..0fe63eb8da1b7
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/java/org/elasticsearch/entitlement/runtime/policy/Scope.java
@@ -0,0 +1,46 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A holder for entitlements within a single scope.
+ */
+public class Scope {
+
+ public final String name;
+ public final List entitlements;
+
+ public Scope(String name, List entitlements) {
+ this.name = Objects.requireNonNull(name);
+ this.entitlements = Collections.unmodifiableList(Objects.requireNonNull(entitlements));
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Scope scope = (Scope) o;
+ return Objects.equals(name, scope.name) && Objects.equals(entitlements, scope.entitlements);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, entitlements);
+ }
+
+ @Override
+ public String toString() {
+ return "Scope{" + "name='" + name + '\'' + ", entitlements=" + entitlements + '}';
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/main/resources/META-INF/services/org.elasticsearch.entitlement.api.EntitlementChecks b/distribution/tools/entitlement-runtime/src/main/resources/META-INF/services/org.elasticsearch.entitlement.api.EntitlementChecks
new file mode 100644
index 0000000000000..5865e43e2b85a
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/main/resources/META-INF/services/org.elasticsearch.entitlement.api.EntitlementChecks
@@ -0,0 +1,10 @@
+#
+ # 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ # License v3.0 only", or the "Server Side Public License, v 1".
+#
+
+org.elasticsearch.entitlement.runtime.api.ElasticsearchEntitlementManager
diff --git a/distribution/tools/entitlement-runtime/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserFailureTests.java b/distribution/tools/entitlement-runtime/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserFailureTests.java
new file mode 100644
index 0000000000000..b21d206f3eb6a
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserFailureTests.java
@@ -0,0 +1,83 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import org.elasticsearch.test.ESTestCase;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+public class PolicyParserFailureTests extends ESTestCase {
+
+ public void testParserSyntaxFailures() {
+ PolicyParserException ppe = expectThrows(
+ PolicyParserException.class,
+ () -> new PolicyParser(new ByteArrayInputStream("[]".getBytes(StandardCharsets.UTF_8)), "test-failure-policy.yaml")
+ .parsePolicy()
+ );
+ assertEquals("[1:1] policy parsing error for [test-failure-policy.yaml]: expected object ", ppe.getMessage());
+ }
+
+ public void testEntitlementDoesNotExist() throws IOException {
+ PolicyParserException ppe = expectThrows(PolicyParserException.class, () -> new PolicyParser(new ByteArrayInputStream("""
+ entitlement-module-name:
+ entitlements:
+ - does_not_exist: {}
+ """.getBytes(StandardCharsets.UTF_8)), "test-failure-policy.yaml").parsePolicy());
+ assertEquals(
+ "[3:7] policy parsing error for [test-failure-policy.yaml] in scope [entitlement-module-name]: "
+ + "unknown entitlement type [does_not_exist]",
+ ppe.getMessage()
+ );
+ }
+
+ public void testEntitlementMissingParameter() throws IOException {
+ PolicyParserException ppe = expectThrows(PolicyParserException.class, () -> new PolicyParser(new ByteArrayInputStream("""
+ entitlement-module-name:
+ entitlements:
+ - file: {}
+ """.getBytes(StandardCharsets.UTF_8)), "test-failure-policy.yaml").parsePolicy());
+ assertEquals(
+ "[3:14] policy parsing error for [test-failure-policy.yaml] in scope [entitlement-module-name] "
+ + "for entitlement type [file]: missing entitlement parameter [path]",
+ ppe.getMessage()
+ );
+
+ ppe = expectThrows(PolicyParserException.class, () -> new PolicyParser(new ByteArrayInputStream("""
+ entitlement-module-name:
+ entitlements:
+ - file:
+ path: test-path
+ """.getBytes(StandardCharsets.UTF_8)), "test-failure-policy.yaml").parsePolicy());
+ assertEquals(
+ "[5:1] policy parsing error for [test-failure-policy.yaml] in scope [entitlement-module-name] "
+ + "for entitlement type [file]: missing entitlement parameter [actions]",
+ ppe.getMessage()
+ );
+ }
+
+ public void testEntitlementExtraneousParameter() throws IOException {
+ PolicyParserException ppe = expectThrows(PolicyParserException.class, () -> new PolicyParser(new ByteArrayInputStream("""
+ entitlement-module-name:
+ entitlements:
+ - file:
+ path: test-path
+ actions:
+ - read
+ extra: test
+ """.getBytes(StandardCharsets.UTF_8)), "test-failure-policy.yaml").parsePolicy());
+ assertEquals(
+ "[8:1] policy parsing error for [test-failure-policy.yaml] in scope [entitlement-module-name] "
+ + "for entitlement type [file]: extraneous entitlement parameter(s) {extra=test}",
+ ppe.getMessage()
+ );
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserTests.java b/distribution/tools/entitlement-runtime/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserTests.java
new file mode 100644
index 0000000000000..40016b2e3027e
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/test/java/org/elasticsearch/entitlement/runtime/policy/PolicyParserTests.java
@@ -0,0 +1,28 @@
+/*
+ * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
+ */
+
+package org.elasticsearch.entitlement.runtime.policy;
+
+import org.elasticsearch.test.ESTestCase;
+
+import java.io.IOException;
+import java.util.List;
+
+public class PolicyParserTests extends ESTestCase {
+
+ public void testPolicyBuilder() throws IOException {
+ Policy parsedPolicy = new PolicyParser(PolicyParserTests.class.getResourceAsStream("test-policy.yaml"), "test-policy.yaml")
+ .parsePolicy();
+ Policy builtPolicy = new Policy(
+ "test-policy.yaml",
+ List.of(new Scope("entitlement-module-name", List.of(new FileEntitlement("test/path/to/file", List.of("read", "write")))))
+ );
+ assertEquals(parsedPolicy, builtPolicy);
+ }
+}
diff --git a/distribution/tools/entitlement-runtime/src/test/resources/org/elasticsearch/entitlement/runtime/policy/test-policy.yaml b/distribution/tools/entitlement-runtime/src/test/resources/org/elasticsearch/entitlement/runtime/policy/test-policy.yaml
new file mode 100644
index 0000000000000..b58287cfc83b7
--- /dev/null
+++ b/distribution/tools/entitlement-runtime/src/test/resources/org/elasticsearch/entitlement/runtime/policy/test-policy.yaml
@@ -0,0 +1,7 @@
+entitlement-module-name:
+ entitlements:
+ - file:
+ path: "test/path/to/file"
+ actions:
+ - "read"
+ - "write"
diff --git a/distribution/tools/geoip-cli/build.gradle b/distribution/tools/geoip-cli/build.gradle
index 1cd502fa91d51..ee20d5e1bd88e 100644
--- a/distribution/tools/geoip-cli/build.gradle
+++ b/distribution/tools/geoip-cli/build.gradle
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
apply plugin: 'elasticsearch.build'
diff --git a/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCli.java b/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCli.java
index 5edfe0a326fec..208eefab7c18f 100644
--- a/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCli.java
+++ b/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCli.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.geoip;
diff --git a/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCliProvider.java b/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCliProvider.java
index 2b6b0559a2898..fa0801470a3d4 100644
--- a/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCliProvider.java
+++ b/distribution/tools/geoip-cli/src/main/java/org/elasticsearch/geoip/GeoIpCliProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.geoip;
diff --git a/distribution/tools/geoip-cli/src/test/java/org/elasticsearch/geoip/GeoIpCliTests.java b/distribution/tools/geoip-cli/src/test/java/org/elasticsearch/geoip/GeoIpCliTests.java
index b1d6a529f883d..7daec3365c379 100644
--- a/distribution/tools/geoip-cli/src/test/java/org/elasticsearch/geoip/GeoIpCliTests.java
+++ b/distribution/tools/geoip-cli/src/test/java/org/elasticsearch/geoip/GeoIpCliTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.geoip;
@@ -19,7 +20,6 @@
import org.elasticsearch.xcontent.XContentParserConfiguration;
import org.elasticsearch.xcontent.XContentType;
-import java.io.BufferedInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -105,9 +105,7 @@ private void verifyOverview() throws Exception {
private void verifyTarball(Map data) throws Exception {
for (String tgz : List.of("a.tgz", "b.tgz")) {
try (
- TarArchiveInputStream tis = new TarArchiveInputStream(
- new GZIPInputStream(new BufferedInputStream(Files.newInputStream(target.resolve(tgz))))
- )
+ TarArchiveInputStream tis = new TarArchiveInputStream(new GZIPInputStream(Files.newInputStream(target.resolve(tgz)), 8192))
) {
TarArchiveEntry entry = tis.getNextTarEntry();
assertNotNull(entry);
diff --git a/distribution/tools/java-version-checker/build.gradle b/distribution/tools/java-version-checker/build.gradle
index 0a47d0652e465..3d4ec5aced29c 100644
--- a/distribution/tools/java-version-checker/build.gradle
+++ b/distribution/tools/java-version-checker/build.gradle
@@ -1,30 +1,10 @@
apply plugin: 'elasticsearch.build'
-sourceSets {
- unsupportedJdkVersionEntrypoint
-}
-
-tasks.named(sourceSets.unsupportedJdkVersionEntrypoint.compileJavaTaskName).configure {
- targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-
-tasks.named("jar") {
- manifest {
- attributes("Multi-Release": "true")
- }
-
- FileCollection mainOutput = sourceSets.main.output;
- from(sourceSets.unsupportedJdkVersionEntrypoint.output)
- eachFile { details ->
- if (details.path.equals("org/elasticsearch/tools/java_version_checker/JavaVersionChecker.class") &&
- mainOutput.asFileTree.contains(details.file)) {
- details.relativePath = details.relativePath.prepend("META-INF/versions/17")
- }
- }
+compileJava {
+ options.release = 8
}
// TODO revisit forbiddenApis issues
-["javadoc", "forbiddenApisMain", "forbiddenApisUnsupportedJdkVersionEntrypoint"].each {
+["javadoc", "forbiddenApisMain"].each {
tasks.named(it).configure { enabled = false }
}
diff --git a/distribution/tools/java-version-checker/src/main/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java b/distribution/tools/java-version-checker/src/main/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java
index 3b716709f644e..672fa8fd164aa 100644
--- a/distribution/tools/java-version-checker/src/main/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java
+++ b/distribution/tools/java-version-checker/src/main/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java
@@ -1,17 +1,19 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.tools.java_version_checker;
import java.util.Arrays;
+import java.util.Locale;
/**
- * Java 17 compatible main which just exits without error.
+ * Java 8 compatible main to check the runtime version
*/
final class JavaVersionChecker {
@@ -22,5 +24,27 @@ public static void main(final String[] args) {
if (args.length != 0) {
throw new IllegalArgumentException("expected zero arguments but was " + Arrays.toString(args));
}
+
+ final int MIN_VERSION = 21;
+ final int version;
+ String versionString = System.getProperty("java.specification.version");
+ if (versionString.equals("1.8")) {
+ version = 8;
+ } else {
+ version = Integer.parseInt(versionString);
+ }
+ if (version >= MIN_VERSION) {
+ return;
+ }
+
+ final String message = String.format(
+ Locale.ROOT,
+ "The minimum required Java version is %d; your Java version %d from [%s] does not meet that requirement.",
+ MIN_VERSION,
+ version,
+ System.getProperty("java.home")
+ );
+ System.err.println(message);
+ System.exit(1);
}
}
diff --git a/distribution/tools/java-version-checker/src/unsupportedJdkVersionEntrypoint/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java b/distribution/tools/java-version-checker/src/unsupportedJdkVersionEntrypoint/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java
deleted file mode 100644
index f3a47c7b5ad43..0000000000000
--- a/distribution/tools/java-version-checker/src/unsupportedJdkVersionEntrypoint/java/org/elasticsearch/tools/java_version_checker/JavaVersionChecker.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.tools.java_version_checker;
-
-import java.util.Arrays;
-import java.util.Locale;
-
-/**
- * Java 7 compatible main which exits with an error.
- */
-final class JavaVersionChecker {
-
- private JavaVersionChecker() {}
-
- public static void main(final String[] args) {
- // no leniency!
- if (args.length != 0) {
- throw new IllegalArgumentException("expected zero arguments but was " + Arrays.toString(args));
- }
- final String message = String.format(
- Locale.ROOT,
- "The minimum required Java version is 17; your Java version %s from [%s] does not meet that requirement.",
- System.getProperty("java.specification.version"),
- System.getProperty("java.home")
- );
- System.err.println(message);
- System.exit(1);
- }
-}
diff --git a/distribution/tools/keystore-cli/build.gradle b/distribution/tools/keystore-cli/build.gradle
index 71c6724248340..07aa92151171a 100644
--- a/distribution/tools/keystore-cli/build.gradle
+++ b/distribution/tools/keystore-cli/build.gradle
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
apply plugin: 'elasticsearch.build'
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommand.java
index e378747e583db..cc662bd747575 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommand.java
index 0ad35c5512259..c01c18418858a 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/BaseKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/BaseKeyStoreCommand.java
index 74ab33a12efcf..0380018d36cff 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/BaseKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/BaseKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommand.java
index 47b5631ae5d21..4dca3d538263a 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommand.java
index e615ef76db007..a922c92f5f44b 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommand.java
index 4a0502a19ee49..0428d5dcf7df8 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCli.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCli.java
index 99778a4750e07..70a607b3a35eb 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCli.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCli.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCliProvider.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCliProvider.java
index 5d64bc21015ac..b20e92bb634f2 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCliProvider.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/KeyStoreCliProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ListKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ListKeyStoreCommand.java
index 37de590c3b58f..2e36dff9b84fc 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ListKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ListKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommand.java
index a50f4580b370c..8a973c6d67f7d 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommand.java
index b20041ca6ccc5..ae7090aa0b08c 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommand.java b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommand.java
index 16579c25eab9d..b7061d6153b80 100644
--- a/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommand.java
+++ b/distribution/tools/keystore-cli/src/main/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommandTests.java
index 3c83a3215d7b0..edd70e4e52f55 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddFileKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommandTests.java
index a1a15e478dd18..3de18e094104f 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/AddStringKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/BootstrapTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/BootstrapTests.java
index d4405db422976..0fc76943f9d05 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/BootstrapTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/BootstrapTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommandTests.java
index bb13f2744b8e1..45667175b7754 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ChangeKeyStorePasswordCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommandTests.java
index 1a708f0a137fa..72a83a48b6344 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/CreateKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommandTests.java
index 3036cc20ce52e..322dede028572 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/HasPasswordKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreCommandTestCase.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreCommandTestCase.java
index 5dcf290c0e12a..80edce4a20796 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreCommandTestCase.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreCommandTestCase.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreWrapperTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreWrapperTests.java
index 3004494262e6b..38bb7d592f7c0 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreWrapperTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/KeyStoreWrapperTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ListKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ListKeyStoreCommandTests.java
index 1f4f7c8a266e0..fff812824bcd3 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ListKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ListKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommandTests.java
index 6643530e84d04..f0dce32cd9573 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/RemoveSettingKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommandTests.java
index bb9a533c354ef..14bb98ebb563e 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/ShowKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommandTests.java b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommandTests.java
index 979b118a887e5..bb533f32c7ac2 100644
--- a/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommandTests.java
+++ b/distribution/tools/keystore-cli/src/test/java/org/elasticsearch/cli/keystore/UpgradeKeyStoreCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.cli.keystore;
diff --git a/distribution/tools/plugin-cli/build.gradle b/distribution/tools/plugin-cli/build.gradle
index c0d2dc0bdb5c7..16932df96e223 100644
--- a/distribution/tools/plugin-cli/build.gradle
+++ b/distribution/tools/plugin-cli/build.gradle
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
import org.elasticsearch.gradle.OS
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java
index c7bee4a6c172d..d443cf5e1e181 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginAction.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginCommand.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginCommand.java
index 2d6c557179c36..4b8aacccae3ee 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginCommand.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallPluginCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallablePlugin.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallablePlugin.java
index 27845baab9126..ff8d1de03aa6e 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallablePlugin.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/InstallablePlugin.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ListPluginsCommand.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ListPluginsCommand.java
index 1038dc9bef05c..fc578c81b24c9 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ListPluginsCommand.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ListPluginsCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCli.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCli.java
index 63d4478b3b52a..9c97b8a991f19 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCli.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCli.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCliProvider.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCliProvider.java
index de87d1a5d0869..caad516174a99 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCliProvider.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginCliProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSecurity.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSecurity.java
index 6e762ffd43d3e..376c797d68899 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSecurity.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSecurity.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSyncException.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSyncException.java
index 72e28efc4faab..77129c15803cc 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSyncException.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginSyncException.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginsConfig.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginsConfig.java
index 168e5ba3806f3..63d87c9db5b0e 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginsConfig.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/PluginsConfig.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProgressInputStream.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProgressInputStream.java
index c162c27a896fc..f024575b359c5 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProgressInputStream.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProgressInputStream.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProxyUtils.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProxyUtils.java
index 55e9f2ebc9e84..a870fced21e21 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProxyUtils.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/ProxyUtils.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginAction.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginAction.java
index 4714ef202b258..a8f9e746a24e1 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginAction.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginAction.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginCommand.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginCommand.java
index de1c7a7849f5b..db4671d9001ea 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginCommand.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/RemovePluginCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsAction.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsAction.java
index 75b29fae945eb..5394cb8f3d79b 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsAction.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsAction.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsCliProvider.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsCliProvider.java
index ac6c0b704ca5b..88b24ab9ae614 100644
--- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsCliProvider.java
+++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/cli/SyncPluginsCliProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/InstallPluginActionTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/InstallPluginActionTests.java
index 3dc7af07d4d83..d638534943ecd 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/InstallPluginActionTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/InstallPluginActionTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ListPluginsCommandTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ListPluginsCommandTests.java
index b225bc441794a..0064b8c4bc513 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ListPluginsCommandTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ListPluginsCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockInstallPluginCommand.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockInstallPluginCommand.java
index 17f17624f4bb0..d8fcf01c97950 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockInstallPluginCommand.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockInstallPluginCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockRemovePluginCommand.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockRemovePluginCommand.java
index 3b0028fbba5ba..bdddab8b8945d 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockRemovePluginCommand.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/MockRemovePluginCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/PluginsConfigTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/PluginsConfigTests.java
index eb34023e370dc..dda618e9baf0f 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/PluginsConfigTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/PluginsConfigTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProgressInputStreamTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProgressInputStreamTests.java
index 2184332470f12..cde54230fc7b3 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProgressInputStreamTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProgressInputStreamTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyMatcher.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyMatcher.java
index 532b75e9af113..fa9de2bc99614 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyMatcher.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyMatcher.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyUtilsTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyUtilsTests.java
index a05289362374e..eaefd17b1f07b 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyUtilsTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/ProxyUtilsTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/RemovePluginActionTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/RemovePluginActionTests.java
index 73e89fc948029..aabdd4aaceb9e 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/RemovePluginActionTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/RemovePluginActionTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/SyncPluginsActionTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/SyncPluginsActionTests.java
index 9802b4039bb7b..8ef44c8862e84 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/SyncPluginsActionTests.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/SyncPluginsActionTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli;
diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/test_model/ExtensibleInterface.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/test_model/ExtensibleInterface.java
index 517c57a036801..c24133b1bfd53 100644
--- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/test_model/ExtensibleInterface.java
+++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/cli/test_model/ExtensibleInterface.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.plugins.cli.test_model;
diff --git a/distribution/tools/server-cli/build.gradle b/distribution/tools/server-cli/build.gradle
index 623f9d40cd49e..e8f70e9053d7c 100644
--- a/distribution/tools/server-cli/build.gradle
+++ b/distribution/tools/server-cli/build.gradle
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
import org.elasticsearch.gradle.internal.precommit.CheckForbiddenApisTask
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/APMJvmOptions.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/APMJvmOptions.java
index 67f0b571092ff..c3b9768946767 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/APMJvmOptions.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/APMJvmOptions.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/DefaultSystemMemoryInfo.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/DefaultSystemMemoryInfo.java
index 516d1c257d795..c0b999d0926a4 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/DefaultSystemMemoryInfo.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/DefaultSystemMemoryInfo.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ErrorPumpThread.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ErrorPumpThread.java
index 94c7653a08e0e..2e1d9ea3f2fe2 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ErrorPumpThread.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ErrorPumpThread.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java
index ec39c0fc89ac2..1160589e43966 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmErgonomics.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java
index 60cbcb86c02b9..0fa3e9463fc48 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOption.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOptionsParser.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOptionsParser.java
index 0bfa0f211807d..d2ac1549efd1a 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOptionsParser.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/JvmOptionsParser.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeyStoreLoader.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeyStoreLoader.java
index 6741e95e98dc5..9430cb598cf02 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeyStoreLoader.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeyStoreLoader.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeystorePasswordTerminal.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeystorePasswordTerminal.java
index 0fddf76caff59..85bbc79a6a29d 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeystorePasswordTerminal.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/KeystorePasswordTerminal.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/MachineDependentHeap.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/MachineDependentHeap.java
index 693aa781a54b0..26fd7294ed557 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/MachineDependentHeap.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/MachineDependentHeap.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfo.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfo.java
index 245b252bdedb4..24dcac6013604 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfo.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfo.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ProcessUtil.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ProcessUtil.java
index fb5f7bae34844..9564bdd8aa557 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ProcessUtil.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ProcessUtil.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SecureSettingsLoader.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SecureSettingsLoader.java
index 98fc47f4e64bc..75fc44e23698f 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SecureSettingsLoader.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SecureSettingsLoader.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCli.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCli.java
index bea7fbb7f63e8..22b62972befe4 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCli.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCli.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCliProvider.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCliProvider.java
index ae9b46a39df51..7a9ef63b5b8bf 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCliProvider.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerCliProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcess.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcess.java
index 35b5d93b39933..89377b5b3f8bb 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcess.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcess.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessBuilder.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessBuilder.java
index fcc290ebe9e72..293c4af3270b9 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessBuilder.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessBuilder.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessUtils.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessUtils.java
index ebbc68b1be90b..47d750f75612c 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessUtils.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/ServerProcessUtils.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java
index 2d707f150cc8b..9832501073815 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java
@@ -1,16 +1,16 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.concurrent.EsExecutors;
-import org.elasticsearch.core.UpdateForV9;
import java.util.List;
import java.util.Map;
@@ -60,7 +60,7 @@ static List systemJvmOptions(Settings nodeSettings, final Map systemJvmOptions(Settings nodeSettings, final Map e.isEmpty() == false).collect(Collectors.toList());
}
- @UpdateForV9 // only use CLDR in v9+
- private static String getLocaleProviders() {
- /*
- * Specify SPI to load IsoCalendarDataProvider (see #48209), specifying the first day of week as Monday.
- * When on pre-23, use COMPAT instead to maintain existing date formats as much as we can.
- * When on JDK 23+, use the default CLDR locale database, as COMPAT was removed in JDK 23.
- */
- return Runtime.version().feature() >= 23 ? "SPI,CLDR" : "SPI,COMPAT";
- }
-
/*
* The virtual file /proc/self/cgroup should list the current cgroup
* membership. For each hierarchy, you can follow the cgroup path from
diff --git a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemMemoryInfo.java b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemMemoryInfo.java
index 6133c0e937f42..78431628b6612 100644
--- a/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemMemoryInfo.java
+++ b/distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemMemoryInfo.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/APMJvmOptionsTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/APMJvmOptionsTests.java
index e8a8d3ee8df77..a7ba8eb11fbcc 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/APMJvmOptionsTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/APMJvmOptionsTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java
index a8a2ddbe14aab..900eab4de1bf2 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmErgonomicsTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java
index fc889f036a795..b8f4641f9b757 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/JvmOptionsParserTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/MachineDependentHeapTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/MachineDependentHeapTests.java
index aeb0b98e0be29..e2dc9f32647e0 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/MachineDependentHeapTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/MachineDependentHeapTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfoTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfoTests.java
index 2db6d36749db5..fb0a3fc630c7b 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfoTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/OverridableSystemMemoryInfoTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerCliTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerCliTests.java
index e603790051c0c..bacc89548c9a1 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerCliTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerCliTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessTests.java
index dc36485fb77ab..d4c05937f35b7 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessUtilsTests.java b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessUtilsTests.java
index 8cd1b63e41b03..1ecc33b9420ee 100644
--- a/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessUtilsTests.java
+++ b/distribution/tools/server-cli/src/test/java/org/elasticsearch/server/cli/ServerProcessUtilsTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.server.cli;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/ProcrunCommand.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/ProcrunCommand.java
index e32e34fb24400..49552400a2c93 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/ProcrunCommand.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/ProcrunCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCli.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCli.java
index 6f9a7e6b2169f..65a525bddbd2b 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCli.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCli.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCliProvider.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCliProvider.java
index 1b1f8d08c9805..e61bff432c03e 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCliProvider.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceCliProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemon.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemon.java
index 66ae78470c55d..66ee712fcce95 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemon.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemon.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemonProvider.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemonProvider.java
index a07883dcffcec..f13424858055f 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemonProvider.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceDaemonProvider.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceInstallCommand.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceInstallCommand.java
index 2df889be4a681..75f508ad21499 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceInstallCommand.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceInstallCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceManagerCommand.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceManagerCommand.java
index dc9906feb6e3e..97df7aabbd716 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceManagerCommand.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceManagerCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommand.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommand.java
index 60dd0e2a85220..973b4f71cae99 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommand.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStartCommand.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStartCommand.java
index 7f958beecf588..af1722ab789e6 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStartCommand.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStartCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStopCommand.java b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStopCommand.java
index 6d281fcfa8e97..b2fd9e78f35e6 100644
--- a/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStopCommand.java
+++ b/distribution/tools/windows-service-cli/src/main/java/org/elasticsearch/windows/service/WindowsServiceStopCommand.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/ProcrunCommandTests.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/ProcrunCommandTests.java
index 8f44eaa80f23a..c4f746df16652 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/ProcrunCommandTests.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/ProcrunCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceCliTestCase.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceCliTestCase.java
index 808173005b96f..41b9f75b785c4 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceCliTestCase.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceCliTestCase.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceInstallCommandTests.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceInstallCommandTests.java
index 5103d39c7311f..4d3d6400c55c4 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceInstallCommandTests.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceInstallCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceManagerCommandTests.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceManagerCommandTests.java
index 1699dd3f78316..20b9812e465b4 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceManagerCommandTests.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceManagerCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommandTests.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommandTests.java
index d0e72e9de5c66..8b0853e2897b2 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommandTests.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceRemoveCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStartCommandTests.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStartCommandTests.java
index 502008d22422f..0b6b45548c816 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStartCommandTests.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStartCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStopCommandTests.java b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStopCommandTests.java
index a36e090bd7ac4..d06a5695daa31 100644
--- a/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStopCommandTests.java
+++ b/distribution/tools/windows-service-cli/src/test/java/org/elasticsearch/windows/service/WindowsServiceStopCommandTests.java
@@ -1,9 +1,10 @@
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
package org.elasticsearch.windows.service;
diff --git a/docs/Versions.asciidoc b/docs/Versions.asciidoc
index fb99ef498df17..bdb0704fcd880 100644
--- a/docs/Versions.asciidoc
+++ b/docs/Versions.asciidoc
@@ -1,8 +1,8 @@
include::{docs-root}/shared/versions/stack/{source_branch}.asciidoc[]
-:lucene_version: 9.11.1
-:lucene_version_path: 9_11_1
+:lucene_version: 10.0.0
+:lucene_version_path: 10_0_0
:jdk: 11.0.2
:jdk_major: 11
:build_type: tar
diff --git a/docs/build.gradle b/docs/build.gradle
index 99453b840b0d2..e495ecacce27b 100644
--- a/docs/build.gradle
+++ b/docs/build.gradle
@@ -5,10 +5,11 @@ import static org.elasticsearch.gradle.testclusters.TestDistribution.DEFAULT
/*
* 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.
+ * or more contributor license agreements. Licensed under the "Elastic License
+ * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public
+ * License v3.0 only", or the "Server Side Public License, v 1".
*/
apply plugin: 'elasticsearch.docs-test'
diff --git a/docs/changelog/107936.yaml b/docs/changelog/107936.yaml
new file mode 100644
index 0000000000000..89dd57f7a81a5
--- /dev/null
+++ b/docs/changelog/107936.yaml
@@ -0,0 +1,6 @@
+pr: 107936
+summary: Two empty mappings now are created equally
+area: Mapping
+type: bug
+issues:
+ - 107031
diff --git a/docs/changelog/111336.yaml b/docs/changelog/111336.yaml
new file mode 100644
index 0000000000000..d5bf602cb7a88
--- /dev/null
+++ b/docs/changelog/111336.yaml
@@ -0,0 +1,5 @@
+pr: 111336
+summary: Use the same chunking configurations for models in the Elasticsearch service
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/111465.yaml b/docs/changelog/111465.yaml
new file mode 100644
index 0000000000000..2a8df287427a9
--- /dev/null
+++ b/docs/changelog/111465.yaml
@@ -0,0 +1,5 @@
+pr: 111465
+summary: Add range and regexp Intervals
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/111519.yaml b/docs/changelog/111519.yaml
deleted file mode 100644
index 8cc62fb8ed903..0000000000000
--- a/docs/changelog/111519.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 111519
-summary: "ESQL: Don't mutate the `BoolQueryBuilder` in plan"
-area: ES|QL
-type: bug
-issues: []
diff --git a/docs/changelog/111535.yaml b/docs/changelog/111535.yaml
deleted file mode 100644
index 4beebbf28d4e1..0000000000000
--- a/docs/changelog/111535.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 111535
-summary: Fix remote cluster credential secure settings reload
-area: Authorization
-type: bug
-issues: []
diff --git a/docs/changelog/111548.yaml b/docs/changelog/111548.yaml
deleted file mode 100644
index ca9e5ae622894..0000000000000
--- a/docs/changelog/111548.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-pr: 111548
-summary: Json parsing exceptions should not cause 500 errors
-area: Infra/Core
-type: bug
-issues:
- - 111542
diff --git a/docs/changelog/111770.yaml b/docs/changelog/111770.yaml
new file mode 100644
index 0000000000000..8d6bde6b25ef9
--- /dev/null
+++ b/docs/changelog/111770.yaml
@@ -0,0 +1,5 @@
+pr: 111770
+summary: Integrate IBM watsonx to Inference API for text embeddings
+area: Experiences
+type: enhancement
+issues: []
diff --git a/docs/changelog/111852.yaml b/docs/changelog/111852.yaml
new file mode 100644
index 0000000000000..c043cab43ebbd
--- /dev/null
+++ b/docs/changelog/111852.yaml
@@ -0,0 +1,5 @@
+pr: 111852
+summary: Add DeBERTa-V2/V3 tokenizer
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/111932.yaml b/docs/changelog/111932.yaml
deleted file mode 100644
index ce840ecebcff0..0000000000000
--- a/docs/changelog/111932.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-pr: 111932
-summary: Fix union-types where one index is missing the field
-area: ES|QL
-type: bug
-issues:
- - 111912
diff --git a/docs/changelog/112063.yaml b/docs/changelog/112063.yaml
new file mode 100644
index 0000000000000..190993967a074
--- /dev/null
+++ b/docs/changelog/112063.yaml
@@ -0,0 +1,32 @@
+pr: 112063
+summary: Spatial search functions support multi-valued fields in compute engine
+area: ES|QL
+type: bug
+issues:
+ - 112102
+ - 112505
+ - 110830
+highlight:
+ title: "ESQL: Multi-value fields supported in Geospatial predicates"
+ body: |-
+ Supporting multi-value fields in `WHERE` predicates is a challenge due to not knowing whether `ALL` or `ANY`
+ of the values in the field should pass the predicate.
+ For example, should the field `age:[10,30]` pass the predicate `WHERE age>20` or not?
+ This ambiguity does not exist with the spatial predicates
+ `ST_INTERSECTS` and `ST_DISJOINT`, because the choice between `ANY` or `ALL`
+ is implied by the predicate itself.
+ Consider a predicate checking a field named `location` against a test geometry named `shape`:
+
+ * `ST_INTERSECTS(field, shape)` - true if `ANY` value can intersect the shape
+ * `ST_DISJOINT(field, shape)` - true only if `ALL` values are disjoint from the shape
+
+ This works even if the shape argument is itself a complex or compound geometry.
+
+ Similar logic exists for `ST_CONTAINS` and `ST_WITHIN` predicates, but these are not as easily solved
+ with `ANY` or `ALL`, because a collection of geometries contains another collection if each of the contained
+ geometries is within at least one of the containing geometries. Evaluating this requires that the multi-value
+ field is first combined into a single geometry before performing the predicate check.
+
+ * `ST_CONTAINS(field, shape)` - true if the combined geometry contains the shape
+ * `ST_WITHIN(field, shape)` - true if the combined geometry is within the shape
+ notable: false
diff --git a/docs/changelog/112081.yaml b/docs/changelog/112081.yaml
new file mode 100644
index 0000000000000..a4009e01fca71
--- /dev/null
+++ b/docs/changelog/112081.yaml
@@ -0,0 +1,5 @@
+pr: 112081
+summary: "[ES|QL] Validate index name in parser"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/112250.yaml b/docs/changelog/112250.yaml
new file mode 100644
index 0000000000000..edbb5667d4b9d
--- /dev/null
+++ b/docs/changelog/112250.yaml
@@ -0,0 +1,5 @@
+pr: 112250
+summary: Do not exclude empty arrays or empty objects in source filtering
+area: Search
+type: bug
+issues: [109668]
diff --git a/docs/changelog/112258.yaml b/docs/changelog/112258.yaml
new file mode 100644
index 0000000000000..b3a55996428ea
--- /dev/null
+++ b/docs/changelog/112258.yaml
@@ -0,0 +1,6 @@
+pr: 112258
+summary: Updated Date Range to Follow Documentation When Assuming Missing Values
+area: Search
+type: bug
+issues:
+ - 111484
diff --git a/docs/changelog/112295.yaml b/docs/changelog/112295.yaml
new file mode 100644
index 0000000000000..ecbd365d03918
--- /dev/null
+++ b/docs/changelog/112295.yaml
@@ -0,0 +1,5 @@
+pr: 112295
+summary: "ESQL: Speed up CASE for some parameters"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/112400.yaml b/docs/changelog/112400.yaml
deleted file mode 100644
index 6d622e5fb5248..0000000000000
--- a/docs/changelog/112400.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 112400
-summary: Make sure file accesses in `DnRoleMapper` are done in stack frames with permissions
-area: Infra/Core
-type: bug
-issues: []
diff --git a/docs/changelog/112405.yaml b/docs/changelog/112405.yaml
new file mode 100644
index 0000000000000..4e9f095fb80a8
--- /dev/null
+++ b/docs/changelog/112405.yaml
@@ -0,0 +1,6 @@
+pr: 112405
+summary: Improve date expression/remote handling in index names
+area: Search
+type: bug
+issues:
+ - 112243
diff --git a/docs/changelog/112444.yaml b/docs/changelog/112444.yaml
deleted file mode 100644
index bfa4fd693f0e0..0000000000000
--- a/docs/changelog/112444.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-pr: 112444
-summary: Full coverage of ECS by ecs@mappings when `date_detection` is disabled
-area: Mapping
-type: bug
-issues:
- - 112398
diff --git a/docs/changelog/112481.yaml b/docs/changelog/112481.yaml
new file mode 100644
index 0000000000000..3e539ce8e4b75
--- /dev/null
+++ b/docs/changelog/112481.yaml
@@ -0,0 +1,5 @@
+pr: 112481
+summary: Validate streaming HTTP Response
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/112512.yaml b/docs/changelog/112512.yaml
new file mode 100644
index 0000000000000..a9812784ccfca
--- /dev/null
+++ b/docs/changelog/112512.yaml
@@ -0,0 +1,5 @@
+pr: 112512
+summary: Add Completion Inference API for Alibaba Cloud AI Search Model
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/112565.yaml b/docs/changelog/112565.yaml
new file mode 100644
index 0000000000000..be9ec41419a09
--- /dev/null
+++ b/docs/changelog/112565.yaml
@@ -0,0 +1,5 @@
+pr: 112565
+summary: Server-Sent Events for Inference response
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/112567.yaml b/docs/changelog/112567.yaml
new file mode 100644
index 0000000000000..25e3ac8360c2b
--- /dev/null
+++ b/docs/changelog/112567.yaml
@@ -0,0 +1,5 @@
+pr: 112567
+summary: Track shard snapshot progress during node shutdown
+area: Snapshot/Restore
+type: enhancement
+issues: []
diff --git a/docs/changelog/112571.yaml b/docs/changelog/112571.yaml
new file mode 100644
index 0000000000000..f1be2e5c291de
--- /dev/null
+++ b/docs/changelog/112571.yaml
@@ -0,0 +1,17 @@
+pr: 112571
+summary: Deprecate dot-prefixed indices and composable template index patterns
+area: CRUD
+type: deprecation
+issues: []
+deprecation:
+ title: Deprecate dot-prefixed indices and composable template index patterns
+ area: CRUD
+ details: "Indices beginning with a dot '.' are reserved for system and internal\
+ \ indices, and should not be used by and end-user. Additionally, composable index\
+ \ templates that contain patterns for dot-prefixed indices should also be avoided,\
+ \ as these patterns are meant for internal use only. In a future Elasticsearch\
+ \ version, creation of these dot-prefixed indices will no longer be allowed."
+ impact: "Requests performing an action that would create an index beginning with\
+ \ a dot (indexing a document, manual creation, reindex), or creating an index\
+ \ template with index patterns beginning with a dot, will contain a deprecation\
+ \ header warning about dot-prefixed indices in the response."
diff --git a/docs/changelog/112581.yaml b/docs/changelog/112581.yaml
deleted file mode 100644
index 489b4780c06fb..0000000000000
--- a/docs/changelog/112581.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 112581
-summary: Fix missing header in `put_geoip_database` JSON spec
-area: Ingest Node
-type: bug
-issues: []
diff --git a/docs/changelog/112595.yaml b/docs/changelog/112595.yaml
new file mode 100644
index 0000000000000..19ee0368475ae
--- /dev/null
+++ b/docs/changelog/112595.yaml
@@ -0,0 +1,6 @@
+pr: 112595
+summary: Collect and display execution metadata for ES|QL cross cluster searches
+area: ES|QL
+type: enhancement
+issues:
+ - 112402
diff --git a/docs/changelog/112610.yaml b/docs/changelog/112610.yaml
deleted file mode 100644
index 3d67a80a8f0b3..0000000000000
--- a/docs/changelog/112610.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-pr: 112610
-summary: Support widening of numeric types in union-types
-area: ES|QL
-type: bug
-issues:
- - 111277
diff --git a/docs/changelog/112645.yaml b/docs/changelog/112645.yaml
new file mode 100644
index 0000000000000..cf4ef4609a1f3
--- /dev/null
+++ b/docs/changelog/112645.yaml
@@ -0,0 +1,6 @@
+pr: 112645
+summary: Add support for multi-value dimensions
+area: Mapping
+type: enhancement
+issues:
+ - 110387
diff --git a/docs/changelog/112649.yaml b/docs/changelog/112649.yaml
deleted file mode 100644
index e3cf1e8e34881..0000000000000
--- a/docs/changelog/112649.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 112649
-summary: Allowlist `tracestate` header on remote server port
-area: Security
-type: bug
-issues: []
diff --git a/docs/changelog/112652.yaml b/docs/changelog/112652.yaml
new file mode 100644
index 0000000000000..c7ddcd4bffdc8
--- /dev/null
+++ b/docs/changelog/112652.yaml
@@ -0,0 +1,5 @@
+pr: 110399
+summary: "[Inference API] alibabacloud ai search service support chunk infer to support semantic_text field"
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/112665.yaml b/docs/changelog/112665.yaml
new file mode 100644
index 0000000000000..ae2cf7f171f4b
--- /dev/null
+++ b/docs/changelog/112665.yaml
@@ -0,0 +1,14 @@
+pr: 112665
+summary: Remove zstd feature flag for index codec best compression
+area: Codec
+type: enhancement
+issues: []
+highlight:
+ title: Enable ZStandard compression for indices with index.codec set to best_compression
+ body: |-
+ Before DEFLATE compression was used to compress stored fields in indices with index.codec index setting set to
+ best_compression, with this change ZStandard is used as compression algorithm to stored fields for indices with
+ index.codec index setting set to best_compression. The usage ZStandard results in less storage usage with a
+ similar indexing throughput depending on what options are used. Experiments with indexing logs have shown that
+ ZStandard offers ~12% lower storage usage and a ~14% higher indexing throughput compared to DEFLATE.
+ notable: true
diff --git a/docs/changelog/112677.yaml b/docs/changelog/112677.yaml
new file mode 100644
index 0000000000000..89662236c6ca5
--- /dev/null
+++ b/docs/changelog/112677.yaml
@@ -0,0 +1,5 @@
+pr: 112677
+summary: Stream OpenAI Completion
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/112678.yaml b/docs/changelog/112678.yaml
new file mode 100644
index 0000000000000..7a1a9d622a65f
--- /dev/null
+++ b/docs/changelog/112678.yaml
@@ -0,0 +1,6 @@
+pr: 112678
+summary: Make "too many clauses" throw IllegalArgumentException to avoid 500s
+area: Search
+type: bug
+issues:
+ - 112177
\ No newline at end of file
diff --git a/docs/changelog/112703.yaml b/docs/changelog/112703.yaml
deleted file mode 100644
index a428e8c4e2339..0000000000000
--- a/docs/changelog/112703.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 112703
-summary: JSON parse failures should be 4xx codes
-area: Infra/Core
-type: bug
-issues: []
diff --git a/docs/changelog/112706.yaml b/docs/changelog/112706.yaml
new file mode 100644
index 0000000000000..fc0f5c4c554a1
--- /dev/null
+++ b/docs/changelog/112706.yaml
@@ -0,0 +1,5 @@
+pr: 112706
+summary: Configure keeping source in `FieldMapper`
+area: Mapping
+type: enhancement
+issues: []
diff --git a/docs/changelog/112707.yaml b/docs/changelog/112707.yaml
new file mode 100644
index 0000000000000..9f16cfcd2b6f2
--- /dev/null
+++ b/docs/changelog/112707.yaml
@@ -0,0 +1,5 @@
+pr: 112707
+summary: Deduplicate `BucketOrder` when deserializing
+area: Aggregations
+type: enhancement
+issues: []
diff --git a/docs/changelog/112713.yaml b/docs/changelog/112713.yaml
deleted file mode 100644
index 1ccf451b13f82..0000000000000
--- a/docs/changelog/112713.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 112713
-summary: Fix encoding of dynamic arrays in ignored source
-area: Logs
-type: bug
-issues: []
diff --git a/docs/changelog/112720.yaml b/docs/changelog/112720.yaml
deleted file mode 100644
index a44ea5a699520..0000000000000
--- a/docs/changelog/112720.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-pr: 112720
-summary: Fix NPE in `dense_vector` stats
-area: Vector Search
-type: bug
-issues: []
diff --git a/docs/changelog/112723.yaml b/docs/changelog/112723.yaml
new file mode 100644
index 0000000000000..dbee3232d1c75
--- /dev/null
+++ b/docs/changelog/112723.yaml
@@ -0,0 +1,6 @@
+pr: 112723
+summary: Improve DateTime error handling and add some bad date tests
+area: Search
+type: bug
+issues:
+ - 112190
diff --git a/docs/changelog/112768.yaml b/docs/changelog/112768.yaml
new file mode 100644
index 0000000000000..13d5b8eaae38f
--- /dev/null
+++ b/docs/changelog/112768.yaml
@@ -0,0 +1,5 @@
+pr: 112768
+summary: Deduplicate Kuromoji User Dictionary
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/112826.yaml b/docs/changelog/112826.yaml
new file mode 100644
index 0000000000000..65c05b4d6035a
--- /dev/null
+++ b/docs/changelog/112826.yaml
@@ -0,0 +1,6 @@
+pr: 112826
+summary: "Multi term intervals: increase max_expansions"
+area: Search
+type: enhancement
+issues:
+ - 110491
diff --git a/docs/changelog/112834.yaml b/docs/changelog/112834.yaml
new file mode 100644
index 0000000000000..f75d03fd3ef8f
--- /dev/null
+++ b/docs/changelog/112834.yaml
@@ -0,0 +1,5 @@
+pr: 112834
+summary: Increase `replica_unassigned_buffer_time` default from 3s to 5s
+area: Health
+type: enhancement
+issues: []
diff --git a/docs/changelog/112850.yaml b/docs/changelog/112850.yaml
new file mode 100644
index 0000000000000..97a8877f6291c
--- /dev/null
+++ b/docs/changelog/112850.yaml
@@ -0,0 +1,5 @@
+pr: 112850
+summary: Fix synthetic source field names for multi-fields
+area: Mapping
+type: bug
+issues: []
diff --git a/docs/changelog/112874.yaml b/docs/changelog/112874.yaml
new file mode 100644
index 0000000000000..99ed9ed28fa0f
--- /dev/null
+++ b/docs/changelog/112874.yaml
@@ -0,0 +1,5 @@
+pr: 112874
+summary: Reduce heap usage for `AggregatorsReducer`
+area: Aggregations
+type: enhancement
+issues: []
diff --git a/docs/changelog/112881.yaml b/docs/changelog/112881.yaml
new file mode 100644
index 0000000000000..a8a0d542f8201
--- /dev/null
+++ b/docs/changelog/112881.yaml
@@ -0,0 +1,5 @@
+pr: 112881
+summary: "ESQL: Remove parent from `FieldAttribute`"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/112888.yaml b/docs/changelog/112888.yaml
new file mode 100644
index 0000000000000..48806a491e531
--- /dev/null
+++ b/docs/changelog/112888.yaml
@@ -0,0 +1,5 @@
+pr: 112888
+summary: Fix `getDatabaseType` for unusual MMDBs
+area: Ingest Node
+type: bug
+issues: []
diff --git a/docs/changelog/112895.yaml b/docs/changelog/112895.yaml
new file mode 100644
index 0000000000000..59d391f649280
--- /dev/null
+++ b/docs/changelog/112895.yaml
@@ -0,0 +1,5 @@
+pr: 112895
+summary: (logger) change from error to warn for short circuiting user
+area: Security
+type: enhancement
+issues: []
diff --git a/docs/changelog/112903.yaml b/docs/changelog/112903.yaml
new file mode 100644
index 0000000000000..f15364336e620
--- /dev/null
+++ b/docs/changelog/112903.yaml
@@ -0,0 +1,17 @@
+pr: 112903
+summary: Remove unsupported legacy value for `discovery.type`
+area: Cluster Coordination
+type: breaking
+issues: []
+breaking:
+ title: Remove unsupported legacy value for `discovery.type`
+ area: Cluster and node setting
+ details: >-
+ Earlier versions of {es} had a `discovery.type` setting which permitted
+ values that referred to legacy discovery types. From v9.0.0 onwards, the
+ only supported values for this setting are `multi-node` (the default) and
+ `single-node`.
+ impact: >-
+ Remove any value for `discovery.type` from your `elasticsearch.yml`
+ configuration file.
+ notable: false
diff --git a/docs/changelog/112905.yaml b/docs/changelog/112905.yaml
new file mode 100644
index 0000000000000..aac0b7e9dfb59
--- /dev/null
+++ b/docs/changelog/112905.yaml
@@ -0,0 +1,5 @@
+pr: 112905
+summary: "[ES|QL] Named parameter for field names and field name patterns"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/112916.yaml b/docs/changelog/112916.yaml
new file mode 100644
index 0000000000000..91dc7f332efc4
--- /dev/null
+++ b/docs/changelog/112916.yaml
@@ -0,0 +1,5 @@
+pr: 112916
+summary: Allow out of range term queries for numeric types
+area: Search
+type: bug
+issues: []
diff --git a/docs/changelog/112929.yaml b/docs/changelog/112929.yaml
new file mode 100644
index 0000000000000..e5f49897432de
--- /dev/null
+++ b/docs/changelog/112929.yaml
@@ -0,0 +1,5 @@
+pr: 112929
+summary: "ES|QL: Add support for cached strings in plan serialization"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/112933.yaml b/docs/changelog/112933.yaml
new file mode 100644
index 0000000000000..222cd5aadf739
--- /dev/null
+++ b/docs/changelog/112933.yaml
@@ -0,0 +1,5 @@
+pr: 112933
+summary: "Allow incubating Panama Vector in simdvec, and add vectorized `ipByteBin`"
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/112938.yaml b/docs/changelog/112938.yaml
new file mode 100644
index 0000000000000..82b98871c3352
--- /dev/null
+++ b/docs/changelog/112938.yaml
@@ -0,0 +1,35 @@
+pr: 112938
+summary: Enhance SORT push-down to Lucene to cover references to fields and ST_DISTANCE function
+area: ES|QL
+type: enhancement
+issues:
+ - 109973
+highlight:
+ title: Enhance SORT push-down to Lucene to cover references to fields and ST_DISTANCE function
+ body: |-
+ The most used and likely most valuable geospatial search query in Elasticsearch is the sorted proximity search,
+ finding items within a certain distance of a point of interest and sorting the results by distance.
+ This has been possible in ES|QL since 8.15.0, but the sorting was done in-memory, not pushed down to Lucene.
+ Now the sorting is pushed down to Lucene, which results in a significant performance improvement.
+
+ Queries that perform both filtering and sorting on distance are supported. For example:
+
+ [source,esql]
+ ----
+ FROM test
+ | EVAL distance = ST_DISTANCE(location, TO_GEOPOINT("POINT(37.7749, -122.4194)"))
+ | WHERE distance < 1000000
+ | SORT distance ASC, name DESC
+ | LIMIT 10
+ ----
+
+ In addition, the support for sorting on EVAL expressions has been extended to cover references to fields:
+
+ [source,esql]
+ ----
+ FROM test
+ | EVAL ref = field
+ | SORT ref ASC
+ | LIMIT 10
+ ----
+ notable: false
diff --git a/docs/changelog/112972.yaml b/docs/changelog/112972.yaml
new file mode 100644
index 0000000000000..5332ac13fd13f
--- /dev/null
+++ b/docs/changelog/112972.yaml
@@ -0,0 +1,6 @@
+pr: 112972
+summary: "ILM: Add `total_shards_per_node` setting to searchable snapshot"
+area: ILM+SLM
+type: enhancement
+issues:
+ - 112261
diff --git a/docs/changelog/112973.yaml b/docs/changelog/112973.yaml
new file mode 100644
index 0000000000000..3ba86a31334ff
--- /dev/null
+++ b/docs/changelog/112973.yaml
@@ -0,0 +1,5 @@
+pr: 112973
+summary: Fix verbose get data stream API not requiring extra privileges
+area: Data streams
+type: bug
+issues: []
diff --git a/docs/changelog/113013.yaml b/docs/changelog/113013.yaml
new file mode 100644
index 0000000000000..1cec31074e806
--- /dev/null
+++ b/docs/changelog/113013.yaml
@@ -0,0 +1,5 @@
+pr: 113013
+summary: Account for `DelayedBucket` before reduction
+area: Aggregations
+type: enhancement
+issues: []
diff --git a/docs/changelog/113027.yaml b/docs/changelog/113027.yaml
new file mode 100644
index 0000000000000..825740cf5691d
--- /dev/null
+++ b/docs/changelog/113027.yaml
@@ -0,0 +1,6 @@
+pr: 113027
+summary: Retrieve the source for objects and arrays in a separate parsing phase
+area: Mapping
+type: bug
+issues:
+ - 112374
diff --git a/docs/changelog/113051.yaml b/docs/changelog/113051.yaml
new file mode 100644
index 0000000000000..9be68f9f2b03e
--- /dev/null
+++ b/docs/changelog/113051.yaml
@@ -0,0 +1,5 @@
+pr: 113051
+summary: Add Search Inference ID To Semantic Text Mapping
+area: Mapping
+type: enhancement
+issues: []
diff --git a/docs/changelog/113102.yaml b/docs/changelog/113102.yaml
new file mode 100644
index 0000000000000..ea9022e634caf
--- /dev/null
+++ b/docs/changelog/113102.yaml
@@ -0,0 +1,5 @@
+pr: 113102
+summary: Trigger merges after recovery
+area: Recovery
+type: enhancement
+issues: []
diff --git a/docs/changelog/113103.yaml b/docs/changelog/113103.yaml
new file mode 100644
index 0000000000000..2ed98e0907bae
--- /dev/null
+++ b/docs/changelog/113103.yaml
@@ -0,0 +1,6 @@
+pr: 113103
+summary: "ESQL: Align year diffing to the rest of the units in DATE_DIFF: chronological"
+area: ES|QL
+type: bug
+issues:
+ - 112482
diff --git a/docs/changelog/113143.yaml b/docs/changelog/113143.yaml
new file mode 100644
index 0000000000000..4a2044cca0ce4
--- /dev/null
+++ b/docs/changelog/113143.yaml
@@ -0,0 +1,10 @@
+pr: 113143
+summary: Deprecate dutch_kp and lovins stemmer as they are removed in Lucene 10
+area: Analysis
+type: deprecation
+issues: []
+deprecation:
+ title: Deprecate dutch_kp and lovins stemmer as they are removed in Lucene 10
+ area: Analysis
+ details: kp, dutch_kp, dutchKp and lovins stemmers are deprecated and will be removed.
+ impact: These stemmers will be removed and will be no longer supported.
diff --git a/docs/changelog/113158.yaml b/docs/changelog/113158.yaml
new file mode 100644
index 0000000000000..d097ea11b3a23
--- /dev/null
+++ b/docs/changelog/113158.yaml
@@ -0,0 +1,5 @@
+pr: 113158
+summary: Adds a new Inference API for streaming responses back to the user.
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113172.yaml b/docs/changelog/113172.yaml
new file mode 100644
index 0000000000000..2d03196b0cfbd
--- /dev/null
+++ b/docs/changelog/113172.yaml
@@ -0,0 +1,6 @@
+pr: 113172
+summary: "[ESQL] Add finish() elapsed time to aggregation profiling times"
+area: ES|QL
+type: enhancement
+issues:
+ - 112950
diff --git a/docs/changelog/113183.yaml b/docs/changelog/113183.yaml
new file mode 100644
index 0000000000000..f30ce9831adb3
--- /dev/null
+++ b/docs/changelog/113183.yaml
@@ -0,0 +1,6 @@
+pr: 113183
+summary: "ESQL: TOP support for strings"
+area: ES|QL
+type: feature
+issues:
+ - 109849
diff --git a/docs/changelog/113187.yaml b/docs/changelog/113187.yaml
new file mode 100644
index 0000000000000..397179c4bc3bb
--- /dev/null
+++ b/docs/changelog/113187.yaml
@@ -0,0 +1,5 @@
+pr: 113187
+summary: Preserve Step Info Across ILM Auto Retries
+area: ILM+SLM
+type: enhancement
+issues: []
diff --git a/docs/changelog/113216.yaml b/docs/changelog/113216.yaml
new file mode 100644
index 0000000000000..dec0b991fdacf
--- /dev/null
+++ b/docs/changelog/113216.yaml
@@ -0,0 +1,10 @@
+pr: 113216
+summary: "[Inference API] Deprecate elser service"
+area: Machine Learning
+type: deprecation
+issues: []
+deprecation:
+ title: "[Inference API] Deprecate elser service"
+ area: REST API
+ details: The `elser` service of the inference API will be removed in an upcoming release. Please use the elasticsearch service instead.
+ impact: In the current version there is no impact. In a future version, users of the `elser` service will no longer be able to use it, and will be required to use the `elasticsearch` service to access elser through the inference API.
diff --git a/docs/changelog/113237.yaml b/docs/changelog/113237.yaml
new file mode 100644
index 0000000000000..45343dbf17114
--- /dev/null
+++ b/docs/changelog/113237.yaml
@@ -0,0 +1,5 @@
+pr: 113237
+summary: Retry throttled snapshot deletions
+area: Snapshot/Restore
+type: bug
+issues: []
diff --git a/docs/changelog/113251.yaml b/docs/changelog/113251.yaml
new file mode 100644
index 0000000000000..49167e6e4c915
--- /dev/null
+++ b/docs/changelog/113251.yaml
@@ -0,0 +1,5 @@
+pr: 113251
+summary: Span term query to convert to match no docs when unmapped field is targeted
+area: Search
+type: bug
+issues: []
diff --git a/docs/changelog/113276.yaml b/docs/changelog/113276.yaml
new file mode 100644
index 0000000000000..87241878b3ec4
--- /dev/null
+++ b/docs/changelog/113276.yaml
@@ -0,0 +1,5 @@
+pr: 113276
+summary: Adding component template substitutions to the simulate ingest API
+area: Ingest Node
+type: enhancement
+issues: []
diff --git a/docs/changelog/113280.yaml b/docs/changelog/113280.yaml
new file mode 100644
index 0000000000000..1d8de0d87dd0d
--- /dev/null
+++ b/docs/changelog/113280.yaml
@@ -0,0 +1,5 @@
+pr: 113280
+summary: Warn for model load failures if they have a status code <500
+area: Machine Learning
+type: bug
+issues: []
diff --git a/docs/changelog/113286.yaml b/docs/changelog/113286.yaml
new file mode 100644
index 0000000000000..eeffb10b4e638
--- /dev/null
+++ b/docs/changelog/113286.yaml
@@ -0,0 +1,10 @@
+pr: 113286
+summary: Deprecate legacy params from range query
+area: Search
+type: deprecation
+issues: []
+deprecation:
+ title: Deprecate legacy params from range query
+ area: REST API
+ details: Range query will not longer accept `to`, `from`, `include_lower`, and `include_upper` parameters.
+ impact: Instead use `gt`, `gte`, `lt` and `lte` parameters.
diff --git a/docs/changelog/113297.yaml b/docs/changelog/113297.yaml
new file mode 100644
index 0000000000000..476619f432639
--- /dev/null
+++ b/docs/changelog/113297.yaml
@@ -0,0 +1,5 @@
+pr: 113297
+summary: "[ES|QL] add reverse function"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/113314.yaml b/docs/changelog/113314.yaml
new file mode 100644
index 0000000000000..c496ad3dd86f1
--- /dev/null
+++ b/docs/changelog/113314.yaml
@@ -0,0 +1,6 @@
+pr: 113314
+summary: "[ES|QL] Check expression resolved before checking its data type in `ImplicitCasting`"
+area: ES|QL
+type: bug
+issues:
+ - 113242
diff --git a/docs/changelog/113333.yaml b/docs/changelog/113333.yaml
new file mode 100644
index 0000000000000..c6a3584845729
--- /dev/null
+++ b/docs/changelog/113333.yaml
@@ -0,0 +1,5 @@
+pr: 113333
+summary: Upgrade to Lucene 9.12
+area: Search
+type: upgrade
+issues: []
diff --git a/docs/changelog/113373.yaml b/docs/changelog/113373.yaml
new file mode 100644
index 0000000000000..cbb3829e03425
--- /dev/null
+++ b/docs/changelog/113373.yaml
@@ -0,0 +1,6 @@
+pr: 113373
+summary: Implement `parseBytesRef` for `TimeSeriesRoutingHashFieldType`
+area: TSDB
+type: bug
+issues:
+ - 112399
diff --git a/docs/changelog/113374.yaml b/docs/changelog/113374.yaml
new file mode 100644
index 0000000000000..f1d5750de0f60
--- /dev/null
+++ b/docs/changelog/113374.yaml
@@ -0,0 +1,5 @@
+pr: 113374
+summary: Add ESQL match function
+area: ES|QL
+type: feature
+issues: []
diff --git a/docs/changelog/113385.yaml b/docs/changelog/113385.yaml
new file mode 100644
index 0000000000000..9cee1ebcd4f64
--- /dev/null
+++ b/docs/changelog/113385.yaml
@@ -0,0 +1,5 @@
+pr: 113385
+summary: Small performance improvement in h3 library
+area: Geo
+type: enhancement
+issues: []
diff --git a/docs/changelog/113387.yaml b/docs/changelog/113387.yaml
new file mode 100644
index 0000000000000..4819404a55809
--- /dev/null
+++ b/docs/changelog/113387.yaml
@@ -0,0 +1,5 @@
+pr: 113387
+summary: "Add `CircuitBreaker` to TDigest, Step 3: Connect with ESQL CB"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/113413.yaml b/docs/changelog/113413.yaml
new file mode 100644
index 0000000000000..8b1104ba61fe4
--- /dev/null
+++ b/docs/changelog/113413.yaml
@@ -0,0 +1,6 @@
+pr: 113413
+summary: Fixed a `NullPointerException` in `_capabilities` API when the `path` parameter is null.
+area: Infra/REST API
+type: bug
+issues:
+ - 113413
diff --git a/docs/changelog/113425.yaml b/docs/changelog/113425.yaml
new file mode 100644
index 0000000000000..f31060bd5b62d
--- /dev/null
+++ b/docs/changelog/113425.yaml
@@ -0,0 +1,5 @@
+pr: 113425
+summary: Add `ensureGreen` test method for use with `adminClient`
+area: Infra/Metrics
+type: enhancement
+issues: []
diff --git a/docs/changelog/113462.yaml b/docs/changelog/113462.yaml
new file mode 100644
index 0000000000000..c75c0dae3b2eb
--- /dev/null
+++ b/docs/changelog/113462.yaml
@@ -0,0 +1,5 @@
+pr: 113462
+summary: Suppress merge-on-recovery for older indices
+area: CRUD
+type: enhancement
+issues: []
diff --git a/docs/changelog/113482.yaml b/docs/changelog/113482.yaml
new file mode 100644
index 0000000000000..cb5823f0ccfcc
--- /dev/null
+++ b/docs/changelog/113482.yaml
@@ -0,0 +1,27 @@
+pr: 113482
+summary: The 'persian' analyzer has stemmer by default
+area: Analysis
+type: breaking
+issues:
+- 113050
+breaking:
+ title: The 'persian' analyzer has stemmer by default
+ area: Analysis
+ details: >-
+ Lucene 10 has added a final stemming step to its PersianAnalyzer that Elasticsearch
+ exposes as 'persian' analyzer. Existing indices will keep the old
+ non-stemming behaviour while new indices will see the updated behaviour with
+ added stemming.
+ Users that wish to maintain the non-stemming behaviour need to define their
+ own analyzer as outlined in
+ https://www.elastic.co/guide/en/elasticsearch/reference/8.15/analysis-lang-analyzer.html#persian-analyzer.
+ Users that wish to use the new stemming behaviour for existing indices will
+ have to reindex their data.
+ impact: >-
+ Indexing with the 'persian' analyzer will produce slightly different tokens.
+ Users should check if this impacts their search results. If they wish to
+ maintain the legacy non-stemming behaviour they can define their own
+ analyzer equivalent as explained in
+ https://www.elastic.co/guide/en/elasticsearch/reference/8.15/analysis-lang-analyzer.html#persian-analyzer.
+ notable: false
+
diff --git a/docs/changelog/113498.yaml b/docs/changelog/113498.yaml
new file mode 100644
index 0000000000000..93b21a1d171eb
--- /dev/null
+++ b/docs/changelog/113498.yaml
@@ -0,0 +1,5 @@
+pr: 113498
+summary: Listing all available databases in the _ingest/geoip/database API
+area: Ingest Node
+type: enhancement
+issues: []
diff --git a/docs/changelog/113499.yaml b/docs/changelog/113499.yaml
new file mode 100644
index 0000000000000..a4d7f28eb0de4
--- /dev/null
+++ b/docs/changelog/113499.yaml
@@ -0,0 +1,6 @@
+pr: 113499
+summary: Fix synthetic source for flattened field when used with `ignore_above`
+area: Logs
+type: bug
+issues:
+ - 112044
diff --git a/docs/changelog/113552.yaml b/docs/changelog/113552.yaml
new file mode 100644
index 0000000000000..48f7da309e82e
--- /dev/null
+++ b/docs/changelog/113552.yaml
@@ -0,0 +1,5 @@
+pr: 113552
+summary: Tag redacted document in ingest metadata
+area: Ingest Node
+type: enhancement
+issues: []
diff --git a/docs/changelog/113561.yaml b/docs/changelog/113561.yaml
new file mode 100644
index 0000000000000..d00eac7685bcc
--- /dev/null
+++ b/docs/changelog/113561.yaml
@@ -0,0 +1,5 @@
+pr: 113561
+summary: Add link to Circuit Breaker "Data too large" exception message
+area: Infra/Circuit Breakers
+type: enhancement
+issues: []
diff --git a/docs/changelog/113563.yaml b/docs/changelog/113563.yaml
new file mode 100644
index 0000000000000..48484ead99d77
--- /dev/null
+++ b/docs/changelog/113563.yaml
@@ -0,0 +1,5 @@
+pr: 113563
+summary: Use ELSER By Default For Semantic Text
+area: Mapping
+type: enhancement
+issues: []
diff --git a/docs/changelog/113570.yaml b/docs/changelog/113570.yaml
new file mode 100644
index 0000000000000..8cfad9195c5cd
--- /dev/null
+++ b/docs/changelog/113570.yaml
@@ -0,0 +1,7 @@
+pr: 113570
+summary: Fix `ignore_above` handling in synthetic source when index level setting
+ is used
+area: Logs
+type: bug
+issues:
+ - 113538
diff --git a/docs/changelog/113588.yaml b/docs/changelog/113588.yaml
new file mode 100644
index 0000000000000..e797100443f54
--- /dev/null
+++ b/docs/changelog/113588.yaml
@@ -0,0 +1,5 @@
+pr: 113588
+summary: Add asset criticality indices for `kibana_system_user`
+area: Security
+type: enhancement
+issues: []
diff --git a/docs/changelog/113607.yaml b/docs/changelog/113607.yaml
new file mode 100644
index 0000000000000..eb25d2600a555
--- /dev/null
+++ b/docs/changelog/113607.yaml
@@ -0,0 +1,5 @@
+pr: 113607
+summary: Add more `dense_vector` details for cluster stats field stats
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/113613.yaml b/docs/changelog/113613.yaml
new file mode 100644
index 0000000000000..4b020333aaa36
--- /dev/null
+++ b/docs/changelog/113613.yaml
@@ -0,0 +1,7 @@
+pr: 113613
+summary: "Add `CircuitBreaker` to TDigest, Step 4: Take into account shallow classes\
+ \ size"
+area: ES|QL
+type: enhancement
+issues:
+ - 113916
diff --git a/docs/changelog/113614.yaml b/docs/changelog/113614.yaml
new file mode 100644
index 0000000000000..bd9dcb3e38772
--- /dev/null
+++ b/docs/changelog/113614.yaml
@@ -0,0 +1,18 @@
+pr: 113614
+summary: The 'german2' stemmer is now an alias for the 'german' snowball stemmer
+area: Analysis
+type: breaking
+issues: []
+breaking:
+ title: The "german2" snowball stemmer is now an alias for the "german" stemmer
+ area: Analysis
+ details: >-
+ Lucene 10 has merged the improved "german2" snowball language stemmer with the
+ "german" stemmer. For Elasticsearch, "german2" is now a deprecated alias for
+ "german". This may results in slightly different tokens being generated for
+ terms with umlaut substitution (like "ue" for "ü" etc...)
+ impact: >-
+ Replace usages of "german2" with "german" in analysis configuration. Old
+ indices that use the "german" stemmer should be reindexed if possible.
+ notable: false
+
diff --git a/docs/changelog/113623.yaml b/docs/changelog/113623.yaml
new file mode 100644
index 0000000000000..8587687d27080
--- /dev/null
+++ b/docs/changelog/113623.yaml
@@ -0,0 +1,6 @@
+pr: 113623
+summary: "Adding chunking settings to `MistralService,` `GoogleAiStudioService,` and\
+ \ `HuggingFaceService`"
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113690.yaml b/docs/changelog/113690.yaml
new file mode 100644
index 0000000000000..bd5f1245f471e
--- /dev/null
+++ b/docs/changelog/113690.yaml
@@ -0,0 +1,5 @@
+pr: 113690
+summary: Add object param for keeping synthetic source
+area: Mapping
+type: enhancement
+issues: []
diff --git a/docs/changelog/113723.yaml b/docs/changelog/113723.yaml
new file mode 100644
index 0000000000000..2cbcf49102719
--- /dev/null
+++ b/docs/changelog/113723.yaml
@@ -0,0 +1,6 @@
+pr: 113723
+summary: Fix max file size check to use `getMaxFileSize`
+area: Infra/Core
+type: bug
+issues:
+ - 113705
diff --git a/docs/changelog/113735.yaml b/docs/changelog/113735.yaml
new file mode 100644
index 0000000000000..4f6579c7cb9e0
--- /dev/null
+++ b/docs/changelog/113735.yaml
@@ -0,0 +1,28 @@
+pr: 113735
+summary: "ESQL: Introduce per agg filter"
+area: ES|QL
+type: feature
+issues: []
+highlight:
+ title: "ESQL: Introduce per agg filter"
+ body: |-
+ Add support for aggregation scoped filters that work dynamically on the
+ data in each group.
+
+ [source,esql]
+ ----
+ | STATS success = COUNT(*) WHERE 200 <= code AND code < 300,
+ redirect = COUNT(*) WHERE 300 <= code AND code < 400,
+ client_err = COUNT(*) WHERE 400 <= code AND code < 500,
+ server_err = COUNT(*) WHERE 500 <= code AND code < 600,
+ total_count = COUNT(*)
+ ----
+
+ Implementation wise, the base AggregateFunction has been extended to
+ allow a filter to be passed on. This is required to incorporate the
+ filter as part of the aggregate equality/identity which would fail with
+ the filter as an external component.
+ As part of the process, the serialization for the existing aggregations
+ had to be fixed so AggregateFunction implementations so that it
+ delegates to their parent first.
+ notable: true
diff --git a/docs/changelog/113812.yaml b/docs/changelog/113812.yaml
new file mode 100644
index 0000000000000..04498b4ae5f7e
--- /dev/null
+++ b/docs/changelog/113812.yaml
@@ -0,0 +1,5 @@
+pr: 113812
+summary: Add Streaming Inference spec
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113816.yaml b/docs/changelog/113816.yaml
new file mode 100644
index 0000000000000..8c7cf14e356b3
--- /dev/null
+++ b/docs/changelog/113816.yaml
@@ -0,0 +1,5 @@
+pr: 113816
+summary: Avoid using concurrent collector manager in `LuceneChangesSnapshot`
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/113825.yaml b/docs/changelog/113825.yaml
new file mode 100644
index 0000000000000..6d4090fda7ed2
--- /dev/null
+++ b/docs/changelog/113825.yaml
@@ -0,0 +1,12 @@
+pr: 113825
+summary: Cross-cluster search telemetry
+area: Search
+type: feature
+issues: []
+highlight:
+ title: Cross-cluster search telemetry
+ body: |-
+ The cross-cluster search telemetry is collected when cross-cluster searches
+ are performed, and is returned as "ccs" field in `_cluster/stats` output.
+ It also add a new parameter `include_remotes=true` to the `_cluster/stats` API
+ which will collect data from connected remote clusters.
diff --git a/docs/changelog/113873.yaml b/docs/changelog/113873.yaml
new file mode 100644
index 0000000000000..ac52aaf94d518
--- /dev/null
+++ b/docs/changelog/113873.yaml
@@ -0,0 +1,5 @@
+pr: 113873
+summary: Default inference endpoint for ELSER
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113897.yaml b/docs/changelog/113897.yaml
new file mode 100644
index 0000000000000..db0c53518613c
--- /dev/null
+++ b/docs/changelog/113897.yaml
@@ -0,0 +1,6 @@
+pr: 113897
+summary: "Add chunking settings configuration to `CohereService,` `AmazonBedrockService,`\
+ \ and `AzureOpenAiService`"
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113910.yaml b/docs/changelog/113910.yaml
new file mode 100644
index 0000000000000..aa9d3b61fe768
--- /dev/null
+++ b/docs/changelog/113910.yaml
@@ -0,0 +1,5 @@
+pr: 113910
+summary: Do not expand dots when storing objects in ignored source
+area: Logs
+type: bug
+issues: []
diff --git a/docs/changelog/113911.yaml b/docs/changelog/113911.yaml
new file mode 100644
index 0000000000000..5c2f93a6ea76a
--- /dev/null
+++ b/docs/changelog/113911.yaml
@@ -0,0 +1,5 @@
+pr: 113911
+summary: Enable OpenAI Streaming
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113920.yaml b/docs/changelog/113920.yaml
new file mode 100644
index 0000000000000..4699ae6d7dd65
--- /dev/null
+++ b/docs/changelog/113920.yaml
@@ -0,0 +1,5 @@
+pr: 113920
+summary: Add initial support for `semantic_text` field type
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/113967.yaml b/docs/changelog/113967.yaml
new file mode 100644
index 0000000000000..58b72eba49deb
--- /dev/null
+++ b/docs/changelog/113967.yaml
@@ -0,0 +1,13 @@
+pr: 113967
+summary: "ESQL: Entirely remove META FUNCTIONS"
+area: ES|QL
+type: breaking
+issues: []
+breaking:
+ title: "ESQL: Entirely remove META FUNCTIONS"
+ area: ES|QL
+ details: |
+ Removes an undocumented syntax from ESQL: META FUNCTION. This was never
+ reliable or really useful. Consult the documentation instead.
+ impact: "Removes an undocumented syntax from ESQL: META FUNCTION"
+ notable: false
diff --git a/docs/changelog/113981.yaml b/docs/changelog/113981.yaml
new file mode 100644
index 0000000000000..38f3a6f04ae46
--- /dev/null
+++ b/docs/changelog/113981.yaml
@@ -0,0 +1,6 @@
+pr: 113981
+summary: "Adding chunking settings to `GoogleVertexAiService,` `AzureAiStudioService,`\
+ \ and `AlibabaCloudSearchService`"
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/113988.yaml b/docs/changelog/113988.yaml
new file mode 100644
index 0000000000000..d55e7eb2db326
--- /dev/null
+++ b/docs/changelog/113988.yaml
@@ -0,0 +1,5 @@
+pr: 113988
+summary: Track search and fetch failure stats
+area: Stats
+type: enhancement
+issues: []
diff --git a/docs/changelog/113989.yaml b/docs/changelog/113989.yaml
new file mode 100644
index 0000000000000..7bf50b52d9e07
--- /dev/null
+++ b/docs/changelog/113989.yaml
@@ -0,0 +1,5 @@
+pr: 113989
+summary: Add `max_multipart_parts` setting to S3 repository
+area: Snapshot/Restore
+type: enhancement
+issues: []
diff --git a/docs/changelog/114002.yaml b/docs/changelog/114002.yaml
new file mode 100644
index 0000000000000..b6bc7e25bcdea
--- /dev/null
+++ b/docs/changelog/114002.yaml
@@ -0,0 +1,5 @@
+pr: 114002
+summary: Add a `mustache.max_output_size_bytes` setting to limit the length of results from mustache scripts
+area: Infra/Scripting
+type: enhancement
+issues: []
diff --git a/docs/changelog/114021.yaml b/docs/changelog/114021.yaml
new file mode 100644
index 0000000000000..e9dab5dce5685
--- /dev/null
+++ b/docs/changelog/114021.yaml
@@ -0,0 +1,5 @@
+pr: 114021
+summary: "ESQL: Speed up grouping by bytes"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/114080.yaml b/docs/changelog/114080.yaml
new file mode 100644
index 0000000000000..395768c46369a
--- /dev/null
+++ b/docs/changelog/114080.yaml
@@ -0,0 +1,5 @@
+pr: 114080
+summary: Stream Cohere Completion
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114109.yaml b/docs/changelog/114109.yaml
new file mode 100644
index 0000000000000..ce51ed50f724c
--- /dev/null
+++ b/docs/changelog/114109.yaml
@@ -0,0 +1,5 @@
+pr: 114109
+summary: Update cluster stats for retrievers
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/114124.yaml b/docs/changelog/114124.yaml
new file mode 100644
index 0000000000000..c812c6a468902
--- /dev/null
+++ b/docs/changelog/114124.yaml
@@ -0,0 +1,18 @@
+pr: 114124
+summary: The Korean dictionary for Nori has been updated
+area: Analysis
+type: breaking
+issues: []
+breaking:
+ title: The Korean dictionary for Nori has been updated
+ area: Analysis
+ details: >-
+ Lucene 10 ships with an updated Korean dictionary (mecab-ko-dic-2.1.1).
+ For details see https://github.com/apache/lucene/issues/11452. Users
+ experiencing changes in search behaviour on existing data are advised to
+ reindex.
+ impact: >-
+ The change is small and should generally provide better analysis results.
+ Existing indices for full-text use cases should be reindexed though.
+ notable: false
+
diff --git a/docs/changelog/114128.yaml b/docs/changelog/114128.yaml
new file mode 100644
index 0000000000000..721649d0d6fe0
--- /dev/null
+++ b/docs/changelog/114128.yaml
@@ -0,0 +1,5 @@
+pr: 114128
+summary: Adding `index_template_substitutions` to the simulate ingest API
+area: Ingest Node
+type: enhancement
+issues: []
diff --git a/docs/changelog/114146.yaml b/docs/changelog/114146.yaml
new file mode 100644
index 0000000000000..be2096a64105c
--- /dev/null
+++ b/docs/changelog/114146.yaml
@@ -0,0 +1,20 @@
+pr: 114146
+summary: Snowball stemmers have been upgraded
+area: Analysis
+type: breaking
+issues: []
+breaking:
+ title: Snowball stemmers have been upgraded
+ area: Analysis
+ details: >-
+ Lucene 10 ships with an upgrade of its Snowball stemmers.
+ For details see https://github.com/apache/lucene/issues/13209. Users using
+ Snowball stemmers that are experiencing changes in search behaviour on
+ existing data are advised to reindex.
+ impact: >-
+ The upgrade should generally provide improved stemming results. Small changes
+ in token analysis can lead to mismatches with previously index data, so
+ existing indices using Snowball stemmers as part of their analysis chain
+ should be reindexed.
+ notable: false
+
diff --git a/docs/changelog/114157.yaml b/docs/changelog/114157.yaml
new file mode 100644
index 0000000000000..22e0fda173e98
--- /dev/null
+++ b/docs/changelog/114157.yaml
@@ -0,0 +1,6 @@
+pr: 114157
+summary: Add a `terminate` ingest processor
+area: Ingest Node
+type: feature
+issues:
+ - 110218
diff --git a/docs/changelog/114168.yaml b/docs/changelog/114168.yaml
new file mode 100644
index 0000000000000..58f1ab7110e7d
--- /dev/null
+++ b/docs/changelog/114168.yaml
@@ -0,0 +1,5 @@
+pr: 114168
+summary: Add a query rules tester API call
+area: Relevance
+type: enhancement
+issues: []
diff --git a/docs/changelog/114177.yaml b/docs/changelog/114177.yaml
new file mode 100644
index 0000000000000..d68486469d797
--- /dev/null
+++ b/docs/changelog/114177.yaml
@@ -0,0 +1,5 @@
+pr: 114177
+summary: "Make `randomInstantBetween` always return value in range [minInstant, `maxInstant]`"
+area: Infra/Metrics
+type: bug
+issues: []
diff --git a/docs/changelog/114231.yaml b/docs/changelog/114231.yaml
new file mode 100644
index 0000000000000..61c447688edcf
--- /dev/null
+++ b/docs/changelog/114231.yaml
@@ -0,0 +1,17 @@
+pr: 114231
+summary: Remove cluster state from `/_cluster/reroute` response
+area: Allocation
+type: breaking
+issues:
+ - 88978
+breaking:
+ title: Remove cluster state from `/_cluster/reroute` response
+ area: REST API
+ details: >-
+ The `POST /_cluster/reroute` API no longer returns the cluster state in its
+ response. The `?metric` query parameter to this API now has no effect and
+ its use will be forbidden in a future version.
+ impact: >-
+ Cease usage of the `?metric` query parameter when calling the
+ `POST /_cluster/reroute` API.
+ notable: false
diff --git a/docs/changelog/114234.yaml b/docs/changelog/114234.yaml
new file mode 100644
index 0000000000000..0f77ada794bee
--- /dev/null
+++ b/docs/changelog/114234.yaml
@@ -0,0 +1,5 @@
+pr: 114234
+summary: Prevent flattening of ordered and unordered interval sources
+area: Search
+type: bug
+issues: []
diff --git a/docs/changelog/114271.yaml b/docs/changelog/114271.yaml
new file mode 100644
index 0000000000000..7b47b922ff811
--- /dev/null
+++ b/docs/changelog/114271.yaml
@@ -0,0 +1,5 @@
+pr: 114271
+summary: "[ES|QL] Skip validating remote cluster index names in parser"
+area: ES|QL
+type: bug
+issues: []
diff --git a/docs/changelog/114295.yaml b/docs/changelog/114295.yaml
new file mode 100644
index 0000000000000..2acdc293a206c
--- /dev/null
+++ b/docs/changelog/114295.yaml
@@ -0,0 +1,5 @@
+pr: 114295
+summary: "Reprocess operator file settings when settings service starts, due to node restart or master node change"
+area: Infra/Settings
+type: enhancement
+issues: [ ]
diff --git a/docs/changelog/114303.yaml b/docs/changelog/114303.yaml
new file mode 100644
index 0000000000000..95235440f4b10
--- /dev/null
+++ b/docs/changelog/114303.yaml
@@ -0,0 +1,6 @@
+pr: 114303
+summary: Fix TDigestState.read CB leaks
+area: ES|QL
+type: bug
+issues:
+ - 114194
diff --git a/docs/changelog/114309.yaml b/docs/changelog/114309.yaml
new file mode 100644
index 0000000000000..bcd1262062943
--- /dev/null
+++ b/docs/changelog/114309.yaml
@@ -0,0 +1,6 @@
+pr: 114309
+summary: Upgrade to AWS SDK v2
+area: Machine Learning
+type: enhancement
+issues:
+ - 110590
diff --git a/docs/changelog/114321.yaml b/docs/changelog/114321.yaml
new file mode 100644
index 0000000000000..286a72cfee840
--- /dev/null
+++ b/docs/changelog/114321.yaml
@@ -0,0 +1,5 @@
+pr: 114321
+summary: Stream Anthropic Completion
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114358.yaml b/docs/changelog/114358.yaml
new file mode 100644
index 0000000000000..972bc5bfdbe1c
--- /dev/null
+++ b/docs/changelog/114358.yaml
@@ -0,0 +1,5 @@
+pr: 114358
+summary: "ESQL: Use less memory in listener"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/114363.yaml b/docs/changelog/114363.yaml
new file mode 100644
index 0000000000000..51ca9ed34a7ca
--- /dev/null
+++ b/docs/changelog/114363.yaml
@@ -0,0 +1,5 @@
+pr: 114363
+summary: Give the kibana system user permission to read security entities
+area: Infra/Core
+type: enhancement
+issues: []
diff --git a/docs/changelog/114368.yaml b/docs/changelog/114368.yaml
new file mode 100644
index 0000000000000..6c6e215a1bd49
--- /dev/null
+++ b/docs/changelog/114368.yaml
@@ -0,0 +1,5 @@
+pr: 114368
+summary: "ESQL: Delay construction of warnings"
+area: EQL
+type: enhancement
+issues: []
diff --git a/docs/changelog/114375.yaml b/docs/changelog/114375.yaml
new file mode 100644
index 0000000000000..7ff7cc60b34ba
--- /dev/null
+++ b/docs/changelog/114375.yaml
@@ -0,0 +1,5 @@
+pr: 114375
+summary: Handle `InternalSendException` inline for non-forking handlers
+area: Distributed
+type: bug
+issues: []
diff --git a/docs/changelog/114382.yaml b/docs/changelog/114382.yaml
new file mode 100644
index 0000000000000..9f572e14f4737
--- /dev/null
+++ b/docs/changelog/114382.yaml
@@ -0,0 +1,5 @@
+pr: 114382
+summary: "[ES|QL] Add hypot function"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/114386.yaml b/docs/changelog/114386.yaml
new file mode 100644
index 0000000000000..cf9edda9de21e
--- /dev/null
+++ b/docs/changelog/114386.yaml
@@ -0,0 +1,5 @@
+pr: 114386
+summary: Improve handling of failure to create persistent task
+area: Task Management
+type: bug
+issues: []
diff --git a/docs/changelog/114389.yaml b/docs/changelog/114389.yaml
new file mode 100644
index 0000000000000..f56b165bc917e
--- /dev/null
+++ b/docs/changelog/114389.yaml
@@ -0,0 +1,5 @@
+pr: 114389
+summary: Filter empty task settings objects from the API response
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114407.yaml b/docs/changelog/114407.yaml
new file mode 100644
index 0000000000000..4c1134a9d3834
--- /dev/null
+++ b/docs/changelog/114407.yaml
@@ -0,0 +1,6 @@
+pr: 114407
+summary: Fix synthetic source handling for `bit` type in `dense_vector` field
+area: Search
+type: bug
+issues:
+ - 114402
diff --git a/docs/changelog/114411.yaml b/docs/changelog/114411.yaml
new file mode 100644
index 0000000000000..23bff3c8e25ba
--- /dev/null
+++ b/docs/changelog/114411.yaml
@@ -0,0 +1,5 @@
+pr: 114411
+summary: "ESQL: Push down filters even in case of renames in Evals"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/114429.yaml b/docs/changelog/114429.yaml
new file mode 100644
index 0000000000000..56b0ffe7b43fb
--- /dev/null
+++ b/docs/changelog/114429.yaml
@@ -0,0 +1,5 @@
+pr: 114429
+summary: Add chunking settings configuration to `ElasticsearchService/ELSER`
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114439.yaml b/docs/changelog/114439.yaml
new file mode 100644
index 0000000000000..fd097d02f885f
--- /dev/null
+++ b/docs/changelog/114439.yaml
@@ -0,0 +1,5 @@
+pr: 114439
+summary: Adding new bbq index types behind a feature flag
+area: Vector Search
+type: feature
+issues: []
diff --git a/docs/changelog/114453.yaml b/docs/changelog/114453.yaml
new file mode 100644
index 0000000000000..0d5345ad9d2a6
--- /dev/null
+++ b/docs/changelog/114453.yaml
@@ -0,0 +1,5 @@
+pr: 114453
+summary: Switch default chunking strategy to sentence
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114457.yaml b/docs/changelog/114457.yaml
new file mode 100644
index 0000000000000..9558c41852f69
--- /dev/null
+++ b/docs/changelog/114457.yaml
@@ -0,0 +1,6 @@
+pr: 114457
+summary: "[Inference API] Introduce Update API to change some aspects of existing\
+ \ inference endpoints"
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114464.yaml b/docs/changelog/114464.yaml
new file mode 100644
index 0000000000000..5f5ee816aa28d
--- /dev/null
+++ b/docs/changelog/114464.yaml
@@ -0,0 +1,5 @@
+pr: 114464
+summary: Stream Azure Completion
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114512.yaml b/docs/changelog/114512.yaml
new file mode 100644
index 0000000000000..10dea3a2cbac1
--- /dev/null
+++ b/docs/changelog/114512.yaml
@@ -0,0 +1,5 @@
+pr: 114512
+summary: Ensure clean thread context in `MasterService`
+area: Cluster Coordination
+type: bug
+issues: []
diff --git a/docs/changelog/114527.yaml b/docs/changelog/114527.yaml
new file mode 100644
index 0000000000000..74d95edcd1a1d
--- /dev/null
+++ b/docs/changelog/114527.yaml
@@ -0,0 +1,5 @@
+pr: 114527
+summary: Verify Maxmind database types in the geoip processor
+area: Ingest Node
+type: enhancement
+issues: []
diff --git a/docs/changelog/114533.yaml b/docs/changelog/114533.yaml
new file mode 100644
index 0000000000000..f45589e8de921
--- /dev/null
+++ b/docs/changelog/114533.yaml
@@ -0,0 +1,5 @@
+pr: 114533
+summary: Fix dim validation for bit `element_type`
+area: Vector Search
+type: bug
+issues: []
diff --git a/docs/changelog/114549.yaml b/docs/changelog/114549.yaml
new file mode 100644
index 0000000000000..a6bdbba93876b
--- /dev/null
+++ b/docs/changelog/114549.yaml
@@ -0,0 +1,5 @@
+pr: 114549
+summary: Send mid-stream errors to users
+area: Machine Learning
+type: bug
+issues: []
diff --git a/docs/changelog/114552.yaml b/docs/changelog/114552.yaml
new file mode 100644
index 0000000000000..00e2f95b5038d
--- /dev/null
+++ b/docs/changelog/114552.yaml
@@ -0,0 +1,5 @@
+pr: 114552
+summary: Improve exception message for bad environment variable placeholders in settings
+area: Infra/Settings
+type: enhancement
+issues: [110858]
diff --git a/docs/changelog/114596.yaml b/docs/changelog/114596.yaml
new file mode 100644
index 0000000000000..a36978dcacd8c
--- /dev/null
+++ b/docs/changelog/114596.yaml
@@ -0,0 +1,5 @@
+pr: 114596
+summary: Stream Google Completion
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114601.yaml b/docs/changelog/114601.yaml
new file mode 100644
index 0000000000000..d2f563d62a639
--- /dev/null
+++ b/docs/changelog/114601.yaml
@@ -0,0 +1,6 @@
+pr: 114601
+summary: Support semantic_text in object fields
+area: Vector Search
+type: bug
+issues:
+ - 114401
diff --git a/docs/changelog/114620.yaml b/docs/changelog/114620.yaml
new file mode 100644
index 0000000000000..92498db92061f
--- /dev/null
+++ b/docs/changelog/114620.yaml
@@ -0,0 +1,5 @@
+pr: 114620
+summary: "ES|QL: add metrics for functions"
+area: ES|QL
+type: enhancement
+issues: []
diff --git a/docs/changelog/114623.yaml b/docs/changelog/114623.yaml
new file mode 100644
index 0000000000000..817a8e874bcc0
--- /dev/null
+++ b/docs/changelog/114623.yaml
@@ -0,0 +1,5 @@
+pr: 114623
+summary: Preserve thread context when waiting for segment generation in RTG
+area: CRUD
+type: bug
+issues: []
diff --git a/docs/changelog/114638.yaml b/docs/changelog/114638.yaml
new file mode 100644
index 0000000000000..0386aacfe3e18
--- /dev/null
+++ b/docs/changelog/114638.yaml
@@ -0,0 +1,7 @@
+pr: 114638
+summary: "ES|QL: Restrict sorting for `_source` and counter field types"
+area: ES|QL
+type: bug
+issues:
+ - 114423
+ - 111976
diff --git a/docs/changelog/114683.yaml b/docs/changelog/114683.yaml
new file mode 100644
index 0000000000000..a677e65a12b0e
--- /dev/null
+++ b/docs/changelog/114683.yaml
@@ -0,0 +1,5 @@
+pr: 114683
+summary: Default inference endpoint for the multilingual-e5-small model
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114715.yaml b/docs/changelog/114715.yaml
new file mode 100644
index 0000000000000..0894cb2fa42ca
--- /dev/null
+++ b/docs/changelog/114715.yaml
@@ -0,0 +1,5 @@
+pr: 114715
+summary: Ignore unrecognized openai sse fields
+area: Machine Learning
+type: bug
+issues: []
diff --git a/docs/changelog/114719.yaml b/docs/changelog/114719.yaml
new file mode 100644
index 0000000000000..477d656d5b979
--- /dev/null
+++ b/docs/changelog/114719.yaml
@@ -0,0 +1,5 @@
+pr: 114719
+summary: Wait for allocation on scale up
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114732.yaml b/docs/changelog/114732.yaml
new file mode 100644
index 0000000000000..42176cdbda443
--- /dev/null
+++ b/docs/changelog/114732.yaml
@@ -0,0 +1,5 @@
+pr: 114732
+summary: Stream Bedrock Completion
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114741.yaml b/docs/changelog/114741.yaml
new file mode 100644
index 0000000000000..ae45c183cddf9
--- /dev/null
+++ b/docs/changelog/114741.yaml
@@ -0,0 +1,5 @@
+pr: 114741
+summary: Upgrade to Lucene 10
+area: Search
+type: upgrade
+issues: []
diff --git a/docs/changelog/114750.yaml b/docs/changelog/114750.yaml
new file mode 100644
index 0000000000000..f7a3c8c283934
--- /dev/null
+++ b/docs/changelog/114750.yaml
@@ -0,0 +1,5 @@
+pr: 114750
+summary: Create an ml node inference endpoint referencing an existing model
+area: Machine Learning
+type: enhancement
+issues: []
diff --git a/docs/changelog/114784.yaml b/docs/changelog/114784.yaml
new file mode 100644
index 0000000000000..24ebe8b5fc09a
--- /dev/null
+++ b/docs/changelog/114784.yaml
@@ -0,0 +1,5 @@
+pr: 114784
+summary: "[ES|QL] make named parameter for identifier and pattern snapshot"
+area: ES|QL
+type: bug
+issues: []
diff --git a/docs/changelog/114813.yaml b/docs/changelog/114813.yaml
new file mode 100644
index 0000000000000..1595b004178c4
--- /dev/null
+++ b/docs/changelog/114813.yaml
@@ -0,0 +1,5 @@
+pr: 114813
+summary: Retry `S3BlobContainer#getRegister` on all exceptions
+area: Snapshot/Restore
+type: enhancement
+issues: []
diff --git a/docs/changelog/114836.yaml b/docs/changelog/114836.yaml
new file mode 100644
index 0000000000000..6f21d3bfb9327
--- /dev/null
+++ b/docs/changelog/114836.yaml
@@ -0,0 +1,6 @@
+pr: 114836
+summary: Support multi-valued fields in compute engine for ST_DISTANCE
+area: ES|QL
+type: enhancement
+issues:
+ - 112910
diff --git a/docs/changelog/114837.yaml b/docs/changelog/114837.yaml
new file mode 100644
index 0000000000000..313d88f92282c
--- /dev/null
+++ b/docs/changelog/114837.yaml
@@ -0,0 +1,5 @@
+pr: 114837
+summary: Add warning headers for ingest pipelines containing special characters
+area: Ingest Node
+type: bug
+issues: [ 104411 ]
diff --git a/docs/changelog/114848.yaml b/docs/changelog/114848.yaml
new file mode 100644
index 0000000000000..db41e8496f787
--- /dev/null
+++ b/docs/changelog/114848.yaml
@@ -0,0 +1,5 @@
+pr: 114848
+summary: "ESQL: Fix grammar changes around per agg filtering"
+area: ES|QL
+type: bug
+issues: []
diff --git a/docs/changelog/114854.yaml b/docs/changelog/114854.yaml
new file mode 100644
index 0000000000000..144a10ba85043
--- /dev/null
+++ b/docs/changelog/114854.yaml
@@ -0,0 +1,10 @@
+pr: 114854
+summary: Adding deprecation warnings for rrf using rank and `sub_searches`
+area: Search
+type: deprecation
+issues: []
+deprecation:
+ title: Adding deprecation warnings for rrf using rank and `sub_searches`
+ area: REST API
+ details: Search API parameter `sub_searches` will no longer be a supported and will be removed in future releases. Similarly, `rrf` can only be used through the specified `retriever` and no longer though the `rank` parameter
+ impact: Requests specifying rrf through `rank` and/or `sub_searches` elements will be disallowed in a future version. Users should instead utilize the new `retriever` parameter.
diff --git a/docs/changelog/114856.yaml b/docs/changelog/114856.yaml
new file mode 100644
index 0000000000000..da7fae3ee18ea
--- /dev/null
+++ b/docs/changelog/114856.yaml
@@ -0,0 +1,5 @@
+pr: 114856
+summary: "OTel mappings: avoid metrics to be rejected when attributes are malformed"
+area: Data streams
+type: bug
+issues: []
diff --git a/docs/changelog/114869.yaml b/docs/changelog/114869.yaml
new file mode 100644
index 0000000000000..755418e7ce4d9
--- /dev/null
+++ b/docs/changelog/114869.yaml
@@ -0,0 +1,5 @@
+pr: 114869
+summary: Standardize error code when bulk body is invalid
+area: CRUD
+type: bug
+issues: []
diff --git a/docs/changelog/114888.yaml b/docs/changelog/114888.yaml
new file mode 100644
index 0000000000000..6b99eb82d10f3
--- /dev/null
+++ b/docs/changelog/114888.yaml
@@ -0,0 +1,6 @@
+pr: 114888
+summary: Fix ST_CENTROID_AGG when no records are aggregated
+area: ES|QL
+type: bug
+issues:
+ - 106025
diff --git a/docs/changelog/114899.yaml b/docs/changelog/114899.yaml
new file mode 100644
index 0000000000000..399aa5cf35409
--- /dev/null
+++ b/docs/changelog/114899.yaml
@@ -0,0 +1,5 @@
+pr: 114899
+summary: "ES|QL: Fix stats by constant expression"
+area: ES|QL
+type: bug
+issues: []
diff --git a/docs/changelog/114924.yaml b/docs/changelog/114924.yaml
new file mode 100644
index 0000000000000..536f446ef790d
--- /dev/null
+++ b/docs/changelog/114924.yaml
@@ -0,0 +1,5 @@
+pr: 114924
+summary: Reducing error-level stack trace logging for normal events in `GeoIpDownloader`
+area: Ingest Node
+type: bug
+issues: []
diff --git a/docs/changelog/115031.yaml b/docs/changelog/115031.yaml
new file mode 100644
index 0000000000000..d8d6e1a3f8166
--- /dev/null
+++ b/docs/changelog/115031.yaml
@@ -0,0 +1,5 @@
+pr: 115031
+summary: Bool query early termination should also consider `must_not` clauses
+area: Search
+type: enhancement
+issues: []
diff --git a/docs/changelog/115048.yaml b/docs/changelog/115048.yaml
new file mode 100644
index 0000000000000..10844b83c6d01
--- /dev/null
+++ b/docs/changelog/115048.yaml
@@ -0,0 +1,5 @@
+pr: 115048
+summary: Add timeout and cancellation check to rescore phase
+area: Ranking
+type: enhancement
+issues: []
diff --git a/docs/changelog/115147.yaml b/docs/changelog/115147.yaml
new file mode 100644
index 0000000000000..36f40bba1da17
--- /dev/null
+++ b/docs/changelog/115147.yaml
@@ -0,0 +1,5 @@
+pr: 115147
+summary: Fix IPinfo geolocation schema
+area: Ingest Node
+type: bug
+issues: []
diff --git a/docs/changelog/115194.yaml b/docs/changelog/115194.yaml
new file mode 100644
index 0000000000000..0b201b9f89aa5
--- /dev/null
+++ b/docs/changelog/115194.yaml
@@ -0,0 +1,7 @@
+pr: 115194
+summary: Update APM Java Agent to support JDK 23
+area: Infra/Metrics
+type: upgrade
+issues:
+ - 115101
+ - 115100
diff --git a/docs/internal/DistributedArchitectureGuide.md b/docs/internal/DistributedArchitectureGuide.md
index 732e2e7be46fa..793d38e3d73b3 100644
--- a/docs/internal/DistributedArchitectureGuide.md
+++ b/docs/internal/DistributedArchitectureGuide.md
@@ -252,7 +252,7 @@ changes. The cloud service will add more resources to the cluster based on Elast
Elasticsearch by itself cannot automatically scale.
Autoscaling recommendations are tailored for the user [based on user defined policies][], composed of data
-roles (hot, frozen, etc) and [deciders][]. There's a public [webinar on autoscaling][], as well as the
+roles (hot, frozen, etc.) and [deciders][]. There's a public [webinar on autoscaling][], as well as the
public [Autoscaling APIs] docs.
Autoscaling's current implementation is based primary on storage requirements, as well as memory capacity
@@ -332,7 +332,7 @@ problems in the cluster. It uses [an algorithm defined here][]. Some examples ar
[an algorithm defined here]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ReactiveStorageDeciderService.java#L158-L176
The `ProactiveStorageDeciderService` maintains a forecast window that [defaults to 30 minutes][]. It only
-runs on data streams (ILM, rollover, etc), not regular indexes. It looks at past [index changes][] that
+runs on data streams (ILM, rollover, etc.), not regular indexes. It looks at past [index changes][] that
took place within the forecast window to [predict][] resources that will be needed shortly.
[defaults to 30 minutes]: https://github.com/elastic/elasticsearch/blob/v8.13.2/x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ProactiveStorageDeciderService.java#L32
@@ -365,18 +365,151 @@ There are several more Decider Services, implementing the `AutoscalingDeciderSer
# Task Management / Tracking
-(How we identify operations/tasks in the system and report upon them. How we group operations via parent task ID.)
+[TransportRequest]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/transport/TransportRequest.java
+[TaskManager]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/TaskManager.java
+[TaskManager#register]:https://github.com/elastic/elasticsearch/blob/6d161e3d63bedc28088246cff58ce8ffe269e112/server/src/main/java/org/elasticsearch/tasks/TaskManager.java#L125
+[TaskManager#unregister]:https://github.com/elastic/elasticsearch/blob/d59df8af3e591a248a25b849612e448972068f10/server/src/main/java/org/elasticsearch/tasks/TaskManager.java#L317
+[TaskId]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/TaskId.java
+[Task]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/Task.java
+[TaskAwareRequest]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/TaskAwareRequest.java
+[TaskAwareRequest#createTask]:https://github.com/elastic/elasticsearch/blob/6d161e3d63bedc28088246cff58ce8ffe269e112/server/src/main/java/org/elasticsearch/tasks/TaskAwareRequest.java#L50
+[CancellableTask]:https://github.com/elastic/elasticsearch/blob/d59df8af3e591a248a25b849612e448972068f10/server/src/main/java/org/elasticsearch/tasks/CancellableTask.java#L20
+[TransportService]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/transport/TransportService.java
+[Task management API]:https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html
+[cat task management API]:https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-tasks.html
+[TransportAction]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/action/support/TransportAction.java
+[NodeClient#executeLocally]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/client/internal/node/NodeClient.java#L100
+[TaskManager#registerAndExecute]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/tasks/TaskManager.java#L174
+[RequestHandlerRegistry#processMessageReceived]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/transport/RequestHandlerRegistry.java#L65
+
+The tasks infrastructure is used to track currently executing operations in the Elasticsearch cluster. The [Task management API] provides an interface for querying, cancelling, and monitoring the status of tasks.
+
+Each individual task is local to a node, but can be related to other tasks, on the same node or other nodes, via a parent-child relationship.
+
+### Task tracking and registration
+
+Tasks are tracked in-memory on each node in the node's [TaskManager], new tasks are registered via one of the [TaskManager#register] methods.
+Registration of a task creates a [Task] instance with a unique-for-the-node numeric identifier, populates it with some metadata and stores it in the [TaskManager].
+
+The [register][TaskManager#register] methods will return the registered [Task] instance, which can be used to interact with the task. The [Task] class is often sub-classed to include task-specific data and operations. Specific [Task] subclasses are created by overriding the [createTask][TaskAwareRequest#createTask] method on the [TaskAwareRequest] passed to the [TaskManager#register] methods.
+
+When a task is completed, it must be unregistered via [TaskManager#unregister].
+
+#### A note about task IDs
+The IDs given to a task are numeric, supplied by a counter that starts at zero and increments over the life of the node process. So while they are unique in the individual node process, they would collide with IDs allocated after the node restarts, or IDs allocated on other nodes.
+
+To better identify a task in the cluster scope, a tuple of persistent node ID and task ID is used. This is represented in code using the [TaskId] class and serialized as the string `{node-ID}:{local-task-ID}` (e.g. `oTUltX4IQMOUUVeiohTt8A:124`). While [TaskId] is safe to use to uniquely identify tasks _currently_ running in a cluster, it should be used with caution as it can collide with tasks that have run in the cluster in the past (i.e. tasks that ran prior to a cluster node restart).
### What Tasks Are Tracked
-### Tracking A Task Across Threads
+The purpose of tasks is to provide management and visibility of the cluster workload. There is some overhead involved in tracking a task, so they are best suited to tracking non-trivial and/or long-running operations. For smaller, more trivial operations, visibility is probably better implemented using telemetry APIs.
+
+Some examples of operations that are tracked using tasks include:
+- Execution of [TransportAction]s
+ - [NodeClient#executeLocally] invokes [TaskManager#registerAndExecute]
+ - [RequestHandlerRegistry#processMessageReceived] registers tasks for actions that are spawned to handle [TransportRequest]s
+- Publication of cluster state updates
+
+### Tracking a Task Across Threads and Nodes
+
+#### ThreadContext
+
+[ThreadContext]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/common/util/concurrent/ThreadContext.java
+[ThreadPool]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/threadpool/ThreadPool.java
+[ExecutorService]:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/ExecutorService.html
+
+All [ThreadPool] threads have an associated [ThreadContext]. The [ThreadContext] contains a map of headers which carry information relevant to the operation currently being executed. For example, a thread spawned to handle a REST request will include the HTTP headers received in that request.
+
+When threads submit work to an [ExecutorService] from the [ThreadPool], those spawned threads will inherit the [ThreadContext] of the thread that submitted them. When [TransportRequest]s are dispatched, the headers from the sending [ThreadContext] are included and then loaded into the [ThreadContext] of the thread handling the request. In these ways, [ThreadContext] is preserved across threads involved in an operation, both locally and on remote nodes.
+
+#### Headers
+
+[Task#HEADERS_TO_COPY]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/tasks/Task.java#L62
+[ActionPlugin#getTaskHeaders]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/plugins/ActionPlugin.java#L99
+[X-Opaque-Id API DOC]:https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html#_identifying_running_tasks
+
+When a task is registered by a thread, a subset (defined by [Task#HEADERS_TO_COPY] and any [ActionPlugin][ActionPlugin#getTaskHeaders]s loaded on the node) of the headers from the [ThreadContext] are copied into the [Task]'s set of headers.
+
+One such header is `X-Opaque-Id`. This is a string that [can be submitted on REST requests][X-Opaque-Id API DOC], and it will be associated with all tasks created on all nodes in the course of handling that request.
+
+#### Parent/child relationships
+
+[ParentTaskAssigningClient]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/client/internal/ParentTaskAssigningClient.java
+[TaskAwareRequest#setParentTask]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/tasks/TaskAwareRequest.java#L20
+[TransportService#sendChildRequest]:https://github.com/elastic/elasticsearch/blob/c47162afca78f7351e30accc4857fd4bb38552b7/server/src/main/java/org/elasticsearch/transport/TransportService.java#L932
-### Tracking A Task Across Nodes
+Another way to track the operations of a task is by following the parent/child relationships. When registering a task it can be optionally associated with a parent task. Generally if an executing task initiates sub-tasks, the ID of the executing task will be set as the parent of any spawned tasks (see [ParentTaskAssigningClient], [TransportService#sendChildRequest] and [TaskAwareRequest#setParentTask] for how this is implemented for [TransportAction]s).
### Kill / Cancel A Task
+[TaskManager#cancelTaskAndDescendants]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/tasks/TaskManager.java#L811
+[BanParentRequestHandler]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/tasks/TaskCancellationService.java#L356
+[UnregisterChildTransportResponseHandler]:https://github.com/elastic/elasticsearch/blob/5e8fd548b959039b6b77ad53715415b429568bc0/server/src/main/java/org/elasticsearch/transport/TransportService.java#L1763
+[Cancel Task REST API]:https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html#task-cancellation
+[RestCancellableNodeClient]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/rest/action/RestCancellableNodeClient.java
+[TaskCancelledException]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/TaskCancelledException.java
+
+Some long-running tasks are implemented to be cancel-able. Cancellation of a task and its descendants can be done via the [Cancel Task REST API] or programmatically using [TaskManager#cancelTaskAndDescendants]. Perhaps the most common use of cancellation you will see is cancellation of [TransportAction]s dispatched from the REST layer when the client disconnects, to facilitate this we use the [RestCancellableNodeClient].
+
+In order to support cancellation, the [Task] instance associated with the task must extend [CancellableTask]. It is the job of any workload tracked by a [CancellableTask] to periodically check whether it has been cancelled and, if so, finish early. We generally wait for the result of a cancelled task, so tasks can decide how they complete upon being cancelled, typically it's exceptionally with [TaskCancelledException].
+
+When a [Task] extends [CancellableTask] the [TaskManager] keeps track of it and any child tasks that it spawns. When the task is cancelled, requests are sent to any nodes that have had child tasks submitted to them to ban the starting of any further children of that task, and any cancellable child tasks already running are themselves cancelled (see [BanParentRequestHandler]).
+
+When a cancellable task dispatches child requests through the [TransportService], it registers a proxy response handler that will instruct the remote node to cancel that child and any lingering descendants in the event that it completes exceptionally (see [UnregisterChildTransportResponseHandler]). A typical use-case for this is when no response is received within the time-out, the sending node will cancel the remote action and complete with a timeout exception.
+
+### Publishing Task Results
+
+[TaskResult]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/TaskResult.java
+[TaskResultsService]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/tasks/TaskResultsService.java
+[CAT]:https://www.elastic.co/guide/en/elasticsearch/reference/current/cat.html
+[ActionRequest]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/action/ActionRequest.java
+[ActionRequest#getShouldStoreResult]:https://github.com/elastic/elasticsearch/blob/b633fe1ccb67f7dbf460cdc087eb60ae212a472a/server/src/main/java/org/elasticsearch/action/ActionRequest.java#L32
+[TaskResultStoringActionListener]:https://github.com/elastic/elasticsearch/blob/b633fe1ccb67f7dbf460cdc087eb60ae212a472a/server/src/main/java/org/elasticsearch/action/support/TransportAction.java#L149
+
+A list of tasks currently running in a cluster can be requested via the [Task management API], or the [cat task management API]. The former returns each task represented using [TaskResult], the latter returning a more compact [CAT] representation.
+
+Some [ActionRequest]s allow the results of the actions they spawn to be stored upon completion for later retrieval. If [ActionRequest#getShouldStoreResult] returns true, a [TaskResultStoringActionListener] will be inserted into the chain of response listeners. [TaskResultStoringActionListener] serializes the [TaskResult] of the [TransportAction] and persists it in the `.tasks` index using the [TaskResultsService].
+
+The [Task management API] also exposes an endpoint where a task ID can be specified, this form of the API will return currently running tasks, or completed tasks whose results were persisted. Note that although we use [TaskResult] to return task information from all the JSON APIs, the `error` or `response` fields will only ever be populated for stored tasks that are already completed.
+
### Persistent Tasks
+[PersistentTaskPlugin]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/plugins/PersistentTaskPlugin.java
+[PersistentTasksExecutor]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/persistent/PersistentTasksExecutor.java
+[PersistentTasksExecutorRegistry]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/persistent/PersistentTasksExecutorRegistry.java
+[PersistentTasksNodeService]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/persistent/PersistentTasksNodeService.java
+[PersistentTasksClusterService]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/persistent/PersistentTasksClusterService.java
+[AllocatedPersistentTask]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/persistent/AllocatedPersistentTask.java
+[ShardFollowTasksExecutor]:https://github.com/elastic/elasticsearch/blob/main/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/ShardFollowTasksExecutor.java
+[HealthNodeTaskExecutor]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/health/node/selection/HealthNodeTaskExecutor.java
+[SystemIndexMigrationExecutor]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/upgrades/SystemIndexMigrationExecutor.java
+[PersistentTasksCustomMetadata]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/persistent/PersistentTasksCustomMetadata.java
+[PersistentTasksCustomMetadata.PersistentTask]:https://github.com/elastic/elasticsearch/blob/d466ad1c3c4cedc7d5f6ab5794abe7bfd72aef4e/server/src/main/java/org/elasticsearch/persistent/PersistentTasksCustomMetadata.java#L305
+
+Up until now we have discussed only ephemeral tasks. If we want a task to survive node failures, it needs to be registered as a persistent task at the cluster level.
+
+Plugins can register persistent tasks definitions by implementing [PersistentTaskPlugin] and returning one or more [PersistentTasksExecutor] instances. These are collated into a [PersistentTasksExecutorRegistry] which is provided to [PersistentTasksNodeService] active on each node in the cluster, and a [PersistentTasksClusterService] active on the master.
+
+The [PersistentTasksClusterService] runs on the master to manage the set of running persistent tasks. It periodically checks that all persistent tasks are assigned to live nodes and handles the creation, completion, removal and updates-to-the-state of persistent task instances in the cluster state (see [PersistentTasksCustomMetadata]).
+
+The [PersistentTasksNodeService] monitors the cluster state to:
+ - Start any tasks allocated to it (tracked in the local [TaskManager] by an [AllocatedPersistentTask])
+ - Cancel any running tasks that have been removed ([AllocatedPersistentTask] extends [CancellableTask])
+
+If a node leaves the cluster while it has a persistent task allocated to it, the master will re-allocate that task to a surviving node. To do this, it creates a new [PersistentTasksCustomMetadata.PersistentTask] entry with a higher `#allocationId`. The allocation ID is included any time the [PersistentTasksNodeService] communicates with the [PersistentTasksClusterService] about the task, it allows the [PersistentTasksClusterService] to ignore persistent task messages originating from stale allocations.
+
+Some examples of the use of persistent tasks include:
+ - [ShardFollowTasksExecutor]: Defined by [cross-cluster replication](#cross-cluster-replication-ccr) to poll a remote cluster for updates
+ - [HealthNodeTaskExecutor]: Used to schedule work related to monitoring cluster health
+ - [SystemIndexMigrationExecutor]: Manages the migration of system indices after an upgrade
+
+### Integration with APM
+
+[Traceable]:https://github.com/elastic/elasticsearch/blob/main/server/src/main/java/org/elasticsearch/telemetry/tracing/Traceable.java
+[APM Spans]:https://www.elastic.co/guide/en/observability/current/apm-data-model-spans.html
+
+Tasks are integrated with the ElasticSearch APM infrastructure. They implement the [Traceable] interface, and [spans][APM Spans] are published to represent the execution of each task.
+
# Cross Cluster Replication (CCR)
(Brief explanation of the use case for CCR)
diff --git a/docs/internal/Versioning.md b/docs/internal/Versioning.md
new file mode 100644
index 0000000000000..f0f730f618259
--- /dev/null
+++ b/docs/internal/Versioning.md
@@ -0,0 +1,297 @@
+Versioning Elasticsearch
+========================
+
+Elasticsearch is a complicated product, and is run in many different scenarios.
+A single version number is not sufficient to cover the whole of the product,
+instead we need different concepts to provide versioning capabilities
+for different aspects of Elasticsearch, depending on their scope, updatability,
+responsiveness, and maintenance.
+
+## Release version
+
+This is the version number used for published releases of Elasticsearch,
+and the Elastic stack. This takes the form _major.minor.patch_,
+with a corresponding version id.
+
+Uses of this version number should be avoided, as it does not apply to
+some scenarios, and use of release version will break Elasticsearch nodes.
+
+The release version is accessible in code through `Build.current().version()`,
+but it **should not** be assumed that this is a semantic version number,
+it could be any arbitrary string.
+
+## Transport protocol
+
+The transport protocol is used to send binary data between Elasticsearch nodes;
+`TransportVersion` is the version number used for this protocol.
+This version number is negotiated between each pair of nodes in the cluster
+on first connection, and is set as the lower of the highest transport version
+understood by each node.
+This version is then accessible through the `getTransportVersion` method
+on `StreamInput` and `StreamOutput`, so serialization code can read/write
+objects in a form that will be understood by the other node.
+
+Every change to the transport protocol is represented by a new transport version,
+higher than all previous transport versions, which then becomes the highest version
+recognized by that build of Elasticsearch. The version ids are stored
+as constants in the `TransportVersions` class.
+Each id has a standard pattern `M_NNN_SS_P`, where:
+* `M` is the major version
+* `NNN` is an incrementing id
+* `SS` is used in subsidiary repos amending the default transport protocol
+* `P` is used for patches and backports
+
+When you make a change to the serialization form of any object,
+you need to create a new sequential constant in `TransportVersions`,
+introduced in the same PR that adds the change, that increments
+the `NNN` component from the previous highest version,
+with other components set to zero.
+For example, if the previous version number is `8_413_00_1`,
+the next version number should be `8_414_00_0`.
+
+Once you have defined your constant, you then need to use it
+in serialization code. If the transport version is at or above the new id,
+the modified protocol should be used:
+
+ str = in.readString();
+ bool = in.readBoolean();
+ if (in.getTransportVersion().onOrAfter(TransportVersions.NEW_CONSTANT)) {
+ num = in.readVInt();
+ }
+
+If a transport version change needs to be reverted, a **new** version constant
+should be added representing the revert, and the version id checks
+adjusted appropriately to only use the modified protocol between the version id
+the change was added, and the new version id used for the revert (exclusive).
+The `between` method can be used for this.
+
+Once a transport change with a new version has been merged into main or a release branch,
+it **must not** be modified - this is so the meaning of that specific
+transport version does not change.
+
+_Elastic developers_ - please see corresponding documentation for Serverless
+on creating transport versions for Serverless changes.
+
+### Collapsing transport versions
+
+As each change adds a new constant, the list of constants in `TransportVersions`
+will keep growing. However, once there has been an official release of Elasticsearch,
+that includes that change, that specific transport version is no longer needed,
+apart from constants that happen to be used for release builds.
+As part of managing transport versions, consecutive transport versions can be
+periodically collapsed together into those that are only used for release builds.
+This task is normally performed by Core/Infra on a semi-regular basis,
+usually after each new minor release, to collapse the transport versions
+for the previous minor release. An example of such an operation can be found
+[here](https://github.com/elastic/elasticsearch/pull/104937).
+
+### Minimum compatibility versions
+
+The transport version used between two nodes is determined by the initial handshake
+(see `TransportHandshaker`, where the two nodes swap their highest known transport version).
+The lowest transport version that is compatible with the current node
+is determined by `TransportVersions.MINIMUM_COMPATIBLE`,
+and the node is prevented from joining the cluster if it is below that version.
+This constant should be updated manually on a major release.
+
+The minimum version that can be used for CCS is determined by
+`TransportVersions.MINIMUM_CCS_VERSION`, but this is not actively checked
+before queries are performed. Only if a query cannot be serialized at that
+version is an action rejected. This constant is updated automatically
+as part of performing a release.
+
+### Mapping to release versions
+
+For releases that do use a version number, it can be confusing to encounter
+a log or exception message that references an arbitrary transport version,
+where you don't know which release version that corresponds to. This is where
+the `.toReleaseVersion()` method comes in. It uses metadata stored in a csv file
+(`TransportVersions.csv`) to map from the transport version id to the corresponding
+release version. For any transport versions it encounters without a direct map,
+it performs a best guess based on the information it has. The csv file
+is updated automatically as part of performing a release.
+
+In releases that do not have a release version number, that method becomes
+a no-op.
+
+### Managing patches and backports
+
+Backporting transport version changes to previous releases
+should only be done if absolutely necessary, as it is very easy to get wrong
+and break the release in a way that is very hard to recover from.
+
+If we consider the version number as an incrementing line, what we are doing is
+grafting a change that takes effect at a certain point in the line,
+to additionally take effect in a fixed window earlier in the line.
+
+To take an example, using indicative version numbers, when the latest
+transport version is 52, we decide we need to backport a change done in
+transport version 50 to transport version 45. We use the `P` version id component
+to create version 45.1 with the backported change.
+This change will apply for version ids 45.1 to 45.9 (should they exist in the future).
+
+The serialization code in the backport needs to use the backported protocol
+for all version numbers 45.1 to 45.9. The `TransportVersion.isPatchFrom` method
+can be used to easily determine if this is the case: `streamVersion.isPatchFrom(45.1)`.
+However, the `onOrAfter` also does what is needed on patch branches.
+
+The serialization code in version 53 then needs to additionally check
+version numbers 45.1-45.9 to use the backported protocol, also using the `isPatchFrom` method.
+
+As an example, [this transport change](https://github.com/elastic/elasticsearch/pull/107862)
+was backported from 8.15 to [8.14.0](https://github.com/elastic/elasticsearch/pull/108251)
+and [8.13.4](https://github.com/elastic/elasticsearch/pull/108250) at the same time
+(8.14 was a build candidate at the time).
+
+The 8.13 PR has:
+
+ if (transportVersion.onOrAfter(8.13_backport_id))
+
+The 8.14 PR has:
+
+ if (transportVersion.isPatchFrom(8.13_backport_id)
+ || transportVersion.onOrAfter(8.14_backport_id))
+
+The 8.15 PR has:
+
+ if (transportVersion.isPatchFrom(8.13_backport_id)
+ || transportVersion.isPatchFrom(8.14_backport_id)
+ || transportVersion.onOrAfter(8.15_transport_id))
+
+In particular, if you are backporting a change to a patch release,
+you also need to make sure that any subsequent released version on any branch
+also has that change, and knows about the patch backport ids and what they mean.
+
+## Index version
+
+Index version is a single incrementing version number for the index data format,
+metadata, and associated mappings. It is declared the same way as the
+transport version - with the pattern `M_NNN_SS_P`, for the major version, version id,
+subsidiary version id, and patch number respectively.
+
+Index version is stored in index metadata when an index is created,
+and it is used to determine the storage format and what functionality that index supports.
+The index version does not change once an index is created.
+
+In the same way as transport versions, when a change is needed to the index
+data format or metadata, or new mapping types are added, create a new version constant
+below the last one, incrementing the `NNN` version component.
+
+Unlike transport version, version constants cannot be collapsed together,
+as an index keeps its creation version id once it is created.
+Fortunately, new index versions are only created once a month or so,
+so we don’t have a large list of index versions that need managing.
+
+Similar to transport version, index version has a `toReleaseVersion` to map
+onto release versions, in appropriate situations.
+
+## Cluster Features
+
+Cluster features are identifiers, published by a node in cluster state,
+indicating they support a particular top-level operation or set of functionality.
+They are used for internal checks within Elasticsearch, and for gating tests
+on certain functionality. For example, to check all nodes have upgraded
+to a certain point before running a large migration operation to a new data format.
+Cluster features should not be referenced by anything outside the Elasticsearch codebase.
+
+Cluster features are indicative of top-level functionality introduced to
+Elasticsearch - e.g. a new transport endpoint, or new operations.
+
+It is also used to check nodes can join a cluster - once all nodes in a cluster
+support a particular feature, no nodes can then join the cluster that do not
+support that feature. This is to ensure that once a feature is supported
+by a cluster, it will then always be supported in the future.
+
+To declare a new cluster feature, add an implementation of the `FeatureSpecification` SPI,
+suitably registered (or use an existing one for your code area), and add the feature
+as a constant to be returned by getFeatures. To then check whether all nodes
+in the cluster support that feature, use the method `clusterHasFeature` on `FeatureService`.
+It is only possible to check whether all nodes in the cluster have a feature;
+individual node checks should not be done.
+
+Once a cluster feature is declared and deployed, it cannot be modified or removed,
+else new nodes will not be able to join existing clusters.
+If functionality represented by a cluster feature needs to be removed,
+a new cluster feature should be added indicating that functionality is no longer
+supported, and the code modified accordingly (bearing in mind additional BwC constraints).
+
+The cluster features infrastructure is only designed to support a few hundred features
+per major release, and once features are added to a cluster they can not be removed.
+Cluster features should therefore be used sparingly.
+Adding too many cluster features risks increasing cluster instability.
+
+When we release a new major version N, we limit our backwards compatibility
+to the highest minor of the previous major N-1. Therefore, any cluster formed
+with the new major version is guaranteed to have all features introduced during
+releases of major N-1. All such features can be deemed to be met by the cluster,
+and the features themselves can be removed from cluster state over time,
+and the feature checks removed from the code of major version N.
+
+### Testing
+
+Tests often want to check if a certain feature is implemented / available on all nodes,
+particularly BwC or mixed cluster test.
+
+Rather than introducing a production feature just for a test condition,
+this can be done by adding a _test feature_ in an implementation of
+`FeatureSpecification.getTestFeatures`. These features will only be set
+on clusters running as part of an integration test. Even so, cluster features
+should be used sparingly if possible; Capabilities is generally a better
+option for test conditions.
+
+In Java Rest tests, checking cluster features can be done using
+`ESRestTestCase.clusterHasFeature(feature)`
+
+In YAML Rest tests, conditions can be defined in the `requires` or `skip` sections
+that use cluster features; see [here](https://github.com/elastic/elasticsearch/blob/main/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/README.asciidoc#skipping-tests) for more information.
+
+To aid with backwards compatibility tests, the test framework adds synthetic features
+for each previously released Elasticsearch version, of the form `gte_v{VERSION}`
+(for example `gte_v8.14.2`).
+This can be used to add conditions based on previous releases. It _cannot_ be used
+to check the current snapshot version; real features or capabilities should be
+used instead.
+
+## Capabilities
+
+The Capabilities API is a REST API for external clients to check the capabilities
+of an Elasticsearch cluster. As it is dynamically calculated for every query,
+it is not limited in size or usage.
+
+A capabilities query can be used to query for 3 things:
+* Is this endpoint supported for this HTTP method?
+* Are these parameters of this endpoint supported?
+* Are these capabilities (arbitrary string ids) of this endpoint supported?
+
+The API will return with a simple true/false, indicating if all specified aspects
+of the endpoint are supported by all nodes in the cluster.
+If any aspect is not supported by any one node, the API returns `false`.
+
+The API can also return `supported: null` (indicating unknown)
+if there was a problem communicating with one or more nodes in the cluster.
+
+All registered endpoints automatically work with the endpoint existence check.
+To add support for parameter and feature capability queries to your REST endpoint,
+implement the `supportedQueryParameters` and `supportedCapabilities` methods in your rest handler.
+
+To perform a capability query, perform a REST call to the `_capabilities` API,
+with parameters `method`, `path`, `parameters`, `capabilities`.
+The call will query every node in the cluster, and return `{supported: true}`
+if all nodes support that specific combination of method, path, query parameters,
+and endpoint capabilities. If any single aspect is not supported,
+the query will return `{supported: false}`. If there are any problems
+communicating with nodes in the cluster, the response will be `{supported: null}`
+indicating support or lack thereof cannot currently be determined.
+Capabilities can be checked using the clusterHasCapability method in ESRestTestCase.
+
+Similar to cluster features, YAML tests can have skip and requires conditions
+specified with capabilities like the following:
+
+ - requires:
+ capabilities:
+ - method: GET
+ path: /_endpoint
+ parameters: [param1, param2]
+ capabilities: [cap1, cap2]
+
+method: GET is the default, and does not need to be explicitly specified.
diff --git a/docs/plugins/analysis-icu.asciidoc b/docs/plugins/analysis-icu.asciidoc
index f6ca6ceae7ea4..da7efd2843f50 100644
--- a/docs/plugins/analysis-icu.asciidoc
+++ b/docs/plugins/analysis-icu.asciidoc
@@ -380,7 +380,7 @@ GET /my-index-000001/_search <3>
--------------------------
-<1> The `name` field uses the `standard` analyzer, and so support full text queries.
+<1> The `name` field uses the `standard` analyzer, and so supports full text queries.
<2> The `name.sort` field is an `icu_collation_keyword` field that will preserve the name as
a single token doc values, and applies the German ``phonebook'' order.
<3> An example query which searches the `name` field and sorts on the `name.sort` field.
@@ -467,7 +467,7 @@ differences.
`case_first`::
Possible values: `lower` or `upper`. Useful to control which case is sorted
-first when case is not ignored for strength `tertiary`. The default depends on
+first when the case is not ignored for strength `tertiary`. The default depends on
the collation.
`numeric`::
diff --git a/docs/plugins/analysis-kuromoji.asciidoc b/docs/plugins/analysis-kuromoji.asciidoc
index b1d1d5a751057..0a167bf3f0240 100644
--- a/docs/plugins/analysis-kuromoji.asciidoc
+++ b/docs/plugins/analysis-kuromoji.asciidoc
@@ -86,7 +86,7 @@ The `kuromoji_iteration_mark` normalizes Japanese horizontal iteration marks
`normalize_kanji`::
- Indicates whether kanji iteration marks should be normalize. Defaults to `true`.
+ Indicates whether kanji iteration marks should be normalized. Defaults to `true`.
`normalize_kana`::
@@ -133,6 +133,11 @@ unknown words. It can be set to:
Whether punctuation should be discarded from the output. Defaults to `true`.
+`lenient`::
+
+ Whether the `user_dictionary` should be deduplicated on the provided `text`.
+ False by default causing duplicates to generate an error.
+
`user_dictionary`::
+
--
@@ -189,7 +194,7 @@ PUT kuromoji_sample
+
--
Additional expert user parameters `nbest_cost` and `nbest_examples` can be used
-to include additional tokens that most likely according to the statistical model.
+to include additional tokens that are most likely according to the statistical model.
If both parameters are used, the largest number of both is applied.
`nbest_cost`::
@@ -221,7 +226,8 @@ PUT kuromoji_sample
"type": "kuromoji_tokenizer",
"mode": "extended",
"discard_punctuation": "false",
- "user_dictionary": "userdict_ja.txt"
+ "user_dictionary": "userdict_ja.txt",
+ "lenient": "true"
}
},
"analyzer": {
diff --git a/docs/plugins/analysis-nori.asciidoc b/docs/plugins/analysis-nori.asciidoc
index 1a3153fa3bea5..0d3e76f71d238 100644
--- a/docs/plugins/analysis-nori.asciidoc
+++ b/docs/plugins/analysis-nori.asciidoc
@@ -58,6 +58,11 @@ It can be set to:
Whether punctuation should be discarded from the output. Defaults to `true`.
+`lenient`::
+
+ Whether the `user_dictionary` should be deduplicated on the provided `text`.
+ False by default causing duplicates to generate an error.
+
`user_dictionary`::
+
--
@@ -104,7 +109,8 @@ PUT nori_sample
"type": "nori_tokenizer",
"decompound_mode": "mixed",
"discard_punctuation": "false",
- "user_dictionary": "userdict_ko.txt"
+ "user_dictionary": "userdict_ko.txt",
+ "lenient": "true"
}
},
"analyzer": {
@@ -238,11 +244,11 @@ Which responds with:
"end_offset": 3,
"type": "word",
"position": 1,
- "leftPOS": "J(Ending Particle)",
+ "leftPOS": "JKS(Subject case marker)",
"morphemes": null,
"posType": "MORPHEME",
"reading": null,
- "rightPOS": "J(Ending Particle)"
+ "rightPOS": "JKS(Subject case marker)"
},
{
"token": "깊",
@@ -262,11 +268,11 @@ Which responds with:
"end_offset": 6,
"type": "word",
"position": 3,
- "leftPOS": "E(Verbal endings)",
+ "leftPOS": "ETM(Adnominal form transformative ending)",
"morphemes": null,
"posType": "MORPHEME",
"reading": null,
- "rightPOS": "E(Verbal endings)"
+ "rightPOS": "ETM(Adnominal form transformative ending)"
},
{
"token": "나무",
@@ -286,11 +292,11 @@ Which responds with:
"end_offset": 10,
"type": "word",
"position": 5,
- "leftPOS": "J(Ending Particle)",
+ "leftPOS": "JX(Auxiliary postpositional particle)",
"morphemes": null,
"posType": "MORPHEME",
"reading": null,
- "rightPOS": "J(Ending Particle)"
+ "rightPOS": "JX(Auxiliary postpositional particle)"
}
]
},
@@ -299,7 +305,6 @@ Which responds with:
}
--------------------------------------------------
-
[[analysis-nori-speech]]
==== `nori_part_of_speech` token filter
@@ -447,7 +452,7 @@ Which responds with:
The `nori_number` token filter normalizes Korean numbers
to regular Arabic decimal numbers in half-width characters.
-Korean numbers are often written using a combination of Hangul and Arabic numbers with various kinds punctuation.
+Korean numbers are often written using a combination of Hangul and Arabic numbers with various kinds of punctuation.
For example, 3.2천 means 3200.
This filter does this kind of normalization and allows a search for 3200 to match 3.2천 in text,
but can also be used to make range facets based on the normalized numbers and so on.
diff --git a/docs/plugins/development/creating-classic-plugins.asciidoc b/docs/plugins/development/creating-classic-plugins.asciidoc
index cc03ad51275fa..58dc00e496c2d 100644
--- a/docs/plugins/development/creating-classic-plugins.asciidoc
+++ b/docs/plugins/development/creating-classic-plugins.asciidoc
@@ -18,7 +18,7 @@ will refuse to start in the presence of plugins with the incorrect
[discrete]
==== Classic plugin file structure
-Classis plugins are ZIP files composed of JAR files and
+Classic plugins are ZIP files composed of JAR files and
<>, a Java properties file that describes the
plugin.
diff --git a/docs/plugins/development/creating-stable-plugins.asciidoc b/docs/plugins/development/creating-stable-plugins.asciidoc
index c9a8a1f6c7e2a..9f98774b5a761 100644
--- a/docs/plugins/development/creating-stable-plugins.asciidoc
+++ b/docs/plugins/development/creating-stable-plugins.asciidoc
@@ -1,8 +1,8 @@
[[creating-stable-plugins]]
=== Creating text analysis plugins with the stable plugin API
-Text analysis plugins provide {es} with custom {ref}/analysis.html[Lucene
-analyzers, token filters, character filters, and tokenizers].
+Text analysis plugins provide {es} with custom {ref}/analysis.html[Lucene
+analyzers, token filters, character filters, and tokenizers].
[discrete]
==== The stable plugin API
@@ -10,7 +10,7 @@ analyzers, token filters, character filters, and tokenizers].
Text analysis plugins can be developed against the stable plugin API. This API
consists of the following dependencies:
-* `plugin-api` - an API used by plugin developers to implement custom {es}
+* `plugin-api` - an API used by plugin developers to implement custom {es}
plugins.
* `plugin-analysis-api` - an API used by plugin developers to implement analysis
plugins and integrate them into {es}.
@@ -18,7 +18,7 @@ plugins and integrate them into {es}.
core Lucene analysis interfaces like `Tokenizer`, `Analyzer`, and `TokenStream`.
For new versions of {es} within the same major version, plugins built against
-this API do not need to be recompiled. Future versions of the API will be
+this API does not need to be recompiled. Future versions of the API will be
backwards compatible and plugins are binary compatible with future versions of
{es}. In other words, once you have a working artifact, you can re-use it when
you upgrade {es} to a new bugfix or minor version.
@@ -48,9 +48,9 @@ require code changes.
Stable plugins are ZIP files composed of JAR files and two metadata files:
-* `stable-plugin-descriptor.properties` - a Java properties file that describes
+* `stable-plugin-descriptor.properties` - a Java properties file that describes
the plugin. Refer to <>.
-* `named_components.json` - a JSON file mapping interfaces to key-value pairs
+* `named_components.json` - a JSON file mapping interfaces to key-value pairs
of component names and implementation classes.
Note that only JAR files at the root of the plugin are added to the classpath
@@ -65,7 +65,7 @@ you use this plugin. However, you don't need Gradle to create plugins.
The {es} Github repository contains
{es-repo}tree/main/plugins/examples/stable-analysis[an example analysis plugin].
-The example `build.gradle` build script provides a good starting point for
+The example `build.gradle` build script provides a good starting point for
developing your own plugin.
[discrete]
@@ -77,29 +77,29 @@ Plugins are written in Java, so you need to install a Java Development Kit
[discrete]
===== Step by step
-. Create a directory for your project.
+. Create a directory for your project.
. Copy the example `build.gradle` build script to your project directory. Note
that this build script uses the `elasticsearch.stable-esplugin` gradle plugin to
build your plugin.
. Edit the `build.gradle` build script:
-** Add a definition for the `pluginApiVersion` and matching `luceneVersion`
-variables to the top of the file. You can find these versions in the
-`build-tools-internal/version.properties` file in the {es-repo}[Elasticsearch
+** Add a definition for the `pluginApiVersion` and matching `luceneVersion`
+variables to the top of the file. You can find these versions in the
+`build-tools-internal/version.properties` file in the {es-repo}[Elasticsearch
Github repository].
-** Edit the `name` and `description` in the `esplugin` section of the build
-script. This will create the plugin descriptor file. If you're not using the
-`elasticsearch.stable-esplugin` gradle plugin, refer to
+** Edit the `name` and `description` in the `esplugin` section of the build
+script. This will create the plugin descriptor file. If you're not using the
+`elasticsearch.stable-esplugin` gradle plugin, refer to
<> to create the file manually.
** Add module information.
-** Ensure you have declared the following compile-time dependencies. These
-dependencies are compile-time only because {es} will provide these libraries at
+** Ensure you have declared the following compile-time dependencies. These
+dependencies are compile-time only because {es} will provide these libraries at
runtime.
*** `org.elasticsearch.plugin:elasticsearch-plugin-api`
*** `org.elasticsearch.plugin:elasticsearch-plugin-analysis-api`
*** `org.apache.lucene:lucene-analysis-common`
-** For unit testing, ensure these dependencies have also been added to the
+** For unit testing, ensure these dependencies have also been added to the
`build.gradle` script as `testImplementation` dependencies.
-. Implement an interface from the analysis plugin API, annotating it with
+. Implement an interface from the analysis plugin API, annotating it with
`NamedComponent`. Refer to <> for an example.
. You should now be able to assemble a plugin ZIP file by running:
+
@@ -107,22 +107,22 @@ runtime.
----
gradle bundlePlugin
----
-The resulting plugin ZIP file is written to the `build/distributions`
+The resulting plugin ZIP file is written to the `build/distributions`
directory.
[discrete]
===== YAML REST tests
-The Gradle `elasticsearch.yaml-rest-test` plugin enables testing of your
-plugin using the {es-repo}blob/main/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/README.asciidoc[{es} yamlRestTest framework].
+The Gradle `elasticsearch.yaml-rest-test` plugin enables testing of your
+plugin using the {es-repo}blob/main/rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/README.asciidoc[{es} yamlRestTest framework].
These tests use a YAML-formatted domain language to issue REST requests against
-an internal {es} cluster that has your plugin installed, and to check the
-results of those requests. The structure of a YAML REST test directory is as
+an internal {es} cluster that has your plugin installed, and to check the
+results of those requests. The structure of a YAML REST test directory is as
follows:
-* A test suite class, defined under `src/yamlRestTest/java`. This class should
+* A test suite class, defined under `src/yamlRestTest/java`. This class should
extend `ESClientYamlSuiteTestCase`.
-* The YAML tests themselves should be defined under
+* The YAML tests themselves should be defined under
`src/yamlRestTest/resources/test/`.
[[plugin-descriptor-file-stable]]
diff --git a/docs/plugins/discovery-azure-classic.asciidoc b/docs/plugins/discovery-azure-classic.asciidoc
index aa710a2fe7ef9..b8d37f024172c 100644
--- a/docs/plugins/discovery-azure-classic.asciidoc
+++ b/docs/plugins/discovery-azure-classic.asciidoc
@@ -148,7 +148,7 @@ Before starting, you need to have:
--
You should follow http://azure.microsoft.com/en-us/documentation/articles/linux-use-ssh-key/[this guide] to learn
-how to create or use existing SSH keys. If you have already did it, you can skip the following.
+how to create or use existing SSH keys. If you have already done it, you can skip the following.
Here is a description on how to generate SSH keys using `openssl`:
diff --git a/docs/plugins/discovery-gce.asciidoc b/docs/plugins/discovery-gce.asciidoc
index 2e8cff21208e0..0a2629b7f094b 100644
--- a/docs/plugins/discovery-gce.asciidoc
+++ b/docs/plugins/discovery-gce.asciidoc
@@ -478,7 +478,7 @@ discovery:
seed_providers: gce
--------------------------------------------------
-Replaces `project_id` and `zone` with your settings.
+Replace `project_id` and `zone` with your settings.
To run test:
diff --git a/docs/plugins/install_remove.asciidoc b/docs/plugins/install_remove.asciidoc
index c9d163fb30ef2..893af4dac42ff 100644
--- a/docs/plugins/install_remove.asciidoc
+++ b/docs/plugins/install_remove.asciidoc
@@ -4,7 +4,7 @@
ifeval::["{release-state}"=="unreleased"]
-WARNING: Version {version} of the Elastic Stack has not yet been released.
+WARNING: Version {version} of the Elastic Stack has not yet been released. The plugin might not be available.
endif::[]
diff --git a/docs/plugins/integrations.asciidoc b/docs/plugins/integrations.asciidoc
index 71f237692ad35..aff4aed0becd2 100644
--- a/docs/plugins/integrations.asciidoc
+++ b/docs/plugins/integrations.asciidoc
@@ -91,7 +91,7 @@ Integrations are not plugins, but are external tools or modules that make it eas
Elasticsearch Grails plugin.
* https://hibernate.org/search/[Hibernate Search]
- Integration with Hibernate ORM, from the Hibernate team. Automatic synchronization of write operations, yet exposes full Elasticsearch capabilities for queries. Can return either Elasticsearch native or re-map queries back into managed entities loaded within transaction from the reference database.
+ Integration with Hibernate ORM, from the Hibernate team. Automatic synchronization of write operations, yet exposes full Elasticsearch capabilities for queries. Can return either Elasticsearch native or re-map queries back into managed entities loaded within transactions from the reference database.
* https://github.com/spring-projects/spring-data-elasticsearch[Spring Data Elasticsearch]:
Spring Data implementation for Elasticsearch
@@ -104,7 +104,7 @@ Integrations are not plugins, but are external tools or modules that make it eas
* https://pulsar.apache.org/docs/en/io-elasticsearch[Apache Pulsar]:
The Elasticsearch Sink Connector is used to pull messages from Pulsar topics
- and persist the messages to a index.
+ and persist the messages to an index.
* https://micronaut-projects.github.io/micronaut-elasticsearch/latest/guide/index.html[Micronaut Elasticsearch Integration]:
Integration of Micronaut with Elasticsearch
diff --git a/docs/plugins/mapper-annotated-text.asciidoc b/docs/plugins/mapper-annotated-text.asciidoc
index afe8ba41da9b8..956b6bedffff1 100644
--- a/docs/plugins/mapper-annotated-text.asciidoc
+++ b/docs/plugins/mapper-annotated-text.asciidoc
@@ -143,7 +143,7 @@ broader positional queries e.g. finding mentions of a `Guitarist` near to `strat
WARNING: Any use of `=` signs in annotation values eg `[Prince](person=Prince)` will
cause the document to be rejected with a parse failure. In future we hope to have a use for
-the equals signs so wil actively reject documents that contain this today.
+the equals signs so will actively reject documents that contain this today.
[[annotated-text-synthetic-source]]
===== Synthetic `_source`
@@ -155,11 +155,6 @@ be changed or removed in a future release. Elastic will work to fix
any issues, but features in technical preview are not subject to the support SLA
of official GA features.
-`annotated_text` fields support {ref}/mapping-source-field.html#synthetic-source[synthetic `_source`] if they have
-a {ref}/keyword.html#keyword-synthetic-source[`keyword`] sub-field that supports synthetic
-`_source` or if the `annotated_text` field sets `store` to `true`. Either way, it may
-not have {ref}/copy-to.html[`copy_to`].
-
If using a sub-`keyword` field then the values are sorted in the same way as
a `keyword` field's values are sorted. By default, that means sorted with
duplicates removed. So:
@@ -167,8 +162,16 @@ duplicates removed. So:
----
PUT idx
{
+ "settings": {
+ "index": {
+ "mapping": {
+ "source": {
+ "mode": "synthetic"
+ }
+ }
+ }
+ },
"mappings": {
- "_source": { "mode": "synthetic" },
"properties": {
"text": {
"type": "annotated_text",
@@ -215,8 +218,16 @@ are preserved.
----
PUT idx
{
+ "settings": {
+ "index": {
+ "mapping": {
+ "source": {
+ "mode": "synthetic"
+ }
+ }
+ }
+ },
"mappings": {
- "_source": { "mode": "synthetic" },
"properties": {
"text": { "type": "annotated_text", "store": true }
}
diff --git a/docs/plugins/store-smb.asciidoc b/docs/plugins/store-smb.asciidoc
index 8557ef868010f..da803b4f42022 100644
--- a/docs/plugins/store-smb.asciidoc
+++ b/docs/plugins/store-smb.asciidoc
@@ -10,7 +10,7 @@ include::install_remove.asciidoc[]
==== Working around a bug in Windows SMB and Java on windows
When using a shared file system based on the SMB protocol (like Azure File Service) to store indices, the way Lucene
-open index segment files is with a write only flag. This is the _correct_ way to open the files, as they will only be
+opens index segment files is with a write only flag. This is the _correct_ way to open the files, as they will only be
used for writes and allows different FS implementations to optimize for it. Sadly, in windows with SMB, this disables
the cache manager, causing writes to be slow. This has been described in
https://issues.apache.org/jira/browse/LUCENE-6176[LUCENE-6176], but it affects each and every Java program out there!.
@@ -44,7 +44,7 @@ This can be configured for all indices by adding this to the `elasticsearch.yml`
index.store.type: smb_nio_fs
----
-Note that setting will be applied for newly created indices.
+Note that settings will be applied for newly created indices.
It can also be set on a per-index basis at index creation time:
diff --git a/docs/reference/aggregations/bucket/histogram-aggregation.asciidoc b/docs/reference/aggregations/bucket/histogram-aggregation.asciidoc
index 12f7cbb310d74..c2ae23dccb7dc 100644
--- a/docs/reference/aggregations/bucket/histogram-aggregation.asciidoc
+++ b/docs/reference/aggregations/bucket/histogram-aggregation.asciidoc
@@ -165,7 +165,7 @@ Example:
POST /sales/_search?size=0
{
"query": {
- "constant_score": { "filter": { "range": { "price": { "to": "500" } } } }
+ "constant_score": { "filter": { "range": { "price": { "lte": "500" } } } }
},
"aggs": {
"prices": {
@@ -202,7 +202,7 @@ Example:
POST /sales/_search?size=0
{
"query": {
- "constant_score": { "filter": { "range": { "price": { "to": "500" } } } }
+ "constant_score": { "filter": { "range": { "price": { "lte": "500" } } } }
},
"aggs": {
"prices": {
diff --git a/docs/reference/analysis/analyzers/lang-analyzer.asciidoc b/docs/reference/analysis/analyzers/lang-analyzer.asciidoc
index 5273537389e3d..881970787f5a6 100644
--- a/docs/reference/analysis/analyzers/lang-analyzer.asciidoc
+++ b/docs/reference/analysis/analyzers/lang-analyzer.asciidoc
@@ -1430,7 +1430,8 @@ PUT /persian_example
"decimal_digit",
"arabic_normalization",
"persian_normalization",
- "persian_stop"
+ "persian_stop",
+ "persian_stem"
]
}
}
diff --git a/docs/reference/analysis/tokenfilters/snowball-tokenfilter.asciidoc b/docs/reference/analysis/tokenfilters/snowball-tokenfilter.asciidoc
index 57e402988cc5a..d8300288c9f4b 100644
--- a/docs/reference/analysis/tokenfilters/snowball-tokenfilter.asciidoc
+++ b/docs/reference/analysis/tokenfilters/snowball-tokenfilter.asciidoc
@@ -11,6 +11,8 @@ values: `Arabic`, `Armenian`, `Basque`, `Catalan`, `Danish`, `Dutch`, `English`,
`Lithuanian`, `Lovins`, `Norwegian`, `Porter`, `Portuguese`, `Romanian`,
`Russian`, `Serbian`, `Spanish`, `Swedish`, `Turkish`.
+deprecated:[8.16.0, `Kp` and `Lovins` support will be removed in a future version]
+
For example:
[source,console]
@@ -28,7 +30,7 @@ PUT /my-index-000001
"filter": {
"my_snow": {
"type": "snowball",
- "language": "Lovins"
+ "language": "English"
}
}
}
diff --git a/docs/reference/analysis/tokenfilters/stemmer-tokenfilter.asciidoc b/docs/reference/analysis/tokenfilters/stemmer-tokenfilter.asciidoc
index 42ac594fca3bf..d9e2120afe6d1 100644
--- a/docs/reference/analysis/tokenfilters/stemmer-tokenfilter.asciidoc
+++ b/docs/reference/analysis/tokenfilters/stemmer-tokenfilter.asciidoc
@@ -144,12 +144,12 @@ https://snowballstem.org/algorithms/danish/stemmer.html[*`danish`*]
Dutch::
https://snowballstem.org/algorithms/dutch/stemmer.html[*`dutch`*],
-https://snowballstem.org/algorithms/kraaij_pohlmann/stemmer.html[`dutch_kp`]
+https://snowballstem.org/algorithms/kraaij_pohlmann/stemmer.html[`dutch_kp`] deprecated:[8.16.0, `dutch_kp` will be removed in a future version]
English::
https://snowballstem.org/algorithms/porter/stemmer.html[*`english`*],
https://ciir.cs.umass.edu/pubfiles/ir-35.pdf[`light_english`],
-https://snowballstem.org/algorithms/lovins/stemmer.html[`lovins`],
+https://snowballstem.org/algorithms/lovins/stemmer.html[`lovins`] deprecated:[8.16.0, `lovins` will be removed in a future version],
https://www.researchgate.net/publication/220433848_How_effective_is_suffixing[`minimal_english`],
https://snowballstem.org/algorithms/english/stemmer.html[`porter2`],
{lucene-analysis-docs}/en/EnglishPossessiveFilter.html[`possessive_english`]
@@ -173,7 +173,6 @@ http://bvg.udc.es/recursos_lingua/stemming.jsp[`minimal_galician`] (Plural step
German::
https://dl.acm.org/citation.cfm?id=1141523[*`light_german`*],
https://snowballstem.org/algorithms/german/stemmer.html[`german`],
-https://snowballstem.org/algorithms/german2/stemmer.html[`german2`],
http://members.unine.ch/jacques.savoy/clef/morpho.pdf[`minimal_german`]
Greek::
diff --git a/docs/reference/analysis/tokenizers/pathhierarchy-tokenizer.asciidoc b/docs/reference/analysis/tokenizers/pathhierarchy-tokenizer.asciidoc
index 2cf01b77d57ab..5f98807387280 100644
--- a/docs/reference/analysis/tokenizers/pathhierarchy-tokenizer.asciidoc
+++ b/docs/reference/analysis/tokenizers/pathhierarchy-tokenizer.asciidoc
@@ -40,14 +40,14 @@ POST _analyze
"start_offset": 0,
"end_offset": 8,
"type": "word",
- "position": 0
+ "position": 1
},
{
"token": "/one/two/three",
"start_offset": 0,
"end_offset": 14,
"type": "word",
- "position": 0
+ "position": 2
}
]
}
@@ -144,14 +144,14 @@ POST my-index-000001/_analyze
"start_offset": 7,
"end_offset": 18,
"type": "word",
- "position": 0
+ "position": 1
},
{
"token": "/three/four/five",
"start_offset": 7,
"end_offset": 23,
"type": "word",
- "position": 0
+ "position": 2
}
]
}
@@ -178,14 +178,14 @@ If we were to set `reverse` to `true`, it would produce the following:
[[analysis-pathhierarchy-tokenizer-detailed-examples]]
=== Detailed examples
-A common use-case for the `path_hierarchy` tokenizer is filtering results by
-file paths. If indexing a file path along with the data, the use of the
-`path_hierarchy` tokenizer to analyze the path allows filtering the results
+A common use-case for the `path_hierarchy` tokenizer is filtering results by
+file paths. If indexing a file path along with the data, the use of the
+`path_hierarchy` tokenizer to analyze the path allows filtering the results
by different parts of the file path string.
This example configures an index to have two custom analyzers and applies
-those analyzers to multifields of the `file_path` text field that will
+those analyzers to multifields of the `file_path` text field that will
store filenames. One of the two analyzers uses reverse tokenization.
Some sample documents are then indexed to represent some file paths
for photos inside photo folders of two different users.
@@ -264,8 +264,8 @@ POST file-path-test/_doc/5
--------------------------------------------------
-A search for a particular file path string against the text field matches all
-the example documents, with Bob's documents ranking highest due to `bob` also
+A search for a particular file path string against the text field matches all
+the example documents, with Bob's documents ranking highest due to `bob` also
being one of the terms created by the standard analyzer boosting relevance for
Bob's documents.
@@ -301,7 +301,7 @@ GET file-path-test/_search
With the reverse parameter for this tokenizer, it's also possible to match
from the other end of the file path, such as individual file names or a deep
level subdirectory. The following example shows a search for all files named
-`my_photo1.jpg` within any directory via the `file_path.tree_reversed` field
+`my_photo1.jpg` within any directory via the `file_path.tree_reversed` field
configured to use the reverse parameter in the mapping.
@@ -342,7 +342,7 @@ POST file-path-test/_analyze
It's also useful to be able to filter with file paths when combined with other
-types of searches, such as this example looking for any files paths with `16`
+types of searches, such as this example looking for any files paths with `16`
that also must be in Alice's photo directory.
[source,console]
diff --git a/docs/reference/cat/alias.asciidoc b/docs/reference/cat/alias.asciidoc
index b6459eaa93b82..72f949bf11e50 100644
--- a/docs/reference/cat/alias.asciidoc
+++ b/docs/reference/cat/alias.asciidoc
@@ -12,7 +12,7 @@ consumption, use the <>.
====
Retrieves the cluster's <>, including filter and routing
-information. The API does not return data stream aliases.
+information. The API does not return <> aliases.
[[cat-alias-api-request]]
==== {api-request-title}
diff --git a/docs/reference/cat/allocation.asciidoc b/docs/reference/cat/allocation.asciidoc
index 0891406d1be4b..bbd044c4b8e5e 100644
--- a/docs/reference/cat/allocation.asciidoc
+++ b/docs/reference/cat/allocation.asciidoc
@@ -7,10 +7,11 @@
[IMPORTANT]
====
cat APIs are only intended for human consumption using the command line or {kib}
-console. They are _not_ intended for use by applications.
+console. They are _not_ intended for use by applications. For application
+consumption, use the <>.
====
-Provides a snapshot of the number of shards allocated to each data node
+Provides a snapshot of the number of shards <> to each data node
and their disk space.
diff --git a/docs/reference/cat/anomaly-detectors.asciidoc b/docs/reference/cat/anomaly-detectors.asciidoc
index 3416c256881af..68d952d2a8532 100644
--- a/docs/reference/cat/anomaly-detectors.asciidoc
+++ b/docs/reference/cat/anomaly-detectors.asciidoc
@@ -13,7 +13,7 @@ consumption, use the
<>.
====
-Returns configuration and usage information about {anomaly-jobs}.
+Returns configuration and usage information about {ml-docs}/ml-ad-overview.html[{anomaly-jobs}].
[[cat-anomaly-detectors-request]]
==== {api-request-title}
diff --git a/docs/reference/cat/datafeeds.asciidoc b/docs/reference/cat/datafeeds.asciidoc
index 9b6481191e59d..506812fedabad 100644
--- a/docs/reference/cat/datafeeds.asciidoc
+++ b/docs/reference/cat/datafeeds.asciidoc
@@ -12,7 +12,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns configuration and usage information about {dfeeds}.
+Returns configuration and usage information about {ml-docs}/ml-ad-run-jobs.html#ml-ad-datafeeds[{dfeeds}].
[[cat-datafeeds-request]]
==== {api-request-title}
diff --git a/docs/reference/cat/dataframeanalytics.asciidoc b/docs/reference/cat/dataframeanalytics.asciidoc
index 4c236ecf61ffc..ed0f697c36d50 100644
--- a/docs/reference/cat/dataframeanalytics.asciidoc
+++ b/docs/reference/cat/dataframeanalytics.asciidoc
@@ -13,7 +13,7 @@ consumption, use the
<>.
====
-Returns configuration and usage information about {dfanalytics-jobs}.
+Returns configuration and usage information about {ml-docs}/ml-dfanalytics.html[{dfanalytics-jobs}].
[[cat-dfanalytics-request]]
diff --git a/docs/reference/cat/indices.asciidoc b/docs/reference/cat/indices.asciidoc
index 64b90c4f8e353..b8dda01c2eae0 100644
--- a/docs/reference/cat/indices.asciidoc
+++ b/docs/reference/cat/indices.asciidoc
@@ -6,13 +6,13 @@
[IMPORTANT]
====
-cat APIs are only intended for human consumption using the command line or {kib}
-console. They are _not_ intended for use by applications. For application
+cat APIs are only intended for human consumption using the command line or {kib}
+console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns high-level information about indices in a cluster, including backing
-indices for data streams.
+Returns high-level information about <> in a cluster, including backing
+indices for <>.
[[cat-indices-api-request]]
@@ -50,6 +50,10 @@ indexing and search. As a result, all document counts include hidden
To get an accurate count of {es} documents, use the <> or
<> APIs.
+Note that information such as document count, deleted document count and store size are not shown for
+indices restored from <> since these indices
+do not contain the relevant data structures to retrieve this information from.
+
[[cat-indices-api-path-params]]
==== {api-path-parms-title}
diff --git a/docs/reference/cat/master.asciidoc b/docs/reference/cat/master.asciidoc
index 42348fc4939df..bcf2b876e4506 100644
--- a/docs/reference/cat/master.asciidoc
+++ b/docs/reference/cat/master.asciidoc
@@ -11,7 +11,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns information about the master node, including the ID, bound IP address,
+Returns information about the <>, including the ID, bound IP address,
and name.
diff --git a/docs/reference/cat/nodeattrs.asciidoc b/docs/reference/cat/nodeattrs.asciidoc
index 2db0c3fc20279..ff37b430956aa 100644
--- a/docs/reference/cat/nodeattrs.asciidoc
+++ b/docs/reference/cat/nodeattrs.asciidoc
@@ -11,7 +11,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns information about custom node attributes.
+Returns information about <>.
[[cat-nodeattrs-api-request]]
==== {api-request-title}
diff --git a/docs/reference/cat/nodes.asciidoc b/docs/reference/cat/nodes.asciidoc
index fc5b01f9234e3..651c4ef3c7c2a 100644
--- a/docs/reference/cat/nodes.asciidoc
+++ b/docs/reference/cat/nodes.asciidoc
@@ -13,7 +13,7 @@ They are _not_ intended for use by applications.
For application consumption, use the <>.
====
-Returns information about a cluster's nodes.
+Returns information about a <>.
[[cat-nodes-api-request]]
==== {api-request-title}
@@ -50,16 +50,16 @@ Valid columns are:
(Default) IP address, such as `127.0.1.1`.
`heap.percent`, `hp`, `heapPercent`::
-(Default) Maximum configured heap, such as `7`.
+(Default) Used percentage of total allocated Elasticsearch JVM heap, such as `7`. This reflects only the {es} process running within the operating system and is the most direct indicator of its JVM/heap/memory resource performance.
`heap.max`, `hm`, `heapMax`::
-(Default) Total heap, such as `4gb`.
+Total heap, such as `4gb`.
`ram.percent`, `rp`, `ramPercent`::
-(Default) Used total memory percentage, such as `47`.
+(Default) Used percentage of total operating system's memory, such as `47`. This reflects all processes running on operating system instead of only {es} and is not guaranteed to correlate to its performance.
`file_desc.percent`, `fdp`, `fileDescriptorPercent`::
-(Default) Used file descriptors percentage, such as `1`.
+Used file descriptors percentage, such as `1`.
`node.role`, `r`, `role`, `nodeRole`::
(Default) Roles of the node.
@@ -138,16 +138,16 @@ Used file descriptors, such as `123`.
Maximum number of file descriptors, such as `1024`.
`cpu`::
-Recent system CPU usage as percent, such as `12`.
+(Default) Recent system CPU usage as percent, such as `12`.
`load_1m`, `l`::
-Most recent load average, such as `0.22`.
+(Default) Most recent load average, such as `0.22`.
`load_5m`, `l`::
-Load average for the last five minutes, such as `0.78`.
+(Default) Load average for the last five minutes, such as `0.78`.
`load_15m`, `l`::
-Load average for the last fifteen minutes, such as `1.24`.
+(Default) Load average for the last fifteen minutes, such as `1.24`.
`uptime`, `u`::
Node uptime, such as `17.3m`.
diff --git a/docs/reference/cat/pending_tasks.asciidoc b/docs/reference/cat/pending_tasks.asciidoc
index 5dd6cb0688145..f772cdb66d889 100644
--- a/docs/reference/cat/pending_tasks.asciidoc
+++ b/docs/reference/cat/pending_tasks.asciidoc
@@ -11,8 +11,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns cluster-level changes that have not yet been executed, similar to the
-<> API.
+Returns <> that have not yet been executed.
[[cat-pending-tasks-api-request]]
==== {api-request-title}
diff --git a/docs/reference/cat/plugins.asciidoc b/docs/reference/cat/plugins.asciidoc
index a812556887b74..ae360862a0edb 100644
--- a/docs/reference/cat/plugins.asciidoc
+++ b/docs/reference/cat/plugins.asciidoc
@@ -12,7 +12,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns a list of plugins running on each node of a cluster.
+Returns a list of <> running on each node of a cluster.
[[cat-plugins-api-request]]
diff --git a/docs/reference/cat/recovery.asciidoc b/docs/reference/cat/recovery.asciidoc
index c3292fc9971ee..7393a8b719089 100644
--- a/docs/reference/cat/recovery.asciidoc
+++ b/docs/reference/cat/recovery.asciidoc
@@ -11,10 +11,9 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns information about ongoing and completed shard recoveries,
-similar to the <> API.
+Returns information about ongoing and completed <>.
-For data streams, the API returns information about the stream's backing
+For <>, the API returns information about the stream's backing
indices.
[[cat-recovery-api-request]]
diff --git a/docs/reference/cat/segments.asciidoc b/docs/reference/cat/segments.asciidoc
index 872af679642d0..82dc7298a0783 100644
--- a/docs/reference/cat/segments.asciidoc
+++ b/docs/reference/cat/segments.asciidoc
@@ -12,10 +12,9 @@ consumption, use the <>.
====
Returns low-level information about the https://lucene.apache.org/core/[Lucene]
-segments in index shards, similar to the <>
-API.
+segments in index shards.
-For data streams, the API returns information about the stream's backing
+For <>, the API returns information about the stream's backing
indices.
[[cat-segments-api-request]]
diff --git a/docs/reference/cat/shards.asciidoc b/docs/reference/cat/shards.asciidoc
index a2f8541be4abc..812b946ab2c47 100644
--- a/docs/reference/cat/shards.asciidoc
+++ b/docs/reference/cat/shards.asciidoc
@@ -9,13 +9,16 @@
====
cat APIs are only intended for human consumption using the command line or {kib}
console.
-They are _not_ intended for use by applications.
+They are _not_ intended for use by applications. For application
+consumption, use the <>.
====
-The `shards` command is the detailed view of what nodes contain which shards.
-It will tell you if it's a primary or replica, the number of docs, the bytes it takes on disk, and the node where it's located.
+The `shards` command is the detailed view of all nodes' shard <>.
+It will tell you if the shard is a primary or replica, the number of docs, the
+bytes it takes on disk, the node where it's located, and if the shard is
+currently <>.
-For data streams, the API returns information about the stream's backing indices.
+For <>, the API returns information about the stream's backing indices.
[[cat-shards-api-request]]
==== {api-request-title}
diff --git a/docs/reference/cat/trainedmodel.asciidoc b/docs/reference/cat/trainedmodel.asciidoc
index 74e83525ddfe1..45c87038f5d64 100644
--- a/docs/reference/cat/trainedmodel.asciidoc
+++ b/docs/reference/cat/trainedmodel.asciidoc
@@ -12,7 +12,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns configuration and usage information about {infer} trained models.
+Returns configuration and usage information about {ml-docs}/ml-nlp-deploy-models.html[{infer} trained models].
[[cat-trained-model-request]]
diff --git a/docs/reference/cat/transforms.asciidoc b/docs/reference/cat/transforms.asciidoc
index 0d4e9b691ac5a..53f22f02fbdbf 100644
--- a/docs/reference/cat/transforms.asciidoc
+++ b/docs/reference/cat/transforms.asciidoc
@@ -12,7 +12,7 @@ console. They are _not_ intended for use by applications. For application
consumption, use the <>.
====
-Returns configuration and usage information about {transforms}.
+Returns configuration and usage information about <>.
[[cat-transforms-api-request]]
==== {api-request-title}
diff --git a/docs/reference/cluster/allocation-explain.asciidoc b/docs/reference/cluster/allocation-explain.asciidoc
index 7547dd74c5ecd..bbbea192f0f86 100644
--- a/docs/reference/cluster/allocation-explain.asciidoc
+++ b/docs/reference/cluster/allocation-explain.asciidoc
@@ -159,10 +159,11 @@ node.
<5> The decider which led to the `no` decision for the node.
<6> An explanation as to why the decider returned a `no` decision, with a helpful hint pointing to the setting that led to the decision. In this example, a newly created index has <> that requires that it only be allocated to a node named `nonexistent_node`, which does not exist, so the index is unable to allocate.
+[[maximum-number-of-retries-exceeded]]
====== Maximum number of retries exceeded
The following response contains an allocation explanation for an unassigned
-primary shard that has reached the maximum number of allocation retry attempts.
+primary shard that has reached the maximum number of allocation retry attempts.
[source,js]
----
@@ -195,7 +196,7 @@ primary shard that has reached the maximum number of allocation retry attempts.
{
"decider": "max_retry",
"decision" : "NO",
- "explanation": "shard has exceeded the maximum number of retries [5] on failed allocation attempts - manually call [/_cluster/reroute?retry_failed=true] to retry, [unassigned_info[[reason=ALLOCATION_FAILED], at[2024-07-30T21:04:12.166Z], failed_attempts[5], failed_nodes[[mEKjwwzLT1yJVb8UxT6anw]], delayed=false, details[failed shard on node [mEKjwwzLT1yJVb8UxT6anw]: failed recovery, failure RecoveryFailedException], allocation_status[deciders_no]]]"
+ "explanation": "shard has exceeded the maximum number of retries [5] on failed allocation attempts - manually call [POST /_cluster/reroute?retry_failed] to retry, [unassigned_info[[reason=ALLOCATION_FAILED], at[2024-07-30T21:04:12.166Z], failed_attempts[5], failed_nodes[[mEKjwwzLT1yJVb8UxT6anw]], delayed=false, details[failed shard on node [mEKjwwzLT1yJVb8UxT6anw]: failed recovery, failure RecoveryFailedException], allocation_status[deciders_no]]]"
}
]
}
@@ -203,10 +204,13 @@ primary shard that has reached the maximum number of allocation retry attempts.
}
----
// NOTCONSOLE
+When Elasticsearch is unable to allocate a shard, it will attempt to retry allocation up to
+the maximum number of retries allowed. After this, Elasticsearch will stop attempting to
+allocate the shard in order to prevent infinite retries which may impact cluster
+performance. Run the <> API to retry allocation, which
+will allocate the shard if the issue preventing allocation has been resolved.
-If decider message indicates a transient allocation issue, use
-<> to retry allocation.
-
+[[no-valid-shard-copy]]
====== No valid shard copy
The following response contains an allocation explanation for an unassigned
@@ -334,7 +338,7 @@ queued to allocate but currently waiting on other queued shards.
----
// NOTCONSOLE
-This is a transient message that might appear when a large amount of shards are allocating.
+This is a transient message that might appear when a large amount of shards are allocating.
===== Assigned shard
@@ -437,7 +441,7 @@ cluster balance.
===== No arguments
If you call the API with no arguments, {es} retrieves an allocation explanation
-for an arbitrary unassigned primary or replica shard, returning any unassigned primary shards first.
+for an arbitrary unassigned primary or replica shard, returning any unassigned primary shards first.
[source,console]
----
diff --git a/docs/reference/cluster/nodes-stats.asciidoc b/docs/reference/cluster/nodes-stats.asciidoc
index 61c58cea95b83..adf8229712ecc 100644
--- a/docs/reference/cluster/nodes-stats.asciidoc
+++ b/docs/reference/cluster/nodes-stats.asciidoc
@@ -1716,6 +1716,10 @@ See <> for more information about disk watermarks a
`io_stats` (Linux only)::
(objects) Contains I/O statistics for the node.
+
+NOTE: These statistics are derived from the `/proc/diskstats` kernel interface.
+This interface accounts for IO performed by all processes on the system, even
+if you are running {es} within a container.
+
.Properties of `io_stats`
[%collapsible%open]
diff --git a/docs/reference/cluster/reroute.asciidoc b/docs/reference/cluster/reroute.asciidoc
index b4e4809ae73b4..429070f80b9bf 100644
--- a/docs/reference/cluster/reroute.asciidoc
+++ b/docs/reference/cluster/reroute.asciidoc
@@ -10,7 +10,7 @@ Changes the allocation of shards in a cluster.
[[cluster-reroute-api-request]]
==== {api-request-title}
-`POST /_cluster/reroute?metric=none`
+`POST /_cluster/reroute`
[[cluster-reroute-api-prereqs]]
==== {api-prereq-title}
@@ -193,7 +193,7 @@ This is a short example of a simple reroute API call:
[source,console]
--------------------------------------------------
-POST /_cluster/reroute?metric=none
+POST /_cluster/reroute
{
"commands": [
{
diff --git a/docs/reference/cluster/stats.asciidoc b/docs/reference/cluster/stats.asciidoc
index 575a6457804a6..bd818a538f78b 100644
--- a/docs/reference/cluster/stats.asciidoc
+++ b/docs/reference/cluster/stats.asciidoc
@@ -40,6 +40,10 @@ If a node does not respond before its timeout expires, the response does not inc
However, timed out nodes are included in the response's `_nodes.failed` property.
Defaults to no timeout.
+`include_remotes`::
+(Optional, Boolean) If `true`, includes remote cluster information in the response.
+Defaults to `false`, so no remote cluster information is returned.
+
[role="child_attributes"]
[[cluster-stats-api-response-body]]
==== {api-response-body-title}
@@ -183,12 +187,11 @@ This number is based on documents in Lucene segments and may include documents f
This number is based on documents in Lucene segments. {es} reclaims the disk space of deleted Lucene documents when a segment is merged.
`total_size_in_bytes`::
-(integer)
-Total size in bytes across all primary shards assigned to selected nodes.
+(integer) Total size in bytes across all primary shards assigned to selected nodes.
`total_size`::
-(string)
-Total size across all primary shards assigned to selected nodes, as a human-readable string.
+(string) Total size across all primary shards assigned to selected nodes, as a human-readable string.
+
=====
`store`::
@@ -429,6 +432,15 @@ To get information on segment files, use the <> repositories defined in the cluster, broken down
-by repository type.
+(object) Contains statistics about the <> repositories defined in the cluster, broken down by repository type.
+
.Properties of `repositories`
[%collapsible%open]
@@ -1314,13 +1329,74 @@ Each repository type may also include other statistics about the repositories of
[%collapsible%open]
=====
+`clusters`:::
+(object) Contains remote cluster settings and metrics collected from them.
+The keys are cluster names, and the values are per-cluster data.
+Only present if `include_remotes` option is set to `true`.
+
++
+.Properties of `clusters`
+[%collapsible%open]
+======
+
+`cluster_uuid`:::
+(string) The UUID of the remote cluster.
+
+`mode`:::
+(string) The <> used to communicate with the remote cluster.
+
+`skip_unavailable`:::
+(Boolean) The `skip_unavailable` <> used for this remote cluster.
+
+`transport.compress`:::
+(string) Transport compression setting used for this remote cluster.
+
+`version`:::
+(array of strings) The list of {es} versions used by the nodes on the remote cluster.
+
+`status`:::
+include::{es-ref-dir}/rest-api/common-parms.asciidoc[tag=cluster-health-status]
++
+See <>.
+
+`nodes_count`:::
+(integer) The total count of nodes in the remote cluster.
+
+`shards_count`:::
+(integer) The total number of shards in the remote cluster.
+
+`indices_count`:::
+(integer) The total number of indices in the remote cluster.
+
+`indices_total_size_in_bytes`:::
+(integer) Total data set size, in bytes, of all shards assigned to selected nodes.
+
+`indices_total_size`:::
+(string) Total data set size, in bytes, of all shards assigned to selected nodes, as a human-readable string.
+
+`max_heap_in_bytes`:::
+(integer) Maximum amount of memory, in bytes, available for use by the heap across the nodes of the remote cluster.
+
+`max_heap`:::
+(string) Maximum amount of memory, in bytes, available for use by the heap across the nodes of the remote cluster,
+as a human-readable string.
+
+`mem_total_in_bytes`:::
+(integer) Total amount, in bytes, of physical memory across the nodes of the remote cluster.
+
+`mem_total`:::
+(string) Total amount, in bytes, of physical memory across the nodes of the remote cluster, as a human-readable string.
+
+======
+
`_search`:::
-(object) Contains the telemetry information about the <> usage in the cluster.
+(object) Contains the information about the <> usage in the cluster.
+
.Properties of `_search`
[%collapsible%open]
======
+
`total`:::
(integer) The total number of {ccs} requests that have been executed by the cluster.
@@ -1336,6 +1412,7 @@ Each repository type may also include other statistics about the repositories of
.Properties of `took`
[%collapsible%open]
=======
+
`max`:::
(integer) The maximum time taken to execute a {ccs} request, in milliseconds.
@@ -1344,6 +1421,7 @@ Each repository type may also include other statistics about the repositories of
`p90`:::
(integer) The 90th percentile of the time taken to execute {ccs} requests, in milliseconds.
+
=======
`took_mrt_true`::
@@ -1361,6 +1439,7 @@ Each repository type may also include other statistics about the repositories of
`p90`:::
(integer) The 90th percentile of the time taken to execute {ccs} requests, in milliseconds.
+
=======
`took_mrt_false`::
@@ -1378,6 +1457,7 @@ Each repository type may also include other statistics about the repositories of
`p90`:::
(integer) The 90th percentile of the time taken to execute {ccs} requests, in milliseconds.
+
=======
`remotes_per_search_max`::
@@ -1391,9 +1471,10 @@ Each repository type may also include other statistics about the repositories of
The keys are the failure reason names and the values are the number of requests that failed for that reason.
`features`::
-(object) Contains statistics about the features used in {ccs} requests. The keys are the names of the search feature,
-and the values are the number of requests that used that feature. Single request can use more than one feature
-(e.g. both `async` and `wildcard`). Known features are:
+(object) Contains statistics about the features used in {ccs} requests.
+The keys are the names of the search feature, and the values are the number of requests that used that feature.
+Single request can use more than one feature (e.g. both `async` and `wildcard`).
+Known features are:
* `async` - <>
@@ -1427,6 +1508,7 @@ This may include requests where partial results were returned, but not requests
.Properties of `took`
[%collapsible%open]
========
+
`max`:::
(integer) The maximum time taken to execute a {ccs} request, in milliseconds.
@@ -1435,6 +1517,7 @@ This may include requests where partial results were returned, but not requests
`p90`:::
(integer) The 90th percentile of the time taken to execute {ccs} requests, in milliseconds.
+
========
=======
@@ -1812,3 +1895,37 @@ This API can be restricted to a subset of the nodes using <>.
+
[[cancel-connector-sync-job-api-request]]
==== {api-request-title}
@@ -17,7 +18,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[cancel-connector-sync-job-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_sync_job_id` parameter should reference an existing connector sync job.
[[cancel-connector-sync-job-api-desc]]
diff --git a/docs/reference/connector/apis/check-in-connector-api.asciidoc b/docs/reference/connector/apis/check-in-connector-api.asciidoc
index 8c6b5161a3a72..15e65b10074d8 100644
--- a/docs/reference/connector/apis/check-in-connector-api.asciidoc
+++ b/docs/reference/connector/apis/check-in-connector-api.asciidoc
@@ -8,7 +8,8 @@ preview::[]
Updates the `last_seen` field of a connector with current timestamp.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[check-in-connector-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[check-in-connector-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[check-in-connector-api-path-params]]
diff --git a/docs/reference/connector/apis/check-in-connector-sync-job-api.asciidoc b/docs/reference/connector/apis/check-in-connector-sync-job-api.asciidoc
index a052fbb2418cc..8d7d0a36ad88a 100644
--- a/docs/reference/connector/apis/check-in-connector-sync-job-api.asciidoc
+++ b/docs/reference/connector/apis/check-in-connector-sync-job-api.asciidoc
@@ -8,7 +8,8 @@ preview::[]
Checks in a connector sync job (updates `last_seen` to the current time).
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[check-in-connector-sync-job-api-request]]
==== {api-request-title}
@@ -17,7 +18,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[check-in-connector-sync-job-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_sync_job_id` parameter should reference an existing connector sync job.
[[check-in-connector-sync-job-api-desc]]
diff --git a/docs/reference/connector/apis/claim-connector-sync-job-api.asciidoc b/docs/reference/connector/apis/claim-connector-sync-job-api.asciidoc
index 2fb28f9e9fb37..62491582ce757 100644
--- a/docs/reference/connector/apis/claim-connector-sync-job-api.asciidoc
+++ b/docs/reference/connector/apis/claim-connector-sync-job-api.asciidoc
@@ -10,7 +10,8 @@ Claims a connector sync job.
The `_claim` endpoint is not intended for direct connector management by users. It is there to support the implementation of services that utilize the https://github.com/elastic/connectors/blob/main/docs/CONNECTOR_PROTOCOL.md[Connector Protocol] to communicate with {es}.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[claim-connector-sync-job-api-request]]
==== {api-request-title}
@@ -19,7 +20,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[claim-connector-sync-job-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_sync_job_id` parameter should reference an existing connector sync job.
[[claim-connector-sync-job-api-desc]]
diff --git a/docs/reference/connector/apis/connector-apis.asciidoc b/docs/reference/connector/apis/connector-apis.asciidoc
index 987f82f6b4ce4..15ce31a605986 100644
--- a/docs/reference/connector/apis/connector-apis.asciidoc
+++ b/docs/reference/connector/apis/connector-apis.asciidoc
@@ -3,14 +3,16 @@
beta::[]
-The connector and sync jobs APIs provide a convenient way to create and manage Elastic {enterprise-search-ref}/connectors.html[connectors^] and sync jobs in an internal index. To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+The connector and sync jobs APIs provide a convenient way to create and manage Elastic <>.
+ and sync jobs in an internal index. To get started with Connector APIs, check out <>.
+
Connectors are {es} integrations that bring content from third-party data sources, which can be deployed on {ecloud} or hosted on your own infrastructure:
-* *Native connectors* are a managed service on {ecloud}
-* *Connector clients* are self-managed on your infrastructure
+* *Managed connectors* are a managed service on {ecloud}
+* *Self-managed connectors* are self-hosted on your infrastructure
-Find a list of all supported service types in the {enterprise-search-ref}/connectors.html[connectors documentation^].
+Find a list of all supported service types in the <>.
This API provides an alternative to relying solely on {kib} UI for connector and sync job management. The API comes with a set of
validations and assertions to ensure that the state representation in the internal index remains valid.
@@ -82,7 +84,7 @@ beta:[]
preview::[]
-*Connector Service APIs* are a subset of Connector API endpoints, that represent framework-level operations defined in the https://github.com/elastic/connectors/blob/main/docs/CONNECTOR_PROTOCOL.md[Connector Protocol]. These APIs are not intended for direct connector management by users but are there to support the implementation of services that utilize the Conector Protocol to communicate with {es}.
+*Connector Service APIs* are a subset of Connector API endpoints, that represent framework-level operations defined in the https://github.com/elastic/connectors/blob/main/docs/CONNECTOR_PROTOCOL.md[Connector Protocol]. These APIs are not intended for direct connector management by users but are there to support the implementation of services that utilize the Connector Protocol to communicate with {es}.
[TIP]
====
diff --git a/docs/reference/connector/apis/create-connector-api.asciidoc b/docs/reference/connector/apis/create-connector-api.asciidoc
index 9bd49a3c5ef94..3ecef6d302732 100644
--- a/docs/reference/connector/apis/create-connector-api.asciidoc
+++ b/docs/reference/connector/apis/create-connector-api.asciidoc
@@ -9,12 +9,13 @@ beta::[]
Creates an Elastic connector.
Connectors are {es} integrations that bring content from third-party data sources, which can be deployed on {ecloud} or hosted on your own infrastructure:
-* *Native connectors* are a managed service on {ecloud}
-* *Connector clients* are self-managed on your infrastructure
+* *Managed connectors* are a managed service on {ecloud}
+* *Self-managed connectors* are self-hosted on your infrastructure
-Find a list of all supported service types in the {enterprise-search-ref}/connectors.html[connectors documentation^].
+Find a list of all supported service types in the <>.
+
+To get started with Connector APIs, check out <>.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
[source,console]
--------------------------------------------------
@@ -43,8 +44,8 @@ DELETE _connector/my-connector
[[create-connector-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
-* The `service_type` parameter should reference a supported third-party service. See the available service types for {enterprise-search-ref}/native-connectors.html[native] and {enterprise-search-ref}/build-connector.html[self-managed] connectors. This can also reference the service type of your custom connector.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
+* The `service_type` parameter should reference a supported third-party service. See the available service types for <> and <> connectors. This can also reference the service type of your custom connector.
[[create-connector-api-desc]]
@@ -73,13 +74,13 @@ Creates a connector document in the internal index and initializes its configura
(Optional, string) The name of the connector. Setting the connector name is recommended when managing connectors in {kib}.
`is_native`::
-(Optional, boolean) Indicates if it's a native connector. Defaults to `false`.
+(Optional, boolean) Indicates if it's a managed connector. Defaults to `false`.
`language`::
(Optional, string) Language analyzer for the data. Limited to supported languages.
`service_type`::
-(Optional, string) Connector service type. Can reference Elastic-supported third-party services or a custom connector type. See the available service types for {enterprise-search-ref}/native-connectors.html[native] and {enterprise-search-ref}/build-connector.html[self-managed] connectors.
+(Optional, string) Connector service type. Can reference Elastic-supported third-party services or a custom connector type. See the available service types for <> and <> connectors.
[role="child_attributes"]
@@ -115,7 +116,7 @@ PUT _connector/my-connector
"name": "My Connector",
"description": "My Connector to sync data to Elastic index from Google Drive",
"service_type": "google_drive",
- "language": "english"
+ "language": "en"
}
----
diff --git a/docs/reference/connector/apis/create-connector-sync-job-api.asciidoc b/docs/reference/connector/apis/create-connector-sync-job-api.asciidoc
index c7cc866930dfb..240ab696954f3 100644
--- a/docs/reference/connector/apis/create-connector-sync-job-api.asciidoc
+++ b/docs/reference/connector/apis/create-connector-sync-job-api.asciidoc
@@ -9,7 +9,8 @@ beta::[]
Creates a connector sync job.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[source, console]
--------------------------------------------------
@@ -31,7 +32,7 @@ POST _connector/_sync_job
[[create-connector-sync-job-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `id` parameter should reference an existing connector.
[[create-connector-sync-job-api-desc]]
diff --git a/docs/reference/connector/apis/delete-connector-api.asciidoc b/docs/reference/connector/apis/delete-connector-api.asciidoc
index 23acd1b4755b1..76621d7f1843b 100644
--- a/docs/reference/connector/apis/delete-connector-api.asciidoc
+++ b/docs/reference/connector/apis/delete-connector-api.asciidoc
@@ -11,7 +11,8 @@ This is a destructive action that is not recoverable.
Note: this action doesn't delete any API key, ingest pipeline or data index associated with the connector. These need to be removed manually.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[delete-connector-api-request]]
==== {api-request-title}
@@ -21,7 +22,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[delete-connector-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[delete-connector-api-path-params]]
diff --git a/docs/reference/connector/apis/delete-connector-sync-job-api.asciidoc b/docs/reference/connector/apis/delete-connector-sync-job-api.asciidoc
index 7cdabb22f05ee..eeea40f430abd 100644
--- a/docs/reference/connector/apis/delete-connector-sync-job-api.asciidoc
+++ b/docs/reference/connector/apis/delete-connector-sync-job-api.asciidoc
@@ -9,7 +9,8 @@ beta::[]
Removes a connector sync job and its associated data.
This is a destructive action that is not recoverable.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[delete-connector-sync-job-api-request]]
==== {api-request-title}
@@ -19,7 +20,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[delete-connector-sync-job-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
[[delete-connector-sync-job-api-path-params]]
==== {api-path-parms-title}
diff --git a/docs/reference/connector/apis/get-connector-api.asciidoc b/docs/reference/connector/apis/get-connector-api.asciidoc
index 4df792c8a0a1a..302773e0af831 100644
--- a/docs/reference/connector/apis/get-connector-api.asciidoc
+++ b/docs/reference/connector/apis/get-connector-api.asciidoc
@@ -8,7 +8,8 @@ beta::[]
Retrieves the details about a connector.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[get-connector-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[get-connector-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
[[get-connector-api-path-params]]
==== {api-path-parms-title}
diff --git a/docs/reference/connector/apis/get-connector-sync-job-api.asciidoc b/docs/reference/connector/apis/get-connector-sync-job-api.asciidoc
index fffdada2a2a82..a524c1291c26a 100644
--- a/docs/reference/connector/apis/get-connector-sync-job-api.asciidoc
+++ b/docs/reference/connector/apis/get-connector-sync-job-api.asciidoc
@@ -8,7 +8,8 @@ beta::[]
Retrieves the details about a connector sync job.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[get-connector-sync-job-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[get-connector-sync-job-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
[[get-connector-sync-job-api-path-params]]
==== {api-path-parms-title}
diff --git a/docs/reference/connector/apis/list-connector-sync-jobs-api.asciidoc b/docs/reference/connector/apis/list-connector-sync-jobs-api.asciidoc
index 730dad852adee..4a4fa5a22dcc1 100644
--- a/docs/reference/connector/apis/list-connector-sync-jobs-api.asciidoc
+++ b/docs/reference/connector/apis/list-connector-sync-jobs-api.asciidoc
@@ -9,7 +9,8 @@ beta::[]
Returns information about all stored connector sync jobs ordered by their creation date in ascending order.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[list-connector-sync-jobs-api-request]]
==== {api-request-title}
@@ -19,7 +20,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[list-connector-sync-jobs-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
[[list-connector-sync-jobs-api-path-params]]
==== {api-path-parms-title}
diff --git a/docs/reference/connector/apis/list-connectors-api.asciidoc b/docs/reference/connector/apis/list-connectors-api.asciidoc
index c7ea2afd8102f..4a93ecf2b0109 100644
--- a/docs/reference/connector/apis/list-connectors-api.asciidoc
+++ b/docs/reference/connector/apis/list-connectors-api.asciidoc
@@ -9,7 +9,8 @@ beta::[]
Returns information about all created connectors.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[list-connector-api-request]]
@@ -20,7 +21,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[list-connector-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
[[list-connector-api-path-params]]
==== {api-path-parms-title}
diff --git a/docs/reference/connector/apis/set-connector-sync-job-error-api.asciidoc b/docs/reference/connector/apis/set-connector-sync-job-error-api.asciidoc
index 42203ed8e6103..e6ad9e8cc93db 100644
--- a/docs/reference/connector/apis/set-connector-sync-job-error-api.asciidoc
+++ b/docs/reference/connector/apis/set-connector-sync-job-error-api.asciidoc
@@ -8,7 +8,8 @@ preview::[]
Sets a connector sync job error.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[set-connector-sync-job-error-api-request]]
==== {api-request-title}
@@ -17,7 +18,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[set-connector-sync-job-error-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_sync_job_id` parameter should reference an existing connector sync job.
[[set-connector-sync-job-error-api-desc]]
diff --git a/docs/reference/connector/apis/set-connector-sync-job-stats-api.asciidoc b/docs/reference/connector/apis/set-connector-sync-job-stats-api.asciidoc
index 1427269d22b86..7e22f657ba6b6 100644
--- a/docs/reference/connector/apis/set-connector-sync-job-stats-api.asciidoc
+++ b/docs/reference/connector/apis/set-connector-sync-job-stats-api.asciidoc
@@ -8,7 +8,8 @@ preview::[]
Sets connector sync job stats.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[set-connector-sync-job-stats-api-request]]
==== {api-request-title}
@@ -17,7 +18,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[set-connector-sync-job-stats-api-prereqs]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_sync_job_id` parameter should reference an existing connector sync job.
[[set-connector-sync-job-stats-api-desc]]
diff --git a/docs/reference/connector/apis/update-connector-api-key-id-api.asciidoc b/docs/reference/connector/apis/update-connector-api-key-id-api.asciidoc
index 112ec821df7c9..fbd3f887758f2 100644
--- a/docs/reference/connector/apis/update-connector-api-key-id-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-api-key-id-api.asciidoc
@@ -11,11 +11,12 @@ Updates the `api_key_id` and/or `api_key_secret_id` field(s) of a connector, spe
. The ID of the API key used for authorization
. The ID of the Connector Secret where the API key is stored
-The Connector Secret ID is only required for native connectors.
-Connector clients do not use this field.
-See the documentation for {enterprise-search-ref}/native-connectors.html#native-connectors-manage-API-keys-programmatically[managing native connector API keys programmatically^] for more details.
+The Connector Secret ID is only required for Elastic managed connectors.
+Self-managed connectors do not use this field.
+See the documentation for <> for more details.
+
+To get started with Connector APIs, check out <>.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
[[update-connector-api-key-id-api-request]]
==== {api-request-title}
@@ -25,7 +26,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-api-key-id-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
* The `api_key_id` parameter should reference an existing API key.
* The `api_key_secret_id` parameter should reference an existing Connector Secret containing an encoded API key value.
@@ -44,7 +45,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
(Optional, string) ID of the API key that the connector will use to authorize access to required indices. Each connector can be associated with at most one API key.
`api_key_secret_id`::
-(Optional, string) ID of the Connector Secret that contains the encoded API key. This should be the same API key as `api_key_id` references. This is only required for native connectors.
+(Optional, string) ID of the Connector Secret that contains the encoded API key. This should be the same API key as `api_key_id` references. This is only required for Elastic managed connectors.
[[update-connector-api-key-id-api-response-codes]]
==== {api-response-codes-title}
diff --git a/docs/reference/connector/apis/update-connector-configuration-api.asciidoc b/docs/reference/connector/apis/update-connector-configuration-api.asciidoc
index e8a710cdacff0..4b25f9e71ae4b 100644
--- a/docs/reference/connector/apis/update-connector-configuration-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-configuration-api.asciidoc
@@ -8,7 +8,8 @@ beta::[]
Updates a connector's `configuration`, allowing for config value updates within a registered configuration schema.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-configuration-api-request]]
==== {api-request-title}
@@ -18,10 +19,10 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-configuration-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
* To update configuration `values`, the connector `configuration` schema must be first registered by a running instance of Elastic connector service.
-* Make sure configuration fields are compatible with the configuration schema for the third-party data source. Refer to the individual {enterprise-search-ref}/connectors-references.html[connectors references] for details.
+* Make sure configuration fields are compatible with the configuration schema for the third-party data source. Refer to the individual <> for details.
[[update-connector-configuration-api-path-params]]
==== {api-path-parms-title}
@@ -55,7 +56,7 @@ No connector matching `connector_id` could be found.
[[update-connector-configuration-api-example]]
==== {api-examples-title}
-The following example configures a `sharepoint_online` connector. Find the supported configuration options in the {enterprise-search-ref}/connectors-sharepoint-online.html[Sharepoint Online connector documentation] or by inspecting the schema in the connector's `configuration` field using the <>.
+The following example configures a `sharepoint_online` connector. Find the supported configuration options in the <>, or by inspecting the schema in the connector's `configuration` field using the <>.
////
[source, console]
diff --git a/docs/reference/connector/apis/update-connector-error-api.asciidoc b/docs/reference/connector/apis/update-connector-error-api.asciidoc
index c6ac0c9a1ac22..29358b243041a 100644
--- a/docs/reference/connector/apis/update-connector-error-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-error-api.asciidoc
@@ -8,7 +8,8 @@ preview::[]
Updates the `error` field of a connector.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-error-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-error-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-error-api-desc]]
diff --git a/docs/reference/connector/apis/update-connector-features-api.asciidoc b/docs/reference/connector/apis/update-connector-features-api.asciidoc
index 0d3457b9bd584..77571fcd7d5a0 100644
--- a/docs/reference/connector/apis/update-connector-features-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-features-api.asciidoc
@@ -15,7 +15,8 @@ Manages the `features` of a connector. This endpoint can be used to control the
Normally, the running connector service automatically manages these features. However, you can use this API to override the default behavior.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-features-api-request]]
==== {api-request-title}
@@ -25,7 +26,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-features-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-features-api-path-params]]
@@ -43,7 +44,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
* `document_level_security` (Optional, object) Controls whether document-level security is enabled with the `enabled` flag.
* `incremental_sync` (Optional, object) Controls whether incremental syncs are enabled with the `enabled` flag.
-* `native_connector_api_keys`(Optional, object) Controls whether native connector API keys are enabled with the `enabled` flag.
+* `native_connector_api_keys`(Optional, object) Controls whether managed connector API keys are enabled with the `enabled` flag.
* `sync_rules` (Optional, object) Controls sync rules.
** `advanced` (Optional, object) Controls whether advanced sync rules are enabled with the `enabled` flag.
** `basic`(Optional, object) Controls whether basic sync rules are enabled with the `enabled` flag.
diff --git a/docs/reference/connector/apis/update-connector-filtering-api.asciidoc b/docs/reference/connector/apis/update-connector-filtering-api.asciidoc
index 861e72481a59a..4820fa151901d 100644
--- a/docs/reference/connector/apis/update-connector-filtering-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-filtering-api.asciidoc
@@ -8,9 +8,10 @@ beta::[]
Updates the draft `filtering` configuration of a connector and marks the draft validation state as `edited`. The filtering draft is activated once validated by the running Elastic connector service.
-The filtering property is used to configure sync rules (both basic and advanced) for a connector. Learn more in the {enterprise-search-ref}/sync-rules.html[sync rules documentation].
+The filtering property is used to configure sync rules (both basic and advanced) for a connector. Learn more in the <>.
+
+To get started with Connector APIs, check out <>.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
[[update-connector-filtering-api-request]]
==== {api-request-title}
@@ -20,7 +21,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-filtering-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
* Filtering draft is activated once validated by the running Elastic connector service, the `draft.validation.state` must be `valid`.
* If, after a validation attempt, the `draft.validation.state` equals to `invalid`, inspect `draft.validation.errors` and fix any issues.
@@ -37,7 +38,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
`rules`::
(Optional, array of objects)
-An array of {enterprise-search-ref}/sync-rules.html#sync-rules-basic[basic sync rules], each with the following sub-attributes:
+An array of <>, each with the following sub-attributes:
* `id` (Required, string) +
A unique identifier for the rule.
* `policy` (Required, string) +
@@ -57,7 +58,7 @@ The timestamp when the rule was last edited. Defaults to `now` UTC timestamp.
`advanced_snippet`::
(Optional, object)
-Used for {enterprise-search-ref}/sync-rules.html#sync-rules-advanced[advanced filtering] at query time, with the following sub-attributes:
+Used for <> at query time, with the following sub-attributes:
* `value` (Required, object or array) +
A JSON object/array passed directly to the connector for advanced filtering.
* `created_at` (Optional, datetime) +
@@ -81,7 +82,7 @@ No connector matching `connector_id` could be found.
[[update-connector-filtering-api-example]]
==== {api-examples-title}
-The following example updates the draft {enterprise-search-ref}/sync-rules.html#sync-rules-basic[basic sync rules] for a Google Drive connector with ID `my-g-drive-connector`. All Google Drive files with `.txt` extension will be skipped:
+The following example updates the draft <> for a Google Drive connector with ID `my-g-drive-connector`. All Google Drive files with `.txt` extension will be skipped:
////
[source, console]
@@ -143,7 +144,7 @@ PUT _connector/my-g-drive-connector/_filtering
}
----
-The following example updates the draft advanced sync rules for a MySQL connector with id `my-sql-connector`. Advanced sync rules are specific to each connector type. Refer to the references for connectors that support {enterprise-search-ref}/sync-rules.html#sync-rules-advanced[advanced sync rules] for syntax and examples.
+The following example updates the draft advanced sync rules for a MySQL connector with id `my-sql-connector`. Advanced sync rules are specific to each connector type. Refer to the references for connectors that support <> for syntax and examples.
[source,console]
----
diff --git a/docs/reference/connector/apis/update-connector-index-name-api.asciidoc b/docs/reference/connector/apis/update-connector-index-name-api.asciidoc
index d07007438e09c..6222baf6a6caf 100644
--- a/docs/reference/connector/apis/update-connector-index-name-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-index-name-api.asciidoc
@@ -8,7 +8,8 @@ beta::[]
Updates the `index_name` field of a connector, specifying the index where the data ingested by the connector is stored.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-index-name-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-index-name-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-index-name-api-path-params]]
diff --git a/docs/reference/connector/apis/update-connector-last-sync-api.asciidoc b/docs/reference/connector/apis/update-connector-last-sync-api.asciidoc
index 918bf4f80a010..17f892d852f4a 100644
--- a/docs/reference/connector/apis/update-connector-last-sync-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-last-sync-api.asciidoc
@@ -10,7 +10,8 @@ Updates the fields related to the last sync of a connector.
This action is used for analytics and monitoring.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-last-sync-api-request]]
==== {api-request-title}
@@ -20,7 +21,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-last-sync-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-last-sync-api-path-params]]
diff --git a/docs/reference/connector/apis/update-connector-name-description-api.asciidoc b/docs/reference/connector/apis/update-connector-name-description-api.asciidoc
index 7e16874da9fb4..384cec2c73e24 100644
--- a/docs/reference/connector/apis/update-connector-name-description-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-name-description-api.asciidoc
@@ -9,7 +9,8 @@ beta::[]
Updates the `name` and `description` fields of a connector.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-name-description-api-request]]
==== {api-request-title}
@@ -19,7 +20,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-name-description-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-name-description-api-path-params]]
diff --git a/docs/reference/connector/apis/update-connector-pipeline-api.asciidoc b/docs/reference/connector/apis/update-connector-pipeline-api.asciidoc
index 01ed2e39702ea..e54b01ec47d01 100644
--- a/docs/reference/connector/apis/update-connector-pipeline-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-pipeline-api.asciidoc
@@ -10,7 +10,8 @@ Updates the `pipeline` configuration of a connector.
When you create a new connector, the configuration of an <> is populated with default settings.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-pipeline-api-request]]
==== {api-request-title}
@@ -20,7 +21,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-pipeline-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-pipeline-api-path-params]]
diff --git a/docs/reference/connector/apis/update-connector-scheduling-api.asciidoc b/docs/reference/connector/apis/update-connector-scheduling-api.asciidoc
index f932f4c959de2..64302c26a7231 100644
--- a/docs/reference/connector/apis/update-connector-scheduling-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-scheduling-api.asciidoc
@@ -8,7 +8,8 @@ beta::[]
Updates the `scheduling` configuration of a connector.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-scheduling-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-scheduling-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
[[update-connector-scheduling-api-path-params]]
diff --git a/docs/reference/connector/apis/update-connector-service-type-api.asciidoc b/docs/reference/connector/apis/update-connector-service-type-api.asciidoc
index 139e9eddf4076..c02967d03e2dd 100644
--- a/docs/reference/connector/apis/update-connector-service-type-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-service-type-api.asciidoc
@@ -8,7 +8,8 @@ beta::[]
Updates the `service_type` of a connector.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-service-type-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-service-type-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
* The `service_type` must be a valid type as defined by the Connector framework.
** When you change a configured connector's `service_type`, you'll also need to reset its configuration to ensure compatibility.
diff --git a/docs/reference/connector/apis/update-connector-status-api.asciidoc b/docs/reference/connector/apis/update-connector-status-api.asciidoc
index ee9dfcb5f880f..dadd93fe5f9c4 100644
--- a/docs/reference/connector/apis/update-connector-status-api.asciidoc
+++ b/docs/reference/connector/apis/update-connector-status-api.asciidoc
@@ -8,7 +8,8 @@ preview::[]
Updates the `status` of a connector.
-To get started with Connector APIs, check out the {enterprise-search-ref}/connectors-tutorial-api.html[tutorial^].
+To get started with Connector APIs, check out <>.
+
[[update-connector-status-api-request]]
==== {api-request-title}
@@ -18,7 +19,7 @@ To get started with Connector APIs, check out the {enterprise-search-ref}/connec
[[update-connector-status-api-prereq]]
==== {api-prereq-title}
-* To sync data using self-managed connectors, you need to deploy the {enterprise-search-ref}/build-connector.html[Elastic connector service] on your own infrastructure. This service runs automatically on Elastic Cloud for native connectors.
+* To sync data using self-managed connectors, you need to deploy the <>. on your own infrastructure. This service runs automatically on Elastic Cloud for Elastic managed connectors.
* The `connector_id` parameter should reference an existing connector.
* The change of `status` must be a valid status transition according to the https://github.com/elastic/connectors/blob/main/docs/CONNECTOR_PROTOCOL.md[Connector Protocol].
diff --git a/docs/reference/connector/docs/_connectors-create-client.asciidoc b/docs/reference/connector/docs/_connectors-create-client.asciidoc
new file mode 100644
index 0000000000000..31e4468f7a6bc
--- /dev/null
+++ b/docs/reference/connector/docs/_connectors-create-client.asciidoc
@@ -0,0 +1,76 @@
+[discrete#es-connectors-{service-name-stub}-client-create-use-the-ui]
+==== Use the UI
+
+To create a new {service-name} connector:
+
+. Navigate to the *Search -> Connectors* page in the Kibana UI.
+. Follow the instructions to create a new *{service-name}* self-managed connector.
+
+[discrete#es-connectors-{service-name-stub}-client-create-use-the-api]
+==== Use the API
+
+You can use the {es} {ref}/connector-apis.html[Create connector API] to create a new self-managed {service-name} self-managed connector.
+
+For example:
+
+[source, console,subs="+attributes"]
+----
+PUT _connector/my-{service-name-stub}-connector
+{
+ "index_name": "my-elasticsearch-index",
+ "name": "Content synced from {service-name}",
+ "service_type": "{service-name-stub}"
+}
+----
+// TEST[skip:can't test in isolation]
+
+
+.You'll also need to *create an API key* for the connector to use.
+
+
+[%collapsible]
+===================================
+
+[NOTE]
+====
+The user needs the cluster privileges `manage_api_key`, `manage_connector` and `write_connector_secrets` to generate API keys programmatically.
+====
+
+To create an API key for the connector:
+
+. Run the following command, replacing values where indicated.
+Note the `encoded` return values from the response:
++
+[source, console,subs="+attributes"]
+----
+POST /_security/api_key
+{
+ "name": "connector_name-connector-api-key",
+ "role_descriptors": {
+ "connector_name-connector-role": {
+ "cluster": [
+ "monitor",
+ "manage_connector"
+ ],
+ "indices": [
+ {
+ "names": [
+ "index_name",
+ ".search-acl-filter-index_name",
+ ".elastic-connectors*"
+ ],
+ "privileges": [
+ "all"
+ ],
+ "allow_restricted_indices": false
+ }
+ ]
+ }
+ }
+}
+----
++
+. Update your `config.yml` file with the API key `encoded` value.
+===================================
+
+Refer to the {ref}/connector-apis.html[{es} API documentation] for details of all available Connector APIs.
diff --git a/docs/reference/connector/docs/_connectors-create-native-api-key.asciidoc b/docs/reference/connector/docs/_connectors-create-native-api-key.asciidoc
new file mode 100644
index 0000000000000..99fde477eea5b
--- /dev/null
+++ b/docs/reference/connector/docs/_connectors-create-native-api-key.asciidoc
@@ -0,0 +1,61 @@
+[NOTE]
+====
+The user needs the cluster privileges `manage_api_key`, `manage_connector` and `write_connector_secrets` to generate API keys programmatically.
+====
+
+To create an API key for the connector:
+
+. Run the following command, replacing values where indicated.
+Note the `id` and `encoded` return values from the response:
++
+[source, console,subs="+attributes"]
+----
+POST /_security/api_key
+{
+ "name": "my-connector-api-key",
+ "role_descriptors": {
+ "my-connector-connector-role": {
+ "cluster": [
+ "monitor",
+ "manage_connector"
+ ],
+ "indices": [
+ {
+ "names": [
+ "my-index_name",
+ ".search-acl-filter-my-index_name",
+ ".elastic-connectors*"
+ ],
+ "privileges": [
+ "all"
+ ],
+ "allow_restricted_indices": false
+ }
+ ]
+ }
+ }
+}
+----
++
+. Use the `encoded` value to store a connector secret, and note the `id` return value from this response:
++
+[source, console,subs="+attributes"]
+----
+POST _connector/_secret
+{
+ "value": "encoded_api_key"
+}
+----
+// TEST[skip:need to retrieve ids from the response]
++
+. Use the API key `id` and the connector secret `id` to update the connector:
++
+[source, console,subs="+attributes"]
+----
+PUT /_connector/my_connector_id>/_api_key_id
+{
+ "api_key_id": "API key_id",
+ "api_key_secret_id": "secret_id"
+}
+----
+// TEST[skip:need to retrieve ids from the response]
diff --git a/docs/reference/connector/docs/_connectors-create-native.asciidoc b/docs/reference/connector/docs/_connectors-create-native.asciidoc
new file mode 100644
index 0000000000000..1b7f5f22415fe
--- /dev/null
+++ b/docs/reference/connector/docs/_connectors-create-native.asciidoc
@@ -0,0 +1,38 @@
+[discrete#es-connectors-{service-name-stub}-create-use-the-ui]
+==== Use the UI
+
+To create a new {service-name} connector:
+
+. Navigate to the *Search -> Connectors* page in the Kibana UI.
+. Follow the instructions to create a new native *{service-name}* connector.
+
+For additional operations, see <>.
+
+[discrete#es-connectors-{service-name-stub}-create-use-the-api]
+==== Use the API
+
+You can use the {es} {ref}/connector-apis.html[Create connector API] to create a new native {service-name} connector.
+
+For example:
+
+[source, console,subs="+attributes"]
+----
+PUT _connector/my-{service-name-stub}-connector
+{
+ "index_name": "my-elasticsearch-index",
+ "name": "Content synced from {service-name}",
+ "service_type": "{service-name-stub}",
+ "is_native": "true"
+}
+----
+// TEST[skip:can't test in isolation]
+
+.You'll also need to *create an API key* for the connector to use.
+
+[%collapsible]
+===================================
+include::_connectors-create-native-api-key.asciidoc[]
+===================================
+
+Refer to the {ref}/connector-apis.html[{es} API documentation] for details of all available Connector APIs.
+
diff --git a/docs/reference/connector/docs/_connectors-docker-instructions.asciidoc b/docs/reference/connector/docs/_connectors-docker-instructions.asciidoc
new file mode 100644
index 0000000000000..4626ea23c2e71
--- /dev/null
+++ b/docs/reference/connector/docs/_connectors-docker-instructions.asciidoc
@@ -0,0 +1,76 @@
+You can deploy the {service-name} connector as a self-managed connector using Docker.
+Follow these instructions.
+
+.*Step 1: Download sample configuration file*
+[%collapsible]
+====
+Download the sample configuration file.
+You can either download it manually or run the following command:
+
+[source,sh]
+----
+curl https://raw.githubusercontent.com/elastic/connectors/main/config.yml.example --output ~/connectors-config/config.yml
+----
+// NOTCONSOLE
+
+Remember to update the `--output` argument value if your directory name is different, or you want to use a different config file name.
+====
+
+.*Step 2: Update the configuration file for your self-managed connector*
+[%collapsible]
+====
+Update the configuration file with the following settings to match your environment:
+
+* `elasticsearch.host`
+* `elasticsearch.api_key`
+* `connectors`
+
+If you're running the connector service against a Dockerized version of Elasticsearch and Kibana, your config file will look like this:
+
+[source,yaml,subs="attributes"]
+----
+# When connecting to your cloud deployment you should edit the host value
+elasticsearch.host: http://host.docker.internal:9200
+elasticsearch.api_key:
+
+connectors:
+ -
+ connector_id:
+ service_type: {service-name-stub}
+ api_key: # Optional. If not provided, the connector will use the elasticsearch.api_key instead
+
+----
+
+Using the `elasticsearch.api_key` is the recommended authentication method. However, you can also use `elasticsearch.username` and `elasticsearch.password` to authenticate with your Elasticsearch instance.
+
+Note: You can change other default configurations by simply uncommenting specific settings in the configuration file and modifying their values.
+
+====
+
+.*Step 3: Run the Docker image*
+[%collapsible]
+====
+Run the Docker image with the Connector Service using the following command:
+
+[source,sh,subs="attributes"]
+----
+docker run \
+-v ~/connectors-config:/config \
+--network "elastic" \
+--tty \
+--rm \
+docker.elastic.co/integrations/elastic-connectors:{version}.0 \
+/app/bin/elastic-ingest \
+-c /config/config.yml
+----
+====
+
+Refer to {connectors-python}/docs/DOCKER.md[`DOCKER.md`^] in the `elastic/connectors` repo for more details.
+
+Find all available Docker images in the https://www.docker.elastic.co/r/integrations/elastic-connectors[official registry].
+
+[TIP]
+====
+We also have a quickstart self-managed option using Docker Compose, so you can spin up all required services at once: Elasticsearch, Kibana, and the connectors service.
+Refer to this https://github.com/elastic/connectors/tree/main/scripts/stack#readme[README] in the `elastic/connectors` repo for more information.
+====
diff --git a/docs/reference/connector/docs/_connectors-list-advanced-rules.asciidoc b/docs/reference/connector/docs/_connectors-list-advanced-rules.asciidoc
new file mode 100644
index 0000000000000..b09aa7f1d4e7e
--- /dev/null
+++ b/docs/reference/connector/docs/_connectors-list-advanced-rules.asciidoc
@@ -0,0 +1,14 @@
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
+* <>
diff --git a/docs/reference/connector/docs/_connectors-list-clients.asciidoc b/docs/reference/connector/docs/_connectors-list-clients.asciidoc
new file mode 100644
index 0000000000000..b56d7458d2924
--- /dev/null
+++ b/docs/reference/connector/docs/_connectors-list-clients.asciidoc
@@ -0,0 +1,29 @@
+* <>
+* <>
+* <>
+* <>
+* <>
+* <