diff --git a/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java b/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java index 428c53d30b193..455e1a3cfdeee 100644 --- a/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java +++ b/server/src/main/java/org/elasticsearch/plugins/PluginDescriptor.java @@ -58,6 +58,7 @@ public class PluginDescriptor implements Writeable, ToXContentObject { private final boolean hasNativeController; private final boolean isLicensed; private final boolean isModular; + private final boolean isStable; /** * Construct plugin info. @@ -85,7 +86,8 @@ public PluginDescriptor( List extendedPlugins, boolean hasNativeController, boolean isLicensed, - boolean isModular + boolean isModular, + boolean isStable ) { this.name = name; this.description = description; @@ -98,6 +100,7 @@ public PluginDescriptor( this.hasNativeController = hasNativeController; this.isLicensed = isLicensed; this.isModular = isModular; + this.isStable = isStable; } /** @@ -133,8 +136,10 @@ public PluginDescriptor(final StreamInput in) throws IOException { if (in.getVersion().onOrAfter(Version.V_8_4_0)) { isModular = in.readBoolean(); + isStable = in.readBoolean(); } else { isModular = moduleName != null; + isStable = false; } } @@ -161,6 +166,7 @@ public void writeTo(final StreamOutput out) throws IOException { } if (out.getVersion().onOrAfter(Version.V_8_4_0)) { out.writeBoolean(isModular); + out.writeBoolean(isStable); } } @@ -236,8 +242,9 @@ private static PluginDescriptor readerInternalDescriptor(Map pro } boolean isLicensed = readBoolean(propsMap, name, "licensed"); + boolean modular = module != null; - return new PluginDescriptor(name, desc, ver, esVer, javaVer, classname, module, extended, nativeCont, isLicensed, module != null); + return new PluginDescriptor(name, desc, ver, esVer, javaVer, classname, module, extended, nativeCont, isLicensed, modular, false); } private static PluginDescriptor readerStableDescriptor(Map propsMap, String filename) { @@ -248,7 +255,7 @@ private static PluginDescriptor readerStableDescriptor(Map props String javaVer = readJavaVersion(propsMap, name); boolean isModular = readBoolean(propsMap, name, "modular"); - return new PluginDescriptor(name, desc, ver, esVer, javaVer, null, null, List.of(), false, false, isModular); + return new PluginDescriptor(name, desc, ver, esVer, javaVer, null, null, List.of(), false, false, isModular, true); } private static String readNonEmptyString(Map propsMap, String pluginId, String name) { @@ -389,6 +396,13 @@ public boolean isModular() { return isModular; } + /** + * Whether this plugin uses only stable APIs. + */ + public boolean isStable() { + return isStable; + } + @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); diff --git a/server/src/test/java/org/elasticsearch/nodesinfo/NodeInfoStreamingTests.java b/server/src/test/java/org/elasticsearch/nodesinfo/NodeInfoStreamingTests.java index 802e6df57639a..086d0c90d228a 100644 --- a/server/src/test/java/org/elasticsearch/nodesinfo/NodeInfoStreamingTests.java +++ b/server/src/test/java/org/elasticsearch/nodesinfo/NodeInfoStreamingTests.java @@ -157,6 +157,7 @@ private static NodeInfo createNodeInfo() { Collections.emptyList(), randomBoolean(), randomBoolean(), + randomBoolean(), randomBoolean() ) ); @@ -176,6 +177,7 @@ private static NodeInfo createNodeInfo() { Collections.emptyList(), randomBoolean(), randomBoolean(), + randomBoolean(), randomBoolean() ) ); diff --git a/server/src/test/java/org/elasticsearch/plugins/PluginDescriptorTests.java b/server/src/test/java/org/elasticsearch/plugins/PluginDescriptorTests.java index 14ff7280ba8cf..10d5b3b9355d6 100644 --- a/server/src/test/java/org/elasticsearch/plugins/PluginDescriptorTests.java +++ b/server/src/test/java/org/elasticsearch/plugins/PluginDescriptorTests.java @@ -234,6 +234,7 @@ public void testSerialize() throws Exception { Collections.singletonList("foo"), randomBoolean(), randomBoolean(), + randomBoolean(), randomBoolean() ); BytesStreamOutput output = new BytesStreamOutput(); @@ -256,6 +257,7 @@ public void testSerializeWithModuleName() throws Exception { Collections.singletonList("foo"), randomBoolean(), randomBoolean(), + randomBoolean(), randomBoolean() ); BytesStreamOutput output = new BytesStreamOutput(); @@ -278,6 +280,7 @@ PluginDescriptor newMockDescriptor(String name) { List.of(), randomBoolean(), randomBoolean(), + randomBoolean(), randomBoolean() ); } @@ -319,6 +322,7 @@ public void testPluginEqualityAndHash() { Collections.singletonList("foo"), randomBoolean(), randomBoolean(), + randomBoolean(), randomBoolean() ); // everything but name is different from descriptor1 @@ -335,7 +339,8 @@ public void testPluginEqualityAndHash() { ), descriptor1.hasNativeController() == false, descriptor1.isLicensed() == false, - descriptor1.isModular() == false + descriptor1.isModular() == false, + descriptor1.isStable() == false ); // only name is different from descriptor1 PluginDescriptor descriptor3 = new PluginDescriptor( @@ -349,7 +354,8 @@ public void testPluginEqualityAndHash() { descriptor1.getExtendedPlugins(), descriptor1.hasNativeController(), descriptor1.isLicensed(), - descriptor1.isModular() + descriptor1.isModular(), + descriptor1.isStable() ); assertThat(descriptor1, equalTo(descriptor2)); diff --git a/server/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java b/server/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java index da3707f76b311..baa56b0978bc1 100644 --- a/server/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java +++ b/server/src/test/java/org/elasticsearch/plugins/PluginsServiceTests.java @@ -456,7 +456,7 @@ public void testExtensiblePlugin() { PluginsService.loadExtensions( List.of( new PluginsService.LoadedPlugin( - new PluginDescriptor("extensible", null, null, null, null, null, null, List.of(), false, false, false), + new PluginDescriptor("extensible", null, null, null, null, null, null, List.of(), false, false, false, false), extensiblePlugin ) ) @@ -470,11 +470,11 @@ public void testExtensiblePlugin() { PluginsService.loadExtensions( List.of( new PluginsService.LoadedPlugin( - new PluginDescriptor("extensible", null, null, null, null, null, null, List.of(), false, false, false), + new PluginDescriptor("extensible", null, null, null, null, null, null, List.of(), false, false, false, false), extensiblePlugin ), new PluginsService.LoadedPlugin( - new PluginDescriptor("test", null, null, null, null, null, null, List.of("extensible"), false, false, false), + new PluginDescriptor("test", null, null, null, null, null, null, List.of("extensible"), false, false, false, false), testPlugin ) ) diff --git a/server/src/test/java/org/elasticsearch/plugins/PluginsUtilsTests.java b/server/src/test/java/org/elasticsearch/plugins/PluginsUtilsTests.java index 06d1267761e58..72dc0806e7ba8 100644 --- a/server/src/test/java/org/elasticsearch/plugins/PluginsUtilsTests.java +++ b/server/src/test/java/org/elasticsearch/plugins/PluginsUtilsTests.java @@ -39,7 +39,7 @@ public class PluginsUtilsTests extends ESTestCase { PluginDescriptor newTestDescriptor(String name, List deps) { String javaVersion = Runtime.version().toString(); - return new PluginDescriptor(name, "desc", "1.0", Version.CURRENT, javaVersion, "MyPlugin", null, deps, false, false, false); + return new PluginDescriptor(name, "desc", "1.0", Version.CURRENT, javaVersion, "MyPlugin", null, deps, false, false, false, false); } public void testExistingPluginMissingDescriptor() throws Exception { @@ -380,6 +380,7 @@ public void testIncompatibleElasticsearchVersion() throws Exception { Collections.emptyList(), false, false, + false, false ); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> PluginsUtils.verifyCompatibility(info)); @@ -398,6 +399,7 @@ public void testIncompatibleJavaVersion() throws Exception { Collections.emptyList(), false, false, + false, false ); IllegalStateException e = expectThrows(IllegalStateException.class, () -> PluginsUtils.verifyCompatibility(info)); diff --git a/test/framework/src/main/java/org/elasticsearch/plugins/MockPluginsService.java b/test/framework/src/main/java/org/elasticsearch/plugins/MockPluginsService.java index 7c6f50555b0a1..403a029b6fae2 100644 --- a/test/framework/src/main/java/org/elasticsearch/plugins/MockPluginsService.java +++ b/test/framework/src/main/java/org/elasticsearch/plugins/MockPluginsService.java @@ -58,6 +58,7 @@ public MockPluginsService(Settings settings, Environment environment, Collection Collections.emptyList(), false, false, + false, false ); if (logger.isTraceEnabled()) { diff --git a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsMonitoringDocTests.java b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsMonitoringDocTests.java index 70888ef2e05a2..75818eb9a27c3 100644 --- a/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsMonitoringDocTests.java +++ b/x-pack/plugin/monitoring/src/test/java/org/elasticsearch/xpack/monitoring/collector/cluster/ClusterStatsMonitoringDocTests.java @@ -336,6 +336,7 @@ public void testToXContent() throws IOException { Collections.emptyList(), false, false, + false, false ); final PluginRuntimeInfo pluginRuntimeInfo = new PluginRuntimeInfo(pluginDescriptor);