Use Cases - Casablanca


VoLTE

Holmes Rule for VoLTE
package org.onap.holmes.droolsRule; import org.onap.holmes.common.dmaap.DmaapService; import org.onap.holmes.common.api.stat.VesAlarm; import org.onap.holmes.common.aai.CorrelationUtil; import org.onap.holmes.common.dmaap.entity.PolicyMsg; import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder; import org.onap.holmes.common.utils.DroolsLog; rule "Relation_analysis_Rule" salience 200 no-loop true when $root : VesAlarm(alarmIsCleared == 0, $sourceId: sourceId, sourceId != null && !sourceId.equals(""), $sourceName: sourceName, sourceName != null && !sourceName.equals(""), $startEpochMicrosec: startEpochMicrosec, eventName in ("Fault_MultiCloud_VMFailure"), $eventId: eventId) $child : VesAlarm( eventId != $eventId, parentId == null, CorrelationUtil.getInstance().isTopologicallyRelated(sourceId, $sourceId, $sourceName), eventName in ("Fault_IMSSBC_Backup MPU is down"), startEpochMicrosec < $startEpochMicrosec + 600000000 && startEpochMicrosec > $startEpochMicrosec - 600000000 ) then DroolsLog.printInfo("Correlation Identified: Root: ID=" + $root.getEventId() + ", Event Name=" + $root.getEventName() +"; Child: ID=" + $child.getEventId() + ", Event Name=" + $child.getEventName()); $child.setParentId($root.getEventId()); update($child); end rule "root_has_child_handle_Rule" salience 150 no-loop true when $root : VesAlarm(alarmIsCleared == 0, rootFlag == 0, $eventId: eventId) $child : VesAlarm(eventId != $eventId, parentId == $eventId) then DroolsLog.printInfo("Root alarm: ID=" + $root.getEventId() + ", Event Name=" + $root.getEventName()); DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class); PolicyMsg policyMsg = dmaapService.getPolicyMsg($root, $child, "org.onap.holmes.droolsRule"); dmaapService.publishPolicyMsg(policyMsg, "unauthenticated.DCAE_CL_OUTPUT"); $root.setRootFlag(1); update($root); end rule "root_no_child_handle_Rule" salience 100 no-loop true when $root : VesAlarm(alarmIsCleared == 0, rootFlag == 0, sourceId != null && !sourceId.equals(""), sourceName != null && !sourceName.equals(""), eventName in ("Fault_MultiCloud_VMFailure")) then DroolsLog.printInfo("New alarm: ID=" + $root.getEventId() + ", Event Name=" + $root.getEventName()); DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class); PolicyMsg policyMsg = dmaapService.getPolicyMsg($root, null, "org.onap.holmes.droolsRule"); dmaapService.publishPolicyMsg(policyMsg, "unauthenticated.DCAE_CL_OUTPUT"); $root.setRootFlag(1); update($root); end rule "root_cleared_handle_Rule" salience 100 no-loop true when $root : VesAlarm(alarmIsCleared == 1, rootFlag == 1) then DroolsLog.printInfo("Alarm cleared: ID=" + $root.getEventId() + ", Event Name=" + $root.getEventName()); DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class); PolicyMsg policyMsg = dmaapService.getPolicyMsg($root, null, "org.onap.holmes.droolsRule"); dmaapService.publishPolicyMsg(policyMsg, "unauthenticated.DCAE_CL_OUTPUT"); retract($root); end rule "child_handle_Rule" salience 100 no-loop true when $child : VesAlarm(alarmIsCleared == 1, rootFlag == 0) then DroolsLog.printInfo("Alarm cleared: ID=" + $child.getEventId() + ", Event Name=" + $child.getEventName()); retract($child); end

CCVPN

Holmes Rule for CCVPN
package org.onap.holmes.ccvpn; dialect "java" import org.onap.holmes.common.api.stat.VesAlarm; import org.onap.holmes.common.api.stat.AlarmAdditionalField; import org.onap.holmes.common.aai.AaiQuery4Ccvpn; import org.onap.holmes.common.exception.CorrelationException; import org.onap.holmes.common.dmaap.entity.PolicyMsg; import org.onap.holmes.common.dmaap.DmaapService; import org.onap.holmes.common.utils.DroolsLog; import org.onap.holmes.common.dropwizard.ioc.utils.ServiceLocatorHolder; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.util.List; import java.util.Map; import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; function String getAdditionalField(VesAlarm a, String field) { List<AlarmAdditionalField> fields = a.getAlarmAdditionalInformation(); for (AlarmAdditionalField f : fields) { if (f.getName().equals(field)) { return f.getValue(); } } return null; } function String getLogicLink(VesAlarm alarm) { AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); return aai.getLogicLink( getAdditionalField(alarm, "networkId"), getAdditionalField(alarm, "node"), getAdditionalField(alarm, "tp-id"), null ); } function boolean isCorrelated(VesAlarm a, VesAlarm b) { String logicLinkA = getLogicLink(a); if (logicLinkA == null) { return false; } String logicLinkB = getLogicLink(b); if (logicLinkB == null) { return false; } return logicLinkA.equals(logicLinkB); } function void updateAaiLinkStatus(String linkName, String status) { AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); Map<String, Object> body = new HashMap<String, Object>(){ { put("operational-status", status); } }; aai.updateLogicLinkStatus(linkName, body); } function void updateAaiTpStatus(String networkId, String pnfName, String ifName, String status) { AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); Map<String, Object> body = new HashMap<String, Object>(){ { put("operational-status", status); } }; aai.updateTerminalPointStatus(networkId, pnfName, ifName, body); } function Map<String, Object> getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) { AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance(); JSONArray instances = aai.getServiceInstances(networkId, pnfName, ifName, status); Map<String, Object> ret = new HashMap<String, Object>(); StringBuilder sbn = new StringBuilder(); StringBuilder sbi = new StringBuilder(); for(int i = 0; i < instances.size(); ++i) { JSONObject o = instances.getJSONObject(i); String name = o.getString("service-instance-name"); String id = o.getString("service-instance-id"); ret.put(id + ".input-parameters", o.getString("input-parameters")); sbn.append(name).append(","); sbi.append(id).append(","); } ret.put("service-instance.service-instance-name", sbn.substring(0, sbn.length() -1).toString()); ret.put("service-instance.service-instance-id", sbi.substring(0, sbi.length() -1).toString()); ret.put("vserver.vserver-name", "TBD"); ret.put("globalSubscriberId", instances.getJSONObject(0).getString("globalSubscriberId")); ret.put("serviceType", instances.getJSONObject(0).getString("serviceType")); return ret; } function PolicyMsg createPolicyMsg(VesAlarm alarm) { PolicyMsg m = new PolicyMsg(); m.setPolicyVersion("1.0.0.5"); m.setPolicyName("CCVPN"); m.setPolicyScope("service=SOTNService,type=SampleType,closedLoopControlName=CL-CCVPN-d925ed73-8231-4d02-9545-db4e101f88f8"); m.setClosedLoopControlName(DmaapService.loopControlNames.get("org.onap.holmes.ccvpn")); m.setRequestID(UUID.randomUUID().toString()); m.setClosedLoopAlarmStart(alarm.getStartEpochMicrosec()); m.setClosedLoopAlarmEnd(alarm.getLastEpochMicrosec()); m.setTarget("vserver.vserver-name"); m.setAai(getAdditionalResourceInfo( getAdditionalField(alarm, "networkId"), getAdditionalField(alarm, "node"), getAdditionalField(alarm, "tp-id"), getAdditionalField(alarm, "oper-status") )); DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID()); return m; } rule "Update AAI Information" no-loop true salience 300 when $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1) then updateAaiTpStatus ( getAdditionalField($a, "networkId"), getAdditionalField($a, "node"), getAdditionalField($a, "tp-id"), getAdditionalField($a, "oper-status") ); end rule "Set Up Correlation" no-loop true salience 200 when $a: VesAlarm($id: eventId, $start: startEpochMicrosec, eventName.indexOf("Fault_Route_Status") != -1) $b: VesAlarm(eventId != $id, eventName.indexOf("Fault_Route_Status") != -1, Math.abs(startEpochMicrosec - $start) < 60000) then String status = "down"; if (status.equalsIgnoreCase(getAdditionalField($a, "oper-status")) && status.equalsIgnoreCase(getAdditionalField($b, "oper-status"))) { if (isCorrelated($a, $b)){ // If any of the alarms have been marked as root, a policy message has ever been created and sent. Do NOT send it again. if ($a.getRootFlag() != 1 && $b.getRootFlag() != 1) { PolicyMsg msg = createPolicyMsg($a); DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class); dmaapService.publishPolicyMsg(msg, "unauthenticated.DCAE_CL_OUTPUT"); updateAaiLinkStatus(getLogicLink($a), status); } $a.setRootFlag(1); $b.setRootFlag(1); update($a); update($b); } } end rule "Clear Alarms" no-loop true salience 100 when $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1) then if ("up".equalsIgnoreCase(getAdditionalField($a, "oper-status"))) { if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) { DmaapService.alarmUniqueRequestID.remove($a.getEventId()); } //TODO: send alarm clearing message to Policy - for now it's not needed. //... retract($a); } end