Merge "VES Heartbeat and Software Management Feature"
[oam/tr069-adapter.git] / mapper / src / main / java / org / commscope / tr069adapter / mapper / netconf / impl / NetConfRequestHandlerImpl.java
index 834102e..4c06bf2 100644 (file)
@@ -20,13 +20,18 @@ package org.commscope.tr069adapter.mapper.netconf.impl;
 \r
 import java.util.ArrayList;\r
 import java.util.List;\r
+import java.util.Map;\r
 \r
 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
+import org.commscope.tr069adapter.acs.common.OperationOptions;\r
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
-import org.commscope.tr069adapter.mapper.ErrorCodeMetaData;\r
+import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
 import org.commscope.tr069adapter.mapper.MOMetaData;\r
+import org.commscope.tr069adapter.mapper.dao.DeviceOperationsDAO;\r
+import org.commscope.tr069adapter.mapper.entity.DeviceOperationDetails;\r
 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetConfRequest;\r
 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
@@ -34,7 +39,10 @@ import org.commscope.tr069adapter.mapper.model.NetConfServerDetails;
 import org.commscope.tr069adapter.mapper.netconf.NetConfRequestHandler;\r
 import org.commscope.tr069adapter.mapper.sync.SynchronizedRequestHandler;\r
 import org.commscope.tr069adapter.mapper.util.ErrorCodeUtil;\r
+import org.commscope.tr069adapter.mapper.util.FirwareUpgradeStatus;\r
 import org.commscope.tr069adapter.mapper.util.MOMetaDataUtil;\r
+import org.commscope.tr069adapter.mapper.util.MapperConstants;\r
+import org.commscope.tr069adapter.mapper.util.MapperValidator;\r
 import org.commscope.tr069adapter.mapper.util.NetconfToTr069MapperUtil;\r
 import org.commscope.tr069adapter.mapper.ves.VESNotificationSender;\r
 import org.slf4j.Logger;\r
@@ -42,6 +50,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.stereotype.Component;\r
 import org.springframework.util.StringUtils;\r
+import org.w3c.dom.Document;\r
 import org.w3c.dom.Element;\r
 \r
 @Component\r
@@ -67,6 +76,9 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
   @Autowired\r
   VESNotificationSender vesnotiSender;\r
 \r
+  @Autowired\r
+  DeviceOperationsDAO deviceOperDAO;\r
+\r
   @Override\r
   public NetConfResponse handleSetConfigRequest(NetConfRequest netConfRequest) {\r
     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
@@ -80,11 +92,16 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     }\r
     List<ParameterDTO> requestParams = deviceRPCRequest.getOpDetails().getParmeters();\r
     List<ParameterDTO> filteredParams = new ArrayList<>();\r
+    List<ParameterDTO> vesRequestParams = new ArrayList<>();\r
+\r
     if (null != requestParams) {\r
       for (ParameterDTO param : requestParams) {\r
         if (null == param.getParamValue() || StringUtils.isEmpty(param.getParamValue())) {\r
           continue;\r
         }\r
+        if (isVesNotificationRequest(param)) {\r
+          vesRequestParams.add(param);\r
+        }\r
         filteredParams.add(param);\r
       }\r
       deviceRPCRequest.getOpDetails().setParmeters(filteredParams);\r
@@ -106,12 +123,41 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     handleBooleanParametersReverse(deviceRPCRequest.getOpDetails().getParmeters());\r
     LOG.debug("Prepared NBI request for edit-config {}", deviceRPCRequest);\r
 \r
-    DeviceRPCResponse deviceRPCResponse;\r
-    deviceRPCResponse = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+    DeviceRPCResponse deviceRPCResponseVes = null;\r
+    List<ParameterDTO> allParamList = deviceRPCRequest.getOpDetails().getParmeters();\r
+\r
+    if (!vesRequestParams.isEmpty()) {\r
+      if (!MapperValidator.isCountDownTimerValid(vesRequestParams)) {\r
+        return getErrorResponse(MapperConstants.INVALID_PARAM_VAL_ERROR_CODE,\r
+            MapperConstants.INVALID_COUNT_DOWN_TIMER_MSG);\r
+      }\r
+\r
+      deviceRPCRequest.getOpDetails().setParmeters(vesRequestParams);\r
+      deviceRPCResponseVes = vesnotiSender.sendEditConfigNotification(deviceRPCRequest);\r
+\r
+      if (null == deviceRPCResponseVes) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+    allParamList.removeAll(vesRequestParams);\r
+\r
+    DeviceRPCResponse deviceRPCResponseDevice = null;\r
+    if (null != allParamList && !allParamList.isEmpty()) {\r
+      deviceRPCRequest.getOpDetails().setParmeters(allParamList);\r
+      deviceRPCResponseDevice = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+\r
+      if (null == deviceRPCResponseDevice) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+    DeviceRPCResponse deviceRPCResponse =\r
+        mergeSetConfigDeviceRPCResponse(deviceRPCResponseVes, deviceRPCResponseDevice);\r
     if (null == deviceRPCResponse) {\r
       return getTimeOutResponse();\r
     }\r
-    response = mapperUtil.getNetconfResponse(deviceRPCResponse);\r
+    response = mapperUtil.getNetconfResponse(deviceRPCResponse, false);\r
     return response;\r
   }\r
 \r
@@ -154,7 +200,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     if (null == opResult) {\r
       return getTimeOutResponse();\r
     }\r
-    response = mapperUtil.getNetconfResponse(opResult);\r
+    response = mapperUtil.getNetconfResponse(opResult, false);\r
     return response;\r
   }\r
 \r
@@ -186,7 +232,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     if (null == opResult) {\r
       return getTimeOutResponse();\r
     }\r
-    response = mapperUtil.getNetconfResponse(opResult);\r
+    response = mapperUtil.getNetconfResponse(opResult, false);\r
     return response;\r
   }\r
 \r
@@ -194,6 +240,14 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
   public NetConfResponse handleGetConfigRequest(NetConfRequest netConfRequest) {\r
     Element el = NetconfToTr069MapperUtil.convertStringToDocument(netConfRequest.getRequestXml());\r
     NetConfResponse response = null;\r
+    List<ParameterDTO> vesRequestParams = new ArrayList<>();\r
+\r
+    boolean isSoftwareInventory = false;\r
+    if (netConfRequest.getRequestXml().contains("software-inventory")) {\r
+      LOG.info("XML Contains software-inventory");\r
+      isSoftwareInventory = true;\r
+    }\r
+\r
     DeviceRPCRequest request = NetconfToTr069MapperUtil.prepareTR069Request(\r
         netConfRequest.getDeviceId(), el, "filter", TR069OperationCode.GET_PARAMETER_VALUES);\r
 \r
@@ -209,24 +263,59 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
         LOG.debug("There are no supported device parameters found for get-config.");\r
         return getEmptyResponse();\r
       }\r
+      for (ParameterDTO param : request.getOpDetails().getParmeters()) {\r
+        if (isVesNotificationRequest(param)) {\r
+          vesRequestParams.add(param);\r
+        }\r
+      }\r
     }\r
     LOG.debug("Prepared NBI request for get-config {}", request);\r
 \r
-    DeviceRPCResponse opResult;\r
-    opResult = syncHandler.performDeviceOperation(request);\r
+    DeviceRPCResponse opResultVes = null;\r
+    List<ParameterDTO> allParamList = request.getOpDetails().getParmeters();\r
+\r
+    if (!vesRequestParams.isEmpty()) {\r
+      request.getOpDetails().setParmeters(vesRequestParams);\r
+      opResultVes = vesnotiSender.sendGetConfigNotification(request);\r
+\r
+      if (null == opResultVes) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+\r
+    allParamList.removeAll(vesRequestParams);\r
+\r
+    DeviceRPCResponse opResultDevice = null;\r
+    if (!allParamList.isEmpty()) {\r
+      request.getOpDetails().setParmeters(allParamList);\r
+      opResultDevice = syncHandler.performDeviceOperation(request);\r
+\r
+      if (null == opResultDevice) {\r
+        return getTimeOutResponse();\r
+      }\r
+    }\r
+\r
+    DeviceRPCResponse opResult = mergeGetConfigDeviceRPCResponse(opResultVes, opResultDevice);\r
+\r
     if (null == opResult) {\r
       return getTimeOutResponse();\r
     }\r
-    LOG.debug("Received GPV response : FaultKey = {} FaultString = {} Parameters : {}",\r
-        opResult.getFaultKey(), opResult.getFaultString(),\r
-        opResult.getOperationResponse().getParameterDTOs());\r
+    LOG.debug("Received GPV response : FaultKey = " + opResult.getFaultKey() + ", FaultString = "\r
+        + opResult.getFaultString() + ", Parameters :"\r
+        opResult.getOperationResponse().getParameterDTOs());\r
     if (null != opResult.getOperationResponse().getParameterDTOs())\r
       handleBooleanParameters(opResult.getOperationResponse().getParameterDTOs());\r
-    response = mapperUtil.getNetconfResponse(opResult);\r
+\r
+    if (isSoftwareInventory) {\r
+      response = mapperUtil.getNetconfResponseForSoftwareInventory(opResult);\r
+    } else {\r
+      response = mapperUtil.getNetconfResponse(opResult, false);\r
+    }\r
 \r
     if (opResult.getFaultKey() != null && opResult.getFaultKey().equalsIgnoreCase("9005")) {\r
       // check for tabular\r
-      LOG.debug("Tabular Entry not exist in the device; we need to add it now");\r
+      LOG.debug("Tabualr Entry not exist in the device; we need to add it now");\r
       MOMetaData data = metaDataUtil\r
           .getMetaDataByTR69Name(request.getOpDetails().getParmeters().get(0).getParamName());\r
       if (data.isTabluarObj()) {\r
@@ -237,6 +326,148 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return response;\r
   }\r
 \r
+  @Override\r
+  public NetConfResponse handleSWDownloadRequest(NetConfRequest request) {\r
+    LOG.debug("request received fro sw-download");\r
+    Document d1 = NetconfToTr069MapperUtil.convertStringToDocumentXml(request.getRequestXml());\r
+    NetConfResponse response = null;\r
+    Map<String, String> map =\r
+        NetconfToTr069MapperUtil.extractRequestParamters(d1, "rpc", "software-download");\r
+    if (map == null || map.size() <= 0) {\r
+      LOG.debug("There are no device parameters found for get.");\r
+      return getEmptyResponse();\r
+    }\r
+\r
+    TR069OperationDetails opDetails = new TR069OperationDetails();\r
+    DeviceRPCRequest deviceRPCRequest = new DeviceRPCRequest();\r
+    TR069DeviceDetails tr069DeviceDetails = new TR069DeviceDetails();\r
+    tr069DeviceDetails.setDeviceId(request.getDeviceId());\r
+    deviceRPCRequest.setOpDetails(opDetails);\r
+    deviceRPCRequest.setDeviceDetails(tr069DeviceDetails);\r
+    OperationOptions options = new OperationOptions();\r
+    options.setExecutionTimeout(60l);\r
+    deviceRPCRequest.setOptions(options);\r
+    String fileName = map.get("rpc.software-download.remote-file-path");\r
+    String password = map.get("rpc.software-download.password.password");\r
+\r
+    if (fileName == null || password == null || getDownloadFileURI(fileName) == null\r
+        || getDownloadUserName(fileName) == null) {\r
+      LOG.error(\r
+          "remote-file-path value is not as per yang model reference. Allowed pattern sftp://<username>@<host>[:<port>]/path");\r
+      return getOperationAbortedResponse(\r
+          "remote-file-path value is not as per yang model reference. Allowed pattern sftp://<username>@<host>[:<port>]/path");\r
+    }\r
+\r
+    List<ParameterDTO> paramDTOList = new ArrayList<>();\r
+    paramDTOList.add(new ParameterDTO("FileType", "1 Firmware Upgrade Image"));\r
+    paramDTOList.add(new ParameterDTO("URL", getDownloadFileURI(fileName)));\r
+    paramDTOList.add(new ParameterDTO("Username", getDownloadUserName(fileName)));\r
+    paramDTOList.add(new ParameterDTO("Password", password));\r
+    paramDTOList.add(new ParameterDTO("FileSize", "0"));\r
+    paramDTOList.add(new ParameterDTO("TargetFileName", ""));\r
+    paramDTOList.add(new ParameterDTO("DelaySeconds", "1"));\r
+    paramDTOList.add(new ParameterDTO("SuccessURL", ""));\r
+    paramDTOList.add(new ParameterDTO("FailureURL", ""));\r
+\r
+    deviceRPCRequest.getOpDetails().setParmeters(paramDTOList);\r
+    deviceRPCRequest.getOpDetails().setOpCode(TR069OperationCode.DOWNLOAD);\r
+\r
+    LOG.debug("Prepared NBI request for download " + deviceRPCRequest);\r
+\r
+    DeviceOperationDetails fwDetails = deviceOperDAO.findByDeviceId(request.getDeviceId());\r
+    if (fwDetails == null) {\r
+      String errorMsg = "TR069 device request has been aborted,due to device not identified";\r
+      return getOperationAbortedResponse(errorMsg);\r
+    }\r
+\r
+    if (fwDetails.getDownLoadStatus() != FirwareUpgradeStatus.DOWNLOAD_INTIATED.getStatus()\r
+        && fwDetails.getDownLoadStatus() != FirwareUpgradeStatus.DOWNLOAD_COMPLETED.getStatus()) {\r
+\r
+      LOG.debug("persisting the fw details " + fwDetails.toString());\r
+\r
+      DeviceRPCResponse opResult;\r
+      opResult = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+      if (null == opResult) {\r
+        return getTimeOutResponse();\r
+      }\r
+      fwDetails.setFileName(fileName);\r
+      fwDetails.setDownLoadStatus(FirwareUpgradeStatus.DOWNLOAD_INTIATED.getStatus());\r
+      deviceOperDAO.save(fwDetails);\r
+      ArrayList<ParameterDTO> responseParamDTOList = new ArrayList<>();\r
+\r
+      if (opResult.getOperationResponse().getStatus() == 1) {\r
+        responseParamDTOList.add(new ParameterDTO("rpc-reply.ns1:status", "STARTED"));\r
+      } else {\r
+        responseParamDTOList.add(new ParameterDTO("rpc-reply.ns1:status", "FAILED"));\r
+        responseParamDTOList\r
+            .add(new ParameterDTO("rpc-reply.ns1:error-message", opResult.getFaultString()));\r
+      }\r
+      responseParamDTOList.add(new ParameterDTO("rpc-reply.ns1:notification-timeout", "1200"));\r
+\r
+      opResult.getOperationResponse().setParameterDTOs(responseParamDTOList);\r
+      response = mapperUtil.getNetconfResponse(opResult, true);\r
+\r
+      LOG.debug("update the status for fw details " + fwDetails.toString());\r
+    } else {\r
+      LOG.debug("FirmWare Upgrade is in progress");\r
+      String errorMsg = "TR069 device request has been aborted as Firmware Upgrade is inProgress";\r
+      return getOperationAbortedResponse(errorMsg);\r
+    }\r
+\r
+    return response;\r
+  }\r
+\r
+  private DeviceRPCResponse mergeGetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
+      DeviceRPCResponse opResultDevice) {\r
+    if (null == opResultVes) {\r
+      return opResultDevice;\r
+    }\r
+\r
+    if (null == opResultDevice) {\r
+      return opResultVes;\r
+    }\r
+\r
+    if (null != opResultVes.getFaultKey()\r
+        && !opResultVes.getFaultKey().equals(MapperConstants.RPC_SUCCESS)) {\r
+      return opResultVes;\r
+    } else if (null != opResultDevice.getFaultKey()\r
+        && !opResultDevice.getFaultKey().equals(MapperConstants.RPC_SUCCESS)) {\r
+      return opResultDevice;\r
+    }\r
+\r
+    opResultDevice.getOperationResponse().getParameterDTOs()\r
+        .addAll(opResultVes.getOperationResponse().getParameterDTOs());\r
+    return opResultDevice;\r
+  }\r
+\r
+  private DeviceRPCResponse mergeSetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
+      DeviceRPCResponse opResultDevice) {\r
+    if (null == opResultVes) {\r
+      return opResultDevice;\r
+    }\r
+\r
+    if (null == opResultDevice) {\r
+      return opResultVes;\r
+    }\r
+\r
+    return opResultDevice;\r
+  }\r
+\r
+  private boolean isVesNotificationRequest(ParameterDTO param) {\r
+    if (null == param.getParamName() || param.getParamName().isEmpty()) {\r
+      return false;\r
+    }\r
+\r
+    if (param.getParamName().toLowerCase().contains(MapperConstants.HEART_BEAT_PERIOD.toLowerCase())\r
+        || param.getParamName().toLowerCase()\r
+            .contains(MapperConstants.COUNT_DOWN_TIMER.toLowerCase())\r
+        || param.getParamName().toLowerCase().contains(MapperConstants.HEART_BEAT.toLowerCase())) {\r
+      return true;\r
+    }\r
+\r
+    return false;\r
+  }\r
+\r
   private void handleBooleanParameters(List<ParameterDTO> parameterDTOs) {\r
 \r
     for (ParameterDTO param : parameterDTOs) {\r
@@ -267,7 +498,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
 \r
   private NetConfResponse getEmptyResponse() {\r
     NetConfResponse response = new NetConfResponse();\r
-    ErrorCodeMetaData errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("0");\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("0");\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
     errorCode.setFaultCode("0");\r
     errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
@@ -282,7 +513,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     // prepare timeout error response\r
     NetConfResponse timeOutErrorResponse = new NetConfResponse();\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
-    ErrorCodeMetaData errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
 \r
     errorCode.setFaultCode("8006");\r
     errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
@@ -294,6 +525,39 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return timeOutErrorResponse;\r
   }\r
 \r
+  private NetConfResponse getErrorResponse(String errCode, String errorMsg) {\r
+    NetConfResponse errorResponse = new NetConfResponse();\r
+    ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
+    if (errorCodeMetaData != null) {\r
+      errorCode.setFaultCode(errCode);\r
+      errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
+      errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
+    }\r
+    errorResponse.setErrorCode(errorCode);\r
+    errorResponse.setErrorMessage(errorMsg);\r
+    return errorResponse;\r
+  }\r
+\r
+  private NetConfResponse getOperationAbortedResponse(String errorMessage) {\r
+    // prepare timeout error response\r
+    NetConfResponse timeOutErrorResponse = new NetConfResponse();\r
+    ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
+    ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
+    if (errorCode != null) {\r
+      errorCode.setFaultCode("8002");\r
+      errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
+      errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
+      errorCode.setErrorTag(errorCodeMetaData.getErrorTag());\r
+      errorCode.setErrorSeverity(errorCodeMetaData.getErrorSeverity());\r
+    }\r
+    timeOutErrorResponse.setErrorCode(errorCode);\r
+    timeOutErrorResponse.setErrorMessage(errorMessage);\r
+    return timeOutErrorResponse;\r
+  }\r
+\r
   public List<ParameterDTO> filteredSetParameters(List<ParameterDTO> parameters) {\r
     List<ParameterDTO> result = new ArrayList<>();\r
     for (ParameterDTO param : parameters) {\r
@@ -327,4 +591,28 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     LOG.debug("processing the handelRegisterEvent completed");\r
     return result;\r
   }\r
+\r
+  private static String getDownloadFileURI(String filepath) {\r
+\r
+    if (filepath.contains("@") && filepath.contains("//")) {\r
+      String[] str = filepath.split("@");\r
+      String[] strForUserName = str[0].split("//");\r
+      if (str.length > 1) {\r
+        String Url = strForUserName[0] + "//" + str[1];\r
+        return Url;\r
+      }\r
+    }\r
+    return null;\r
+  }\r
+\r
+  private static String getDownloadUserName(String filepath) {\r
+\r
+    if (filepath.contains("@") && filepath.contains("//")) {\r
+      String[] str = filepath.split("@");\r
+      String[] strForUserName = str[0].split("//");\r
+      if (strForUserName.length > 1)\r
+        return strForUserName[1];\r
+    }\r
+    return null;\r
+  }\r
 }\r