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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 importClass(org.slf4j.LoggerFactory);
24 importClass(java.util.ArrayList);
26 importClass(org.apache.avro.generic.GenericData.Array);
27 importClass(org.apache.avro.generic.GenericRecord);
28 importClass(org.apache.avro.Schema);
30 var logger = executor.logger;
31 logger.trace("start: " + executor.subject.id);
32 logger.trace("-- infields: " + executor.inFields);
34 var rootLogger = LoggerFactory.getLogger(logger.ROOT_LOGGER_NAME);
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"];
41 var albumCustomerMap = executor.getContextAlbum("albumCustomerMap");
42 var albumProblemMap = executor.getContextAlbum("albumProblemMap");
44 var linkProblem = albumProblemMap.get(ifEdgeName);
46 // create outfiled for situation
47 var situation = executor.subject.getOutFieldSchemaHelper("situation").createNewInstance();
48 situation.put("violatedSLAs", new ArrayList());
50 // create a string as states+hasChanged+linkProblem and switch over it
51 var switchTest = ifEdgeStatus + ":" + ifhasChanged + ":" + (linkProblem == null ? "no" : "yes");
54 logger.trace("-- edge <" + ifEdgeName + "> UP:false:no => everything ok");
55 logger.info("vpnsla: everything ok");
56 situation.put("problemID", "NONE");
59 logger.trace("-- edge <" + ifEdgeName + "> UP:false:yes ==> did we miss earlier up?, removing problem");
60 albumProblemMap.remove(ifEdgeName);
62 situation.put("problemID", "NONE");
65 logger.trace("-- edge <" + ifEdgeName + "> UP:true:no ==> did we miss the earlier down?, creating new problem");
66 situation.put("problemID", ifEdgeName);
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");
76 logger.trace("-- edge <" + ifEdgeName + "> DOWN:false:no ==> did we miss an earlier down?, creating new problem");
77 situation.put("problemID", ifEdgeName);
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);
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);
91 logger.trace("-- edge <" + ifEdgeName
92 + "> DOWN:true:yes ==> did we miss to remove an earlier problem?, remove and create new problem");
94 situation.put("problemID", ifEdgeName);
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 + ">");
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());
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"));
125 albumProblemMap.put(ifEdgeName, linkProblem);
126 logger.trace("-- edge <" + ifEdgeName + "> problem created as <" + linkProblem + ">");
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))
143 // set lastUpdate to this policy execution for next execution calculation
144 linkProblem.put("lastUpdate", ifMatchStart);
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" + "!!");
157 logger.info(">e> " + customer.get("customerName") + "\t\t" + customer.get("dtSLA") + "s\t"
158 + customer.get("dtYTD") + "s");
163 executor.outFields["situation"] = situation;
165 logger.trace("-- out fields <" + executor.outFields + ">");
167 logger.trace("finished: " + executor.subject.id);