blob: bbc88fc857751e7d6a010edaaf13d72d57183bd0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.cli;
import java.io.File;
import java.nio.file.Path;
/**
* The main resolver of Ignite paths for the current installation (like bin, work and etc. dirs).
* Current Ignite distributive has the following dirs structure:
* <ul>
* <li>bin
* <ul>
* <li>${version}
* <ul>
* <li>cli</li>
* <li>libs</li>
* </ul>
* </li>
* </ul>
* </li>
* <li>work
* <ul>
* <li>config
* <ul>
* <li>default-config.xml</li>
* </ul>
* </li>
* <li>cli
* <ul>
* <li>pids</li>
* </ul>
* </li>
* <li>modules.json</li>
* </ul>
* </li>
* </ul>
*/
public class IgnitePaths {
/**
* Path to Ignite bin directory.
* Bin directory contains jar artifacts for Ignite server and CLI modules.
*/
public final Path binDir;
/** 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
*/
private final String ver;
/**
* Creates resolved ignite paths instance from Ignite CLI version and base dirs paths.
*
* @param binDir Bin directory.
* @param workDir Work directory.
* @param ver Ignite CLI version.
*/
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;
}
/**
* Path where CLI module artifacts will be placed.
*/
public Path cliLibsDir() {
return binDir.resolve(ver).resolve("cli");
}
/**
* Path where Ignite server module artifacts will be placed.
*/
public Path libsDir() {
return binDir.resolve(ver).resolve("libs");
}
/**
* Path where Ignite node pid files will be created.
*/
public Path cliPidsDir() {
return workDir.resolve("cli").resolve("pids");
}
/**
* Path to file with registry data for {@link org.apache.ignite.cli.builtins.module.ModuleRegistry}
*/
public Path installedModulesFile() {
return workDir.resolve("modules.json");
}
/**
* Path to directory with Ignite nodes configs.
*/
public Path serverConfigDir() {
return workDir.resolve("config");
}
/**
* Path to default Ignite node config.
*/
public Path serverDefaultConfigFile() {
return configDir.resolve("default-config.xml");
}
/**
* Init or recovers Ignite distributive directories structure.
*/
public void initOrRecover() {
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);
}
/**
* 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);
}
/**
* Validates that all Ignite distributive directories is exists.
*
* @return true if check passes, false otherwise.
*/
public boolean validateDirs() {
return workDir.toFile().exists() &&
binDir.toFile().exists() &&
libsDir().toFile().exists() &&
cliLibsDir().toFile().exists() &&
configDir.toFile().exists() &&
logDir.toFile().exists();
}
}