95a922052a66970f3ea0433f1300e6acbc77b97e
[policy/apex-pdp.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2020 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 importClass(org.slf4j.LoggerFactory);
23
24 importClass(java.util.ArrayList);
25
26 importClass(org.apache.avro.generic.GenericData.Array);
27 importClass(org.apache.avro.generic.GenericRecord);
28 importClass(org.apache.avro.Schema);
29
30 var logger = executor.logger;
31 logger.trace("start: " + executor.subject.id);
32 logger.trace("-- infields: " + executor.inFields);
33
34 var rootLogger = LoggerFactory.getLogger(logger.ROOT_LOGGER_NAME);
35
36 var ifEdgeName = executor.inFields["edgeName"];
37 var ifEdgeStatus = executor.inFields["status"].toString();
38 var ifhasChanged = executor.inFields["hasChanged"];
39 var ifMatchStart = executor.inFields["matchStart"];
40
41 var albumCustomerMap = executor.getContextAlbum("albumCustomerMap");
42 var albumProblemMap = executor.getContextAlbum("albumProblemMap");
43
44 var linkProblem = albumProblemMap.get(ifEdgeName);
45
46 // create outfiled for situation
47 var situation = executor.subject.getOutFieldSchemaHelper("situation").createNewInstance();
48 situation.put("violatedSLAs", new ArrayList());
49
50 // create a string as states+hasChanged+linkProblem and switch over it
51 var switchTest = ifEdgeStatus + ":" + ifhasChanged + ":" + (linkProblem == null ? "no" : "yes");
52 switch (switchTest) {
53 case "UP:false:no":
54     logger.trace("-- edge <" + ifEdgeName + "> UP:false:no => everything ok");
55     logger.info("vpnsla: everything ok");
56     situation.put("problemID", "NONE");
57     break;
58 case "UP:false:yes":
59     logger.trace("-- edge <" + ifEdgeName + "> UP:false:yes ==> did we miss earlier up?, removing problem");
60     albumProblemMap.remove(ifEdgeName);
61     linkProblem = null;
62     situation.put("problemID", "NONE");
63     break;
64 case "UP:true:no":
65     logger.trace("-- edge <" + ifEdgeName + "> UP:true:no ==> did we miss the earlier down?, creating new problem");
66     situation.put("problemID", ifEdgeName);
67     break;
68 case "UP:true:yes":
69     logger.trace("-- edge <" + ifEdgeName + "> UP:true:yes ==> detected solution, link up again");
70     logger.info("vpnsla: problem solved");
71     linkProblem.put("endTime", ifMatchStart);
72     linkProblem.put("status", "SOLVED");
73     situation.put("problemID", "NONE");
74     break;
75 case "DOWN:false:no":
76     logger.trace("-- edge <" + ifEdgeName + "> DOWN:false:no ==> did we miss an earlier down?, creating new problem");
77     situation.put("problemID", ifEdgeName);
78     break;
79 case "DOWN:false:yes":
80     logger.trace("-- edge <" + ifEdgeName + "> DOWN:false:yes ==> problem STILL exists");
81     logger.info("vpnsla: problem still exists");
82     linkProblem.put("status", "STILL");
83     situation.put("problemID", ifEdgeName);
84     break;
85 case "DOWN:true:no":
86     logger.trace("-- edge <" + ifEdgeName + "> DOWN:true:no ==> found NEW problem");
87     logger.info("vpnsla: this is a new problem");
88     situation.put("problemID", ifEdgeName);
89     break;
90 case "DOWN:true:yes":
91     logger.trace("-- edge <" + ifEdgeName
92             + "> DOWN:true:yes ==> did we miss to remove an earlier problem?, remove and create new problem");
93     linkProblem = null;
94     situation.put("problemID", ifEdgeName);
95     break;
96
97 default:
98     logger.error("-- input wrong for edge" + ifEdgeName + ": edge status <" + ifEdgeStatus
99             + "> unknown or null on hasChanged <" + ifhasChanged + ">");
100     rootLogger.error("-- input wrong for edge" + ifEdgeName + ": edge status <" + ifEdgeStatus
101             + "> unknown or null on hasChanged <" + ifhasChanged + ">");
102 }
103
104 // create new problem if situation requires it
105 if (situation.get("problemID").equals(ifEdgeName) && linkProblem == null) {
106     logger.trace("-- edge <" + ifEdgeName + "> creating new problem");
107     linkProblem = albumProblemMap.getSchemaHelper().createNewInstance();
108     linkProblem.put("edge", ifEdgeName);
109     linkProblem.put("startTime", ifMatchStart);
110     linkProblem.put("lastUpdate", ifMatchStart);
111     linkProblem.put("endTime", 0);
112     linkProblem.put("status", "NEW");
113     linkProblem.put("edgeUsedBy", new ArrayList());
114     linkProblem.put("impededLast", new ArrayList());
115
116     for (var i = 0; i < albumCustomerMap.values().size(); i++) {
117         var customer = albumCustomerMap.values().get(i);
118         var customerLinks = albumCustomerMap.values().get(i).get("links");
119         for (var k = 0; k < customerLinks.size(); k++) {
120             if (customerLinks.get(k) == ifEdgeName) {
121                 linkProblem.get("edgeUsedBy").add(customer.get("customerName"));
122             }
123         }
124     }
125     albumProblemMap.put(ifEdgeName, linkProblem);
126     logger.trace("-- edge <" + ifEdgeName + "> problem created as <" + linkProblem + ">");
127 }
128
129 // set dtYTD if situation requires it
130 if (linkProblem != null && (linkProblem.get("status") == "STILL" || linkProblem.get("status") == "SOLVED")) {
131     var linkDownTimeinSecs = (ifMatchStart - linkProblem.get("lastUpdate")) / 1000;
132     logger.trace("-- edge <" + ifEdgeName + "> down time: " + linkDownTimeinSecs + " s");
133     for (var k = 0; k < linkProblem.get("impededLast").size(); k++) {
134         for (var i = 0; i < albumCustomerMap.values().size(); i++) {
135             var customer = albumCustomerMap.values().get(i);
136             if (customer.get("customerName").equals(linkProblem.get("impededLast").get(k))) {
137                 logger.info("-- vpnsla: customer " + customer.get("customerName") + " YDT downtime increased from "
138                         + customer.get("dtYTD") + " to " + (customer.get("dtYTD") + linkDownTimeinSecs));
139                 customer.put("dtYTD", (customer.get("dtYTD") + linkDownTimeinSecs))
140             }
141         }
142     }
143     // set lastUpdate to this policy execution for next execution calculation
144     linkProblem.put("lastUpdate", ifMatchStart);
145 }
146
147 // check SLA violations if situation requires it
148 if (linkProblem != null && linkProblem.get("status") != "SOLVED") {
149     logger.info(">e> customer\tDT SLA\tDT YTD\tviolation");
150     for (var i = 0; i < albumCustomerMap.values().size(); i++) {
151         var customer = albumCustomerMap.values().get(i);
152         if (customer.get("dtYTD") > customer.get("dtSLA")) {
153             situation.get("violatedSLAs").add(customer.get("customerName"));
154             logger.info(">e> " + customer.get("customerName") + "\t\t" + customer.get("dtSLA") + "s\t"
155                     + customer.get("dtYTD") + "s\t" + "!!");
156         } else {
157             logger.info(">e> " + customer.get("customerName") + "\t\t" + customer.get("dtSLA") + "s\t"
158                     + customer.get("dtYTD") + "s");
159         }
160     }
161 }
162
163 executor.outFields["situation"] = situation;
164
165 logger.trace("-- out fields <" + executor.outFields + ">");
166
167 logger.trace("finished: " + executor.subject.id);
168 logger.debug(".e");
169
170 true;