From: Brinda Santh Date: Thu, 18 Jul 2019 20:59:19 +0000 (-0400) Subject: Refactor Netconf script component parent. X-Git-Tag: 0.5.0~28^2 X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=a0140dea9c608d745767574ac621ca0060a2bddc;p=ccsdk%2Fcds.git Refactor Netconf script component parent. Change-Id: Ibbec8cd5785372a89e14a86d4e6ff7f9fed4aad2 Issue-ID: CCSDK-1499 Signed-off-by: Brinda Santh Signed-off-by: Steve Siani --- diff --git a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py index f146e8123..2fd6c6659 100644 --- a/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py +++ b/components/model-catalog/blueprint-model/test-blueprint/baseconfiguration/Scripts/python/NetconfRpcExample.py @@ -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 diff --git a/components/scripts/python/ccsdk_netconf/common.py b/components/scripts/python/ccsdk_netconf/common.py index 896fb9128..f7ac1ac35 100644 --- a/components/scripts/python/ccsdk_netconf/common.py +++ b/components/scripts/python/ccsdk_netconf/common.py @@ -12,18 +12,17 @@ # 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) diff --git a/components/scripts/python/ccsdk_netconf/netconfclient.py b/components/scripts/python/ccsdk_netconf/netconfclient.py index e263ba8f7..a942845b9 100644 --- a/components/scripts/python/ccsdk_netconf/netconfclient.py +++ b/components/scripts/python/ccsdk_netconf/netconfclient.py @@ -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 diff --git a/ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/ScriptComponentExtensions.kt b/ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/CliExecutorExtensions.kt similarity index 92% rename from ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/ScriptComponentExtensions.kt rename to ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/CliExecutorExtensions.kt index 81f1fd821..bc9b7103c 100644 --- a/ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/ScriptComponentExtensions.kt +++ b/ms/blueprintsprocessor/functions/cli-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/cli/executor/CliExecutorExtensions.kt @@ -1,5 +1,6 @@ /* * Copyright © 2019 IBM. + * Modifications Copyright © 2018-2019 IBM, Bell Canada * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutor.kt b/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutor.kt index 663daf54e..cdee3903b 100644 --- a/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutor.kt +++ b/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutor.kt @@ -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(this, scriptType, - scriptClassReference, scriptDependencies) + scriptComponent = componentFunctionScriptingService + .scriptInstance(this, scriptType, + scriptClassReference, scriptDependencies) checkNotNull(scriptComponent) { "failed to get netconf script component" } diff --git a/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ScriptComponentExtensions.kt b/ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/NetconfExecutorExtensions.kt similarity index 100% rename from ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ScriptComponentExtensions.kt rename to ms/blueprintsprocessor/functions/netconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/NetconfExecutorExtensions.kt diff --git a/ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutorTest.kt b/ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutorTest.kt index 575117b15..8a08268d8 100644 --- a/ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutorTest.kt +++ b/ms/blueprintsprocessor/functions/netconf-executor/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/netconf/executor/ComponentNetconfExecutorTest.kt @@ -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 diff --git a/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ScriptComponentExtensions.kt b/ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionExtensions.kt similarity index 100% rename from ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ScriptComponentExtensions.kt rename to ms/blueprintsprocessor/functions/resource-resolution/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/resource/resolution/ResourceResolutionExtensions.kt 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 938affc82..314065763 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 @@ -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 { 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, properties: Map): MutableMap { - 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 = - JacksonUtils.getListFromJson(resourceAssignmentContent, ResourceAssignment::class.java) - as? MutableList - ?: throw BluePrintProcessorException("couldn't get Dictionary Definitions") + JacksonUtils.getListFromJson(resourceAssignmentContent, ResourceAssignment::class.java) + as? MutableList + ?: 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 = 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) { 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.") diff --git a/ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/ScriptComponentExtensions.kt b/ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/RestconfExecutorExtensions.kt similarity index 93% rename from ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/ScriptComponentExtensions.kt rename to ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/RestconfExecutorExtensions.kt index 9fc685e19..6e0c3b612 100644 --- a/ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/ScriptComponentExtensions.kt +++ b/ms/blueprintsprocessor/functions/restconf-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/restconf/executor/RestconfExecutorExtensions.kt @@ -1,5 +1,6 @@ /* * Copyright © 2019 IBM. + * Modifications Copyright © 2018-2019 IBM, Bell Canada * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt index 34a2d9cd3..2717c3be9 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt @@ -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.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 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 { + check(this.isComplexType()) { "$this is not complex or array node to apply expression" } + return JsonParserUtils.paths(this, expression) +} + diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/PropertyAssignmentService.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/PropertyAssignmentService.kt index 30bd75f7d..e5788a936 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/PropertyAssignmentService.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/PropertyAssignmentService.kt @@ -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 } diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtils.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtils.kt index e5eef5a41..19686b5df 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtils.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtils.kt @@ -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 { - 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 diff --git a/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtilsTest.kt b/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtilsTest.kt index 9728a2255..810dae738 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtilsTest.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/JsonParserUtilsTest.kt @@ -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