Do not throw exception when no data exist. 72/94972/3
authorAlexis de Talhouët <adetalhouet89@gmail.com>
Wed, 4 Sep 2019 18:57:51 +0000 (14:57 -0400)
committerAlexis de Talhouët <adetalhouet89@gmail.com>
Thu, 5 Sep 2019 13:38:09 +0000 (09:38 -0400)
The first time we're doing a diff, if a store operation has
never been done before, we shouldn't throw exception, we should
silently succeed and set the diff as empty value.

Change-Id: Ie2371737758a1525da6b76ac85bceb7fe1aa4673
Issue-ID: CCSDK-1690
Signed-off-by: Alexis de Talhouët <adetalhouet89@gmail.com>
ms/blueprintsprocessor/functions/config-snapshots/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/ComponentConfigSnapshotsExecutor.kt
ms/blueprintsprocessor/functions/config-snapshots/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/db/ResourceConfigSnapshotService.kt
ms/blueprintsprocessor/functions/config-snapshots/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/ComponentConfigSnapshotsExecutorTest.kt
ms/blueprintsprocessor/functions/config-snapshots/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/config/snapshots/db/ResourceConfigSnapshotServiceTest.kt
ms/blueprintsprocessor/modules/inbounds/configs-api/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/configs/api/ResourceConfigSnapshotControllerTest.kt

index eafcaf4..180ad7b 100644 (file)
  *  limitations under the License.
  */
 
-package org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor
+package org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots
 
 import com.github.fge.jsonpatch.diff.JsonDiff
+import org.apache.logging.log4j.util.Strings
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.db.ResourceConfigSnapshot
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.db.ResourceConfigSnapshot.Status.RUNNING
@@ -144,18 +145,20 @@ open class ComponentConfigSnapshotsExecutor(private val cfgSnapshotService: Reso
      */
     private suspend fun compareConfigurationSnapshot(resourceId: String, resourceType: String, contentType : String) {
 
+        val cfgRunning = cfgSnapshotService.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, RUNNING)
+        val cfgCandidate = cfgSnapshotService.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, CANDIDATE)
+
+        if (cfgRunning.isEmpty() || cfgCandidate.isEmpty()) {
+            setNodeOutputProperties(OUTPUT_STATUS_SUCCESS, Strings.EMPTY)
+            return
+        }
+
         when (contentType.toUpperCase()) {
             DIFF_JSON -> {
-                val cfgRunning = cfgSnapshotService.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, RUNNING)
-                val cfgCandidate = cfgSnapshotService.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, CANDIDATE)
-
                 val patchNode = JsonDiff.asJson(cfgRunning.jsonAsJsonType(), cfgCandidate.jsonAsJsonType())
                 setNodeOutputProperties(OUTPUT_STATUS_SUCCESS, patchNode.toString())
             }
             DIFF_XML -> {
-                val cfgRunning = cfgSnapshotService.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, RUNNING)
-                val cfgCandidate = cfgSnapshotService.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, CANDIDATE)
-
                 val myDiff = DiffBuilder
                         .compare(Input.fromString(cfgRunning))
                         .withTest(Input.fromString(cfgCandidate))
index 50c90f3..5fcba5b 100644 (file)
@@ -17,6 +17,7 @@ package org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.db
 
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
+import org.apache.logging.log4j.util.Strings
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.db.ResourceConfigSnapshot.Status.RUNNING
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintException
 import org.slf4j.LoggerFactory
@@ -40,7 +41,7 @@ class ResourceConfigSnapshotService(private val repository: ResourceConfigSnapsh
                                                          status : ResourceConfigSnapshot.Status = RUNNING): String =
             withContext(Dispatchers.IO) {
                 repository.findByResourceIdAndResourceTypeAndStatus(resourceId, resourceType, status)
-                        ?.config_snapshot ?: throw NoSuchElementException()
+                        ?.config_snapshot ?: Strings.EMPTY
             }
 
     suspend fun write(snapshot: String, resId: String, resType: String,
index 79dd930..c212908 100644 (file)
@@ -14,7 +14,7 @@
  *  limitations under the License.
  */
 
-package org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor
+package org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots
 
 import com.fasterxml.jackson.databind.JsonNode
 import kotlinx.coroutines.runBlocking
@@ -27,11 +27,12 @@ import org.onap.ccsdk.cds.blueprintsprocessor.core.BluePrintProperties
 import org.onap.ccsdk.cds.blueprintsprocessor.core.BlueprintPropertyConfiguration
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
 import org.onap.ccsdk.cds.blueprintsprocessor.db.BluePrintDBLibConfiguration
-import org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor.ComponentConfigSnapshotsExecutor.Companion.DIFF_JSON
-import org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor.ComponentConfigSnapshotsExecutor.Companion.DIFF_XML
-import org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor.ComponentConfigSnapshotsExecutor.Companion.OPERATION_DIFF
-import org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor.ComponentConfigSnapshotsExecutor.Companion.OPERATION_FETCH
-import org.onap.ccsdk.cds.blueprintsprocessor.functions.ansible.executor.ComponentConfigSnapshotsExecutor.Companion.OPERATION_STORE
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.ComponentConfigSnapshotsExecutor
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.ComponentConfigSnapshotsExecutor.Companion.DIFF_JSON
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.ComponentConfigSnapshotsExecutor.Companion.DIFF_XML
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.ComponentConfigSnapshotsExecutor.Companion.OPERATION_DIFF
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.ComponentConfigSnapshotsExecutor.Companion.OPERATION_FETCH
+import org.onap.ccsdk.cds.blueprintsprocessor.functions.config.snapshots.ComponentConfigSnapshotsExecutor.Companion.OPERATION_STORE
 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.controllerblueprints.core.BluePrintProcessorException
@@ -192,9 +193,7 @@ class ComponentConfigSnapshotsExecutorTest {
                 return@runBlocking
             }
 
-            // then; we should get error and the PAYLOAD payload in our output properties
-            assertTrue( bluePrintRuntimeService.getBluePrintError().errors.size > 0 )
-            assertEquals(ComponentConfigSnapshotsExecutor.OUTPUT_STATUS_ERROR.asJsonPrimitive(),
+            assertEquals(ComponentConfigSnapshotsExecutor.OUTPUT_STATUS_SUCCESS.asJsonPrimitive(),
                     bluePrintRuntimeService.getNodeTemplateAttributeValue(nodeTemplateName,
                             ComponentConfigSnapshotsExecutor.OUTPUT_STATUS))
         }
@@ -234,7 +233,10 @@ class ComponentConfigSnapshotsExecutorTest {
         runBlocking {
             // when; asking for unknown content type diff operation; should get an error response
             try {
-                prepareRequestProperties(OPERATION_DIFF, "asdasd",  "PNF", "YANG")
+                val resId = "121111"
+                val resType = "PNF"
+                cfgSnapshotService.write("snapshotConfig", resId, resType,  ResourceConfigSnapshot.Status.CANDIDATE)
+                prepareRequestProperties(OPERATION_DIFF, resId,  resType, "YANG")
 
                 cfgSnapshotComponent.processNB(executionRequest)
 
@@ -245,7 +247,6 @@ class ComponentConfigSnapshotsExecutorTest {
             }
 
             // then; we should get error in our output properties
-            assertTrue( bluePrintRuntimeService.getBluePrintError().errors.size == 1 )
             assertEquals(ComponentConfigSnapshotsExecutor.OUTPUT_STATUS_ERROR.asJsonPrimitive(),
                     bluePrintRuntimeService.getNodeTemplateAttributeValue(nodeTemplateName,
                             ComponentConfigSnapshotsExecutor.OUTPUT_STATUS))
index 2830cb5..3c989c1 100644 (file)
@@ -48,18 +48,6 @@ class ResourceConfigSnapshotServiceTest {
         }
     }
 
-    @Test(expected = NoSuchElementException::class)
-    fun notFoundEntryReturnsExceptionTest() {
-        val tr = ResourceConfigSnapshot()
-        runBlocking {
-            every {
-                cfgRepository.findByResourceIdAndResourceTypeAndStatus(any(), any(), any())
-            } returns tr
-            val snap = cfgService.findByResourceIdAndResourceTypeAndStatus("MISSING_ID", "UNKNOWN_TYPE")
-            assertTrue ( snap.isBlank(), "Not found but returned a non empty string" )
-        }
-    }
-
     @Test
     fun createNewResourceConfigSnapshotTest() {
         val tr = ResourceConfigSnapshot()
index c3f18fc..b4c1ad0 100644 (file)
@@ -129,14 +129,15 @@ class ResourceConfigSnapshotControllerTest {
     }
 
     @Test
-    fun `get returns 404 if entry not found`() {
+    fun `get returns 200 if entry not found`() {
         runBlocking {
 
             webTestClient
                 .get()
                 .uri("/api/v1/configs?resourceId=MISSING&resourceType=PNF")
                 .exchange()
-                .expectStatus().isNotFound
+                .expectStatus().is2xxSuccessful
+                .expectBody()
         }
     }