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 2021/02/03 04:29:36 UTC

[ignite-3] branch main updated: IGNITE-13816 - Add separate top level dirs for logs and configs (#26)

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 7a2e7ad  IGNITE-13816 - Add separate top level dirs for logs and configs (#26)
7a2e7ad is described below

commit 7a2e7ade35293eb62f7c79eac6ca04fa13a1b485
Author: Kirill Gusakov <kg...@gmail.com>
AuthorDate: Wed Feb 3 07:29:30 2021 +0300

    IGNITE-13816 - Add separate top level dirs for logs and configs (#26)
---
 .../apache/ignite/cli/CliPathsConfigLoader.java    | 11 +++--
 .../java/org/apache/ignite/cli/IgnitePaths.java    | 47 ++++++++++++--------
 .../cli/builtins/init/InitIgniteCommand.java       | 15 ++++++-
 .../ignite/cli/builtins/node/NodeManager.java      | 19 ++++----
 .../apache/ignite/cli/spec/NodeCommandSpec.java    |  4 +-
 .../apache/ignite/cli/IgniteCliInterfaceTest.java  | 50 ++++++++--------------
 .../cli/builtins/module/ModuleMangerTest.java      | 16 +++++--
 7 files changed, 91 insertions(+), 71 deletions(-)

diff --git a/modules/cli/src/main/java/org/apache/ignite/cli/CliPathsConfigLoader.java b/modules/cli/src/main/java/org/apache/ignite/cli/CliPathsConfigLoader.java
index 7b0bf00..f3db1ca 100644
--- a/modules/cli/src/main/java/org/apache/ignite/cli/CliPathsConfigLoader.java
+++ b/modules/cli/src/main/java/org/apache/ignite/cli/CliPathsConfigLoader.java
@@ -56,7 +56,7 @@ public class CliPathsConfigLoader {
         CliVersionInfo cliVerInfo
     ) {
         this.pathRslvr = pathRslvr;
-        this.ver = cliVerInfo.ver;
+        ver = cliVerInfo.ver;
     }
 
     /**
@@ -110,13 +110,18 @@ public class CliPathsConfigLoader {
             Properties props = new Properties();
             props.load(inputStream);
 
-            if ((props.getProperty("bin") == null) || (props.getProperty("work") == null))
+            if ((props.getProperty("bin") == null) ||
+                (props.getProperty("work") == null) ||
+                (props.getProperty("config") == null) ||
+                (props.getProperty("log") == null) )
                 throw new IgniteCLIException("Config file has wrong format. " +
-                    "It must contain correct paths to bin and work dirs");
+                    "It must contain correct paths to bin, work, config and log dirs");
 
             return new IgnitePaths(
                 Path.of(props.getProperty("bin")),
                 Path.of(props.getProperty("work")),
+                Path.of(props.getProperty("config")),
+                Path.of(props.getProperty("log")),
                 ver);
         }
         catch (IOException e) {
diff --git a/modules/cli/src/main/java/org/apache/ignite/cli/IgnitePaths.java b/modules/cli/src/main/java/org/apache/ignite/cli/IgnitePaths.java
index 1f2479c..4ef1862 100644
--- a/modules/cli/src/main/java/org/apache/ignite/cli/IgnitePaths.java
+++ b/modules/cli/src/main/java/org/apache/ignite/cli/IgnitePaths.java
@@ -56,6 +56,12 @@ public class IgnitePaths {
     /** Work directory for Ignite server and CLI operation. */
     public final Path workDir;
 
+    /** Directory for storing server node configs. */
+    public final Path configDir;
+
+    /** Directory for server nodes logs */
+    public final Path logDir;
+
     /**
      * Ignite CLI version.
      * Also, the same version will be used for addressing any binaries inside bin dir
@@ -69,9 +75,11 @@ public class IgnitePaths {
      * @param workDir Work directory.
      * @param ver Ignite CLI version.
      */
-    public IgnitePaths(Path binDir, Path workDir, String ver) {
+    public IgnitePaths(Path binDir, Path workDir, Path configDir, Path logDir, String ver) {
         this.binDir = binDir;
         this.workDir = workDir;
+        this.configDir = configDir;
+        this.logDir = logDir;
         this.ver = ver;
     }
 
@@ -114,28 +122,31 @@ public class IgnitePaths {
      * Path to default Ignite node config.
      */
     public Path serverDefaultConfigFile() {
-        return serverConfigDir().resolve("default-config.xml");
+        return configDir.resolve("default-config.xml");
     }
 
     /**
      * Init or recovers Ignite distributive directories structure.
      */
     public void initOrRecover() {
-        File igniteWork = workDir.toFile();
-        if (!(igniteWork.exists() || igniteWork.mkdirs()))
-            throw new IgniteCLIException("Can't create working directory: " + workDir);
-
-        File igniteBin = libsDir().toFile();
-        if (!(igniteBin.exists() || igniteBin.mkdirs()))
-            throw new IgniteCLIException("Can't create a directory for ignite modules: " + libsDir());
-
-        File igniteBinCli = cliLibsDir().toFile();
-        if (!(igniteBinCli.exists() || igniteBinCli.mkdirs()))
-            throw new IgniteCLIException("Can't create a directory for cli modules: " + cliLibsDir());
+        initDirIfNeeded(workDir,"Can't create working directory: " + workDir);
+        initDirIfNeeded(binDir,"Can't create bin directory: " + binDir);
+        initDirIfNeeded(libsDir(),"Can't create a directory for ignite modules: " + libsDir());
+        initDirIfNeeded(cliLibsDir(),"Can't create a directory for cli modules: " + cliLibsDir());
+        initDirIfNeeded(configDir,"Can't create a directory for server configs: " + configDir);
+        initDirIfNeeded(logDir,"Can't create a directory for server logs: " + logDir);
+    }
 
-        File srvCfg = serverConfigDir().toFile();
-        if (!(srvCfg.exists() || srvCfg.mkdirs()))
-            throw new IgniteCLIException("Can't create a directory for server configs: " + serverConfigDir());
+    /**
+     * Create directory if not exists.
+     *
+     * @param dir Directory
+     * @param exceptionMessage Exception message if directory wasn't created
+     */
+    private void initDirIfNeeded(Path dir, String exceptionMessage) {
+        File dirFile = dir.toFile();
+        if (!(dirFile.exists() || dirFile.mkdirs()))
+            throw new IgniteCLIException(exceptionMessage);
     }
 
     /**
@@ -145,8 +156,10 @@ public class IgnitePaths {
      */
     public boolean validateDirs() {
         return workDir.toFile().exists() &&
+                binDir.toFile().exists() &&
                 libsDir().toFile().exists() &&
                 cliLibsDir().toFile().exists() &&
-                serverConfigDir().toFile().exists();
+                configDir.toFile().exists() &&
+                logDir.toFile().exists();
     }
 }
diff --git a/modules/cli/src/main/java/org/apache/ignite/cli/builtins/init/InitIgniteCommand.java b/modules/cli/src/main/java/org/apache/ignite/cli/builtins/init/InitIgniteCommand.java
index 0e3cff9..b9a743d 100644
--- a/modules/cli/src/main/java/org/apache/ignite/cli/builtins/init/InitIgniteCommand.java
+++ b/modules/cli/src/main/java/org/apache/ignite/cli/builtins/init/InitIgniteCommand.java
@@ -104,6 +104,8 @@ public class InitIgniteCommand {
 
         tbl.addRow("@|bold Binaries Directory|@", cfg.binDir);
         tbl.addRow("@|bold Work Directory|@", cfg.workDir);
+        tbl.addRow("@|bold Config Directory|@", cfg.configDir);
+        tbl.addRow("@|bold Log Directory|@", cfg.logDir);
 
         out.println(tbl);
         out.println();
@@ -159,8 +161,10 @@ public class InitIgniteCommand {
 
             Path binDir = pathRslvr.toolHomeDirectoryPath().resolve("ignite-bin");
             Path workDir = pathRslvr.toolHomeDirectoryPath().resolve("ignite-work");
+            Path cfgDir = pathRslvr.toolHomeDirectoryPath().resolve("ignite-config");
+            Path logDir = pathRslvr.toolHomeDirectoryPath().resolve("ignite-log");
 
-            fillNewConfigFile(newCfgFile, binDir, workDir);
+            fillNewConfigFile(newCfgFile, binDir, workDir, cfgDir, logDir);
 
             return newCfgFile;
         }
@@ -176,12 +180,19 @@ public class InitIgniteCommand {
      * @param binDir Path for bin dir.
      * @param workDir Path for work dir.
      */
-    private void fillNewConfigFile(File f, @NotNull Path binDir, @NotNull Path workDir) {
+    private void fillNewConfigFile(File f,
+        @NotNull Path binDir,
+        @NotNull Path workDir,
+        @NotNull Path cfgDir,
+        @NotNull Path logDir
+        ) {
         try (FileWriter fileWriter = new FileWriter(f)) {
             Properties props = new Properties();
 
             props.setProperty("bin", binDir.toString());
             props.setProperty("work", workDir.toString());
+            props.setProperty("config", cfgDir.toString());
+            props.setProperty("log", logDir.toString());
             props.store(fileWriter, "");
         }
         catch (IOException e) {
diff --git a/modules/cli/src/main/java/org/apache/ignite/cli/builtins/node/NodeManager.java b/modules/cli/src/main/java/org/apache/ignite/cli/builtins/node/NodeManager.java
index 5748132..4d4d74b 100644
--- a/modules/cli/src/main/java/org/apache/ignite/cli/builtins/node/NodeManager.java
+++ b/modules/cli/src/main/java/org/apache/ignite/cli/builtins/node/NodeManager.java
@@ -75,19 +75,18 @@ public class NodeManager {
      * just waiting for appropriate message in the node logs.
      *
      * @param consistentId Node consistent id.
-     * @param workDir Work dir for node operation.
+     * @param logDir Log dir for receiving node state.
      * @param pidsDir Dir where pid files of running nodes will be stored.
      * @param srvCfg Config for Ignite node
      * @param out PrintWriter for user messages.
      * @return Information about successfully started node
      */
-    public RunningNode start(String consistentId, Path workDir, Path pidsDir, Path srvCfg, PrintWriter out) {
-        if (getRunningNodes(workDir, pidsDir).stream().anyMatch(n -> n.consistentId.equals(consistentId)))
+    public RunningNode start(String consistentId, Path logDir, Path pidsDir, Path srvCfg, PrintWriter out) {
+        if (getRunningNodes(logDir, pidsDir).stream().anyMatch(n -> n.consistentId.equals(consistentId)))
             throw new IgniteCLIException("Node with consistentId " + consistentId + " is already exist");
 
         try {
-            Path logFile = logFile(workDir, consistentId);
-
+            Path logFile = logFile(logDir, consistentId);
             if (Files.exists(logFile))
                 Files.delete(logFile);
 
@@ -217,7 +216,7 @@ public class NodeManager {
      * @param pidsDir Dir with nodes pids.
      * @return List of running nodes.
      */
-    public List<RunningNode> getRunningNodes(Path worksDir, Path pidsDir) {
+    public List<RunningNode> getRunningNodes(Path logDir, Path pidsDir) {
         if (Files.exists(pidsDir)) {
             try (Stream<Path> files = Files.find(pidsDir, 1, (f, attrs) -> f.getFileName().toString().endsWith(".pid"))) {
                 return files
@@ -241,7 +240,7 @@ public class NodeManager {
                         else {
                             String consistentId = filename.substring(0, filename.lastIndexOf('_'));
 
-                            return Optional.of(new RunningNode(pid, consistentId, logFile(worksDir, consistentId)));
+                            return Optional.of(new RunningNode(pid, consistentId, logFile(logDir, consistentId)));
                         }
 
                     })
@@ -311,12 +310,12 @@ public class NodeManager {
     }
 
     /**
-     * @param workDir Ignite work dir.
+     * @param logDir Ignite log dir.
      * @param consistentId Node consistent id.
      * @return Path of node log file.
      */
-    private static Path logFile(Path workDir, String consistentId) {
-        return workDir.resolve(consistentId + ".log");
+    private static Path logFile(Path logDir, String consistentId) {
+          return logDir.resolve(consistentId + ".log");
     }
 
     /**
diff --git a/modules/cli/src/main/java/org/apache/ignite/cli/spec/NodeCommandSpec.java b/modules/cli/src/main/java/org/apache/ignite/cli/spec/NodeCommandSpec.java
index a4f9dfe..1ba83fe 100644
--- a/modules/cli/src/main/java/org/apache/ignite/cli/spec/NodeCommandSpec.java
+++ b/modules/cli/src/main/java/org/apache/ignite/cli/spec/NodeCommandSpec.java
@@ -76,7 +76,7 @@ public class NodeCommandSpec extends CategorySpec {
 
             out.println("Starting a new Ignite node...");
 
-            NodeManager.RunningNode node = nodeMgr.start(consistentId, ignitePaths.workDir,
+            NodeManager.RunningNode node = nodeMgr.start(consistentId, ignitePaths.logDir,
                 ignitePaths.cliPidsDir(),
                 configPath,
                 out);
@@ -152,7 +152,7 @@ public class NodeCommandSpec extends CategorySpec {
         @Override public void run() {
             IgnitePaths paths = cliPathsCfgLdr.loadIgnitePathsOrThrowError();
 
-            List<NodeManager.RunningNode> nodes = nodeMgr.getRunningNodes(paths.workDir, paths.cliPidsDir());
+            List<NodeManager.RunningNode> nodes = nodeMgr.getRunningNodes(paths.logDir, paths.cliPidsDir());
 
             PrintWriter out = spec.commandLine().getOut();
             ColorScheme cs = spec.commandLine().getColorScheme();
diff --git a/modules/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java b/modules/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java
index 6ad95b3..42d45c0 100644
--- a/modules/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java
+++ b/modules/cli/src/test/java/org/apache/ignite/cli/IgniteCliInterfaceTest.java
@@ -102,6 +102,13 @@ public class IgniteCliInterfaceTest {
             .setOut(new PrintWriter(out, true));
     }
 
+    IgnitePaths ignitePaths = new IgnitePaths(
+            Path.of("bin"),
+            Path.of("work"),
+            Path.of("config"),
+            Path.of("log"),
+            "version");
+
     /** */
     @DisplayName("init")
     @Nested
@@ -144,17 +151,12 @@ public class IgniteCliInterfaceTest {
         @Test
         @DisplayName("add mvn:groupId:artifact:version")
         void add() {
-            IgnitePaths paths = new IgnitePaths(
-                Path.of("binDir"),
-                Path.of("worksDir"),
-                "version");
-
-            when(cliPathsCfgLdr.loadIgnitePathsOrThrowError()).thenReturn(paths);
+            when(cliPathsCfgLdr.loadIgnitePathsOrThrowError()).thenReturn(ignitePaths);
 
             var exitCode =
                 commandLine(applicationCtx).execute("module add mvn:groupId:artifactId:version".split(" "));
 
-            verify(moduleMgr).addModule("mvn:groupId:artifactId:version", paths, Arrays.asList());
+            verify(moduleMgr).addModule("mvn:groupId:artifactId:version", ignitePaths, Collections.emptyList());
             Assertions.assertEquals(0, exitCode);
         }
 
@@ -164,10 +166,7 @@ public class IgniteCliInterfaceTest {
         void addWithCustomRepo() throws MalformedURLException {
             doNothing().when(moduleMgr).addModule(any(), any(), any());
 
-            IgnitePaths paths = new IgnitePaths(Path.of("binDir"),
-                Path.of("worksDir"), "version");
-
-            when(cliPathsCfgLdr.loadIgnitePathsOrThrowError()).thenReturn(paths);
+            when(cliPathsCfgLdr.loadIgnitePathsOrThrowError()).thenReturn(ignitePaths);
 
             var exitCode =
                 commandLine(applicationCtx)
@@ -175,7 +174,7 @@ public class IgniteCliInterfaceTest {
 
             verify(moduleMgr).addModule(
                 "mvn:groupId:artifactId:version",
-                paths,
+                ignitePaths,
                 Collections.singletonList(new URL("http://mvnrepo.com/repostiory")));
             Assertions.assertEquals(0, exitCode);
         }
@@ -186,17 +185,12 @@ public class IgniteCliInterfaceTest {
         void addBuiltinModule() {
             doNothing().when(moduleMgr).addModule(any(), any(), any());
 
-            IgnitePaths paths = new IgnitePaths(
-                Path.of("binDir"),
-                Path.of("worksDir"),
-                "version");
-
-            when(cliPathsCfgLdr.loadIgnitePathsOrThrowError()).thenReturn(paths);
+            when(cliPathsCfgLdr.loadIgnitePathsOrThrowError()).thenReturn(ignitePaths);
 
             var exitCode =
                 commandLine(applicationCtx).execute("module add test-module".split(" "));
 
-            verify(moduleMgr).addModule("test-module", paths, Collections.emptyList());
+            verify(moduleMgr).addModule("test-module", ignitePaths, Collections.emptyList());
             Assertions.assertEquals(0, exitCode);
         }
 
@@ -309,8 +303,6 @@ public class IgniteCliInterfaceTest {
         @Test
         @DisplayName("start node1 --config conf.json")
         void start() {
-           var ignitePaths = new IgnitePaths(Path.of(""), Path.of(""), "version");
-
            var nodeName = "node1";
 
            var node =
@@ -327,7 +319,7 @@ public class IgniteCliInterfaceTest {
             var exitCode = cli.execute(("node start " + nodeName + " --config conf.json").split(" "));
 
             Assertions.assertEquals(0, exitCode);
-            verify(nodeMgr).start(nodeName, ignitePaths.workDir, ignitePaths.cliPidsDir(), Path.of("conf.json"), cli.getOut());
+            verify(nodeMgr).start(nodeName, ignitePaths.logDir, ignitePaths.cliPidsDir(), Path.of("conf.json"), cli.getOut());
             assertEquals("Starting a new Ignite node...\n\nNode is successfully started. To stop, type ignite node stop " + nodeName + "\n\n" +
                 "+---------------+---------+\n" +
                 "| Consistent ID | node1   |\n" +
@@ -343,8 +335,6 @@ public class IgniteCliInterfaceTest {
         @Test
         @DisplayName("stop node1")
         void stopRunning() {
-            var ignitePaths = new IgnitePaths(Path.of(""), Path.of(""), "version");
-
             var nodeName = "node1";
 
             when(nodeMgr.stopWait(any(), any()))
@@ -367,8 +357,6 @@ public class IgniteCliInterfaceTest {
         @Test
         @DisplayName("stop unknown-node")
         void stopUnknown() {
-            var ignitePaths = new IgnitePaths(Path.of(""), Path.of(""), "version");
-
             var nodeName = "unknown-node";
 
             when(nodeMgr.stopWait(any(), any()))
@@ -391,8 +379,6 @@ public class IgniteCliInterfaceTest {
         @Test
         @DisplayName("list")
         void list() {
-            var ignitePaths = new IgnitePaths(Path.of(""), Path.of(""), "version");
-
             when(nodeMgr.getRunningNodes(any(), any()))
                 .thenReturn(Arrays.asList(
                     new NodeManager.RunningNode(1, "new1", Path.of("logFile1")),
@@ -406,7 +392,7 @@ public class IgniteCliInterfaceTest {
                 commandLine(applicationCtx).execute("node list".split(" "));
 
             Assertions.assertEquals(0, exitCode);
-            verify(nodeMgr).getRunningNodes(ignitePaths.workDir, ignitePaths.cliPidsDir());
+            verify(nodeMgr).getRunningNodes(ignitePaths.logDir, ignitePaths.cliPidsDir());
             assertEquals("Currently, there are 2 locally running nodes.\n\n" +
                 "+---------------+-----+----------+\n" +
                 "| Consistent ID | PID | Log File |\n" +
@@ -422,10 +408,8 @@ public class IgniteCliInterfaceTest {
         @Test
         @DisplayName("list")
         void listEmpty() {
-            var ignitePaths = new IgnitePaths(Path.of(""), Path.of(""), "version");
-
             when(nodeMgr.getRunningNodes(any(), any()))
-                .thenReturn(Arrays.asList());
+                .thenReturn(Collections.emptyList());
 
             when(cliPathsCfgLdr.loadIgnitePathsOrThrowError())
                 .thenReturn(ignitePaths);
@@ -434,7 +418,7 @@ public class IgniteCliInterfaceTest {
                 commandLine(applicationCtx).execute("node list".split(" "));
 
             Assertions.assertEquals(0, exitCode);
-            verify(nodeMgr).getRunningNodes(ignitePaths.workDir, ignitePaths.cliPidsDir());
+            verify(nodeMgr).getRunningNodes(ignitePaths.logDir, ignitePaths.cliPidsDir());
             assertEquals("Currently, there are no locally running nodes.\n\n" +
                 "Use the ignite node start command to start a new node.\n", out.toString());
         }
diff --git a/modules/cli/src/test/java/org/apache/ignite/cli/builtins/module/ModuleMangerTest.java b/modules/cli/src/test/java/org/apache/ignite/cli/builtins/module/ModuleMangerTest.java
index 18376e4..58eac91 100644
--- a/modules/cli/src/test/java/org/apache/ignite/cli/builtins/module/ModuleMangerTest.java
+++ b/modules/cli/src/test/java/org/apache/ignite/cli/builtins/module/ModuleMangerTest.java
@@ -77,8 +77,12 @@ public class ModuleMangerTest {
        when(mavenArtifactRslvr.resolve(any(), any(), any(), any(), any())).thenReturn(
            new ResolveResult(Arrays.asList(rootArtifact, depArtifact)));
 
-       var ignitePaths = new IgnitePaths(homeDir.resolve("bin"), homeDir.resolve("work"), "n/a");
-
+       var ignitePaths = new IgnitePaths(
+           homeDir.resolve("bin"),
+           homeDir.resolve("work"),
+           homeDir.resolve("config"),
+           homeDir.resolve("log"),
+           "n/a");
        moduleMgr.setOut(new PrintWriter(System.out));
        moduleMgr.setColorScheme(CommandLine.Help.defaultColorScheme(CommandLine.Help.Ansi.AUTO));
        moduleMgr.addModule("mvn:any-group:test-module:1.0", ignitePaths, Collections.emptyList());
@@ -97,8 +101,12 @@ public class ModuleMangerTest {
         when(mavenArtifactRslvr.resolve(any(), any(), any(), any(), any())).thenReturn(
             new ResolveResult(Arrays.asList(rootArtifact, depArtifact)));
 
-        var ignitePaths = new IgnitePaths(homeDir.resolve("bin"), homeDir.resolve("work"), "n/a");
-
+        var ignitePaths = new IgnitePaths(
+            homeDir.resolve("bin"),
+            homeDir.resolve("work"),
+            homeDir.resolve("config"),
+            homeDir.resolve("log"),
+            "n/a");
         moduleMgr.setOut(new PrintWriter(System.out));
         moduleMgr.setColorScheme(CommandLine.Help.defaultColorScheme(CommandLine.Help.Ansi.AUTO));
         moduleMgr.addModule("mvn:any-group:test-module:1.0", ignitePaths, Collections.emptyList());