ResourceResolution should fail if required resource did not resolve 02/116202/3
authorkuldipr <kuldip.rai@amdocs.com>
Thu, 3 Dec 2020 18:21:59 +0000 (13:21 -0500)
committerkuldipr <kuldip.rai@amdocs.com>
Thu, 17 Dec 2020 19:44:08 +0000 (14:44 -0500)
Issue-ID: CCSDK-3022
Signed-off-by: kuldipr <kuldip.rai@amdocs.com>
Change-Id: I6ca858988f0b11bdf3bbde07e8f4bde939342aa2
Signed-off-by: kuldipr <kuldip.rai@amdocs.com>
ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt
ms/blueprintsprocessor/functions/resource-resolution/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionServiceTest.kt

index f38bfad..3b0eda0 100644 (file)
@@ -73,7 +73,7 @@ interface ResourceResolutionService {
         nodeTemplateName: String,
         artifactPrefix: String,
         properties: Map<String, Any>
-    ): Pair<String, JsonNode>
+    ): Pair<String, MutableList<ResourceAssignment>>
 
     /** Resolve resources for all the sources defined in a particular resource Definition[resolveDefinition]
      * with other [resourceDefinitions] dependencies for the sources [sources]
@@ -137,12 +137,22 @@ open class ResourceResolutionServiceImpl(
         val templateMap: MutableMap<String, String> = hashMapOf()
         val assignmentMap: MutableMap<String, JsonNode> = hashMapOf()
         artifactNames.forEach { artifactName ->
-            val (resolvedStringContent, resolvedJsonContent) = resolveResources(
+            val (resolvedStringContent, resourceAssignmentList) = resolveResources(
                 resourceAssignmentRuntimeService, nodeTemplateName,
                 artifactName, properties
             )
+            val resolvedJsonContent = resourceAssignmentList
+                .associateBy({ it.name }, { it.property?.value })
+                .asJsonNode()
+
             templateMap[artifactName] = resolvedStringContent
             assignmentMap[artifactName] = resolvedJsonContent
+
+            val failedResolution = resourceAssignmentList.filter { it.status != "success" && it.property?.required == true }.map { it.name }
+            if (failedResolution.isNotEmpty()) {
+                log.error("Failed to resolve required resources($failedResolution)")
+                bluePrintRuntimeService.setBluePrintError(resourceAssignmentRuntimeService.getBluePrintError())
+            }
         }
         return ResourceResolutionResult(templateMap, assignmentMap)
     }
@@ -152,7 +162,7 @@ open class ResourceResolutionServiceImpl(
         nodeTemplateName: String,
         artifactPrefix: String,
         properties: Map<String, Any>
-    ): Pair<String, JsonNode> {
+    ): Pair<String, MutableList<ResourceAssignment>> {
 
         // Template Artifact Definition Name
         val artifactTemplate = "$artifactPrefix-template"
@@ -196,9 +206,7 @@ open class ResourceResolutionServiceImpl(
             ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOLUTION_SUMMARY,
             false
         ) as Boolean
-        val assignmentMap = resourceAssignments
-                .associateBy({ it.name }, { it.property?.value })
-                .asJsonNode()
+
         val resolvedParamJsonContent =
             ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments.toList())
         val artifactTemplateDefinition = bluePrintRuntimeService.bluePrintContext().checkNodeTemplateArtifact(nodeTemplateName, artifactTemplate)
@@ -227,7 +235,7 @@ open class ResourceResolutionServiceImpl(
             log.info("Template resolution saved into database successfully : ($properties)")
         }
 
-        return Pair(resolvedContent, assignmentMap)
+        return Pair(resolvedContent, resourceAssignments)
     }
 
     override suspend fun resolveResourceDefinition(
index d6fc522..56a3246 100644 (file)
@@ -29,11 +29,10 @@ import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInpu
 import org.onap.ccsdk.cds.blueprintsprocessor.core.utils.PayloadUtils
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.processor.MockCapabilityScriptRA
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.utils.ResourceAssignmentUtils
+import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintError
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintTypes
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
 import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintContext
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
@@ -136,15 +135,20 @@ class ResourceResolutionServiceTest {
                 "baseconfig",
                 props
             )
-        }.let { (templateMap, assignmentMap) ->
+        }.let { (templateMap, assignmentList) ->
             assertEquals("This is Sample Velocity Template", templateMap)
 
-            val expectedAssignmentMap = hashMapOf(
-                    "service-instance-id" to "siid_1234",
-                    "vnf-id" to "vnf_1234",
-                    "vnf_name" to "temp_vnf"
-            ).asJsonType()
-            assertEquals(expectedAssignmentMap, assignmentMap)
+            val expectedAssignmentList = mutableListOf(
+                "service-instance-id" to "siid_1234",
+                "vnf-id" to "vnf_1234",
+                "vnf_name" to "temp_vnf"
+            )
+            assertEquals(expectedAssignmentList.size, assignmentList.size)
+
+            val areEqual = expectedAssignmentList.zip(assignmentList).all { (it1, it2) ->
+                it1.first == it2.name && it1.second == it2.property?.value?.asText() ?: null
+            }
+            assertEquals(true, areEqual)
         }
     }
 
@@ -321,8 +325,11 @@ class ResourceResolutionServiceTest {
                   "vnf-id" : "vnf_1234",
                   "vnf_name" : "temp_vnf"
                 }
-            """.trimIndent(), it.first)
-            assertEquals("siid_1234", it.second["service-instance-id"].asText())
+                """.trimIndent(), it.first
+            )
+            val areEqual = it.second.first().name == "service-instance-id" &&
+                "siid_1234" == it.second.first().property?.value?.asText() ?: null
+            assertEquals(true, areEqual)
         }
     }