Refactor Netconf script component parent. 01/91701/6
authorBrinda Santh <brindasanth@in.ibm.com>
Thu, 18 Jul 2019 20:59:19 +0000 (16:59 -0400)
committerBrinda Santh <brindasanth@in.ibm.com>
Tue, 23 Jul 2019 19:09:32 +0000 (15:09 -0400)
Change-Id: Ibbec8cd5785372a89e14a86d4e6ff7f9fed4aad2
Issue-ID: CCSDK-1499
Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
Signed-off-by: Steve Siani <alphonse.steve.siani.djissitchi@ibm.com>
14 files changed:
components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py
components/scripts/python/ccsdk_netconf/common.py
components/scripts/python/ccsdk_netconf/netconfclient.py
ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/CliExecutorExtensions.kt [moved from ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/ScriptComponentExtensions.kt with 92% similarity]
ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutor.kt
ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/NetconfExecutorExtensions.kt [moved from ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ScriptComponentExtensions.kt with 100% similarity]
ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutorTest.kt
ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionExtensions.kt [moved from ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ScriptComponentExtensions.kt with 100% similarity]
ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionService.kt
ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/RestconfExecutorExtensions.kt [moved from ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/ScriptComponentExtensions.kt with 93% similarity]
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/PropertyAssignmentService.kt
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtils.kt
ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtilsTest.kt

index f146e81..2fd6c66 100644 (file)
@@ -16,39 +16,37 @@ import netconf_constant
 from common import ResolutionHelper
 from java.lang import Exception as JavaException
 from netconfclient import NetconfClient
-from org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor import \
-  NetconfComponentFunction
-
-
-class NetconfRpcExample(NetconfComponentFunction):
-
-  def process(self, execution_request):
-    try:
-      log = globals()[netconf_constant.SERVICE_LOG]
-      print(globals())
-      nc = NetconfClient(log, self, "netconf-connection")
-      rr = ResolutionHelper(self)
-
-      payload = rr.resolve_and_generate_message_from_template_prefix("hostname")
-
-      nc.connect()
-      response = nc.lock()
-      if not response.isSuccess():
-        log.error(response.errorMessage)
-
-      nc.edit_config(message_content=payload, edit_default_peration="none")
-      nc.validate()
-      nc.discard_change()
-      nc.validate()
-      nc.commit()
-      nc.unlock()
-      nc.disconnect()
-
-    except JavaException, err:
-      log.error("Java Exception in the script {}", err)
-    except Exception, err:
-      log.error("Python Exception in the script {}", err)
-
-  def recover(self, runtime_exception, execution_request):
-    print "Recovering calling.." + PROPERTY_BLUEPRINT_BASE_PATH
-    return None
+from org.onap.ccsdk.cds.blueprintsprocessor.services.execution import AbstractScriptComponentFunction
+
+class NetconfRpcExample(AbstractScriptComponentFunction):
+
+    def process(self, execution_request):
+        try:
+            log = globals()[netconf_constant.SERVICE_LOG]
+            print(globals())
+            nc = NetconfClient(log, self, "netconf-connection")
+            rr = ResolutionHelper(self)
+
+            payload = rr.resolve_and_generate_message_from_template_prefix("hostname")
+
+            nc.connect()
+            response = nc.lock()
+            if not response.isSuccess():
+                log.error(response.errorMessage)
+
+            nc.edit_config(message_content=payload, edit_default_peration="none")
+            nc.validate()
+            nc.discard_change()
+            nc.validate()
+            nc.commit()
+            nc.unlock()
+            nc.disconnect()
+
+        except JavaException, err:
+            log.error("Java Exception in the script {}", err)
+        except Exception, err:
+            log.error("Python Exception in the script {}", err)
+
+    def recover(self, runtime_exception, execution_request):
+        print "Recovering calling.." + PROPERTY_BLUEPRINT_BASE_PATH
+        return None
index 896fb91..f7ac1ac 100644 (file)
 #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #  See the License for the specific language governing permissions and
 #  limitations under the License.
+from org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution import ResourceResolutionExtensionsKt
 
-class ResolutionHelper:
 
-  def __init__(self, component_function):
-    self.component_function = component_function
+class ResolutionHelper:
 
-  def resolve_and_generate_message_from_template_prefix(self, artifact_prefix):
-    return self.component_function.contentFromResolvedArtifact(artifact_prefix)
+    def __init__(self, component_function):
+        self.component_function = component_function
 
-  def resolve_and_generate_message(self, artifact_mapping, artifact_template):
-    return self.component_function.resolveAndGenerateMessage(artifact_mapping,
-                                                             artifact_template)
+    def resolve_and_generate_message_from_template_prefix(self, artifact_prefix):
+        return ResourceResolutionExtensionsKt.contentFromResolvedArtifact(self.component_function, artifact_prefix)
 
-  def retrieve_resolved_template_from_database(self, key, artifact_template):
-    return self.component_function.storedContentFromResolvedArtifact(key, artifact_template)
+    def retrieve_resolved_template_from_database(self, key, artifact_template):
+        return ResourceResolutionExtensionsKt.storedContentFromResolvedArtifact(self.component_function, key,
+                                                                                artifact_template)
index e263ba8..a942845 100644 (file)
@@ -1,62 +1,62 @@
 from netconf_constant import CONFIG_TARGET_RUNNING, CONFIG_TARGET_CANDIDATE, \
-  CONFIG_DEFAULT_OPERATION_REPLACE
+    CONFIG_DEFAULT_OPERATION_REPLACE
+from org.onap.ccsdk.cds.blueprintsprocessor.functions.netconf.executor import NetconfExecutorExtensionsKt
 
 
 class NetconfClient:
 
-  def __init__(self, log, component_function, requirement_name):
-    self.log = log
-    self.component_function = component_function
-    netconf_device = self.component_function.initializeNetconfConnection(
-        requirement_name)
-    self.netconf_rpc_client = netconf_device.netconfRpcService
-    self.netconf_session = netconf_device.netconfSession
-
-  def disconnect(self):
-    self.netconf_session.disconnect()
-    return
-
-  def connect(self):
-    self.netconf_session.connect()
-    return
-
-  def lock(self, config_target=CONFIG_TARGET_CANDIDATE):
-    device_response = self.netconf_rpc_client.lock(config_target)
-    return device_response
-
-  def get_config(self, filter="", config_target=CONFIG_TARGET_RUNNING):
-    device_response = self.netconf_rpc_client.getConfig(filter, config_target)
-    return device_response
-
-  def edit_config(self, message_content, config_target=CONFIG_TARGET_CANDIDATE,
-      edit_default_peration=CONFIG_DEFAULT_OPERATION_REPLACE):
-    device_response = self.netconf_rpc_client.editConfig(message_content,
-                                                         config_target,
-                                                         edit_default_peration)
-    return device_response
-
-  def commit(self, confirmed=False, confirm_timeout=60, persist="",
-      persist_id=""):
-    device_response = self.netconf_rpc_client.commit(confirmed, confirm_timeout,
-                                                     persist, persist_id)
-    return device_response
-
-  def invoke_rpc(self, rpc):
-    device_response = self.netconf_rpc_client.invokeRpc(rpc)
-    return device_response
-
-  def cancel_commit(self, persist_id=""):
-    device_response = self.netconf_rpc_client.cancelCommit(persist_id)
-    return device_response
-
-  def unlock(self, config_target=CONFIG_TARGET_CANDIDATE):
-    device_response = self.netconf_rpc_client.unLock(config_target)
-    return device_response
-
-  def validate(self, config_target=CONFIG_TARGET_CANDIDATE):
-    device_response = self.netconf_rpc_client.validate(config_target)
-    return device_response
-
-  def discard_change(self):
-    device_response = self.netconf_rpc_client.discardConfig()
-    return device_response
+    def __init__(self, log, component_function, requirement_name):
+        self.log = log
+        self.component_function = component_function
+        netconf_device = NetconfExecutorExtensionsKt.netconfDevice(component_function, requirement_name)
+        self.netconf_rpc_client = netconf_device.netconfRpcService
+        self.netconf_session = netconf_device.netconfSession
+
+    def disconnect(self):
+        self.netconf_session.disconnect()
+        return
+
+    def connect(self):
+        self.netconf_session.connect()
+        return
+
+    def lock(self, config_target=CONFIG_TARGET_CANDIDATE):
+        device_response = self.netconf_rpc_client.lock(config_target)
+        return device_response
+
+    def get_config(self, filter="", config_target=CONFIG_TARGET_RUNNING):
+        device_response = self.netconf_rpc_client.getConfig(filter, config_target)
+        return device_response
+
+    def edit_config(self, message_content, config_target=CONFIG_TARGET_CANDIDATE,
+                    edit_default_peration=CONFIG_DEFAULT_OPERATION_REPLACE):
+        device_response = self.netconf_rpc_client.editConfig(message_content,
+                                                             config_target,
+                                                             edit_default_peration)
+        return device_response
+
+    def commit(self, confirmed=False, confirm_timeout=60, persist="",
+               persist_id=""):
+        device_response = self.netconf_rpc_client.commit(confirmed, confirm_timeout,
+                                                         persist, persist_id)
+        return device_response
+
+    def invoke_rpc(self, rpc):
+        device_response = self.netconf_rpc_client.invokeRpc(rpc)
+        return device_response
+
+    def cancel_commit(self, persist_id=""):
+        device_response = self.netconf_rpc_client.cancelCommit(persist_id)
+        return device_response
+
+    def unlock(self, config_target=CONFIG_TARGET_CANDIDATE):
+        device_response = self.netconf_rpc_client.unLock(config_target)
+        return device_response
+
+    def validate(self, config_target=CONFIG_TARGET_CANDIDATE):
+        device_response = self.netconf_rpc_client.validate(config_target)
+        return device_response
+
+    def discard_change(self):
+        device_response = self.netconf_rpc_client.discardConfig()
+        return device_response
index 663daf5..cdee390 100644 (file)
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
 import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.ResourceResolutionConstants
 import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractComponentFunction
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
 import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.ComponentFunctionScriptingService
 import org.onap.ccsdk.cds.controllerblueprints.core.getAsString
 import org.springframework.beans.factory.config.ConfigurableBeanFactory
@@ -39,7 +40,7 @@ open class ComponentNetconfExecutor(private var componentFunctionScriptingServic
         const val INSTANCE_DEPENDENCIES = "instance-dependencies"
     }
 
-    lateinit var scriptComponent: NetconfComponentFunction
+    lateinit var scriptComponent: AbstractScriptComponentFunction
 
     override suspend fun processNB(executionRequest: ExecutionServiceInput) {
 
@@ -54,8 +55,9 @@ open class ComponentNetconfExecutor(private var componentFunctionScriptingServic
             scriptDependencies.add(instanceName.textValue())
         }
 
-        scriptComponent = componentFunctionScriptingService.scriptInstance<NetconfComponentFunction>(this, scriptType,
-                scriptClassReference, scriptDependencies)
+        scriptComponent = componentFunctionScriptingService
+                .scriptInstance<AbstractScriptComponentFunction>(this, scriptType,
+                        scriptClassReference, scriptDependencies)
 
 
         checkNotNull(scriptComponent) { "failed to get netconf script component" }
index 575117b..8a08268 100644 (file)
@@ -26,7 +26,7 @@ import org.junit.runner.RunWith
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
 import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.StepData
 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
-import org.onap.ccsdk.cds.controllerblueprints.core.asJsonNode
+import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
 import org.onap.ccsdk.cds.controllerblueprints.core.putJsonElement
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
@@ -61,8 +61,21 @@ class ComponentNetconfExecutorTest {
             val bluePrintRuntimeService = BluePrintMetadataUtils.getBluePrintRuntime("1234",
                     "./../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration")
 
-            val executionContext = bluePrintRuntimeService.getExecutionContext()
+            val assignmentParams = "{\n" +
+                    "            \"ipAddress\": \"127.0.0.1\",\n" +
+                    "            \"hostName\": \"vnf-host\"\n" +
+                    "          }"
+
+            val json = """{
+                "hostname" : "127.0.0.1"
+                }                
+            """.trimIndent()
 
+            bluePrintRuntimeService.assignInputs(json.asJsonType())
+            bluePrintRuntimeService.setNodeTemplateAttributeValue("resource-assignment", "assignment-params",
+                    JacksonUtils.jsonNode(assignmentParams))
+
+            val executionContext = bluePrintRuntimeService.getExecutionContext()
 
             componentNetconfExecutor.bluePrintRuntimeService = bluePrintRuntimeService
 
index 938affc..3140657 100644 (file)
@@ -62,30 +62,29 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
                                          private var templateResolutionDBService: TemplateResolutionService,
                                          private var blueprintTemplateService: BluePrintTemplateService,
                                          private var resourceResolutionDBService: ResourceResolutionDBService) :
-    ResourceResolutionService {
+        ResourceResolutionService {
 
     private val log = LoggerFactory.getLogger(ResourceResolutionService::class.java)
 
     override fun registeredResourceSources(): List<String> {
         return applicationContext.getBeanNamesForType(ResourceAssignmentProcessor::class.java)
-            .filter { it.startsWith(ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR) }
-            .map { it.substringAfter(ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR) }
+                .filter { it.startsWith(ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR) }
+                .map { it.substringAfter(ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR) }
     }
 
     override suspend fun resolveFromDatabase(bluePrintRuntimeService: BluePrintRuntimeService<*>,
                                              artifactTemplate: String,
                                              resolutionKey: String): String {
         return templateResolutionDBService.findByResolutionKeyAndBlueprintNameAndBlueprintVersionAndArtifactName(
-            bluePrintRuntimeService,
-            artifactTemplate,
-            resolutionKey)
+                bluePrintRuntimeService,
+                artifactTemplate,
+                resolutionKey)
     }
 
     override suspend fun resolveResources(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTemplateName: String,
                                           artifactNames: List<String>,
                                           properties: Map<String, Any>): MutableMap<String, JsonNode> {
 
-
         val resourceAssignmentRuntimeService =
             ResourceAssignmentUtils.transformToRARuntimeService(bluePrintRuntimeService, artifactNames.toString())
 
@@ -95,7 +94,6 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
                 artifactName, properties)
 
             resolvedParams[artifactName] = resolvedContent.asJsonType()
-
         }
         return resolvedParams
     }
@@ -113,12 +111,12 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
         log.info("Resolving resource for template artifact($artifactTemplate) with resource assignment artifact($artifactMapping)")
 
         val resourceAssignmentContent =
-            bluePrintRuntimeService.resolveNodeTemplateArtifact(nodeTemplateName, artifactMapping)
+                bluePrintRuntimeService.resolveNodeTemplateArtifact(nodeTemplateName, artifactMapping)
 
         val resourceAssignments: MutableList<ResourceAssignment> =
-            JacksonUtils.getListFromJson(resourceAssignmentContent, ResourceAssignment::class.java)
-                    as? MutableList<ResourceAssignment>
-                ?: throw BluePrintProcessorException("couldn't get Dictionary Definitions")
+                JacksonUtils.getListFromJson(resourceAssignmentContent, ResourceAssignment::class.java)
+                        as? MutableList<ResourceAssignment>
+                        ?: throw BluePrintProcessorException("couldn't get Dictionary Definitions")
 
         if (isToStore(properties)) {
             val existingResourceResolution = isNewResolution(bluePrintRuntimeService, properties, artifactPrefix)
@@ -129,20 +127,20 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
 
         // Get the Resource Dictionary Name
         val resourceDefinitions: MutableMap<String, ResourceDefinition> = ResourceAssignmentUtils
-            .resourceDefinitions(bluePrintRuntimeService.bluePrintContext().rootPath)
+                .resourceDefinitions(bluePrintRuntimeService.bluePrintContext().rootPath)
 
         // Resolve resources
         resolveResourceAssignments(bluePrintRuntimeService,
-            resourceDefinitions,
-            resourceAssignments,
-            artifactPrefix,
-            properties)
+                resourceDefinitions,
+                resourceAssignments,
+                artifactPrefix,
+                properties)
 
         val resolvedParamJsonContent =
-            ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments.toList())
+                ResourceAssignmentUtils.generateResourceDataForAssignments(resourceAssignments.toList())
 
         resolvedContent = blueprintTemplateService.generateContent(bluePrintRuntimeService, nodeTemplateName,
-            artifactTemplate, resolvedParamJsonContent)
+                artifactTemplate, resolvedParamJsonContent)
 
         if (isToStore(properties)) {
             templateResolutionDBService.write(properties, resolvedContent, bluePrintRuntimeService, artifactPrefix)
@@ -164,49 +162,56 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
                                                     properties: Map<String, Any>) {
 
         val bulkSequenced = BulkResourceSequencingUtils.process(resourceAssignments)
-        val resourceAssignmentRuntimeService = blueprintRuntimeService as ResourceAssignmentRuntimeService
+
+        // Check the BlueprintRuntime Service Should be ResourceAssignmentRuntimeService
+        val resourceAssignmentRuntimeService = if (!(blueprintRuntimeService is ResourceAssignmentRuntimeService)) {
+            ResourceAssignmentUtils.transformToRARuntimeService(blueprintRuntimeService, artifactPrefix)
+        } else {
+            blueprintRuntimeService
+        }
+
 
         coroutineScope {
             bulkSequenced.forEach { batchResourceAssignments ->
                 // Execute Non Dependent Assignments in parallel ( ie asynchronously )
                 val deferred = batchResourceAssignments
-                    .filter { it.name != "*" && it.name != "start" }
-                    .filter { it.status != BluePrintConstants.STATUS_SUCCESS }
-                    .map { resourceAssignment ->
-                        async {
-                            val dictionaryName = resourceAssignment.dictionaryName
-                            val dictionarySource = resourceAssignment.dictionarySource
-
-                            val processorName = processorName(dictionaryName!!, dictionarySource!!, resourceDefinitions)
-
-                            val resourceAssignmentProcessor =
-                                applicationContext.getBean(processorName) as? ResourceAssignmentProcessor
-                                    ?: throw BluePrintProcessorException("failed to get resource processor ($processorName) " +
-                                            "for resource assignment(${resourceAssignment.name})")
-                            try {
-                                // Set BluePrint Runtime Service
-                                resourceAssignmentProcessor.raRuntimeService = resourceAssignmentRuntimeService
-                                // Set Resource Dictionaries
-                                resourceAssignmentProcessor.resourceDictionaries = resourceDefinitions
-                                // Invoke Apply Method
-                                resourceAssignmentProcessor.applyNB(resourceAssignment)
-
-                                if (isToStore(properties)) {
-                                    resourceResolutionDBService.write(properties,
-                                        blueprintRuntimeService,
-                                        artifactPrefix,
-                                        resourceAssignment)
-                                    log.info("Resource resolution saved into database successfully : ($resourceAssignment)")
+                        .filter { it.name != "*" && it.name != "start" }
+                        .filter { it.status != BluePrintConstants.STATUS_SUCCESS }
+                        .map { resourceAssignment ->
+                            async {
+                                val dictionaryName = resourceAssignment.dictionaryName
+                                val dictionarySource = resourceAssignment.dictionarySource
+
+                                val processorName = processorName(dictionaryName!!, dictionarySource!!, resourceDefinitions)
+
+                                val resourceAssignmentProcessor =
+                                        applicationContext.getBean(processorName) as? ResourceAssignmentProcessor
+                                                ?: throw BluePrintProcessorException("failed to get resource processor ($processorName) " +
+                                                        "for resource assignment(${resourceAssignment.name})")
+                                try {
+                                    // Set BluePrint Runtime Service
+                                    resourceAssignmentProcessor.raRuntimeService = resourceAssignmentRuntimeService
+                                    // Set Resource Dictionaries
+                                    resourceAssignmentProcessor.resourceDictionaries = resourceDefinitions
+                                    // Invoke Apply Method
+                                    resourceAssignmentProcessor.applyNB(resourceAssignment)
+
+                                    if (isToStore(properties)) {
+                                        resourceResolutionDBService.write(properties,
+                                                blueprintRuntimeService,
+                                                artifactPrefix,
+                                                resourceAssignment)
+                                        log.info("Resource resolution saved into database successfully : ($resourceAssignment)")
+                                    }
+
+                                    // Set errors from RA
+                                    blueprintRuntimeService.setBluePrintError(resourceAssignmentRuntimeService.getBluePrintError())
+                                } catch (e: RuntimeException) {
+                                    log.error("Fail in processing ${resourceAssignment.name}", e)
+                                    throw BluePrintProcessorException(e)
                                 }
-
-                                // Set errors from RA
-                                blueprintRuntimeService.setBluePrintError(resourceAssignmentRuntimeService.getBluePrintError())
-                            } catch (e: RuntimeException) {
-                                log.error("Fail in processing ${resourceAssignment.name}", e)
-                                throw BluePrintProcessorException(e)
                             }
                         }
-                    }
                 log.debug("Resolving (${deferred.size})resources parallel.")
                 deferred.awaitAll()
             }
@@ -229,10 +234,10 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
             }
             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)
             }
@@ -262,25 +267,25 @@ open class ResourceResolutionServiceImpl(private var applicationContext: Applica
 
         if (resolutionKey.isNotEmpty()) {
             val existingResourceAssignments =
-                resourceResolutionDBService.findByBlueprintNameAndBlueprintVersionAndArtifactNameAndResolutionKeyAndOccurrence(
-                    bluePrintRuntimeService,
-                    resolutionKey,
-                    occurrence,
-                    artifactPrefix)
+                    resourceResolutionDBService.findByBlueprintNameAndBlueprintVersionAndArtifactNameAndResolutionKeyAndOccurrence(
+                            bluePrintRuntimeService,
+                            resolutionKey,
+                            occurrence,
+                            artifactPrefix)
             if (existingResourceAssignments.isNotEmpty()) {
                 log.info("Resolution with resolutionKey=($resolutionKey) already exist - will resolve all resources not already resolved.",
-                    resolutionKey)
+                        resolutionKey)
             }
             return existingResourceAssignments
         } else if (resourceId.isNotEmpty() && resourceType.isNotEmpty()) {
             val existingResourceAssignments =
-                resourceResolutionDBService.findByBlueprintNameAndBlueprintVersionAndArtifactNameAndResourceIdAndResourceTypeAndOccurrence(
-                    bluePrintRuntimeService,
-                    resourceId,
-                    resourceType,
+                    resourceResolutionDBService.findByBlueprintNameAndBlueprintVersionAndArtifactNameAndResourceIdAndResourceTypeAndOccurrence(
+                            bluePrintRuntimeService,
+                            resourceId,
+                            resourceType,
 
-                    occurrence,
-                    artifactPrefix)
+                            occurrence,
+                            artifactPrefix)
             if (existingResourceAssignments.isNotEmpty()) {
                 log.info("Resolution with resourceId=($resourceId) and resourceType=($resourceType) already exist - will resolve " +
                         "all resources not already resolved.")
index 34a2d9c..2717c3b 100644 (file)
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.node.*
 import org.apache.commons.lang3.ObjectUtils
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
 import org.slf4j.LoggerFactory
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.JsonParserUtils
 import org.slf4j.helpers.MessageFormatter
 import kotlin.reflect.KClass
 
@@ -41,8 +42,8 @@ fun <T : Any> T.bpClone(): T {
 }
 
 fun String.isJson(): Boolean {
-    return ((this.startsWith("{") && this.endsWith("}"))
-            || (this.startsWith("[") && this.endsWith("]")))
+    return ((this.trim().startsWith("{") && this.trim().endsWith("}"))
+            || (this.trim().startsWith("[") && this.trim().endsWith("]")))
 }
 
 fun Any.asJsonString(intend: Boolean? = false): String {
@@ -263,4 +264,16 @@ inline fun <reified T : JsonNode> T.isComplexType(): Boolean {
     return this is ObjectNode || this is ArrayNode
 }
 
+// Json Parsing Extensions
+fun JsonNode.jsonPathParse(expression: String): JsonNode {
+    check(this.isComplexType()) { "$this is not complex or array node to apply expression" }
+    return JsonParserUtils.parse(this, expression)
+}
+
+// Json Path Extensions
+fun JsonNode.jsonPaths(expression: String): List<String> {
+    check(this.isComplexType()) { "$this is not complex or array node to apply expression" }
+    return JsonParserUtils.paths(this, expression)
+}
+
 
index 30bd75f..e5788a9 100644 (file)
@@ -24,7 +24,6 @@ import com.fasterxml.jackson.databind.node.NullNode
 import org.onap.ccsdk.cds.controllerblueprints.core.*
 import org.onap.ccsdk.cds.controllerblueprints.core.data.*
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
-import org.onap.ccsdk.cds.controllerblueprints.core.utils.JsonParserUtils
 import org.onap.ccsdk.cds.controllerblueprints.core.utils.ResourceResolverUtils
 
 /**
@@ -141,7 +140,7 @@ If Property Assignment is Expression.
         }
         if (subAttributeName != null) {
             if (valueNode.isComplexType())
-                valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subAttributeName)
+                valueNode = valueNode.jsonPathParse(subAttributeName)
         }
         return valueNode
     }
@@ -174,7 +173,7 @@ If Property Assignment is Expression.
 
         if (subPropertyName != null) {
             if (valueNode.isComplexType())
-                valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subPropertyName)
+                valueNode = valueNode.jsonPathParse(subPropertyName)
         }
         return valueNode
     }
@@ -195,7 +194,7 @@ If Property Assignment is Expression.
         val subPropertyName: String? = operationOutputExpression.subPropertyName
         if (subPropertyName != null) {
             if (valueNode.isComplexType())
-                valueNode = JsonParserUtils.parse(valueNode.asJsonString(), subPropertyName)
+                valueNode = valueNode.jsonPathParse(subPropertyName)
         }
         return valueNode
     }
index e5eef5a..19686b5 100644 (file)
@@ -24,6 +24,7 @@ import com.jayway.jsonpath.JsonPath
 import com.jayway.jsonpath.Option
 import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider
 import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider
+import org.onap.ccsdk.cds.controllerblueprints.core.asJsonString
 
 class JsonParserUtils {
     companion object {
@@ -39,7 +40,7 @@ class JsonParserUtils {
         }
 
         fun paths(jsonNode: JsonNode, expression: String): List<String> {
-            return paths(jsonNode, expression)
+            return paths(jsonNode.asJsonString(), expression)
         }
 
         fun parse(jsonContent: String, expression: String): JsonNode {
@@ -47,7 +48,7 @@ class JsonParserUtils {
         }
 
         fun parse(jsonNode: JsonNode, expression: String): JsonNode {
-            return parse(jsonNode.toString(), expression)
+            return parse(jsonNode.asJsonString(), expression)
         }
 
         fun parseNSet(jsonContent: String, expression: String, value: JsonNode): JsonNode {
@@ -56,7 +57,7 @@ class JsonParserUtils {
 
         fun parseNSet(jsonNode: JsonNode, expression: String, valueNode: JsonNode): JsonNode {
 
-            return parseNSet(jsonNode, expression, valueNode)
+            return parseNSet(jsonNode.asJsonString(), expression, valueNode)
         }
     }
 }
\ No newline at end of file
index 9728a22..810dae7 100644 (file)
@@ -18,6 +18,9 @@ package org.onap.ccsdk.cds.controllerblueprints.core.utils
 
 import org.junit.Test
 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
+import org.onap.ccsdk.cds.controllerblueprints.core.jsonAsJsonType
+import org.onap.ccsdk.cds.controllerblueprints.core.jsonPathParse
+import org.onap.ccsdk.cds.controllerblueprints.core.jsonPaths
 import kotlin.test.assertEquals
 
 class JsonParserUtilsTest {
@@ -26,8 +29,29 @@ class JsonParserUtilsTest {
     fun `test parse Node`() {
         val dataNode = JacksonUtils.jsonNodeFromClassPathFile("data/default-context.json")
 
-        val parsedNode = JsonParserUtils.parse(dataNode, "$.request-id")
+        val parsedNode = dataNode.jsonPathParse("$.request-id")
 
         assertEquals(parsedNode, "12345".asJsonPrimitive(), "failed to parse json request-id")
     }
+
+    @Test
+    fun testPaths() {
+        val json: String = """
+            {
+                "data" : {
+                "prop1" : "1234"
+                },
+                 "data2" : {
+                "prop1" : "12345"
+                },
+                "data3" : [{
+                "prop1" : "12345"
+                }
+                ]
+            }
+        """.trimIndent()
+        val jsonNode = json.jsonAsJsonType()
+        val parsedPath = jsonNode.jsonPaths("$..prop1")
+        println(parsedPath)
+    }
 }
\ No newline at end of file