diff --git a/CHANGELOG.md b/CHANGELOG.md index 5375d13323d5c..6b9c7ffc05795 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Pass registry of headers from ActionPlugin.getRestHeaders to ActionPlugin.getRestHandlerWrapper ([#19875](https://github.com/opensearch-project/OpenSearch/pull/19875)) - Refactor the Condition.Stats and DirectoryFileTransferTracker.Stats class to use the Builder pattern instead of constructors ([#19862](https://github.com/opensearch-project/OpenSearch/pull/19862)) - Refactor the RemoteTranslogTransferTracker.Stats and RemoteSegmentTransferTracker.Stats class to use the Builder pattern instead of constructors ([#19837](https://github.com/opensearch-project/OpenSearch/pull/19837)) +- Add RangeSemver for `dependencies` in `plugin-descriptor.properties` ([#19939](https://github.com/opensearch-project/OpenSearch/pull/19939)) ### Fixed - Fix Allocation and Rebalance Constraints of WeightFunction are incorrectly reset ([#19012](https://github.com/opensearch-project/OpenSearch/pull/19012)) diff --git a/libs/core/src/main/java/org/opensearch/semver/SemverRange.java b/libs/core/src/main/java/org/opensearch/semver/SemverRange.java index 94ec876178ea5..c2699bd97db53 100644 --- a/libs/core/src/main/java/org/opensearch/semver/SemverRange.java +++ b/libs/core/src/main/java/org/opensearch/semver/SemverRange.java @@ -43,7 +43,7 @@ @PublicApi(since = "2.13.0") public class SemverRange implements ToXContentFragment { - private static final Pattern RANGE_PATTERN = Pattern.compile("([\\[\\(])([\\d.]+)\\s*,\\s*([\\d.]+)([\\]\\)])"); + public static final Pattern RANGE_PATTERN = Pattern.compile("([\\[\\(])([\\d.]+)\\s*,\\s*([\\d.]+)([\\]\\)])"); private final Version rangeVersion; private final RangeOperator rangeOperator; diff --git a/server/src/main/java/org/opensearch/plugins/PluginInfo.java b/server/src/main/java/org/opensearch/plugins/PluginInfo.java index 323e061aea567..e718cc5611358 100644 --- a/server/src/main/java/org/opensearch/plugins/PluginInfo.java +++ b/server/src/main/java/org/opensearch/plugins/PluginInfo.java @@ -63,6 +63,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static org.opensearch.semver.SemverRange.RANGE_PATTERN; + /** * An in-memory representation of the plugin descriptor. * @@ -322,13 +324,17 @@ public static PluginInfo readFromProperties(final Path path) throws IOException if (dependenciesMap.keySet().stream().noneMatch(s -> s.equals("opensearch"))) { throw new IllegalArgumentException("Only opensearch is allowed to be specified as a plugin dependency: " + dependenciesMap); } - String[] ranges = dependenciesMap.get("opensearch").split(","); - if (ranges.length != 1) { + String opensearchDependencyVersion = dependenciesMap.get("opensearch"); + String[] ranges = opensearchDependencyVersion.split(","); + String opensearchVersion = ranges[0]; + if (RANGE_PATTERN.matcher(opensearchDependencyVersion).matches()) { + opensearchVersion = opensearchDependencyVersion; + } else if (ranges.length != 1) { throw new IllegalArgumentException( - "Exactly one range is allowed to be specified in dependencies for the plugin [\" + name + \"]" + "Exactly one range is allowed to be specified in dependencies for the plugin [" + name + "]" ); } - opensearchVersionRanges.add(SemverRange.fromString(ranges[0].trim())); + opensearchVersionRanges.add(SemverRange.fromString(opensearchVersion.trim())); } final String javaVersionString = propsMap.remove("java.version"); diff --git a/server/src/test/java/org/opensearch/plugins/PluginInfoTests.java b/server/src/test/java/org/opensearch/plugins/PluginInfoTests.java index f54a7d3227fac..bfa2f9a537462 100644 --- a/server/src/test/java/org/opensearch/plugins/PluginInfoTests.java +++ b/server/src/test/java/org/opensearch/plugins/PluginInfoTests.java @@ -482,6 +482,28 @@ public void testMultipleDependencies() throws Exception { assertThat(e.getMessage(), containsString("Exactly one dependency is allowed to be specified in plugin descriptor properties")); } + public void testRangeSemverOnDependencies() throws Exception { + String opensearchRange = "[" + Version.V_2_0_0.toString() + "," + Version.V_3_0_0.toString() + ")"; + Path pluginDir = createTempDir().resolve("fake-plugin"); + PluginTestUtil.writePluginProperties( + pluginDir, + "description", + "fake desc", + "name", + "my_plugin", + "version", + "1.0", + "dependencies", + "{opensearch:\"" + opensearchRange + "\" }", + "java.version", + System.getProperty("java.specification.version"), + "classname", + "FakePlugin" + ); + PluginInfo pluginInfo = PluginInfo.readFromProperties(pluginDir); + assertEquals(SemverRange.fromString(opensearchRange).toString(), pluginInfo.getOpenSearchVersionRangesString()); + } + public void testNonOpenSearchDependency() throws Exception { Path pluginDir = createTempDir().resolve("fake-plugin"); PluginTestUtil.writePluginProperties(