/*
- * 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.
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
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
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.
@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) {
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
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
@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 {
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],
@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>?
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>?