package codeine.jsons.peer_status;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import codeine.api.MonitorStatusInfo;
import codeine.api.NodeWithMonitorsInfo;
import codeine.configuration.NodeMonitor;
import codeine.configuration.PathHelper;
import codeine.jsons.collectors.CollectorExecutionInfo;
import codeine.jsons.collectors.CollectorInfo;
import codeine.jsons.info.CodeineRuntimeInfo;
import codeine.jsons.project.ProjectJson;
import codeine.model.Constants;
import codeine.utils.network.InetUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class PeerStatus {
private static final Logger log = Logger.getLogger(PeerStatus.class);
private Map<String, ProjectStatus> project_name_to_status = Maps.newConcurrentMap();
@Inject
private CodeineRuntimeInfo codeineRuntimeInfo;
public PeerStatus() {
}
public String updateStatus(ProjectJson project, MonitorStatusInfo monitor, String node, String alias) {
NodeWithMonitorsInfo nodeInfo = initStatus(project, node, alias);
MonitorStatusInfo prevMonitorInfo = nodeInfo.monitors().put(monitor.name(), monitor);
if (null == prevMonitorInfo) {
return null;
}
return prevMonitorInfo.status();
}
public CollectorExecutionInfo updateStatus(ProjectJson project, CollectorExecutionInfo collector, String node, String alias) {
NodeWithMonitorsInfo nodeInfo = initStatus(project, node, alias);
CollectorExecutionInfo prevMonitorInfo = nodeInfo.collectors().put(collector.name(), collector);
if (null == prevMonitorInfo) {
return null;
}
return prevMonitorInfo;
}
private NodeWithMonitorsInfo initStatus(ProjectJson project, String nodeName, String alias) {
ProjectStatus projectStatus = getProjectStatus(project.name());
return getNodeInfo(project, nodeName, alias, projectStatus);
}
public void removeNode(String project, String node) {
ProjectStatus projectStatus = getProjectStatus(project);
projectStatus.removeNodeInfo(node);
}
private NodeWithMonitorsInfo getNodeInfo(ProjectJson project, String nodeName, String alias,
ProjectStatus projectStatus) {
NodeWithMonitorsInfo nodeInfo = projectStatus.nodeInfoOrNull(nodeName);
//it can be null only when first monitor run on node (single thread)
if (null == nodeInfo) {
PeerStatusJsonV2 createJson = createJson();
Map<String, MonitorStatusInfo> monitors = Maps.newHashMap();
nodeInfo = new NodeWithMonitorsInfo(createJson, nodeName, alias, project.name(), monitors);
projectStatus.addNodeInfo(nodeInfo);
}
return nodeInfo;
}
private ProjectStatus getProjectStatus(String project) {
ProjectStatus projectStatus = project_name_to_status.get(project);
if (null == projectStatus) {
projectStatus = new ProjectStatus(project);
project_name_to_status.put(project, projectStatus);
}
return projectStatus;
}
public void removeProject(String project) {
ProjectStatus status = null;
status = project_name_to_status.remove(project);
log.info("removed status for project " + project);
log.info("status was " + status);
}
public Map<String, ProjectStatus> project_name_to_status() {
return Collections.unmodifiableMap(project_name_to_status);
}
public PeerStatusJsonV2 createJson() {
return new PeerStatusJsonV2(InetUtils.getLocalHost().getHostName(), codeineRuntimeInfo.port(),
codeineRuntimeInfo.version(), codeineRuntimeInfo.startTime(), Constants.getInstallDir(),
PathHelper.getTarFile(), project_name_to_status(), InetUtils.getLocalHost().getHostAddress(), System.getProperty("DNS_DOMAIN_NAME"), InetUtils.getLocalHost().getCanonicalHostName());
}
public String updateVersion(ProjectJson project, String node, String alias, String version) {
NodeWithMonitorsInfo nodeInfo = initStatus(project, node, alias);
return nodeInfo.version(version);
}
public List<String> updateTags(ProjectJson project, String node, String alias, List<String> tagsList) {
NodeWithMonitorsInfo nodeInfo = initStatus(project, node, alias);
return nodeInfo.tags(tagsList);
}
public boolean removeNonExistMonitors(ProjectJson project, String node, String alias) {
List<String> monitorsNotToRemove = Lists.newArrayList();
for (NodeMonitor nodeMonitor : project.monitors()) {
monitorsNotToRemove.add(nodeMonitor.name());
}
List<String> monitorsToRemove = Lists.newArrayList();
NodeWithMonitorsInfo nodeInfo = initStatus(project, node, alias);
for (String monitorName : nodeInfo.monitors().keySet()) {
if (!monitorsNotToRemove.contains(monitorName)) {
monitorsToRemove.add(monitorName);
}
}
for (String m : monitorsToRemove) {
log.info("removing not exist monitor " + m);
nodeInfo.monitors().remove(m);
}
return !monitorsToRemove.isEmpty();
}
public boolean removeNonExistCollectors(ProjectJson project, String node, String alias) {
List<String> collectorsNotToRemove = Lists.newArrayList(Constants.VERSION_COLLECTOR_NAME, Constants.TAGS_COLLECTOR_NAME);
for (CollectorInfo collectorInfo : project.collectors()) {
collectorsNotToRemove.add(collectorInfo.name());
}
//TODO monitors backward
for (NodeMonitor monitorInfo : project.monitors()) {
collectorsNotToRemove.add(monitorInfo.name());
}
NodeWithMonitorsInfo nodeInfo = initStatus(project, node, alias);
List<String> collectorsToRemove = Lists.newArrayList(nodeInfo.collectors().keySet());
collectorsToRemove.removeAll(collectorsNotToRemove);
for (String c : collectorsToRemove) {
log.info("removing not exist collector " + c);
nodeInfo.collectors().remove(c);
}
return !collectorsToRemove.isEmpty();
}
public NodeWithMonitorsInfo nodeInfo(ProjectJson project, String node, String alias) {
return initStatus(project, node, alias);
}
public List<String> getTags(String project_name, String node_name) {
NodeWithMonitorsInfo nodeInfoOrNull = project_name_to_status().get(project_name).nodeInfoOrNull(node_name);
return nodeInfoOrNull.tags();
}
}