Hello All, I'm creating a web service that returns a Json Tree with the availability of all services, and I found something weird on how isDown is implemented on OnmsNode, OnmsIpInterface and OnmsMonitoredService.
From the code, the implementation of OnmsMonitoredService.isDown return false (i.e service is up) only if service has no current outages or status is different of "Managed". The current code is: @Transient public boolean isDown() { boolean down = true; if (!"A".equals(getStatus()) || m_currentOutages.isEmpty()) { return !down; } return down; } So, if a service has a status of "Not Monitored", isDown() will return false. I understand here that if a service is not managed will be trated always as "Up" (am I right?) Let's see OnmsIpInterface isDown implementation: @Transient @XmlElement(name="isDown") public boolean isDown() { boolean down = true; for (OnmsMonitoredService svc : m_monitoredServices) { if (!svc.isDown()) { return !down; } } return down; } This method return false, only if at least one service is "Up".... (interface down = all service down, am I right?) Now imagine this scenario: I have 6 services on one interface: 3 are "Not Monitored", and 3 are "Monitored", for example: Postgres - Monitored SNMP - Not Monitored StrafePing - Not Monitored SSH - Monitored Router - Not Monitored ICMP - Monitored Now suppose that all services are down, because node is unreachable. In this case, ICMP, Postgres and SHH will be down and I will have 3 outages (apart from nodeDown alarm). The problem is that ipinterface.isDown() will return false and node.isDown() will also return false (node down = all interfaces down), because of the existance of two "Not Monitored" service..... I think that this is wrong. Am I right ? or am I missing something ? I think that OnmsIpInterface.isDown must be check service.getStatus().equals("A"). Maybe this method must be implemented like this: @Transient @XmlElement(name="isDown") public boolean isDown() { boolean down = true; for (OnmsMonitoredService svc : m_monitoredServices) { if (!svc.isDown() && svc.getStatus().equals("A")) { return !down; } } return down; } or like this: @Transient @XmlElement(name="isDown") public boolean isDown() { boolean down = true; if (!isManaged()) return !down; for (OnmsMonitoredService svc : m_monitoredServices) { if (!svc.isDown() && svc.getStatus().equals("A")) { return !down; } } return down; } If this second suggestion sounds good, then isDown for OnmsNode must be changed like this: @Transient public boolean isDown() { boolean down = true; for (OnmsIpInterface ipIf : m_ipInterfaces) { if (!ipIf.isDown() && ipIf.isManaged()) { return !down; } } return down; } I included an example picture of part of the result after applying only the FIRST change (this is a ExtJS Column Tree, Second Column is Status and Thrird Column is Availability). As you can see, the behavior looks correct. Without this, the ip address and node appears UP. Alejandro. ------------------------------------------------------------------------------ Stay on top of everything new and different, both inside and around Java (TM) technology - register by April 22, and save $200 on the JavaOne (SM) conference, June 2-5, 2009, San Francisco. 300 plus technical and hands-on sessions. Register today. Use priority code J9JMT32. http://p.sf.net/sfu/p _______________________________________________ Please read the OpenNMS Mailing List FAQ: http://www.opennms.org/index.php/Mailing_List_FAQ opennms-devel mailing list To *unsubscribe* or change your subscription options, see the bottom of this page: https://lists.sourceforge.net/lists/listinfo/opennms-devel