summaryrefslogtreecommitdiffstats
path: root/rules/ccvpn-rule.drl
diff options
context:
space:
mode:
Diffstat (limited to 'rules/ccvpn-rule.drl')
-rw-r--r--rules/ccvpn-rule.drl184
1 files changed, 184 insertions, 0 deletions
diff --git a/rules/ccvpn-rule.drl b/rules/ccvpn-rule.drl
new file mode 100644
index 0000000..e006dbb
--- /dev/null
+++ b/rules/ccvpn-rule.drl
@@ -0,0 +1,184 @@
+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 newline at end of file