Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/foundation-2018' into release-24…
Browse files Browse the repository at this point in the history
….1.0
  • Loading branch information
Benjamin Reed committed May 23, 2019
2 parents a987938 + 63c483e commit 30ac736
Show file tree
Hide file tree
Showing 18 changed files with 314 additions and 64 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2017-2017 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2017 The OpenNMS Group, Inc.
* Copyright (C) 2017-2019 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2019 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
Expand Down Expand Up @@ -55,7 +55,6 @@
* @author nalvarez
*/
public class JettyUserIdentityFilter implements Filter {

private static final Logger LOG = LoggerFactory.getLogger(JettyUserIdentityFilter.class);

@Override
Expand Down Expand Up @@ -109,21 +108,30 @@ public AuthenticationUserStub(Authentication authentication) {
this.authentication = authentication;
}

@Override
public String getAuthMethod() {
return null;
}

@Override
public UserIdentity getUserIdentity() {
return new UserIdentityStub(authentication);
}

@Override
public boolean isUserInRole(UserIdentity.Scope scope, String role) {
return false;
}

@Override
public void logout() {
// pass
}

@Override
public org.eclipse.jetty.server.Authentication logout(final ServletRequest request) {
return null;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ FROM
active_nodes.nodelabel,
active_nodes.nodesyslocation,
active_nodes.nodesysdescription,
EXTRACT (epoch from ('$P!{DS_START_TIME_STRING}'::TIMESTAMP + '$P!{DS_TIME_RANGE}'::INTERVAL) - '$P!{DS_START_TIME_STRING}'::TIMESTAMP) AS avail_total,
EXTRACT (epoch from ('$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE + '$P!{DS_TIME_RANGE}'::INTERVAL) - '$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE) AS avail_total,
CASE
WHEN
outage_scope.duration IS NULL
Expand Down Expand Up @@ -113,8 +113,8 @@ FROM
(SELECT
ipinterface.nodeid,
outages.svclosteventid AS "svclosteventid",
least(('$P!{DS_START_TIME_STRING}'::TIMESTAMP + '$P!{DS_TIME_RANGE}'::INTERVAL), outages.ifregainedservice) AS ifregainedservice,
greatest('$P!{DS_START_TIME_STRING}'::TIMESTAMP,outages.iflostservice) AS iflostservice
least(('$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE + '$P!{DS_TIME_RANGE}'::INTERVAL), outages.ifregainedservice) AS ifregainedservice,
greatest('$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE,outages.iflostservice) AS iflostservice
FROM
outages
JOIN
Expand All @@ -131,7 +131,8 @@ FROM
ifservices.ipinterfaceid = ipinterface.id
WHERE
events.eventuei = 'uei.opennms.org/nodes/nodeDown'
AND (iflostservice, COALESCE(ifregainedservice,'$P!{DS_END_TIME_STRING}'::TIMESTAMP)) OVERLAPS ('$P!{DS_START_TIME_STRING}'::TIMESTAMP, '$P!{DS_START_TIME_STRING}'::TIMESTAMP + '$P!{DS_TIME_RANGE}'::INTERVAL))
AND greatest('$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE,outages.iflostservice) < least(('$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE + '$P!{DS_TIME_RANGE}'::INTERVAL), outages.ifregainedservice)
AND (iflostservice, COALESCE(ifregainedservice,'$P!{DS_END_TIME_STRING}'::TIMESTAMP WITH TIME ZONE)) OVERLAPS ('$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE, '$P!{DS_START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE + '$P!{DS_TIME_RANGE}'::INTERVAL))
AS
raw_outages
GROUP BY
Expand Down Expand Up @@ -280,8 +281,8 @@ ORDER BY
</parameter>
<queryString>
<![CDATA[SELECT
'$P!{START_TIME_STRING}'::TIMESTAMP AS start,
'$P!{START_TIME_STRING}'::TIMESTAMP + '$P!{TIME_RANGE}'::INTERVAL AS end]]>
'$P!{START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE AS start,
'$P!{START_TIME_STRING}'::TIMESTAMP WITH TIME ZONE + '$P!{TIME_RANGE}'::INTERVAL AS end]]>
</queryString>
<field name="start" class="java.sql.Timestamp"/>
<field name="end" class="java.sql.Timestamp"/>
Expand Down Expand Up @@ -379,6 +380,9 @@ ORDER BY
<datasetParameter name="DS_TIME_RANGE">
<datasetParameterExpression><![CDATA[$P{TIME_RANGE}]]></datasetParameterExpression>
</datasetParameter>
<datasetParameter name="DS_TIME_RANGE_NUMBER">
<datasetParameterExpression><![CDATA[$P{TIME_RANGE_NUMBER}]]></datasetParameterExpression>
</datasetParameter>
<datasetParameter name="DS_START_TIME">
<datasetParameterExpression><![CDATA[$P{START_TIME}]]></datasetParameterExpression>
</datasetParameter>
Expand Down
10 changes: 10 additions & 0 deletions opennms-correlation/drools-correlation-engine/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,16 @@
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.awaitility</groupId>
<artifactId>awaitility</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<pluginRepositories>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.drools.compiler.compiler.DroolsParserException;
Expand All @@ -63,7 +64,6 @@
import org.opennms.netmgt.correlation.drools.config.RuleSet;
import org.opennms.netmgt.events.api.EventConstants;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.xml.event.AlarmData;
import org.opennms.netmgt.xml.event.Event;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -82,7 +82,10 @@
* @version $Id: $
*/
public class DroolsCorrelationEngine extends AbstractCorrelationEngine {

private static final Logger LOG = LoggerFactory.getLogger(DroolsCorrelationEngine.class);
// If state need to be reloaded in case of engine being reloaded because of exception in rules engine, set this system property to true.
public static final String RELOAD_STATE_AFTER_EXCEPTION = "org.opennms.netmgt.correlation.drools.reloadStateAfterException";

private KieBase m_kieBase;
private KieSession m_kieSession;
Expand All @@ -98,6 +101,7 @@ public class DroolsCorrelationEngine extends AbstractCorrelationEngine {
private Boolean m_persistState;
private Resource m_configPath;
private ApplicationContext m_configContext;
private List<Object> factObjects;

public DroolsCorrelationEngine(final String name, final MetricRegistry metricRegistry, final Resource configPath, final ApplicationContext configContext) {
this.m_name = name;
Expand All @@ -122,6 +126,10 @@ public ApplicationContext getConfigContext() {
/** {@inheritDoc} */
@Override
public synchronized void correlate(final Event e) {
if (m_kieSession == null) {
LOG.info("No valid session, Event with id: {} and UEI: {} will not be added as a fact.", e.getDbid(), e.getUei());
return;
}
LOG.debug("Begin correlation for Event {} uei: {}", e.getDbid(), e.getUei());
m_kieSession.insert(e);
try {
Expand All @@ -136,6 +144,10 @@ public synchronized void correlate(final Event e) {
/** {@inheritDoc} */
@Override
protected synchronized void timerExpired(final Integer timerId) {
if (m_kieSession == null) {
LOG.info("No valid session, Timer with Id {} will not be added as a fact.", timerId);
return;
}
LOG.info("Begin correlation for Timer {}", timerId);
TimerExpired expiration = new TimerExpired(timerId);
m_kieSession.insert(expiration);
Expand Down Expand Up @@ -196,6 +208,7 @@ public void initialize() throws Exception {
LOG.warn("Unable to initialize Drools engine: {}", kbuilder.getResults().getMessages(Level.ERROR));
throw new IllegalStateException("Unable to initialize Drools engine: " + kbuilder.getResults().getMessages(Level.ERROR));
}

KieContainer kContainer = ks.newKieContainer(ks.getRepository().getDefaultReleaseId());

AssertBehaviour behaviour = AssertBehaviour.determineAssertBehaviour(m_assertBehaviour);
Expand All @@ -221,25 +234,40 @@ public void initialize() throws Exception {
unmarshallStateFromDisk(true);
}

if (factObjects != null) {
factObjects.forEach(fact -> m_kieSession.insert(fact));
factObjects.clear();
}

if (m_isStreaming) {
new Thread(() -> {
new Thread(() -> {
Logging.putPrefix(getClass().getSimpleName() + '-' + getName());
try {
m_kieSession.fireUntilHalt();
} catch (Exception e) {
LOG.error("Exception while running rules, reloading engine ", e);
triggerAlarm(e);
reloadConfig();
doReload(e);
}
}, "FireTask").start();
}
}

private void triggerAlarm(Exception exception) {
// This will send drools exception event which should result into Alarm and send reload event.
private void doReload(Exception exception) {
// Trigger an alarm with the specific exception
EventBuilder eventBldr = new EventBuilder(EventConstants.DROOLS_ENGINE_ENCOUNTERED_EXCEPTION, getName());
eventBldr.addParam("enginename", getName());
eventBldr.addParam("stracktrace", ExceptionUtils.getStackTrace(exception));
sendEvent(eventBldr.getEvent());
// Send reload daemon event.
EventBuilder reloadEventBldr = new EventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_UEI, getName());
// Correlator.EngineAdapter uses this pattern for the engine name.
reloadEventBldr.addParam(EventConstants.PARM_DAEMON_NAME, this.getClass().getSimpleName() + "-" + getName());
// By default, no need to persist state after exception, but if this property is set, persist state.
if(!Boolean.getBoolean(RELOAD_STATE_AFTER_EXCEPTION)) {
reloadEventBldr.addParam("persistState", "false");
}
sendEvent(reloadEventBldr.getEvent());
}

private void loadRules(final KieFileSystem kfs) throws DroolsParserException, IOException {
Expand Down Expand Up @@ -270,17 +298,24 @@ public void tearDown() {
}
}

private void shutDownKieSession() {
private synchronized void shutDownKieSession() {
if (m_kieSession == null) {
return;
}
m_kieSession.halt();
m_kieSession.dispose();
m_kieSession.destroy();
m_kieSession = null;
}

private Path getPathToState() {
return Paths.get(System.getProperty("java.io.tmpdir"), "opennms.drools." + m_name + ".state");
}

private void marshallStateToDisk(boolean serialize) {
private synchronized void marshallStateToDisk(boolean serialize) {
if (m_kieSession == null) {
return;
}
final File stateFile = getPathToState().toFile();
LOG.debug("Saving state for engine {} in {} ...", m_name, stateFile);
final KieMarshallers kMarshallers = KieServices.Factory.get().getMarshallers();
Expand All @@ -292,6 +327,7 @@ private void marshallStateToDisk(boolean serialize) {
marshaller.marshall( fos, m_kieSession );
m_kieSession.dispose();
m_kieSession.destroy();
m_kieSession = null;
LOG.info("Sucessfully save state for engine {} in {}.", m_name, stateFile);
} catch (IOException e) {
LOG.error("Failed to save state for engine {} in {}.", m_name, stateFile, e);
Expand Down Expand Up @@ -373,15 +409,19 @@ public String toString() {
}

@Override
public void reloadConfig() {
public void reloadConfig(boolean persistState) {
EventBuilder ebldr = new EventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_SUCCESSFUL_UEI, getName());
ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "DroolsCorrelationEngine-" + m_name);
try {
LOG.info("Reloading configuration for engine {}", m_name);
EngineConfiguration cfg = JaxbUtils.unmarshal(EngineConfiguration.class, m_configPath);
Optional<RuleSet> opt = cfg.getRuleSetCollection().stream().filter(rs -> rs.getName().equals(getName())).findFirst();
if (opt.isPresent()) {
marshallStateToDisk(true);
if (persistState) {
saveFacts();
} else {
shutDownKieSession();
}
opt.get().updateEngine(this);
initialize();
} else {
Expand All @@ -396,4 +436,28 @@ public void reloadConfig() {
}
}

void saveFacts( ) {
if (m_kieSession == null) {
return;
}
m_kieSession.halt();
try {
// Capture the current set of facts
factObjects = m_kieSession.getFactHandles().stream()
.map(fact -> m_kieSession.getObject(fact))
.collect(Collectors.toList());
} catch (Exception e) {
LOG.warn("Failed to save facts", e);
}
m_kieSession.dispose();
m_kieSession.destroy();
m_kieSession = null;
}


List<Object> getFactObjects() {
return factObjects;
}


}
Loading

0 comments on commit 30ac736

Please sign in to comment.