package codeine.nodes;
import java.net.InetAddress;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import codeine.api.NodeInfo;
import codeine.configuration.PathHelper;
import codeine.jsons.nodes.NodeListJson;
import codeine.jsons.nodes.NodesManager;
import codeine.jsons.project.ProjectJson;
import codeine.utils.FilesUtils;
import codeine.utils.network.InetUtils;
import com.google.common.collect.Maps;
public class NodesManagerPeer implements NodesManager {
private static final Logger log = Logger.getLogger(NodesManagerPeer.class);
@Inject
private NodeScriptDiscovery nodeScriptDiscovery;
private Map<String, NodeListJson> projectToNode = Maps.newConcurrentMap();
@Inject
private PathHelper pathHelper;
@Override
public NodeListJson nodesOf(ProjectJson projectJson){
NodeListJson nodeListJson = projectToNode.get(projectJson.name());
if (null == nodeListJson){
return new NodeListJson();
}
return nodeListJson;
}
@Override
public void init(ProjectJson projectJson){
log.info("init nodes in peer for project " + projectJson.name());
String dir = pathHelper.getProjectDir(projectJson.name());
FilesUtils.mkdirs(dir);
switch (projectJson.node_discovery_startegy()) {
case Configuration: {
List<NodeInfo> nodes = projectJson.nodes_info();
NodeListJson nodes2 = new NodeListJson();
for (NodeInfo nodeJson : nodes) {
String configuredHostName = InetUtils.nameWithoutPort(nodeJson.name());
if (isLocalHostNameMatch(configuredHostName)){
nodes2.add(nodeJson);
}
}
projectToNode.put(projectJson.name(), nodes2);
log.info("Configuration nodes are " + nodes2);
break;
}
case Script: {
NodeListJson nodes = nodeScriptDiscovery.get(projectJson);
projectToNode.put(projectJson.name(), nodes);
log.info("Script nodes are " + nodes);
break;
}
case Reporter: {
log.info("project configured as reporter, no nodes");
break;
}
default:
throw new UnsupportedOperationException("for value " + projectJson.node_discovery_startegy());
}
}
private boolean isLocalHostNameMatch(String configuredHostName) {
InetAddress localHost = InetUtils.getLocalHost();
return configuredHostName.equalsIgnoreCase(localHost.getHostName())
|| configuredHostName.equalsIgnoreCase(localHost.getCanonicalHostName());
}
}