use of alma.alarmsystem.alarmmessage.generated.ReductionLinkType in project ACS by ACS-Community.
the class ACSAlarmDAOImpl method loadReductionRules.
/**
* Load the reduction rules from the CDB.
*
* Read the reduction rules from the CDB and set up the alarms accordingly
*/
private void loadReductionRules() {
if (conf == null) {
throw new IllegalStateException("Missing dal");
}
// The reduction rules (<parent, child>)
ArrayList<LinkSpec> reductionRules = new ArrayList<LinkSpec>();
String xml;
try {
xml = conf.getConfiguration(REDUCTION_DEFINITION_PATH);
} catch (CDBRecordDoesNotExistEx cdbEx) {
// No reduction rules defined in CDB
logger.log(AcsLogLevel.WARNING, "No reduction rules defined in CDB");
return;
} catch (Exception e) {
throw new RuntimeException("Couldn't read " + REDUCTION_DEFINITION_PATH, e);
}
ReductionDefinitions rds;
try {
rds = (ReductionDefinitions) ReductionDefinitions.unmarshalReductionDefinitions(new StringReader(xml));
} catch (Exception e) {
throw new RuntimeException("Couldn't parse " + REDUCTION_DEFINITION_PATH, e);
}
// Read the links to create from the CDB
ReductionLinkDefinitionListType ltc = rds.getLinksToCreate();
// Read the thresholds from the CDB
Thresholds thresholds = rds.getThresholds();
if (ltc != null) {
ReductionLinkType[] rls = ltc.getReductionLink();
for (ReductionLinkType link : rls) {
Parent p = link.getParent();
Child c = link.getChild();
if (p == null || c == null) {
throw new RuntimeException("Missing child or parent in a reduction link");
}
boolean isMulti;
if ("MULTIPLICITY".equals(link.getType())) {
isMulti = true;
} else if ("NODE".equals(link.getType())) {
isMulti = false;
} else {
throw new RuntimeException("Unknown reduction-link type: " + link.getType());
}
if (p.getAlarmDefinition() == null || c.getAlarmDefinition() == null)
throw new RuntimeException("Missing alarm-definition in child or parent");
LinkSpec newRule = new LinkSpec(toMatcher(p.getAlarmDefinition()), toMatcher(c.getAlarmDefinition()), isMulti);
reductionRules.add(newRule);
StringBuffer buf = new StringBuffer();
buf.replace(0, buf.length(), "");
if (newRule.isMultiplicity) {
buf.append("Found MULTIPLICITY RR: parent <");
} else {
buf.append("Found NODE RR: parent=<");
}
buf.append(newRule.parent.family + ", " + newRule.parent.member + ", " + newRule.parent.minCode + "-" + newRule.parent.minCode + ">");
buf.append(" child=<" + newRule.child.family + ", " + newRule.child.member + ", " + newRule.child.minCode + "-" + newRule.child.minCode + ">");
logger.log(AcsLogLevel.DEBUG, buf.toString());
}
}
logger.log(AcsLogLevel.DEBUG, reductionRules.size() + " reduction rules read from CDB");
Collection<Alarm> cc = alarmDefs.values();
AlarmImpl[] allAlarms = new AlarmImpl[cc.size()];
cc.toArray(allAlarms);
LinkSpec[] ls = new LinkSpec[reductionRules.size()];
reductionRules.toArray(ls);
int num = allAlarms.length;
int numls = ls.length;
for (int a = 0; a < num; a++) {
AlarmImpl parent = allAlarms[a];
for (LinkSpec lsb : ls) {
if (lsb.matchParent(parent)) {
AlarmRefMatcher childMatcher = lsb.child;
boolean isMulti = lsb.isMultiplicity();
for (int c = 0; c < num; c++) {
if (a == c) {
continue;
}
AlarmImpl aic = allAlarms[c];
if (childMatcher.isMatch(aic)) {
if (isMulti) {
parent.addMultiplicityChild(aic);
logger.log(AcsLogLevel.DEBUG, "Added MULTI RR node child " + aic.getAlarmId() + " to " + parent.getAlarmId());
} else {
parent.addNodeChild(aic);
logger.log(AcsLogLevel.DEBUG, "Added NODE RR node child " + aic.getAlarmId() + " to " + parent.getAlarmId());
}
}
}
}
}
}
if (thresholds != null && thresholds.getThresholdCount() > 0) {
Threshold[] ta = thresholds.getThreshold();
for (AlarmImpl alarm : allAlarms) {
String alarmFF = alarm.getTriplet().getFaultFamily();
String alarmFM = alarm.getTriplet().getFaultMember();
Integer alarmFC = alarm.getTriplet().getFaultCode();
for (Threshold threshold : ta) {
String thresholdFF = threshold.getAlarmDefinition().getFaultFamily();
String thresholdFM = threshold.getAlarmDefinition().getFaultMember();
int thresholdFC = threshold.getAlarmDefinition().getFaultCode();
int thresholdVal = threshold.getValue();
if (alarmFF.equals(thresholdFF) && alarmFM.equals(thresholdFM) && alarmFC == thresholdFC) {
alarm.setMultiplicityThreshold(thresholdVal);
logger.log(AcsLogLevel.DEBUG, "Threshold = " + thresholdVal + " set in alarm " + alarm.getAlarmId());
}
}
}
}
}
use of alma.alarmsystem.alarmmessage.generated.ReductionLinkType in project ACS by ACS-Community.
the class ACSAlarmDAOImplTest method testGetReductionDefinitions.
public void testGetReductionDefinitions() {
Parent p = new Parent();
Child c = new Child();
AlarmDefinition ad_p = new AlarmDefinition();
AlarmDefinition ad_c = new AlarmDefinition();
ad_p.setFaultFamily("A1");
ad_p.setFaultMember("B1");
ad_p.setFaultCode(1);
ad_c.setFaultFamily("A2");
ad_c.setFaultMember("B2");
ad_c.setFaultCode(2);
p.setAlarmDefinition(ad_p);
c.setAlarmDefinition(ad_c);
ReductionLinkType rl = new ReductionLinkType();
rl.setParent(p);
rl.setChild(c);
rl.setType("NODE");
ReductionDefinitions rds = _alarmDAO.getReductionRules();
_alarmDAO.addReductionRule(rds, rl);
//_alarmDAO.flushReductionRules(rds);
}
Aggregations