summaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
authorDylanB95EST <dylan.byrne@est.tech>2021-11-09 13:54:35 +0000
committerDylanB95EST <dylan.byrne@est.tech>2021-11-12 15:24:27 +0000
commit5fe0daebb1360bd5d4c525125cdb0d6250583ff4 (patch)
tree3c0e08b48627b9c7c4c20c0291c6290673f061fb /src/main
parent306cadd63b69274afbb3073d35a15381a12d6389 (diff)
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 <dylan.byrne@est.tech>
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/rest/controller/DmiRestController.java124
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/DmiService.java47
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/DmiServiceImpl.java37
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/client/SdncRestconfClient.java38
-rw-r--r--src/main/java/org/onap/cps/ncmp/dmi/service/operation/SdncOperations.java45
5 files changed, 152 insertions, 139 deletions
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;
@@ -74,25 +73,6 @@ public class DmiRestController implements DmiPluginApi, DmiPluginInternalApi {
}
/**
- * 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<String> 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.
*
* @param cmHandles list of cm-handles
@@ -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<Object> 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<Object> 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<Object> 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<String> 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<ModuleReference> 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<ModuleReference> 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<String, String> 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<String, String> 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<String, String> cmHandlePropertyMap) {
- // not using cmHandlePropertyMap of onap dmi impl , other dmi impl might use this.
+ final String restconfContentQueryParam) {
final ResponseEntity<String> 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<String, String> cmHandlePropertyMap) {
- // not using cmHandlePropertyMap of onap dmi impl , other dmi impl might use this.
- final ResponseEntity<String> 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<String> 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<String> 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<String> postOperationWithJsonData(final String postResourceUrl,
- final String jsonData, final HttpHeaders httpHeaders) {
- final var sdncBaseUrl = sdncProperties.getBaseUrl();
- final var sdncRestconfUrl = sdncBaseUrl.concat(postResourceUrl);
+ public ResponseEntity<String> 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<String> 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<String> writeResourceDataPassthroughRunning(final String nodeId,
- final String resourceId, final String contentType, final String requestData) {
- final var getResourceDataUrl = preparePassthroughRunningUrl(nodeId, resourceId);
+ public ResponseEntity<String> 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<String> 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;
+ }
+
+}