/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: contact@activeeon.com
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation: version 3 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package org.ow2.proactive.resourcemanager.utils;
import java.io.File;
import java.security.Policy;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.objectweb.proactive.core.config.CentralPAPropertyRepository;
import org.objectweb.proactive.utils.JVMPropertiesPreloader;
import org.ow2.proactive.authentication.crypto.Credentials;
import org.ow2.proactive.resourcemanager.RMFactory;
import org.ow2.proactive.resourcemanager.authentication.RMAuthentication;
import org.ow2.proactive.resourcemanager.core.properties.PAResourceManagerProperties;
import org.ow2.proactive.resourcemanager.frontend.ResourceManager;
import org.ow2.proactive.resourcemanager.nodesource.NodeSource;
import org.ow2.proactive.resourcemanager.nodesource.infrastructure.LocalInfrastructure;
import org.ow2.proactive.resourcemanager.nodesource.policy.RestartDownNodesPolicy;
import org.ow2.proactive.utils.FileToBytesConverter;
/**
* Class with main which instantiates a resource manager.
*
* @author The ProActive Team
* @since ProActive Scheduling 0.9
*/
public class RMStarter {
private static Logger logger = Logger.getLogger(RMStarter.class);
private static Options options = new Options();
public static final int DEFAULT_NODES_NUMBER = Math.max(2, Runtime.getRuntime().availableProcessors() - 1);
private static final int DEFAULT_NODE_TIMEOUT = 30 * 1000;
private static int nodeTimeout = DEFAULT_NODE_TIMEOUT;
private static void initOptions() {
Option help = new Option("h", "help", false, "to display this help");
help.setArgName("help");
help.setRequired(false);
options.addOption(help);
Option noDeploy = new Option("ln",
"localNodes",
false,
"start the resource manager deploying default 4 local nodes");
noDeploy.setArgName("localNodes");
noDeploy.setRequired(false);
options.addOption(noDeploy);
Option nodeTimeout = new Option("t",
"timeout",
true,
"Timeout used to start the nodes (only useful with local nodes, default: " +
DEFAULT_NODE_TIMEOUT + "ms)");
nodeTimeout.setArgName("timeout");
nodeTimeout.setRequired(false);
options.addOption(nodeTimeout);
}
private static void displayHelp() {
logger.info("");
HelpFormatter hf = new HelpFormatter();
hf.setWidth(120);
hf.printHelp("rm-start", options, true);
logger.info("\n Notice : Without argument, the resource manager starts without any computing node.");
System.exit(1);
}
public static void main(String[] args) {
configureRMHome();
configureSecurityManager();
configureLogging();
args = JVMPropertiesPreloader.overrideJVMProperties(args);
initOptions();
CommandLineParser parser = new DefaultParser();
CommandLine cmd;
try {
cmd = parser.parse(options, args);
if (cmd.hasOption("h")) {
displayHelp();
}
logger.info("Starting the resource manager...");
RMFactory.setOsJavaProperty();
boolean localNodes = false;
if (cmd.hasOption("localNodes")) {
localNodes = true;
if (cmd.hasOption("timeout")) {
String timeout = cmd.getOptionValue("t");
try {
nodeTimeout = Integer.parseInt(timeout);
} catch (Exception e) {
logger.error("Wrong value for timeout option: " + timeout, e);
}
}
}
// starting clean resource manager
RMAuthentication auth = RMFactory.startLocal();
int defaultNodesNumber = PAResourceManagerProperties.RM_NB_LOCAL_NODES.getValueAsInt();
// -1 means that the number of local nodes depends of the number of cores in the local machine
if (defaultNodesNumber == -1) {
defaultNodesNumber = DEFAULT_NODES_NUMBER;
}
if (localNodes && defaultNodesNumber > 0) {
ResourceManager resourceManager = auth.login(Credentials.getCredentials(PAResourceManagerProperties.getAbsolutePath(PAResourceManagerProperties.RM_CREDS.getValueAsString())));
String nodeSourceName = NodeSource.DEFAULT_LOCAL_NODES_NODE_SOURCE_NAME;
//first im parameter is default rm url
byte[] creds = FileToBytesConverter.convertFileToByteArray(new File(PAResourceManagerProperties.getAbsolutePath(PAResourceManagerProperties.RM_CREDS.getValueAsString())));
resourceManager.createNodeSource(nodeSourceName,
LocalInfrastructure.class.getName(),
new Object[] { creds, defaultNodesNumber, nodeTimeout, "" },
RestartDownNodesPolicy.class.getName(),
null);
resourceManager.disconnect();
logger.info("The resource manager with " + defaultNodesNumber + " local nodes created on " +
auth.getHostURL());
} else {
logger.info("The resource manager created on " + auth.getHostURL());
}
} catch (ParseException e1) {
displayHelp();
} catch (Exception e) {
logger.error("", e);
System.exit(3);
}
}
private static void configureRMHome() {
if (System.getProperty(PAResourceManagerProperties.RM_HOME.getKey()) == null) {
System.setProperty(PAResourceManagerProperties.RM_HOME.getKey(), System.getProperty("user.dir"));
}
if (System.getProperty(CentralPAPropertyRepository.PA_HOME.getName()) == null) {
System.setProperty(CentralPAPropertyRepository.PA_HOME.getName(),
System.getProperty(PAResourceManagerProperties.RM_HOME.getKey()));
}
if (System.getProperty(CentralPAPropertyRepository.PA_CONFIGURATION_FILE.getName()) == null) {
System.setProperty(CentralPAPropertyRepository.PA_CONFIGURATION_FILE.getName(),
System.getProperty(PAResourceManagerProperties.RM_HOME.getKey()) +
"/config/network/server.ini");
}
}
private static void configureSecurityManager() {
if (System.getProperty("java.security.policy") == null) {
System.setProperty("java.security.policy",
System.getProperty(PAResourceManagerProperties.RM_HOME.getKey()) +
"/config/security.java.policy-server");
Policy.getPolicy().refresh();
}
}
private static void configureLogging() {
if (System.getProperty(CentralPAPropertyRepository.LOG4J.getName()) == null) {
String defaultLog4jConfig = System.getProperty(PAResourceManagerProperties.RM_HOME.getKey()) +
"/config/log/server.properties";
System.setProperty(CentralPAPropertyRepository.LOG4J.getName(), defaultLog4jConfig);
PropertyConfigurator.configure(defaultLog4jConfig);
}
}
}