Development of NETCONF RPCs for tr-069 adapter to
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / controller / HeartBeatMessageHandler.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.databind.ObjectMapper;
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
26 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;
27 import org.commscope.tr069adapter.acs.common.OperationDetails;
28 import org.commscope.tr069adapter.acs.common.ParameterDTO;
29 import org.commscope.tr069adapter.mapper.model.VESNotification;
30 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;
31 import org.commscope.tr069adapter.vesagent.VesConfiguration;
32 import org.commscope.tr069adapter.vesagent.entity.DeviceDataEntity;
33 import org.commscope.tr069adapter.vesagent.exception.VesAgentException;
34 import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;
35 import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;
36 import org.commscope.tr069adapter.vesagent.model.Event;
37 import org.commscope.tr069adapter.vesagent.model.EventMessage;
38 import org.commscope.tr069adapter.vesagent.model.HeartbeatFields;
39 import org.commscope.tr069adapter.vesagent.service.VesAgentServiceHelper;
40 import org.commscope.tr069adapter.vesagent.util.VesAgentConstants;
41 import org.commscope.tr069adapter.vesagent.util.VesAgentUtils;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.beans.factory.annotation.Autowired;
45 import org.springframework.stereotype.Component;
46
47 @Component
48 public class HeartBeatMessageHandler {
49
50   private static final Logger logger = LoggerFactory.getLogger(HeartBeatMessageHandler.class);
51
52   @Autowired
53   VesAgentServiceHelper vesAgentServiceHelper;
54
55   @Autowired
56   VesConfiguration config;
57
58   @Autowired
59   HttpRequestSender sender;
60
61   public VESNotificationResponse sendHeartBeatEvent(DeviceDataEntity deviceDataEntity,
62       int heartBeatPeriod) throws Exception {
63     Event event = convertNotificationToVESEvent(deviceDataEntity, heartBeatPeriod);
64
65     EventMessage evMsg = new EventMessage();
66     evMsg.setEvent(event);
67
68     ObjectMapper mapper = new ObjectMapper();
69
70     String requestBody = mapper.writeValueAsString(evMsg);
71     if (requestBody.isEmpty()) {
72       logger.debug("VES Event body is empty");
73     }
74
75     String url = config.getPnfRegVesUrl();
76     return sender.postRequest(url, requestBody);
77   }
78
79   public void handleRegisterRequest(VESNotification vesNotification) {
80     try {
81       VesAgentUtils.validateVESNotification(vesNotification);
82     } catch (VesAgentException e) {
83       logger.error(
84           "Failed to create heartbeat timers for device on recieving bootstrap. ErrorMsg: {}",
85           e.getMessage());
86       return;
87     }
88
89     List<DeviceDataEntity> deviceDataEntityList = vesAgentServiceHelper.findByDeviceIdAndGroup(
90         vesNotification.getDevnotification().getDeviceDetails().getDeviceId(),
91         VesAgentConstants.HEART_BEAT);
92
93     if (Boolean.FALSE.equals(VesAgentUtils.isNullOrEmpty(deviceDataEntityList))) {
94       DeviceDataEntity deviceDataEntity = deviceDataEntityList.get(0);
95       String heartbeatPeriod =
96           deviceDataEntity.getAttributesMap().get(VesAgentConstants.HEART_BEAT_PERIOD);
97
98       if (!VesAgentUtils.isNullOrEmpty(heartbeatPeriod)
99           && !heartbeatPeriod.equalsIgnoreCase(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {
100         return;
101       }
102     }
103
104     logger.info("Creating heartbeat records and timer using default heartbeatPeriod {} minutes.",
105         VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);
106
107     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();
108     deviceRPCRequest.setDeviceDetails(vesNotification.getDevnotification().getDeviceDetails());
109
110     OperationDetails opDetails = new OperationDetails();
111
112     ParameterDTO heartBeatPeriodParam = new ParameterDTO();
113     heartBeatPeriodParam.setParamName(VesAgentConstants.HEART_BEAT_PERIOD);
114     heartBeatPeriodParam.setParamValue(VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);
115
116     List<ParameterDTO> paramList = new ArrayList<>();
117     paramList.add(heartBeatPeriodParam);
118
119     opDetails.setParmeters(paramList);
120     deviceRPCRequest.setOpDetails(opDetails);
121
122     deviceRPCRequest.addContextParam(VesAgentConstants.ENODEB_NAME,
123         vesNotification.geteNodeBName());
124
125     handleSetConfigRequest(deviceRPCRequest);
126
127   }
128
129   public DeviceRPCResponse handleSetConfigRequest(DeviceRPCRequest deviceRPCRequest) {
130     try {
131       VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);
132     } catch (VesAgentException e) {
133       return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());
134     }
135
136     OperationDetails operationDetails = deviceRPCRequest.getOpDetails();
137
138     String heartBeatPeriod = null;
139     String countDownTimer = null;
140
141     ParameterDTO countDownTimerDTO = null;
142
143     List<ParameterDTO> paramDTOList = operationDetails.getParmeters();
144     for (ParameterDTO paramDTO : paramDTOList) {
145       if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.HEART_BEAT_PERIOD)) {
146         heartBeatPeriod = paramDTO.getParamValue();
147       }
148
149       if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.COUNT_DOWN_TIMER)) {
150         countDownTimer = paramDTO.getParamValue();
151         countDownTimerDTO = paramDTO;
152       }
153     }
154
155     try {
156       vesAgentServiceHelper.processHeartBeatSetRequest(deviceRPCRequest, heartBeatPeriod,
157           countDownTimer);
158     } catch (VesAgentException e) {
159       return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());
160     }
161
162     copyHeartBeatPeriodToTimerForResponse(countDownTimerDTO, heartBeatPeriod);
163     return VesAgentUtils.getSuccessResponse(deviceRPCRequest);
164   }
165
166   private void copyHeartBeatPeriodToTimerForResponse(ParameterDTO countDownParam,
167       String heartBeatPeriod) {
168     if (null != countDownParam && !VesAgentUtils.isNullOrEmpty(heartBeatPeriod)) {
169       countDownParam.setParamValue(heartBeatPeriod);
170     }
171   }
172
173   public DeviceRPCResponse handleGetConfigRequest(DeviceRPCRequest deviceRPCRequest) {
174     try {
175       VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);
176     } catch (VesAgentException e) {
177       return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());
178     }
179
180     vesAgentServiceHelper.processHeartBeatGetRequest(deviceRPCRequest);
181     return VesAgentUtils.getSuccessResponse(deviceRPCRequest);
182   }
183
184   public VESNotificationResponse handleDeleteConfigRequest(VESNotification vesNotification) {
185     try {
186       VesAgentUtils.validateDelVESNotification(vesNotification);
187       vesAgentServiceHelper.processHeartBeatDeleteRequest(vesNotification);
188     } catch (VesAgentException e) {
189       return new VESNotificationResponse(Integer.parseInt(e.getErrorCode()), e.getMessage());
190     } catch (Exception e) {
191       return new VESNotificationResponse(VesAgentConstants.RPC_FAILED, e.getMessage());
192     }
193
194     return new VESNotificationResponse(VesAgentConstants.RPC_SUCCESS, "success");
195   }
196
197   Event convertNotificationToVESEvent(DeviceDataEntity deviceDataEntity, int heartBeatPeriod) {
198     Event hbEvent = new Event();
199     CommonEventHeader eventHeader = new CommonEventHeader();
200
201     eventHeader.setDomain("heartbeat");
202     eventHeader
203         .setEventId("heartbeat" + deviceDataEntity.getDeviceId() + System.currentTimeMillis());
204     eventHeader.setEventName(
205         "heartbeat_" + deviceDataEntity.getProductClass() + "-" + config.getVendorName());
206     eventHeader.setEventType("CommScope_RAN_heartbeat");
207     eventHeader.setLastEpochMicrosec(System.currentTimeMillis() * 1000);
208
209     eventHeader.setPriority("High");
210     eventHeader.setSequence(0);
211
212     if (deviceDataEntity.geteNodeBName() == null) {
213       eventHeader.setReportingEntityName(deviceDataEntity.getDeviceId());
214       eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());
215       eventHeader.setSourceId(deviceDataEntity.getDeviceId());
216       eventHeader.setSourceName(deviceDataEntity.getDeviceId());
217     } else {
218       eventHeader.setReportingEntityName(deviceDataEntity.geteNodeBName());
219       eventHeader.setSourceName(deviceDataEntity.geteNodeBName());
220       eventHeader.setReportingEntityId(deviceDataEntity.getDeviceId());
221       eventHeader.setSourceId(deviceDataEntity.getDeviceId());
222     }
223
224     eventHeader.setStartEpochMicrosec(deviceDataEntity.getStartEpochMicrosec());
225     eventHeader.setVersion(config.getEventVersion());
226     eventHeader.setNfNamingCode("");
227     eventHeader.setNfcNamingCode("");
228     eventHeader.setNfVendorName(config.getVendorName());
229     eventHeader.setVesEventListenerVersion(config.getVesVersion());
230     hbEvent.setCommonEventHeader(eventHeader);
231
232     HeartbeatFields heartbeatFields = new HeartbeatFields();
233     heartbeatFields.setHeartbeatFieldsVersion("3.0");
234     heartbeatFields.setHeartbeatInterval(heartBeatPeriod * 60);
235     hbEvent.setHeartbeatFields(heartbeatFields);
236
237     return hbEvent;
238   }
239 }