diff options
author | Dan Timoney <dtimoney@att.com> | 2019-04-19 00:10:05 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2019-04-19 00:10:05 +0000 |
commit | eb5c00585a59343e8a186ed5fc3f98b1394b7e37 (patch) | |
tree | c3bf18d42b43d151b66288cbadf312d20feef15b /ms/blueprintsprocessor | |
parent | cdaa0d3851ad758f02163af1a4fc2cfbb19eb9e2 (diff) | |
parent | 6fcfbc12e20e5a853c9204469dac6867b7eb6ccb (diff) |
Merge "Integration Test - Component Executor"
Diffstat (limited to 'ms/blueprintsprocessor')
3 files changed, 52 insertions, 36 deletions
diff --git a/ms/blueprintsprocessor/application/src/main/resources/application.properties b/ms/blueprintsprocessor/application/src/main/resources/application.properties index 57bfdd5d2..e5b1fe58f 100755 --- a/ms/blueprintsprocessor/application/src/main/resources/application.properties +++ b/ms/blueprintsprocessor/application/src/main/resources/application.properties @@ -13,11 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -#logging.level.web=DEBUG - # Web server config -server.port=8080 - blueprintsprocessor.grpcEnable=false blueprintsprocessor.httpPort=8080 blueprintsprocessor.grpcPort=9111 @@ -25,7 +21,8 @@ blueprintsprocessor.grpcPort=9111 # Blueprint Processor File Execution and Handling Properties blueprintsprocessor.blueprintDeployPath=/opt/app/onap/blueprints/deploy blueprintsprocessor.blueprintArchivePath=/opt/app/onap/blueprints/archive -blueprintsprocessor.blueprintWorkingPath=/opt/app/onap/blueprints/work +blueprintsprocessor.blueprintWorkingPath=/opt/app/onap/blueprints/working + # Primary Database Configuration blueprintsprocessor.db.primary.url=jdbc:mysql://db:3306/sdnctl blueprintsprocessor.db.primary.username=sdnctl @@ -54,4 +51,9 @@ blueprintsprocessor.restclient.sdncodl.password=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84v blueprintprocessor.resourceResolution.enabled=true blueprintprocessor.netconfExecutor.enabled=true blueprintprocessor.restConfExecutor.enabled=true -blueprintprocessor.remoteScriptCommand.enabled=false
\ No newline at end of file +blueprintprocessor.remoteScriptCommand.enabled=true + +blueprintsprocessor.grpcclient.remote-python.type=token-auth +blueprintsprocessor.grpcclient.remote-python.host=localhost +blueprintsprocessor.grpcclient.remote-python.port=50051 +blueprintsprocessor.grpcclient.remote-python.token=Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
\ No newline at end of file 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 index feadfbbd4..a243f44bf 100644 --- 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 @@ -20,16 +20,20 @@ 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.ExecutionServiceConstant import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.RemoteScriptExecutionService +import org.onap.ccsdk.cds.controllerblueprints.command.api.ResponseStatus import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException +import org.onap.ccsdk.cds.controllerblueprints.core.asJsonNode 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.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils import org.slf4j.LoggerFactory import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.boot.autoconfigure.condition.ConditionalOnBean import org.springframework.context.annotation.Scope import org.springframework.stereotype.Component +import java.lang.Exception @ConditionalOnBean(name = [ExecutionServiceConstant.SERVICE_GRPC_REMOTE_SCRIPT_EXECUTION]) @Component("component-remote-python-executor") @@ -53,12 +57,13 @@ open class ComponentRemotePythonExecutor(private val remoteScriptExecutionServic val blueprintVersion = bluePrintContext.version() val operationAssignment: OperationAssignment = bluePrintContext - .nodeTemplateInterfaceOperation(nodeTemplateName, interfaceName, operationName) + .nodeTemplateInterfaceOperation(nodeTemplateName, interfaceName, operationName) val artifactName: String = operationAssignment.implementation?.primary - ?: throw BluePrintProcessorException("missing primary field to get artifact name for node template ($nodeTemplateName)") + ?: throw BluePrintProcessorException("missing primary field to get artifact name for node template ($nodeTemplateName)") - val artifactDefinition = bluePrintRuntimeService.resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName) + val artifactDefinition = + bluePrintRuntimeService.resolveNodeTemplateArtifactDefinition(nodeTemplateName, artifactName) checkNotBlank(artifactDefinition.file) { "couldn't get python script path($artifactName)" } @@ -70,7 +75,7 @@ open class ComponentRemotePythonExecutor(private val remoteScriptExecutionServic val dynamicProperties = getOperationInput(INPUT_DYNAMIC_PROPERTIES) // TODO("Python execution command and Resolve some expressions with dynamic properties") - val scriptCommand = "${pythonScript.absolutePath}" + val scriptCommand = pythonScript.absolutePath val dependencies = operationAssignment.implementation?.dependencies @@ -78,34 +83,50 @@ open class ComponentRemotePythonExecutor(private val remoteScriptExecutionServic // Open GRPC Connection remoteScriptExecutionService.init(endPointSelector.asText()) + var executionLogs = "" + // If dependencies are defined, then install in remote server if (dependencies != null && dependencies.isNotEmpty()) { val prepareEnvInput = PrepareRemoteEnvInput(requestId = processId, - remoteScriptType = RemoteScriptType.PYTHON, - packages = dependencies + remoteIdentifier = RemoteIdentifier(blueprintName = blueprintName, + blueprintVersion = blueprintVersion), + remoteScriptType = RemoteScriptType.PYTHON, + packages = dependencies ) val prepareEnvOutput = remoteScriptExecutionService.prepareEnv(prepareEnvInput) - checkNotNull(prepareEnvOutput.status) { + executionLogs = prepareEnvOutput.response + setOutput(executionLogs) + check(prepareEnvOutput.status == StatusType.SUCCESS) { "failed to get prepare remote env response status for requestId(${prepareEnvInput.requestId})" } } val remoteExecutionInput = RemoteScriptExecutionInput( - requestId = processId, - remoteIdentifier = RemoteIdentifier(blueprintName = blueprintName, blueprintVersion = blueprintVersion), - remoteScriptType = RemoteScriptType.PYTHON, - command = scriptCommand) + requestId = processId, + remoteIdentifier = RemoteIdentifier(blueprintName = blueprintName, blueprintVersion = blueprintVersion), + remoteScriptType = RemoteScriptType.PYTHON, + command = scriptCommand) val remoteExecutionOutput = remoteScriptExecutionService.executeCommand(remoteExecutionInput) - checkNotNull(remoteExecutionOutput.status) { + executionLogs += remoteExecutionOutput.response + setOutput(executionLogs) + check(remoteExecutionOutput.status == StatusType.SUCCESS) { "failed to get prepare remote command response status for requestId(${remoteExecutionOutput.requestId})" } + + } catch (e: Exception) { + log.error("", e) } finally { remoteScriptExecutionService.close() } } + private fun setOutput(executionLogs: String) { + bluePrintRuntimeService.setNodeTemplateAttributeValue(nodeTemplateName, + "execution-logs", JacksonUtils.jsonNodeFromObject(executionLogs)) + } + override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) { bluePrintRuntimeService.getBluePrintError() - .addError("Failed in ComponentJythonExecutor : ${runtimeException.message}") + .addError("Failed in ComponentJythonExecutor : ${runtimeException.message}") } }
\ 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 index 46969b1c5..7db5f52a4 100644 --- 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 @@ -48,8 +48,8 @@ class GrpcRemoteScriptExecutionService(private val bluePrintGrpcLibPropertyServi private val log = LoggerFactory.getLogger(GrpcRemoteScriptExecutionService::class.java)!! - lateinit var channel: ManagedChannel - lateinit var commandExecutorServiceGrpc: CommandExecutorServiceGrpc.CommandExecutorServiceFutureStub + private var channel: ManagedChannel? = null + private lateinit var commandExecutorServiceGrpc: CommandExecutorServiceGrpc.CommandExecutorServiceFutureStub override suspend fun init(selector: String) { // Get the GRPC Client Service based on selector @@ -94,10 +94,7 @@ class GrpcRemoteScriptExecutionService(private val bluePrintGrpcLibPropertyServi } override suspend fun close() { - // TODO('Verify the correct way to close the client conncetion") - if (channel != null) { - channel.shutdownNow() - } + channel?.shutdownNow() } @@ -105,7 +102,7 @@ class GrpcRemoteScriptExecutionService(private val bluePrintGrpcLibPropertyServi val correlationId = this.correlationId ?: this.requestId return PrepareEnvInput.newBuilder() - .setIdentifiers(this.remoteIdentifier.asGrpcData()) + .setIdentifiers(this.remoteIdentifier!!.asGrpcData()) .setRequestId(this.requestId) .setCorrelationId(correlationId) .setScriptType(ScriptType.valueOf(this.remoteScriptType.name)) @@ -120,7 +117,7 @@ class GrpcRemoteScriptExecutionService(private val bluePrintGrpcLibPropertyServi return ExecutionInput.newBuilder() .setRequestId(this.requestId) .setCorrelationId(correlationId) - .setIdentifiers(this.remoteIdentifier.asGrpcData()) + .setIdentifiers(this.remoteIdentifier!!.asGrpcData()) .setScriptType(ScriptType.valueOf(this.remoteScriptType.name)) .setCommand(this.command) .setTimeOut(this.timeOut.toInt()) @@ -129,15 +126,11 @@ class GrpcRemoteScriptExecutionService(private val bluePrintGrpcLibPropertyServi .build() } - fun RemoteIdentifier?.asGrpcData(): Identifiers? { - return if (this != null) { - Identifiers.newBuilder() - .setBlueprintName(this.blueprintName) - .setBlueprintVersion(this.blueprintVersion) - .build() - } else { - null - } + fun RemoteIdentifier.asGrpcData(): Identifiers? { + return Identifiers.newBuilder() + .setBlueprintName(this.blueprintName) + .setBlueprintVersion(this.blueprintVersion) + .build() } fun Map<String, JsonNode>.asGrpcData(): Struct { |