From 5fe0daebb1360bd5d4c525125cdb0d6250583ff4 Mon Sep 17 00:00:00 2001 From: DylanB95EST Date: Tue, 9 Nov 2021 13:54:35 +0000 Subject: Support Update and Delete operations for DS Passtrough-Running in DMI Plugin -Add Update operation for Passthrough Running -Use POST operatiosn for all methods as agrred -refactor to simplify and beter reuse of common methods -add delete operation for passthrough running Issue-ID: CPS-637 Issue-ID: CPS-638 Change-Id: I441181f977dee2bc0be944662465d868595ea452 Signed-off-by: DylanB95EST --- .../dmi/rest/controller/DmiRestController.java | 124 +++++++++++---------- .../org/onap/cps/ncmp/dmi/service/DmiService.java | 47 +++----- .../onap/cps/ncmp/dmi/service/DmiServiceImpl.java | 37 ++---- .../dmi/service/client/SdncRestconfClient.java | 38 ++++--- .../ncmp/dmi/service/operation/SdncOperations.java | 45 ++++++-- 5 files changed, 152 insertions(+), 139 deletions(-) (limited to 'src/main/java/org/onap') diff --git a/src/main/java/org/onap/cps/ncmp/dmi/rest/controller/DmiRestController.java b/src/main/java/org/onap/cps/ncmp/dmi/rest/controller/DmiRestController.java index b17280ae..97848c3e 100644 --- a/src/main/java/org/onap/cps/ncmp/dmi/rest/controller/DmiRestController.java +++ b/src/main/java/org/onap/cps/ncmp/dmi/rest/controller/DmiRestController.java @@ -26,8 +26,7 @@ import java.util.List; import javax.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.onap.cps.ncmp.dmi.model.CmHandles; -import org.onap.cps.ncmp.dmi.model.DataAccessReadRequest; -import org.onap.cps.ncmp.dmi.model.DataAccessWriteRequest; +import org.onap.cps.ncmp.dmi.model.DataAccessRequest; import org.onap.cps.ncmp.dmi.model.ModuleReferencesRequest; import org.onap.cps.ncmp.dmi.model.ModuleResourcesReadRequest; import org.onap.cps.ncmp.dmi.model.ModuleSet; @@ -73,25 +72,6 @@ public class DmiRestController implements DmiPluginApi, DmiPluginInternalApi { return new ResponseEntity<>(yangResources, HttpStatus.OK); } - /** - * Write data using passthrough for the given cmHandle. - * - * @param dataAccessWriteRequest pass through request - * @param resourceIdentifier resource identifier - * @param cmHandle cmHandle - * @return (@ code ResponseEntity) response entity - */ - @Override - public ResponseEntity writeDataByPassthroughRunningForCmHandle( - final DataAccessWriteRequest dataAccessWriteRequest, - final String resourceIdentifier, final String cmHandle) { - final String response = dmiService.writeResourceDataPassthroughForCmHandle(cmHandle, - resourceIdentifier, - MediaType.APPLICATION_JSON_VALUE, - dataAccessWriteRequest.getData()); - return new ResponseEntity<>(response, HttpStatus.CREATED); - } - /** * This method register given list of cm-handles to ncmp. * @@ -109,52 +89,84 @@ public class DmiRestController implements DmiPluginApi, DmiPluginInternalApi { /** * This method fetches the resource for given cm handle using pass through operational. It filters the response on - * the basis of options query parameters and returns response. + * the basis of options query parameters and returns response. Does not support write operations. * * @param resourceIdentifier resource identifier to fetch data * @param cmHandle cm handle identifier - * @param dataAccessReadRequest data Access Read Request + * @param dataAccessRequest data Access Request * @param acceptParamInHeader accept header parameter * @param optionsParamInQuery options query parameter * @return {@code ResponseEntity} response entity */ @Override - public ResponseEntity getResourceDataOperationalForCmHandle(final String resourceIdentifier, - final String cmHandle, - final @Valid DataAccessReadRequest dataAccessReadRequest, - final String acceptParamInHeader, - final @Valid String optionsParamInQuery) { - final var modulesListAsJson = dmiService.getResourceDataOperationalForCmHandle(cmHandle, - resourceIdentifier, - acceptParamInHeader, - optionsParamInQuery, - dataAccessReadRequest.getCmHandleProperties()); - return ResponseEntity.ok(modulesListAsJson); + public ResponseEntity dataAccessPassthroughOperational(final String resourceIdentifier, + final String cmHandle, + final @Valid DataAccessRequest + dataAccessRequest, + final String acceptParamInHeader, + final @Valid String optionsParamInQuery) { + if (isReadOperation(dataAccessRequest)) { + final String resourceDataAsJson = dmiService.getResourceData(cmHandle, + resourceIdentifier, + acceptParamInHeader, + optionsParamInQuery, + DmiService.RESTCONF_CONTENT_PASSTHROUGH_OPERATIONAL_QUERY_PARAM); + return ResponseEntity.ok(resourceDataAsJson); + } + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } - /** - * This method fetches the resource for given cm handle using pass through running. It filters the response on the - * basis of options query parameters and returns response. - * - * @param resourceIdentifier resource identifier to fetch data - * @param cmHandle cm handle identifier - * @param dataAccessReadRequest data Access Read Request - * @param acceptParamInHeader accept header parameter - * @param optionsParamInQuery options query parameter - * @return {@code ResponseEntity} response entity - */ @Override - public ResponseEntity getResourceDataPassthroughRunningForCmHandle(final String resourceIdentifier, - final String cmHandle, - final @Valid DataAccessReadRequest dataAccessReadRequest, - final String acceptParamInHeader, - final @Valid String optionsParamInQuery) { - final var modulesListAsJson = dmiService.getResourceDataPassThroughRunningForCmHandle(cmHandle, - resourceIdentifier, - acceptParamInHeader, - optionsParamInQuery, - dataAccessReadRequest.getCmHandleProperties()); - return ResponseEntity.ok(modulesListAsJson); + public ResponseEntity dataAccessPassthroughRunning(final String resourceIdentifier, + final String cmHandle, + final @Valid DataAccessRequest + dataAccessRequest, + final String acceptParamInHeader, + final @Valid String optionsParamInQuery) { + final String sdncResponse; + if (isReadOperation(dataAccessRequest)) { + sdncResponse = dmiService.getResourceData(cmHandle, + resourceIdentifier, + acceptParamInHeader, + optionsParamInQuery, + DmiService.RESTCONF_CONTENT_PASSTHROUGH_RUNNING_QUERY_PARAM); + } else { + sdncResponse = dmiService.writeData( + dataAccessRequest.getOperation(), + cmHandle, + resourceIdentifier, + MediaType.APPLICATION_JSON_VALUE, + dataAccessRequest.getData()); + } + return new ResponseEntity<>(sdncResponse, getHttpStatus(dataAccessRequest)); + } + + private boolean isReadOperation(final @Valid DataAccessRequest dataAccessRequest) { + return dataAccessRequest.getOperation() == null + || dataAccessRequest.getOperation().equals(DataAccessRequest.OperationEnum.READ); + } + + private HttpStatus getHttpStatus(final DataAccessRequest dataAccessRequest) { + final HttpStatus httpStatus; + if (dataAccessRequest.getOperation() == null) { + httpStatus = HttpStatus.OK; + } else { + switch (dataAccessRequest.getOperation()) { + case CREATE: + httpStatus = HttpStatus.CREATED; + break; + case READ: + case UPDATE: + httpStatus = HttpStatus.OK; + break; + case DELETE: + httpStatus = HttpStatus.NO_CONTENT; + break; + default: + httpStatus = HttpStatus.BAD_REQUEST; + } + } + return httpStatus; } private List convertRestObjectToJavaApiObject( diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/DmiService.java b/src/main/java/org/onap/cps/ncmp/dmi/service/DmiService.java index c6910399..0f3fcc0c 100644 --- a/src/main/java/org/onap/cps/ncmp/dmi/service/DmiService.java +++ b/src/main/java/org/onap/cps/ncmp/dmi/service/DmiService.java @@ -21,18 +21,23 @@ package org.onap.cps.ncmp.dmi.service; import java.util.List; -import java.util.Map; import javax.validation.constraints.NotNull; import org.onap.cps.ncmp.dmi.exception.DmiException; +import org.onap.cps.ncmp.dmi.model.DataAccessRequest; import org.onap.cps.ncmp.dmi.model.ModuleSet; import org.onap.cps.ncmp.dmi.model.YangResources; import org.onap.cps.ncmp.dmi.service.model.ModuleReference; + + /** * Interface for handling Dmi plugin Data. */ public interface DmiService { + String RESTCONF_CONTENT_PASSTHROUGH_OPERATIONAL_QUERY_PARAM = "content=all"; + String RESTCONF_CONTENT_PASSTHROUGH_RUNNING_QUERY_PARAM = "content=config"; + /** * This method fetches all modules for given Cm Handle. * @@ -60,41 +65,24 @@ public interface DmiService { YangResources getModuleResources(String cmHandle, List modules); /** - * This method use to fetch the resource data from cm handle for datastore pass-through operational and resource - * Identifier. Options query parameter are used to filter the response from network resource. - * - * @param cmHandle cm handle identifier - * @param resourceIdentifier resource identifier - * @param acceptParamInHeader accept header parameter - * @param optionsParamInQuery options query parameter - * @param cmHandlePropertyMap cm handle properties - * @return {@code Object} response from network function - */ - Object getResourceDataOperationalForCmHandle(@NotNull String cmHandle, - @NotNull String resourceIdentifier, - String acceptParamInHeader, - String optionsParamInQuery, - Map cmHandlePropertyMap); - - /** - * This method use to fetch the resource data from cm handle for datastore pass-through running and resource + * This method use to fetch the resource data from cm handle for the given datastore and resource * Identifier. Options query parameter are used to filter the response from network resource. * - * @param cmHandle cm handle identifier - * @param resourceIdentifier resource identifier - * @param acceptParamInHeader accept header parameter - * @param optionsParamInQuery options query parameter - * @param cmHandlePropertyMap cm handle properties + * @param cmHandle cm handle identifier + * @param resourceIdentifier resource identifier + * @param acceptParamInHeader accept header parameter + * @param optionsParamInQuery options query parameter + * @param restconfContentQueryParam restconf content i.e. datastore to use * @return {@code Object} response from network function */ - Object getResourceDataPassThroughRunningForCmHandle(@NotNull String cmHandle, + String getResourceData(@NotNull String cmHandle, @NotNull String resourceIdentifier, String acceptParamInHeader, String optionsParamInQuery, - Map cmHandlePropertyMap); + String restconfContentQueryParam); /** - * Write resource data to sdnc using passthrough running. + * Write resource data to sdnc (will default to 'content=config', does not need to be specified). * * @param cmHandle cmHandle * @param resourceIdentifier resource identifier @@ -102,6 +90,7 @@ public interface DmiService { * @param data request data * @return response from sdnc */ - String writeResourceDataPassthroughForCmHandle(String cmHandle, String resourceIdentifier, String dataType, - String data); + String writeData(DataAccessRequest.OperationEnum operation, String cmHandle, + String resourceIdentifier, String dataType, + String data); } diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java b/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java index 10ae1cf8..99127e66 100644 --- a/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java +++ b/src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java @@ -29,8 +29,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; -import javax.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; import org.onap.cps.ncmp.dmi.config.DmiPluginConfig.DmiPluginProperties; import org.onap.cps.ncmp.dmi.exception.CmHandleRegistrationException; @@ -38,6 +36,7 @@ import org.onap.cps.ncmp.dmi.exception.DmiException; import org.onap.cps.ncmp.dmi.exception.ModuleResourceNotFoundException; import org.onap.cps.ncmp.dmi.exception.ModulesNotFoundException; import org.onap.cps.ncmp.dmi.exception.ResourceDataNotFound; +import org.onap.cps.ncmp.dmi.model.DataAccessRequest; import org.onap.cps.ncmp.dmi.model.ModuleSet; import org.onap.cps.ncmp.dmi.model.ModuleSetSchemas; import org.onap.cps.ncmp.dmi.model.YangResource; @@ -60,8 +59,6 @@ public class DmiServiceImpl implements DmiService { private NcmpRestClient ncmpRestClient; private ObjectMapper objectMapper; private DmiPluginProperties dmiPluginProperties; - private static final String RESTCONF_CONTENT_PASSTHROUGH_OPERATIONAL_QUERY_PARAM = "content=all"; - private static final String REST_CONF_CONTENT_PASSTHROUGH_RUNNING_QUERY_PARAM = "content=config"; private static final String RESPONSE_CODE = "response code : "; private static final String MESSAGE = " message : "; private static final String IETF_NETCONF_MONITORING_OUTPUT = "ietf-netconf-monitoring:output"; @@ -151,40 +148,26 @@ public class DmiServiceImpl implements DmiService { } @Override - public Object getResourceDataOperationalForCmHandle(final @NotNull String cmHandle, - final @NotNull String resourceIdentifier, + public String getResourceData(final String cmHandle, + final String resourceIdentifier, final String acceptParamInHeader, final String optionsParamInQuery, - final Map cmHandlePropertyMap) { - // not using cmHandlePropertyMap of onap dmi impl , other dmi impl might use this. + final String restconfContentQueryParam) { final ResponseEntity responseEntity = sdncOperations.getResouceDataForOperationalAndRunning(cmHandle, resourceIdentifier, optionsParamInQuery, acceptParamInHeader, - RESTCONF_CONTENT_PASSTHROUGH_OPERATIONAL_QUERY_PARAM); + restconfContentQueryParam); return prepareAndSendResponse(responseEntity, cmHandle); } @Override - public Object getResourceDataPassThroughRunningForCmHandle(final @NotNull String cmHandle, - final @NotNull String resourceIdentifier, - final String acceptParamInHeader, - final String optionsParamInQuery, - final Map cmHandlePropertyMap) { - // not using cmHandlePropertyMap of onap dmi impl , other dmi impl might use this. - final ResponseEntity responseEntity = sdncOperations.getResouceDataForOperationalAndRunning(cmHandle, - resourceIdentifier, - optionsParamInQuery, - acceptParamInHeader, - REST_CONF_CONTENT_PASSTHROUGH_RUNNING_QUERY_PARAM); - return prepareAndSendResponse(responseEntity, cmHandle); - } - - @Override - public String writeResourceDataPassthroughForCmHandle(final String cmHandle, final String resourceIdentifier, - final String dataType, final String data) { + public String writeData(final DataAccessRequest.OperationEnum operation, + final String cmHandle, + final String resourceIdentifier, + final String dataType, final String data) { final ResponseEntity responseEntity = - sdncOperations.writeResourceDataPassthroughRunning(cmHandle, resourceIdentifier, dataType, data); + sdncOperations.writeData(operation, cmHandle, resourceIdentifier, dataType, data); if (responseEntity.getStatusCode().is2xxSuccessful()) { return responseEntity.getBody(); } else { diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/client/SdncRestconfClient.java b/src/main/java/org/onap/cps/ncmp/dmi/service/client/SdncRestconfClient.java index b8e33dfc..cf7b4599 100644 --- a/src/main/java/org/onap/cps/ncmp/dmi/service/client/SdncRestconfClient.java +++ b/src/main/java/org/onap/cps/ncmp/dmi/service/client/SdncRestconfClient.java @@ -57,28 +57,30 @@ public class SdncRestconfClient { * @return the response entity */ public ResponseEntity getOperation(final String getResourceUrl, final HttpHeaders httpHeaders) { - final String sdncBaseUrl = sdncProperties.getBaseUrl(); - final String sdncRestconfUrl = sdncBaseUrl.concat(getResourceUrl); - httpHeaders.setBasicAuth(sdncProperties.getAuthUsername(), sdncProperties.getAuthPassword()); - final var httpEntity = new HttpEntity<>(httpHeaders); - return restTemplate.exchange(sdncRestconfUrl, - HttpMethod.GET, httpEntity, String.class); + return httpOperationWithJsonData(HttpMethod.GET, getResourceUrl, null, httpHeaders); } /** - * restconf post operation on sdnc. + * restconf http operations on sdnc. * - * @param postResourceUrl sdnc post resource url - * @param jsonData json data - * @param httpHeaders HTTP headers - * @return the response entity + * @param httpMethod HTTP Method + * @param resourceUrl sdnc resource url + * @param jsonData json data + * @param httpHeaders HTTP Headers + * @return response entity */ - public ResponseEntity postOperationWithJsonData(final String postResourceUrl, - final String jsonData, final HttpHeaders httpHeaders) { - final var sdncBaseUrl = sdncProperties.getBaseUrl(); - final var sdncRestconfUrl = sdncBaseUrl.concat(postResourceUrl); + public ResponseEntity httpOperationWithJsonData(final HttpMethod httpMethod, final String resourceUrl, + final String jsonData, + final HttpHeaders httpHeaders) { + final String sdncBaseUrl = sdncProperties.getBaseUrl(); + final String sdncRestconfUrl = sdncBaseUrl.concat(resourceUrl); httpHeaders.setBasicAuth(sdncProperties.getAuthUsername(), sdncProperties.getAuthPassword()); - final var httpEntity = new HttpEntity<>(jsonData, httpHeaders); - return restTemplate.exchange(sdncRestconfUrl, HttpMethod.POST, httpEntity, String.class); + final HttpEntity httpEntity; + if (jsonData == null) { + httpEntity = new HttpEntity<>(httpHeaders); + } else { + httpEntity = new HttpEntity<>(jsonData, httpHeaders); + } + return restTemplate.exchange(sdncRestconfUrl, httpMethod, httpEntity, String.class); } -} \ No newline at end of file +} diff --git a/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java b/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java index 43e2a5e6..ced9b061 100644 --- a/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java +++ b/src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java @@ -35,9 +35,11 @@ import java.util.List; import org.apache.groovy.parser.antlr4.util.StringUtils; import org.onap.cps.ncmp.dmi.config.DmiConfiguration.SdncProperties; import org.onap.cps.ncmp.dmi.exception.SdncException; +import org.onap.cps.ncmp.dmi.model.DataAccessRequest; import org.onap.cps.ncmp.dmi.service.client.SdncRestconfClient; import org.onap.cps.ncmp.dmi.service.model.ModuleSchema; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -110,8 +112,8 @@ public class SdncOperations { final var getYangResourceUrl = prepareGetOperationSchemaUrl(nodeId); final var httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); - return sdncRestconfClient - .postOperationWithJsonData(getYangResourceUrl, moduleProperties, httpHeaders); + return sdncRestconfClient.httpOperationWithJsonData( + HttpMethod.POST, getYangResourceUrl, moduleProperties, httpHeaders); } /** @@ -140,7 +142,7 @@ public class SdncOperations { } /** - * Write resource data using passthrough running. + * Write resource data. * * @param nodeId network resource identifier * @param resourceId resource identifier @@ -148,12 +150,16 @@ public class SdncOperations { * @param requestData request data * @return {@code ResponseEntity} response entity */ - public ResponseEntity writeResourceDataPassthroughRunning(final String nodeId, - final String resourceId, final String contentType, final String requestData) { - final var getResourceDataUrl = preparePassthroughRunningUrl(nodeId, resourceId); + public ResponseEntity writeData(final DataAccessRequest.OperationEnum operation, + final String nodeId, + final String resourceId, + final String contentType, + final String requestData) { + final var getResourceDataUrl = prepareWriteUrl(nodeId, resourceId); final var httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.parseMediaType(contentType)); - return sdncRestconfClient.postOperationWithJsonData(getResourceDataUrl, requestData, httpHeaders); + final HttpMethod httpMethod = getHttpMethod(operation); + return sdncRestconfClient.httpOperationWithJsonData(httpMethod, getResourceDataUrl, requestData, httpHeaders); } private List buildQueryParamList(final String optionsParamInQuery, final String restconfContentQueryParam) { @@ -179,7 +185,7 @@ public class SdncOperations { return addResource(addTopologyDataUrlwithNode(nodeId), GET_SCHEMA_URL); } - private String preparePassthroughRunningUrl(final String nodeId, final String resourceId) { + private String prepareWriteUrl(final String nodeId, final String resourceId) { return addResource(addTopologyDataUrlwithNode(nodeId), "/" + resourceId); } @@ -233,4 +239,25 @@ public class SdncOperations { } } -} \ No newline at end of file + private HttpMethod getHttpMethod(final DataAccessRequest.OperationEnum operation) { + HttpMethod httpMethod = null; + switch (operation) { + case READ: + httpMethod = HttpMethod.GET; + break; + case CREATE: + httpMethod = HttpMethod.POST; + break; + case UPDATE: + httpMethod = HttpMethod.PUT; + break; + case DELETE: + httpMethod = HttpMethod.DELETE; + break; + default: + //unreachable code but checkstyle made me do this! + } + return httpMethod; + } + +} -- cgit 1.2.3-korg