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