From 6d7efebd9cd77169b1c99adea56a557a12162a4e Mon Sep 17 00:00:00 2001 From: Serge Simard Date: Tue, 11 Aug 2020 09:47:23 -0400 Subject: Add functions/endpoints to fetch all config snapshots for a given resource type or Id - configs-snapshot rest API Issue-ID: CCSDK-2641 Signed-off-by: Serge Simard Change-Id: I392fa72bcbe39fd5306d4d2fdf7f49d62ec441b5 --- .../api/ResourceConfigSnapshotController.kt | 82 ++++++++++++++++ .../api/ResourceConfigSnapshotControllerTest.kt | 106 +++++++++++++++++++++ 2 files changed, 188 insertions(+) (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 2a5f4c3ea..05f43c151 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 @@ -53,6 +53,8 @@ import org.springframework.web.bind.annotation.RestController ) open class ResourceConfigSnapshotController(private val resourceConfigSnapshotService: ResourceConfigSnapshotService) { + private val JSON_MIME_TYPE = "application/json" + @RequestMapping( path = ["/health-check"], method = [RequestMethod.GET], @@ -157,4 +159,84 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe ResponseEntity.ok().body(resultStored) } + + @RequestMapping( + path = ["/allByID"], + method = [RequestMethod.GET], + produces = [MediaType.APPLICATION_JSON_VALUE] + ) + @ApiOperation( + value = "Retrieve all resource configuration snapshots identified by a given resource_id", + notes = "Retrieve all config snapshots, identified by its Resource Id, ordered by most recently created/modified date. " + ) + @ResponseBody + @PreAuthorize("hasRole('USER')") + fun getAllByID( + @ApiParam(value = "Resource Id associated of the resource configuration snapshots.", required = false) + @RequestParam(value = "resourceId", required = true) resourceId: String, + @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "ANY", required = false) + @RequestParam(value = "status", required = false, defaultValue = "ANY") status: String + ): ResponseEntity?> = runBlocking { + var configSnapshots: List? + + try { + if (status == "ANY") { + configSnapshots = resourceConfigSnapshotService.findAllByResourceId(resourceId) + } else { + configSnapshots = resourceConfigSnapshotService.findAllByResourceIdForStatus( + resourceId, ResourceConfigSnapshot.Status.valueOf(status.toUpperCase())) + } + } catch (ex: NoSuchElementException) { + throw httpProcessorException(ErrorCatalogCodes.RESOURCE_NOT_FOUND, ConfigsApiDomains.CONFIGS_API, + "Could not find configuration snapshot entry for ID $resourceId", + ex.errorCauseOrDefault()) + } catch (ex: Exception) { + throw httpProcessorException(ErrorCatalogCodes.INVALID_REQUEST_FORMAT, ConfigsApiDomains.CONFIGS_API, + "Unexpected error while finding configuration snapshot entries for ID $resourceId", + ex.errorCauseOrDefault()) + } + + val expectedMediaType: MediaType = MediaType.valueOf(JSON_MIME_TYPE) + ResponseEntity.ok().contentType(expectedMediaType).body(configSnapshots) + } + + @RequestMapping( + path = ["allByType"], + method = [RequestMethod.GET], + produces = [MediaType.APPLICATION_JSON_VALUE] + ) + @ApiOperation( + value = "Retrieve all resource configuration snapshots for a given resource type.", + notes = "Retrieve all config snapshots matching a specified Resource Type, ordered by most recently created/modified date. " + ) + @ResponseBody + @PreAuthorize("hasRole('USER')") + fun getAllByType( + @ApiParam(value = "Resource Type associated of the resource configuration snapshot.", required = false) + @RequestParam(value = "resourceType", required = true) resourceType: String, + @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "ANY", required = false) + @RequestParam(value = "status", required = false, defaultValue = "ANY") status: String + ): ResponseEntity?> = runBlocking { + var configSnapshots: List? + + try { + if (status == "ANY") { + configSnapshots = resourceConfigSnapshotService.findAllByResourceType(resourceType) + } else { + configSnapshots = resourceConfigSnapshotService.findAllByResourceTypeForStatus( + resourceType, ResourceConfigSnapshot.Status.valueOf(status.toUpperCase())) + } + } catch (ex: NoSuchElementException) { + throw httpProcessorException(ErrorCatalogCodes.RESOURCE_NOT_FOUND, ConfigsApiDomains.CONFIGS_API, + "Could not find configuration snapshot entry for ID $resourceType", + ex.errorCauseOrDefault()) + } catch (ex: Exception) { + throw httpProcessorException(ErrorCatalogCodes.INVALID_REQUEST_FORMAT, ConfigsApiDomains.CONFIGS_API, + "Unexpected error while finding configuration snapshot entries for type $resourceType", + ex.errorCauseOrDefault()) + } + + val expectedMediaType: MediaType = MediaType.valueOf(JSON_MIME_TYPE) + ResponseEntity.ok().contentType(expectedMediaType).body(configSnapshots) + } } 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 b54d92bb0..e2fa5ca44 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 @@ -140,6 +140,112 @@ class ResourceConfigSnapshotControllerTest { } } + @Test + fun `getAllByID returns 200 if entries found`() { + runBlocking { + post(resourceType, "3", "RUNNING") + post(resourceType, "2", "RUNNING") + post(resourceType, resourceId, "RUNNING") + + webTestClient + .get() + .uri("/api/v1/configs/allByID?resourceId=$resourceId") + .exchange() + .expectStatus().is2xxSuccessful + .expectBody() + .jsonPath("$.length()") + .isEqualTo(1) + } + } + + @Test + fun `getAllByID with CANDIDATE status returns 200 if entries found`() { + runBlocking { + post(resourceType, "3", "RUNNING") + post(resourceType, "2", "RUNNING") + post(resourceType, resourceId, "CANDIDATE") + + webTestClient + .get() + .uri("/api/v1/configs/allByID?resourceId=$resourceId&status=CANDIDATE") + .exchange() + .expectStatus().is2xxSuccessful + .expectBody() + .jsonPath("$.length()") + .isEqualTo(1) + } + } + + @Test + fun `getAllByID returns 400 error if missing parameter`() { + runBlocking { + + webTestClient + .get() + .uri("/api/v1/configs/allByID") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + } + } + + @Test + fun `getAllByID returns 400 error if wrong status parameter`() { + runBlocking { + + webTestClient + .get() + .uri("/api/v1/configs/allByID?resourceId=$resourceId&status=NOTGOOD") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + } + } + + @Test + fun `getAllByType returns 200 if entries found`() { + runBlocking { + post(resourceType, "3", "RUNNING") + post(resourceType + "DIFF", "2", "RUNNING") + post(resourceType, "1", "RUNNING") + + webTestClient + .get() + .uri("/api/v1/configs/allByType?resourceType=$resourceType") + .exchange() + .expectStatus().is2xxSuccessful + .expectBody() + .jsonPath("$.length()") + .isEqualTo(3) + } + } + + @Test + fun `getAllByType returns 400 error if missing parameter`() { + runBlocking { + + webTestClient + .get() + .uri("/api/v1/configs/allByType") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + } + } + + @Test + fun `getAllByType returns 400 error if wrong status parameter`() { + runBlocking { + + webTestClient + .get() + .uri("/api/v1/configs/allByType?resourceType=$resourceType&status=NOTGOOD") + .exchange() + .expectStatus().is4xxClientError + .expectBody() + } + } + private fun post(resourceType: String, resourceId: String, status: String) { webTestClient .post() -- cgit 1.2.3-korg