Search in sources :

Example 16 with Status

use of org.opennms.features.topology.api.topo.Status in project opennms by OpenNMS.

the class GraphMLPropagateVertexStatusProvider method getStatusForVertices.

@Override
public Map<? extends VertexRef, ? extends Status> getStatusForVertices(final VertexProvider vertexProvider, final Collection<VertexRef> vertices, final Criteria[] criteria) {
    final List<Criteria> criteriaList = Lists.newArrayList(criteria);
    final LoopDetectionCriteria loopDetectionCriteria = Iterables.tryFind(criteriaList, c -> c instanceof LoopDetectionCriteria).transform(c -> (LoopDetectionCriteria) c).or(LoopDetectionCriteria::new);
    // Build map from namespace to opposite vertices
    final Multimap<String, VertexRef> oppositeVertices = HashMultimap.create();
    for (final VertexRef sourceVertex : vertices) {
        // Filter out loops
        if (loopDetectionCriteria.contains(sourceVertex)) {
            LOG.error("Loop detected with: {}:{}", sourceVertex.getNamespace(), sourceVertex.getId());
            continue;
        }
        for (VertexRef targetVertex : this.provider.getOppositeVertices(sourceVertex)) {
            oppositeVertices.put(targetVertex.getNamespace(), targetVertex);
        }
    }
    // Replace loop detection criteria with extended one
    criteriaList.remove(loopDetectionCriteria);
    criteriaList.add(loopDetectionCriteria.with(vertices));
    // Find and call status provider for each namespace and get result per opposite vertex
    final Map<VertexRef, Status> targetStatuses = Maps.newHashMap();
    try {
        final Collection<ServiceReference<StatusProvider>> statusProviderReferences = this.bundleContext.getServiceReferences(StatusProvider.class, null);
        for (final ServiceReference<StatusProvider> statusProviderReference : statusProviderReferences) {
            try {
                final StatusProvider statusProvider = bundleContext.getService(statusProviderReference);
                for (final Map.Entry<String, Collection<VertexRef>> e : oppositeVertices.asMap().entrySet()) {
                    if (statusProvider.contributesTo(e.getKey())) {
                        targetStatuses.putAll(statusProvider.getStatusForVertices(this.provider.getGraphProviderBy(e.getKey()), e.getValue(), criteriaList.toArray(new Criteria[0])));
                    }
                }
            } finally {
                bundleContext.ungetService(statusProviderReference);
            }
        }
    } catch (final InvalidSyntaxException e) {
    }
    // Merge statuses from targets to sources
    final Map<VertexRef, GraphMLVertexStatus> statuses = Maps.newHashMap();
    for (final VertexRef sourceVertex : vertices) {
        GraphMLVertexStatus mergedStatus = new GraphMLVertexStatus();
        for (VertexRef targetVertex : this.provider.getOppositeVertices(sourceVertex)) {
            if (targetStatuses.containsKey(targetVertex)) {
                mergedStatus = GraphMLVertexStatus.merge(mergedStatus, (GraphMLVertexStatus) targetStatuses.get(targetVertex));
            }
        }
        statuses.put(sourceVertex, mergedStatus);
    }
    return statuses;
}
Also used : Iterables(com.google.common.collect.Iterables) Logger(org.slf4j.Logger) InvalidSyntaxException(org.osgi.framework.InvalidSyntaxException) Collection(java.util.Collection) LoggerFactory(org.slf4j.LoggerFactory) Set(java.util.Set) Multimap(com.google.common.collect.Multimap) Maps(com.google.common.collect.Maps) BundleContext(org.osgi.framework.BundleContext) HashSet(java.util.HashSet) Objects(java.util.Objects) StatusProvider(org.opennms.features.topology.api.topo.StatusProvider) List(java.util.List) HashMultimap(com.google.common.collect.HashMultimap) Lists(com.google.common.collect.Lists) VertexProvider(org.opennms.features.topology.api.topo.VertexProvider) Criteria(org.opennms.features.topology.api.topo.Criteria) Map(java.util.Map) GraphMLMetaTopologyProvider(org.opennms.features.topology.plugins.topo.graphml.GraphMLMetaTopologyProvider) Status(org.opennms.features.topology.api.topo.Status) VertexRef(org.opennms.features.topology.api.topo.VertexRef) ServiceReference(org.osgi.framework.ServiceReference) Status(org.opennms.features.topology.api.topo.Status) StatusProvider(org.opennms.features.topology.api.topo.StatusProvider) Criteria(org.opennms.features.topology.api.topo.Criteria) ServiceReference(org.osgi.framework.ServiceReference) Collection(java.util.Collection) InvalidSyntaxException(org.osgi.framework.InvalidSyntaxException) VertexRef(org.opennms.features.topology.api.topo.VertexRef) Map(java.util.Map)

Example 17 with Status

use of org.opennms.features.topology.api.topo.Status in project opennms by OpenNMS.

the class GraphMLScriptVertexStatusProvider method getStatusForVertices.

@Override
public Map<? extends VertexRef, ? extends Status> getStatusForVertices(final VertexProvider vertexProvider, final Collection<VertexRef> vertices, final Criteria[] criteria) {
    // All vertices for the current vertexProvider
    final List<GraphMLVertex> graphMLVertices = vertices.stream().filter(eachVertex -> contributesTo(eachVertex.getNamespace()) && eachVertex instanceof GraphMLVertex).map(eachVertex -> (GraphMLVertex) eachVertex).collect(Collectors.toList());
    // Alarm summary for each node id
    final Map<Integer, AlarmSummary> nodeIdToAlarmSummaryMap = alarmSummaryWrapper.getAlarmSummaries(Lists.transform(graphMLVertices, AbstractVertex::getNodeID)).stream().collect(Collectors.toMap(AlarmSummary::getNodeId, Function.identity()));
    // Calculate status via scripts
    return serviceAccessor.getTransactionOperations().execute(t -> this.scripting.compute(graphMLVertices.stream(), (vertex) -> {
        final SimpleBindings bindings = new SimpleBindings();
        bindings.put("vertex", vertex);
        if (vertex.getNodeID() != null) {
            bindings.put("node", serviceAccessor.getNodeDao().get(vertex.getNodeID()));
            bindings.put("alarmSummary", nodeIdToAlarmSummaryMap.get(vertex.getNodeID()));
        }
        bindings.put("measurements", new MeasurementsWrapper(serviceAccessor.getMeasurementsService()));
        bindings.put("nodeDao", serviceAccessor.getNodeDao());
        bindings.put("snmpInterfaceDao", serviceAccessor.getSnmpInterfaceDao());
        return bindings;
    }));
}
Also used : MeasurementsWrapper(org.opennms.features.topology.api.info.MeasurementsWrapper) Scripting(org.opennms.features.topology.plugins.topo.graphml.internal.Scripting) AlarmSummary(org.opennms.netmgt.model.alarm.AlarmSummary) Collection(java.util.Collection) ScriptEngineManager(javax.script.ScriptEngineManager) AbstractVertex(org.opennms.features.topology.api.topo.AbstractVertex) Function(java.util.function.Function) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) SimpleBindings(javax.script.SimpleBindings) StatusProvider(org.opennms.features.topology.api.topo.StatusProvider) List(java.util.List) Lists(com.google.common.collect.Lists) VertexProvider(org.opennms.features.topology.api.topo.VertexProvider) Paths(java.nio.file.Paths) AlarmSummaryWrapper(org.opennms.features.topology.plugins.topo.graphml.internal.AlarmSummaryWrapper) Criteria(org.opennms.features.topology.api.topo.Criteria) Map(java.util.Map) Status(org.opennms.features.topology.api.topo.Status) VertexRef(org.opennms.features.topology.api.topo.VertexRef) GraphMLServiceAccessor(org.opennms.features.topology.plugins.topo.graphml.internal.GraphMLServiceAccessor) Path(java.nio.file.Path) GraphMLVertex(org.opennms.features.topology.plugins.topo.graphml.GraphMLVertex) GraphMLVertex(org.opennms.features.topology.plugins.topo.graphml.GraphMLVertex) AlarmSummary(org.opennms.netmgt.model.alarm.AlarmSummary) SimpleBindings(javax.script.SimpleBindings) MeasurementsWrapper(org.opennms.features.topology.api.info.MeasurementsWrapper)

Example 18 with Status

use of org.opennms.features.topology.api.topo.Status in project opennms by OpenNMS.

the class PathOutageStatusProvider method getStatusForVertices.

@Override
public Map<VertexRef, Status> getStatusForVertices(VertexProvider vertexProvider, Collection<VertexRef> vertices, Criteria[] criteria) {
    final List<Integer> nodeIds = vertices.stream().filter(v -> v.getNamespace().equals(getNamespace())).map(v -> (PathOutageVertex) v).map(v -> v.getNodeID()).collect(Collectors.toList());
    if (nodeIds.isEmpty()) {
        return new HashMap<>();
    }
    // Preparing database request
    final StringBuilder hql = new StringBuilder();
    hql.append("SELECT node.id, max(event.eventSeverity) ");
    hql.append("FROM OnmsOutage as outage ");
    hql.append("LEFT JOIN outage.monitoredService as ifservice ");
    hql.append("LEFT JOIN ifservice.ipInterface as ipinterface ");
    hql.append("LEFT JOIN ipinterface.node as node ");
    hql.append("LEFT JOIN outage.serviceLostEvent as event ");
    hql.append("WHERE node.id in (:nodeIds) ");
    hql.append("AND outage.serviceRegainedEvent is null ");
    hql.append("GROUP BY node.id");
    final List<String> paramNames = Lists.newArrayList("nodeIds");
    final List<Object> paramValues = new ArrayList();
    paramValues.add(Lists.newArrayList(nodeIds));
    final List<Object[]> retvals = this.persistenceAccessor.findUsingNamedParameters(hql.toString(), paramNames.toArray(new String[paramNames.size()]), paramValues.toArray());
    // Generating alarms map
    final Map<Integer, OnmsSeverity> mappedAlarms = new HashedMap();
    for (int i = 0; i < retvals.size(); i++) {
        final Integer nodeId = (Integer) retvals.get(i)[0];
        final Integer severity = Optional.ofNullable((Integer) retvals.get(i)[1]).orElse(OnmsSeverity.NORMAL.ordinal());
        mappedAlarms.put(nodeId, OnmsSeverity.get(severity));
    }
    final Map<VertexRef, Status> status = vertices.stream().map(v -> (PathOutageVertex) v).collect(Collectors.toMap(v -> v, v -> {
        if (!mappedAlarms.containsKey(v.getNodeID())) {
            return new DefaultStatus(OnmsSeverity.NORMAL.getLabel(), 0);
        } else {
            return new DefaultStatus(mappedAlarms.get(v.getNodeID()).getLabel(), 0);
        }
    }));
    return status;
}
Also used : Collection(java.util.Collection) HashMap(java.util.HashMap) Collectors(java.util.stream.Collectors) HashedMap(org.apache.commons.collections.map.HashedMap) ArrayList(java.util.ArrayList) Objects(java.util.Objects) DefaultStatus(org.opennms.features.topology.api.topo.DefaultStatus) List(java.util.List) StatusProvider(org.opennms.features.topology.api.topo.StatusProvider) Lists(com.google.common.collect.Lists) VertexProvider(org.opennms.features.topology.api.topo.VertexProvider) GenericPersistenceAccessor(org.opennms.netmgt.dao.api.GenericPersistenceAccessor) Map(java.util.Map) Criteria(org.opennms.features.topology.api.topo.Criteria) Optional(java.util.Optional) Status(org.opennms.features.topology.api.topo.Status) VertexRef(org.opennms.features.topology.api.topo.VertexRef) OnmsSeverity(org.opennms.netmgt.model.OnmsSeverity) DefaultStatus(org.opennms.features.topology.api.topo.DefaultStatus) Status(org.opennms.features.topology.api.topo.Status) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) DefaultStatus(org.opennms.features.topology.api.topo.DefaultStatus) OnmsSeverity(org.opennms.netmgt.model.OnmsSeverity) HashedMap(org.apache.commons.collections.map.HashedMap) VertexRef(org.opennms.features.topology.api.topo.VertexRef)

Example 19 with Status

use of org.opennms.features.topology.api.topo.Status in project opennms by OpenNMS.

the class GraphMLEdgeStatusProvider method getStatusForEdges.

@Override
public Map<EdgeRef, Status> getStatusForEdges(EdgeProvider edgeProvider, Collection<EdgeRef> edges, Criteria[] criteria) {
    final List<StatusScript> scripts = Lists.newArrayList();
    try (final DirectoryStream<Path> stream = Files.newDirectoryStream(getScriptPath())) {
        for (final Path path : stream) {
            // ignore readme
            if (".readme".equals(path.getFileName().toString())) {
                LOG.debug("Skipping .readme");
                continue;
            }
            final String extension = FilenameUtils.getExtension(path.toString());
            final ScriptEngine scriptEngine = this.scriptEngineManager.getEngineByExtension(extension);
            if (scriptEngine == null) {
                LOG.warn("No script engine found for extension '{}'", extension);
                continue;
            }
            LOG.debug("Found script: path={}, extension={}, engine={}", path, extension, scriptEngine);
            try (final Stream<String> lines = Files.lines(path, Charset.defaultCharset())) {
                final String source = lines.collect(Collectors.joining("\n"));
                scripts.add(new StatusScript(scriptEngine, source));
            }
        }
    } catch (final IOException e) {
        LOG.error("Failed to walk template directory: {}", getScriptPath());
        return Collections.emptyMap();
    }
    return serviceAccessor.getTransactionOperations().execute(transactionStatus -> edges.stream().filter(eachEdge -> eachEdge instanceof GraphMLEdge).map(edge -> (GraphMLEdge) edge).map(edge -> new HashMap.SimpleEntry<>(edge, computeEdgeStatus(scripts, edge))).filter(e -> e.getValue() != null).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
}
Also used : Path(java.nio.file.Path) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) EdgeRef(org.opennms.features.topology.api.topo.EdgeRef) EdgeStatusProvider(org.opennms.features.topology.api.topo.EdgeStatusProvider) SimpleScriptContext(javax.script.SimpleScriptContext) AbstractVertex(org.opennms.features.topology.api.topo.AbstractVertex) EdgeProvider(org.opennms.features.topology.api.topo.EdgeProvider) DirectoryStream(java.nio.file.DirectoryStream) Lists(com.google.common.collect.Lists) Charset(java.nio.charset.Charset) Map(java.util.Map) Path(java.nio.file.Path) GraphMLServiceAccessor(org.opennms.features.topology.plugins.topo.graphml.internal.GraphMLServiceAccessor) OnmsNode(org.opennms.netmgt.model.OnmsNode) ScriptException(javax.script.ScriptException) Compilable(javax.script.Compilable) MeasurementsWrapper(org.opennms.features.topology.api.info.MeasurementsWrapper) Logger(org.slf4j.Logger) Files(java.nio.file.Files) StringWriter(java.io.StringWriter) Collection(java.util.Collection) ScriptEngineManager(javax.script.ScriptEngineManager) IOException(java.io.IOException) SimpleConnector(org.opennms.features.topology.api.topo.SimpleConnector) Collectors(java.util.stream.Collectors) ScriptContext(javax.script.ScriptContext) Objects(java.util.Objects) SimpleBindings(javax.script.SimpleBindings) List(java.util.List) Stream(java.util.stream.Stream) Paths(java.nio.file.Paths) Criteria(org.opennms.features.topology.api.topo.Criteria) CompiledScript(javax.script.CompiledScript) ScriptEngine(javax.script.ScriptEngine) Optional(java.util.Optional) Status(org.opennms.features.topology.api.topo.Status) Collections(java.util.Collections) FilenameUtils(org.apache.commons.io.FilenameUtils) IOException(java.io.IOException) ScriptEngine(javax.script.ScriptEngine)

Example 20 with Status

use of org.opennms.features.topology.api.topo.Status in project opennms by OpenNMS.

the class ApplicationStatusProvider method getStatusForVertices.

@Override
public Map<VertexRef, Status> getStatusForVertices(VertexProvider vertexProvider, Collection<VertexRef> vertices, Criteria[] criteria) {
    Map<VertexRef, Status> returnMap = new HashMap<>();
    Map<ApplicationStatusEntity.Key, Status> statusMap = new HashMap<>();
    List<ApplicationStatusEntity> result = applicationDao.getAlarmStatus();
    for (ApplicationStatusEntity eachRow : result) {
        DefaultStatus status = createStatus(eachRow.getSeverity(), eachRow.getCount());
        statusMap.put(eachRow.getKey(), status);
    }
    // status for all known node ids
    Collection<VertexRef> vertexRefsForNamespace = getVertexRefsForNamespace(vertices);
    Collection<VertexRef> vertexRefsRoot = getRootElements(vertexRefsForNamespace);
    Collection<VertexRef> vertexRefs = new ArrayList<>(vertexRefsForNamespace);
    vertexRefs.removeAll(vertexRefsRoot);
    // calculate status for children
    for (VertexRef eachVertex : vertexRefs) {
        ApplicationVertex applicationVertex = (ApplicationVertex) eachVertex;
        Status alarmStatus = statusMap.get(createKey(applicationVertex));
        if (alarmStatus == null) {
            alarmStatus = createStatus(OnmsSeverity.NORMAL, 0);
        }
        returnMap.put(eachVertex, alarmStatus);
    }
    // calculate status for root
    for (VertexRef eachRoot : vertexRefsRoot) {
        ApplicationVertex eachRootApplication = (ApplicationVertex) eachRoot;
        OnmsSeverity maxSeverity = OnmsSeverity.NORMAL;
        int count = 0;
        for (VertexRef eachChild : eachRootApplication.getChildren()) {
            ApplicationVertex eachChildApplication = (ApplicationVertex) eachChild;
            ApplicationStatusEntity.Key childKey = createKey(eachChildApplication);
            Status childStatus = statusMap.get(childKey);
            if (childStatus != null && maxSeverity.isLessThan(createSeverity(childStatus.computeStatus()))) {
                maxSeverity = createSeverity(childStatus.computeStatus());
                count = Integer.parseInt(childStatus.getStatusProperties().get("statusCount"));
            }
        }
        returnMap.put(eachRoot, createStatus(maxSeverity, count));
    }
    return returnMap;
}
Also used : DefaultStatus(org.opennms.features.topology.api.topo.DefaultStatus) Status(org.opennms.features.topology.api.topo.Status) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ApplicationStatusEntity(org.opennms.netmgt.dao.api.ApplicationStatusEntity) DefaultStatus(org.opennms.features.topology.api.topo.DefaultStatus) OnmsSeverity(org.opennms.netmgt.model.OnmsSeverity) VertexRef(org.opennms.features.topology.api.topo.VertexRef)

Aggregations

Status (org.opennms.features.topology.api.topo.Status)26 ArrayList (java.util.ArrayList)17 VertexRef (org.opennms.features.topology.api.topo.VertexRef)15 Test (org.junit.Test)14 Criteria (org.opennms.features.topology.api.topo.Criteria)14 List (java.util.List)13 Map (java.util.Map)13 Collectors (java.util.stream.Collectors)12 Lists (com.google.common.collect.Lists)10 StatusProvider (org.opennms.features.topology.api.topo.StatusProvider)9 OnmsSeverity (org.opennms.netmgt.model.OnmsSeverity)9 AlarmSummary (org.opennms.netmgt.model.alarm.AlarmSummary)9 Collection (java.util.Collection)8 Objects (java.util.Objects)7 AbstractVertex (org.opennms.features.topology.api.topo.AbstractVertex)7 EdgeRef (org.opennms.features.topology.api.topo.EdgeRef)7 VertexProvider (org.opennms.features.topology.api.topo.VertexProvider)7 GraphMLServiceAccessor (org.opennms.features.topology.plugins.topo.graphml.internal.GraphMLServiceAccessor)6 Paths (java.nio.file.Paths)5 Date (java.util.Date)5