1 package org.onap.holmes.ccvpn;
5 import org.onap.holmes.common.api.stat.VesAlarm;
6 import org.onap.holmes.common.api.stat.AlarmAdditionalField;
7 import org.onap.holmes.common.aai.AaiQuery4Ccvpn;
8 import org.onap.holmes.common.exception.CorrelationException;
9 import org.onap.holmes.common.dmaap.entity.PolicyMsg;
10 import org.onap.holmes.common.dmaap.DmaapService;
11 import org.onap.holmes.common.utils.DroolsLog;
12 import org.onap.holmes.common.utils.SpringContextUtil;
14 import com.google.gson.JsonObject;
16 import java.util.List;
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.UUID;
22 function String getAdditionalField(VesAlarm a, String field) {
23 List<AlarmAdditionalField> fields = a.getAlarmAdditionalInformation();
24 for (AlarmAdditionalField f : fields) {
25 if (f.getName().equals(field)) {
32 function String getLogicLink(VesAlarm alarm) {
33 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
34 return aai.getLogicLink(
35 getAdditionalField(alarm, "networkId"),
36 getAdditionalField(alarm, "node"),
37 getAdditionalField(alarm, "tp-id"),
42 function boolean isCorrelated(VesAlarm a, VesAlarm b) {
43 String logicLinkA = getLogicLink(a);
44 if (logicLinkA == null) {
48 String logicLinkB = getLogicLink(b);
49 if (logicLinkB == null) {
53 return logicLinkA.equals(logicLinkB);
56 function void updateAaiLinkStatus(String linkName, String status) {
57 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
58 Map<String, Object> body = new HashMap<String, Object>(){
60 put("operational-status", status);
63 aai.updateLogicLinkStatus(linkName, body);
66 function void updateAaiTpStatus(String networkId, String pnfName, String ifName, String status) {
67 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
68 Map<String, Object> body = new HashMap<String, Object>(){
70 put("operational-status", status);
73 aai.updateTerminalPointStatus(networkId, pnfName, ifName, body);
76 function Map<String, Object> getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) {
77 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
78 JsonObject instance = aai.getServiceInstance(networkId, pnfName, ifName, status);
80 Map<String, Object> ret = new HashMap<String, Object>();
81 ret.put("service-instance.service-instance-id", instance.get("service-instance-id").getAsString());
82 ret.put("vserver.vserver-name", "TBD");
83 ret.put("globalSubscriberId", instance.get("globalSubscriberId").getAsString());
84 ret.put("serviceType", instance.get("serviceType").getAsString());
85 ret.put("network-information.network-id", networkId);
90 function PolicyMsg createPolicyMsg(VesAlarm alarm) {
91 PolicyMsg m = new PolicyMsg();
92 m.setPolicyVersion("1.0.0.5");
93 m.setPolicyName("CCVPN");
94 m.setPolicyScope("service=SOTNService,type=SampleType,closedLoopControlName=CL-CCVPN-d925ed73-8231-4d02-9545-db4e101f88f8");
95 m.setClosedLoopControlName(DmaapService.loopControlNames.get("org.onap.holmes.ccvpn"));
96 m.setRequestID(UUID.randomUUID().toString());
97 m.setClosedLoopAlarmStart(alarm.getStartEpochMicrosec());
98 m.setClosedLoopAlarmEnd(alarm.getLastEpochMicrosec());
99 m.setTarget("vserver.vserver-name");
100 m.setAai(getAdditionalResourceInfo(
101 getAdditionalField(alarm, "networkId"),
102 getAdditionalField(alarm, "node"),
103 getAdditionalField(alarm, "tp-id"),
104 getAdditionalField(alarm, "oper-status")
107 DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID());
112 rule "Update AAI Information"
116 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
119 getAdditionalField($a, "networkId"),
120 getAdditionalField($a, "node"),
121 getAdditionalField($a, "tp-id"),
122 getAdditionalField($a, "oper-status")
126 rule "Set Up Correlation"
130 $a: VesAlarm($id: eventId,
131 $start: startEpochMicrosec,
132 eventName.indexOf("Fault_Route_Status") != -1)
133 $b: VesAlarm(eventId != $id,
134 eventName.indexOf("Fault_Route_Status") != -1,
135 Math.abs(startEpochMicrosec - $start) < 60000)
137 String status = "down";
138 if (status.equalsIgnoreCase(getAdditionalField($a, "oper-status"))
139 && status.equalsIgnoreCase(getAdditionalField($b, "oper-status"))) {
140 if (isCorrelated($a, $b)){
141 // If any of the alarms have been marked as root, a policy message has ever been created and sent. Do NOT send it again.
142 if ($a.getRootFlag() != 1 && $b.getRootFlag() != 1) {
143 PolicyMsg msg = createPolicyMsg($a);
144 DmaapService dmaapService = SpringContextUtil.getBean(DmaapService.class);
145 dmaapService.publishPolicyMsg(msg, "dcae_cl_out");
146 updateAaiLinkStatus(getLogicLink($a), status);
160 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
162 if ("up".equalsIgnoreCase(getAdditionalField($a, "oper-status"))) {
163 if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) {
164 DmaapService.alarmUniqueRequestID.remove($a.getEventId());
167 //TODO: send alarm clearing message to Policy - for now it's not needed.