Development of NETCONF RPCs for tr-069 adapter to
[oam/tr069-adapter.git] / ves-agent / src / main / java / org / commscope / tr069adapter / vesagent / controller / PnfRegMappingHandler.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
19 package org.commscope.tr069adapter.vesagent.controller;
20
21 import com.fasterxml.jackson.core.JsonProcessingException;
22 import com.fasterxml.jackson.databind.ObjectMapper;
23
24 import java.text.SimpleDateFormat;
25 import java.util.ArrayList;
26 import java.util.Date;
27 import java.util.HashMap;
28 import java.util.List;
29
30 import org.commscope.tr069adapter.acs.common.DeviceInform;
31 import org.commscope.tr069adapter.acs.common.ParameterDTO;
32 import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;
33 import org.commscope.tr069adapter.mapper.model.VESNotification;
34 import org.commscope.tr069adapter.mapper.model.VESNotificationResponse;
35 import org.commscope.tr069adapter.vesagent.VesConfiguration;
36 import org.commscope.tr069adapter.vesagent.fault.Parser;
37 import org.commscope.tr069adapter.vesagent.http.HttpRequestSender;
38 import org.commscope.tr069adapter.vesagent.model.CommonEventHeader;
39 import org.commscope.tr069adapter.vesagent.model.Event;
40 import org.commscope.tr069adapter.vesagent.model.EventMessage;
41 import org.commscope.tr069adapter.vesagent.model.PnfRegEventAdditionalFeilds;
42 import org.commscope.tr069adapter.vesagent.model.PnfRegEventFields;
43 import org.commscope.tr069adapter.vesagent.util.EventUtil;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.stereotype.Component;
48
49 @Component
50 public class PnfRegMappingHandler {
51   private static final Logger logger = LoggerFactory.getLogger(PnfRegMappingHandler.class);
52   public static final String SSH_USERNAME = "netconf";
53   public static final String SSH_PSSWORD = "netconf";
54
55   @Autowired
56   VesConfiguration config;
57
58   @Autowired
59   HttpRequestSender sender;
60
61   public VESNotificationResponse handlePnfRegNotification(VESNotification vesNoti)
62       throws JsonProcessingException {
63     Event event = convertNotificationToVESEvent(vesNoti.getDevnotification(),
64         vesNoti.getNetconfDetails(), vesNoti.geteNodeBName(), vesNoti.getNetconfParameters());
65     if (null != event) {
66       EventMessage evMsg = new EventMessage();
67       evMsg.setEvent(event);
68
69       ObjectMapper mapper = new ObjectMapper();
70
71       String requestBody = mapper.writeValueAsString(evMsg);
72       if (requestBody.isEmpty()) {
73         logger.debug("VES Event body is empty");
74       }
75       logger.debug("VES message for PnfRegistration : {}", requestBody);
76       String url = config.getPnfRegVesUrl();
77       return sender.postRequest(url, requestBody);
78     } else {
79       return new VESNotificationResponse(-1,
80           "unable to prepare ves event due to insufficient data");
81     }
82   }
83
84   public VESNotificationResponse handlePnfRegNotificationOnRestart(VESNotification vesNoti)
85       throws JsonProcessingException {
86     Event event = convertNotificationToVESEventOnRestart(vesNoti.getNetconfDetails());
87
88     EventMessage evMsg = new EventMessage();
89     evMsg.setEvent(event);
90
91     ObjectMapper mapper = new ObjectMapper();
92
93     String requestBody = mapper.writeValueAsString(evMsg);
94     if (requestBody.isEmpty()) {
95       logger.debug("VES Event body is empty");
96     }
97
98     String url = config.getPnfRegVesUrl();
99     return sender.postRequest(url, requestBody);
100   }
101
102   Event convertNotificationToVESEvent(DeviceInform notification,
103       NetConfServerDetails netconfServerDetails, String eNodeBName,
104       List<ParameterDTO> netconfParameters) {
105     logger.debug("Converting Notification to VES pnfevent started");
106     Parser parser = new Parser();
107
108
109     Event regEvent = new Event();
110     CommonEventHeader eventHeader = new CommonEventHeader();
111
112     eventHeader.setDomain("pnfRegistration");
113     eventHeader.setEventId(
114         "PnfReg" + notification.getDeviceDetails().getDeviceId() + System.currentTimeMillis());
115     eventHeader.setEventName("pnfReg_" + notification.getDeviceDetails().getProductClass() + "-"
116         + config.getVendorName());
117     eventHeader.setEventType(config.getPnfRegEventType());
118     eventHeader.setPriority("High");
119     EventUtil.populateEventHeaderFields(eventHeader, notification, eNodeBName, config);
120     regEvent.setCommonEventHeader(eventHeader);
121
122     PnfRegEventFields pnfRegistrationFields =
123         parser.parseNotificationParams(notification.getParameters());
124     populatePnfRegFeilds(netconfServerDetails, pnfRegistrationFields, netconfParameters);
125     pnfRegistrationFields.setModelNumber(notification.getDeviceDetails().getProductClass());
126
127     regEvent.setPnfRegistrationFields(pnfRegistrationFields);
128     logger.debug("Converting Notification to VES pnfevent completed");
129     return regEvent;
130   }
131
132   Event convertNotificationToVESEventOnRestart(NetConfServerDetails netconfServerDetails) {
133     logger.debug("Converting Notification to VES pnfevent started");
134
135     Event regEvent = new Event();
136     CommonEventHeader eventHeader = new CommonEventHeader();
137
138     if (null == netconfServerDetails) {
139       logger.error("netconf server details as received as null");
140       return null;
141     }
142     eventHeader.setDomain("pnfRegistration");
143     eventHeader
144         .setEventId("PnfReg" + netconfServerDetails.getDeviceId() + System.currentTimeMillis());
145     eventHeader.setEventName(
146         "pnfReg_" + netconfServerDetails.getDeviceId() + "-" + config.getVendorName());
147     eventHeader.setEventType(config.getPnfRegEventType());
148     eventHeader.setLastEpochMicrosec(System.currentTimeMillis());
149
150     eventHeader.setPriority("High");
151     eventHeader.setSequence(0);
152
153     if (netconfServerDetails.getEnodeBName() == null) {
154       eventHeader.setReportingEntityName(netconfServerDetails.getDeviceId());
155       eventHeader.setReportingEntityId(netconfServerDetails.getDeviceId());
156       eventHeader.setSourceId(netconfServerDetails.getDeviceId());
157       eventHeader.setSourceName(netconfServerDetails.getDeviceId());
158     } else {
159       eventHeader.setReportingEntityName(netconfServerDetails.getEnodeBName());
160       eventHeader.setSourceName(netconfServerDetails.getEnodeBName());
161
162       eventHeader.setReportingEntityId(netconfServerDetails.getDeviceId());
163       eventHeader.setSourceId(netconfServerDetails.getDeviceId());
164     }
165
166     eventHeader.setStartEpochMicrosec(System.currentTimeMillis() * 1000);
167     eventHeader.setVersion(config.getEventVersion());
168     eventHeader.setNfNamingCode("");
169     eventHeader.setNfcNamingCode("");
170     eventHeader.setNfVendorName(config.getVendorName());
171     eventHeader.setVesEventListenerVersion(config.getVesVersion());
172     regEvent.setCommonEventHeader(eventHeader);
173     PnfRegEventFields pnfRegistrationFields = new PnfRegEventFields();
174     regEvent.setPnfRegistrationFields(
175         populatePnfRegFeilds(netconfServerDetails, pnfRegistrationFields, new ArrayList<>()));
176     logger.debug("Converting Notification to VES pnfevent completed");
177     return regEvent;
178   }
179
180   private PnfRegEventFields populatePnfRegFeilds(NetConfServerDetails netconfServerDetails,
181       PnfRegEventFields pnfRegistrationFields, List<ParameterDTO> netconfParameters) {
182
183     pnfRegistrationFields.setSerialNumber(netconfServerDetails.getDeviceId());
184     pnfRegistrationFields.setPnfRegistrationFieldsVersion(config.getPnfFeildVersion());
185     pnfRegistrationFields.setMacAddress(netconfServerDetails.getDeviceId());
186     pnfRegistrationFields.setVendorName(config.getVendorName());
187     pnfRegistrationFields.setSoftwareVersion(netconfServerDetails.getSwVersion());
188
189     pnfRegistrationFields.setOamV4IpAddress(netconfServerDetails.getListenAddress());
190     // TODO: since not supporting 1pv6 we are configuring empty value
191     pnfRegistrationFields.setOamV6IpAddress("");
192
193     pnfRegistrationFields.setManufactureDate("");
194     pnfRegistrationFields.setUnitType(config.getUnitType());
195     pnfRegistrationFields.setUnitFamily(config.getUnitFamily());
196     pnfRegistrationFields.setLastServiceDate(new SimpleDateFormat("ddMMyyyy").format(new Date()));
197
198     // Add additional attributes and device parameters to the VES message in additionalFields
199     HashMap<String, String> additionalFieldsMap = new HashMap<>();
200     PnfRegEventAdditionalFeilds additionalFields = new PnfRegEventAdditionalFeilds();
201     additionalFields.setOamPort(netconfServerDetails.getListenPort());
202     additionalFields.setProtocol("SSH");
203     additionalFields.setUsername(SSH_USERNAME);
204     additionalFields.setPassword(SSH_PSSWORD);
205     additionalFields.setReconnectOnChangedSchema(Boolean.FALSE.toString());
206     additionalFields.setSleepfactor("1.5");
207     additionalFields.setTcpOnly(Boolean.FALSE.toString());
208     additionalFields.setConnectionTimeout("20000");
209     additionalFields.setMaxConnectionAttempts("100");
210     additionalFields.setBetweenAttemptsTimeout("2000");
211     additionalFields.setKeepaliveDelay("120");
212
213     ObjectMapper mapper = new ObjectMapper();
214     String additionalFieldsString;
215     try {
216       additionalFieldsString = mapper.writeValueAsString(additionalFields);
217       HashMap<String, String> pnfAdditionalFieldsMap = new HashMap<>();
218       pnfAdditionalFieldsMap =
219           mapper.readValue(additionalFieldsString, pnfAdditionalFieldsMap.getClass());
220       additionalFieldsMap.putAll(pnfAdditionalFieldsMap);
221     } catch (JsonProcessingException e) {
222       logger.error("Failed to add pnf Reg Additional fields {}", e.getMessage());
223     }
224
225     if (null != netconfParameters) {
226       for (ParameterDTO param : netconfParameters) {
227         additionalFieldsMap.put(param.getParamName(), param.getParamValue());
228       }
229     }
230
231     pnfRegistrationFields.setAdditionalFields(additionalFieldsMap);
232     return pnfRegistrationFields;
233
234   }
235
236 }