From 88e24883c8e22711062ad451250ff7e3646485b3 Mon Sep 17 00:00:00 2001 From: Brinda Santh Date: Wed, 24 Jul 2019 22:34:39 -0400 Subject: Fix attribute validation for complex type. Change-Id: I7a3365c4c26fd44ed0b54bff115b64c52ee7b81e Issue-ID: CCSDK-1046 Signed-off-by: Brinda Santh --- .../ssh/service/BluePrintSshLibPropertyService.kt | 3 +- .../services/execution/ComponentScriptExecutor.kt | 110 ++++++++++++++++++++- 2 files changed, 107 insertions(+), 6 deletions(-) (limited to 'ms/blueprintsprocessor') diff --git a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt index 1950b71aa..829fdda8e 100644 --- a/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt +++ b/ms/blueprintsprocessor/modules/commons/ssh-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/ssh/service/BluePrintSshLibPropertyService.kt @@ -52,7 +52,8 @@ open class BluePrintSshLibPropertyService(private var bluePrintProperties: BlueP } fun sshClientProperties(jsonNode: JsonNode): SshClientProperties { - val type = jsonNode.get("type").textValue() + val type = jsonNode.get("type")?.textValue() + ?: throw BluePrintProcessorException("missing type field in ssh client properties") return when (type) { SshLibConstants.TYPE_BASIC_AUTH -> { JacksonUtils.readValue(jsonNode, diff --git a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/ComponentScriptExecutor.kt b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/ComponentScriptExecutor.kt index b5dac5a39..95b2afc4c 100644 --- a/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/ComponentScriptExecutor.kt +++ b/ms/blueprintsprocessor/modules/services/execution-service/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/services/execution/ComponentScriptExecutor.kt @@ -16,13 +16,16 @@ package org.onap.ccsdk.cds.blueprintsprocessor.services.execution +import com.fasterxml.jackson.databind.JsonNode import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput -import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants -import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintTypes -import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive +import org.onap.ccsdk.cds.controllerblueprints.core.* +import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactDefinition +import org.onap.ccsdk.cds.controllerblueprints.core.data.Implementation +import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeType +import org.onap.ccsdk.cds.controllerblueprints.core.dsl.ArtifactDefinitionBuilder +import org.onap.ccsdk.cds.controllerblueprints.core.dsl.nodeTemplate import org.onap.ccsdk.cds.controllerblueprints.core.dsl.nodeType -import org.onap.ccsdk.cds.controllerblueprints.core.getAsString import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.context.annotation.Scope import org.springframework.stereotype.Component @@ -76,7 +79,7 @@ open class ComponentScriptExecutor(private var componentFunctionScriptingService fun BluePrintTypes.componentScriptExecutor(): NodeType { return nodeType(id = "component-script-executor", version = BluePrintConstants.DEFAULT_VERSION_NUMBER, - derivedFrom = BluePrintConstants.MODEL_TYPE_NODES_ROOT, + derivedFrom = BluePrintConstants.MODEL_TYPE_NODE_COMPONENT, description = "Generic Script Component Executor") { attribute(ComponentScriptExecutor.RESPONSE_DATA, BluePrintConstants.DATA_TYPE_JSON, false) attribute(ComponentScriptExecutor.STATUS, BluePrintConstants.DATA_TYPE_STRING, true) @@ -105,4 +108,101 @@ fun BluePrintTypes.componentScriptExecutor(): NodeType { } } } +} + +/** Component Builder */ + +fun componentScriptExecutor(id: String, description: String, + block: ComponentScriptExecutorBuilder.() -> Unit): NodeTemplate { + return ComponentScriptExecutorBuilder(id, description).apply(block).build() +} + +class ComponentScriptExecutorBuilder(private val id: String, private val description: String) { + private var implementation: Implementation? = null + private var inputs: MutableMap? = null + private var outputs: MutableMap? = null + private var artifacts: MutableMap? = null + + fun implementation(timeout: Int, operationHost: String? = BluePrintConstants.PROPERTY_SELF) { + val implementation = Implementation().apply { + this.operationHost = operationHost!! + this.timeout = timeout + } + this.implementation = implementation + } + + fun inputs(block: InputAssignmentBuilder.() -> Unit) { + this.inputs = InputAssignmentBuilder().apply(block).build() + } + + fun outputs(block: OutputAssignmentBuilder.() -> Unit) { + this.outputs = OutputAssignmentBuilder().apply(block).build() + } + + fun artifact(id: String, type: String, file: String) { + if (artifacts == null) + artifacts = hashMapOf() + artifacts!![id] = ArtifactDefinitionBuilder(id, type, file).build() + } + + fun artifact(id: String, type: String, file: String, block: ArtifactDefinitionBuilder.() -> Unit) { + if (artifacts == null) + artifacts = hashMapOf() + artifacts!![id] = ArtifactDefinitionBuilder(id, type, file).apply(block).build() + } + + fun build(): NodeTemplate { + return nodeTemplate(id, "component-script-executor", description) { + operation("ComponentScriptExecutor") { + implementation(implementation) + inputs(inputs) + outputs(outputs) + } + artifacts(artifacts) + } + } + + class InputAssignmentBuilder { + val properties: MutableMap = hashMapOf() + + fun type(type: String) { + properties[ComponentScriptExecutor.SCRIPT_TYPE] = type.asJsonPrimitive() + } + + fun scriptClassReference(scriptClassReference: String) { + properties[ComponentScriptExecutor.SCRIPT_CLASS_REFERENCE] = scriptClassReference.asJsonPrimitive() + } + + fun dynamicProperty(dynamicProperty: Any) { + dynamicProperty(dynamicProperty.asJsonType()) + } + + fun dynamicProperty(dynamicProperty: JsonNode) { + properties[ComponentScriptExecutor.DYNAMIC_PROPERTIES] = dynamicProperty + } + + fun build(): MutableMap { + return properties + } + } + + class OutputAssignmentBuilder { + val properties: MutableMap = hashMapOf() + + fun status(status: String) { + properties[ComponentScriptExecutor.STATUS] = status.asJsonPrimitive() + } + + fun responseData(responseData: Any) { + responseData(responseData.asJsonType()) + } + + fun responseData(responseData: JsonNode) { + properties[ComponentScriptExecutor.RESPONSE_DATA] = responseData + } + + fun build(): MutableMap { + return properties + } + } } \ No newline at end of file -- cgit 1.2.3-korg