/*
* 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.nodesource.policy;
import java.util.Timer;
import java.util.TimerTask;
import org.apache.log4j.Logger;
import org.objectweb.proactive.core.node.Node;
import org.objectweb.proactive.core.util.wrapper.BooleanWrapper;
import org.objectweb.proactive.extensions.annotation.ActiveObject;
import org.ow2.proactive.resourcemanager.authentication.Client;
import org.ow2.proactive.resourcemanager.exception.RMException;
import org.ow2.proactive.resourcemanager.nodesource.common.Configurable;
import org.ow2.proactive.resourcemanager.rmnode.RMDeployingNode;
/**
*
* A policy that acquires nodes once and of node becomes down tries to restart it.
*
*/
@ActiveObject
public class RestartDownNodesPolicy extends NodeSourcePolicy {
private static Logger logger = Logger.getLogger(RestartDownNodesPolicy.class);
private Timer timer = new Timer("RestartDownNodesPolicy node status check");
@Configurable(description = "ms (30 mins by default)")
private int checkNodeStateEach = 30 * 60 * 1000; // 30 mins by default;
/**
* Configure a policy with given parameters.
* @param policyParameters parameters defined by user
*/
@Override
public BooleanWrapper configure(Object... policyParameters) {
BooleanWrapper parentConfigured = super.configure(policyParameters);
if (policyParameters != null && policyParameters.length > 2) {
checkNodeStateEach = Integer.parseInt(policyParameters[2].toString());
}
return parentConfigured;
}
/**
* Activates static policy. Register a listener in RMMonitoring
*/
@Override
public BooleanWrapper activate() {
acquireAllNodes();
timer.schedule(new TimerTask() {
@Override
public void run() {
int numberOfNodesToDeploy = 0;
for (Node downNode : nodeSource.getDownNodes()) {
String nodeUrl = downNode.getNodeInformation().getURL();
logger.info("Removing down node " + nodeUrl);
BooleanWrapper removed = nodeSource.getRMCore().removeNode(nodeUrl, true);
if (removed.getBooleanValue()) {
logger.info("Down node removed " + nodeUrl);
numberOfNodesToDeploy++;
}
}
for (RMDeployingNode lostNode : nodeSource.getDeployingNodes()) {
if (!lostNode.isLost()) {
continue;
}
String nodeUrl = lostNode.getNodeURL();
logger.info("Removing lost node " + nodeUrl);
BooleanWrapper removed = nodeSource.getRMCore().removeNode(nodeUrl, true);
if (removed.getBooleanValue()) {
logger.info("Lost node removed " + nodeUrl);
numberOfNodesToDeploy++;
}
}
if (numberOfNodesToDeploy > 0) {
logger.info("Acquiring " + numberOfNodesToDeploy + " nodes");
acquireNodes(numberOfNodesToDeploy);
}
}
}, checkNodeStateEach, checkNodeStateEach);
return new BooleanWrapper(true);
}
@Override
public void shutdown(Client initiator) {
timer.cancel();
super.shutdown(initiator);
}
/**
* Description for the UI
*/
@Override
public String getDescription() {
return "Static nodes acquisition. If node becomes down policy tries to restart it.";
}
}