Amended patch, I missed an earlier commit with a few prior changes in.

Duncan
________________________________________
From: Duncan Mackintosh [dmackint...@cbnl.com]
Sent: 18 October 2011 10:08
To: OpenNMS Code Development and Bugs
Subject: Re: [opennms-devel] Getting node lists with status out of REST

Not entirely forgotten, though I've been working on other things...

I've implemented a basic availability service for nodes and wanted to throw it 
out for comment before I add further bells and whistles.

You can open opennms/rest/availability/nodes/ and get something like
<nodeAvailabilities>
        <nodeavailability nodeId="13" availability="83.1633597883598" />
        <nodeavailability nodeId="50" availability="100.0" />
        <nodeavailability nodeId="51" availability="100.0" />
        <nodeavailability nodeId="52" availability="99.99751984126985" />
        <nodeavailability nodeId="53" availability="100.0" />
        <nodeavailability nodeId="54" availability="100.0" />
        <nodeavailability nodeId="55" availability="100.0" />
</nodeAvailabilities>

or append a nodeid and get a single nodeavailability record.

Time range defaults to 'last 7 days', amending with ?days=N will change that. 
Specifying start/end dates isn't implemented yet but probably will be.

Because the PostgreSQL availability functions take dates as input, I've not 
been able to hook straight into the Hibernate entity model - instead it's a 
native SQL query mapped onto a simple object. That means none of the 
NodeRestService filtering rules are easily transferable; I'm not sure if 
they're needed and if so how to go about doing that without pain and/or 
suffering. Any thoughts there would be most welcome.

Otherwise I'll finish it off with start/end date mapping and a similar lookup 
for service availability and leave it at that for now.

Thanks,
Duncan
________________________________________
From: Duncan Mackintosh [dmackint...@cbnl.com]
Sent: 05 September 2011 09:52
To: OpenNMS Code Development and Bugs
Subject: Re: [opennms-devel] Getting node lists with status out of REST

That sounds pretty good, it would suit my needs just fine and it's generic 
enough that I can see plenty of other uses for it. I'll start hacking something 
up and see if I run into any issues, otherwise I'll post a rough plan soon.

Duncan
________________________________________
From: Craig Miskell [cr...@stroppykitten.com]
Sent: 05 September 2011 00:16
To: OpenNMS Code Development and Bugs
Subject: Re: [opennms-devel] Getting node lists with status out of REST

Hi,
        Well, how about something like:
/rest/availability?filter=<whatever>

That way it's not cluttering up the information returned by the Node
rest service, and minimises the number of queries.  It's a concrete set
of data that should be exposed for reading.  Actually, given that
availability can be for a number of different entities, perhaps it
should be:
/rest/availability/<entity>?filter=<something>&period=<period>
where <entity> is "node", "service", or anything else for which OpenNMS
can calculate an availability ("applications" maybe one day?)

It can return an array of "availability" records, each specifying which
entity it refers to, and the availability over the given period.
Efficiency will be down to the server-side doing sensible queries.
Filter is optional (implying "all").

How does that sound?

Craig

Cambridge Broadband Networks Limited Registered in England and Wales under 
company number: 03879840 Registered office: Selwyn House, Cambridge Business 
Park, Cowley Road, Cambridge CB4 0WZ, UK. VAT number: GB 741 0186 64
Cambridge Broadband Networks Limited Registered in England and Wales under 
company number: 03879840 Registered office: Selwyn House, Cambridge Business 
Park, Cowley Road, Cambridge CB4 0WZ, UK. VAT number: GB 741 0186 64
From 18304d343d9499aafac1d46781f882e9edbfd882 Mon Sep 17 00:00:00 2001
From: Duncan Mackintosh <dunc...@cbnl.com>
Date: Wed, 12 Oct 2011 10:26:11 +0100
Subject: [PATCH] CBNL CORE: Beginnings of an availability REST service. Currently exposes node availability for all nodes
 (/openmns/rest/availability/nodes/) and specific nodes (rest/availability/nodes/<id>/).

---
 .../org/opennms/netmgt/dao/AvailabilityDao.java    |   13 +++
 .../dao/hibernate/AvailabilityDaoHibernate.java    |   85 +++++++++++++++
 .../META-INF/opennms/applicationContext-dao.xml    |    4 +
 .../dao/AbstractTransactionalDaoTestCase.java      |   12 ++-
 .../model/availability/NodeAvailability.java       |  113 ++++++++++++++++++++
 .../opennms/web/rest/AvailabilityRestService.java  |  112 +++++++++++++++++++
 6 files changed, 338 insertions(+), 1 deletions(-)
 create mode 100644 opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java
 create mode 100644 opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java
 create mode 100644 opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java
 create mode 100644 opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java

diff --git a/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java b/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java
new file mode 100644
index 0000000..f159637
--- /dev/null
+++ b/opennms-dao/src/main/java/org/opennms/netmgt/dao/AvailabilityDao.java
@@ -0,0 +1,13 @@
+package org.opennms.netmgt.dao;
+
+import java.util.Date;
+import java.util.List;
+
+import org.opennms.netmgt.model.availability.NodeAvailability;
+
+public interface AvailabilityDao {
+	public List<NodeAvailability> getAllNodesAvailability(Date since);
+	public NodeAvailability getNodeAvailability(String nodeCriteria, Date since);
+	public NodeAvailability getNodeAvailability(int nodeid, Date since);
+	public NodeAvailability getNodeAvailabilityByForeignId(String foreignSource, String foreignId, Date since);
+}
diff --git a/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java b/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java
new file mode 100644
index 0000000..19128f7
--- /dev/null
+++ b/opennms-dao/src/main/java/org/opennms/netmgt/dao/hibernate/AvailabilityDaoHibernate.java
@@ -0,0 +1,85 @@
+package org.opennms.netmgt.dao.hibernate;
+
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.hibernate.HibernateException;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.hibernate.transform.Transformers;
+import org.opennms.netmgt.dao.AvailabilityDao;
+import org.opennms.netmgt.model.availability.NodeAvailability;
+import org.springframework.orm.hibernate3.HibernateCallback;
+import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
+
+public class AvailabilityDaoHibernate extends HibernateDaoSupport implements AvailabilityDao {
+
+	@SuppressWarnings("unchecked")
+	public List<NodeAvailability> getAllNodesAvailability(final Date since) {
+		final Date now = new Date();
+		HibernateCallback<List<NodeAvailability>> c = new HibernateCallback<List<NodeAvailability>>() {
+			public List<NodeAvailability> doInHibernate(Session session)
+					throws HibernateException, SQLException {
+				SQLQuery sqlQuery = session.createSQLQuery("SELECT nodeid, " +
+						"getmanagepercentavailnodewindow(nodeid, CAST(:from AS timestamp), CAST(:to AS timestamp)) AS availability " +
+						"FROM node ORDER BY nodeid");
+				sqlQuery.setResultTransformer(Transformers.aliasToBean(NodeAvailability.class));
+				sqlQuery.setDate("from", since);
+				sqlQuery.setDate("to", now);
+				return sqlQuery.list();
+			}
+		};
+		return getHibernateTemplate().execute(c);
+	}
+
+	public NodeAvailability getNodeAvailability(String nodeCriteria, Date since) {
+	    if (nodeCriteria.contains(":")) {
+	        String[] criteria = nodeCriteria.split(":");
+	        return getNodeAvailabilityByForeignId(criteria[0], criteria[1], since);
+	    }
+	    return getNodeAvailability(Integer.parseInt(nodeCriteria), since);
+	}
+
+	public NodeAvailability getNodeAvailability(final int nodeid, final Date since) {
+		final Date now = new Date();
+		HibernateCallback<NodeAvailability> c = new HibernateCallback<NodeAvailability>() {
+			public NodeAvailability doInHibernate(Session session)
+					throws HibernateException, SQLException {
+				SQLQuery sqlQuery = session.createSQLQuery("SELECT nodeid, " +
+						"getmanagepercentavailnodewindow(nodeid, CAST(:from AS timestamp), CAST(:to AS timestamp)) AS availability " +
+						"FROM node WHERE nodeid=:nodeid ORDER BY nodeid");
+				sqlQuery.setResultTransformer(Transformers.aliasToBean(NodeAvailability.class));
+				sqlQuery.setDate("from", since);
+				sqlQuery.setDate("to", now);
+				sqlQuery.setInteger("nodeid", nodeid);
+				return (NodeAvailability) sqlQuery.uniqueResult();
+			}
+		};
+		return getHibernateTemplate().execute(c);
+	}
+
+	public NodeAvailability getNodeAvailabilityByForeignId(
+			final String foreignSource, final String foreignId, final Date since) {
+		final Date now = new Date();
+		HibernateCallback<NodeAvailability> c = new HibernateCallback<NodeAvailability>() {
+			public NodeAvailability doInHibernate(Session session)
+					throws HibernateException, SQLException {
+				SQLQuery sqlQuery = session.createSQLQuery("SELECT nodeid, " +
+						"getmanagepercentavailnodewindow(nodeid, CAST(:from AS timestamp), CAST(:to AS timestamp)) AS availability " +
+						"FROM node WHERE foreignid=:foreignid AND foreignsource=:foreignsource ORDER BY nodeid");
+				sqlQuery.setResultTransformer(Transformers.aliasToBean(NodeAvailability.class));
+				sqlQuery.setDate("from", since);
+				sqlQuery.setDate("to", now);
+				sqlQuery.setString("foreignid", foreignId);
+				sqlQuery.setString("foreignsource", foreignSource);
+				return (NodeAvailability) sqlQuery.uniqueResult();
+			}
+		};
+		return getHibernateTemplate().execute(c);
+	}
+
+
+}
diff --git a/opennms-dao/src/main/resources/META-INF/opennms/applicationContext-dao.xml b/opennms-dao/src/main/resources/META-INF/opennms/applicationContext-dao.xml
index dbc6895..9a82f65 100644
--- a/opennms-dao/src/main/resources/META-INF/opennms/applicationContext-dao.xml
+++ b/opennms-dao/src/main/resources/META-INF/opennms/applicationContext-dao.xml
@@ -154,6 +154,10 @@
   <bean id="outageDao" class="org.opennms.netmgt.dao.hibernate.OutageDaoHibernate">
     <property name="sessionFactory" ref="sessionFactory" />
   </bean>
+  
+  <bean id="availabilityDao" class="org.opennms.netmgt.dao.hibernate.AvailabilityDaoHibernate">
+    <property name="sessionFactory" ref="sessionFactory" />
+  </bean>
 
   <bean id="serviceTypeDao" class="org.opennms.netmgt.dao.hibernate.ServiceTypeDaoHibernate">
     <property name="sessionFactory" ref="sessionFactory" />
diff --git a/opennms-dao/src/test/java/org/opennms/netmgt/dao/AbstractTransactionalDaoTestCase.java b/opennms-dao/src/test/java/org/opennms/netmgt/dao/AbstractTransactionalDaoTestCase.java
index a4e86e7..850ad80 100644
--- a/opennms-dao/src/test/java/org/opennms/netmgt/dao/AbstractTransactionalDaoTestCase.java
+++ b/opennms-dao/src/test/java/org/opennms/netmgt/dao/AbstractTransactionalDaoTestCase.java
@@ -63,8 +63,10 @@ public class AbstractTransactionalDaoTestCase extends AbstractTransactionalTempo
     private AcknowledgmentDao m_acknowledgmentDao;
     private LinkStateDao m_linkStateDao;
     private ReportCatalogDao m_reportCatalogDao;
+    private AvailabilityDao m_availabilityDao;
     
-    private DatabasePopulator m_populator;
+
+	private DatabasePopulator m_populator;
     
     private boolean m_populate = true;
     
@@ -97,6 +99,14 @@ public class AbstractTransactionalDaoTestCase extends AbstractTransactionalTempo
         }
     }
 
+    public AvailabilityDao getAvailabilityDao() {
+		return m_availabilityDao;
+	}
+
+	public void setAvailabilityDao(AvailabilityDao availabilityDao) {
+		this.m_availabilityDao = availabilityDao;
+	}    
+    
     public AlarmDao getAlarmDao() {
         return m_alarmDao;
     }
diff --git a/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java b/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java
new file mode 100644
index 0000000..89b9272
--- /dev/null
+++ b/opennms-model/src/main/java/org/opennms/netmgt/model/availability/NodeAvailability.java
@@ -0,0 +1,113 @@
+package org.opennms.netmgt.model.availability;
+
+import java.sql.Timestamp;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.commons.lang.builder.CompareToBuilder;
+import org.opennms.netmgt.model.OnmsNode;
+
+/**
+ * A data structure summarising node availability over a given time range
+ * @author Duncan Mackintosh
+ *
+ */
+@XmlRootElement(name="nodeavailability")
+public class NodeAvailability implements Comparable<NodeAvailability> {
+
+	/** ID of the node */
+	private int nodeId;
+	
+	/** Availability of this node, as a %age (so 0-100) */
+	private double availability;
+	
+	/** Start of the time period over which availability was calculated */
+	private Date dateFrom;
+	
+	/** End of the time period over which availability was calculated */
+	private Date dateTo;
+
+	public NodeAvailability(){}
+	public NodeAvailability(int nodeId, double availability) {
+		System.out.println("Created with nodeID" + nodeId + " avail " + availability);
+	}
+
+	public NodeAvailability(int nodeId, double availability, Date dateFrom,
+			Date dateTo) {
+		super();
+		this.nodeId = nodeId;
+		this.availability = availability;
+		this.dateFrom = dateFrom;
+		this.dateTo = dateTo;
+	}
+
+	
+	public NodeAvailability(int nodeId, double availability, Timestamp dateFrom,
+			Timestamp dateTo) {
+		super();
+		this.nodeId = nodeId;
+		this.availability = availability;
+		this.dateFrom = dateFrom;
+		this.dateTo = dateTo;
+	}
+
+
+	@Column
+	@XmlAttribute
+	public int getNodeId() {
+		return nodeId;
+	}
+	public void setNodeid(int nodeId) {
+		this.nodeId = nodeId;
+	}
+	@Column
+	@XmlAttribute
+	public double getAvailability() {
+		return availability;
+	}
+
+	public void setAvailability(double availability) {
+		this.availability = availability;
+	}
+
+	@Column
+	@Temporal(TemporalType.TIMESTAMP)
+	public Date getDateFrom() {
+		return dateFrom;
+	}
+
+	public void setDateFrom(Date dateFrom) {
+		this.dateFrom = dateFrom;
+	}
+	
+	@Column
+	@Temporal(TemporalType.TIMESTAMP)
+	public Date getDateTo() {
+		return dateTo;
+	}
+
+	public void setDateTo(Date dateTo) {
+		this.dateTo = dateTo;
+	}
+
+	public int compareTo(NodeAvailability other) {
+		return new CompareToBuilder()
+			.append(this.getNodeId(), other.getNodeId())
+			.append(this.getDateFrom(), other.getDateFrom())
+			.append(this.getDateTo(), other.getDateTo())
+			.append(this.getAvailability(), other.getAvailability())
+			.toComparison();
+				
+	}
+
+}
diff --git a/opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java b/opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java
new file mode 100644
index 0000000..65b8709
--- /dev/null
+++ b/opennms-webapp/src/main/java/org/opennms/web/rest/AvailabilityRestService.java
@@ -0,0 +1,112 @@
+/*
+ * This file is part of the OpenNMS(R) Application.
+ *
+ * OpenNMS(R) is Copyright (C) 2009 The OpenNMS Group, Inc.  All rights reserved.
+ * OpenNMS(R) is a derivative work, containing both original code, included code and modified
+ * code that was published under the GNU General Public License. Copyrights for modified
+ * and included code are below.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * Modifications:
+ * 
+ * Created: July 16, 2009
+ *
+ * Copyright (C) 2009 The OpenNMS Group, Inc.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * For more information contact:
+ *      OpenNMS Licensing       <lice...@opennms.org>
+ *      http://www.opennms.org/
+ *      http://www.opennms.com/
+ */
+package org.opennms.web.rest;
+
+import java.util.Calendar;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+
+import org.opennms.netmgt.dao.AvailabilityDao;
+import org.opennms.netmgt.model.availability.NodeAvailability;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.sun.jersey.spi.resource.PerRequest;
+
+@Component
+@PerRequest
+@Scope("prototype")
+@Path("availability")
+
+/**
+ * ReST service for availability stats
+ *
+ * @author Duncan Mackintosh
+ * @version $Id: $
+ */
+public class AvailabilityRestService extends OnmsRestService {
+    @Autowired
+    private AvailabilityDao m_availabilityDao;
+    
+    @Context 
+    UriInfo m_uriInfo;
+
+    @Context
+    SecurityContext m_securityContext;
+    
+    /**
+     * <p>getAcknowledgment</p>
+     *
+     * @param alarmId a {@link java.lang.String} object.
+     * @return a {@link org.opennms.netmgt.model.OnmsAcknowledgment} object.
+     */
+    @GET
+    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+    @Path("nodes")
+    @Transactional
+    public List<NodeAvailability> getNodesAvailability() {
+    	// Using @FormParam annotations seems to cause exceptions, so do it the hard way
+    	String dayRange = m_uriInfo.getQueryParameters().getFirst("days");
+    	if(dayRange == null) dayRange = "7";
+    	Calendar since = Calendar.getInstance();
+    	since.add(Calendar.DAY_OF_MONTH, -Integer.valueOf(dayRange));
+        return m_availabilityDao.getAllNodesAvailability(since.getTime());
+    }
+    
+    @GET
+    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+    @Path("nodes/{nodeCriteria}")
+    @Transactional
+    public NodeAvailability getNodeAvailability(@PathParam("nodeCriteria") String nodeCriteria) {
+    	// Using @FormParam annotations seems to cause exceptions, so do it the hard way
+    	String dayRange = m_uriInfo.getQueryParameters().getFirst("days");
+    	if(dayRange == null) dayRange = "7";
+    	Calendar since = Calendar.getInstance();
+    	since.add(Calendar.DAY_OF_MONTH, -Integer.valueOf(dayRange));
+    	return m_availabilityDao.getNodeAvailability(nodeCriteria, since.getTime());
+    }
+
+}
-- 
1.7.1

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2d-oct
_______________________________________________
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

Reply via email to