Fix: Run both sonar and clm scans in parallel
[ccsdk/cds.git] / ms / blueprintsprocessor / modules / inbounds / configs-api / src / main / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / configs / api / ResourceConfigSnapshotController.kt
index 584df27..8b976e1 100644 (file)
@@ -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.
@@ -49,7 +52,7 @@ import org.springframework.web.bind.annotation.RestController
 @RequestMapping("/api/v1/configs")
 @Api(
     value = "Resource configuration",
-    description = "Interaction with stored configurations."
+    description = "Interaction with stored configurations"
 )
 open class ResourceConfigSnapshotController(private val resourceConfigSnapshotService: ResourceConfigSnapshotService) {
 
@@ -71,24 +74,24 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe
         produces = [MediaType.TEXT_PLAIN_VALUE, MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE]
     )
     @ApiOperation(
-        value = "Retrieve a resource configuration snapshot.",
+        value = "Retrieve a resource configuration snapshot",
         notes = "Retrieve a config snapshot, identified by its Resource Id and Type. " +
             "An extra 'format' parameter can be passed to tell what content-type is expected."
     )
     @ResponseBody
     @PreAuthorize("hasRole('USER')")
     fun get(
-        @ApiParam(value = "Resource Type associated of the resource configuration snapshot.", required = false, example = "\"PNF\"")
+        @ApiParam(value = "Resource Type associated of the resource configuration snapshot", required = false, example = "\"PNF\"")
         @RequestParam(value = "resourceType", required = true) resourceType: String,
 
-        @ApiParam(value = "Resource Id associated of the resource configuration snapshot.", required = false, example = "\"1\"")
+        @ApiParam(value = "Resource Id associated of the resource configuration snapshot", required = false, example = "\"1\"")
         @RequestParam(value = "resourceId", required = true) resourceId: String,
 
-        @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "RUNNING", required = false)
+        @ApiParam(value = "Status of the snapshot being retrieved", defaultValue = "RUNNING", required = false)
         @RequestParam(value = "status", required = false, defaultValue = "RUNNING") status: String,
 
         @ApiParam(
-            value = "Expected format of the snapshot being retrieved.", defaultValue = MediaType.TEXT_PLAIN_VALUE,
+            value = "Expected format of the snapshot being retrieved", defaultValue = MediaType.TEXT_PLAIN_VALUE,
             required = false
         )
         @RequestParam(value = "format", required = false, defaultValue = MediaType.TEXT_PLAIN_VALUE) format: String
@@ -138,7 +141,7 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe
         produces = [MediaType.APPLICATION_JSON_VALUE]
     )
     @ApiOperation(
-        value = "Store a resource configuration snapshot identified by resourceId, resourceType, status.",
+        value = "Store a resource configuration snapshot identified by resourceId, resourceType, status",
         notes = "Store a resource configuration snapshot, identified by its resourceId and resourceType, " +
             "and optionally its status, either RUNNING or CANDIDATE.",
         response = ResourceConfigSnapshot::class
@@ -146,13 +149,13 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe
     @ResponseBody
     @PreAuthorize("hasRole('USER')")
     fun postWithResourceIdAndResourceType(
-        @ApiParam(value = "Resource Type associated with the resolution.", required = false, example = "\"PNF\"")
+        @ApiParam(value = "Resource Type associated with the resolution", required = false, example = "\"PNF\"")
         @PathVariable(value = "resourceType", required = true) resourceType: String,
-        @ApiParam(value = "Resource Id associated with the resolution.", required = false, example = "\"1\"")
+        @ApiParam(value = "Resource Id associated with the resolution", required = false, example = "\"1\"")
         @PathVariable(value = "resourceId", required = true) resourceId: String,
-        @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "RUNNING", required = true)
+        @ApiParam(value = "Status of the snapshot being retrieved", defaultValue = "RUNNING", required = true)
         @PathVariable(value = "status", required = true) status: String,
-        @ApiParam(value = "Config snapshot to store.", required = true, example = "\"config_snapshot\"")
+        @ApiParam(value = "Config snapshot to store", required = true, example = "\"config_snapshot\"")
         @RequestBody snapshot: String
     ): ResponseEntity<ResourceConfigSnapshot> = runBlocking {
 
@@ -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<String>
+    ) = 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],
@@ -177,9 +231,9 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe
     @ResponseBody
     @PreAuthorize("hasRole('USER')")
     fun getAllByID(
-        @ApiParam(value = "Resource Id associated of the resource configuration snapshots.", required = false, example = "\"1\"")
+        @ApiParam(value = "Resource Id associated of the resource configuration snapshots", required = false, example = "\"1\"")
         @RequestParam(value = "resourceId", required = true) resourceId: String,
-        @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "ANY", required = false)
+        @ApiParam(value = "Status of the snapshot being retrieved", defaultValue = "ANY", required = false)
         @RequestParam(value = "status", required = false, defaultValue = "ANY") status: String
     ): ResponseEntity<List<ResourceConfigSnapshot>?> = runBlocking {
         var configSnapshots: List<ResourceConfigSnapshot>?
@@ -216,15 +270,15 @@ open class ResourceConfigSnapshotController(private val resourceConfigSnapshotSe
         produces = [MediaType.APPLICATION_JSON_VALUE]
     )
     @ApiOperation(
-        value = "Retrieve all resource configuration snapshots for a given resource type.",
+        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, example = "\"PNF\"")
+        @ApiParam(value = "Resource Type associated of the resource configuration snapshot", required = false, example = "\"PNF\"")
         @RequestParam(value = "resourceType", required = true) resourceType: String,
-        @ApiParam(value = "Status of the snapshot being retrieved.", defaultValue = "ANY", required = false)
+        @ApiParam(value = "Status of the snapshot being retrieved", defaultValue = "ANY", required = false)
         @RequestParam(value = "status", required = false, defaultValue = "ANY") status: String
     ): ResponseEntity<List<ResourceConfigSnapshot>?> = runBlocking {
         var configSnapshots: List<ResourceConfigSnapshot>?