Add Blueprint File utils
authorMuthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
Mon, 3 Dec 2018 17:34:39 +0000 (12:34 -0500)
committerMuthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
Mon, 3 Dec 2018 17:40:33 +0000 (12:40 -0500)
Change-Id: I9896d934684343358d1c0c7e321725511430c7e6
Issue-ID: CCSDK-783
Signed-off-by: Muthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/BluePrintConstants.kt
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtils.kt [new file with mode: 0644]
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt
components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtilsTest.kt [new file with mode: 0644]
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/activation-blueprint.json
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/artifact_types.json [moved from components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/artifact-types.json with 100% similarity]
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/baseconfig-mapping.json [moved from components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Mappings/baseconfig-mapping.json with 100% similarity]
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/data_types.json [moved from components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/data-types.json with 100% similarity]
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/node_types.json [moved from components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/node-types.json with 100% similarity]
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/resources_dictionaty_types.json [moved from components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Mappings/resources-dictionary.json with 100% similarity]

index 2908a63..0517e90 100644 (file)
@@ -139,7 +139,9 @@ object BluePrintConstants {
     const val PROPERTY_BLUEPRINT_NAME: String = "template_name"\r
     const val PROPERTY_BLUEPRINT_VERSION: String = "template_version"\r
 \r
+    const val TOSCA_METADATA_DIR: String = "TOSCA-Metadata"\r
     const val TOSCA_METADATA_ENTRY_DEFINITION_FILE: String = "TOSCA-Metadata/TOSCA.meta"\r
+    const val TOSCA_DEFINITIONS_DIR: String = "Definitions"\r
     const val TOSCA_PLANS_DIR: String = "Plans"\r
     const val TOSCA_SCRIPTS_DIR: String = "Scripts"\r
     const val TOSCA_MAPPINGS_DIR: String = "Mappings"\r
diff --git a/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtils.kt b/components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtils.kt
new file mode 100644 (file)
index 0000000..d9222d7
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * 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.apps.controllerblueprints.core.utils
+
+import com.att.eelf.configuration.EELFLogger
+import com.att.eelf.configuration.EELFManager
+import kotlinx.coroutines.runBlocking
+import org.apache.commons.io.FileUtils
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException
+import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintContext
+import java.io.File
+import java.io.FileFilter
+import java.nio.file.Files
+import java.nio.file.StandardOpenOption
+
+class BluePrintFileUtils {
+    companion object {
+
+        private val log: EELFLogger = EELFManager.getInstance().getLogger(this::class.toString())
+
+        fun createEmptyBluePrint(basePath: String) {
+
+            val blueprintDir = File(basePath)
+            FileUtils.deleteDirectory(blueprintDir)
+
+            Files.createDirectories(blueprintDir.toPath())
+
+            val metaDataDir = File(blueprintDir.absolutePath.plus(File.separator).plus(BluePrintConstants.TOSCA_METADATA_DIR))
+            Files.createDirectories(metaDataDir.toPath())
+
+            val metafile = File(blueprintDir.absolutePath.plus(File.separator).plus(BluePrintConstants.TOSCA_METADATA_ENTRY_DEFINITION_FILE))
+            Files.write(metafile.toPath(), getMetaDataContent().toByteArray(), StandardOpenOption.CREATE_NEW)
+
+            val definitionsDir = File(blueprintDir.absolutePath.plus(File.separator).plus(BluePrintConstants.TOSCA_DEFINITIONS_DIR))
+            Files.createDirectories(definitionsDir.toPath())
+
+            val scriptsDir = File(blueprintDir.absolutePath.plus(File.separator).plus(BluePrintConstants.TOSCA_SCRIPTS_DIR))
+            Files.createDirectories(scriptsDir.toPath())
+
+            val plansDir = File(blueprintDir.absolutePath.plus(File.separator).plus(BluePrintConstants.TOSCA_PLANS_DIR))
+            Files.createDirectories(plansDir.toPath())
+
+            val templatesDir = File(blueprintDir.absolutePath.plus(File.separator).plus(BluePrintConstants.TOSCA_TEMPLATES_DIR))
+            Files.createDirectories(templatesDir.toPath())
+
+        }
+
+        fun copyBluePrint(sourcePath: String, targetPath: String) {
+            val sourceFile = File(sourcePath)
+            val targetFile = File(targetPath)
+            sourceFile.copyRecursively(targetFile, true)
+        }
+
+        fun deleteBluePrintTypes(basePath: String) {
+            val definitionPath = basePath.plus(File.separator).plus(BluePrintConstants.TOSCA_DEFINITIONS_DIR)
+            log.info("deleting definition types under : $definitionPath")
+
+            val definitionDir = File(definitionPath)
+            // Find the Type Definitions
+            val fileFilter = FileFilter { pathname -> pathname.absolutePath.endsWith("_types.json") }
+            // Delete the Type Files
+            definitionDir.listFiles(fileFilter).forEach {
+                Files.deleteIfExists(it.toPath())
+            }
+        }
+
+        fun writeBluePrintTypes(blueprintContext: BluePrintContext) {
+
+            val basePath = blueprintContext.rootPath
+            val definitionPath = basePath.plus(File.separator).plus(BluePrintConstants.TOSCA_DEFINITIONS_DIR)
+            val definitionDir = File(definitionPath)
+
+            check(definitionDir.exists()) {
+                throw BluePrintException("couldn't get definition file under path(${definitionDir.absolutePath})")
+            }
+
+            blueprintContext.dataTypes.let {
+                val dataTypesContent = JacksonUtils.getWrappedJson(BluePrintConstants.PATH_DATA_TYPES, blueprintContext.dataTypes!!, true)
+                writeFile(definitionDir.absolutePath, BluePrintConstants.PATH_DATA_TYPES, dataTypesContent)
+
+            }
+
+            blueprintContext.artifactTypes.let {
+                val artifactTypesContent = JacksonUtils.getWrappedJson(BluePrintConstants.PATH_ARTIFACT_TYPES, blueprintContext.artifactTypes!!, true)
+                writeFile(definitionDir.absolutePath, BluePrintConstants.PATH_ARTIFACT_TYPES, artifactTypesContent)
+            }
+
+            blueprintContext.nodeTypes.let {
+                val nodeTypesContent = JacksonUtils.getWrappedJson(BluePrintConstants.PATH_NODE_TYPES, blueprintContext.nodeTypes!!, true)
+                writeFile(definitionDir.absolutePath, BluePrintConstants.PATH_NODE_TYPES, nodeTypesContent)
+            }
+
+        }
+
+        private fun writeFile(definitionPath: String, type: String, content: String) = runBlocking {
+            val typeFile = File(definitionPath.plus(File.separator).plus("$type.json"))
+
+            Files.write(typeFile.toPath(), content.toByteArray(), StandardOpenOption.CREATE_NEW)
+            check(typeFile.exists()) {
+                throw BluePrintException("couldn't write $type.json file under path(${typeFile.absolutePath})")
+            }
+        }
+
+        private fun getMetaDataContent(): String {
+            return "TOSCA-Meta-File-Version: 1.0.0" +
+                    "\nCSAR-Version: <VERSION>" +
+                    "\nCreated-By: <AUTHOR NAME>" +
+                    "\nEntry-Definitions: Definitions/<BLUEPRINT_NAME>.json" +
+                    "\nTemplate-Tags: <TAGS>"
+        }
+
+    }
+}
\ No newline at end of file
index cf5f9e2..f53f861 100644 (file)
@@ -104,6 +104,13 @@ object JacksonUtils {
         return getJson(any, false)\r
     }\r
 \r
+    @JvmStatic\r
+    fun getWrappedJson(wrapper: String, any: kotlin.Any, pretty: Boolean = false): String {\r
+        val wrapperMap = hashMapOf<String, Any>()\r
+        wrapperMap[wrapper] = any\r
+        return getJson(wrapperMap, pretty)\r
+    }\r
+\r
     @JvmStatic\r
     fun getJson(any: kotlin.Any, pretty: Boolean = false): String {\r
         val objectMapper = jacksonObjectMapper()\r
diff --git a/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtilsTest.kt b/components/core/src/test/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtilsTest.kt
new file mode 100644 (file)
index 0000000..143c4a8
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ *
+ * 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.apps.controllerblueprints.core.utils
+
+import kotlinx.coroutines.runBlocking
+import org.junit.Test
+import java.io.File
+import java.nio.file.Paths
+import kotlin.test.assertTrue
+
+
+class BluePrintFileUtilsTest {
+
+    @Test
+    fun testNewBlueprint() = runBlocking {
+        val targetPath: String = Paths.get("target").toUri().toURL().path.plus("bp-new-test")
+        BluePrintFileUtils.createEmptyBluePrint(targetPath)
+
+    }
+
+    @Test
+    fun testBlueprintCopy() = runBlocking {
+        val sourcePath: String = "./../model-catalog/blueprint-model/starter-blueprint/baseconfiguration"
+
+        val targetPath: String = Paths.get("target").toUri().toURL().path.plus("bp-copy-test")
+
+        val targetDir = File(targetPath)
+        targetDir.deleteOnExit()
+        // Copy the BP file
+        BluePrintFileUtils.copyBluePrint(sourcePath, targetDir.absolutePath)
+
+        assertTrue(targetDir.exists(), "faield to copy blueprint to ${targetDir.absolutePath}")
+
+        // Delete Type Files
+        BluePrintFileUtils.deleteBluePrintTypes(targetDir.absolutePath)
+
+        // Generate the Type Files
+        val bluePrintContext = BluePrintMetadataUtils.getBluePrintContext(sourcePath)
+        bluePrintContext.rootPath = targetDir.absolutePath
+
+        BluePrintFileUtils.writeBluePrintTypes(bluePrintContext)
+
+
+    }
+}
\ No newline at end of file
index 9d1172f..04e0efc 100644 (file)
@@ -9,13 +9,13 @@
   },
   "imports": [
     {
-      "file": "Definitions/data-types.json"
+      "file": "Definitions/data_types.json"
     },
     {
-      "file": "Definitions/node-types.json"
+      "file": "Definitions/node_types.json"
     },
     {
-      "file": "Definitions/artifact-types.json"
+      "file": "Definitions/artifact_types.json"
     }
   ],
   "topology_template": {
           },
           "baseconfig-mapping": {
             "type": "artifact-mapping-resource",
-            "file": "Mappings/baseconfig-mapping.json"
+            "file": "Definitions/baseconfig-mapping.json"
           }
         }
       },