From 6176ddc0ae831095a0e2e8a38b0f475158abef3b Mon Sep 17 00:00:00 2001 From: Sarat Vemulapalli Date: Wed, 1 Feb 2023 10:24:08 -0800 Subject: [PATCH] [Extensions] Add support for minimum compatible version for extensions with OpenSearch (#6003) * Refactoring extensions config to have real useable values Signed-off-by: Sarat Vemulapalli * Removing werror Signed-off-by: Sarat Vemulapalli * Removing extensions feature flag from gradle run Signed-off-by: Sarat Vemulapalli * Removing description Signed-off-by: Sarat Vemulapalli * Adding MinimumCompatible Version for extensions Signed-off-by: Sarat Vemulapalli * Adding changelog Signed-off-by: Sarat Vemulapalli * Updating changelog Signed-off-by: Sarat Vemulapalli * Addressing comments Signed-off-by: Sarat Vemulapalli * Addressing comments Signed-off-by: Sarat Vemulapalli * Removing debug lines Signed-off-by: Sarat Vemulapalli * Removing another log line Signed-off-by: Sarat Vemulapalli * Updating spotless Signed-off-by: Sarat Vemulapalli --------- Signed-off-by: Sarat Vemulapalli --- CHANGELOG.md | 1 + .../extensions/DiscoveryExtensionNode.java | 33 +++- .../extensions/ExtensionsManager.java | 30 +-- .../extensions/ExtensionsSettings.java | 124 +++--------- .../DiscoveryExtensionNodeTests.java | 52 +++++ .../extensions/ExtensionsManagerTests.java | 178 +++++++----------- ...ExtensionTransportActionsHandlerTests.java | 16 +- .../rest/RestSendToExtensionActionTests.java | 15 +- .../src/test/resources/config/extensions.yml | 18 -- 9 files changed, 184 insertions(+), 283 deletions(-) create mode 100644 server/src/test/java/org/opensearch/extensions/DiscoveryExtensionNodeTests.java delete mode 100644 server/src/test/resources/config/extensions.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d371b56e930b..272f4deefd713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add GeoTile and GeoHash Grid aggregations on GeoShapes. ([#5589](https://github.com/opensearch-project/OpenSearch/pull/5589)) - Add support to disallow search request with preference parameter with strict weighted shard routing([#5874](https://github.com/opensearch-project/OpenSearch/pull/5874)) - Changing ExtensionActionRequest streaminput constructor to be public ([#6094](https://github.com/opensearch-project/OpenSearch/pull/6094)) +- Adds support for minimum compatible version for extensions ([#6003](https://github.com/opensearch-project/OpenSearch/pull/6003)) ### Dependencies - Update nebula-publishing-plugin to 19.2.0 ([#5704](https://github.com/opensearch-project/OpenSearch/pull/5704)) diff --git a/server/src/main/java/org/opensearch/extensions/DiscoveryExtensionNode.java b/server/src/main/java/org/opensearch/extensions/DiscoveryExtensionNode.java index 1cf3afd9568e6..7a15be49d86ee 100644 --- a/server/src/main/java/org/opensearch/extensions/DiscoveryExtensionNode.java +++ b/server/src/main/java/org/opensearch/extensions/DiscoveryExtensionNode.java @@ -8,6 +8,7 @@ package org.opensearch.extensions; +import org.opensearch.OpenSearchException; import org.opensearch.Version; import org.opensearch.cluster.node.DiscoveryNode; import org.opensearch.cluster.node.DiscoveryNodeRole; @@ -17,7 +18,6 @@ import org.opensearch.common.transport.TransportAddress; import org.opensearch.common.xcontent.ToXContentFragment; import org.opensearch.common.xcontent.XContentBuilder; -import org.opensearch.plugins.PluginInfo; import java.io.IOException; import java.util.ArrayList; @@ -32,30 +32,28 @@ */ public class DiscoveryExtensionNode extends DiscoveryNode implements Writeable, ToXContentFragment { - private final PluginInfo pluginInfo; + private Version minimumCompatibleVersion; private List dependencies = Collections.emptyList(); public DiscoveryExtensionNode( String name, String id, - String ephemeralId, - String hostName, - String hostAddress, TransportAddress address, Map attributes, Version version, - PluginInfo pluginInfo, + Version minimumCompatibleVersion, List dependencies ) { - super(name, id, ephemeralId, hostName, hostAddress, address, attributes, DiscoveryNodeRole.BUILT_IN_ROLES, version); - this.pluginInfo = pluginInfo; + super(name, id, address, attributes, DiscoveryNodeRole.BUILT_IN_ROLES, version); + this.minimumCompatibleVersion = minimumCompatibleVersion; this.dependencies = dependencies; + validate(); } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); - pluginInfo.writeTo(out); + Version.writeVersion(minimumCompatibleVersion, out); out.writeVInt(dependencies.size()); for (ExtensionDependency dependency : dependencies) { dependency.writeTo(out); @@ -70,7 +68,7 @@ public void writeTo(StreamOutput out) throws IOException { */ public DiscoveryExtensionNode(final StreamInput in) throws IOException { super(in); - this.pluginInfo = new PluginInfo(in); + minimumCompatibleVersion = Version.readVersion(in); int size = in.readVInt(); dependencies = new ArrayList<>(size); for (int i = 0; i < size; i++) { @@ -82,6 +80,10 @@ public List getDependencies() { return dependencies; } + public Version getMinimumCompatibleVersion() { + return minimumCompatibleVersion; + } + public boolean dependenciesContain(ExtensionDependency dependency) { for (ExtensionDependency extensiondependency : this.dependencies) { if (dependency.getUniqueId().equals(extensiondependency.getUniqueId()) @@ -92,6 +94,17 @@ public boolean dependenciesContain(ExtensionDependency dependency) { return false; } + private void validate() { + if (!Version.CURRENT.onOrAfter(minimumCompatibleVersion)) { + throw new OpenSearchException( + "Extension minimumCompatibleVersion: " + + minimumCompatibleVersion + + " is greater than current OpenSearch version: " + + Version.CURRENT + ); + } + } + @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { return null; diff --git a/server/src/main/java/org/opensearch/extensions/ExtensionsManager.java b/server/src/main/java/org/opensearch/extensions/ExtensionsManager.java index ca65215599891..500d06b3ccc3d 100644 --- a/server/src/main/java/org/opensearch/extensions/ExtensionsManager.java +++ b/server/src/main/java/org/opensearch/extensions/ExtensionsManager.java @@ -28,6 +28,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.message.ParameterizedMessage; +import org.opensearch.OpenSearchException; import org.opensearch.Version; import org.opensearch.action.admin.cluster.state.ClusterStateResponse; import org.opensearch.client.node.NodeClient; @@ -57,7 +58,6 @@ import org.opensearch.index.IndicesModuleResponse; import org.opensearch.index.shard.IndexEventListener; import org.opensearch.indices.cluster.IndicesClusterStateService; -import org.opensearch.plugins.PluginInfo; import org.opensearch.rest.RestController; import org.opensearch.threadpool.ThreadPool; import org.opensearch.transport.TransportException; @@ -289,7 +289,7 @@ private void registerRequestHandler() { * Load and populate all extensions */ private void discover() throws IOException { - logger.info("Extensions Config Directory :" + extensionsPath.toString()); + logger.info("Loading extensions : {}", extensionsPath); if (!FileSystemUtils.isAccessibleDirectory(extensionsPath, logger)) { return; } @@ -308,7 +308,7 @@ private void discover() throws IOException { logger.info("Loaded all extensions"); } } else { - logger.info("Extensions.yml file is not present. No extensions will be loaded."); + logger.warn("Extensions.yml file is not present. No extensions will be loaded."); } } @@ -324,27 +324,16 @@ private void loadExtension(Extension extension) throws IOException { DiscoveryExtensionNode discoveryExtensionNode = new DiscoveryExtensionNode( extension.getName(), extension.getUniqueId(), - // placeholder for ephemeral id, will change with POC discovery - extension.getUniqueId(), - extension.getHostName(), - extension.getHostAddress(), new TransportAddress(InetAddress.getByName(extension.getHostAddress()), Integer.parseInt(extension.getPort())), new HashMap(), Version.fromString(extension.getOpensearchVersion()), - new PluginInfo( - extension.getName(), - extension.getDescription(), - extension.getVersion(), - Version.fromString(extension.getOpensearchVersion()), - extension.getJavaVersion(), - extension.getClassName(), - new ArrayList(), - Boolean.parseBoolean(extension.hasNativeController()) - ), + Version.fromString(extension.getMinimumCompatibleVersion()), extension.getDependencies() ); extensionIdMap.put(extension.getUniqueId(), discoveryExtensionNode); logger.info("Loaded extension with uniqueId " + extension.getUniqueId() + ": " + extension); + } catch (OpenSearchException e) { + logger.error("Could not load extension with uniqueId " + extension.getUniqueId() + " due to " + e); } catch (IllegalArgumentException e) { throw e; } @@ -580,16 +569,11 @@ private ExtensionsSettings readFromExtensionsYml(Path filePath) throws IOExcepti new Extension( extensionMap.get("name").toString(), extensionMap.get("uniqueId").toString(), - extensionMap.get("hostName").toString(), extensionMap.get("hostAddress").toString(), extensionMap.get("port").toString(), extensionMap.get("version").toString(), - extensionMap.get("description").toString(), extensionMap.get("opensearchVersion").toString(), - extensionMap.get("javaVersion").toString(), - extensionMap.get("className").toString(), - extensionMap.get("customFolderName").toString(), - extensionMap.get("hasNativeController").toString() + extensionMap.get("minimumCompatibleVersion").toString() ) ); } diff --git a/server/src/main/java/org/opensearch/extensions/ExtensionsSettings.java b/server/src/main/java/org/opensearch/extensions/ExtensionsSettings.java index 01c8223075ada..51815a002d1df 100644 --- a/server/src/main/java/org/opensearch/extensions/ExtensionsSettings.java +++ b/server/src/main/java/org/opensearch/extensions/ExtensionsSettings.java @@ -38,59 +38,39 @@ public static class Extension { private String name; private String uniqueId; - private String hostName; private String hostAddress; private String port; private String version; - private String description; private String opensearchVersion; - private String jvmVersion; - private String className; - private String customFolderName; - private String hasNativeController; + private String minimumCompatibleVersion; private List dependencies = Collections.emptyList(); public Extension( String name, String uniqueId, - String hostName, String hostAddress, String port, String version, - String description, String opensearchVersion, - String jvmVersion, - String className, - String customFolderName, - String hasNativeController + String minimumCompatibleVersion ) { this.name = name; this.uniqueId = uniqueId; - this.hostName = hostName; this.hostAddress = hostAddress; this.port = port; this.version = version; - this.description = description; this.opensearchVersion = opensearchVersion; - this.jvmVersion = jvmVersion; - this.className = className; - this.customFolderName = customFolderName; - this.hasNativeController = hasNativeController; + this.minimumCompatibleVersion = minimumCompatibleVersion; } public Extension() { name = ""; uniqueId = ""; - hostName = ""; hostAddress = ""; port = ""; version = ""; - description = ""; opensearchVersion = ""; - jvmVersion = ""; - className = ""; - customFolderName = ""; - hasNativeController = "false"; + minimumCompatibleVersion = ""; } public String getName() { @@ -109,14 +89,6 @@ public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } - public String getHostName() { - return hostName; - } - - public void setHostName(String hostName) { - this.hostName = hostName; - } - public String getHostAddress() { return hostAddress; } @@ -141,43 +113,6 @@ public void setVersion(String version) { this.version = version; } - @Override - public String toString() { - return "Extension [className=" - + className - + ", customFolderName=" - + customFolderName - + ", description=" - + description - + ", hasNativeController=" - + hasNativeController - + ", hostAddress=" - + hostAddress - + ", hostName=" - + hostName - + ", jvmVersion=" - + jvmVersion - + ", name=" - + name - + ", opensearchVersion=" - + opensearchVersion - + ", port=" - + port - + ", uniqueId=" - + uniqueId - + ", version=" - + version - + "]"; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - public String getOpensearchVersion() { return opensearchVersion; } @@ -186,40 +121,35 @@ public void setOpensearchVersion(String opensearchVersion) { this.opensearchVersion = opensearchVersion; } - public String getJavaVersion() { - return jvmVersion; - } - - public void setJavaVersion(String jvmVersion) { - this.jvmVersion = jvmVersion; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - public String getCustomFolderName() { - return customFolderName; - } - - public void setCustomFolderName(String customFolderName) { - this.customFolderName = customFolderName; + public List getDependencies() { + return dependencies; } - public String hasNativeController() { - return hasNativeController; + public String getMinimumCompatibleVersion() { + return minimumCompatibleVersion; } - public void setHasNativeController(String hasNativeController) { - this.hasNativeController = hasNativeController; + public void setMinimumCompatibleVersion(String minimumCompatibleVersion) { + this.minimumCompatibleVersion = minimumCompatibleVersion; } - public List getDependencies() { - return dependencies; + @Override + public String toString() { + return "Extension [name=" + + name + + ", uniqueId=" + + uniqueId + + ", hostAddress=" + + hostAddress + + ", port=" + + port + + ", version=" + + version + + ", opensearchVersion=" + + opensearchVersion + + ", minimumCompatibleVersion=" + + minimumCompatibleVersion + + "]"; } } diff --git a/server/src/test/java/org/opensearch/extensions/DiscoveryExtensionNodeTests.java b/server/src/test/java/org/opensearch/extensions/DiscoveryExtensionNodeTests.java new file mode 100644 index 0000000000000..578e7503b76a9 --- /dev/null +++ b/server/src/test/java/org/opensearch/extensions/DiscoveryExtensionNodeTests.java @@ -0,0 +1,52 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.extensions; + +import org.opensearch.OpenSearchException; +import org.opensearch.Version; +import org.opensearch.common.transport.TransportAddress; +import org.opensearch.test.OpenSearchTestCase; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.HashMap; + +public class DiscoveryExtensionNodeTests extends OpenSearchTestCase { + + public void testExtensionNode() throws UnknownHostException { + DiscoveryExtensionNode extensionNode = new DiscoveryExtensionNode( + "firstExtension", + "extensionUniqueId1", + new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), + new HashMap(), + Version.fromString("3.0.0"), + // minimum compatible version + Version.fromString("3.0.0"), + Collections.emptyList() + ); + assertTrue(Version.CURRENT.onOrAfter(extensionNode.getMinimumCompatibleVersion())); + } + + public void testIncompatibleExtensionNode() throws UnknownHostException { + expectThrows( + OpenSearchException.class, + () -> new DiscoveryExtensionNode( + "firstExtension", + "extensionUniqueId1", + new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), + new HashMap(), + Version.fromString("3.0.0"), + // minimum compatible version + Version.fromString("3.99.0"), + Collections.emptyList() + ) + ); + } +} diff --git a/server/src/test/java/org/opensearch/extensions/ExtensionsManagerTests.java b/server/src/test/java/org/opensearch/extensions/ExtensionsManagerTests.java index 5de2113672ca5..44ca2175621e7 100644 --- a/server/src/test/java/org/opensearch/extensions/ExtensionsManagerTests.java +++ b/server/src/test/java/org/opensearch/extensions/ExtensionsManagerTests.java @@ -74,7 +74,6 @@ import org.opensearch.index.engine.EngineConfigFactory; import org.opensearch.index.engine.InternalEngineFactory; import org.opensearch.indices.breaker.NoneCircuitBreakerService; -import org.opensearch.plugins.PluginInfo; import org.opensearch.rest.RestController; import org.opensearch.test.FeatureFlagSetter; import org.opensearch.test.IndexSettingsModule; @@ -111,28 +110,18 @@ public class ExtensionsManagerTests extends OpenSearchTestCase { "extensions:", " - name: firstExtension", " uniqueId: uniqueid1", - " hostName: 'myIndependentPluginHost1'", " hostAddress: '127.0.0.0'", " port: '9300'", " version: '0.0.7'", - " description: Fake description 1", " opensearchVersion: '3.0.0'", - " javaVersion: '14'", - " className: fakeClass1", - " customFolderName: fakeFolder1", - " hasNativeController: false", + " minimumCompatibleVersion: '3.0.0'", " - name: secondExtension", " uniqueId: 'uniqueid2'", - " hostName: 'myIndependentPluginHost2'", " hostAddress: '127.0.0.1'", " port: '9301'", " version: '3.14.16'", - " description: Fake description 2", " opensearchVersion: '2.0.0'", - " javaVersion: '17'", - " className: fakeClass2", - " customFolderName: fakeFolder2", - " hasNativeController: true", + " minimumCompatibleVersion: '2.0.0'", " dependencies:", " - uniqueId: 'uniqueid0'", " - version: '2.0.0'" @@ -184,22 +173,10 @@ public void setup() throws Exception { extensionNode = new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), Collections.emptyList() ); client = new NoOpNodeClient(this.getTestName()); @@ -220,63 +197,48 @@ public void testDiscover() throws Exception { ExtensionsManager extensionsManager = new ExtensionsManager(settings, extensionDir); - List expectedUninitializedExtensions = new ArrayList(); + List expectedExtensions = new ArrayList(); String expectedUniqueId = "uniqueid0"; Version expectedVersion = Version.fromString("2.0.0"); ExtensionDependency expectedDependency = new ExtensionDependency(expectedUniqueId, expectedVersion); - expectedUninitializedExtensions.add( + expectedExtensions.add( new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), Collections.emptyList() ) ); - expectedUninitializedExtensions.add( + expectedExtensions.add( new DiscoveryExtensionNode( "secondExtension", "uniqueid2", - "uniqueid2", - "myIndependentPluginHost2", - "127.0.0.1", - new TransportAddress(TransportAddress.META_ADDRESS, 9301), + new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301), new HashMap(), Version.fromString("2.0.0"), - new PluginInfo( - "secondExtension", - "Fake description 2", - "3.14.16", - Version.fromString("2.0.0"), - "17", - "fakeClass2", - new ArrayList(), - true - ), + Version.fromString("2.0.0"), List.of(expectedDependency) ) ); - assertEquals(expectedUninitializedExtensions.size(), extensionsManager.getExtensionIdMap().values().size()); - assertEquals(List.of(expectedDependency), expectedUninitializedExtensions.get(1).getDependencies()); - assertTrue(expectedUninitializedExtensions.containsAll(extensionsManager.getExtensionIdMap().values())); - assertTrue(extensionsManager.getExtensionIdMap().values().containsAll(expectedUninitializedExtensions)); + assertEquals(expectedExtensions.size(), extensionsManager.getExtensionIdMap().values().size()); + assertEquals(List.of(expectedDependency), expectedExtensions.get(1).getDependencies()); + for (DiscoveryExtensionNode extension : expectedExtensions) { + DiscoveryExtensionNode initializedExtension = extensionsManager.getExtensionIdMap().get(extension.getId()); + assertEquals(extension.getName(), initializedExtension.getName()); + assertEquals(extension.getId(), initializedExtension.getId()); + assertEquals(extension.getAddress(), initializedExtension.getAddress()); + assertEquals(extension.getAttributes(), initializedExtension.getAttributes()); + assertEquals(extension.getVersion(), initializedExtension.getVersion()); + assertEquals(extension.getMinimumCompatibleVersion(), initializedExtension.getMinimumCompatibleVersion()); + // TODO: Will fail due to bug : https://github.com/opensearch-project/OpenSearch/issues/6115 + // assertEquals(extension.getDependencies(), initializedExtension.getDependencies()); + } } public void testNonUniqueExtensionsDiscovery() throws Exception { @@ -288,35 +250,32 @@ public void testNonUniqueExtensionsDiscovery() throws Exception { ExtensionsManager extensionsManager = new ExtensionsManager(settings, emptyExtensionDir); - List expectedUninitializedExtensions = new ArrayList(); + List expectedExtensions = new ArrayList(); - expectedUninitializedExtensions.add( + expectedExtensions.add( new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), Collections.emptyList() ) ); - assertEquals(expectedUninitializedExtensions.size(), extensionsManager.getExtensionIdMap().values().size()); - assertTrue(expectedUninitializedExtensions.containsAll(extensionsManager.getExtensionIdMap().values())); - assertTrue(extensionsManager.getExtensionIdMap().values().containsAll(expectedUninitializedExtensions)); - assertTrue(expectedUninitializedExtensions.containsAll(emptyList())); + assertEquals(expectedExtensions.size(), extensionsManager.getExtensionIdMap().values().size()); + for (DiscoveryExtensionNode extension : expectedExtensions) { + DiscoveryExtensionNode initializedExtension = extensionsManager.getExtensionIdMap().get(extension.getId()); + assertEquals(extension.getName(), initializedExtension.getName()); + assertEquals(extension.getId(), initializedExtension.getId()); + assertEquals(extension.getAddress(), initializedExtension.getAddress()); + assertEquals(extension.getAttributes(), initializedExtension.getAttributes()); + assertEquals(extension.getVersion(), initializedExtension.getVersion()); + assertEquals(extension.getMinimumCompatibleVersion(), initializedExtension.getMinimumCompatibleVersion()); + } + assertTrue(expectedExtensions.containsAll(emptyList())); + // TODO: Will fail due to bug : https://github.com/opensearch-project/OpenSearch/issues/6115 + // assertEquals(extension.getDependencies(), initializedExtension.getDependencies()); } public void testDiscoveryExtension() throws Exception { @@ -327,22 +286,10 @@ public void testDiscoveryExtension() throws Exception { DiscoveryExtensionNode discoveryExtensionNode = new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), List.of(expectedDependency) ); @@ -397,7 +344,7 @@ public void testNoExtensionsFile() throws Exception { new MockLogAppender.SeenEventExpectation( "No Extensions File Present", "org.opensearch.extensions.ExtensionsManager", - Level.INFO, + Level.WARN, "Extensions.yml file is not present. No extensions will be loaded." ) ); @@ -581,22 +528,10 @@ public void testExtensionDependencyResponse() throws Exception { new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), List.of(expectedDependency) ) ); @@ -837,6 +772,37 @@ public void testOnIndexModule() throws Exception { } + public void testIncompatibleExtensionRegistration() throws IOException, IllegalAccessException { + + try (MockLogAppender mockLogAppender = MockLogAppender.createForLoggers(LogManager.getLogger(ExtensionsManager.class))) { + + mockLogAppender.addExpectation( + new MockLogAppender.SeenEventExpectation( + "Could not load extension with uniqueId", + "org.opensearch.extensions.ExtensionsManager", + Level.ERROR, + "Could not load extension with uniqueId uniqueid1 due to OpenSearchException[Extension minimumCompatibleVersion: 3.99.0 is greater than current" + ) + ); + + List incompatibleExtension = Arrays.asList( + "extensions:", + " - name: firstExtension", + " uniqueId: uniqueid1", + " hostAddress: '127.0.0.0'", + " port: '9300'", + " version: '0.0.7'", + " opensearchVersion: '3.0.0'", + " minimumCompatibleVersion: '3.99.0'" + ); + + Files.write(extensionDir.resolve("extensions.yml"), incompatibleExtension, StandardCharsets.UTF_8); + ExtensionsManager extensionsManager = new ExtensionsManager(settings, extensionDir); + assertEquals(0, extensionsManager.getExtensionIdMap().values().size()); + mockLogAppender.assertAllExpectationsMatched(); + } + } + private void initialize(ExtensionsManager extensionsManager) { transportService.start(); transportService.acceptIncomingRequests(); diff --git a/server/src/test/java/org/opensearch/extensions/action/ExtensionTransportActionsHandlerTests.java b/server/src/test/java/org/opensearch/extensions/action/ExtensionTransportActionsHandlerTests.java index 276e47d7f55a8..551fb8a9bb277 100644 --- a/server/src/test/java/org/opensearch/extensions/action/ExtensionTransportActionsHandlerTests.java +++ b/server/src/test/java/org/opensearch/extensions/action/ExtensionTransportActionsHandlerTests.java @@ -24,7 +24,6 @@ import org.opensearch.extensions.RegisterTransportActionsRequest; import org.opensearch.extensions.rest.RestSendToExtensionActionTests; import org.opensearch.indices.breaker.NoneCircuitBreakerService; -import org.opensearch.plugins.PluginInfo; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.test.client.NoOpNodeClient; import org.opensearch.test.transport.MockTransportService; @@ -37,7 +36,6 @@ import java.net.InetAddress; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -85,22 +83,10 @@ public void setup() throws Exception { discoveryExtensionNode = new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), Collections.emptyList() ); client = new NoOpNodeClient(this.getTestName()); diff --git a/server/src/test/java/org/opensearch/extensions/rest/RestSendToExtensionActionTests.java b/server/src/test/java/org/opensearch/extensions/rest/RestSendToExtensionActionTests.java index 97eeae8fb95af..3b7f8b4c52c05 100644 --- a/server/src/test/java/org/opensearch/extensions/rest/RestSendToExtensionActionTests.java +++ b/server/src/test/java/org/opensearch/extensions/rest/RestSendToExtensionActionTests.java @@ -30,7 +30,6 @@ import org.opensearch.common.util.PageCacheRecycler; import org.opensearch.extensions.DiscoveryExtensionNode; import org.opensearch.indices.breaker.NoneCircuitBreakerService; -import org.opensearch.plugins.PluginInfo; import org.opensearch.rest.RestHandler.Route; import org.opensearch.rest.RestRequest.Method; import org.opensearch.test.OpenSearchTestCase; @@ -78,22 +77,10 @@ public void setup() throws Exception { discoveryExtensionNode = new DiscoveryExtensionNode( "firstExtension", "uniqueid1", - "uniqueid1", - "myIndependentPluginHost1", - "127.0.0.0", new TransportAddress(InetAddress.getByName("127.0.0.0"), 9300), new HashMap(), Version.fromString("3.0.0"), - new PluginInfo( - "firstExtension", - "Fake description 1", - "0.0.7", - Version.fromString("3.0.0"), - "14", - "fakeClass1", - new ArrayList(), - false - ), + Version.fromString("3.0.0"), Collections.emptyList() ); } diff --git a/server/src/test/resources/config/extensions.yml b/server/src/test/resources/config/extensions.yml deleted file mode 100644 index e02a2913385d9..0000000000000 --- a/server/src/test/resources/config/extensions.yml +++ /dev/null @@ -1,18 +0,0 @@ -extensions: - - name: firstExtension - uniqueId: uniqueid1 - hostName: 'myIndependentPluginHost1' - hostAddress: '127.0.0.0' - port: '9300' - version: '3.0.0' - - name: "secondExtension" - uniqueId: 'uniqueid2' - dependencies: - - name: 'uniqueid0' - version: '2.0.0' - - name: 'uniqueid1' - version: '3.0.0' - hostName: 'myIndependentPluginHost2' - hostAddress: '127.0.0.1' - port: '9301' - version: '2.0.0'