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.databind.ObjectMapper;
\r
22 import java.util.ArrayList;
\r
23 import java.util.List;
\r
25 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
\r
26 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;
\r
27 import org.commscope.tr069adapter.acs.common.OperationDetails;
\r
28 import org.commscope.tr069adapter.acs.common.ParameterDTO;
\r
29 import org.commscope.tr069adapter.mapper.model.VESNotification;
\r
30 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;
\r
31 import org.commscope.tr069adapter.vesagent.VesConfiguration;
\r
32 import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;
\r
33 import org.commscope.tr069adapter.vesagent.exception.VesAgentException;
\r
34 import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;
\r
35 import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;
\r
36 import org.commscope.tr069adapter.vesagent.model.Event;
\r
37 import org.commscope.tr069adapter.vesagent.model.EventMessage;
\r
38 import org.commscope.tr069adapter.vesagent.model.HeartbeatFields;
\r
39 import org.commscope.tr069adapter.vesagent.service.VesAgentServiceHelper;
\r
40 import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;
\r
41 import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;
\r
42 import org.slf4j.Logger;
\r
43 import org.slf4j.LoggerFactory;
\r
44 import org.springframework.beans.factory.annotation.Autowired;
\r
45 import org.springframework.stereotype.Component;
\r
48 public class HeartBeatMessageHandler {
\r
50 private static final Logger logger = LoggerFactory.getLogger(HeartBeatMessageHandler.class);
\r
53 VesAgentServiceHelper vesAgentServiceHelper;
\r
56 VesConfiguration config;
\r
59 HttpRequestSender sender;
\r
61 public VESNotificationResponse sendHeartBeatEvent(DeviceDataEntity deviceDataEntity,
\r
62 int heartBeatPeriod) throws Exception {
\r
63 Event event = convertNotificationToVESEvent(deviceDataEntity, heartBeatPeriod);
\r
65 EventMessage evMsg = new EventMessage();
\r
66 evMsg.setEvent(event);
\r
68 ObjectMapper mapper = new ObjectMapper();
\r
70 String requestBody = mapper.writeValueAsString(evMsg);
\r
71 if (requestBody.isEmpty()) {
\r
72 logger.debug("VES Event body is empty");
\r
75 String url = config.getPnfRegVesUrl();
\r
76 return sender.postRequest(url, requestBody);
\r
79 public void handleRegisterRequest(VESNotification vesNotification) {
\r
81 VesAgentUtils.validateVESNotification(vesNotification);
\r
82 } catch (VesAgentException e) {
\r
84 "Failed to create heartbeat timers for device on recieving bootstrap. ErrorMsg: {}",
\r
89 List<DeviceDataEntity> deviceDataEntityList = vesAgentServiceHelper.findByDeviceIdAndGroup(
\r
90 vesNotification.getDevnotification().getDeviceDetails().getDeviceId(),
\r
91 VesAgentConstants.HEART_BEAT);
\r
93 if (Boolean.FALSE.equals(VesAgentUtils.isNullOrEmpty(deviceDataEntityList))) {
\r
94 DeviceDataEntity deviceDataEntity = deviceDataEntityList.get(0);
\r
95 String heartbeatPeriod =
\r
96 deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD);
\r
98 if (!VesAgentUtils.isNullOrEmpty(heartbeatPeriod)
\r
99 && !heartbeatPeriod.equalsIgnoreCase(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {
\r
104 logger.info("Creating heartbeat records and timer using default heartbeatPeriod {} minutes.",
\r
105 VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);
\r
107 DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();
\r
108 deviceRPCRequest.setDeviceDetails(vesNotification.getDevnotification().getDeviceDetails());
\r
110 OperationDetails opDetails = new OperationDetails();
\r
112 ParameterDTO heartBeatPeriodParam = new ParameterDTO();
\r
113 heartBeatPeriodParam.setParamName(VesAgentConstants.HEART_BEAT_PERIOD);
\r
114 heartBeatPeriodParam.setParamValue(VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);
\r
116 List<ParameterDTO> paramList = new ArrayList<>();
\r
117 paramList.add(heartBeatPeriodParam);
\r
119 opDetails.setParmeters(paramList);
\r
120 deviceRPCRequest.setOpDetails(opDetails);
\r
122 deviceRPCRequest.addContextParam(VesAgentConstants.ENODEB_NAME,
\r
123 vesNotification.geteNodeBName());
\r
125 handleSetConfigRequest(deviceRPCRequest);
\r
129 public DeviceRPCResponse handleSetConfigRequest(DeviceRPCRequest deviceRPCRequest) {
\r
131 VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);
\r
132 } catch (VesAgentException e) {
\r
133 return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());
\r
136 OperationDetails operationDetails = deviceRPCRequest.getOpDetails();
\r
138 String heartBeatPeriod = null;
\r
139 String countDownTimer = null;
\r
141 ParameterDTO countDownTimerDTO = null;
\r
143 List<ParameterDTO> paramDTOList = operationDetails.getParmeters();
\r
144 for (ParameterDTO paramDTO : paramDTOList) {
\r
145 if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.HEART_BEAT_PERIOD)) {
\r
146 heartBeatPeriod = paramDTO.getParamValue();
\r
149 if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.COUNT_DOWN_TIMER)) {
\r
150 countDownTimer = paramDTO.getParamValue();
\r
151 countDownTimerDTO = paramDTO;
\r
156 vesAgentServiceHelper.processHeartBeatSetRequest(deviceRPCRequest, heartBeatPeriod,
\r
158 } catch (VesAgentException e) {
\r
159 return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());
\r
162 copyHeartBeatPeriodToTimerForResponse(countDownTimerDTO, heartBeatPeriod);
\r
163 return VesAgentUtils.getSuccessResponse(deviceRPCRequest);
\r
166 private void copyHeartBeatPeriodToTimerForResponse(ParameterDTO countDownParam,
\r
167 String heartBeatPeriod) {
\r
168 if (null != countDownParam && !VesAgentUtils.isNullOrEmpty(heartBeatPeriod)) {
\r
169 countDownParam.setParamValue(heartBeatPeriod);
\r
173 public DeviceRPCResponse handleGetConfigRequest(DeviceRPCRequest deviceRPCRequest) {
\r
175 VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);
\r
176 } catch (VesAgentException e) {
\r
177 return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());
\r
180 vesAgentServiceHelper.processHeartBeatGetRequest(deviceRPCRequest);
\r
181 return VesAgentUtils.getSuccessResponse(deviceRPCRequest);
\r
184 public VESNotificationResponse handleDeleteConfigRequest(VESNotification vesNotification) {
\r
186 VesAgentUtils.validateDelVESNotification(vesNotification);
\r
187 vesAgentServiceHelper.processHeartBeatDeleteRequest(vesNotification);
\r
188 } catch (VesAgentException e) {
\r
189 return new VESNotificationResponse(Integer.parseInt(e.getErrorCode()), e.getMessage());
\r
190 } catch (Exception e) {
\r
191 return new VESNotificationResponse(VesAgentConstants.RPC_FAILED, e.getMessage());
\r
194 return new VESNotificationResponse(VesAgentConstants.RPC_SUCCESS, "success");
\r
197 Event convertNotificationToVESEvent(DeviceDataEntity deviceDataEntity, int heartBeatPeriod) {
\r
198 Event hbEvent = new Event();
\r
199 CommonEventHeader eventHeader = new CommonEventHeader();
\r
201 eventHeader.setDomain("heartbeat");
\r
203 .setEventId("heartbeat_" + deviceDataEntity.getDeviceId() + System.currentTimeMillis());
\r
204 eventHeader.setEventName(
\r
205 "heartbeat_" + deviceDataEntity.getProductClass() + "-" + config.getVendorName());
\r
206 eventHeader.setEventType("CommScope_RAN_heartbeat");
\r
207 eventHeader.setLastEpochMicrosec(System.currentTimeMillis() * 1000);
\r
209 eventHeader.setPriority("High");
\r
210 eventHeader.setSequence(0);
\r
212 if (deviceDataEntity.geteNodeBName() == null) {
\r
213 eventHeader.setReportingEntityName(deviceDataEntity.getDeviceId());
\r
214 eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());
\r
215 eventHeader.setSourceId(deviceDataEntity.getDeviceId());
\r
216 eventHeader.setSourceName(deviceDataEntity.getDeviceId());
\r
218 eventHeader.setReportingEntityName(deviceDataEntity.geteNodeBName());
\r
219 eventHeader.setSourceName(deviceDataEntity.geteNodeBName());
\r
220 eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());
\r
221 eventHeader.setSourceId(deviceDataEntity.getDeviceId());
\r
224 eventHeader.setStartEpochMicrosec(deviceDataEntity.getStartEpochMicrosec());
\r
225 eventHeader.setVersion(config.getEventVersion());
\r
226 eventHeader.setNfNamingCode("");
\r
227 eventHeader.setNfcNamingCode("");
\r
228 eventHeader.setNfVendorName(config.getVendorName());
\r
229 eventHeader.setVesEventListenerVersion(config.getVesVersion());
\r
230 hbEvent.setCommonEventHeader(eventHeader);
\r
232 HeartbeatFields heartbeatFields = new HeartbeatFields();
\r
233 heartbeatFields.setHeartbeatFieldsVersion("3.0");
\r
234 heartbeatFields.setHeartbeatInterval(heartBeatPeriod * 60);
\r
235 hbEvent.setHeartbeatFields(heartbeatFields);
\r