Fix missing capability cli models. 75/91975/1
authorBrinda Santh <brindasanth@in.ibm.com>
Thu, 25 Jul 2019 00:38:36 +0000 (20:38 -0400)
committerBrinda Santh <brindasanth@in.ibm.com>
Thu, 25 Jul 2019 00:38:36 +0000 (20:38 -0400)
Change-Id: Id5ad2f75cf27b7c09dc95a028997847098cd3d2e
Issue-ID: CCSDK-1046
Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
15 files changed:
.gitignore
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/artifact_types.json [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/capability-cli-blueprint.json
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/data_types.json [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/node_types.json [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/policy_types.json [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/relationship_types.json [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Definitions/resources_definition_types.json [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCli.kt
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Scripts/kotlin/CapabilityCliDefinitions.kt [new file with mode: 0644]
components/model-catalog/blueprint-model/test-blueprint/capability_cli/TOSCA-Metadata/TOSCA.meta
components/model-catalog/blueprint-model/test-blueprint/capability_cli/Templates/check-command-template.vtl [new file with mode: 0644]
ms/blueprintsprocessor/modules/inbounds/selfservice-api/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/selfservice/api/ExecutionServiceController.kt
ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/service/BluePrintTemplateServiceTest.kt
ms/controllerblueprints/modules/service/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/service/enhancer/BluePrintEnhancerServiceImplTest.kt

index 29bf5d4..a0db985 100644 (file)
@@ -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 (file)
index 0000000..ad507bd
--- /dev/null
@@ -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
index f091100..ceb7051 100644 (file)
       "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 (file)
index 0000000..8c304c4
--- /dev/null
@@ -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 (file)
index 0000000..f09ed99
--- /dev/null
@@ -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 (file)
index 0000000..1e44cc7
--- /dev/null
@@ -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 (file)
index 0000000..4ddd7a5
--- /dev/null
@@ -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 (file)
index 0000000..6f31cf5
--- /dev/null
@@ -0,0 +1 @@
+{ }
\ No newline at end of file
index 270184d..6b1aae4 100644 (file)
 
 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 (file)
index 0000000..057030b
--- /dev/null
@@ -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
index 0018896..6c4bb36 100644 (file)
@@ -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 (file)
index 0000000..1aabe39
--- /dev/null
@@ -0,0 +1 @@
+show interfaces | include $vlanId
\ No newline at end of file
index 60016fb..d48f0c7 100644 (file)
@@ -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))
-        }
 }
index de6d4d8..ce41cfa 100644 (file)
@@ -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"))
 
index b4c29de..1f872c2 100644 (file)
@@ -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)