X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=dmi-plugin-demo-and-csit-stub%2Fdmi-plugin-demo-and-csit-stub-service%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fcps%2Fncmp%2Fdmi%2Frest%2Fstub%2Fcontroller%2FDmiRestStubController.java;h=f154be6dae7a84c769b476ef37a33b9da65dbde2;hb=fec1f3b27888101381199718bbdb0848d96b9978;hp=a4f71113241ebdaf44e043a810f1aa8dfd04a70b;hpb=970e54081e98a6da555d87f21eced6b14d075013;p=cps.git diff --git a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java index a4f711132..f154be6da 100644 --- a/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java +++ b/dmi-plugin-demo-and-csit-stub/dmi-plugin-demo-and-csit-stub-service/src/main/java/org/onap/cps/ncmp/dmi/rest/stub/controller/DmiRestStubController.java @@ -28,7 +28,9 @@ import io.cloudevents.CloudEvent; import io.cloudevents.core.builder.CloudEventBuilder; import java.net.URI; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -49,9 +51,13 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -62,14 +68,81 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j public class DmiRestStubController { + private static final String DEFAULT_TAG = "tagD"; + private static final String dataOperationEventType = "org.onap.cps.ncmp.events.async1_0_0.DataOperationEvent"; + private static final Map moduleSetTagPerCmHandleId = new HashMap<>(); private final KafkaTemplate cloudEventKafkaTemplate; private final ObjectMapper objectMapper; private final ApplicationContext applicationContext; - @Value("${app.ncmp.async-m2m.topic}") private String ncmpAsyncM2mTopic; + @Value("${delay.module-references-delay-ms}") + private long moduleReferencesDelayMs; + @Value("${delay.module-resources-delay-ms}") + private long moduleResourcesDelayMs; + @Value("${delay.data-for-cm-handle-delay-ms}") + private long dataForCmHandleDelayMs; + + /** + * This code defines a REST API endpoint for adding new the module set tag mapping. The endpoint receives the + * cmHandleId and moduleSetTag as request body and add into moduleSetTagPerCmHandleId map with the provided + * values. + * + * @param requestBody map of cmHandleId and moduleSetTag + * @return a ResponseEntity object containing the updated moduleSetTagPerCmHandleId map as the response body + */ + @PostMapping("/v1/tagMapping") + public ResponseEntity> addTagForMapping(@RequestBody final Map requestBody) { + moduleSetTagPerCmHandleId.putAll(requestBody); + return new ResponseEntity<>(requestBody, HttpStatus.CREATED); + } + + /** + * This code defines a GET endpoint of module set tag mapping. + * + * @return The map represents the module set tag mapping. + */ + @GetMapping("/v1/tagMapping") + public ResponseEntity> getTagMapping() { + return ResponseEntity.ok(moduleSetTagPerCmHandleId); + } + + /** + * This code defines a GET endpoint of module set tag by cm handle ID. + * + * @return The map represents the module set tag mapping filtered by cm handle ID. + */ + @GetMapping("/v1/tagMapping/ch/{cmHandleId}") + public ResponseEntity getTagMappingByCmHandleId(@PathVariable final String cmHandleId) { + return ResponseEntity.ok(moduleSetTagPerCmHandleId.get(cmHandleId)); + } + + /** + * This code defines a REST API endpoint for updating the module set tag mapping. The endpoint receives the + * cmHandleId and moduleSetTag as request body and updates the moduleSetTagPerCmHandleId map with the provided + * values. + * + * @param requestBody map of cmHandleId and moduleSetTag + * @return a ResponseEntity object containing the updated moduleSetTagPerCmHandleId map as the response body + */ + + @PutMapping("/v1/tagMapping") + public ResponseEntity> updateTagMapping(@RequestBody final Map requestBody) { + moduleSetTagPerCmHandleId.putAll(requestBody); + return ResponseEntity.noContent().build(); + } - private String dataOperationEventType = "org.onap.cps.ncmp.events.async1_0_0.DataOperationEvent"; + /** + * It contains a method to delete an entry from the moduleSetTagPerCmHandleId map. + * The method takes a cmHandleId as a parameter and removes the corresponding entry from the map. + * + * @return a ResponseEntity containing the updated map. + */ + @DeleteMapping("/v1/tagMapping/ch/{cmHandleId}") + public ResponseEntity deleteTagMappingByCmHandleId(@PathVariable final String cmHandleId) { + moduleSetTagPerCmHandleId.remove(cmHandleId); + return ResponseEntity.ok(String.format("Mapping of %s is deleted successfully", cmHandleId)); + } /** * Get all modules for given cm handle. @@ -80,8 +153,15 @@ public class DmiRestStubController { * @return ResponseEntity response entity having module response as json string. */ @PostMapping("/v1/ch/{cmHandleId}/modules") - public ResponseEntity getModuleReferences(@PathVariable final String cmHandleId, + public ResponseEntity getModuleReferences(@PathVariable("cmHandleId") final String cmHandleId, @RequestBody final Object moduleReferencesRequest) { + delay(moduleReferencesDelayMs); + try { + log.info("Incoming DMI request body: {}", + objectMapper.writeValueAsString(moduleReferencesRequest)); + } catch (final JsonProcessingException jsonProcessingException) { + log.info("Unable to parse dmi data operation request to json string"); + } final String moduleResponseContent = getModuleResourceResponse(cmHandleId, "ModuleResponse.json"); log.info("cm handle: {} requested for modules", cmHandleId); @@ -98,14 +178,41 @@ public class DmiRestStubController { */ @PostMapping("/v1/ch/{cmHandleId}/moduleResources") public ResponseEntity retrieveModuleResources( - @PathVariable final String cmHandleId, + @PathVariable("cmHandleId") final String cmHandleId, @RequestBody final Object moduleResourcesReadRequest) { + delay(moduleResourcesDelayMs); final String moduleResourcesResponseContent = getModuleResourceResponse(cmHandleId, "ModuleResourcesResponse.json"); log.info("cm handle: {} requested for modules resources", cmHandleId); return ResponseEntity.ok(moduleResourcesResponseContent); } + /** + * Create resource data from passthrough operational or running for a cm handle. + * + * @param cmHandleId The identifier for a network function, network element, subnetwork, + * or any other cm object by managed Network CM Proxy + * @param datastoreName datastore name + * @param resourceIdentifier resource identifier + * @param options options + * @param topic client given topic name + * @return (@ code ResponseEntity) response entity + */ + @PostMapping("/v1/ch/{cmHandleId}/data/ds/{datastoreName}") + public ResponseEntity getResourceDataForCmHandle( + @PathVariable("cmHandleId") final String cmHandleId, + @PathVariable("datastoreName") final String datastoreName, + @RequestParam(value = "resourceIdentifier") final String resourceIdentifier, + @RequestParam(value = "options", required = false) final String options, + @RequestParam(value = "topic", required = false) final String topic, + @RequestHeader(value = "Authorization", required = false) final String authorization) { + log.info("DMI AUTH HEADER: {}", authorization); + delay(dataForCmHandleDelayMs); + final String sampleJson = ResourceFileReaderUtil.getResourceFileContent(applicationContext.getResource( + ResourceLoader.CLASSPATH_URL_PREFIX + "data/operational/ietf-network-topology-sample-rfc8345.json")); + return ResponseEntity.ok(sampleJson); + } + /** * This method is not implemented for ONAP DMI plugin. * @@ -115,12 +222,11 @@ public class DmiRestStubController { * @return (@ code ResponseEntity) response entity */ @PostMapping("/v1/data") - public ResponseEntity getResourceDataForCmHandleDataOperation(@RequestParam(value = "topic") - final String topic, - @RequestParam(value = "requestId") - final String requestId, - @RequestBody final DmiDataOperationRequest - dmiDataOperationRequest) { + public ResponseEntity getResourceDataForCmHandleDataOperation( + @RequestParam(value = "topic") final String topic, + @RequestParam(value = "requestId") final String requestId, + @RequestBody final DmiDataOperationRequest dmiDataOperationRequest) { + delay(dataForCmHandleDelayMs); try { log.info("Request received from the NCMP to DMI Plugin: {}", objectMapper.writeValueAsString(dmiDataOperationRequest)); @@ -187,16 +293,26 @@ public class DmiRestStubController { } private String getModuleResourceResponse(final String cmHandleId, final String moduleResponseType) { - final String nodeType = cmHandleId.split("-")[0]; - final String moduleResponseFilePath = String.format("module/%s%s", nodeType, moduleResponseType); + if (moduleSetTagPerCmHandleId.isEmpty()) { + log.info("Using default module responses of type ietfYang"); + return ResourceFileReaderUtil.getResourceFileContent(applicationContext.getResource( + ResourceLoader.CLASSPATH_URL_PREFIX + + String.format("module/ietfYang-%s", moduleResponseType))); + } + final String moduleSetTag = moduleSetTagPerCmHandleId.getOrDefault(cmHandleId, DEFAULT_TAG); + final String moduleResponseFilePath = String.format("module/%s-%s", moduleSetTag, moduleResponseType); final Resource moduleResponseResource = applicationContext.getResource( ResourceLoader.CLASSPATH_URL_PREFIX + moduleResponseFilePath); - if (moduleResponseResource.exists()) { - log.info("Using requested node type: {}", nodeType); - return ResourceFileReaderUtil.getResourceFileContent(moduleResponseResource); + log.info("Using module responses from : {}", moduleResponseFilePath); + return ResourceFileReaderUtil.getResourceFileContent(moduleResponseResource); + } + + private void delay(final long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (final InterruptedException e) { + log.error("Thread sleep interrupted: {}", e.getMessage()); + Thread.currentThread().interrupt(); } - log.info("Using default node type: ietfYang"); - return ResourceFileReaderUtil.getResourceFileContent(applicationContext.getResource( - ResourceLoader.CLASSPATH_URL_PREFIX + "module/ietfYang" + moduleResponseType)); } }