summaryrefslogtreecommitdiffstats
path: root/ms/blueprintsprocessor
diff options
context:
space:
mode:
authorBrinda Santh <brindasanth@in.ibm.com>2019-04-10 14:05:29 -0400
committerAlexis de Talhouët <adetalhouet89@gmail.com>2019-04-16 10:38:50 -0400
commit065e76a7e3d9cf968fbbf456203ce0657a45fa2c (patch)
treef97035ab42955079b30bdda03d819af1e659fc61 /ms/blueprintsprocessor
parent36912896599b4275960a0278f60857203bb41620 (diff)
Add remote python executor
Change-Id: I288e182847f250c8e26e9bc10b8f3124afc2f583 Issue-ID: CCSDK-1215 Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
Diffstat (limited to 'ms/blueprintsprocessor')
-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