Replaced ServiceLocator with SpringContextUtil
[holmes/rule-management.git] / rules / ccvpn-rule.drl
1 package org.onap.holmes.ccvpn;
2
3 dialect "java"
4
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;
13
14 import com.google.gson.JsonObject;
15
16 import java.util.List;
17 import java.util.Map;
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.UUID;
21
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)) {
26                         return f.getValue();
27                 }
28         }
29         return null;
30 }
31
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"),
38                 null
39         );
40 }
41
42 function boolean isCorrelated(VesAlarm a, VesAlarm b) {
43         String logicLinkA = getLogicLink(a);
44         if (logicLinkA == null) {
45                 return false;
46         }
47
48         String logicLinkB = getLogicLink(b);
49         if (logicLinkB == null) {
50                 return false;
51         }
52
53         return logicLinkA.equals(logicLinkB);
54 }
55
56 function void updateAaiLinkStatus(String linkName, String status) {
57         AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
58         Map<String, Object> body = new HashMap<String, Object>(){
59                 {
60                         put("operational-status", status);
61                 }
62         };
63         aai.updateLogicLinkStatus(linkName, body);
64 }
65
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>(){
69                 {
70                         put("operational-status", status);
71                 }
72         };
73         aai.updateTerminalPointStatus(networkId, pnfName, ifName, body);
74 }
75
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);
79  
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);
86  
87     return ret;
88 }
89
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")
105         ));
106
107         DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID());
108
109         return m;
110 }
111
112 rule "Update AAI Information"
113         no-loop true
114         salience 300
115         when
116                 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
117         then
118                 updateAaiTpStatus (
119                         getAdditionalField($a, "networkId"),
120                         getAdditionalField($a, "node"),
121                         getAdditionalField($a, "tp-id"),
122                         getAdditionalField($a, "oper-status")
123                 );
124 end
125
126 rule "Set Up Correlation"
127         no-loop true
128         salience 200
129         when
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)
136         then
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);
147                         }
148                         $a.setRootFlag(1);
149                         $b.setRootFlag(1);
150                         update($a);
151                         update($b);
152                     }
153             }
154 end
155
156 rule "Clear Alarms"
157         no-loop true
158         salience 100
159         when
160                 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
161         then
162                 if ("up".equalsIgnoreCase(getAdditionalField($a, "oper-status"))) {
163                         if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) {
164                                 DmaapService.alarmUniqueRequestID.remove($a.getEventId());
165                         }
166         
167                         //TODO: send alarm clearing message to Policy - for now it's not needed.
168                 //...
169         
170                         retract($a);
171                 }
172 end