Renaming Files having BluePrint to have Blueprint
[ccsdk/cds.git] / ms / blueprintsprocessor / functions / resource-resolution / src / main / kotlin / org / onap / ccsdk / cds / blueprintsprocessor / functions / resource / resolution / ResourceResolutionService.kt
index 836db4c..46410a8 100644 (file)
@@ -27,15 +27,15 @@ import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.db.T
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.processor.ResourceAssignmentProcessor
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.utils.ResourceAssignmentUtils
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.utils.ResourceDefinitionUtils.createResourceAssignments
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
-import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.onap.ccsdk.cds.controllerblueprints.core.BlueprintConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.BlueprintProcessorException
 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonNode
 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
 import org.onap.ccsdk.cds.controllerblueprints.core.checkNotEmpty
 import org.onap.ccsdk.cds.controllerblueprints.core.common.ApplicationConstants.LOG_REDACTED
-import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintRuntimeService
-import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintTemplateService
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BlueprintRuntimeService
+import org.onap.ccsdk.cds.controllerblueprints.core.service.BlueprintTemplateService
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.PropertyDefinitionUtils.Companion.hasLogProtect
 import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceAssignment
@@ -56,30 +56,30 @@ interface ResourceResolutionService {
     fun registeredResourceSources(): List<String>
 
     suspend fun resolveFromDatabase(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         artifactTemplate: String,
         resolutionKey: String
     ): String
 
     suspend fun resolveResources(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         nodeTemplateName: String,
         artifactNames: List<String>,
         properties: Map<String, Any>
     ): ResourceResolutionResult
 
     suspend fun resolveResources(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         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]
      * Used to get the same resource values from multiple sources. **/
     suspend fun resolveResourceDefinition(
-        blueprintRuntimeService: BluePrintRuntimeService<*>,
+        blueprintRuntimeService: BlueprintRuntimeService<*>,
         resourceDefinitions: MutableMap<String, ResourceDefinition>,
         resolveDefinition: String,
         sources: List<String>
@@ -87,7 +87,7 @@ interface ResourceResolutionService {
         MutableMap<String, JsonNode>
 
     suspend fun resolveResourceAssignments(
-        blueprintRuntimeService: BluePrintRuntimeService<*>,
+        blueprintRuntimeService: BlueprintRuntimeService<*>,
         resourceDefinitions: MutableMap<String, ResourceDefinition>,
         resourceAssignments: MutableList<ResourceAssignment>,
         artifactPrefix: String,
@@ -99,7 +99,7 @@ interface ResourceResolutionService {
 open class ResourceResolutionServiceImpl(
     private var applicationContext: ApplicationContext,
     private var templateResolutionDBService: TemplateResolutionService,
-    private var blueprintTemplateService: BluePrintTemplateService,
+    private var blueprintTemplateService: BlueprintTemplateService,
     private var resourceResolutionDBService: ResourceResolutionDBService
 ) :
     ResourceResolutionService {
@@ -113,7 +113,7 @@ open class ResourceResolutionServiceImpl(
     }
 
     override suspend fun resolveFromDatabase(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         artifactTemplate: String,
         resolutionKey: String
     ): String {
@@ -125,7 +125,7 @@ open class ResourceResolutionServiceImpl(
     }
 
     override suspend fun resolveResources(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         nodeTemplateName: String,
         artifactNames: List<String>,
         properties: Map<String, Any>
@@ -137,22 +137,35 @@ 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()) {
+                // The following error message is returned by default to handle a scenario when
+                // error message comes empty even when resolution has actually failed.
+                // Example: input-source type resolution seems to fail with no error code.
+                bluePrintRuntimeService.getBlueprintError().errors.add("Failed to resolve required resources($failedResolution)")
+                bluePrintRuntimeService.getBlueprintError().errors.addAll(resourceAssignmentRuntimeService.getBlueprintError().errors)
+            }
         }
         return ResourceResolutionResult(templateMap, assignmentMap)
     }
 
     override suspend fun resolveResources(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         nodeTemplateName: String,
         artifactPrefix: String,
         properties: Map<String, Any>
-    ): Pair<String, JsonNode> {
+    ): Pair<String, MutableList<ResourceAssignment>> {
 
         // Template Artifact Definition Name
         val artifactTemplate = "$artifactPrefix-template"
@@ -167,7 +180,7 @@ open class ResourceResolutionServiceImpl(
         val resourceAssignments: MutableList<ResourceAssignment> =
             JacksonUtils.getListFromJson(resourceAssignmentContent, ResourceAssignment::class.java)
                 as? MutableList<ResourceAssignment>
-                ?: throw BluePrintProcessorException("couldn't get Dictionary Definitions")
+                ?: throw BlueprintProcessorException("couldn't get Dictionary Definitions")
 
         if (isToStore(properties)) {
             val existingResourceResolution = isNewResolution(bluePrintRuntimeService, properties, artifactPrefix)
@@ -196,9 +209,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 =
@@ -213,7 +224,7 @@ open class ResourceResolutionServiceImpl(
                         ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE to
                             properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE]
                                 .asJsonPrimitive()
-                        )
+                    )
                 )
             }
             resolutionSummary -> {
@@ -229,11 +240,11 @@ open class ResourceResolutionServiceImpl(
             log.info("Template resolution saved into database successfully : ($properties)")
         }
 
-        return Pair(resolvedContent, assignmentMap)
+        return Pair(resolvedContent, resourceAssignments)
     }
 
     override suspend fun resolveResourceDefinition(
-        blueprintRuntimeService: BluePrintRuntimeService<*>,
+        blueprintRuntimeService: BlueprintRuntimeService<*>,
         resourceDefinitions: MutableMap<String, ResourceDefinition>,
         resolveDefinition: String,
         sources: List<String>
@@ -257,7 +268,7 @@ open class ResourceResolutionServiceImpl(
      * request.
      */
     override suspend fun resolveResourceAssignments(
-        blueprintRuntimeService: BluePrintRuntimeService<*>,
+        blueprintRuntimeService: BlueprintRuntimeService<*>,
         resourceDefinitions: MutableMap<String, ResourceDefinition>,
         resourceAssignments: MutableList<ResourceAssignment>,
         artifactPrefix: String,
@@ -280,7 +291,7 @@ open class ResourceResolutionServiceImpl(
                 // Execute Non Dependent Assignments in parallel ( ie asynchronously )
                 val deferred = batchResourceAssignments
                     .filter { it.name != "*" && it.name != "start" }
-                    .filter { it.status != BluePrintConstants.STATUS_SUCCESS }
+                    .filter { it.status != BlueprintConstants.STATUS_SUCCESS }
                     .map { resourceAssignment ->
                         async {
                             val dictionaryName = resourceAssignment.dictionaryName
@@ -290,12 +301,12 @@ open class ResourceResolutionServiceImpl(
 
                             val resourceAssignmentProcessor =
                                 applicationContext.getBean(processorName) as? ResourceAssignmentProcessor
-                                    ?: throw BluePrintProcessorException(
+                                    ?: throw BlueprintProcessorException(
                                         "failed to get resource processor ($processorName) " +
                                             "for resource assignment(${resourceAssignment.name})"
                                     )
                             try {
-                                // Set BluePrint Runtime Service
+                                // Set Blueprint Runtime Service
                                 resourceAssignmentProcessor.raRuntimeService = resourceAssignmentRuntimeService
                                 // Set Resource Dictionaries
                                 resourceAssignmentProcessor.resourceDictionaries = resourceDefinitions
@@ -316,10 +327,10 @@ open class ResourceResolutionServiceImpl(
                                 }
 
                                 // Set errors from RA
-                                blueprintRuntimeService.setBluePrintError(resourceAssignmentRuntimeService.getBluePrintError())
+                                blueprintRuntimeService.setBlueprintError(resourceAssignmentRuntimeService.getBlueprintError())
                             } catch (e: RuntimeException) {
                                 log.error("Fail in processing ${resourceAssignment.name}", e)
-                                throw BluePrintProcessorException(e)
+                                throw BlueprintProcessorException(e)
                             }
                         }
                     }
@@ -347,10 +358,10 @@ open class ResourceResolutionServiceImpl(
             }
             else -> {
                 val resourceDefinition = resourceDefinitions[dictionaryName]
-                    ?: throw BluePrintProcessorException("couldn't get resource dictionary definition for $dictionaryName")
+                    ?: throw BlueprintProcessorException("couldn't get resource dictionary definition for $dictionaryName")
 
                 val resourceSource = resourceDefinition.sources[dictionarySource]
-                    ?: throw BluePrintProcessorException("couldn't get resource definition $dictionaryName source($dictionarySource)")
+                    ?: throw BlueprintProcessorException("couldn't get resource definition $dictionaryName source($dictionarySource)")
 
                 ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR.plus(resourceSource.type)
             }
@@ -370,7 +381,7 @@ open class ResourceResolutionServiceImpl(
 
     // Check whether resolution already exist in the database for the specified resolution-key or resourceId/resourceType
     private suspend fun isNewResolution(
-        bluePrintRuntimeService: BluePrintRuntimeService<*>,
+        bluePrintRuntimeService: BlueprintRuntimeService<*>,
         properties: Map<String, Any>,
         artifactPrefix: String
     ): List<ResourceResolution> {
@@ -422,7 +433,7 @@ open class ResourceResolutionServiceImpl(
         resourceAssignmentList: MutableList<ResourceAssignment>
     ) {
         resourceResolutionList.forEach { resourceResolution ->
-            if (resourceResolution.status == BluePrintConstants.STATUS_SUCCESS) {
+            if (resourceResolution.status == BlueprintConstants.STATUS_SUCCESS) {
                 resourceAssignmentList.forEach {
                     if (compareOne(resourceResolution, it)) {
                         log.info(
@@ -443,10 +454,12 @@ open class ResourceResolutionServiceImpl(
 
     // Comparision between what we have in the database vs what we have to assign.
     private fun compareOne(resourceResolution: ResourceResolution, resourceAssignment: ResourceAssignment): Boolean {
-        return (resourceResolution.name == resourceAssignment.name &&
-            resourceResolution.dictionaryName == resourceAssignment.dictionaryName &&
-            resourceResolution.dictionarySource == resourceAssignment.dictionarySource &&
-            resourceResolution.dictionaryVersion == resourceAssignment.version)
+        return (
+            resourceResolution.name == resourceAssignment.name &&
+                resourceResolution.dictionaryName == resourceAssignment.dictionaryName &&
+                resourceResolution.dictionarySource == resourceAssignment.dictionarySource &&
+                resourceResolution.dictionaryVersion == resourceAssignment.version
+            )
     }
 
     private fun exposeOccurrencePropertyInResourceAssignments(