Skip to content

Commit 17017a7

Browse files
gertjanalwendigo
authored andcommitted
Support multiple paths for plugin.dir
1 parent 6b8872e commit 17017a7

File tree

6 files changed

+54
-15
lines changed

6 files changed

+54
-15
lines changed

core/trino-main/src/main/java/io/trino/server/ServerPluginsProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@
3636
public class ServerPluginsProvider
3737
implements PluginsProvider
3838
{
39-
private final File installedPluginsDir;
39+
private final List<File> installedPluginsDirs;
4040
private final Executor executor;
4141

4242
@Inject
4343
public ServerPluginsProvider(ServerPluginsProviderConfig config, @ForStartup Executor executor)
4444
{
45-
this.installedPluginsDir = config.getInstalledPluginsDir();
45+
this.installedPluginsDirs = config.getInstalledPluginsDirs();
4646
this.executor = requireNonNull(executor, "executor is null");
4747
}
4848

@@ -51,7 +51,8 @@ public void loadPlugins(Loader loader, ClassLoaderFactory createClassLoader)
5151
{
5252
executeUntilFailure(
5353
executor,
54-
listFiles(installedPluginsDir).stream()
54+
installedPluginsDirs.stream()
55+
.flatMap(installedPluginsDir -> listFiles(installedPluginsDir).stream())
5556
.filter(File::isDirectory)
5657
.map(file -> (Callable<?>) () -> {
5758
loader.load(file.getAbsolutePath(), () ->

core/trino-main/src/main/java/io/trino/server/ServerPluginsProviderConfig.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,28 @@
1313
*/
1414
package io.trino.server;
1515

16+
import com.google.common.collect.ImmutableList;
1617
import io.airlift.configuration.Config;
18+
import io.airlift.configuration.ConfigDescription;
19+
import io.airlift.configuration.validation.FileExists;
1720

1821
import java.io.File;
22+
import java.util.List;
1923

2024
public class ServerPluginsProviderConfig
2125
{
22-
private File installedPluginsDir = new File("plugin");
26+
private List<File> installedPluginsDirs = ImmutableList.of(new File("plugin"));
2327

24-
public File getInstalledPluginsDir()
28+
public List<File> getInstalledPluginsDirs()
2529
{
26-
return installedPluginsDir;
30+
return installedPluginsDirs;
2731
}
2832

2933
@Config("plugin.dir")
30-
public ServerPluginsProviderConfig setInstalledPluginsDir(File installedPluginsDir)
34+
@ConfigDescription("Comma separated list of root directories where the plugins are located")
35+
public ServerPluginsProviderConfig setInstalledPluginsDirs(List<@FileExists File> installedPluginsDirs)
3136
{
32-
this.installedPluginsDir = installedPluginsDir;
37+
this.installedPluginsDirs = ImmutableList.copyOf(installedPluginsDirs);
3338
return this;
3439
}
3540
}

core/trino-main/src/test/java/io/trino/server/TestServerPluginsProviderConfig.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.junit.jupiter.api.Test;
1818

1919
import java.io.File;
20+
import java.util.List;
2021
import java.util.Map;
2122

2223
import static io.airlift.configuration.testing.ConfigAssertions.assertFullMapping;
@@ -29,7 +30,7 @@ public class TestServerPluginsProviderConfig
2930
public void testDefaults()
3031
{
3132
assertRecordedDefaults(recordDefaults(ServerPluginsProviderConfig.class)
32-
.setInstalledPluginsDir(new File("plugin")));
33+
.setInstalledPluginsDirs(List.of(new File("plugin"))));
3334
}
3435

3536
@Test
@@ -38,7 +39,18 @@ public void testExplicitPropertyMappings()
3839
Map<String, String> properties = ImmutableMap.of("plugin.dir", "plugins-dir");
3940

4041
ServerPluginsProviderConfig expected = new ServerPluginsProviderConfig()
41-
.setInstalledPluginsDir(new File("plugins-dir"));
42+
.setInstalledPluginsDirs(List.of(new File("plugins-dir")));
43+
44+
assertFullMapping(properties, expected);
45+
}
46+
47+
@Test
48+
public void testExplicitPropertyMappingMultiDir()
49+
{
50+
Map<String, String> properties = ImmutableMap.of("plugin.dir", "plugins-dir,external-dir");
51+
52+
ServerPluginsProviderConfig expected = new ServerPluginsProviderConfig()
53+
.setInstalledPluginsDirs(List.of(new File("plugins-dir"), new File("external-dir")));
4254

4355
assertFullMapping(properties, expected);
4456
}

testing/trino-plugin-reader/src/main/java/io/trino/server/PluginLoader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ public static void printPluginFeatures(Plugin plugin)
6767
plugin.getExchangeManagerFactories().forEach(factory -> System.out.println(EXCHANGE_MANAGER + factory.getName()));
6868
}
6969

70-
public static List<Plugin> loadPlugins(File path)
70+
public static List<Plugin> loadPlugins(List<File> path)
7171
{
7272
ServerPluginsProviderConfig config = new ServerPluginsProviderConfig();
73-
config.setInstalledPluginsDir(path);
73+
config.setInstalledPluginsDirs(path);
7474
ServerPluginsProvider pluginsProvider = new ServerPluginsProvider(config, directExecutor());
7575
ImmutableList.Builder<Plugin> plugins = ImmutableList.builder();
7676
pluginsProvider.loadPlugins((plugin, createClassLoader) -> loadPlugin(createClassLoader, plugins), PluginManager::createClassLoader);

testing/trino-plugin-reader/src/main/java/io/trino/server/PluginReader.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
*/
1414
package io.trino.server;
1515

16+
import com.google.common.collect.ImmutableList;
1617
import io.airlift.log.Logger;
1718
import io.trino.spi.Plugin;
1819
import picocli.CommandLine;
@@ -45,8 +46,8 @@ public class PluginReader
4546
@Option(names = {"-i", "--impacted-modules"}, description = "Impacted modules file generated by the gitflow-incremental-builder (GIB) Maven plugin")
4647
private Optional<File> impactedModulesFile;
4748

48-
@Option(names = {"-p", "--plugin-dir"}, description = "Trino plugin directory")
49-
private File pluginDir = new File("plugin");
49+
@Option(names = {"-p", "--plugin-dir"}, description = "Trino plugin directory", arity = "1..*")
50+
private List<File> pluginDirs = ImmutableList.of(new File("plugin"));
5051

5152
@Option(names = {"-r", "--root-pom"}, description = "Trino root module pom.xml")
5253
private File rootPom = new File("pom.xml");
@@ -82,7 +83,7 @@ public Integer call()
8283
}
8384
}
8485

85-
Map<String, Plugin> plugins = loadPlugins(pluginDir).stream()
86+
Map<String, Plugin> plugins = loadPlugins(pluginDirs).stream()
8687
.collect(toMap(plugin -> plugin.getClass().getName(), identity()));
8788
modulesStream.forEach(entry -> {
8889
if (!plugins.containsKey(entry.getValue())) {

testing/trino-plugin-reader/src/test/java/io/trino/server/TestPluginReader.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
package io.trino.server;
1515

1616
import org.junit.jupiter.api.Test;
17+
import org.junit.jupiter.api.io.TempDir;
1718
import picocli.CommandLine;
1819

1920
import java.io.PrintWriter;
2021
import java.io.StringWriter;
22+
import java.nio.file.Path;
2123

2224
import static org.assertj.core.api.Assertions.assertThat;
2325

@@ -39,4 +41,22 @@ void testCall()
3941
assertThat(exitCode).isEqualTo(0);
4042
assertThat(writer.toString()).isEqualTo("");
4143
}
44+
45+
@Test
46+
void testCallMultiplePluginDirs(@TempDir Path tempDir)
47+
{
48+
PluginReader pluginReader = new PluginReader();
49+
StringWriter writer = new StringWriter();
50+
CommandLine cmd = new CommandLine(pluginReader)
51+
.setOut(new PrintWriter(writer))
52+
.setErr(new PrintWriter(writer));
53+
54+
int exitCode = cmd.execute(
55+
"--impacted-modules", "src/test/resources/gib-impacted.log",
56+
"--plugin-dir", "src/test/resources/server-plugins",
57+
"--plugin-dir", tempDir.toString(),
58+
"--root-pom", "src/test/resources/pom.xml");
59+
assertThat(exitCode).isEqualTo(0);
60+
assertThat(writer.toString()).isEqualTo("");
61+
}
4262
}

0 commit comments

Comments
 (0)