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.dropwizard.ioc.utils.ServiceLocatorHolder;
14 import com.alibaba.fastjson.JSONArray;
15 import com.alibaba.fastjson.JSONObject;
17 import java.util.List;
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.UUID;
23 function String getAdditionalField(VesAlarm a, String field) {
24 List<AlarmAdditionalField> fields = a.getAlarmAdditionalInformation();
25 for (AlarmAdditionalField f : fields) {
26 if (f.getName().equals(field)) {
33 function String getLogicLink(VesAlarm alarm) {
34 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
35 return aai.getLogicLink(
36 getAdditionalField(alarm, "networkId"),
37 getAdditionalField(alarm, "node"),
38 getAdditionalField(alarm, "tp-id"),
43 function boolean isCorrelated(VesAlarm a, VesAlarm b) {
44 String logicLinkA = getLogicLink(a);
45 if (logicLinkA == null) {
49 String logicLinkB = getLogicLink(b);
50 if (logicLinkB == null) {
54 return logicLinkA.equals(logicLinkB);
57 function void updateAaiLinkStatus(String linkName, String status) {
58 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
59 Map<String, Object> body = new HashMap<String, Object>(){
61 put("operational-status", status);
64 aai.updateLogicLinkStatus(linkName, body);
67 function void updateAaiTpStatus(String networkId, String pnfName, String ifName, String status) {
68 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
69 Map<String, Object> body = new HashMap<String, Object>(){
71 put("operational-status", status);
74 aai.updateTerminalPointStatus(networkId, pnfName, ifName, body);
77 function Map<String, Object> getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) {
78 AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
79 JSONArray instances = aai.getServiceInstances(networkId, pnfName, ifName, status);
81 Map<String, Object> ret = new HashMap<String, Object>();
83 StringBuilder sbn = new StringBuilder();
84 StringBuilder sbi = new StringBuilder();
85 for(int i = 0; i < instances.size(); ++i) {
86 JSONObject o = instances.getJSONObject(i);
87 String name = o.getString("service-instance-name");
88 String id = o.getString("service-instance-id");
89 ret.put(id + ".input-parameters", o.getString("input-parameters"));
90 sbn.append(name).append(",");
91 sbi.append(id).append(",");
93 ret.put("service-instance.service-instance-name", sbn.substring(0, sbn.length() -1).toString());
94 ret.put("service-instance.service-instance-id", sbi.substring(0, sbi.length() -1).toString());
95 ret.put("vserver.vserver-name", "TBD");
96 ret.put("globalSubscriberId", instances.getJSONObject(0).getString("globalSubscriberId"));
97 ret.put("serviceType", instances.getJSONObject(0).getString("serviceType"));
102 function PolicyMsg createPolicyMsg(VesAlarm alarm) {
103 PolicyMsg m = new PolicyMsg();
104 m.setPolicyVersion("1.0.0.5");
105 m.setPolicyName("CCVPN");
106 m.setPolicyScope("service=SOTNService,type=SampleType,closedLoopControlName=CL-CCVPN-d925ed73-8231-4d02-9545-db4e101f88f8");
107 m.setClosedLoopControlName(DmaapService.loopControlNames.get("org.onap.holmes.ccvpn"));
108 m.setRequestID(UUID.randomUUID().toString());
109 m.setClosedLoopAlarmStart(alarm.getStartEpochMicrosec());
110 m.setClosedLoopAlarmEnd(alarm.getLastEpochMicrosec());
111 m.setTarget("vserver.vserver-name");
112 m.setAai(getAdditionalResourceInfo(
113 getAdditionalField(alarm, "networkId"),
114 getAdditionalField(alarm, "node"),
115 getAdditionalField(alarm, "tp-id"),
116 getAdditionalField(alarm, "oper-status")
119 DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID());
124 rule "Update AAI Information"
128 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
131 getAdditionalField($a, "networkId"),
132 getAdditionalField($a, "node"),
133 getAdditionalField($a, "tp-id"),
134 getAdditionalField($a, "oper-status")
138 rule "Set Up Correlation"
142 $a: VesAlarm($id: eventId,
143 $start: startEpochMicrosec,
144 eventName.indexOf("Fault_Route_Status") != -1)
145 $b: VesAlarm(eventId != $id,
146 eventName.indexOf("Fault_Route_Status") != -1,
147 Math.abs(startEpochMicrosec - $start) < 60000)
149 String status = "down";
150 if (status.equalsIgnoreCase(getAdditionalField($a, "oper-status"))
151 && status.equalsIgnoreCase(getAdditionalField($b, "oper-status"))) {
152 if (isCorrelated($a, $b)){
153 // If any of the alarms have been marked as root, a policy message has ever been created and sent. Do NOT send it again.
154 if ($a.getRootFlag() != 1 && $b.getRootFlag() != 1) {
155 PolicyMsg msg = createPolicyMsg($a);
156 DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class);
157 dmaapService.publishPolicyMsg(msg, "unauthenticated.DCAE_CL_OUTPUT");
158 updateAaiLinkStatus(getLogicLink($a), status);
172 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
174 if ("up".equalsIgnoreCase(getAdditionalField($a, "oper-status"))) {
175 if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) {
176 DmaapService.alarmUniqueRequestID.remove($a.getEventId());
179 //TODO: send alarm clearing message to Policy - for now it's not needed.