import org.onap.ccsdk.apps.blueprintsprocessor.functions.resource.resolution.CapabilityResourceSource
import org.onap.ccsdk.apps.blueprintsprocessor.functions.resource.resolution.ResourceResolutionConstants.PREFIX_RESOURCE_RESOLUTION_PROCESSOR
-import org.onap.ccsdk.apps.blueprintsprocessor.services.execution.scripts.BlueprintJythonService
-import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.apps.blueprintsprocessor.services.execution.ComponentFunctionScriptingService
import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintProcessorException
-import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintScriptsService
import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils
import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment
import org.slf4j.LoggerFactory
import org.springframework.context.ApplicationContext
import org.springframework.context.annotation.Scope
import org.springframework.stereotype.Service
-import java.io.File
@Service("${PREFIX_RESOURCE_RESOLUTION_PROCESSOR}source-capability")
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-open class CapabilityResourceResolutionProcessor(private var applicationContext: ApplicationContext,
- private val bluePrintScriptsService: BluePrintScriptsService,
- private val bluePrintJythonService: BlueprintJythonService) :
- ResourceAssignmentProcessor() {
+open class CapabilityResourceResolutionProcessor(private val applicationContext: ApplicationContext,
+ private var componentFunctionScriptingService: ComponentFunctionScriptingService)
+ : ResourceAssignmentProcessor() {
+
+ private val log = LoggerFactory.getLogger(CapabilityResourceResolutionProcessor::class.java)
+
+ var componentResourceAssignmentProcessor: ResourceAssignmentProcessor? = null
override fun getName(): String {
return "${PREFIX_RESOURCE_RESOLUTION_PROCESSOR}source-capability"
val scriptType = capabilityResourceSourceProperty.scriptType
val scriptClassReference = capabilityResourceSourceProperty.scriptClassReference
+ val instanceDependencies = capabilityResourceSourceProperty.instanceDependencies ?: listOf()
- var componentResourceAssignmentProcessor: ResourceAssignmentProcessor? = null
-
- when (scriptType) {
- BluePrintConstants.SCRIPT_KOTLIN -> {
- componentResourceAssignmentProcessor = getKotlinResourceAssignmentProcessorInstance(scriptClassReference,
- capabilityResourceSourceProperty.instanceDependencies)
- }
- BluePrintConstants.SCRIPT_INTERNAL -> {
- // Initialize Capability Resource Assignment Processor
- componentResourceAssignmentProcessor = applicationContext.getBean(scriptClassReference, ResourceAssignmentProcessor::class.java)
- }
- BluePrintConstants.SCRIPT_JYTHON -> {
- val content = getJythonContent(scriptClassReference)
- componentResourceAssignmentProcessor = getJythonResourceAssignmentProcessorInstance(scriptClassReference,
- content, capabilityResourceSourceProperty.instanceDependencies)
- }
- }
+ componentResourceAssignmentProcessor = scriptInstance(scriptType, scriptClassReference, instanceDependencies)
- checkNotNull(componentResourceAssignmentProcessor) { "failed to get capability resource assignment processor($scriptClassReference)" }
+ checkNotNull(componentResourceAssignmentProcessor) {
+ "failed to get capability resource assignment processor($scriptClassReference)"
+ }
// Assign Current Blueprint runtime and ResourceDictionaries
- componentResourceAssignmentProcessor.raRuntimeService = raRuntimeService
- componentResourceAssignmentProcessor.resourceDictionaries = resourceDictionaries
+ componentResourceAssignmentProcessor!!.raRuntimeService = raRuntimeService
+ componentResourceAssignmentProcessor!!.resourceDictionaries = resourceDictionaries
// Invoke componentResourceAssignmentProcessor
- componentResourceAssignmentProcessor.apply(resourceAssignment)
+ componentResourceAssignmentProcessor!!.apply(resourceAssignment)
}
override fun recover(runtimeException: RuntimeException, resourceAssignment: ResourceAssignment) {
-
- TODO("To Implement")
- }
-
- private fun getKotlinResourceAssignmentProcessorInstance(scriptClassName: String,
- instanceNames: List<String>? = null): ResourceAssignmentProcessor {
- var scriptPropertyInstances: MutableMap<String, Any>? = null
-
- if (instanceNames != null && instanceNames.isNotEmpty()) {
- scriptPropertyInstances = hashMapOf()
- instanceNames.forEach {
- scriptPropertyInstances[it] = applicationContext.getBean(it)
- ?: throw BluePrintProcessorException("couldn't get the dependency instance($it)")
- }
- }
-
- return getKotlinResourceAssignmentProcessorInstance(scriptClassName, scriptPropertyInstances)
-
- }
-
- fun getKotlinResourceAssignmentProcessorInstance(scriptClassName: String,
- scriptPropertyInstances: MutableMap<String, Any>? = null):
- ResourceAssignmentProcessor {
-
- val resourceAssignmentProcessor = bluePrintScriptsService
- .scriptInstance<ResourceAssignmentProcessor>(raRuntimeService.bluePrintContext(),
- scriptClassName, false)
-
- // Add additional Instance
- if (scriptPropertyInstances != null) {
- resourceAssignmentProcessor.scriptPropertyInstances = scriptPropertyInstances
+ log.info("Recovering for : ${resourceAssignment.name} : ${runtimeException.toString()}")
+ if (componentResourceAssignmentProcessor != null) {
+ componentResourceAssignmentProcessor!!.recover(runtimeException, resourceAssignment)
}
-
- return resourceAssignmentProcessor
- }
-
- private fun getJythonContent(instanceName: String): String {
- val absolutePath = raRuntimeService.bluePrintContext().rootPath
- .plus(File.separator)
- .plus(BluePrintConstants.TOSCA_SCRIPTS_JYTHON_DIR)
- .plus(File.separator)
- .plus("$instanceName.py")
-
- return JacksonUtils.getContent(absolutePath)
-
}
- /**
- * getJythonResourceAssignmentProcessorInstance Purpose: prepare the jython
- * executor component as a resource assignment processor
- *
- * @param pythonClassName String
- * @param content String
- * @param dependencyInstances List<String>
- * @return resourceAssignmentProcessor ResourceAssignmentProcessor
- */
- private fun getJythonResourceAssignmentProcessorInstance(pythonClassName: String, content: String,
- dependencyInstances: List<String>?):
- ResourceAssignmentProcessor {
- val jythonContextInstance: MutableMap<String, Any> = hashMapOf()
- jythonContextInstance["log"] = LoggerFactory.getLogger(pythonClassName)
- jythonContextInstance["raRuntimeService"] = raRuntimeService
- dependencyInstances?.forEach { instanceName ->
- jythonContextInstance[instanceName] = applicationContext.getBean(instanceName)
- }
-
- return getJythonResourceAssignmentProcessorInstance(pythonClassName, content, jythonContextInstance)
- }
+ fun scriptInstance(scriptType: String, scriptClassReference: String, instanceDependencies: List<String>)
+ : ResourceAssignmentProcessor {
- fun getJythonResourceAssignmentProcessorInstance(pythonClassName: String, content: String,
- dependencyInstances: MutableMap<String, Any>):
- ResourceAssignmentProcessor {
+ log.info("creating resource resolution of script type($scriptType), reference name($scriptClassReference) and" +
+ "instanceDependencies($instanceDependencies)")
- val resourceAssignmentProcessor = bluePrintJythonService
- .jythonInstance<ResourceAssignmentProcessor>(raRuntimeService.bluePrintContext(), pythonClassName,
- content, dependencyInstances)
+ val scriptComponent = componentFunctionScriptingService
+ .scriptInstance<ResourceAssignmentProcessor>(raRuntimeService.bluePrintContext(), scriptType,
+ scriptClassReference)
- // Add additional Instance
- if (dependencyInstances != null) {
- resourceAssignmentProcessor.scriptPropertyInstances = dependencyInstances
+ instanceDependencies.forEach { instanceDependency ->
+ scriptPropertyInstances[instanceDependency] = applicationContext
+ .getBean(instanceDependency)
}
-
- return resourceAssignmentProcessor
+ return scriptComponent
}
}
\ No newline at end of file