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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
18 package org.commscope.tr069adapter.vesagent.controller;
\r
20 import com.fasterxml.jackson.core.JsonProcessingException;
\r
21 import com.fasterxml.jackson.databind.ObjectMapper;
\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
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
52 public class AlarmMappingHandler {
\r
54 private static final Logger logger = LoggerFactory.getLogger(AlarmMappingHandler.class);
\r
57 VesConfiguration config;
\r
60 HttpRequestSender sender;
\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
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
72 ObjectMapper mapper = new ObjectMapper();
\r
74 String requestBody = mapper.writeValueAsString(evMsg);
\r
75 if (requestBody.isEmpty()) {
\r
76 logger.debug("Alarm Event body is empty");
\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
83 "Error received while posting alarms; skiiping this alarm in the fault event and continue for remaining");
\r
87 return new VESNotificationResponse(HttpStatus.ACCEPTED.value(), "No Alarms in the request");
\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
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
100 for (Iterator<String> iterator = hmAlarmParameters.keySet().iterator(); iterator.hasNext();) {
\r
101 ExpeditedEvent event = hmAlarmParameters.get(iterator.next());
\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
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
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
126 eventHeader.setReportingEntityName(eNodeBName);
\r
127 eventHeader.setSourceName(eNodeBName);
\r
129 eventHeader.setReportingEntityId(notification.getDeviceDetails().getDeviceId());
\r
130 eventHeader.setSourceId(notification.getDeviceDetails().getDeviceId());
\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
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
145 FaultFields faultfields = new FaultFields();
\r
146 faultfields.setAlarmCondition(event.getProbableCause().replace(" ", ""));
\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
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
168 faultEvent.setFaultFields(faultfields);
\r
169 mlist.add(faultEvent);
\r
172 logger.debug("Converting Notification to VES fault event completed :{}", mlist);
\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
181 if (additionalInformation != null && additionalInformation.contains("|")) {
\r
182 additionalInfoArray = additionalInformation.split("\\|");
\r
185 for (int i = 0; i < additionalInfoArray.length; i++) {
\r
186 if (additionalInfoArray[i].contains("TZD=")) {
\r
191 timeZoneOffset = additionalInfoArray[index].split("=");
\r
192 timeOffset = timeZoneOffset[timeZoneOffset.length - 1];
\r
194 } else if (additionalInformation != null && additionalInformation.contains("TZD=")) {
\r
195 timeZoneOffset = additionalInformation.split("=");
\r
196 timeOffset = timeZoneOffset[timeZoneOffset.length - 1];
\r
202 private String extractPriority(AlarmFrameWorkSeverityEnum severity) {
\r
204 if (severity == AlarmFrameWorkSeverityEnum.CRITICAL
\r
205 || severity == AlarmFrameWorkSeverityEnum.MAJOR) {
\r
207 } else if (severity == AlarmFrameWorkSeverityEnum.MINOR) {
\r
208 priority = "Medium";
\r