Changed the CL Ouput Topic to dcae_cl_out
[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.dropwizard.ioc.utils.ServiceLocatorHolder;
13
14 import com.alibaba.fastjson.JSONArray;
15 import com.alibaba.fastjson.JSONObject;
16
17 import java.util.List;
18 import java.util.Map;
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.UUID;
22
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)) {
27                         return f.getValue();
28                 }
29         }
30         return null;
31 }
32
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"),
39                 null
40         );
41 }
42
43 function boolean isCorrelated(VesAlarm a, VesAlarm b) {
44         String logicLinkA = getLogicLink(a);
45         if (logicLinkA == null) {
46                 return false;
47         }
48
49         String logicLinkB = getLogicLink(b);
50         if (logicLinkB == null) {
51                 return false;
52         }
53
54         return logicLinkA.equals(logicLinkB);
55 }
56
57 function void updateAaiLinkStatus(String linkName, String status) {
58         AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
59         Map<String, Object> body = new HashMap<String, Object>(){
60                 {
61                         put("operational-status", status);
62                 }
63         };
64         aai.updateLogicLinkStatus(linkName, body);
65 }
66
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>(){
70                 {
71                         put("operational-status", status);
72                 }
73         };
74         aai.updateTerminalPointStatus(networkId, pnfName, ifName, body);
75 }
76
77 function Map<String, Object> getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) {
78     AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
79     JSONObject instance = aai.getServiceInstance(networkId, pnfName, ifName, status);
80  
81     Map<String, Object> ret = new HashMap<String, Object>();
82     ret.put("service-instance.service-instance-id", instance.getString("service-instance-id"));
83     ret.put("vserver.vserver-name", "TBD");
84     ret.put("globalSubscriberId", instance.getString("globalSubscriberId"));
85     ret.put("serviceType", instance.getString("serviceType"));
86     ret.put("network-information.network-id", networkId);
87  
88     return ret;
89 }
90
91 function PolicyMsg createPolicyMsg(VesAlarm alarm) {
92         PolicyMsg m = new PolicyMsg();
93         m.setPolicyVersion("1.0.0.5");
94         m.setPolicyName("CCVPN");
95         m.setPolicyScope("service=SOTNService,type=SampleType,closedLoopControlName=CL-CCVPN-d925ed73-8231-4d02-9545-db4e101f88f8");
96         m.setClosedLoopControlName(DmaapService.loopControlNames.get("org.onap.holmes.ccvpn"));
97         m.setRequestID(UUID.randomUUID().toString());
98         m.setClosedLoopAlarmStart(alarm.getStartEpochMicrosec());
99         m.setClosedLoopAlarmEnd(alarm.getLastEpochMicrosec());
100         m.setTarget("vserver.vserver-name");
101         m.setAai(getAdditionalResourceInfo(
102                 getAdditionalField(alarm, "networkId"),
103                 getAdditionalField(alarm, "node"),
104                 getAdditionalField(alarm, "tp-id"),
105                 getAdditionalField(alarm, "oper-status")
106         ));
107
108         DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID());
109
110         return m;
111 }
112
113 rule "Update AAI Information"
114         no-loop true
115         salience 300
116         when
117                 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
118         then
119                 updateAaiTpStatus (
120                         getAdditionalField($a, "networkId"),
121                         getAdditionalField($a, "node"),
122                         getAdditionalField($a, "tp-id"),
123                         getAdditionalField($a, "oper-status")
124                 );
125 end
126
127 rule "Set Up Correlation"
128         no-loop true
129         salience 200
130         when
131                 $a: VesAlarm($id: eventId, 
132                                                 $start: startEpochMicrosec, 
133                                                 eventName.indexOf("Fault_Route_Status") != -1)
134                 $b: VesAlarm(eventId != $id, 
135                                                 eventName.indexOf("Fault_Route_Status") != -1, 
136                                                 Math.abs(startEpochMicrosec - $start) < 60000)
137         then
138                 String status = "down";
139                 if (status.equalsIgnoreCase(getAdditionalField($a, "oper-status")) 
140                                 && status.equalsIgnoreCase(getAdditionalField($b, "oper-status"))) {
141                     if (isCorrelated($a, $b)){
142                         // If any of the alarms have been marked as root, a policy message has ever been created and sent. Do NOT send it again.
143                         if ($a.getRootFlag() != 1 && $b.getRootFlag() != 1) {
144                                 PolicyMsg msg = createPolicyMsg($a);
145                                 DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class);
146                                 dmaapService.publishPolicyMsg(msg, "dcae_cl_out");
147                                 updateAaiLinkStatus(getLogicLink($a), status);
148                         }
149                         $a.setRootFlag(1);
150                         $b.setRootFlag(1);
151                         update($a);
152                         update($b);
153                     }
154             }
155 end
156
157 rule "Clear Alarms"
158         no-loop true
159         salience 100
160         when
161                 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
162         then
163                 if ("up".equalsIgnoreCase(getAdditionalField($a, "oper-status"))) {
164                         if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) {
165                                 DmaapService.alarmUniqueRequestID.remove($a.getEventId());
166                         }
167         
168                         //TODO: send alarm clearing message to Policy - for now it's not needed.
169                 //...
170         
171                         retract($a);
172                 }
173 end