You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vk...@apache.org on 2020/12/23 19:15:42 UTC
[ignite-3] branch main updated: IGNITE-13784 Update 'module list'
with information about installed modules (#13)
This is an automated email from the ASF dual-hosted git repository.
vkulichenko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new d1ce2a2 IGNITE-13784 Update 'module list' with information about installed modules (#13)
d1ce2a2 is described below
commit d1ce2a2563b8bc6e946dde99002c61c666d33ff2
Author: Kirill Gusakov <kg...@gmail.com>
AuthorDate: Wed Dec 23 22:15:34 2020 +0300
IGNITE-13784 Update 'module list' with information about installed modules (#13)
---
.../ignite/cli/builtins/module/ModuleManager.java | 4 +-
.../ignite/cli/builtins/module/ModuleStorage.java | 15 ++++--
.../org/apache/ignite/cli/spec/IgniteCliSpec.java | 23 +++-----
.../apache/ignite/cli/spec/ModuleCommandSpec.java | 47 ++++++++++++++--
.../apache/ignite/cli/IgniteCliInterfaceTest.java | 62 +++++++++++++++-------
5 files changed, 107 insertions(+), 44 deletions(-)
diff --git a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleManager.java b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleManager.java
index 5add240..c829d6d 100644
--- a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleManager.java
+++ b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleManager.java
@@ -72,7 +72,7 @@ public class ModuleManager {
repositories
);
moduleStorage.saveModule(new ModuleStorage.ModuleDefinition(
- name,
+ mavenCoordinates.groupId + ":" + mavenCoordinates.artifactId + ":" + mavenCoordinates.version,
resolveResult.artifacts(),
new ArrayList<>(),
ModuleStorage.SourceType.Maven,
@@ -130,7 +130,7 @@ public class ModuleManager {
name,
libsResolveResults.stream().flatMap(r -> r.artifacts().stream()).collect(Collectors.toList()),
cliResolvResults.stream().flatMap(r -> r.artifacts().stream()).collect(Collectors.toList()),
- ModuleStorage.SourceType.Maven,
+ ModuleStorage.SourceType.Standard,
name
));
}
diff --git a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleStorage.java b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleStorage.java
index 920b84a..1e953ca 100644
--- a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleStorage.java
+++ b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/builtins/module/ModuleStorage.java
@@ -29,7 +29,7 @@ import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ignite.cli.CliPathsConfigLoader;
-import org.apache.ignite.cli.IgnitePaths;
+import org.apache.ignite.cli.IgniteCLIException;
@Singleton
public class ModuleStorage {
@@ -62,7 +62,7 @@ public class ModuleStorage {
return removed;
}
- public ModuleDefinitionsRegistry listInstalled() throws IOException {
+ public ModuleDefinitionsRegistry listInstalled() {
var moduleFileAvailable =
cliPathsConfigLoader.loadIgnitePathsConfig()
.map(p -> p.installedModulesFile().toFile().exists())
@@ -71,9 +71,14 @@ public class ModuleStorage {
return new ModuleDefinitionsRegistry(new ArrayList<>());
else {
ObjectMapper objectMapper = new ObjectMapper();
- return objectMapper.readValue(
- moduleFile().toFile(),
- ModuleDefinitionsRegistry.class);
+ try {
+ return objectMapper.readValue(
+ moduleFile().toFile(),
+ ModuleDefinitionsRegistry.class);
+ }
+ catch (IOException e) {
+ throw new IgniteCLIException("Can't read lsit of installed modules because of IO error", e);
+ }
}
}
diff --git a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/IgniteCliSpec.java b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/IgniteCliSpec.java
index 657348c..4e5d4a5 100644
--- a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/IgniteCliSpec.java
+++ b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/IgniteCliSpec.java
@@ -83,21 +83,14 @@ public class IgniteCliSpec extends CommandSpec {
applicationContext.createBean(CliPathsConfigLoader.class)
.loadIgnitePathsConfig()
.ifPresent(ignitePaths ->
- {
- try {
- loadSubcommands(
- cli,
- applicationContext.createBean(ModuleStorage.class)
- .listInstalled()
- .modules
- .stream()
- .flatMap(m -> m.cliArtifacts.stream())
- .collect(Collectors.toList()));
- }
- catch (IOException e) {
- throw new IgniteCLIException("Can't load cli modules due to IO error");
- }
- }
+ loadSubcommands(
+ cli,
+ applicationContext.createBean(ModuleStorage.class)
+ .listInstalled()
+ .modules
+ .stream()
+ .flatMap(m -> m.cliArtifacts.stream())
+ .collect(Collectors.toList()))
);
return cli;
}
diff --git a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/ModuleCommandSpec.java b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/ModuleCommandSpec.java
index 07f608c..827d9c3 100644
--- a/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/ModuleCommandSpec.java
+++ b/modules/cli-demo/cli/src/main/java/org/apache/ignite/cli/spec/ModuleCommandSpec.java
@@ -20,6 +20,7 @@ package org.apache.ignite.cli.spec;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.stream.Collectors;
import javax.inject.Inject;
import com.github.freva.asciitable.AsciiTable;
@@ -27,6 +28,8 @@ import com.github.freva.asciitable.Column;
import com.github.freva.asciitable.HorizontalAlign;
import org.apache.ignite.cli.CliPathsConfigLoader;
import org.apache.ignite.cli.builtins.module.ModuleManager;
+import org.apache.ignite.cli.builtins.module.ModuleStorage;
+import org.apache.ignite.cli.builtins.module.StandardModuleDefinition;
import org.apache.ignite.cli.common.IgniteCommand;
import picocli.CommandLine;
@@ -86,16 +89,54 @@ public class ModuleCommandSpec extends CategorySpec implements IgniteCommand {
public static class ListModuleCommandSpec extends CommandSpec {
@Inject private ModuleManager moduleManager;
+ @Inject private ModuleStorage moduleStorage;
@Override public void run() {
+ var installedModules = new LinkedHashMap<String, ModuleStorage.ModuleDefinition>();
+
+ for (var m: moduleStorage
+ .listInstalled()
+ .modules
+ ) {
+ installedModules.put(m.name, m);
+ }
+
var builtinModules = moduleManager.builtinModules()
.stream()
- .filter(m -> !m.name.startsWith(ModuleManager.INTERNAL_MODULE_PREFIX));
+ .filter(m -> !m.name.startsWith(ModuleManager.INTERNAL_MODULE_PREFIX))
+ .map(m -> new StandardModuleView(m, installedModules.containsKey(m.name)));
+
String table = AsciiTable.getTable(builtinModules.collect(Collectors.toList()), Arrays.asList(
- new Column().header("Name").dataAlign(HorizontalAlign.LEFT).with(m -> m.name),
- new Column().header("Description").dataAlign(HorizontalAlign.LEFT).with(m -> m.description)
+ new Column().header("Name").dataAlign(HorizontalAlign.LEFT).with(m -> m.standardModuleDefinition.name),
+ new Column().header("Description").dataAlign(HorizontalAlign.LEFT).with(m -> m.standardModuleDefinition.description),
+ new Column().header("Installed").dataAlign(HorizontalAlign.LEFT).with(m -> (m.installed) ? "+":"-")
));
+ spec.commandLine().getOut().println("Official Ignite modules:");
spec.commandLine().getOut().println(table);
+
+ var externalInstalledModules = installedModules.values().stream()
+ .filter(m -> !(m.type == ModuleStorage.SourceType.Standard))
+ .collect(Collectors.toList());
+ if (!externalInstalledModules.isEmpty()) {
+ String externalModulesTable = AsciiTable.getTable(
+ externalInstalledModules,
+ Arrays.asList(
+ new Column().header("Name").dataAlign(HorizontalAlign.LEFT).with(m -> m.name)
+ ));
+ spec.commandLine().getOut().println();
+ spec.commandLine().getOut().println("External modules:");
+ spec.commandLine().getOut().println(externalModulesTable);
+ }
+ }
+
+ private static class StandardModuleView {
+ public final StandardModuleDefinition standardModuleDefinition;
+ public final boolean installed;
+
+ public StandardModuleView(StandardModuleDefinition standardModuleDefinition, boolean installed) {
+ this.standardModuleDefinition = standardModuleDefinition;
+ this.installed = installed;
+ }
}
}
diff --git a/modules/cli-demo/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java b/modules/cli-demo/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java
index 4a8ce62..6d60b72 100644
--- a/modules/cli-demo/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java
+++ b/modules/cli-demo/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java
@@ -15,6 +15,7 @@ import io.micronaut.context.ApplicationContext;
import io.micronaut.context.env.Environment;
import org.apache.ignite.cli.builtins.init.InitIgniteCommand;
import org.apache.ignite.cli.builtins.module.ModuleManager;
+import org.apache.ignite.cli.builtins.module.ModuleStorage;
import org.apache.ignite.cli.builtins.module.StandardModuleDefinition;
import org.apache.ignite.cli.builtins.node.NodeManager;
import org.apache.ignite.cli.spec.IgniteCliSpec;
@@ -79,10 +80,12 @@ public class IgniteCliInterfaceTest {
class Module {
@Mock ModuleManager moduleManager;
+ @Mock ModuleStorage moduleStorage;
@BeforeEach
void setUp() {
applicationContext.registerSingleton(moduleManager);
+ applicationContext.registerSingleton(moduleStorage);
}
@Test
@@ -159,25 +162,46 @@ public class IgniteCliInterfaceTest {
@Test
@DisplayName("list")
void list() {
- when(moduleManager.builtinModules()).thenReturn(Arrays.asList(
- new StandardModuleDefinition("module1", "description1", Arrays.asList("artifact1"), Arrays.asList("cli-artifact1") ),
- new StandardModuleDefinition("module2", "description2", Arrays.asList("artifact2"), Arrays.asList("cli-artifact2") )
- ));
-
- var exitCode =
- commandLine(applicationContext).execute("module list".split(" "));
- verify(moduleManager).builtinModules();
- assertEquals(0, exitCode);
-
- var expectedOutput =
- "+---------+--------------+\n" +
- "| Name | Description |\n" +
- "+---------+--------------+\n" +
- "| module1 | description1 |\n" +
- "+---------+--------------+\n" +
- "| module2 | description2 |\n" +
- "+---------+--------------+\n";
- assertEquals(expectedOutput, out.toString());
+
+ var module1 = new StandardModuleDefinition("module1", "description1", Collections.singletonList("artifact1"), Collections.singletonList("cli-artifact1"));
+ var module2 = new StandardModuleDefinition("module2", "description2", Collections.singletonList("artifact2"), Collections.singletonList("cli-artifact2"));
+ when(moduleManager.builtinModules()).thenReturn(Arrays.asList(module1, module2));
+
+ var externalModule = new ModuleStorage.ModuleDefinition(
+ "org.apache.ignite:snapshot:2.9.0",
+ Collections.emptyList(),
+ Collections.emptyList(),
+ ModuleStorage.SourceType.Maven, "mvn:org.apache.ignite:snapshot:2.9.0");
+ when(moduleStorage.listInstalled()).thenReturn(
+ new ModuleStorage.ModuleDefinitionsRegistry(
+ Arrays.asList(
+ new ModuleStorage.ModuleDefinition(
+ module1.name,
+ Collections.emptyList(),
+ Collections.emptyList(),
+ ModuleStorage.SourceType.Standard, ""), externalModule)));
+
+ var exitCode =
+ commandLine(applicationContext).execute("module list".split(" "));
+ verify(moduleManager).builtinModules();
+ assertEquals(0, exitCode);
+
+ var expectedOutput = "Official Ignite modules:\n" +
+ "+---------+--------------+-----------+\n" +
+ "| Name | Description | Installed |\n" +
+ "+---------+--------------+-----------+\n" +
+ "| module1 | description1 | + |\n" +
+ "+---------+--------------+-----------+\n" +
+ "| module2 | description2 | - |\n" +
+ "+---------+--------------+-----------+\n" +
+ "\n" +
+ "External modules:\n" +
+ "+----------------------------------+\n" +
+ "| Name |\n" +
+ "+----------------------------------+\n" +
+ "| org.apache.ignite:snapshot:2.9.0 |\n" +
+ "+----------------------------------+\n";
+ assertEquals(expectedOutput, out.toString());
}
}