diff options
15 files changed, 272 insertions, 43 deletions
diff --git a/.gitignore b/.gitignore index 29bf5d423..a0db985aa 100644 --- a/.gitignore +++ b/.gitignore @@ -107,6 +107,7 @@ typings/ **/*.iml **/*.project **/.springBeans +**/.factorypath **/*versionsBackup **/blackDuckHub* @@ -148,4 +149,5 @@ MacOS # To Remove Kotlin Script Generated Jars **/*cba-kts.jar +**/application/blueprints /target/ diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/artifact_types.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/artifact_types.json new file mode 100644 index 000000000..ad507bd7a --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/artifact_types.json @@ -0,0 +1,10 @@ +{ + "artifact_types" : { + "artifact-template-velocity" : { + "description" : " Velocity Template used for Configuration", + "version" : "1.0.0", + "derived_from" : "tosca.artifacts.Implementation", + "file_ext" : [ "vtl" ] + } + } +}
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/capability-cli-blueprint.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/capability-cli-blueprint.json index f09110045..ceb705127 100644 --- a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/capability-cli-blueprint.json +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/capability-cli-blueprint.json @@ -30,11 +30,41 @@ "resolution-key": { "get_input": "resolution-key" } + }, + "device-properties": { + "type": "basic-auth", + "host": { + "get_input": "hostname" + }, + "username": { + "get_input": "username" + }, + "password": { + "get_input": "password" + } } }, "topology_template": { "workflows": { "check": { + "inputs": { + "hostname": { + "required": true, + "type": "string" + }, + "username": { + "required": true, + "type": "string" + }, + "password": { + "required": true, + "type": "string" + }, + "data": { + "required": true, + "type": "json" + } + }, "steps": { "activate-process": { "description": "Check CLI", diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/data_types.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/data_types.json new file mode 100644 index 000000000..8c304c40b --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/data_types.json @@ -0,0 +1,3 @@ +{ + "data_types" : { } +}
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/node_types.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/node_types.json new file mode 100644 index 000000000..f09ed9949 --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/node_types.json @@ -0,0 +1,60 @@ +{ + "node_types" : { + "component-script-executor" : { + "description" : "This is CLI Transaction Configuration Component API", + "version" : "1.0.0", + "capabilities" : { + "component-node" : { + "type" : "tosca.capabilities.Node" + } + }, + "interfaces" : { + "ComponentScriptExecutor" : { + "operations" : { + "process" : { + "inputs" : { + "script-type" : { + "description" : "Script type, kotlin type is supported", + "required" : true, + "type" : "string", + "constraints" : [ { + "valid_values" : [ "kotlin", "jython", "internal" ] + } ], + "default" : "internal" + }, + "script-class-reference" : { + "description" : "Kotlin Script class name or jython script name.", + "required" : true, + "type" : "string" + }, + "dynamic-properties" : { + "description" : "Dynamic Json Content or DSL Json reference.", + "required" : false, + "type" : "json" + } + }, + "outputs" : { + "response-data" : { + "description" : "Execution Response Data.", + "required" : false, + "type" : "string" + }, + "status" : { + "description" : "Status of the Component Execution ( success or failure )", + "required" : true, + "type" : "string" + } + } + } + } + } + }, + "derived_from" : "tosca.nodes.Component" + }, + "tosca.nodes.Component" : { + "description" : "This is default Component Node", + "version" : "1.0.0", + "derived_from" : "tosca.nodes.Root" + } + } +}
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/policy_types.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/policy_types.json new file mode 100644 index 000000000..1e44cc70a --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/policy_types.json @@ -0,0 +1,3 @@ +{ + "policy_types" : { } +}
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/relationship_types.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/relationship_types.json new file mode 100644 index 000000000..4ddd7a57c --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/relationship_types.json @@ -0,0 +1,3 @@ +{ + "relationship_types" : { } +}
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/resources_definition_types.json b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/resources_definition_types.json new file mode 100644 index 000000000..6f31cf5a2 --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/resources_definition_types.json @@ -0,0 +1 @@ +{ }
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCli.kt b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCli.kt index 270184d34..6b1aae45d 100644 --- a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCli.kt +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCli.kt @@ -16,16 +16,43 @@ package cba.scripts.capability.cli -open class Check : CliComponentFunction() { +import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput +import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction +import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.ComponentScriptExecutor +import org.onap.ccsdk.cds.blueprintsprocessor.ssh.sshClientService +import org.onap.ccsdk.cds.controllerblueprints.core.* +import org.onap.ccsdk.cds.controllerblueprints.core.service.BluePrintDependencyService - private val log = LoggerFactory.getLogger(CliComponentFunction::class.java)!! + +open class Check : AbstractScriptComponentFunction() { + + private val log = logger(Check::class) override fun getName(): String { - return "SimpleCliConfigure" + return "Check" } override suspend fun processNB(executionRequest: ExecutionServiceInput) { - log.info("Executing process") + log.info("Executing process : ${executionRequest.payload}") + + val data = executionRequest.payload.at("/check-request/data") + + log.info("Data : ${data.asJsonString()}") + + val checkCommands = mashTemplateNData("command-template", data.asJsonString()) + + log.info("Check Commands :$checkCommands") + + // Get the Device Information from the DSL Model + val deviceInformation = bluePrintRuntimeService.resolveDSLExpression("device-properties") + + log.info("Device Info :$deviceInformation") + + // Get the Client Service + val sshClientService = BluePrintDependencyService.sshClientService(deviceInformation) + + log.info("Client service is ready") + } override suspend fun recoverNB(runtimeException: RuntimeException, executionRequest: ExecutionServiceInput) { diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCliDefinitions.kt b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCliDefinitions.kt new file mode 100644 index 000000000..057030b22 --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCliDefinitions.kt @@ -0,0 +1,86 @@ +/* + * 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 cba.scripts.capability.cli + +import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.componentScriptExecutor +import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintTypes +import org.onap.ccsdk.cds.controllerblueprints.core.data.ServiceTemplate +import org.onap.ccsdk.cds.controllerblueprints.core.dsl.artifactTypeTemplateVelocity +import org.onap.ccsdk.cds.controllerblueprints.core.dsl.nodeTypeComponent +import org.onap.ccsdk.cds.controllerblueprints.core.dsl.serviceTemplate +import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.AbstractBluePrintDefinitions + +class CapabilityCliDefinitions : AbstractBluePrintDefinitions() { + + override fun serviceTemplate(): ServiceTemplate { + return defaultServiceTemplate() + } +} + +fun CapabilityCliDefinitions.defaultServiceTemplate() = + serviceTemplate(name = "capability-cli", + version = "1.0.0", + author = "Brinda Santh Muthuramalingam", + tags = "brinda, tosca") { + + dsl("device-properties", """" + { + "type": "basic-auth", + "host": { "get_input": "hostname" }, + "username": { "get_input": "username" }, + "password": { "get_input": "password" } + } + """.trimIndent()) + + topologyTemplate { + + workflow(id = "check", description = "CLI Check Workflow") { + inputs { + property(id = "hostname", type = "string", required = true, description = "") + property(id = "username", type = "string", required = true, description = "") + property(id = "password", type = "string", required = true, description = "") + property(id = "data", type = "json", required = true, description = "") + } + outputs { + property(id = "status", required = true, type = "string", description = "") + } + step(id = "check", target = "check", description = "Calling check script node") + + } + + nodeTemplate(id = "check", + type = "component-script-executor", + description = "") { + operation(interfaceName = "process", description = "") { + inputs { + property(id = "script-type", value = "kotlin") + property(id = "script-class-reference", value = "cba.scripts.capability.cli.Check") + } + outputs { + property(id = "response-data", value = "") + property(id = "status", value = "success") + } + } + artifact(id = "command-template", type = "artifact-template-velocity", file = "Templates/check-command-template.vtl") + } + } + + artifactType(BluePrintTypes.artifactTypeTemplateVelocity()) + nodeType(BluePrintTypes.nodeTypeComponent()) + nodeType(BluePrintTypes.componentScriptExecutor()) + + }
\ No newline at end of file diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/TOSCA-Metadata/TOSCA.meta b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/TOSCA-Metadata/TOSCA.meta index 001889672..6c4bb36f8 100644 --- a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/TOSCA-Metadata/TOSCA.meta +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/TOSCA-Metadata/TOSCA.meta @@ -2,4 +2,6 @@ TOSCA-Meta-File-Version: 1.0.0 CSAR-Version: 1.0 Created-By: Brinda Santh Entry-Definitions: Definitions/capability-cli-blueprint.json +Template-Name: capability-cli +Template-Version: 1.0.0 Template-Tags: capability-cli-blueprint diff --git a/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Templates/check-command-template.vtl b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Templates/check-command-template.vtl new file mode 100644 index 000000000..1aabe39c8 --- /dev/null +++ b/components/model-catalog/blueprint-model/test-blueprint/capability_cli/Templates/check-command-template.vtl @@ -0,0 +1 @@ +show interfaces | include $vlanId
\ No newline at end of file diff --git a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceController.kt b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceController.kt index 60016fb98..d48f0c7e4 100644 --- a/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceController.kt +++ b/ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceController.kt @@ -26,7 +26,8 @@ import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ACTION_MODE_ASYNC import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceOutput import org.onap.ccsdk.cds.blueprintsprocessor.selfservice.api.utils.determineHttpStatusCode -import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils +import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive +import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.MediaType import org.springframework.http.ResponseEntity @@ -37,36 +38,37 @@ import org.springframework.web.bind.annotation.* @RestController @RequestMapping("/api/v1/execution-service") @Api(value = "/api/v1/execution-service", - description = "Interaction with CBA.") + description = "Interaction with CBA.") open class ExecutionServiceController { @Autowired lateinit var executionServiceHandler: ExecutionServiceHandler @RequestMapping(path = ["/health-check"], - method = [RequestMethod.GET], - produces = [MediaType.APPLICATION_JSON_VALUE]) + method = [RequestMethod.GET], + produces = [MediaType.APPLICATION_JSON_VALUE]) @ResponseBody @ApiOperation(value = "Health Check", hidden = true) fun executionServiceControllerHealthCheck(): JsonNode = runBlocking { - JacksonUtils.getJsonNode("Success") + "Success".asJsonPrimitive() } @PostMapping(path = ["/upload"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) @ResponseBody @PreAuthorize("hasRole('USER')") @ApiOperation(value = "Upload a CBA", - notes = "Upload the CBA package. This will also run validation on the CBA.", - produces = MediaType.APPLICATION_JSON_VALUE) + notes = "Upload the CBA package. This will also run validation on the CBA.", + produces = MediaType.APPLICATION_JSON_VALUE) fun upload(@ApiParam(value = "The ZIP file containing the overall CBA package.", required = true) @RequestPart("file") filePart: FilePart): JsonNode = runBlocking { - JacksonUtils.getJsonNode(executionServiceHandler.upload(filePart)) + val uploadId = executionServiceHandler.upload(filePart) + """{"upload-id" : "$uploadId"}""".asJsonType() } @DeleteMapping("/name/{name}/version/{version}") @ApiOperation(value = "Delete a CBA", - notes = "Delete the CBA package identified by its name and version.", - produces = MediaType.APPLICATION_JSON_VALUE) + notes = "Delete the CBA package identified by its name and version.", + produces = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasRole('USER')") fun deleteBlueprint(@ApiParam(value = "Name of the CBA.", required = true) @PathVariable(value = "name") name: String, @@ -77,18 +79,18 @@ open class ExecutionServiceController { @RequestMapping(path = ["/process"], method = [RequestMethod.POST], produces = [MediaType.APPLICATION_JSON_VALUE]) @ApiOperation(value = "Execute a CBA workflow (action)", - notes = "Execute the appropriate CBA's action based on the ExecutionServiceInput object passed as input.", - produces = MediaType.APPLICATION_JSON_VALUE, - response = ExecutionServiceOutput::class) + notes = "Execute the appropriate CBA's action based on the ExecutionServiceInput object passed as input.", + produces = MediaType.APPLICATION_JSON_VALUE, + response = ExecutionServiceOutput::class) @ResponseBody @PreAuthorize("hasRole('USER')") fun process(@ApiParam(value = "ExecutionServiceInput payload.", required = true) @RequestBody executionServiceInput: ExecutionServiceInput): ResponseEntity<ExecutionServiceOutput> = - runBlocking { - if (executionServiceInput.actionIdentifiers.mode == ACTION_MODE_ASYNC) { - throw IllegalStateException("Can't process async request through the REST endpoint. Use gRPC for async processing.") + runBlocking { + if (executionServiceInput.actionIdentifiers.mode == ACTION_MODE_ASYNC) { + throw IllegalStateException("Can't process async request through the REST endpoint. Use gRPC for async processing.") + } + val processResult = executionServiceHandler.doProcess(executionServiceInput) + ResponseEntity(processResult, determineHttpStatusCode(processResult.status.code)) } - val processResult = executionServiceHandler.doProcess(executionServiceInput) - ResponseEntity(processResult, determineHttpStatusCode(processResult.status.code)) - } } diff --git a/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintTemplateServiceTest.kt b/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintTemplateServiceTest.kt index de6d4d8e4..ce41cfa1f 100644 --- a/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintTemplateServiceTest.kt +++ b/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintTemplateServiceTest.kt @@ -20,11 +20,8 @@ package org.onap.ccsdk.cds.controllerblueprints.core.service import kotlinx.coroutines.runBlocking import org.junit.Test -import org.junit.runner.RunWith -import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintMetadataUtils import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils -import org.springframework.test.context.junit4.SpringRunner import kotlin.test.BeforeTest import kotlin.test.assertEquals import kotlin.test.assertNotNull @@ -58,7 +55,7 @@ class BluePrintTemplateServiceTest { val template = JacksonUtils.getClassPathFileContent("templates/master.jinja") val json = JacksonUtils.getClassPathFileContent("templates/base-config-data-jinja.json") - var element: MutableMap<String, Any> = mutableMapOf() + val element: MutableMap<String, Any> = mutableMapOf() element["additional_array"] = arrayListOf(hashMapOf("name" to "Element1", "location" to "Region0"), hashMapOf("name" to "Element2", "location" to "Region1")) diff --git a/ms/controllerblueprints/modules/service/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/service/enhancer/BluePrintEnhancerServiceImplTest.kt b/ms/controllerblueprints/modules/service/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/service/enhancer/BluePrintEnhancerServiceImplTest.kt index b4c29dec3..1f872c2da 100644 --- a/ms/controllerblueprints/modules/service/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/service/enhancer/BluePrintEnhancerServiceImplTest.kt +++ b/ms/controllerblueprints/modules/service/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/service/enhancer/BluePrintEnhancerServiceImplTest.kt @@ -19,15 +19,12 @@ package org.onap.ccsdk.cds.controllerblueprints.service.enhancer import kotlinx.coroutines.runBlocking import org.junit.Assert -import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.onap.ccsdk.cds.controllerblueprints.TestApplication -import org.onap.ccsdk.cds.controllerblueprints.core.compress import org.onap.ccsdk.cds.controllerblueprints.core.deleteDir import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintEnhancerService import org.onap.ccsdk.cds.controllerblueprints.core.interfaces.BluePrintValidatorService -import org.onap.ccsdk.cds.controllerblueprints.core.normalizedFile import org.onap.ccsdk.cds.controllerblueprints.core.normalizedPathName import org.onap.ccsdk.cds.controllerblueprints.service.load.ModelTypeLoadService import org.onap.ccsdk.cds.controllerblueprints.service.load.ResourceDictionaryLoadService @@ -53,8 +50,11 @@ class BluePrintEnhancerServiceImplTest { @Autowired lateinit var bluePrintValidatorService: BluePrintValidatorService - @Before - fun init() { + + @Test + @Throws(Exception::class) + fun testEnhancementAndValidation() { + runBlocking { modelTypeLoadService.loadPathModelType("./../../../../components/model-catalog/definition-type/starter-type") @@ -62,46 +62,48 @@ class BluePrintEnhancerServiceImplTest { dictPaths.add("./../../../../components/model-catalog/resource-dictionary/starter-dictionary") dictPaths.add("./../../../../components/model-catalog/resource-dictionary/test-dictionary") resourceDictionaryLoadService.loadPathsResourceDictionary(dictPaths) + + testBaseConfigEnhancementAndValidation() + testVFWEnhancementAndValidation() + testGoldenEnhancementAndValidation() + testCapabilityRestconfEnhancementAndValidation() + testRemoteScriptsEnhancementAndValidation() + testCapabilityCliEnhancementAndValidation() } } - @Test - @Throws(Exception::class) - fun testEnhancementAndValidation() { + fun testBaseConfigEnhancementAndValidation() { val basePath = "./../../../../components/model-catalog/blueprint-model/test-blueprint/baseconfiguration" testComponentInvokeEnhancementAndValidation(basePath, "base-enhance") } - @Test - @Throws(Exception::class) fun testVFWEnhancementAndValidation() { val basePath = "./../../../../components/model-catalog/blueprint-model/service-blueprint/vFW" testComponentInvokeEnhancementAndValidation(basePath, "vFW-enhance") } - @Test - @Throws(Exception::class) fun testGoldenEnhancementAndValidation() { val basePath = "./../../../../components/model-catalog/blueprint-model/test-blueprint/golden" testComponentInvokeEnhancementAndValidation(basePath, "golden-enhance") } - @Test - @Throws(Exception::class) fun testCapabilityRestconfEnhancementAndValidation() { val basePath = "./../../../../components/model-catalog/blueprint-model/test-blueprint/capability_restconf" testComponentInvokeEnhancementAndValidation(basePath, "capability_restconf-enhance") } - @Test - @Throws(Exception::class) fun testRemoteScriptsEnhancementAndValidation() { val basePath = "./../../../../components/model-catalog/blueprint-model/test-blueprint/remote_scripts" testComponentInvokeEnhancementAndValidation(basePath, "remote_scripts-enhance") } + fun testCapabilityCliEnhancementAndValidation() { + val basePath = "./../../../../components/model-catalog/blueprint-model/test-blueprint/capability_cli" + testComponentInvokeEnhancementAndValidation(basePath, "capability_cli-enhance") + } + private fun testComponentInvokeEnhancementAndValidation(basePath: String, targetDirName: String) { runBlocking { val targetPath = normalizedPathName("target/blueprints/enrichment", targetDirName) |