--- /dev/null
+/*\r
+ * ============LICENSE_START========================================================================\r
+ * ONAP : tr-069-adapter\r
+ * =================================================================================================\r
+ * Copyright (C) 2020 CommScope Inc Intellectual Property.\r
+ * =================================================================================================\r
+ * This tr-069-adapter software file is distributed by CommScope Inc under the Apache License,\r
+ * Version 2.0 (the "License"); you may not use this file except in compliance with the License. You\r
+ * may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\r
+ * either express or implied. See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ===============LICENSE_END=======================================================================\r
+ */\r
+package org.commscope.tr069adapter.vesagent.controller;\r
+\r
+import com.fasterxml.jackson.core.JsonProcessingException;\r
+import com.fasterxml.jackson.databind.ObjectMapper;\r
+\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.commscope.tr069adapter.acs.common.DeviceInform;\r
+import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.mapper.model.VESNotification;\r
+import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;\r
+import org.commscope.tr069adapter.vesagent.VesConfiguration;\r
+import org.commscope.tr069adapter.vesagent.exception.InvalidFaultOperationException;\r
+import org.commscope.tr069adapter.vesagent.fault.AlarmFrameWorkSeverityEnum;\r
+import org.commscope.tr069adapter.vesagent.fault.ExpeditedEvent;\r
+import org.commscope.tr069adapter.vesagent.fault.Parser;\r
+import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;\r
+import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;\r
+import org.commscope.tr069adapter.vesagent.model.Event;\r
+import org.commscope.tr069adapter.vesagent.model.EventMessage;\r
+import org.commscope.tr069adapter.vesagent.model.FaultFields;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.http.HttpStatus;\r
+import org.springframework.stereotype.Component;\r
+\r
+@Component\r
+public class AlarmMappingHandler {\r
+\r
+ private static final Logger logger = LoggerFactory.getLogger(AlarmMappingHandler.class);\r
+\r
+ @Autowired\r
+ VesConfiguration config;\r
+\r
+ @Autowired\r
+ HttpRequestSender sender;\r
+\r
+ public VESNotificationResponse handleAlarmNotification(VESNotification notification)\r
+ throws InvalidFaultOperationException, JsonProcessingException {\r
+ List<Event> events = convertNotificationToVESEvent(notification.getDevnotification(),\r
+ notification.geteNodeBName());\r
+\r
+ for (Iterator<Event> iterator = events.iterator(); iterator.hasNext();) {\r
+ Event event = iterator.next();\r
+ EventMessage evMsg = new EventMessage();\r
+ evMsg.setEvent(event);\r
+\r
+ ObjectMapper mapper = new ObjectMapper();\r
+\r
+ String requestBody = mapper.writeValueAsString(evMsg);\r
+ if (requestBody.isEmpty()) {\r
+ logger.debug("Alarm Event body is empty");\r
+ }\r
+\r
+ String url = config.getFaultVesUrl();\r
+ VESNotificationResponse response = sender.postRequest(url, requestBody);\r
+ if (response.getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {\r
+ logger.debug(\r
+ "Error received while posting alarms; skiiping this alarm in the fault event and continue for remaining");\r
+ }\r
+ }\r
+\r
+ return new VESNotificationResponse(HttpStatus.ACCEPTED.value(), "No Alarms in the request");\r
+ }\r
+\r
+ List<Event> convertNotificationToVESEvent(DeviceInform notification, String eNodeBName)\r
+ throws InvalidFaultOperationException {\r
+ logger.debug("Converting Notification to VES fault event started");\r
+ ArrayList<Event> mlist = new ArrayList<>();\r
+\r
+ List<ParameterDTO> parameter = notification.getParameters();\r
+ Map<String, ExpeditedEvent> hmAlarmParameters = null;\r
+ Parser parser = new Parser();\r
+ hmAlarmParameters = parser.parseFaultParams(parameter);\r
+\r
+ for (Iterator<String> iterator = hmAlarmParameters.keySet().iterator(); iterator.hasNext();) {\r
+ ExpeditedEvent event = hmAlarmParameters.get(iterator.next());\r
+\r
+ if (event.getAdditionalInformation() != null\r
+ && event.getAdditionalInformation().contains("-")) {\r
+ String eNBName = event.getAdditionalInformation().split("-")[0].trim();\r
+ eNodeBName = eNBName;\r
+ }\r
+\r
+ Event faultEvent = new Event();\r
+ CommonEventHeader eventHeader = new CommonEventHeader();\r
+ eventHeader.setDomain("fault");\r
+ eventHeader.setEventId(event.getAlarmIdentifier());\r
+ eventHeader.setEventName("Fault_" + notification.getDeviceDetails().getProductClass() + "-"\r
+ + config.getVendorName() + "_" + event.getProbableCause().replace(" ", ""));\r
+ eventHeader.setEventType(config.getFaultEventType());\r
+ eventHeader.setLastEpochMicrosec(System.currentTimeMillis());\r
+ eventHeader.setTimeZoneOffset(extractTimeZoneOffSet(event.getAdditionalInformation()));\r
+ eventHeader.setPriority(extractPriority(event.getPerceivedSeverity()));\r
+\r
+ if (eNodeBName == null) {\r
+ eventHeader.setReportingEntityName(notification.getDeviceDetails().getDeviceId());\r
+ eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
+ eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
+ eventHeader.setSourceName(notification.getDeviceDetails().getDeviceId());\r
+ } else {\r
+ eventHeader.setReportingEntityName(eNodeBName);\r
+ eventHeader.setSourceName(eNodeBName);\r
+\r
+ eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());\r
+ eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());\r
+ }\r
+\r
+ eventHeader.setSequence(1);\r
+ eventHeader.setStartEpochMicrosec(System.currentTimeMillis());\r
+ eventHeader.setVersion(config.getEventVersion());\r
+ if (eNodeBName != null && eNodeBName.length() > 3)\r
+ eventHeader.setNfNamingCode(eNodeBName.substring(0, 3));\r
+ else\r
+ eventHeader.setNfNamingCode("");\r
+ eventHeader.setNfcNamingCode("");\r
+ eventHeader.setNfVendorName(config.getVendorName());\r
+ eventHeader.setVesEventListenerVersion(config.getVesVersion());\r
+ faultEvent.setCommonEventHeader(eventHeader);\r
+\r
+ FaultFields faultfields = new FaultFields();\r
+ faultfields.setAlarmCondition(event.getProbableCause().replace(" ", ""));\r
+\r
+ faultfields.setEventSeverity(event.getPerceivedSeverity().toString());\r
+ if (event.getPerceivedSeverity() == AlarmFrameWorkSeverityEnum.CLEAR\r
+ || event.getPerceivedSeverity() == AlarmFrameWorkSeverityEnum.CLEARED) {\r
+ faultfields.setEventSeverity("NORMAL");\r
+ }\r
+\r
+ faultfields.setEventSourceType(config.getFaultEventSourcePrefix() + "_"\r
+ + notification.getDeviceDetails().getProductClass());\r
+ faultfields.setFaultFieldsVersion(config.getFaultFeildVersion());\r
+ faultfields.setSpecificProblem(event.getSpecificProblem());\r
+ faultfields.setVfStatus("Active");\r
+ faultfields.setEventCategory(event.getEventType());\r
+ faultfields.setAlarmInterfaceA(event.getManagedObjectInstance());\r
+ Map<String, String> addition = new HashMap<>();\r
+ addition.put("eventTime",\r
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.s'Z'").format(new Date()));\r
+ addition.put("AdditionalText", event.getAdditionalText());\r
+ addition.put("AdditionalInformation", event.getAdditionalInformation());\r
+ faultfields.setAlarmAdditionalInformation(addition);\r
+\r
+ faultEvent.setFaultFields(faultfields);\r
+ mlist.add(faultEvent);\r
+\r
+ }\r
+ logger.debug("Converting Notification to VES fault event completed :{}", mlist);\r
+ return mlist;\r
+ }\r
+\r
+ private String extractTimeZoneOffSet(String additionalInformation) {\r
+ String[] additionalInfoArray = null;\r
+ String[] timeZoneOffset = null;\r
+ String timeOffset = "UTC+00.00";\r
+\r
+ if (additionalInformation != null && additionalInformation.contains("|")) {\r
+ additionalInfoArray = additionalInformation.split("\\|");\r
+\r
+ int index = -1;\r
+ for (int i = 0; i < additionalInfoArray.length; i++) {\r
+ if (additionalInfoArray[i].contains("TZD=")) {\r
+ index = i;\r
+ }\r
+ }\r
+ if (index >= 0) {\r
+ timeZoneOffset = additionalInfoArray[index].split("=");\r
+ timeOffset = timeZoneOffset[timeZoneOffset.length - 1];\r
+ }\r
+ } else if (additionalInformation != null && additionalInformation.contains("TZD=")) {\r
+ timeZoneOffset = additionalInformation.split("=");\r
+ timeOffset = timeZoneOffset[timeZoneOffset.length - 1];\r
+ }\r
+\r
+ return timeOffset;\r
+ }\r
+\r
+ private String extractPriority(AlarmFrameWorkSeverityEnum severity) {\r
+ String priority;\r
+ if (severity == AlarmFrameWorkSeverityEnum.CRITICAL\r
+ || severity == AlarmFrameWorkSeverityEnum.MAJOR) {\r
+ priority = "High";\r
+ } else if (severity == AlarmFrameWorkSeverityEnum.MINOR) {\r
+ priority = "Medium";\r
+ } else {\r
+ priority = "Low";\r
+ }\r
+\r
+ return priority;\r
+ }\r
+}\r