diff options
author | Jozsef Csongvai <jozsef.csongvai@bell.ca> | 2020-01-21 11:27:14 -0500 |
---|---|---|
committer | Jozsef Csongvai <jozsef.csongvai@bell.ca> | 2020-02-21 10:42:19 -0500 |
commit | ebcc45b8c8703cadc49cf3a0b888545845ccb9e6 (patch) | |
tree | 83ea2525f5eee56e47d6a2650677ee11eebf0e86 /ms/blueprintsprocessor/functions/resource-resolution/src/main | |
parent | 9e3c594bc3cf74ab5748c14bcde81dec7f062fa0 (diff) |
Eliminate Template Requirement
Enables resource assignment without the use of a template.
If no template is defined by the CBA, the default output is
a kev-value map. If operation input: resolution-summary is set
to true, output will be a list of ResolutionSummary.
Issue-ID: CCSDK-2038
Change-Id: I5f6bcefcacec6e83cffac1134b13690b500a7563
Signed-off-by: Jozsef Csongvai <jozsef.csongvai@bell.ca>
Diffstat (limited to 'ms/blueprintsprocessor/functions/resource-resolution/src/main')
7 files changed, 105 insertions, 22 deletions
diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt index db0a6f0ed..3c95ea7bb 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponent.kt @@ -43,6 +43,7 @@ open class ResourceResolutionComponent(private val resourceResolutionService: Re const val INPUT_RESOURCE_TYPE = "resource-type" const val INPUT_ARTIFACT_PREFIX_NAMES = "artifact-prefix-names" const val INPUT_RESOLUTION_KEY = "resolution-key" + const val INPUT_RESOLUTION_SUMMARY = "resolution-summary" const val INPUT_STORE_RESULT = "store-result" const val INPUT_OCCURRENCE = "occurrence" @@ -64,6 +65,8 @@ open class ResourceResolutionComponent(private val resourceResolutionService: Re val resourceType = getOptionalOperationInput(ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOURCE_TYPE)?.returnNullIfMissing()?.textValue() ?: "" + val resolutionSummary = + getOptionalOperationInput(ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOLUTION_SUMMARY)?.asBoolean() ?: false val properties: MutableMap<String, Any> = mutableMapOf() properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_STORE_RESULT] = storeResult @@ -71,6 +74,7 @@ open class ResourceResolutionComponent(private val resourceResolutionService: Re properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOURCE_ID] = resourceId properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOURCE_TYPE] = resourceType properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE] = occurrence + properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOLUTION_SUMMARY] = resolutionSummary val jsonResponse = JsonNodeFactory.instance.objectNode() // Initialize Output Attribute to empty JSON diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt index 6573d0e9a..fd104d3ad 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionComponentDSL.kt @@ -82,6 +82,11 @@ fun BluePrintTypes.nodeTypeComponentResourceResolution(): NodeType { ) property( + ResourceResolutionComponent.INPUT_RESOLUTION_SUMMARY, BluePrintConstants.DATA_TYPE_BOOLEAN, + false, "Enables ResolutionSummary output" + ) + + property( ResourceResolutionComponent.INPUT_OCCURRENCE, BluePrintConstants.DATA_TYPE_INTEGER, false, "Number of time to perform the resolution." ) { @@ -176,6 +181,12 @@ class ComponentResourceResolutionNodeTemplateBuilder(id: String, description: St property(ResourceResolutionComponent.INPUT_RESOLUTION_KEY, resolutionKey) } + fun resolutionSummary(resolutionSummary: Boolean) = resolutionSummary(resolutionSummary.asJsonPrimitive()) + + fun resolutionSummary(resolutionSummary: JsonNode) { + property(ResourceResolutionComponent.INPUT_RESOLUTION_SUMMARY, resolutionSummary) + } + fun dynamicProperties(dynamicProperties: String) = dynamicProperties(dynamicProperties.asJsonType()) fun dynamicProperties(dynamicProperties: JsonNode) { diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionConstants.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionConstants.kt index c39933dc8..8f6069160 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionConstants.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionConstants.kt @@ -29,4 +29,5 @@ object ResourceResolutionConstants { const val RESOURCE_RESOLUTION_INPUT_OCCURRENCE = "occurrence" const val RESOURCE_RESOLUTION_INPUT_RESOURCE_ID = "resource-id" const val RESOURCE_RESOLUTION_INPUT_RESOURCE_TYPE = "resource-type" + const val RESOURCE_RESOLUTION_INPUT_RESOLUTION_SUMMARY = "resolution-summary" } diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt index 7272a3d63..dff00c7eb 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt @@ -147,7 +147,7 @@ open class ResourceResolutionServiceImpl( properties: Map<String, Any> ): String { - // Velocity Artifact Definition Name + // Template Artifact Definition Name val artifactTemplate = "$artifactPrefix-template" // Resource Assignment Artifact Definition Name val artifactMapping = "$artifactPrefix-mapping" @@ -185,22 +185,28 @@ open class ResourceResolutionServiceImpl( properties ) + val resolutionSummary = properties.getOrDefault(ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_RESOLUTION_SUMMARY, false) as Boolean val resolvedParamJsonContent = ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments.toList()) - val artifactTemplateDefinition = bluePrintRuntimeService.bluePrintContext().checkNodeTemplateArtifact(nodeTemplateName, artifactTemplate) - val resolvedContent = if (artifactTemplateDefinition != null) { - blueprintTemplateService.generateContent( - bluePrintRuntimeService, nodeTemplateName, - artifactTemplate, resolvedParamJsonContent, false, - mutableMapOf( - ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE to - properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE].asJsonPrimitive() + val resolvedContent = when { + artifactTemplateDefinition != null -> { + blueprintTemplateService.generateContent( + bluePrintRuntimeService, nodeTemplateName, + artifactTemplate, resolvedParamJsonContent, false, + mutableMapOf( + ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE to + properties[ResourceResolutionConstants.RESOURCE_RESOLUTION_INPUT_OCCURRENCE].asJsonPrimitive() + ) ) - ) - } else { - resolvedParamJsonContent + } + resolutionSummary -> { + ResourceAssignmentUtils.generateResolutionSummaryData(resourceAssignments, resourceDefinitions) + } + else -> { + resolvedParamJsonContent + } } if (isToStore(properties)) { diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt index e43b45e7d..0bfd7e4e2 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/DatabaseResourceAssignmentProcessor.kt @@ -28,6 +28,7 @@ import org.onap.ccsdk.cds.controllerblueprints.core.checkNotEmpty import org.onap.ccsdk.cds.controllerblueprints.core.isNotEmpty import org.onap.ccsdk.cds.controllerblueprints.core.nullToEmpty import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils +import org.onap.ccsdk.cds.controllerblueprints.resource.dict.KeyIdentifier import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceAssignment import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceDictionaryConstants import org.slf4j.LoggerFactory @@ -91,6 +92,11 @@ open class DatabaseResourceAssignmentProcessor( "failed to get input-key-mappings for $dName under $dSource properties" } + sourceProperties.inputKeyMapping + ?.mapValues { raRuntimeService.getDictionaryStore(it.value) } + ?.map { KeyIdentifier(it.key, it.value) } + ?.let { resourceAssignment.keyIdentifiers.addAll(it) } + logger.info( "DatabaseResource ($dSource) dictionary information: " + "Query:($sql), input-key-mapping:($inputKeyMapping), output-key-mapping:(${sourceProperties.outputKeyMapping})" diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt index 2ff5c441e..10233404c 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/processor/RestResourceResolutionProcessor.kt @@ -27,6 +27,7 @@ import org.onap.ccsdk.cds.controllerblueprints.core.checkNotEmpty import org.onap.ccsdk.cds.controllerblueprints.core.isNotEmpty import org.onap.ccsdk.cds.controllerblueprints.core.nullToEmpty import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils +import org.onap.ccsdk.cds.controllerblueprints.resource.dict.KeyIdentifier import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceAssignment import org.slf4j.LoggerFactory import org.springframework.beans.factory.config.ConfigurableBeanFactory @@ -75,6 +76,11 @@ open class RestResourceResolutionProcessor(private val blueprintRestLibPropertyS checkNotNull(sourceProperties.inputKeyMapping) { "failed to get input-key-mappings for $dName under $dSource properties" } val resolvedInputKeyMapping = resolveInputKeyMappingVariables(inputKeyMapping).toMutableMap() + sourceProperties.inputKeyMapping + ?.mapValues { raRuntimeService.getDictionaryStore(it.value) } + ?.map { KeyIdentifier(it.key, it.value) } + ?.let { resourceAssignment.keyIdentifiers.addAll(it) } + // Resolving content Variables val payload = resolveFromInputKeyMapping(nullToEmpty(sourceProperties.payload), resolvedInputKeyMapping) val urlPath = diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/utils/ResourceAssignmentUtils.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/utils/ResourceAssignmentUtils.kt index 7ffc6db39..7101735ae 100644 --- a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/utils/ResourceAssignmentUtils.kt +++ b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/utils/ResourceAssignmentUtils.kt @@ -42,6 +42,8 @@ import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintRuntimeServ import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonReactorUtils 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.KeyIdentifier +import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResolutionSummary import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceAssignment import org.onap.ccsdk.cds.controllerblueprints.resource.dict.ResourceDefinition import org.slf4j.LoggerFactory @@ -196,6 +198,22 @@ class ResourceAssignmentUtils { return data } + fun generateResolutionSummaryData( + resourceAssignments: List<ResourceAssignment>, + resourceDefinitions: Map<String, ResourceDefinition> + ): String { + val resolutionSummaryList = resourceAssignments.map { + val payload = resourceDefinitions[it.name] + ?.sources?.get(it.dictionarySource)?.properties?.get("payload") + ResolutionSummary( + it.name, it.property?.value, it.property?.required, + it.property?.type, it.keyIdentifiers, it.dictionaryName, + payload, it.dictionarySource, it.status, it.message + ) + } + return JacksonUtils.getJson(resolutionSummaryList, includeNull = true) + } + private fun useDefaultValueIfNull( resourceAssignment: ResourceAssignment, resourceAssignmentName: String @@ -263,7 +281,7 @@ class ResourceAssignmentUtils { return when (type) { in BluePrintTypes.validPrimitiveTypes() -> { // Primitive Types - parseResponseNodeForPrimitiveTypes(responseNode, outputKeyMapping) + parseResponseNodeForPrimitiveTypes(responseNode, resourceAssignment, outputKeyMapping) } in BluePrintTypes.validCollectionTypes() -> { // Array Types @@ -282,6 +300,7 @@ class ResourceAssignmentUtils { private fun parseResponseNodeForPrimitiveTypes( responseNode: JsonNode, + resourceAssignment: ResourceAssignment, outputKeyMapping: MutableMap<String, String> ): JsonNode { // Return responseNode if is not a Complex Type @@ -306,11 +325,16 @@ class ResourceAssignmentUtils { if (returnNode.isNullOrMissing() || returnNode!!.isComplexType() && !returnNode.has(outputKeyMapping[outputKey])) { throw BluePrintProcessorException("Fail to find output key mapping ($outputKey) in the responseNode.") } - return if (returnNode.isComplexType()) { + + val returnValue = if (returnNode.isComplexType()) { returnNode[outputKeyMapping[outputKey]] } else { returnNode } + + outputKey?.let { KeyIdentifier(it, returnValue) } + ?.let { resourceAssignment.keyIdentifiers.add(it) } + return returnValue } private fun parseResponseNodeForCollection( @@ -337,7 +361,7 @@ class ResourceAssignmentUtils { val responseArrayNode = responseNode.toList() for (responseSingleJsonNode in responseArrayNode) { val arrayChildNode = parseSingleElementOfArrayResponseNode( - entrySchemaType, + entrySchemaType, resourceAssignment, outputKeyMapping, raRuntimeService, responseSingleJsonNode, metadata ) arrayNode.add(arrayChildNode) @@ -347,7 +371,10 @@ class ResourceAssignmentUtils { is ObjectNode -> { val responseArrayNode = responseNode.rootFieldsToMap() resultNode = - parseObjectResponseNode(entrySchemaType, outputKeyMapping, responseArrayNode, metadata) + parseObjectResponseNode( + resourceAssignment, entrySchemaType, outputKeyMapping, + responseArrayNode, metadata + ) } else -> { throw BluePrintProcessorException("Key-value response expected to match the responseNode.") @@ -387,6 +414,7 @@ class ResourceAssignmentUtils { private fun parseSingleElementOfArrayResponseNode( entrySchemaType: String, + resourceAssignment: ResourceAssignment, outputKeyMapping: MutableMap<String, String>, raRuntimeService: ResourceAssignmentRuntimeService, responseNode: JsonNode, @@ -397,7 +425,13 @@ class ResourceAssignmentUtils { in BluePrintTypes.validPrimitiveTypes() -> { if (outputKeyMappingHasOnlyOneElement) { val outputKeyMap = outputKeyMapping.entries.first() + if (resourceAssignment.keyIdentifiers.none { it.name == outputKeyMap.key }) { + resourceAssignment.keyIdentifiers.add( + KeyIdentifier(outputKeyMap.key, JacksonUtils.objectMapper.createArrayNode()) + ) + } return parseSingleElementNodeWithOneOutputKeyMapping( + resourceAssignment, responseNode, outputKeyMap.key, outputKeyMap.value, @@ -416,6 +450,7 @@ class ResourceAssignmentUtils { raRuntimeService ) -> { parseSingleElementNodeWithAllOutputKeyMapping( + resourceAssignment, responseNode, outputKeyMapping, entrySchemaType, @@ -425,6 +460,7 @@ class ResourceAssignmentUtils { outputKeyMappingHasOnlyOneElement -> { val outputKeyMap = outputKeyMapping.entries.first() parseSingleElementNodeWithOneOutputKeyMapping( + resourceAssignment, responseNode, outputKeyMap.key, outputKeyMap.value, @@ -441,6 +477,7 @@ class ResourceAssignmentUtils { } private fun parseObjectResponseNode( + resourceAssignment: ResourceAssignment, entrySchemaType: String, outputKeyMapping: MutableMap<String, String>, responseArrayNode: MutableMap<String, JsonNode>, @@ -449,19 +486,21 @@ class ResourceAssignmentUtils { val outputKeyMappingHasOnlyOneElement = checkIfOutputKeyMappingProvideOneElement(outputKeyMapping) if (outputKeyMappingHasOnlyOneElement) { val outputKeyMap = outputKeyMapping.entries.first() - return parseObjectResponseNodeWithOneOutputKeyMapping( + val returnValue = parseObjectResponseNodeWithOneOutputKeyMapping( responseArrayNode, outputKeyMap.key, outputKeyMap.value, entrySchemaType, metadata ) + resourceAssignment.keyIdentifiers.add(KeyIdentifier(outputKeyMap.key, returnValue)) + return returnValue } else { throw BluePrintProcessorException("Output-key-mapping do not map the Data Type $entrySchemaType") } } private fun parseSingleElementNodeWithOneOutputKeyMapping( + resourceAssignment: ResourceAssignment, responseSingleJsonNode: JsonNode, - outputKeyMappingKey: - String, + outputKeyMappingKey: String, outputKeyMappingValue: String, type: String, metadata: MutableMap<String, String>? @@ -476,11 +515,19 @@ class ResourceAssignmentUtils { logKeyValueResolvedResource(metadata, outputKeyMappingKey, responseKeyValue, type) JacksonUtils.populateJsonNodeValues(outputKeyMappingKey, responseKeyValue, type, arrayChildNode) - + resourceAssignment.keyIdentifiers.find { it.name == outputKeyMappingKey && it.value.isArray } + .let { + if (it != null) + (it.value as ArrayNode).add(responseKeyValue) + else + resourceAssignment.keyIdentifiers.add( + KeyIdentifier(outputKeyMappingKey, responseKeyValue)) + } return arrayChildNode } private fun parseSingleElementNodeWithAllOutputKeyMapping( + resourceAssignment: ResourceAssignment, responseSingleJsonNode: JsonNode, outputKeyMapping: MutableMap<String, String>, type: String, @@ -496,6 +543,7 @@ class ResourceAssignmentUtils { logKeyValueResolvedResource(metadata, it.key, responseKeyValue, type) JacksonUtils.populateJsonNodeValues(it.key, responseKeyValue, type, arrayChildNode) + resourceAssignment.keyIdentifiers.add(KeyIdentifier(it.key, responseKeyValue)) } return arrayChildNode } @@ -541,6 +589,7 @@ class ResourceAssignmentUtils { raRuntimeService ) -> { parseSingleElementNodeWithAllOutputKeyMapping( + resourceAssignment, responseNode, outputKeyMapping, entrySchemaType, @@ -550,8 +599,8 @@ class ResourceAssignmentUtils { outputKeyMappingHasOnlyOneElement -> { val outputKeyMap = outputKeyMapping.entries.first() parseSingleElementNodeWithOneOutputKeyMapping( - responseNode, outputKeyMap.key, outputKeyMap.value, - entrySchemaType, metadata + resourceAssignment, responseNode, outputKeyMap.key, + outputKeyMap.value, entrySchemaType, metadata ) } else -> { |