Development of NETCONF RPCs for tr-069 adapter to
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / controller / AlarmMappingHandler.java
1 /*
2  * ============LICENSE_START========================================================================
3  * ONAP : tr-069-adapter
4  * =================================================================================================
5  * Copyright (C) 2020 CommScope Inc Intellectual Property.
6  * =================================================================================================
7  * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You
9  * may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
14  * either express or implied. See the License for the specific language governing permissions and
15  * limitations under the License.
16  * ===============LICENSE_END=======================================================================
17  */
18 package org.commscope.tr069adapter.vesagent.controller;
19
20 import com.fasterxml.jackson.core.JsonProcessingException;
21 import com.fasterxml.jackson.databind.ObjectMapper;
22
23 import java.text.SimpleDateFormat;
24 import java.util.ArrayList;
25 import java.util.Date;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Map;
30
31 import org.commscope.tr069adapter.acs.common.DeviceInform;
32 import org.commscope.tr069adapter.acs.common.ParameterDTO;
33 import org.commscope.tr069adapter.mapper.model.VESNotification;
34 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;
35 import org.commscope.tr069adapter.vesagent.VesConfiguration;
36 import org.commscope.tr069adapter.vesagent.exception.InvalidFaultOperationException;
37 import org.commscope.tr069adapter.vesagent.fault.AlarmFrameWorkSeverityEnum;
38 import org.commscope.tr069adapter.vesagent.fault.ExpeditedEvent;
39 import org.commscope.tr069adapter.vesagent.fault.Parser;
40 import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;
41 import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;
42 import org.commscope.tr069adapter.vesagent.model.Event;
43 import org.commscope.tr069adapter.vesagent.model.EventMessage;
44 import org.commscope.tr069adapter.vesagent.model.FaultFields;
45 import org.commscope.tr069adapter.vesagent.util.EventUtil;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.http.HttpStatus;
50 import org.springframework.stereotype.Component;
51
52 @Component
53 public class AlarmMappingHandler {
54
55   private static final Logger logger = LoggerFactory.getLogger(AlarmMappingHandler.class);
56
57   @Autowired
58   VesConfiguration config;
59
60   @Autowired
61   HttpRequestSender sender;
62
63   public VESNotificationResponse handleAlarmNotification(VESNotification notification)
64       throws InvalidFaultOperationException, JsonProcessingException {
65     List<Event> events = convertNotificationToVESEvent(notification.getDevnotification(),
66         notification.geteNodeBName());
67
68     for (Iterator<Event> iterator = events.iterator(); iterator.hasNext();) {
69       Event event = iterator.next();
70       EventMessage evMsg = new EventMessage();
71       evMsg.setEvent(event);
72
73       ObjectMapper mapper = new ObjectMapper();
74
75       String requestBody = mapper.writeValueAsString(evMsg);
76       if (requestBody.isEmpty()) {
77         logger.debug("Alarm Event body is empty");
78       }
79
80       String url = config.getFaultVesUrl();
81       VESNotificationResponse response = sender.postRequest(url, requestBody);
82       if (response.getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
83         logger.debug(
84             "Error received while posting alarms; skiiping this alarm in the fault event and continue for remaining");
85       }
86     }
87
88     return new VESNotificationResponse(HttpStatus.ACCEPTED.value(), "No Alarms in the request");
89   }
90
91   List<Event> convertNotificationToVESEvent(DeviceInform notification, String eNodeBName)
92       throws InvalidFaultOperationException {
93     logger.debug("Converting Notification to VES fault event started");
94     ArrayList<Event> mlist = new ArrayList<>();
95
96     List<ParameterDTO> parameter = notification.getParameters();
97     Map<String, ExpeditedEvent> hmAlarmParameters = null;
98     Parser parser = new Parser();
99     hmAlarmParameters = parser.parseFaultParams(parameter);
100
101     for (Iterator<String> iterator = hmAlarmParameters.keySet().iterator(); iterator.hasNext();) {
102       ExpeditedEvent event = hmAlarmParameters.get(iterator.next());
103
104       if (event.getAdditionalInformation() != null
105           && event.getAdditionalInformation().contains("-")) {
106         String eNBName = event.getAdditionalInformation().split("-")[0].trim();
107         eNodeBName = eNBName;
108       }
109
110       Event faultEvent = new Event();
111       CommonEventHeader eventHeader = new CommonEventHeader();
112       eventHeader.setDomain("fault");
113       eventHeader.setEventId(event.getAlarmIdentifier());
114       eventHeader.setEventName("Fault_" + notification.getDeviceDetails().getProductClass() + "-"
115           + config.getVendorName() + "_" + event.getProbableCause().replace(" ", ""));
116       eventHeader.setEventType(config.getFaultEventType());
117       eventHeader.setLastEpochMicrosec(System.currentTimeMillis());
118       eventHeader.setTimeZoneOffset(extractTimeZoneOffSet(event.getAdditionalInformation()));
119       eventHeader.setPriority(extractPriority(event.getPerceivedSeverity()));
120
121       EventUtil.populateEnodeBName(eventHeader, notification, eNodeBName);
122
123       eventHeader.setSequence(1);
124       eventHeader.setStartEpochMicrosec(System.currentTimeMillis() * 1000);
125       eventHeader.setVersion(config.getEventVersion());
126       if (eNodeBName != null && eNodeBName.length() > 3)
127         eventHeader.setNfNamingCode(eNodeBName.substring(0, 3));
128       else
129         eventHeader.setNfNamingCode("");
130       eventHeader.setNfcNamingCode("");
131       eventHeader.setNfVendorName(config.getVendorName());
132       eventHeader.setVesEventListenerVersion(config.getVesVersion());
133       faultEvent.setCommonEventHeader(eventHeader);
134
135       FaultFields faultfields = new FaultFields();
136       faultfields.setAlarmCondition(event.getProbableCause().replace(" ", ""));
137
138       faultfields.setEventSeverity(event.getPerceivedSeverity().toString());
139       if (event.getPerceivedSeverity() == AlarmFrameWorkSeverityEnum.CLEAR
140           || event.getPerceivedSeverity() == AlarmFrameWorkSeverityEnum.CLEARED) {
141         faultfields.setEventSeverity("NORMAL");
142       }
143
144       faultfields.setEventSourceType(config.getFaultEventSourcePrefix() + "_"
145           + notification.getDeviceDetails().getProductClass());
146       faultfields.setFaultFieldsVersion(config.getFaultFeildVersion());
147       faultfields.setSpecificProblem(event.getSpecificProblem());
148       faultfields.setVfStatus("Active");
149       faultfields.setEventCategory(event.getEventType());
150       faultfields.setAlarmInterfaceA(event.getManagedObjectInstance());
151       Map<String, String> addition = new HashMap<>();
152       addition.put("eventTime",
153           new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.s'Z'").format(new Date()));
154       addition.put("AdditionalText", event.getAdditionalText());
155       addition.put("AdditionalInformation", event.getAdditionalInformation());
156       faultfields.setAlarmAdditionalInformation(addition);
157
158       faultEvent.setFaultFields(faultfields);
159       mlist.add(faultEvent);
160
161     }
162     logger.debug("Converting Notification to VES fault event completed :{}", mlist);
163     return mlist;
164   }
165
166   private String extractTimeZoneOffSet(String additionalInformation) {
167     String[] additionalInfoArray = null;
168     String[] timeZoneOffset = null;
169     String timeOffset = "UTC+00.00";
170
171     if (additionalInformation != null && additionalInformation.contains("|")) {
172       additionalInfoArray = additionalInformation.split("\\|");
173
174       int index = -1;
175       for (int i = 0; i < additionalInfoArray.length; i++) {
176         if (additionalInfoArray[i].contains("TZD=")) {
177           index = i;
178         }
179       }
180       if (index >= 0) {
181         timeZoneOffset = additionalInfoArray[index].split("=");
182         timeOffset = timeZoneOffset[timeZoneOffset.length - 1];
183       }
184     } else if (additionalInformation != null && additionalInformation.contains("TZD=")) {
185       timeZoneOffset = additionalInformation.split("=");
186       timeOffset = timeZoneOffset[timeZoneOffset.length - 1];
187     }
188
189     return timeOffset;
190   }
191
192   private String extractPriority(AlarmFrameWorkSeverityEnum severity) {
193     String priority;
194     if (severity == AlarmFrameWorkSeverityEnum.CRITICAL
195         || severity == AlarmFrameWorkSeverityEnum.MAJOR) {
196       priority = "High";
197     } else if (severity == AlarmFrameWorkSeverityEnum.MINOR) {
198       priority = "Medium";
199     } else {
200       priority = "Low";
201     }
202
203     return priority;
204   }
205 }