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