Skip to content

Commit

Permalink
[Extensions] Add support for minimum compatible version for extension…
Browse files Browse the repository at this point in the history
…s with OpenSearch (#6003)

* Refactoring extensions config to have real useable values

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Removing werror

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Removing extensions feature flag from gradle run

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Removing description

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Adding MinimumCompatible Version for extensions

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Adding changelog

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Updating changelog

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Addressing comments

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Addressing comments

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Removing debug lines

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Removing another log line

Signed-off-by: Sarat Vemulapalli <[email protected]>

* Updating spotless

Signed-off-by: Sarat Vemulapalli <[email protected]>

---------

Signed-off-by: Sarat Vemulapalli <[email protected]>
  • Loading branch information
saratvemulapalli committed Feb 1, 2023
1 parent fd3812c commit 6176ddc
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 283 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -32,30 +32,28 @@
*/
public class DiscoveryExtensionNode extends DiscoveryNode implements Writeable, ToXContentFragment {

private final PluginInfo pluginInfo;
private Version minimumCompatibleVersion;
private List<ExtensionDependency> dependencies = Collections.emptyList();

public DiscoveryExtensionNode(
String name,
String id,
String ephemeralId,
String hostName,
String hostAddress,
TransportAddress address,
Map<String, String> attributes,
Version version,
PluginInfo pluginInfo,
Version minimumCompatibleVersion,
List<ExtensionDependency> 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);
Expand All @@ -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++) {
Expand All @@ -82,6 +80,10 @@ public List<ExtensionDependency> getDependencies() {
return dependencies;
}

public Version getMinimumCompatibleVersion() {
return minimumCompatibleVersion;
}

public boolean dependenciesContain(ExtensionDependency dependency) {
for (ExtensionDependency extensiondependency : this.dependencies) {
if (dependency.getUniqueId().equals(extensiondependency.getUniqueId())
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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.");
}
}

Expand All @@ -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<String, String>(),
Version.fromString(extension.getOpensearchVersion()),
new PluginInfo(
extension.getName(),
extension.getDescription(),
extension.getVersion(),
Version.fromString(extension.getOpensearchVersion()),
extension.getJavaVersion(),
extension.getClassName(),
new ArrayList<String>(),
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;
}
Expand Down Expand Up @@ -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()
)
);
}
Expand Down
124 changes: 27 additions & 97 deletions server/src/main/java/org/opensearch/extensions/ExtensionsSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<ExtensionDependency> 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() {
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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<ExtensionDependency> 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<ExtensionDependency> getDependencies() {
return dependencies;
@Override
public String toString() {
return "Extension [name="
+ name
+ ", uniqueId="
+ uniqueId
+ ", hostAddress="
+ hostAddress
+ ", port="
+ port
+ ", version="
+ version
+ ", opensearchVersion="
+ opensearchVersion
+ ", minimumCompatibleVersion="
+ minimumCompatibleVersion
+ "]";
}

}
Expand Down
Loading

0 comments on commit 6176ddc

Please sign in to comment.