SPV is failing if Admin state 78/4378/2
authorcschowdam <chandrasekhar.chowdam@commscope.com>
Mon, 13 Jul 2020 11:59:10 +0000 (11:59 +0000)
committerChandra Chowdam <chandrasekhar.chowdam@commscope.com>
Mon, 13 Jul 2020 12:07:36 +0000 (12:07 +0000)
Admin state issue fix and heart beat start epoc time rounding change.

Issue-Id: OAM-130
Signed-off-by: cschowdam <chandrasekhar.chowdam@commscope.com>
Change-Id: I32091e4f9115dfc33f94b5ead69c360f5f4cf35a

18 files changed:
acs/common/src/main/java/org/commscope/tr069adapter/acs/common/ParameterDTO.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/custom/ConfigureMultipleObject.java
acs/requestprocessor/src/main/java/org/commscope/tr069adapter/acs/requestprocessor/util/TR069RequestProcessorUtility.java
mapper/Dockerfile
mapper/csadapter.properties [deleted file]
mapper/pom.xml
mapper/src/main/java/org/commscope/tr069adapter/mapper/MapperConfigProperties.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/acs/impl/ACSNotificationHandlerImpl.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/netconf/impl/NetConfRequestHandlerImpl.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/MapperConstants.java
mapper/src/main/java/org/commscope/tr069adapter/mapper/util/NetconfToTr069MapperUtil.java
mapper/src/main/resources/application.properties
netconf-server/src/main/java/org/commscope/tr069adapter/netconf/server/helper/ServerPortAllocationHelper.java
ves-agent/Dockerfile
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/async/AsyncRequestHandler.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/controller/HeartBeatMessageHandler.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/entity/DeviceDataEntity.java
ves-agent/src/main/java/org/commscope/tr069adapter/vesagent/util/VesAgentUtils.java

index d8daf50..f6b97f1 100644 (file)
@@ -19,7 +19,6 @@
 package org.commscope.tr069adapter.acs.common;\r
 \r
 import com.fasterxml.jackson.annotation.JsonTypeInfo;\r
-\r
 import java.io.Serializable;\r
 \r
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")\r
@@ -31,6 +30,7 @@ public class ParameterDTO implements Serializable {
   private String paramValue;\r
   private String dataType;\r
   private boolean isProcessed;\r
+  private boolean isInitiated = Boolean.FALSE;\r
 \r
   public ParameterDTO() {\r
 \r
@@ -81,6 +81,14 @@ public class ParameterDTO implements Serializable {
     this.isProcessed = isProcessed;\r
   }\r
 \r
+  public boolean isInitiated() {\r
+    return isInitiated;\r
+  }\r
+\r
+  public void setInitiated(boolean isInitiated) {\r
+    this.isInitiated = isInitiated;\r
+  }\r
+\r
   @Override\r
   public String toString() {\r
     return "ParameterDTO [paramName=" + paramName + ", paramValue=" + paramValue + ", dataType="\r
index 768edf3..5b36b88 100644 (file)
@@ -20,12 +20,10 @@ package org.commscope.tr069adapter.acs.requestprocessor.custom;
 \r
 import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.NUMBER_REGEX;\r
 import static org.commscope.tr069adapter.acs.common.utils.AcsConstants.SUCCESS;\r
-\r
 import java.util.ArrayList;\r
 import java.util.List;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
-\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
 import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
 import org.commscope.tr069adapter.acs.common.OperationDetails;\r
@@ -252,6 +250,20 @@ public class ConfigureMultipleObject implements CustomOperation {
       } else if (opResponse instanceof SetParameterValueResponse) {\r
         logger.debug("Received Set parameter value response");\r
         isPendingOperationExists = false;\r
+        for (ParameterDTO setParam : tr069modifyParamList) {\r
+          if (Boolean.TRUE.equals(setParam.isInitiated())\r
+              && Boolean.FALSE.equals(setParam.isProcessed())) {\r
+            setParam.setInitiated(Boolean.FALSE);\r
+            setParam.setProcessed(Boolean.TRUE);\r
+          } else if (Boolean.FALSE.equals(setParam.isInitiated())\r
+              && Boolean.FALSE.equals(setParam.isProcessed())) {\r
+            isPendingOperationExists = true;\r
+            nextOperation = OperationOrder.SET_PARAMETER_VALUE;\r
+          }\r
+        }\r
+\r
+        updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);\r
+        logger.debug("Next operation to be executed is : {}", nextOperation);\r
       }\r
     }\r
 \r
@@ -323,7 +335,39 @@ public class ConfigureMultipleObject implements CustomOperation {
               clonedOpRequest.setOpDetails(null);\r
               OperationDetails opDetails = new OperationDetails();\r
               opDetails.setOpCode(TR069OperationCode.SET_PARAMETER_VALUES);\r
-              opDetails.setParmeters(tr069modifyParamList);\r
+              List<ParameterDTO> unprocessedParamList = new ArrayList<>();\r
+              ParameterDTO adminStateParam = null;\r
+              for (ParameterDTO paramDTO : tr069modifyParamList) {\r
+                if (!paramDTO.isProcessed()) {\r
+                  if (isAdminStateExists(paramDTO)) {\r
+                    adminStateParam = paramDTO;\r
+                  } else {\r
+                    unprocessedParamList.add(paramDTO);\r
+                  }\r
+                }\r
+              }\r
+\r
+              if (null != adminStateParam && isAdminStateFalse(adminStateParam.getParamValue())) {\r
+                List<ParameterDTO> adminStateParamList = new ArrayList<>();\r
+                adminStateParam.setInitiated(Boolean.TRUE);\r
+                adminStateParamList.add(adminStateParam);\r
+                opDetails.setParmeters(adminStateParamList);\r
+                updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);\r
+              } else if (!unprocessedParamList.isEmpty()) {\r
+                setInititedFlagTrue(unprocessedParamList);\r
+                opDetails.setParmeters(unprocessedParamList);\r
+                updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);\r
+              } else if (null != adminStateParam\r
+                  && isAdminStateTrue(adminStateParam.getParamValue())) {\r
+                List<ParameterDTO> paramList = new ArrayList<>();\r
+                adminStateParam.setInitiated(Boolean.TRUE);\r
+                paramList.add(adminStateParam);\r
+                opDetails.setParmeters(paramList);\r
+                updateParamChangedFlagInDb(deviceDetails.getDeviceId(), nbiDeviceOperationRequest);\r
+              } else {\r
+                isPendingOperationExists = false;\r
+              }\r
+\r
               clonedOpRequest.setOpDetails(opDetails);\r
               operRequest = clonedOpRequest;\r
             } else {\r
@@ -383,6 +427,7 @@ public class ConfigureMultipleObject implements CustomOperation {
     return customOperationData;\r
   }\r
 \r
+\r
   enum OperationOrder {\r
 \r
     SET_PARAMETER_VALUE(null), ADD_OBJECT(SET_PARAMETER_VALUE), DELETE_OBJECT(ADD_OBJECT);\r
@@ -421,4 +466,37 @@ public class ConfigureMultipleObject implements CustomOperation {
     return parameterDTO;\r
   }\r
 \r
+  private boolean isAdminStateExists(ParameterDTO paramDTO) {\r
+    return (paramDTO.getParamName().contains(TR069RequestProcessorUtility.ADMIN_STATE)\r
+        || paramDTO.getParamName().contains(TR069RequestProcessorUtility.ADMIN_STATUS));\r
+  }\r
+\r
+  private void updateParamChangedFlagInDb(String deviceId,\r
+      DeviceRPCRequest nbiDeviceOperationRequest) throws TR069EventProcessingException {\r
+    List<TR069DeviceRPCRequestEntity> entityList = deviceRPCRequestRepositoryHelper\r
+        .findByDeviceIdAndOperationId(deviceId, nbiDeviceOperationRequest.getOperationId());\r
+    List<TR069DeviceRPCRequestEntity> tr069DeviceRPCRequestEntityList =\r
+        TR069RequestProcessorUtility.convertToEntity(nbiDeviceOperationRequest);\r
+    for (int i = 0; i < entityList.size(); i++) {\r
+      tr069DeviceRPCRequestEntityList.get(i).setId(entityList.get(i).getId());\r
+    }\r
+    deviceRPCRequestRepositoryHelper.saveAll(tr069DeviceRPCRequestEntityList);\r
+  }\r
+\r
+  private void setInititedFlagTrue(List<ParameterDTO> unprocessedParamList) {\r
+    for (ParameterDTO paramDTO : unprocessedParamList) {\r
+      paramDTO.setInitiated(Boolean.TRUE);\r
+    }\r
+  }\r
+\r
+  private boolean isAdminStateFalse(String adminState) {\r
+    return (null != adminState && (adminState.equalsIgnoreCase(Boolean.FALSE.toString())\r
+        || adminState.equalsIgnoreCase("0")));\r
+  }\r
+\r
+  private boolean isAdminStateTrue(String adminState) {\r
+    return (null != adminState && (adminState.equalsIgnoreCase(Boolean.TRUE.toString())\r
+        || adminState.equalsIgnoreCase("1")));\r
+  }\r
+\r
 }\r
index 9386a07..1ce4a44 100644 (file)
@@ -48,6 +48,8 @@ public class TR069RequestProcessorUtility {
   protected static final int BLOCK_SIZE = 3999;\r
   protected static final int MAX_SIZE = 11998;\r
   public static final int DEVICE_REACHABLE_STATUS_CODE = 100;\r
+  public static final String ADMIN_STATE = "FAPControl.LTE.AdminState";\r
+  public static final String ADMIN_STATUS = "FAPControl.LTE.AdminStatus";\r
 \r
 \r
   private TR069RequestProcessorUtility() {\r
index 513522f..56bb542 100644 (file)
@@ -38,6 +38,7 @@ ENV DB_SERVICE=tr069adapter-mariadb
 ENV DB_NAME=dmsdb\r
 ENV DB_USERNAME=root\r
 ENV DB_PASSWORD=root\r
+ENV VENDOR_NAME=CS\r
 \r
 WORKDIR /opt/CSAdapter/\r
 \r
diff --git a/mapper/csadapter.properties b/mapper/csadapter.properties
deleted file mode 100644 (file)
index abe9cef..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# ============LICENSE_START========================================================================\r
-# ONAP : tr-069-adapter\r
-# =================================================================================================\r
-# Copyright (C) 2020 CommScope Inc Intellectual Property.\r
-# =================================================================================================\r
-# This tr-069-adapter software file is distributed by CommScope Inc\r
-# under the Apache License, Version 2.0 (the "License");\r
-# you may not use this file except in compliance with the License.\r
-# You may obtain a copy of the License at\r
-#\r
-# http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-# This file is distributed on an "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-# See the License for the specific language governing permissions and\r
-# limitations under the License.\r
-# ===============LICENSE_END=======================================================================\r
-\r
-# CS Adapter configuration file. test\r
-REQUEST_TIMEOUT=40\r
-SBI_URI=http://tr069adapter:${SBI_REST_PORT}/tr069DMSBI/operationRequest\r
-NBI_URI=http://netconfserver:${NBI_REST_PORT}/tr069DMSBI/operationRequest
\ No newline at end of file
index 36d6ba9..b2091c9 100644 (file)
                   </configuration>
                </execution>
             </executions>
+         </plugin>
+                <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-jar-plugin</artifactId>
+            <executions>
+               <execution>
+                  <id>mapper-jar</id>
+                  <goals>
+                     <goal>jar</goal>
+                  </goals>
+                  <configuration>
+                     <finalName>mapper-jar</finalName>
+                     <classifier>lib</classifier>
+                  </configuration>
+               </execution>
+            </executions>
          </plugin>
          <plugin>
             <groupId>org.springframework.boot</groupId>
index 023617a..3ccf919 100644 (file)
@@ -43,6 +43,7 @@ public class MapperConfigProperties {
   private String alarmMORegex;\r
 \r
   private String verConfigUri;\r
+  private String vendorName;\r
 \r
   public String getRequesTimeout() {\r
     return requesTimeout;\r
@@ -132,4 +133,12 @@ public class MapperConfigProperties {
     this.verConfigUri = verConfigUri;\r
   }\r
 \r
+  public String getVendorName() {\r
+    return vendorName;\r
+  }\r
+\r
+  public void setVendorName(String vendorName) {\r
+    this.vendorName = vendorName;\r
+  }\r
+\r
 }\r
index 12e2761..e4bc24e 100644 (file)
@@ -376,6 +376,7 @@ public class ACSNotificationHandlerImpl implements ACSNotificationHandler {
         if (notification.getDeviceDetails().getSoftwareVersion()\r
             .equalsIgnoreCase(devDetails.getSwVersion())) {\r
           paramList.add(new ParameterDTO("activation-event.status", "APPLICATION_ERROR"));\r
+          paramList.add(new ParameterDTO("activation-event.error-message", "Same Software Version is reported after upgrade"));\r
           devDetails.setDownLoadStatus(FirwareUpgradeStatus.ACTIVATION_ERROR.getStatus());\r
         } else {\r
           devDetails.setSwVersion(notification.getDeviceDetails().getSoftwareVersion());\r
index 4c06bf2..5d6f183 100644 (file)
@@ -21,14 +21,16 @@ package org.commscope.tr069adapter.mapper.netconf.impl;
 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.OperationResponse;\r
 import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
+import org.commscope.tr069adapter.acs.common.dto.CustomOperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
+import org.commscope.tr069adapter.acs.common.response.SetParameterValueResponse;\r
 import org.commscope.tr069adapter.mapper.MOMetaData;\r
 import org.commscope.tr069adapter.mapper.dao.DeviceOperationsDAO;\r
 import org.commscope.tr069adapter.mapper.entity.DeviceOperationDetails;\r
@@ -71,7 +73,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
   MOMetaDataUtil metaDataUtil;\r
 \r
   @Autowired\r
-  private ErrorCodeUtil errorCodeUtil;\r
+  ErrorCodeUtil errorCodeUtil;\r
 \r
   @Autowired\r
   VESNotificationSender vesnotiSender;\r
@@ -145,7 +147,18 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     DeviceRPCResponse deviceRPCResponseDevice = null;\r
     if (null != allParamList && !allParamList.isEmpty()) {\r
       deviceRPCRequest.getOpDetails().setParmeters(allParamList);\r
-      deviceRPCResponseDevice = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+      if (isAdminStateOverriden(allParamList)) {\r
+        deviceRPCRequest.getOpDetails().setOpCode(CustomOperationCode.CONFIGURE_MULTIPLE_OBJECTS);\r
+        TR069OperationDetails tr069OperationDetails =\r
+            (TR069OperationDetails) deviceRPCRequest.getOpDetails();\r
+        tr069OperationDetails.setModifyParamList(allParamList);\r
+        tr069OperationDetails.setSetParamList(null);\r
+\r
+        deviceRPCResponseDevice = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+        convertResposeToSPVResponse(deviceRPCResponseDevice);\r
+      } else {\r
+        deviceRPCResponseDevice = syncHandler.performDeviceOperation(deviceRPCRequest);\r
+      }\r
 \r
       if (null == deviceRPCResponseDevice) {\r
         return getTimeOutResponse();\r
@@ -417,7 +430,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return response;\r
   }\r
 \r
-  private DeviceRPCResponse mergeGetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
+  protected DeviceRPCResponse mergeGetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
       DeviceRPCResponse opResultDevice) {\r
     if (null == opResultVes) {\r
       return opResultDevice;\r
@@ -440,7 +453,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return opResultDevice;\r
   }\r
 \r
-  private DeviceRPCResponse mergeSetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
+  protected DeviceRPCResponse mergeSetConfigDeviceRPCResponse(DeviceRPCResponse opResultVes,\r
       DeviceRPCResponse opResultDevice) {\r
     if (null == opResultVes) {\r
       return opResultDevice;\r
@@ -453,7 +466,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return opResultDevice;\r
   }\r
 \r
-  private boolean isVesNotificationRequest(ParameterDTO param) {\r
+  protected boolean isVesNotificationRequest(ParameterDTO param) {\r
     if (null == param.getParamName() || param.getParamName().isEmpty()) {\r
       return false;\r
     }\r
@@ -468,7 +481,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return false;\r
   }\r
 \r
-  private void handleBooleanParameters(List<ParameterDTO> parameterDTOs) {\r
+  protected void handleBooleanParameters(List<ParameterDTO> parameterDTOs) {\r
 \r
     for (ParameterDTO param : parameterDTOs) {\r
       MOMetaData metaData = metaDataUtil.getMetaDataByTR69Name(param.getParamName());\r
@@ -482,7 +495,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     }\r
   }\r
 \r
-  private void handleBooleanParametersReverse(List<ParameterDTO> parameterDTOs) {\r
+  protected void handleBooleanParametersReverse(List<ParameterDTO> parameterDTOs) {\r
 \r
     for (ParameterDTO param : parameterDTOs) {\r
       MOMetaData metaData = metaDataUtil.getMetaDataByTR69Name(param.getParamName());\r
@@ -496,7 +509,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     }\r
   }\r
 \r
-  private NetConfResponse getEmptyResponse() {\r
+  protected NetConfResponse getEmptyResponse() {\r
     NetConfResponse response = new NetConfResponse();\r
     ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("0");\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
@@ -509,7 +522,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return response;\r
   }\r
 \r
-  private NetConfResponse getTimeOutResponse() {\r
+  protected NetConfResponse getTimeOutResponse() {\r
     // prepare timeout error response\r
     NetConfResponse timeOutErrorResponse = new NetConfResponse();\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
@@ -525,7 +538,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return timeOutErrorResponse;\r
   }\r
 \r
-  private NetConfResponse getErrorResponse(String errCode, String errorMsg) {\r
+  protected NetConfResponse getErrorResponse(String errCode, String errorMsg) {\r
     NetConfResponse errorResponse = new NetConfResponse();\r
     ErrorCodeDetails errorCode = new ErrorCodeDetails();\r
     ErrorCodeDetails errorCodeMetaData = errorCodeUtil.getErrorCodeMetaData("8006");\r
@@ -541,12 +554,12 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return errorResponse;\r
   }\r
 \r
-  private NetConfResponse getOperationAbortedResponse(String errorMessage) {\r
+  protected 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
+    if (errorCodeMetaData != null) {\r
       errorCode.setFaultCode("8002");\r
       errorCode.setErrorMessage(errorCodeMetaData.getErrorMessage());\r
       errorCode.setErrorType(errorCodeMetaData.getErrorType());\r
@@ -573,7 +586,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return result;\r
   }\r
 \r
-  private List<ParameterDTO> filteredGetParameters(List<ParameterDTO> parameters) {\r
+  protected List<ParameterDTO> filteredGetParameters(List<ParameterDTO> parameters) {\r
 \r
     return metaDataUtil.getSupportedChildParameters(parameters);\r
   }\r
@@ -592,7 +605,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return result;\r
   }\r
 \r
-  private static String getDownloadFileURI(String filepath) {\r
+  protected static String getDownloadFileURI(String filepath) {\r
 \r
     if (filepath.contains("@") && filepath.contains("//")) {\r
       String[] str = filepath.split("@");\r
@@ -605,7 +618,7 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     return null;\r
   }\r
 \r
-  private static String getDownloadUserName(String filepath) {\r
+  protected static String getDownloadUserName(String filepath) {\r
 \r
     if (filepath.contains("@") && filepath.contains("//")) {\r
       String[] str = filepath.split("@");\r
@@ -615,4 +628,31 @@ public class NetConfRequestHandlerImpl implements NetConfRequestHandler {
     }\r
     return null;\r
   }\r
+\r
+  protected boolean isAdminStateOverriden(List<ParameterDTO> paramList) {\r
+    for (ParameterDTO paramDTO : paramList) {\r
+      if (paramDTO.getParamName().contains(MapperConstants.ADMIN_STATE)\r
+          || paramDTO.getParamName().contains(MapperConstants.ADMIN_STATUS)) {\r
+        return true;\r
+      }\r
+    }\r
+    return false;\r
+  }\r
+\r
+  protected void convertResposeToSPVResponse(DeviceRPCResponse deviceRPCResponse) {\r
+    if (null == deviceRPCResponse) {\r
+      return;\r
+    }\r
+\r
+    OperationResponse operationResponse = new SetParameterValueResponse();\r
+    operationResponse.setParameterDTOs(new ArrayList<ParameterDTO>());\r
+\r
+    if (null == deviceRPCResponse.getFaultKey()) {\r
+      operationResponse.setStatus(MapperConstants.RPC_SUCCESS_CODE);\r
+    } else {\r
+      operationResponse.setStatus(MapperConstants.RPC_FAILED_CODE);\r
+    }\r
+\r
+    deviceRPCResponse.setOperationResponse(operationResponse);\r
+  }\r
 }\r
index e0672c3..36cd193 100644 (file)
  * ===============LICENSE_END=======================================================================
  */
 
-package org.commscope.tr069adapter.mapper.util;\r
-\r
-public class MapperConstants {\r
-  public static final String HEART_BEAT_PERIOD = "heartbeatPeriod";\r
-  public static final String HEART_BEAT = "heartbeat";\r
-  public static final String COUNT_DOWN_TIMER = "countDownTimer";\r
-  public static final String COUNT_DOWN_TIMER_SET_VAL = "0";\r
-  public static final String INVALID_COUNT_DOWN_TIMER_MSG =\r
-      "Only 0 is allowed for countDownTimer value during set operation";\r
-  public static final String INVALID_PARAM_VAL_ERROR_CODE = "9007";\r
-\r
-  public static final int DEVICE_REACHABLE_STATUS_CODE = 100;\r
-  public static final int DEVICE_REACHABILITY_OP_FAILURE_CODE = 101;\r
-  public static final String DEVICE_TIMEOUT_STATUS_CODE = "8006";\r
-  public static final String DEVICE_REACHABLE_MSG = "Device is reachable";\r
-  public static final String DEFAULT_OP_TIMEOUT_MSG = "Operation Timed out";\r
-  public static final String RPC_SUCCESS = "0";\r
-}\r
+package org.commscope.tr069adapter.mapper.util;
+
+public class MapperConstants {
+  public static final String HEART_BEAT_PERIOD = "heartbeatPeriod";
+  public static final String HEART_BEAT = "heartbeat";
+  public static final String COUNT_DOWN_TIMER = "countDownTimer";
+  public static final String COUNT_DOWN_TIMER_SET_VAL = "0";
+  public static final String INVALID_COUNT_DOWN_TIMER_MSG =
+      "Only 0 is allowed for countDownTimer value during set operation";
+  public static final String INVALID_PARAM_VAL_ERROR_CODE = "9007";
+
+  public static final int DEVICE_REACHABLE_STATUS_CODE = 100;
+  public static final int DEVICE_REACHABILITY_OP_FAILURE_CODE = 101;
+  public static final String DEVICE_TIMEOUT_STATUS_CODE = "8006";
+  public static final String DEVICE_REACHABLE_MSG = "Device is reachable";
+  public static final String DEFAULT_OP_TIMEOUT_MSG = "Operation Timed out";
+  public static final String RPC_SUCCESS = "0";
+  public static final String RPC_FAILED = "1";
+
+  public static final int RPC_SUCCESS_CODE = 0;
+  public static final int RPC_FAILED_CODE = 1;
+
+  public static final String ADMIN_STATE = "FAPControl.LTE.AdminState";
+  public static final String ADMIN_STATUS = "FAPControl.LTE.AdminStatus";
+}
index 02a87c1..b7fa188 100644 (file)
@@ -45,6 +45,7 @@ import org.commscope.tr069adapter.acs.common.ParameterDTO;
 import org.commscope.tr069adapter.acs.common.dto.TR069DeviceDetails;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationCode;\r
 import org.commscope.tr069adapter.acs.common.dto.TR069OperationDetails;\r
+import org.commscope.tr069adapter.mapper.MapperConfigProperties;\r
 import org.commscope.tr069adapter.mapper.model.ErrorCodeDetails;\r
 import org.commscope.tr069adapter.mapper.model.NetConfResponse;\r
 import org.slf4j.Logger;\r
@@ -62,6 +63,9 @@ public class NetconfToTr069MapperUtil {
 \r
   @Autowired\r
   MOMetaDataUtil metaDataUtil;\r
+  \r
+  @Autowired\r
+  MapperConfigProperties config;\r
 \r
   private static final Logger logger = LoggerFactory.getLogger(NetconfToTr069MapperUtil.class);\r
   private static final String INDEX_STR = "index";\r
@@ -230,7 +234,7 @@ public class NetconfToTr069MapperUtil {
     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.access", "READ_ONLY"));\r
     paramDTOList\r
         .add(new ParameterDTO("software-inventory.software-slot.product-code", productClass));\r
-    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.vendor-code", "CS"));\r
+    paramDTOList.add(new ParameterDTO("software-inventory.software-slot.vendor-code", config.getVendorName()));\r
     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-id", buildId));\r
     paramDTOList.add(new ParameterDTO("software-inventory.software-slot.build-version",\r
         buildVersion.toString()));\r
index c5c974f..d041905 100644 (file)
@@ -28,8 +28,9 @@ config.nbiNotificationUri=http://${NBI_REST_HOST}:${NBI_REST_PORT}/netConfNotifi
 config.nbiServerManagerUri=http://${NBI_REST_HOST}:${NBI_REST_PORT}/netConfServerManagerService\r
 config.vesUri=http://${VES_REST_HOST}:${VES_REST_PORT}/vesagent/deviceEvent\r
 config.verConfigUri=http://${VES_REST_HOST}:${VES_REST_PORT}/vesagent\r
-config.netConfServerIP=${netConfServerIP};\r
-config.netConfServerPort=${netConfServerPort};\r
+config.netConfServerIP=${netConfServerIP}\r
+config.netConfServerPort=${netConfServerPort}\r
+config.vendorName=${VENDOR_NAME}\r
 \r
 ## Datasource properties\r
 spring.datasource.platform=mariadb\r
index f5ff597..9e5479d 100644 (file)
@@ -75,8 +75,8 @@ public class ServerPortAllocationHelper {
     }\r
     LOG.debug("Successfully populated available ports list.");\r
   }\r
-\r
-  public String reserveServerPort() throws ServerPortAllocationException {\r
+  \r
+  public synchronized String reserveServerPort() throws ServerPortAllocationException {\r
 \r
     if (availablePorts.isEmpty()) {\r
       LOG.debug(\r
@@ -89,6 +89,7 @@ public class ServerPortAllocationHelper {
     LOG.debug("Trying to reserve port : {}", port);\r
     if (isServerPortInUse(port)) {\r
       LOG.debug("Port {} is already in use.", port);\r
+      availablePorts.poll();\r
       return reserveServerPort(); // retry if current port is not available\r
     }\r
 \r
index 20aac87..0598078 100644 (file)
@@ -28,12 +28,12 @@ ENV faultvesCollectorHost=localhost
 ENV faultvesCollectorPort=30235\r
 ENV pnfregvesCollectorHost=localhost\r
 ENV pnfregvesCollectorPort=30235\r
-ENV vendorName=CommScope\r
-ENV faultEventType=CommScope_RAN_Alarms\r
-ENV pnfRegEventType=CommScope_RAN_pnfRegistration\r
-ENV unitFamily=OneCell\r
-ENV unitType=BasebandController\r
-ENV faultEventSourcePrefix=OneCell\r
+ENV vendorName=ORAN\r
+ENV faultEventType=O_RAN_Alarms\r
+ENV pnfRegEventType=O_RAN_pnfRegistration\r
+ENV unitFamily=ORAN\r
+ENV unitType=SmallCell\r
+ENV faultEventSourcePrefix=SmallCell\r
 ENV DB_SERVICE=tr069adapter-mariadb\r
 ENV DB_NAME=dmsdb\r
 ENV DB_USERNAME=root\r
index cf1562a..06ba127 100644 (file)
@@ -122,7 +122,8 @@ public class AsyncRequestHandler {
   }\r
 \r
   @Async\r
-  public void initiateDeviceReachabilityCheck(DeviceDataEntity deviceDataEntity) {\r
+  public void initiateDeviceReachabilityCheck(DeviceDataEntity deviceDataEntity) {
+    deviceDataEntity.setStartEpochMicrosec(VesAgentUtils.getStartEpochTime()*1000);\r
     DeviceDetails deviceDetails = new DeviceDetails();\r
     deviceDetails.setDeviceId(deviceDataEntity.getDeviceId());\r
     deviceDetails.setOui(deviceDataEntity.getOui());\r
index c62681c..80da0f6 100644 (file)
@@ -221,7 +221,7 @@ public class HeartBeatMessageHandler {
       eventHeader.setSourceId(deviceDataEntity.getDeviceId());\r
     }\r
 \r
-    eventHeader.setStartEpochMicrosec(System.currentTimeMillis() * 1000);\r
+    eventHeader.setStartEpochMicrosec(deviceDataEntity.getStartEpochMicrosec());\r
     eventHeader.setVersion(config.getEventVersion());\r
     eventHeader.setNfNamingCode("");\r
     eventHeader.setNfcNamingCode("");\r
index 44aa437..07b50a7 100644 (file)
@@ -32,13 +32,6 @@ import javax.persistence.Table;
 import javax.persistence.Transient;\r
 import javax.persistence.UniqueConstraint;\r
 \r
-/**\r
- * \r
- * @version 1.0\r
- * @since May 21, 2020\r
- * @author Prashant Kumar\r
- */\r
-\r
 @Entity\r
 @Table(name = "VES_DEVICE_DATA",\r
     uniqueConstraints = @UniqueConstraint(columnNames = {"DEVICE_ID", "ATTR_GROUP"}))\r
@@ -132,6 +125,17 @@ public class DeviceDataEntity {
 \r
   public void setLastUpdateTime(Date lastUpdateTime) {\r
     this.lastUpdateTime = lastUpdateTime;\r
+  }
+  
+  @Transient
+  private Long startEpochMicrosec;
+
+  public Long getStartEpochMicrosec() {
+    return startEpochMicrosec;
+  }
+
+  public void setStartEpochMicrosec(Long startEpochMicrosec) {
+    this.startEpochMicrosec = startEpochMicrosec;
   }\r
 \r
   @Transient\r
index 4fb8482..ae43e1f 100644 (file)
  * ===============LICENSE_END=======================================================================
  */
 
-package org.commscope.tr069adapter.vesagent.util;\r
-\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.apache.commons.logging.Log;\r
-import org.apache.commons.logging.LogFactory;\r
-import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;\r
-import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;\r
-import org.commscope.tr069adapter.acs.common.OperationCode;\r
-import org.commscope.tr069adapter.acs.common.OperationResponse;\r
-import org.commscope.tr069adapter.acs.common.ParameterDTO;\r
-import org.commscope.tr069adapter.mapper.model.VESNotification;\r
-import org.commscope.tr069adapter.vesagent.exception.VesAgentException;\r
-\r
-\r
-public class VesAgentUtils {\r
-  private static final Log logger = LogFactory.getLog(VesAgentUtils.class);\r
-\r
-  private static String errorMsg = null;\r
-\r
-  public static boolean isNullOrEmpty(String object) {\r
-    return (null == object || object.isEmpty());\r
-  }\r
-\r
-  public static Boolean isNullOrEmpty(List list) {\r
-    return (null == list || list.isEmpty());\r
-  }\r
-\r
-  public static Boolean isNullOrEmpty(Map map) {\r
-    return (null == map || map.isEmpty());\r
-  }\r
-\r
-  public static void validateDeviceId(String deviceId) throws VesAgentException {\r
-    if (null == deviceId || deviceId.isEmpty()) {\r
-      errorMsg = "Error: deviceId in request is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(errorMsg);\r
-    }\r
-  }\r
-\r
-  public static void validateHeartBeatPeriod(Integer heartBeatPeriod) throws VesAgentException {\r
-    if (null == heartBeatPeriod) {\r
-      errorMsg = "Error: heartBeatPeriod in request is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(errorMsg);\r
-    }\r
-  }\r
-\r
-\r
-  public static void validateCountDownTimer(Integer countDownTimer) throws VesAgentException {\r
-    if (null == countDownTimer) {\r
-      errorMsg = "Error: countDownTimer in request is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(errorMsg);\r
-    }\r
-  }\r
-\r
-  public static void validateDeviceRPCRequest(DeviceRPCRequest deviceRPCRequest)\r
-      throws VesAgentException {\r
-    if (null == deviceRPCRequest || null == deviceRPCRequest.getOpDetails()\r
-        || null == deviceRPCRequest.getOpDetails().getParmeters()\r
-        || deviceRPCRequest.getOpDetails().getParmeters().isEmpty()) {\r
-      errorMsg = "Error: Input parameter list is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
-    }\r
-\r
-    if (null == deviceRPCRequest.getDeviceDetails()\r
-        || null == deviceRPCRequest.getDeviceDetails().getDeviceId()\r
-        || deviceRPCRequest.getDeviceDetails().getDeviceId().isEmpty()) {\r
-      errorMsg = "Error: Input deviceId is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
-    }\r
-  }\r
-\r
-  public static void validateVESNotification(VESNotification notification)\r
-      throws VesAgentException {\r
-    if (null == notification || null == notification.getDevnotification()\r
-        || null == notification.getDevnotification().getDeviceDetails()\r
-        || null == notification.getDevnotification().getDeviceDetails().getDeviceId()\r
-        || notification.getDevnotification().getDeviceDetails().getDeviceId().isEmpty()) {\r
-\r
-      errorMsg = "Error: Input device details is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
-    }\r
-  }\r
-\r
-  public static void validateDelVESNotification(VESNotification notification)\r
-      throws VesAgentException {\r
-    if (null == notification || null == notification.getOperationDetails()\r
-        || null == notification.getOperationDetails().getParmeters()\r
-        || notification.getOperationDetails().getParmeters().isEmpty()) {\r
-      errorMsg = "Error: Input parameter list is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
-    }\r
-\r
-    if (null == notification.geteNodeBName() || notification.geteNodeBName().isEmpty()) {\r
-      errorMsg = "Error: Input deviceId/enodeBName is null or empty";\r
-      logger.error(errorMsg);\r
-      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);\r
-    }\r
-  }\r
-\r
-\r
-  public static DeviceRPCResponse getErrorResponse(DeviceRPCRequest deviceRPCRequest,\r
-      String faultCode, String faultMessage) {\r
-    DeviceRPCResponse errorResponse = new DeviceRPCResponse();\r
-\r
-    errorResponse.setDeviceDetails(deviceRPCRequest.getDeviceDetails());\r
-\r
-    OperationResponse operationResponse = new OperationResponse();\r
-    operationResponse.setStatus(VesAgentConstants.RPC_FAILED);// device reachable...change value 1\r
-                                                              // to some constant or enum\r
-    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());\r
-\r
-    errorResponse.setOperationResponse(operationResponse);\r
-    errorResponse.setFaultKey(faultCode);\r
-    errorResponse.setFaultString(faultMessage);\r
-\r
-    return errorResponse;\r
-  }\r
-\r
-  public static DeviceRPCResponse getSuccessResponse(DeviceRPCRequest deviceRPCRequest) {\r
-    DeviceRPCResponse response = new DeviceRPCResponse();\r
-\r
-    response.setDeviceDetails(deviceRPCRequest.getDeviceDetails());\r
-\r
-    OperationResponse operationResponse = new OperationResponse();\r
-    operationResponse.setStatus(VesAgentConstants.RPC_SUCCESS);\r
-    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());\r
-    operationResponse.setParameterDTOs(deviceRPCRequest.getOpDetails().getParmeters());\r
-\r
-    response.setOperationResponse(operationResponse);\r
-    return response;\r
-  }\r
-\r
-  public static boolean isDeviceReachable(DeviceRPCResponse deviceRPCResponse) {\r
-    if (null == deviceRPCResponse || null == deviceRPCResponse.getOperationResponse()) {\r
-      return false;\r
-    }\r
-\r
-    if (deviceRPCResponse.getOperationResponse()\r
-        .getStatus() == VesAgentConstants.DEVICE_IS_REACHABLE) {\r
-      return true;\r
-    }\r
-\r
-    return (null != deviceRPCResponse.getFaultKey() && deviceRPCResponse.getFaultKey()\r
-        .equalsIgnoreCase(VesAgentConstants.ABORTED_BY_BOOT_BOOTSTRAP));\r
-  }\r
-\r
-  public static Boolean isVesNotificationRequest(ParameterDTO param) {\r
-    if (null == param.getParamName() || param.getParamName().isEmpty()) {\r
-      return false;\r
-    }\r
-\r
-    return param.getParamName().toLowerCase().contains(VesAgentConstants.HEART_BEAT.toLowerCase());\r
-  }\r
-\r
-\r
-  public static String getDeviceOperationKey(String deviceId, OperationCode opCode) {\r
-    return deviceId + "-" + opCode;\r
-  }\r
-\r
-}\r
+package org.commscope.tr069adapter.vesagent.util;
+
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.commscope.tr069adapter.acs.common.DeviceRPCRequest;
+import org.commscope.tr069adapter.acs.common.DeviceRPCResponse;
+import org.commscope.tr069adapter.acs.common.OperationCode;
+import org.commscope.tr069adapter.acs.common.OperationResponse;
+import org.commscope.tr069adapter.acs.common.ParameterDTO;
+import org.commscope.tr069adapter.mapper.model.VESNotification;
+import org.commscope.tr069adapter.vesagent.exception.VesAgentException;
+
+
+public class VesAgentUtils {
+  private static final Log logger = LogFactory.getLog(VesAgentUtils.class);
+
+  private static String errorMsg = null;
+
+  public static boolean isNullOrEmpty(String object) {
+    return (null == object || object.isEmpty());
+  }
+
+  public static Boolean isNullOrEmpty(List list) {
+    return (null == list || list.isEmpty());
+  }
+
+  public static Boolean isNullOrEmpty(Map map) {
+    return (null == map || map.isEmpty());
+  }
+
+  public static void validateDeviceId(String deviceId) throws VesAgentException {
+    if (null == deviceId || deviceId.isEmpty()) {
+      errorMsg = "Error: deviceId in request is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(errorMsg);
+    }
+  }
+
+  public static void validateHeartBeatPeriod(Integer heartBeatPeriod) throws VesAgentException {
+    if (null == heartBeatPeriod) {
+      errorMsg = "Error: heartBeatPeriod in request is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(errorMsg);
+    }
+  }
+
+
+  public static void validateCountDownTimer(Integer countDownTimer) throws VesAgentException {
+    if (null == countDownTimer) {
+      errorMsg = "Error: countDownTimer in request is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(errorMsg);
+    }
+  }
+
+  public static void validateDeviceRPCRequest(DeviceRPCRequest deviceRPCRequest)
+      throws VesAgentException {
+    if (null == deviceRPCRequest || null == deviceRPCRequest.getOpDetails()
+        || null == deviceRPCRequest.getOpDetails().getParmeters()
+        || deviceRPCRequest.getOpDetails().getParmeters().isEmpty()) {
+      errorMsg = "Error: Input parameter list is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);
+    }
+
+    if (null == deviceRPCRequest.getDeviceDetails()
+        || null == deviceRPCRequest.getDeviceDetails().getDeviceId()
+        || deviceRPCRequest.getDeviceDetails().getDeviceId().isEmpty()) {
+      errorMsg = "Error: Input deviceId is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);
+    }
+  }
+
+  public static void validateVESNotification(VESNotification notification)
+      throws VesAgentException {
+    if (null == notification || null == notification.getDevnotification()
+        || null == notification.getDevnotification().getDeviceDetails()
+        || null == notification.getDevnotification().getDeviceDetails().getDeviceId()
+        || notification.getDevnotification().getDeviceDetails().getDeviceId().isEmpty()) {
+
+      errorMsg = "Error: Input device details is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);
+    }
+  }
+
+  public static void validateDelVESNotification(VESNotification notification)
+      throws VesAgentException {
+    if (null == notification || null == notification.getOperationDetails()
+        || null == notification.getOperationDetails().getParmeters()
+        || notification.getOperationDetails().getParmeters().isEmpty()) {
+      errorMsg = "Error: Input parameter list is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);
+    }
+
+    if (null == notification.geteNodeBName() || notification.geteNodeBName().isEmpty()) {
+      errorMsg = "Error: Input deviceId/enodeBName is null or empty";
+      logger.error(errorMsg);
+      throw new VesAgentException(VesAgentConstants.INVALID_ARGUMENTS, errorMsg);
+    }
+  }
+
+
+  public static DeviceRPCResponse getErrorResponse(DeviceRPCRequest deviceRPCRequest,
+      String faultCode, String faultMessage) {
+    DeviceRPCResponse errorResponse = new DeviceRPCResponse();
+
+    errorResponse.setDeviceDetails(deviceRPCRequest.getDeviceDetails());
+
+    OperationResponse operationResponse = new OperationResponse();
+    operationResponse.setStatus(VesAgentConstants.RPC_FAILED);// device reachable...change value 1
+                                                              // to some constant or enum
+    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());
+
+    errorResponse.setOperationResponse(operationResponse);
+    errorResponse.setFaultKey(faultCode);
+    errorResponse.setFaultString(faultMessage);
+
+    return errorResponse;
+  }
+
+  public static DeviceRPCResponse getSuccessResponse(DeviceRPCRequest deviceRPCRequest) {
+    DeviceRPCResponse response = new DeviceRPCResponse();
+
+    response.setDeviceDetails(deviceRPCRequest.getDeviceDetails());
+
+    OperationResponse operationResponse = new OperationResponse();
+    operationResponse.setStatus(VesAgentConstants.RPC_SUCCESS);
+    operationResponse.setOperationCode(deviceRPCRequest.getOpDetails().getOpCode());
+    operationResponse.setParameterDTOs(deviceRPCRequest.getOpDetails().getParmeters());
+
+    response.setOperationResponse(operationResponse);
+    return response;
+  }
+
+  public static boolean isDeviceReachable(DeviceRPCResponse deviceRPCResponse) {
+    if (null == deviceRPCResponse || null == deviceRPCResponse.getOperationResponse()) {
+      return false;
+    }
+
+    if (deviceRPCResponse.getOperationResponse()
+        .getStatus() == VesAgentConstants.DEVICE_IS_REACHABLE) {
+      return true;
+    }
+
+    return (null != deviceRPCResponse.getFaultKey() && deviceRPCResponse.getFaultKey()
+        .equalsIgnoreCase(VesAgentConstants.ABORTED_BY_BOOT_BOOTSTRAP));
+  }
+
+  public static Boolean isVesNotificationRequest(ParameterDTO param) {
+    if (null == param.getParamName() || param.getParamName().isEmpty()) {
+      return false;
+    }
+
+    return param.getParamName().toLowerCase().contains(VesAgentConstants.HEART_BEAT.toLowerCase());
+  }
+
+
+  public static String getDeviceOperationKey(String deviceId, OperationCode opCode) {
+    return deviceId + "-" + opCode;
+  }
+
+  public static long getStartEpochTime() {
+    Calendar calendar = Calendar.getInstance();
+
+    long minuteEquivalentWithoutSec = calendar.getTimeInMillis();
+    minuteEquivalentWithoutSec = (minuteEquivalentWithoutSec / 60000);
+    minuteEquivalentWithoutSec = minuteEquivalentWithoutSec * 60 * 1000;
+
+    return minuteEquivalentWithoutSec;
+  }
+
+}