diff options
Diffstat (limited to 'cps-ncmp-service')
7 files changed, 70 insertions, 31 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java index c3369d8439..39641442a0 100755 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java @@ -60,8 +60,10 @@ import org.onap.cps.ncmp.api.models.DmiPluginRegistrationResponse; import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle; import org.onap.cps.spi.exceptions.AlreadyDefinedException; import org.onap.cps.spi.exceptions.DataNodeNotFoundException; +import org.onap.cps.spi.exceptions.DataValidationException; import org.onap.cps.spi.exceptions.SchemaSetNotFoundException; import org.onap.cps.spi.model.ModuleReference; +import org.onap.cps.utils.CpsValidator; import org.onap.cps.utils.JsonObjectMapper; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -119,7 +121,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService final String acceptParamInHeader, final String optionsParamInQuery, final String topicParamInQuery) { - + CpsValidator.validateNameCharacters(cmHandleId); return validateTopicNameAndGetResourceData(cmHandleId, resourceIdentifier, acceptParamInHeader, DmiOperations.DataStoreEnum.PASSTHROUGH_OPERATIONAL, optionsParamInQuery, topicParamInQuery); } @@ -130,6 +132,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService final String acceptParamInHeader, final String optionsParamInQuery, final String topicParamInQuery) { + CpsValidator.validateNameCharacters(cmHandleId); return validateTopicNameAndGetResourceData(cmHandleId, resourceIdentifier, acceptParamInHeader, DmiOperations.DataStoreEnum.PASSTHROUGH_RUNNING, optionsParamInQuery, topicParamInQuery); } @@ -140,6 +143,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService final OperationEnum operation, final String requestData, final String dataType) { + CpsValidator.validateNameCharacters(cmHandleId); return handleResponse( dmiDataOperations.writeResourceDataPassThroughRunningFromDmi( cmHandleId, resourceIdentifier, operation, requestData, dataType), @@ -149,6 +153,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService @Override public Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandleId) { + CpsValidator.validateNameCharacters(cmHandleId); return cpsModuleService.getYangResourcesModuleReferences(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, cmHandleId); } @@ -171,6 +176,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService */ @Override public NcmpServiceCmHandle getNcmpServiceCmHandle(final String cmHandleId) { + CpsValidator.validateNameCharacters(cmHandleId); final NcmpServiceCmHandle ncmpServiceCmHandle = new NcmpServiceCmHandle(); final YangModelCmHandle yangModelCmHandle = yangModelCmHandleRetriever.getDmiServiceNamesAndProperties(cmHandleId); @@ -235,6 +241,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService private CmHandleRegistrationResponse registerAndSyncNewCmHandle(final YangModelCmHandle yangModelCmHandle) { try { + CpsValidator.validateNameCharacters(yangModelCmHandle.getId()); final String cmHandleJsonData = String.format("{\"cm-handles\":[%s]}", jsonObjectMapper.asJsonString(yangModelCmHandle)); cpsDataService.saveListElements(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, NCMP_DMI_REGISTRY_PARENT, @@ -244,6 +251,9 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService } catch (final AlreadyDefinedException alreadyDefinedException) { return CmHandleRegistrationResponse.createFailureResponse( yangModelCmHandle.getId(), RegistrationError.CM_HANDLE_ALREADY_EXIST); + } catch (final DataValidationException dataValidationException) { + return CmHandleRegistrationResponse.createFailureResponse(yangModelCmHandle.getId(), + RegistrationError.CM_HANDLE_INVALID_ID); } catch (final Exception exception) { return CmHandleRegistrationResponse.createFailureResponse(yangModelCmHandle.getId(), exception); } @@ -260,6 +270,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService new ArrayList<>(tobeRemovedCmHandles.size()); for (final String cmHandle : tobeRemovedCmHandles) { try { + CpsValidator.validateNameCharacters(cmHandle); deleteSchemaSetWithCascade(cmHandle); cpsDataService.deleteListOrListElement(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, "/dmi-registry/cm-handles[@id='" + cmHandle + "']", NO_TIMESTAMP); @@ -269,8 +280,13 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService cmHandle, dataNodeNotFoundException.getMessage()); cmHandleRegistrationResponses.add(CmHandleRegistrationResponse .createFailureResponse(cmHandle, RegistrationError.CM_HANDLE_DOES_NOT_EXIST)); + } catch (final DataValidationException dataValidationException) { + log.error("Unable to de-register cm-handle id: {}, caused by: {}", + cmHandle, dataValidationException.getMessage()); + cmHandleRegistrationResponses.add(CmHandleRegistrationResponse + .createFailureResponse(cmHandle, RegistrationError.CM_HANDLE_INVALID_ID)); } catch (final Exception exception) { - log.error("Unable to de-register cm-handleIdd : {} , caused by : {}", + log.error("Unable to de-register cm-handle id : {} , caused by : {}", cmHandle, exception.getMessage()); cmHandleRegistrationResponses.add( CmHandleRegistrationResponse.createFailureResponse(cmHandle, exception)); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java index c838a752ec..ff79f87245 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandler.java @@ -45,8 +45,10 @@ import org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationErr import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle; import org.onap.cps.spi.FetchDescendantsOption; import org.onap.cps.spi.exceptions.DataNodeNotFoundException; +import org.onap.cps.spi.exceptions.DataValidationException; import org.onap.cps.spi.model.DataNode; import org.onap.cps.spi.model.DataNodeBuilder; +import org.onap.cps.utils.CpsValidator; import org.springframework.stereotype.Service; @Slf4j @@ -72,6 +74,7 @@ public class NetworkCmProxyDataServicePropertyHandler { for (final NcmpServiceCmHandle ncmpServiceCmHandle : ncmpServiceCmHandles) { final String cmHandle = ncmpServiceCmHandle.getCmHandleID(); try { + CpsValidator.validateNameCharacters(cmHandle); final String cmHandleXpath = String.format(CM_HANDLE_XPATH_TEMPLATE, cmHandle); final DataNode existingCmHandleDataNode = cpsDataService.getDataNode(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, cmHandleXpath, @@ -83,8 +86,14 @@ public class NetworkCmProxyDataServicePropertyHandler { cmHandle, e.getMessage()); cmHandleRegistrationResponses.add(CmHandleRegistrationResponse .createFailureResponse(cmHandle, RegistrationError.CM_HANDLE_DOES_NOT_EXIST)); + } catch (final DataValidationException e) { + log.error("Unable to update cm handle : {}, caused by : {}", + cmHandle, e.getMessage()); + cmHandleRegistrationResponses.add( + CmHandleRegistrationResponse.createFailureResponse(cmHandle, + RegistrationError.CM_HANDLE_INVALID_ID)); } catch (final Exception exception) { - log.error("Unable to update dataNode for cmHandleId : {} , caused by : {}", + log.error("Unable to update cmHandle : {} , caused by : {}", cmHandle, exception.getMessage()); cmHandleRegistrationResponses.add( CmHandleRegistrationResponse.createFailureResponse(cmHandle, exception)); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponse.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponse.java index e183ed114b..1da2aa9430 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponse.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponse.java @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2022 Bell Canada + * Modifications Copyright (C) 2022 Nordix Foundation * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -77,7 +78,8 @@ public class CmHandleRegistrationResponse { public enum RegistrationError { UNKNOWN_ERROR("00", "Unknown error"), CM_HANDLE_ALREADY_EXIST("01", "cm-handle already exists"), - CM_HANDLE_DOES_NOT_EXIST("02", "cm-handle does not exist"); + CM_HANDLE_DOES_NOT_EXIST("02", "cm-handle does not exist"), + CM_HANDLE_INVALID_ID("03", "cm-handle has an invalid character(s) in id"); public final String errorCode; public final String errorText; diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy index e7c1d0560d..cb4d5ef406 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplRegistrationSpec.groovy @@ -35,6 +35,7 @@ import org.onap.cps.ncmp.api.models.DmiPluginRegistration import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle import org.onap.cps.spi.exceptions.AlreadyDefinedException import org.onap.cps.spi.exceptions.DataNodeNotFoundException +import org.onap.cps.spi.exceptions.DataValidationException import org.onap.cps.spi.exceptions.SchemaSetNotFoundException import org.onap.cps.utils.JsonObjectMapper import spock.lang.Shared @@ -42,6 +43,7 @@ import spock.lang.Specification import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_DOES_NOT_EXIST import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_ALREADY_EXIST +import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_INVALID_ID import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.UNKNOWN_ERROR import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.Status import static org.onap.cps.spi.CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED @@ -218,7 +220,7 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { def 'Create CM-Handle Error Handling: Registration fails: #scenario'() { given: 'a registration without cm-handle properties' def dmiPluginRegistration = new DmiPluginRegistration(dmiPlugin: 'my-server') - dmiPluginRegistration.createdCmHandles = [new NcmpServiceCmHandle(cmHandleID: 'cmhandle')] + dmiPluginRegistration.createdCmHandles = [new NcmpServiceCmHandle(cmHandleID: cmHandleId)] and: 'cm-handler registration fails: #scenario' mockCpsDataService.saveListElements(_, _, _, _, _) >> { throw exception } when: 'registration is updated' @@ -227,16 +229,17 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { response.getCreatedCmHandles().size() == 1 with(response.getCreatedCmHandles().get(0)) { assert it.status == Status.FAILURE - assert it.cmHandle == 'cmhandle' + assert it.cmHandle == cmHandleId assert it.registrationError == expectedError assert it.errorText == expectedErrorText } and: 'model-sync is not invoked' 0 * objectUnderTest.syncModulesAndCreateAnchor(_) where: - scenario | exception || expectedError | expectedErrorText - 'cm-handle already exist' | new AlreadyDefinedException('', new RuntimeException()) || CM_HANDLE_ALREADY_EXIST | 'cm-handle already exists' - 'unknown exception while registering cm-handle' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + scenario | cmHandleId | exception || expectedError | expectedErrorText + 'cm-handle already exist' | 'cmhandle' | new AlreadyDefinedException('', new RuntimeException()) || CM_HANDLE_ALREADY_EXIST | 'cm-handle already exists' + 'cm-handle has invalid name' | 'cm handle with space' | new DataValidationException("", "") || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' + 'unknown exception while registering cm-handle' | 'cmhandle' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' } def 'Create CM-Handle Error Handling: Model Sync fails'() { @@ -268,12 +271,13 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { and: 'cm-handle updates can be processed successfully' def updateOperationResponse = [CmHandleRegistrationResponse.createSuccessResponse('cm-handle-1'), CmHandleRegistrationResponse.createFailureResponse('cm-handle-2', new Exception("Failed")), - CmHandleRegistrationResponse.createFailureResponse('cm-handle-3', CM_HANDLE_DOES_NOT_EXIST)] + CmHandleRegistrationResponse.createFailureResponse('cm-handle-3', CM_HANDLE_DOES_NOT_EXIST), + CmHandleRegistrationResponse.createFailureResponse('cm handle 4', CM_HANDLE_INVALID_ID)] mockNetworkCmProxyDataServicePropertyHandler.updateCmHandleProperties(_) >> updateOperationResponse when: 'registration is updated' def response = objectUnderTest.updateDmiRegistrationAndSyncModule(dmiPluginRegistration) then: 'the response contains updateOperationResponse' - assert response.getUpdatedCmHandles().size() == 3 + assert response.getUpdatedCmHandles().size() == 4 assert response.getUpdatedCmHandles().containsAll(updateOperationResponse) } @@ -369,9 +373,10 @@ class NetworkCmProxyDataServiceImplRegistrationSpec extends Specification { assert it.errorText == expectedErrorText } where: - scenario | deleteListElementException | expectedError | expectedErrorText - 'cm-handle does not exist' | new DataNodeNotFoundException("", "", "") | CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' - 'an unexpected exception' | new RuntimeException("Failed") | UNKNOWN_ERROR | 'Failed' + scenario | cmHandleId | deleteListElementException || expectedError | expectedErrorText + 'cm-handle does not exist' | 'cmhandle' | new DataNodeNotFoundException("", "", "") || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' + 'cm-handle has invalid name' | 'cm handle with space' | new DataValidationException("", "") || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' + 'an unexpected exception' | 'cmhandle' | new RuntimeException("Failed") || UNKNOWN_ERROR | 'Failed' } def getObjectUnderTestWithModelSyncDisabled() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy index c21d7e7742..ded4943702 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy @@ -286,9 +286,9 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { def 'Getting Yang Resources.'() { when: 'yang resources is called' - objectUnderTest.getYangResourcesModuleReferences('some cm handle') + objectUnderTest.getYangResourcesModuleReferences('some-cm-handle') then: 'CPS module services is invoked for the correct dataspace and cm handle' - 1 * mockCpsModuleService.getYangResourcesModuleReferences('NFP-Operational','some cm handle') + 1 * mockCpsModuleService.getYangResourcesModuleReferences('NFP-Operational','some-cm-handle') } def 'Get cm handle identifiers for the given module names.'() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy index f6264f4921..7aacbda513 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServicePropertyHandlerSpec.groovy @@ -21,7 +21,10 @@ package org.onap.cps.ncmp.api.impl +import org.onap.cps.spi.exceptions.DataValidationException + import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_DOES_NOT_EXIST +import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.CM_HANDLE_INVALID_ID import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.RegistrationError.UNKNOWN_ERROR import static org.onap.cps.ncmp.api.models.CmHandleRegistrationResponse.Status @@ -118,7 +121,7 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { 'no original properties' | [] || 0 } - def 'Exception thrown when we try to update cmHandle'() { + def '#scenario error leads to #exception when we try to update cmHandle'() { given: 'cm handles request' def cmHandleUpdateRequest = [new NcmpServiceCmHandle(cmHandleID: cmHandleId, publicProperties: [:], dmiProperties: [:])] and: 'data node cannot be found' @@ -135,9 +138,10 @@ class NetworkCmProxyDataServicePropertyHandlerSpec extends Specification { assert it.errorText == expectedErrorText } where: - scenario | exception || expectedError | expectedErrorText - 'cmhandle does not exist' | new DataNodeNotFoundException('NCMP-Admin', 'ncmp-dmi-registry') || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' - 'unexpected error' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + scenario | cmHandleId | exception || expectedError | expectedErrorText + 'Cm Handle does not exist' | 'cmHandleId' | new DataNodeNotFoundException('NCMP-Admin', 'ncmp-dmi-registry') || CM_HANDLE_DOES_NOT_EXIST | 'cm-handle does not exist' + 'Unknown' | 'cmHandleId' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed' + 'Invalid cm handle id' | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id' } def 'Multiple update operations in a single request'() { diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy index c5ef2f446d..4476998d82 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/models/CmHandleRegistrationResponseSpec.groovy @@ -26,8 +26,8 @@ import spock.lang.Specification class CmHandleRegistrationResponseSpec extends Specification { - def 'Successful CmHandle Registration Response'() { - when: 'CMHandle response is created' + def 'Successful cm-handle Registration Response'() { + when: 'cm-handle response is created' def cmHandleRegistrationResponse = CmHandleRegistrationResponse.createSuccessResponse('cmHandle') then: 'a success response is returned' with(cmHandleRegistrationResponse) { @@ -39,8 +39,8 @@ class CmHandleRegistrationResponseSpec extends Specification { cmHandleRegistrationResponse.errorText == null } - def 'Failed Cm Handle Registration Response: for unexpected exception'() { - when: 'CMHandle response is created for an unexpected exception' + def 'Failed cm-handle Registration Response: for unexpected exception'() { + when: 'cm-handle response is created for an unexpected exception' def cmHandleRegistrationResponse = CmHandleRegistrationResponse.createFailureResponse('cmHandle', new Exception('unexpected error')) then: 'the response is created with expected value' @@ -51,18 +51,21 @@ class CmHandleRegistrationResponseSpec extends Specification { } } - def 'Failed Cm Handle Registration Response: for known error'() { - when: 'CMHandle response is created for known error' + def 'Failed cm-handle Registration Response: for #scenario'() { + when: 'cm-handle failure response is created for #scenario' def cmHandleRegistrationResponse = - CmHandleRegistrationResponse.createFailureResponse('cmHandle', RegistrationError.CM_HANDLE_ALREADY_EXIST) + CmHandleRegistrationResponse.createFailureResponse(cmHandleId, registrationError) then: 'the response is created with expected value' with(cmHandleRegistrationResponse) { - assert it.registrationError == RegistrationError.CM_HANDLE_ALREADY_EXIST - assert it.cmHandle == 'cmHandle' + assert it.registrationError == registrationError + assert it.cmHandle == cmHandleId assert it.status == Status.FAILURE - assert errorText == RegistrationError.CM_HANDLE_ALREADY_EXIST.errorText + assert errorText == registrationError.errorText } - + where: + scenario | cmHandleId | registrationError + 'cm-handle already exists' | 'cmHandle' | RegistrationError.CM_HANDLE_ALREADY_EXIST + 'cm-handle id is invalid' | 'cm handle' | RegistrationError.CM_HANDLE_INVALID_ID } } |