Initial Submission of the CCVPN Rule
[holmes/rule-management.git] / rules / ccvnp-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                 getAdditionalField(alarm, "oper-status")
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 updateAaiStatus(String networkId, String pnfName, String ifName,
58                 String linkName, String status) {
59         AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
60         Map<String, Object> body = new HashMap<String, Object>(){
61                 {
62                         put("operational-status", status);
63                 }
64         };
65         aai.updateLogicLinkStatus(linkName, body);
66         aai.updateTerminalPointStatus(networkId, pnfName, ifName, body);
67 }
68
69 function Map<String, Object> getAdditionalResourceInfo(String networkId, String pnfName, String ifName, String status) {
70         AaiQuery4Ccvpn aai = AaiQuery4Ccvpn.newInstance();
71         JSONArray instances = aai.getServiceInstances(networkId, pnfName, ifName, status);
72
73         Map<String, Object> ret = new HashMap<String, Object>();
74
75         StringBuilder sb = new StringBuilder();
76         for(int i = 0; i < instances.size(); ++i) {
77                 JSONObject o = instances.getJSONObject(i);
78                 String name = instances.getJSONObject(i).getString("service-instance-name");
79                 ret.put(name + ".input-parameters", "TBD");
80                 sb.append(name).append(",");
81         }
82         ret.put("service-instance.service-instance-name", sb.substring(0, sb.length() -1).toString());
83         ret.put("vserver.vserver-name", "TBD");
84
85         return ret;
86 }
87
88 function PolicyMsg createPolicyMsg(VesAlarm alarm) {
89         PolicyMsg m = new PolicyMsg();
90         m.setPolicyVersion("1.0.0.5");
91         m.setPolicyName("CCVPN");
92         m.setPolicyScope("service=SOTNService,type=SampleType,closedLoopControlName=CL-CCVPN-d925ed73-8231-4d02-9545-db4e101f88f8");
93         m.setClosedLoopControlName(DmaapService.loopControlNames.get("org.onap.holmes.ccvpn"));
94         m.setRequestID(UUID.randomUUID().toString());
95         m.setClosedLoopAlarmStart(alarm.getStartEpochMicrosec());
96         m.setClosedLoopAlarmEnd(alarm.getLastEpochMicrosec());
97         m.setTarget("vserver.vserver-name");
98         m.setAai(getAdditionalResourceInfo(
99                 getAdditionalField(alarm, "networkId"),
100                 getAdditionalField(alarm, "node"),
101                 getAdditionalField(alarm, "tp-id"),
102                 getAdditionalField(alarm, "oper-status")
103         ));
104
105         DmaapService.alarmUniqueRequestID.put(alarm.getEventId(), m.getRequestID());
106
107         return m;
108 }
109
110 rule "Update AAI Information"
111         no-loop true
112         salience 300
113         when
114                 $a: VesAlarm(eventName.indexOf("Fault_Route_Status") != -1)
115         then
116         updateAaiStatus (
117                 getAdditionalField($a, "networkId"),
118                 getAdditionalField($a, "node"),
119                 getAdditionalField($a, "tp-id"),
120                 getLogicLink($a),
121                 getAdditionalField($a, "oper-status")
122         );
123 end
124
125 rule "Set Up Correlation"
126         no-loop true
127         salience 200
128         when
129                 $a: VesAlarm($id: eventId, $start: startEpochMicrosec, eventName.indexOf("Fault_Route_Status") != -1)
130                 $b: VesAlarm(eventId != $id, eventName.indexOf("Fault_Route_Status") != -1, Math.abs(startEpochMicrosec - $start) < 60000)
131         then
132             if (isCorrelated($a, $b)){
133                 // If any of the alarms have been marked as root, a policy message has ever been created and sent. Do NOT send it again.
134                 if ($a.getRootFlag() != 1 && $b.getRootFlag() != 1) {
135                         PolicyMsg msg = createPolicyMsg($a);     
136                         DmaapService dmaapService = ServiceLocatorHolder.getLocator().getService(DmaapService.class);
137                         dmaapService.publishPolicyMsg(msg, "unauthenticated.DCAE_CL_OUTPUT");
138                 }
139                 $a.setRootFlag(1);
140                 $b.setRootFlag(1);
141                 update($a);
142                 update($b);
143             }
144 end
145
146 rule "Clear Alarms"
147         no-loop true
148         salience 100
149         when
150                 $a: VesAlarm(alarmIsCleared == 1, eventName.indexOf("Fault_Route_Status") != -1)
151         then
152                 if (DmaapService.alarmUniqueRequestID.containsKey($a.getEventId())) {
153                         DmaapService.alarmUniqueRequestID.remove($a.getEventId());
154                 }
155
156                 //TODO: send alarm clearing message to Policy - for now it's not needed.
157         //...
158
159                 retract($a);
160 end