Add attribute definition enhancer.
authorMuthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
Tue, 18 Dec 2018 13:16:28 +0000 (08:16 -0500)
committerMuthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
Tue, 18 Dec 2018 13:16:28 +0000 (08:16 -0500)
Change-Id: Ie8ac60910f04dfca477d0276aa451821cfcd8510
Issue-ID: CCSDK-718
Signed-off-by: Muthuramalingam, Brinda Santh(bs2796) <bs2796@att.com>
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/ConfigModelConstant.kt
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/data/BluePrintModel.kt
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintContext.kt
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintFileUtils.kt
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/BluePrintMetadataUtils.kt
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/node_types.json
components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/resources_definition_types.json [moved from components/model-catalog/blueprint-model/starter-blueprint/baseconfiguration/Definitions/resources_dictionary_types.json with 100% similarity]
components/model-catalog/definition-type/starter-type/node_type/component-resource-assignment.json

index 8bfa2db..5461798 100644 (file)
@@ -26,13 +26,5 @@ object ConfigModelConstant {
 \r
     const val MODEL_CONTENT_TYPE_TOSCA_JSON = "TOSCA_JSON"\r
     const val MODEL_CONTENT_TYPE_TEMPLATE = "TEMPLATE"\r
-\r
-    const val MODEL_TYPE_DATA_TYPE_DYNAMIC = "tosca.datatypes.Dynamic"\r
-\r
-    const val MODEL_TYPE_NODE_ARTIFACT = "tosca.nodes.Artifact"\r
-\r
     const val CAPABILITY_PROPERTY_MAPPING = "mapping"\r
-\r
-    const val PROPERTY_RECIPE_NAMES = "action-names"\r
-\r
 }\r
index 9b6fbbf..19f0943 100644 (file)
@@ -19,6 +19,7 @@ package org.onap.ccsdk.apps.controllerblueprints.core.data
 \r
 import com.fasterxml.jackson.annotation.JsonIgnore\r
 import com.fasterxml.jackson.annotation.JsonProperty\r
+import com.fasterxml.jackson.annotation.JsonPropertyOrder\r
 import com.fasterxml.jackson.databind.JsonNode\r
 import io.swagger.annotations.ApiModelProperty\r
 \r
@@ -183,12 +184,14 @@ class AttributeDefinition {
     @get:JsonIgnore\r
     var id: String? = null\r
     var description: String? = null\r
+    var required: Boolean? = null\r
     lateinit var type: String\r
     @JsonProperty("default")\r
     var defaultValue: JsonNode? = null\r
     var status: String? = null\r
+    var constraints: MutableList<ConstraintClause>? = null\r
     @JsonProperty("entry_schema")\r
-    var entrySchema: String? = null\r
+    var entrySchema: EntrySchema? = null\r
 }\r
 \r
 /*\r
@@ -579,7 +582,8 @@ class ConditionClause {
 A TOSCA Service Template (YAML) document contains element definitions of building blocks for cloud application, or complete models of cloud applications. This section describes the top-level structural elements (TOSCA keynames) along with their grammars, which are allowed to appear in a TOSCA Service Template document.\r
  */\r
 \r
-class ServiceTemplate {\r
+@JsonPropertyOrder(value = ["toscaDefinitionsVersion", "description", "metadata", "imports", "topologyTemplate"])\r
+class ServiceTemplate : Cloneable {\r
     @get:JsonIgnore\r
     var id: String? = null\r
     @get:JsonProperty("tosca_definitions_version")\r
@@ -600,6 +604,10 @@ class ServiceTemplate {
     var policyTypes: MutableMap<String, PolicyType>? = null\r
     @get:JsonProperty("topology_template")\r
     var topologyTemplate: TopologyTemplate? = null\r
+\r
+    override public fun clone(): ServiceTemplate {\r
+        return super.clone() as ServiceTemplate\r
+    }\r
 }\r
 \r
 class ToscaMetaData {\r
index 84af3f9..bc1f4b4 100644 (file)
@@ -36,6 +36,10 @@ class BluePrintContext(val serviceTemplate: ServiceTemplate) {
      * Blueprint CBA extracted file location\r
      */\r
     var rootPath = "."\r
+    /**\r
+     * Root Definition file path\r
+     */\r
+    var entryDefinition = ""\r
 \r
     val imports: List<ImportDefinition>? = serviceTemplate.imports\r
 \r
index f9ac876..67ae398 100644 (file)
@@ -22,6 +22,8 @@ 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.data.ImportDefinition
+import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate
 import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintContext
 import java.io.File
 import java.io.FileFilter
@@ -79,6 +81,46 @@ class BluePrintFileUtils {
             }
         }
 
+        fun populateDefaultImports(blueprintContext: BluePrintContext) {
+            // Get the Default Types
+            val types = arrayListOf(BluePrintConstants.PATH_DATA_TYPES, BluePrintConstants.PATH_ARTIFACT_TYPES,
+                    BluePrintConstants.PATH_NODE_TYPES, BluePrintConstants.PATH_POLICY_TYPES)
+
+            // Clean Type Imports
+            cleanImportTypes(blueprintContext.serviceTemplate)
+
+            val imports = mutableListOf<ImportDefinition>()
+            types.forEach { typeName ->
+                val import = ImportDefinition()
+                import.file = BluePrintConstants.TOSCA_DEFINITIONS_DIR.plus("/$typeName.json")
+                imports.add(import)
+            }
+
+            blueprintContext.serviceTemplate.imports = imports
+        }
+
+        fun cleanImportTypes(serviceTemplate: ServiceTemplate) {
+            // Clean the Type imports
+            val toDeleteTypes = serviceTemplate.imports?.filter {
+                it.file.endsWith("_types.json")
+            }
+
+            if (toDeleteTypes != null && toDeleteTypes.isNotEmpty()) {
+                serviceTemplate.imports?.removeAll(toDeleteTypes)
+            }
+        }
+
+        fun writeEnhancedBluePrint(blueprintContext: BluePrintContext) {
+
+            // Write Blueprint Types
+            writeBluePrintTypes(blueprintContext)
+            // Re Populate the Imports
+            populateDefaultImports(blueprintContext)
+            // Rewrite the Entry Definition Files
+            writeEntryDefinitionFile(blueprintContext)
+
+        }
+
         fun writeBluePrintTypes(blueprintContext: BluePrintContext) {
 
             val basePath = blueprintContext.rootPath
@@ -110,10 +152,29 @@ class BluePrintFileUtils {
             }
         }
 
+        fun writeEntryDefinitionFile(blueprintContext: BluePrintContext) {
+
+            val absoluteEntryDefinitionFile = blueprintContext.rootPath.plus(File.separator).plus(blueprintContext.entryDefinition)
+
+            val serviceTemplate = blueprintContext.serviceTemplate
+
+            // Clone the Service Template
+            val writeServiceTemplate = serviceTemplate.clone()
+            writeServiceTemplate.dataTypes = null
+            writeServiceTemplate.artifactTypes = null
+            writeServiceTemplate.policyTypes = null
+            writeServiceTemplate.nodeTypes = null
+
+            // Write the Serivice Template
+            writeDefinitionFile(absoluteEntryDefinitionFile, JacksonUtils.getJson(writeServiceTemplate, true))
+        }
+
         fun writeDefinitionFile(definitionFile: String, content: String) = runBlocking {
             val definitionFile = File(definitionFile)
+            // Delete the File If exists
+            Files.deleteIfExists(definitionFile.toPath())
 
-            Files.write(definitionFile.toPath(), content.toByteArray(), StandardOpenOption.CREATE)
+            Files.write(definitionFile.toPath(), content.toByteArray(), StandardOpenOption.CREATE_NEW)
             check(definitionFile.exists()) {
                 throw BluePrintException("couldn't write definition file under path(${definitionFile.absolutePath})")
             }
index 9dbe15e..5b5561f 100644 (file)
@@ -31,109 +31,114 @@ import org.onap.ccsdk.apps.controllerblueprints.core.service.DefaultBluePrintRun
 import java.io.File\r
 import java.nio.charset.Charset\r
 \r
-object BluePrintMetadataUtils {\r
-    private val log: EELFLogger = EELFManager.getInstance().getLogger(this::class.toString())\r
+class BluePrintMetadataUtils {\r
+    companion object {\r
+        private val log: EELFLogger = EELFManager.getInstance().getLogger(this::class.toString())\r
 \r
-    @JvmStatic\r
-    fun toscaMetaData(basePath: String): ToscaMetaData {\r
-        val toscaMetaPath = basePath.plus(BluePrintConstants.PATH_DIVIDER).plus("TOSCA-Metadata/TOSCA.meta")\r
-        return toscaMetaDataFromMetaFile(toscaMetaPath)\r
-    }\r
 \r
-    @JvmStatic\r
-    fun toscaMetaDataFromMetaFile(metaFilePath: String): ToscaMetaData {\r
-        val toscaMetaData = ToscaMetaData()\r
-        val lines: MutableList<String> = FileUtils.readLines(File(metaFilePath), Charset.defaultCharset())\r
-        lines.forEach { line ->\r
-            if (line.contains(":")) {\r
-                val keyValue = line.split(":")\r
-                if (keyValue.size == 2) {\r
-                    val value: String = keyValue[1].trim()\r
-                    when (keyValue[0]) {\r
-                        "TOSCA-Meta-File-Version" -> toscaMetaData.toscaMetaFileVersion = value\r
-                        "CSAR-Version" -> toscaMetaData.csarVersion = value\r
-                        "Created-By" -> toscaMetaData.createdBy = value\r
-                        "Entry-Definitions" -> toscaMetaData.entityDefinitions = value\r
-                        "Template-Tags" -> toscaMetaData.templateTags = value\r
+        fun toscaMetaData(basePath: String): ToscaMetaData {\r
+            val toscaMetaPath = basePath.plus(BluePrintConstants.PATH_DIVIDER)\r
+                    .plus(BluePrintConstants.TOSCA_METADATA_ENTRY_DEFINITION_FILE)\r
+            return toscaMetaDataFromMetaFile(toscaMetaPath)\r
+        }\r
+\r
+        fun entryDefinitionFile(basePath: String): String {\r
+            val toscaMetaPath = basePath.plus(BluePrintConstants.PATH_DIVIDER)\r
+                    .plus(BluePrintConstants.TOSCA_METADATA_ENTRY_DEFINITION_FILE)\r
+            return toscaMetaDataFromMetaFile(toscaMetaPath).entityDefinitions\r
+        }\r
+\r
+        fun toscaMetaDataFromMetaFile(metaFilePath: String): ToscaMetaData {\r
+            val toscaMetaData = ToscaMetaData()\r
+            val lines: MutableList<String> = FileUtils.readLines(File(metaFilePath), Charset.defaultCharset())\r
+            lines.forEach { line ->\r
+                if (line.contains(":")) {\r
+                    val keyValue = line.split(":")\r
+                    if (keyValue.size == 2) {\r
+                        val value: String = keyValue[1].trim()\r
+                        when (keyValue[0]) {\r
+                            "TOSCA-Meta-File-Version" -> toscaMetaData.toscaMetaFileVersion = value\r
+                            "CSAR-Version" -> toscaMetaData.csarVersion = value\r
+                            "Created-By" -> toscaMetaData.createdBy = value\r
+                            "Entry-Definitions" -> toscaMetaData.entityDefinitions = value\r
+                            "Template-Tags" -> toscaMetaData.templateTags = value\r
+                        }\r
                     }\r
                 }\r
-            }\r
 \r
+            }\r
+            return toscaMetaData\r
         }\r
-        return toscaMetaData\r
-    }\r
 \r
-    @JvmStatic\r
-    fun getBluePrintRuntime(id: String, blueprintBasePath: String): BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
+        fun getBluePrintRuntime(id: String, blueprintBasePath: String): BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
 \r
-        val bluePrintContext: BluePrintContext = getBluePrintContext(blueprintBasePath)\r
+            val bluePrintContext: BluePrintContext = getBluePrintContext(blueprintBasePath)\r
 \r
-        val context: MutableMap<String, JsonNode> = hashMapOf()\r
-        context[BluePrintConstants.PROPERTY_BLUEPRINT_BASE_PATH] = blueprintBasePath.asJsonPrimitive()\r
-        context[BluePrintConstants.PROPERTY_BLUEPRINT_PROCESS_ID] = id.asJsonPrimitive()\r
+            val context: MutableMap<String, JsonNode> = hashMapOf()\r
+            context[BluePrintConstants.PROPERTY_BLUEPRINT_BASE_PATH] = blueprintBasePath.asJsonPrimitive()\r
+            context[BluePrintConstants.PROPERTY_BLUEPRINT_PROCESS_ID] = id.asJsonPrimitive()\r
 \r
-        val bluePrintRuntimeService = DefaultBluePrintRuntimeService(id, bluePrintContext)\r
-        bluePrintRuntimeService.setExecutionContext(context)\r
+            val bluePrintRuntimeService = DefaultBluePrintRuntimeService(id, bluePrintContext)\r
+            bluePrintRuntimeService.setExecutionContext(context)\r
 \r
-        return bluePrintRuntimeService\r
-    }\r
+            return bluePrintRuntimeService\r
+        }\r
 \r
-    @JvmStatic\r
-    fun getBaseEnhancementBluePrintRuntime(id: String, blueprintBasePath: String): BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
+        fun getBaseEnhancementBluePrintRuntime(id: String, blueprintBasePath: String): BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
 \r
-        val bluePrintContext: BluePrintContext = getBaseEnhancementBluePrintContext(blueprintBasePath)\r
-        val context: MutableMap<String, JsonNode> = hashMapOf()\r
-        context[BluePrintConstants.PROPERTY_BLUEPRINT_BASE_PATH] = blueprintBasePath.asJsonPrimitive()\r
-        context[BluePrintConstants.PROPERTY_BLUEPRINT_PROCESS_ID] = id.asJsonPrimitive()\r
+            val bluePrintContext: BluePrintContext = getBaseEnhancementBluePrintContext(blueprintBasePath)\r
+            val context: MutableMap<String, JsonNode> = hashMapOf()\r
+            context[BluePrintConstants.PROPERTY_BLUEPRINT_BASE_PATH] = blueprintBasePath.asJsonPrimitive()\r
+            context[BluePrintConstants.PROPERTY_BLUEPRINT_PROCESS_ID] = id.asJsonPrimitive()\r
 \r
-        val bluePrintRuntimeService = DefaultBluePrintRuntimeService(id, bluePrintContext)\r
-        bluePrintRuntimeService.setExecutionContext(context)\r
+            val bluePrintRuntimeService = DefaultBluePrintRuntimeService(id, bluePrintContext)\r
+            bluePrintRuntimeService.setExecutionContext(context)\r
 \r
-        return bluePrintRuntimeService\r
-    }\r
+            return bluePrintRuntimeService\r
+        }\r
 \r
-    @JvmStatic\r
-    fun getBluePrintRuntime(id: String, blueprintBasePath: String, executionContext: MutableMap<String, JsonNode>): BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
-        val bluePrintContext: BluePrintContext = getBluePrintContext(blueprintBasePath)\r
-        val bluePrintRuntimeService = DefaultBluePrintRuntimeService(id, bluePrintContext)\r
-        bluePrintRuntimeService.setExecutionContext(executionContext)\r
-        return bluePrintRuntimeService\r
-    }\r
+        fun getBluePrintRuntime(id: String, blueprintBasePath: String, executionContext: MutableMap<String, JsonNode>): BluePrintRuntimeService<MutableMap<String, JsonNode>> {\r
+            val bluePrintContext: BluePrintContext = getBluePrintContext(blueprintBasePath)\r
+            val bluePrintRuntimeService = DefaultBluePrintRuntimeService(id, bluePrintContext)\r
+            bluePrintRuntimeService.setExecutionContext(executionContext)\r
+            return bluePrintRuntimeService\r
+        }\r
 \r
-    @JvmStatic\r
-    fun getBluePrintContext(blueprintBasePath: String): BluePrintContext {\r
+        fun getBluePrintContext(blueprintBasePath: String): BluePrintContext {\r
 \r
-        val toscaMetaData: ToscaMetaData = toscaMetaData(blueprintBasePath)\r
+            val toscaMetaData: ToscaMetaData = toscaMetaData(blueprintBasePath)\r
 \r
-        log.info("Processing blueprint base path ($blueprintBasePath) and entry definition file (${toscaMetaData.entityDefinitions})")\r
+            log.info("Reading blueprint path($blueprintBasePath) and entry definition file (${toscaMetaData.entityDefinitions})")\r
 \r
-        return readBlueprintFile(toscaMetaData.entityDefinitions, blueprintBasePath)\r
-    }\r
+            return readBlueprintFile(toscaMetaData.entityDefinitions, blueprintBasePath)\r
+        }\r
 \r
-    fun getBaseEnhancementBluePrintContext(blueprintBasePath: String): BluePrintContext {\r
-        val toscaMetaData: ToscaMetaData = toscaMetaData(blueprintBasePath)\r
-        // Clean Type files\r
-        BluePrintFileUtils.deleteBluePrintTypes(blueprintBasePath)\r
-        val rootFilePath: String = blueprintBasePath.plus(File.separator).plus(toscaMetaData.entityDefinitions)\r
-        val rootServiceTemplate = ServiceTemplateUtils.getServiceTemplate(rootFilePath)\r
+        private fun getBaseEnhancementBluePrintContext(blueprintBasePath: String): BluePrintContext {\r
+            val toscaMetaData: ToscaMetaData = toscaMetaData(blueprintBasePath)\r
+            // Clean Type files\r
+            BluePrintFileUtils.deleteBluePrintTypes(blueprintBasePath)\r
+            val rootFilePath: String = blueprintBasePath.plus(File.separator).plus(toscaMetaData.entityDefinitions)\r
+            val rootServiceTemplate = ServiceTemplateUtils.getServiceTemplate(rootFilePath)\r
 \r
-        // Clean the Import Definitions\r
-        rootServiceTemplate.imports?.clear()\r
+            // Clean the Import Definitions\r
+            BluePrintFileUtils.cleanImportTypes(rootServiceTemplate)\r
 \r
-        val blueprintContext = BluePrintContext(rootServiceTemplate)\r
-        blueprintContext.rootPath = blueprintBasePath\r
-        return blueprintContext\r
-    }\r
+            val blueprintContext = BluePrintContext(rootServiceTemplate)\r
+            blueprintContext.rootPath = blueprintBasePath\r
+            blueprintContext.entryDefinition = toscaMetaData.entityDefinitions\r
+            return blueprintContext\r
+        }\r
 \r
-    @JvmStatic\r
-    fun readBlueprintFile(entityDefinitions: String, basePath: String): BluePrintContext {\r
-        val rootFilePath: String = basePath.plus(File.separator).plus(entityDefinitions)\r
-        val rootServiceTemplate = ServiceTemplateUtils.getServiceTemplate(rootFilePath)\r
-        // Recursively Import Template files\r
-        val schemaImportResolverUtils = BluePrintImportService(rootServiceTemplate, basePath)\r
-        val completeServiceTemplate = schemaImportResolverUtils.getImportResolvedServiceTemplate()\r
-        val blueprintContext = BluePrintContext(completeServiceTemplate)\r
-        blueprintContext.rootPath = basePath\r
-        return blueprintContext\r
+        private fun readBlueprintFile(entityDefinitions: String, basePath: String): BluePrintContext {\r
+            val rootFilePath: String = basePath.plus(File.separator).plus(entityDefinitions)\r
+            val rootServiceTemplate = ServiceTemplateUtils.getServiceTemplate(rootFilePath)\r
+            // Recursively Import Template files\r
+            val schemaImportResolverUtils = BluePrintImportService(rootServiceTemplate, basePath)\r
+            val completeServiceTemplate = schemaImportResolverUtils.getImportResolvedServiceTemplate()\r
+            val blueprintContext = BluePrintContext(completeServiceTemplate)\r
+            blueprintContext.rootPath = basePath\r
+            blueprintContext.entryDefinition = entityDefinitions\r
+            return blueprintContext\r
+        }\r
     }\r
 }
\ No newline at end of file
index 7330663..6a156ff 100644 (file)
@@ -37,9 +37,8 @@
     "component-resource-assignment": {
       "description": "This is Resource Assignment Component API",
       "version": "1.0.0",
-      "properties": {
-        "request-id": {
-          "description": "Request Id used to store the generated configuration, in the database along with the template-name",
+      "attributes": {
+        "assignment-params": {
           "required": true,
           "type": "string"
         }
index 51d70ed..38fc97d 100644 (file)
@@ -1,6 +1,12 @@
 {\r
   "description": "This is Resource Assignment Component API",\r
   "version": "1.0.0",\r
+  "attributes": {\r
+    "assignment-params": {\r
+      "required": true,\r
+      "type": "string"\r
+    }\r
+  },\r
   "capabilities": {\r
     "component-node": {\r
       "type": "tosca.capabilities.Node"\r