package codeine.servlets.api_servlets.angular; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import codeine.api.MonitorStatusInfo; import codeine.api.NodeGetter; import codeine.api.NodeInfo; import codeine.api.NodeWithMonitorsInfo; import codeine.configuration.IConfigurationManager; import codeine.jsons.nodes.NodeDiscoveryStrategy; import codeine.jsons.peer_status.PeerStatusJsonV2; import codeine.jsons.peer_status.PeerStatusString; import codeine.jsons.peer_status.PeersProjectsStatus; import codeine.jsons.peer_status.ProjectStatus; import codeine.jsons.project.ProjectJson; import codeine.model.Constants; import codeine.permissions.UserPermissionsGetter; import codeine.servlet.AbstractApiServlet; import codeine.utils.network.InetUtils; import com.google.common.collect.Maps; import com.google.inject.Inject; public class NodeStatusApiServlet extends AbstractApiServlet { private static final Logger log = Logger .getLogger(NodeStatusApiServlet.class); private static final long serialVersionUID = 1L; @Inject private NodeGetter nodesGetter; @Inject private IConfigurationManager configurationManager; @Inject private UserPermissionsGetter userPermissionsGetter; @Inject private PeersProjectsStatus peersProjectsStatus; @Override protected boolean checkPermissions(HttpServletRequest request) { return canReadProject(request); } @Override protected void myGet(HttpServletRequest request, HttpServletResponse response) { String projectName = getParameter(request, Constants.UrlParameters.PROJECT_NAME); String nodeName = getParameter(request, Constants.UrlParameters.NODE); NodeWithMonitorsInfo nodeByNameOrNull = nodesGetter.getNodeByNameOrNull(projectName, nodeName); ProjectJson projectJson = configurationManager.getProjectForName(projectName); NodeWithMonitorsInfoApi node = null; if (nodeByNameOrNull != null) { boolean can_command = (userPermissionsGetter.user(request).canCommand(projectName, nodeByNameOrNull.alias())); node = new NodeWithMonitorsInfoApi(nodeByNameOrNull, can_command); } else if (projectJson.node_discovery_startegy() == NodeDiscoveryStrategy.Configuration){ node = getNodeFromConfiguration(projectName, nodeName); } else { log.warn("node not found " + projectName + " " + nodeName); Map<String, MonitorStatusInfo> monitors = Maps.newHashMap(); NodeWithMonitorsInfo info = new NodeWithMonitorsInfo(nodeName + ":NODE_NOT_FOUND", nodeName + ":NODE_NOT_FOUND", projectName, monitors, Constants.NO_VERSION); node = new NodeWithMonitorsInfoApi(info, false); } writeResponseGzipJson(node, request, response); } private NodeWithMonitorsInfoApi getNodeFromConfiguration(String projectName, String nodeName) { ProjectJson projectJson = configurationManager.getProjectForName(projectName); for (NodeInfo nodeInfo : projectJson.nodes_info()) { if (nodeName.equals(nodeInfo.name())) { Map<String, MonitorStatusInfo> monitors = Maps.newHashMap(); ProjectStatus projectStatus = new ProjectStatus(); PeerStatusJsonV2 peer = new PeerStatusJsonV2("", projectStatus); peer.status(getPeerStatus(nodeName)); NodeWithMonitorsInfoApi nodeStatusInfo = new NodeWithMonitorsInfoApi(new NodeWithMonitorsInfo( peer, nodeInfo.name(), nodeInfo.alias(), projectJson.name(), monitors), false); log.info("offline node " + nodeStatusInfo); return nodeStatusInfo; } } throw new IllegalArgumentException("node not found " + nodeName); } private PeerStatusString getPeerStatus(String nodeName) { for (String peer : peersProjectsStatus.peer_to_projects().keySet()) { if (InetUtils.nameWithoutPort(peer).equals(InetUtils.nameWithoutPort(nodeName))) { return PeerStatusString.NodeNotReported; } } return PeerStatusString.Offline; } }