diff --git a/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml b/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml index 6b9086f..438e3fb 100644 --- a/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml +++ b/opennms-base-assembly/src/main/filtered/etc/events/opennms.events.xml @@ -1939,4 +1939,15 @@ clear-key="uei.opennms.org/internal/discovery/hardwareInventoryFailed:%dpname%:%nodeid%:%interface%"/> --> + + uei.opennms.org/internal/kscReportUpdated + OpenNMS-defined internal event: KSC report updated + <p>The KSC Report '%parm[reportTitle]%' has been updated (remaining graphs: %parm[graphCount]%).</p> + <p>Some graphs defined on the report have been removed, due to an invalid resource or chart.</p> + <p>A resource is not valid on any of the following situations: the nodeId (or nodeSource) doesn't exist, the resource type + is not valid or doesn't exist on the node, the resource name is not valid or doesn't exist on the node.</p> + <p>Check the logs for more details.</p> + The KSC Report %parm[reportTitle]% has been updated. + Warning + diff --git a/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java b/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java index f29dfe9..e178c6c 100644 --- a/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java +++ b/opennms-model/src/main/java/org/opennms/netmgt/EventConstants.java @@ -664,6 +664,10 @@ public abstract class EventConstants { public static final String HARDWARE_INVENTORY_FAILED_UEI = "uei.opennms.org/internal/discovery/hardwareInventoryFailed"; public static final String HARDWARE_INVENTORY_SUCCESSFUL_UEI = "uei.opennms.org/internal/discovery/hardwareInventorySuccessful"; + public static final String KSC_REPORT_UPDATED_UEI = "uei.opennms.org/internal/kscReportUpdated"; + public static final String PARAM_REPORT_TITLE = "reportTitle"; + public static final String PARAM_REPORT_GRAPH_COUNT = "graphCount"; + // // end eventUEIs // diff --git a/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java b/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java index b117e13..451425e 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java +++ b/opennms-webapp/src/main/java/org/opennms/web/controller/ksc/CustomViewController.java @@ -49,12 +49,15 @@ import javax.servlet.http.HttpServletResponse; import org.opennms.core.concurrent.LogPreservingThreadFactory; import org.opennms.core.utils.WebSecurityUtils; +import org.opennms.netmgt.EventConstants; import org.opennms.netmgt.config.KSC_PerformanceReportFactory; import org.opennms.netmgt.config.kscReports.Graph; import org.opennms.netmgt.config.kscReports.Report; import org.opennms.netmgt.model.OnmsResource; import org.opennms.netmgt.model.PrefabGraph; +import org.opennms.netmgt.model.events.EventBuilder; import org.opennms.web.api.Authentication; +import org.opennms.web.api.Util; import org.opennms.web.graph.KscResultSet; import org.opennms.web.servlet.MissingParameterException; import org.opennms.web.svclayer.KscReportService; @@ -148,7 +151,18 @@ public class CustomViewController extends AbstractController implements Initiali // Get the list of available prefabricated graph options Map resourceMap = new HashMap(); Set prefabGraphs = new TreeSet(); - removeBrokenGraphsFromReport(report); + if (removeBrokenGraphsFromReport(report) && reportId > -1) { + m_kscReportFactory.setReport(reportId, report); + m_kscReportFactory.saveCurrent(); + EventBuilder eb = new EventBuilder(EventConstants.KSC_REPORT_UPDATED_UEI, "Web UI"); + eb.addParam(EventConstants.PARAM_REPORT_TITLE, report.getTitle() == null ? "Report #" + report.getId() : report.getTitle()); + eb.addParam(EventConstants.PARAM_REPORT_GRAPH_COUNT, report.getGraphCount()); + try { + Util.createEventProxy().send(eb.getEvent()); + } catch (Throwable e) { + LOG.error("Can't send event " + eb.getEvent(), e); + } + } List graphCollection = report.getGraphCollection(); if (!graphCollection.isEmpty()) { List resources = getKscReportService().getResourcesFromGraphs(graphCollection); @@ -285,19 +299,28 @@ public class CustomViewController extends AbstractController implements Initiali return modelAndView; } - private void removeBrokenGraphsFromReport(Report report) { + // Returns true if the report was modified due to invalid resource IDs. + private boolean removeBrokenGraphsFromReport(Report report) { for (Iterator itr = report.getGraphCollection().iterator(); itr.hasNext();) { Graph graph = itr.next(); try { - getKscReportService().getResourceFromGraph(graph); + OnmsResource r = getKscReportService().getResourceFromGraph(graph); + if (r == null) { + LOG.error("Removing graph '{}' in KSC report '{}' because the resource it refers to could not be found. Perhaps resource '{}' (or its ancestor) referenced by this graph no longer exists?", graph.getTitle(), report.getTitle(), graph.getResourceId()); + itr.remove(); + return true; + } } catch (ObjectRetrievalFailureException orfe) { LOG.error("Removing graph '{}' in KSC report '{}' because the resource it refers to could not be found. Perhaps resource '{}' (or its ancestor) referenced by this graph no longer exists?", graph.getTitle(), report.getTitle(), graph.getResourceId()); itr.remove(); + return true; } catch (Throwable e) { LOG.error("Unexpected error while scanning through graphs in report: {}", e.getMessage(), e); itr.remove(); + return true; } } + return false; } private void promoteResourceAttributesIfNecessary(final OnmsResource resource) { diff --git a/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java b/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java index c5f9254..2a57209 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java +++ b/opennms-webapp/src/main/java/org/opennms/web/svclayer/KscReportService.java @@ -79,7 +79,7 @@ public interface KscReportService { * @param graphs a {@link java.util.List} object. * @return a {@link java.util.List} object. */ - public ListgetResourcesFromGraphs(List graphs); + public List getResourcesFromGraphs(List graphs); /** *

getTimeSpans

* diff --git a/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java b/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java index cadc735..9692755 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java +++ b/opennms-webapp/src/main/java/org/opennms/web/svclayer/ResourceService.java @@ -34,6 +34,7 @@ import java.util.List; import org.opennms.netmgt.model.OnmsNode; import org.opennms.netmgt.model.OnmsResource; import org.opennms.netmgt.model.PrefabGraph; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** @@ -140,5 +141,6 @@ public interface ResourceService { * @param resourceId a {@link java.lang.String} object. * @return a {@link java.util.List} object. */ + @Transactional(propagation = Propagation.REQUIRES_NEW) public List getResourceListById(String resourceId); }