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
  • No labels