summaryrefslogtreecommitdiffstats
path: root/ms
diff options
context:
space:
mode:
authorDan Timoney <dtimoney@att.com>2019-04-18 00:48:36 +0000
committerGerrit Code Review <gerrit@onap.org>2019-04-18 00:48:36 +0000
commitfd1b737ed86163f20edaf606e28357025cc63e28 (patch)
tree36dbfe0dd42df05b3873c406fd7eac1f03d78405 /ms
parentf7433a4e44ab353cb839c6fe4d12fcec0c1e3edc (diff)
parent065e76a7e3d9cf968fbbf456203ce0657a45fa2c (diff)
Merge "Add remote python executor"
Diffstat (limited to 'ms')
-rw-r--r--ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt101
-rw-r--r--ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/api/data/BlueprintRemoteProcessorData.kt45
-rw-r--r--ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/RemoteScriptExecutionService.kt27
3 files changed, 173 insertions, 0 deletions
diff --git a/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt b/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt
new file mode 100644
index 000000000..1620b6de0
--- /dev/null
+++ b/ms/blueprintsprocessor/functions/python-executor/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/functions/python/executor/ComponentRemotePythonExecutor.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.functions.python.executor
+
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.*
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractComponentFunction
+import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.RemoteScriptExecutionService
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.onap.ccsdk.cds.controllerblueprints.core.checkFileExists
+import org.onap.ccsdk.cds.controllerblueprints.core.checkNotBlank
+import org.onap.ccsdk.cds.controllerblueprints.core.data.OperationAssignment
+import org.onap.ccsdk.cds.controllerblueprints.core.normalizedFile
+import org.slf4j.LoggerFactory
+import org.springframework.beans.factory.config.ConfigurableBeanFactory
+import org.springframework.context.annotation.Scope
+import org.springframework.stereotype.Component
+
+
+@Component("component-remote-python-executor")
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+open class ComponentRemotePythonExecutor(private val remoteScriptExecutionService: RemoteScriptExecutionService)
+ : AbstractComponentFunction() {
+
+ private val log = LoggerFactory.getLogger(ComponentRemotePythonExecutor::class.java)
+
+ companion object {
+ const val INPUT_ENDPOINT_SELECTOR = "endpoint-selector"
+ const val INPUT_DYNAMIC_PROPERTIES = "dynamic-properties"
+ }
+
+ override suspend fun processNB(executionRequest: ExecutionServiceInput) {
+
+ log.info("Processing : $operationInputs")
+
+ val bluePrintContext = bluePrintRuntimeService.bluePrintContext()
+ val blueprintName = bluePrintContext.name()
+ val blueprintVersion = bluePrintContext.version()
+
+ val operationAssignment: OperationAssignment = bluePrintContext
+ .nodeTemplateInterfaceOperation(nodeTemplateName, interfaceName, operationName)
+
+ val artifactName: String = operationAssignment.implementation?.primary
+ ?: throw BluePrintProcessorException("missing primary field to get artifact name for node template ($nodeTemplateName)")
+
+ val artifactDefinition = bluePrintRuntimeService.resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName)
+
+ checkNotBlank(artifactDefinition.file) { "couldn't get python script path($artifactName)" }
+
+ val pythonScript = normalizedFile(bluePrintContext.rootPath, artifactDefinition.file)
+
+ checkFileExists(pythonScript) { "python script(${pythonScript.absolutePath}) doesn't exists" }
+ //TODO ("Get the ENDPOINT SELECTOR and resolve the Remote Server")
+ val endPointSelector = getOperationInput(INPUT_ENDPOINT_SELECTOR)
+ val dynamicProperties = getOperationInput(INPUT_DYNAMIC_PROPERTIES)
+
+ // TODO("Python execution command and Resolve some expressions with dynamic properties")
+ val scriptCommand: String = pythonScript.absolutePath
+
+ val packages = operationAssignment.implementation?.dependencies
+ // If dependencies are defined, then install in remote server
+ if (packages != null && !packages.isEmpty()) {
+ val prepareEnvInput = PrepareRemoteEnvInput(requestId = processId,
+ remoteScriptType = RemoteScriptType.PYTHON,
+ packages = arrayListOf()
+ )
+ val prepareEnvOutput = remoteScriptExecutionService.prepareEnv(prepareEnvInput)
+ checkNotNull(prepareEnvOutput) {
+ "failed to get prepare remote env response for requestId(${prepareEnvInput.requestId})"
+ }
+ }
+
+ val remoteExecutionInput = RemoteScriptExecutionInput(
+ requestId = processId,
+ remoteIdentifier = RemoteIdentifier(blueprintName = blueprintName, blueprintVersion = blueprintVersion),
+ remoteScriptType = RemoteScriptType.PYTHON,
+ command = scriptCommand)
+ val remoteExecutionOutput = remoteScriptExecutionService.executeCommand(remoteExecutionInput)
+ checkNotNull(remoteExecutionOutput) {
+ "failed to get prepare remote command response for requestId(${remoteExecutionOutput.requestId})"
+ }
+ }
+
+ override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) {
+ bluePrintRuntimeService.getBluePrintError()
+ .addError("Failed in ComponentJythonExecutor : ${runtimeException.message}")
+ }
+} \ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/api/data/BlueprintRemoteProcessorData.kt b/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/api/data/BlueprintRemoteProcessorData.kt
new file mode 100644
index 000000000..90eb933f4
--- /dev/null
+++ b/ms/blueprintsprocessor/modules/commons/processor-core/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/core/api/data/BlueprintRemoteProcessorData.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.core.api.data
+
+import com.fasterxml.jackson.databind.JsonNode
+
+enum class RemoteScriptType {
+ PYTHON, ANSIBLE, KOTLIN, SH
+}
+
+data class RemoteIdentifier(var blueprintName: String? = null,
+ var blueprintVersion: String? = null)
+
+
+data class RemoteScriptExecutionInput(var requestId: String,
+ var remoteIdentifier: RemoteIdentifier? = null,
+ var remoteScriptType: RemoteScriptType,
+ var command: String,
+ var timeOut: Long = 30,
+ var properties: MutableMap<String, JsonNode> = hashMapOf()
+)
+
+
+data class RemoteScriptExecutionOutput(var requestId: String, var response: String)
+
+data class PrepareRemoteEnvInput(var requestId: String,
+ var remoteScriptType: RemoteScriptType,
+ var packages: MutableList<String>?,
+ var timeOut: Long = 120,
+ var properties: MutableMap<String, JsonNode> = hashMapOf()
+) \ No newline at end of file
diff --git a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/RemoteScriptExecutionService.kt b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/RemoteScriptExecutionService.kt
new file mode 100644
index 000000000..5d279ce3f
--- /dev/null
+++ b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/RemoteScriptExecutionService.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.
+ */
+
+package org.onap.ccsdk.cds.blueprintsprocessor.services.execution
+
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.PrepareRemoteEnvInput
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.RemoteScriptExecutionInput
+import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.RemoteScriptExecutionOutput
+
+
+interface RemoteScriptExecutionService {
+ suspend fun prepareEnv(prepareEnvInput: PrepareRemoteEnvInput): RemoteScriptExecutionOutput
+ suspend fun executeCommand(remoteExecutionInput: RemoteScriptExecutionInput): RemoteScriptExecutionOutput
+} \ No newline at end of file