80da0f65eb5adafcb75de9af1748fcea1f0fcd03
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / controller / HeartBeatMessageHandler.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.databind.ObjectMapper;\r
21 \r
22 import java.util.ArrayList;\r
23 import java.util.List;\r
24 \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
46 \r
47 @Component\r
48 public class HeartBeatMessageHandler {\r
49 \r
50   private static final Logger logger = LoggerFactory.getLogger(HeartBeatMessageHandler.class);\r
51 \r
52   @Autowired\r
53   VesAgentServiceHelper vesAgentServiceHelper;\r
54 \r
55   @Autowired\r
56   VesConfiguration config;\r
57 \r
58   @Autowired\r
59   HttpRequestSender sender;\r
60 \r
61   public VESNotificationResponse sendHeartBeatEvent(DeviceDataEntity deviceDataEntity,\r
62       int heartBeatPeriod) throws Exception {\r
63     Event event = convertNotificationToVESEvent(deviceDataEntity, heartBeatPeriod);\r
64 \r
65     EventMessage evMsg = new EventMessage();\r
66     evMsg.setEvent(event);\r
67 \r
68     ObjectMapper mapper = new ObjectMapper();\r
69 \r
70     String requestBody = mapper.writeValueAsString(evMsg);\r
71     if (requestBody.isEmpty()) {\r
72       logger.debug("VES Event body is empty");\r
73     }\r
74 \r
75     String url = config.getPnfRegVesUrl();\r
76     return sender.postRequest(url, requestBody);\r
77   }\r
78 \r
79   public void handleRegisterRequest(VESNotification vesNotification) {\r
80     try {\r
81       VesAgentUtils.validateVESNotification(vesNotification);\r
82     } catch (VesAgentException e) {\r
83       logger.error(\r
84           "Failed to create heartbeat timers for device on recieving bootstrap. ErrorMsg: {}",\r
85           e.getMessage());\r
86       return;\r
87     }\r
88 \r
89     List<DeviceDataEntity> deviceDataEntityList = vesAgentServiceHelper.findByDeviceIdAndGroup(\r
90         vesNotification.getDevnotification().getDeviceDetails().getDeviceId(),\r
91         VesAgentConstants.HEART_BEAT);\r
92 \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
97 \r
98       if (!VesAgentUtils.isNullOrEmpty(heartbeatPeriod)\r
99           && !heartbeatPeriod.equalsIgnoreCase(VesAgentConstants.REMOVE_HEART_BEAT_TIMER_VAL)) {\r
100         return;\r
101       }\r
102     }\r
103 \r
104     logger.info("Creating heartbeat records and timer using default heartbeatPeriod {} minutes.",\r
105         VesAgentConstants.HEART_BEAT_PERIOD_DEFAULT_VAL);\r
106 \r
107     DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
108     deviceRPCRequest.setDeviceDetails(vesNotification.getDevnotification().getDeviceDetails());\r
109 \r
110     OperationDetails opDetails = new OperationDetails();\r
111 \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
115 \r
116     List<ParameterDTO> paramList = new ArrayList<>();\r
117     paramList.add(heartBeatPeriodParam);\r
118 \r
119     opDetails.setParmeters(paramList);\r
120     deviceRPCRequest.setOpDetails(opDetails);\r
121 \r
122     deviceRPCRequest.addContextParam(VesAgentConstants.ENODEB_NAME,\r
123         vesNotification.geteNodeBName());\r
124 \r
125     handleSetConfigRequest(deviceRPCRequest);\r
126 \r
127   }\r
128 \r
129   public DeviceRPCResponse handleSetConfigRequest(DeviceRPCRequest deviceRPCRequest) {\r
130     try {\r
131       VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);\r
132     } catch (VesAgentException e) {\r
133       return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
134     }\r
135 \r
136     OperationDetails operationDetails = deviceRPCRequest.getOpDetails();\r
137 \r
138     String heartBeatPeriod = null;\r
139     String countDownTimer = null;\r
140 \r
141     ParameterDTO countDownTimerDTO = null;\r
142 \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
147       }\r
148 \r
149       if (paramDTO.getParamName().equalsIgnoreCase(VesAgentConstants.COUNT_DOWN_TIMER)) {\r
150         countDownTimer = paramDTO.getParamValue();\r
151         countDownTimerDTO = paramDTO;\r
152       }\r
153     }\r
154 \r
155     try {\r
156       vesAgentServiceHelper.processHeartBeatSetRequest(deviceRPCRequest, heartBeatPeriod,\r
157           countDownTimer);\r
158     } catch (VesAgentException e) {\r
159       return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
160     }\r
161 \r
162     copyHeartBeatPeriodToTimerForResponse(countDownTimerDTO, heartBeatPeriod);\r
163     return VesAgentUtils.getSuccessResponse(deviceRPCRequest);\r
164   }\r
165 \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
170     }\r
171   }\r
172 \r
173   public DeviceRPCResponse handleGetConfigRequest(DeviceRPCRequest deviceRPCRequest) {\r
174     try {\r
175       VesAgentUtils.validateDeviceRPCRequest(deviceRPCRequest);\r
176     } catch (VesAgentException e) {\r
177       return VesAgentUtils.getErrorResponse(deviceRPCRequest, e.getErrorCode(), e.getMessage());\r
178     }\r
179 \r
180     vesAgentServiceHelper.processHeartBeatGetRequest(deviceRPCRequest);\r
181     return VesAgentUtils.getSuccessResponse(deviceRPCRequest);\r
182   }\r
183 \r
184   public VESNotificationResponse handleDeleteConfigRequest(VESNotification vesNotification) {\r
185     try {\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
192     }\r
193 \r
194     return new VESNotificationResponse(VesAgentConstants.RPC_SUCCESS, "success");\r
195   }\r
196 \r
197   Event convertNotificationToVESEvent(DeviceDataEntity deviceDataEntity, int heartBeatPeriod) {\r
198     Event hbEvent = new Event();\r
199     CommonEventHeader eventHeader = new CommonEventHeader();\r
200 \r
201     eventHeader.setDomain("heartbeat");\r
202     eventHeader\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
208 \r
209     eventHeader.setPriority("High");\r
210     eventHeader.setSequence(0);\r
211 \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
217     } else {\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
222     }\r
223 \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
231 \r
232     HeartbeatFields heartbeatFields = new HeartbeatFields();\r
233     heartbeatFields.setHeartbeatFieldsVersion("3.0");\r
234     heartbeatFields.setHeartbeatInterval(heartBeatPeriod * 60);\r
235     hbEvent.setHeartbeatFields(heartbeatFields);\r
236 \r
237     return hbEvent;\r
238   }\r
239 }\r