From dc8d648fa7b642ca88c7b101ceb8188b5c5ed3e3 Mon Sep 17 00:00:00 2001 From: Julien Fontaine Date: Tue, 2 Mar 2021 18:18:30 -0500 Subject: Add delete endpoint for config snapshot API Add delete endpoint to delete config-snapshots based on resource-type, resource-id and resources-status. Issue-ID: CCSDK-3205 Signed-off-by: Julien Fontaine Change-Id: Id7954694bc93beba08a79139834cb6477cb8e44b --- .../api/ResourceConfigSnapshotController.kt | 56 +++++++++++++++++++++- .../api/ResourceConfigSnapshotControllerTest.kt | 44 +++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) (limited to 'ms/blueprintsprocessor/modules/inbounds') diff --git a/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt b/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt index 9dadd398e..8b976e1c9 100644 --- a/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/configs-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotController.kt @@ -1,5 +1,5 @@ /* - * Copyright © 2019 Bell Canada + * Copyright © 2021 Bell Canada * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import io.swagger.annotations.ApiParam import kotlinx.coroutines.runBlocking import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.db.ResourceConfigSnapshot import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.db.ResourceConfigSnapshotService +import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.mdcWebCoroutineScope import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive import org.onap.ccsdk.cds.controllerblueprints.core.httpProcessorException import org.onap.ccsdk.cds.error.catalog.core.ErrorCatalogCodes @@ -30,6 +31,7 @@ import org.onap.ccsdk.cds.error.catalog.core.utils.errorCauseOrDefault import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody @@ -38,6 +40,7 @@ import org.springframework.web.bind.annotation.RequestMethod import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.ResponseBody import org.springframework.web.bind.annotation.RestController +import java.util.Optional /** * Exposes Resource Configuration Snapshot API to store and retrieve stored resource configurations. @@ -165,6 +168,57 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe ResponseEntity.ok().body(resultStored) } + @DeleteMapping( + "/{resourceType}/{resourceId}/{status}", + "/{resourceType}/{resourceId}" + ) + @ApiOperation( + value = "Delete a resource configuration snapshot identified by resourceId, resourceType, status.", + notes = "Delete a resource configuration snapshot, identified by its resourceId and resourceType, " + + "and optionally its status, either RUNNING or CANDIDATE." + ) + @ResponseBody + @PreAuthorize("hasRole('USER')") + suspend fun deleteWithResourceIdAndResourceType( + @ApiParam(value = "Resource Type associated with the resolution.", required = true) + @PathVariable(value = "resourceType", required = true) resourceType: String, + @ApiParam(value = "Resource Id associated with the resolution.", required = true) + @PathVariable(value = "resourceId", required = true) resourceId: String, + @ApiParam(value = "Status of the snapshot being deleted.", required = false) + @PathVariable(value = "status", required = false) status: Optional + ) = mdcWebCoroutineScope { + + if (resourceId.isBlank() || resourceType.isBlank()) + throw httpProcessorException( + ErrorCatalogCodes.INVALID_REQUEST_FORMAT, ConfigsApiDomains.CONFIGS_API, + "You must specify path variables resource-id and resource-type." + ) + + try { + if (status.isPresent) + resourceConfigSnapshotService.deleteByResourceIdAndResourceTypeAndStatus( + resourceId, resourceType, + ResourceConfigSnapshot.Status.valueOf(status.get().toUpperCase()) + ) + else { + resourceConfigSnapshotService.deleteByResourceIdAndResourceTypeAndStatus( + resourceId, resourceType, + ResourceConfigSnapshot.Status.RUNNING + ) + resourceConfigSnapshotService.deleteByResourceIdAndResourceTypeAndStatus( + resourceId, resourceType, + ResourceConfigSnapshot.Status.CANDIDATE + ) + } + } catch (ex: Exception) { + throw httpProcessorException( + ErrorCatalogCodes.INVALID_REQUEST_FORMAT, ConfigsApiDomains.CONFIGS_API, + "Could not delete configuration snapshot entry for type $resourceType and Id $resourceId", + ex.errorCauseOrDefault() + ) + } + } + @RequestMapping( path = ["/allByID"], method = [RequestMethod.GET], diff --git a/ms/blueprintsprocessor/modules/inbounds/configs-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotControllerTest.kt b/ms/blueprintsprocessor/modules/inbounds/configs-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotControllerTest.kt index 58d5726bb..1a2fb6187 100644 --- a/ms/blueprintsprocessor/modules/inbounds/configs-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotControllerTest.kt +++ b/ms/blueprintsprocessor/modules/inbounds/configs-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotControllerTest.kt @@ -246,6 +246,50 @@ class ResourceConfigSnapshotControllerTest { } } + @Test + fun `deleteWithResourceIdAndResourceType returns 200 if valid path`() { + webTestClient + .delete() + .uri("/api/v1/configs/$resourceType/$resourceId/running") + .exchange() + .expectStatus().is2xxSuccessful + .expectBody() + webTestClient + .delete() + .uri("/api/v1/configs/$resourceType/$resourceId/candidate") + .exchange() + .expectStatus().is2xxSuccessful + .expectBody() + webTestClient + .delete() + .uri("/api/v1/configs/$resourceType/$resourceId") + .exchange() + .expectStatus().is2xxSuccessful + .expectBody() + } + + @Test + fun `deleteWithResourceIdAndResourceType returns 400 if invalid path`() { + webTestClient + .delete() + .uri("/api/v1/configs/ /$resourceId/running") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + webTestClient + .delete() + .uri("/api/v1/configs/$resourceType/ /running") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + webTestClient + .delete() + .uri("/api/v1/configs/$resourceType/$resourceId/qwerty") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + } + private fun post(resourceType: String, resourceId: String, status: String) { webTestClient .post() -- cgit 1.2.3-korg