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());
         }
     }