DSL to service template generator
Change-Id: I179bb3bf83d6c1688a13dce965a3d4388f011fcd
Issue-ID: CCSDK-1421
Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/BluePrintConstants.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/BluePrintConstants.kt
index 786bcd3..67a215e 100644
--- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/BluePrintConstants.kt
+++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/BluePrintConstants.kt
@@ -180,8 +180,18 @@
const val PROPERTY_CURRENT_IMPLEMENTATION = "current-implementation"
const val PROPERTY_EXECUTION_REQUEST = "execution-request"
+ const val DEFAULT_VERSION_NUMBER = "1.0.0"
const val DEFAULT_STEP_OPERATION = "process"
+ const val DEFAULT_STEP_INTERFACE = "ComponentInterface"
const val ARTIFACT_VELOCITY_TYPE_NAME = "artifact-template-velocity"
const val ARTIFACT_JINJA_TYPE_NAME = "artifact-template-jinja"
+
+ const val MODEL_TYPE_ARTIFACT_TEMPLATE_VELOCITY = "artifact-template-velocity"
+ const val MODEL_TYPE_ARTIFACT_TEMPLATE_JINJA = "artifact-template-jinja"
+ const val MODEL_TYPE_ARTIFACT_MAPPING_RESOURCE = "artifact-mapping-resource"
+ const val MODEL_TYPE_ARTIFACT_SCRIPT_JYTHON = "artifact-script-jython"
+ const val MODEL_TYPE_ARTIFACT_SCRIPT_KOTLIN = "artifact-script-kotlin"
+ const val MODEL_TYPE_ARTIFACT_DIRECTED_GRAPH = "artifact-directed-graph"
+ const val MODEL_TYPE_ARTIFACT_COMPONENT_JAR = "artifact-component-jar"
}
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt
index a508c8f..ab54f56 100644
--- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt
+++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/CustomFunctions.kt
@@ -19,6 +19,7 @@
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.node.*
+import org.apache.commons.lang3.ObjectUtils
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
import org.slf4j.helpers.MessageFormatter
import kotlin.reflect.KClass
@@ -29,6 +30,10 @@
* @author Brinda Santh
*/
+fun <T : Any> T.bpClone(): T {
+ return ObjectUtils.clone(this)
+}
+
fun String.isJson(): Boolean {
return ((this.startsWith("{") && this.endsWith("}"))
|| (this.startsWith("[") && this.endsWith("]")))
@@ -100,10 +105,10 @@
}
fun <T : Any> Map<String, *>.castOptionalValue(key: String, valueType: KClass<T>): T? {
- if (containsKey(key)) {
- return get(key) as? T
+ return if (containsKey(key)) {
+ get(key) as? T
} else {
- return null
+ null
}
}
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSL.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSL.kt
index 95303ea..c88408f 100644
--- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSL.kt
+++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSL.kt
@@ -17,6 +17,8 @@
package org.onap.ccsdk.cds.controllerblueprints.core.dsl
import com.fasterxml.jackson.databind.JsonNode
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintTypes
import org.onap.ccsdk.cds.controllerblueprints.core.data.*
import org.onap.ccsdk.cds.controllerblueprints.core.jsonAsJsonType
@@ -56,6 +58,11 @@
return ArtifactTypeBuilder(id, version, derivedFrom, description).apply(block).build()
}
+fun relationshipType(id: String, version: String, derivedFrom: String, description: String,
+ block: RelationshipTypeBuilder.() -> Unit): RelationshipType {
+ return RelationshipTypeBuilder(id, version, derivedFrom, description).apply(block).build()
+}
+
// Input Function
fun getInput(inputKey: String): JsonNode {
@@ -104,4 +111,122 @@
fun getNodeTemplateArtifact(nodeTemplateName: String, artifactId: String): JsonNode {
return """{"get_artifact": ["$nodeTemplateName", "$artifactId"]}""".jsonAsJsonType()
-}
\ No newline at end of file
+}
+
+
+/** Blueprint Type Extensions */
+
+fun BluePrintTypes.nodeTypeComponent(): NodeType {
+ return nodeType(id = BluePrintConstants.MODEL_TYPE_NODE_COMPONENT,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_NODES_ROOT,
+ description = "This is default Component Node") {
+ }
+}
+
+fun BluePrintTypes.nodeTypeWorkflow(): NodeType {
+ return nodeType(id = BluePrintConstants.MODEL_TYPE_NODE_WORKFLOW,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_NODES_ROOT,
+ description = "This is default Workflow Node") {
+ }
+}
+
+fun BluePrintTypes.nodeTypeVnf(): NodeType {
+ return nodeType(id = BluePrintConstants.MODEL_TYPE_NODE_VNF,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_NODES_ROOT,
+ description = "This is default VNF Node") {
+ }
+}
+
+fun BluePrintTypes.nodeTypeResourceSource(): NodeType {
+ return nodeType(id = BluePrintConstants.MODEL_TYPE_NODE_RESOURCE_SOURCE,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_NODES_ROOT,
+ description = "This is default Resource Source Node") {
+ }
+}
+
+/** Artifacts */
+
+fun BluePrintTypes.artifactTypeTemplateVelocity(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_TEMPLATE_VELOCITY,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Velocity Artifact") {
+ fileExt("vtl")
+ }
+}
+
+fun BluePrintTypes.artifactTypeTempleJinja(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_TEMPLATE_JINJA,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Jinja Artifact") {
+ fileExt("jinja")
+ }
+}
+
+fun BluePrintTypes.artifactTypeMappingResource(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_MAPPING_RESOURCE,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Mapping Resource Artifact") {
+ fileExt("json")
+ }
+}
+
+fun BluePrintTypes.artifactTypeScriptJython(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_SCRIPT_JYTHON,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Jython Script Artifact") {
+ fileExt("py")
+ }
+}
+
+fun BluePrintTypes.artifactTypeScriptKotlin(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_SCRIPT_KOTLIN,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Kotlin Script Artifact") {
+ fileExt("kts")
+ }
+}
+
+fun BluePrintTypes.artifactTypeDirectedGraph(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_DIRECTED_GRAPH,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Directed Graph Artifact") {
+ fileExt("xml", "json")
+ }
+}
+
+fun BluePrintTypes.artifactTypeComponentJar(): ArtifactType {
+ return artifactType(id = BluePrintConstants.MODEL_TYPE_ARTIFACT_COMPONENT_JAR,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_ARTIFACT_TYPE_IMPLEMENTATION,
+ description = "Component Artifact") {
+ fileExt("jar")
+ }
+}
+
+/** Relationship Types */
+
+fun BluePrintTypes.relationshipTypeConnectsTo(): RelationshipType {
+ return relationshipType(id = BluePrintConstants.MODEL_TYPE_RELATIONSHIPS_CONNECTS_TO,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_RELATIONSHIPS_ROOT,
+ description = "Relationship connects to") {
+ }
+}
+
+fun BluePrintTypes.relationshipTypeDependsOn(): RelationshipType {
+ return relationshipType(id = BluePrintConstants.MODEL_TYPE_RELATIONSHIPS_DEPENDS_ON,
+ version = BluePrintConstants.DEFAULT_VERSION_NUMBER,
+ derivedFrom = BluePrintConstants.MODEL_TYPE_RELATIONSHIPS_ROOT,
+ description = "Relationship depends on") {
+ }
+}
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLBuilder.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLBuilder.kt
index 8cfa90b..d46d478 100644
--- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLBuilder.kt
+++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLBuilder.kt
@@ -32,9 +32,10 @@
private var dslBluePrint = DSLBluePrint()
private var metadata: MutableMap<String, String> = hashMapOf()
var properties: MutableMap<String, JsonNode>? = null
- var dataType: MutableMap<String, DataType> = hashMapOf()
- var artifacts: MutableMap<String, ArtifactDefinition> = hashMapOf()
+ var dataTypes: MutableMap<String, DataType> = hashMapOf()
+ var artifactTypes: MutableMap<String, ArtifactType> = hashMapOf()
var components: MutableMap<String, DSLComponent> = hashMapOf()
+ private var registryComponents: MutableMap<String, DSLRegistryComponent> = hashMapOf()
var workflows: MutableMap<String, DSLWorkflow> = hashMapOf()
private fun initMetaData() {
@@ -54,15 +55,35 @@
properties!![id] = expression.asJsonType()
}
- fun dataType(id: String, version: String, derivedFrom: String, description: String,
- block: DataTypeBuilder.() -> Unit) {
- dataType[id] = DataTypeBuilder(id, version, derivedFrom, description).apply(block).build()
+ fun dataType(dataType: DataType) {
+ dataTypes[dataType.id!!] = dataType
}
- fun component(id: String, type: String, version: String, description: String, block: DSLComponentBuilder.() -> Unit) {
+ fun dataType(id: String, version: String, derivedFrom: String, description: String,
+ block: DataTypeBuilder.() -> Unit) {
+ dataTypes[id] = DataTypeBuilder(id, version, derivedFrom, description).apply(block).build()
+ }
+
+ fun artifactType(artifactType: ArtifactType) {
+ artifactTypes[artifactType.id!!] = artifactType
+ }
+
+ fun artifactType(id: String, version: String, derivedFrom: String, description: String,
+ block: ArtifactTypeBuilder.() -> Unit) {
+ artifactTypes[id] = ArtifactTypeBuilder(id, version, derivedFrom, description).apply(block).build()
+ }
+
+ fun component(id: String, type: String, version: String, description: String,
+ block: DSLComponentBuilder.() -> Unit) {
components[id] = DSLComponentBuilder(id, type, version, description).apply(block).build()
}
+ fun registryComponent(id: String, type: String, version: String, interfaceName: String, description: String,
+ block: DSLRegistryComponentBuilder.() -> Unit) {
+ registryComponents[id] = DSLRegistryComponentBuilder(id, type, version, interfaceName, description)
+ .apply(block).build()
+ }
+
fun workflow(id: String, description: String, block: DSLWorkflowBuilder.() -> Unit) {
workflows[id] = DSLWorkflowBuilder(id, description).apply(block).build()
}
@@ -71,8 +92,10 @@
initMetaData()
dslBluePrint.metadata = metadata
dslBluePrint.properties = properties
- dslBluePrint.dataType = dataType
+ dslBluePrint.dataTypes = dataTypes
+ dslBluePrint.artifactTypes = artifactTypes
dslBluePrint.components = components
+ dslBluePrint.registryComponents = registryComponents
dslBluePrint.workflows = workflows
return dslBluePrint
}
@@ -84,18 +107,11 @@
var properties: MutableMap<String, PropertyDefinition>? = null
var attributes: MutableMap<String, AttributeDefinition>? = null
- // For already registered components
- private var assignProperties: MutableMap<String, JsonNode>? = null
-
var artifacts: MutableMap<String, ArtifactDefinition>? = null
var implementation: Implementation? = null
var inputs: MutableMap<String, PropertyDefinition>? = null
var outputs: MutableMap<String, PropertyDefinition>? = null
- // For already registered components
- private var assignInputs: MutableMap<String, JsonNode>? = null
- private var assignOutputs: MutableMap<String, JsonNode>? = null
-
fun attribute(id: String, type: String, required: Boolean, expression: Any, description: String? = "") {
if (attributes == null)
attributes = hashMapOf()
@@ -128,12 +144,6 @@
properties!![id] = property
}
- fun assignProperty(id: String, expression: Any) {
- if (assignProperties == null)
- assignProperties = hashMapOf()
- assignProperties!![id] = expression.asJsonType()
- }
-
fun implementation(timeout: Int, operationHost: String? = BluePrintConstants.PROPERTY_SELF) {
implementation = Implementation().apply {
this.operationHost = operationHost!!
@@ -141,13 +151,13 @@
}
}
- fun artifacts(id: String, type: String, file: String) {
+ fun artifact(id: String, type: String, file: String) {
if (artifacts == null)
artifacts = hashMapOf()
artifacts!![id] = ArtifactDefinitionBuilder(id, type, file).build()
}
- fun artifacts(id: String, type: String, file: String, block: ArtifactDefinitionBuilder.() -> Unit) {
+ 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()
@@ -170,12 +180,6 @@
inputs!![id] = property
}
- fun assignInput(id: String, expression: Any) {
- if (assignInputs == null)
- assignInputs = hashMapOf()
- assignInputs!![id] = expression.asJsonType()
- }
-
fun output(id: String, type: String, required: Boolean, expression: Any, description: String? = "") {
if (outputs == null)
outputs = hashMapOf()
@@ -192,12 +196,6 @@
outputs!![id] = property
}
- fun assignOutput(id: String, expression: Any) {
- if (assignOutputs == null)
- assignOutputs = hashMapOf()
- assignOutputs!![id] = expression.asJsonType()
- }
-
fun build(): DSLComponent {
dslComponent.id = id
dslComponent.type = type
@@ -205,19 +203,79 @@
dslComponent.description = description
dslComponent.attributes = attributes
dslComponent.properties = properties
- dslComponent.assignProperties = assignProperties
dslComponent.implementation = implementation
dslComponent.artifacts = artifacts
dslComponent.inputs = inputs
dslComponent.outputs = outputs
- dslComponent.assignInputs = assignInputs
- dslComponent.assignOutputs = assignOutputs
- dslComponent.outputs = outputs
return dslComponent
}
}
+class DSLRegistryComponentBuilder(private val id: String, private val type: String,
+ private val version: String,
+ private val interfaceName: String,
+ private val description: String) {
+ private val dslComponent = DSLRegistryComponent()
+ var properties: MutableMap<String, JsonNode>? = null
+
+ var artifacts: MutableMap<String, ArtifactDefinition>? = null
+ var implementation: Implementation? = null
+ var inputs: MutableMap<String, JsonNode>? = null
+ var outputs: MutableMap<String, JsonNode>? = null
+
+ fun property(id: String, expression: Any) {
+ if (properties == null)
+ properties = hashMapOf()
+ properties!![id] = expression.asJsonType()
+ }
+
+ fun implementation(timeout: Int, operationHost: String? = BluePrintConstants.PROPERTY_SELF) {
+ implementation = Implementation().apply {
+ this.operationHost = operationHost!!
+ this.timeout = timeout
+ }
+ }
+
+ 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 input(id: String, expression: Any) {
+ if (inputs == null)
+ inputs = hashMapOf()
+ inputs!![id] = expression.asJsonType()
+ }
+
+ fun output(id: String, expression: Any) {
+ if (outputs == null)
+ outputs = hashMapOf()
+ outputs!![id] = expression.asJsonType()
+ }
+
+ fun build(): DSLRegistryComponent {
+ dslComponent.id = id
+ dslComponent.type = type
+ dslComponent.version = version
+ dslComponent.interfaceName = interfaceName
+ dslComponent.description = description
+ dslComponent.properties = properties
+ dslComponent.implementation = implementation
+ dslComponent.artifacts = artifacts
+ dslComponent.inputs = inputs
+ dslComponent.outputs = outputs
+ return dslComponent
+ }
+}
+
class DSLWorkflowBuilder(private val actionName: String, private val description: String) {
private val dslWorkflow = DSLWorkflow()
private var steps: MutableMap<String, Step>? = null
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLData.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLData.kt
index 12428a9..61b52a6 100644
--- a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLData.kt
+++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLData.kt
@@ -28,8 +28,10 @@
class DSLBluePrint {
var metadata: MutableMap<String, String> = hashMapOf()
var properties: MutableMap<String, JsonNode>? = null
- var dataType: MutableMap<String, DataType> = hashMapOf()
+ var dataTypes: MutableMap<String, DataType> = hashMapOf()
+ var artifactTypes: MutableMap<String, ArtifactType> = hashMapOf()
var components: MutableMap<String, DSLComponent> = hashMapOf()
+ var registryComponents: MutableMap<String, DSLRegistryComponent> = hashMapOf()
var workflows: MutableMap<String, DSLWorkflow> = hashMapOf()
}
@@ -52,10 +54,21 @@
var implementation: Implementation? = null
var attributes: MutableMap<String, AttributeDefinition>? = null
var properties: MutableMap<String, PropertyDefinition>? = null
- var assignProperties: MutableMap<String, JsonNode>? = null
var artifacts: MutableMap<String, ArtifactDefinition>? = null
var inputs: MutableMap<String, PropertyDefinition>? = null
var outputs: MutableMap<String, PropertyDefinition>? = null
- var assignInputs: MutableMap<String, JsonNode>? = null
- var assignOutputs: MutableMap<String, JsonNode>? = null
+}
+
+
+class DSLRegistryComponent {
+ lateinit var id: String
+ lateinit var type: String
+ lateinit var version: String
+ lateinit var interfaceName: String
+ lateinit var description: String
+ var implementation: Implementation? = null
+ var properties: MutableMap<String, JsonNode>? = null
+ var artifacts: MutableMap<String, ArtifactDefinition>? = null
+ var inputs: MutableMap<String, JsonNode>? = null
+ var outputs: MutableMap<String, JsonNode>? = null
}
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintServiceTemplateGenerator.kt b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintServiceTemplateGenerator.kt
new file mode 100644
index 0000000..a4a5e05
--- /dev/null
+++ b/ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintServiceTemplateGenerator.kt
@@ -0,0 +1,200 @@
+/*
+ * 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 org.onap.ccsdk.cds.controllerblueprints.core.dsl
+
+import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.node.NullNode
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
+import org.onap.ccsdk.cds.controllerblueprints.core.bpClone
+import org.onap.ccsdk.cds.controllerblueprints.core.data.*
+
+/**
+ * Generate Service Template for the simplified DSL.
+ * @author Brinda Santh
+ */
+class BluePrintServiceTemplateGenerator(private val dslBluePrint: DSLBluePrint) {
+
+ private var serviceTemplate = ServiceTemplate()
+
+ private val nodeTypes: MutableMap<String, NodeType> = hashMapOf()
+ private val artifactTypes: MutableMap<String, ArtifactType> = hashMapOf()
+ private val dataTypes: MutableMap<String, DataType> = hashMapOf()
+
+ fun serviceTemplate(): ServiceTemplate {
+ serviceTemplate.metadata = dslBluePrint.metadata
+ serviceTemplate.dslDefinitions = dslBluePrint.properties
+
+ dataTypes.putAll(dslBluePrint.dataTypes)
+ artifactTypes.putAll(dslBluePrint.artifactTypes)
+
+ serviceTemplate.dataTypes = dataTypes
+ serviceTemplate.artifactTypes = artifactTypes
+ serviceTemplate.nodeTypes = nodeTypes
+
+ serviceTemplate.topologyTemplate = populateTopologyTemplate()
+
+ return serviceTemplate
+ }
+
+ private fun populateTopologyTemplate(): TopologyTemplate {
+ val topologyTemplate = TopologyTemplate()
+ topologyTemplate.nodeTemplates = populateNodeTemplates()
+ topologyTemplate.workflows = populateWorkflow()
+ return topologyTemplate
+ }
+
+ private fun populateNodeTemplates(): MutableMap<String, NodeTemplate> {
+
+ val nodeTemplates: MutableMap<String, NodeTemplate> = hashMapOf()
+
+ // For New or Dynamic Components
+ val components = dslBluePrint.components
+ components.forEach { (dslCompName, dslComp) ->
+ val nodeTemplate = NodeTemplate()
+ nodeTemplate.type = dslComp.type
+ nodeTemplate.properties = propertyAssignments(dslComp.properties)
+ nodeTemplate.artifacts = dslComp.artifacts
+ nodeTemplate.interfaces = populateInterfaceAssignments(dslComp)
+ nodeTemplates[dslCompName] = nodeTemplate
+
+ /** Populate Type **/
+ nodeTypes[dslComp.type] = populateNodeType(dslComp)
+ }
+
+ // For Registry Components
+ val registryComponents = dslBluePrint.registryComponents
+ registryComponents.forEach { (dslCompName, dslComp) ->
+ val nodeTemplate = NodeTemplate()
+ nodeTemplate.type = dslComp.type
+ nodeTemplate.properties = dslComp.properties
+ nodeTemplate.artifacts = dslComp.artifacts
+ nodeTemplate.interfaces = populateInterfaceAssignments(dslComp)
+ nodeTemplates[dslCompName] = nodeTemplate
+ }
+ return nodeTemplates
+ }
+
+
+ private fun populateWorkflow(): MutableMap<String, Workflow>? {
+ var workflows: MutableMap<String, Workflow>? = null
+ if (dslBluePrint.workflows.isNotEmpty()) {
+ workflows = hashMapOf()
+
+ dslBluePrint.workflows.forEach { (dslWorkflowName, dslWorkflow) ->
+ val workflow = Workflow()
+ workflow.description = dslWorkflow.description
+ workflow.steps = dslWorkflow.steps
+ workflow.inputs = dslWorkflow.inputs
+ workflow.outputs = dslWorkflow.outputs
+ workflows[dslWorkflowName] = workflow
+ }
+ }
+ return workflows
+ }
+
+ private fun populateNodeType(dslComponent: DSLComponent): NodeType {
+ val nodeType = NodeType()
+ nodeType.derivedFrom = BluePrintConstants.MODEL_TYPE_NODES_ROOT
+ nodeType.version = dslComponent.version
+ nodeType.description = dslComponent.description
+ nodeType.interfaces = populateInterfaceDefinitions(dslComponent, nodeType)
+ return nodeType
+ }
+
+ private fun populateInterfaceDefinitions(dslComponent: DSLComponent, nodeType: NodeType): MutableMap<String, InterfaceDefinition> {
+
+ // Populate Node Type Attribute
+ nodeType.attributes = attributeDefinitions(dslComponent.attributes)
+
+ val operationDefinition = OperationDefinition()
+ operationDefinition.inputs = propertyDefinitions(dslComponent.inputs)
+ operationDefinition.outputs = propertyDefinitions(dslComponent.outputs)
+
+ val operations: MutableMap<String, OperationDefinition> = hashMapOf()
+ operations[BluePrintConstants.DEFAULT_STEP_OPERATION] = operationDefinition
+
+ val interfaceDefinition = InterfaceDefinition()
+ interfaceDefinition.operations = operations
+
+ val interfaces: MutableMap<String, InterfaceDefinition> = hashMapOf()
+ interfaces[BluePrintConstants.DEFAULT_STEP_INTERFACE] = interfaceDefinition
+ return interfaces
+ }
+
+ private fun populateInterfaceAssignments(dslComponent: DSLRegistryComponent): MutableMap<String, InterfaceAssignment> {
+ val operationAssignment = OperationAssignment()
+ operationAssignment.implementation = dslComponent.implementation
+ operationAssignment.inputs = dslComponent.inputs
+ operationAssignment.outputs = dslComponent.outputs
+
+ val operations: MutableMap<String, OperationAssignment> = hashMapOf()
+ operations[BluePrintConstants.DEFAULT_STEP_OPERATION] = operationAssignment
+
+ val interfaceAssignment = InterfaceAssignment()
+ interfaceAssignment.operations = operations
+
+ val interfaces: MutableMap<String, InterfaceAssignment> = hashMapOf()
+ interfaces[dslComponent.interfaceName] = interfaceAssignment
+ return interfaces
+ }
+
+ private fun populateInterfaceAssignments(dslComponent: DSLComponent): MutableMap<String, InterfaceAssignment> {
+ val operationAssignment = OperationAssignment()
+ operationAssignment.implementation = dslComponent.implementation
+ operationAssignment.inputs = propertyAssignments(dslComponent.inputs)
+ operationAssignment.outputs = propertyAssignments(dslComponent.outputs)
+
+ val operations: MutableMap<String, OperationAssignment> = hashMapOf()
+ operations[BluePrintConstants.DEFAULT_STEP_OPERATION] = operationAssignment
+
+ val interfaceAssignment = InterfaceAssignment()
+ interfaceAssignment.operations = operations
+
+ val interfaces: MutableMap<String, InterfaceAssignment> = hashMapOf()
+ interfaces[BluePrintConstants.DEFAULT_STEP_INTERFACE] = interfaceAssignment
+ return interfaces
+ }
+
+ private fun propertyDefinitions(propertyDefinitions: Map<String, PropertyDefinition>?): MutableMap<String, PropertyDefinition>? {
+ val definitions: MutableMap<String, PropertyDefinition>? = propertyDefinitions?.bpClone()?.toMutableMap()
+
+ definitions?.forEach { (_, prop) ->
+ prop.value = null
+ }
+ return definitions
+ }
+
+ private fun attributeDefinitions(attributeDefinitions: Map<String, AttributeDefinition>?): MutableMap<String, AttributeDefinition>? {
+ val definitions: MutableMap<String, AttributeDefinition>? = attributeDefinitions?.bpClone()?.toMutableMap()
+
+ definitions?.forEach { (_, prop) ->
+ prop.value = null
+ }
+ return definitions
+ }
+
+ private fun propertyAssignments(propertyDefinitions: Map<String, PropertyDefinition>?): MutableMap<String, JsonNode>? {
+ var assignments: MutableMap<String, JsonNode>? = null
+ if (propertyDefinitions != null) {
+ assignments = hashMapOf()
+ propertyDefinitions.forEach { (propertyName, property) ->
+ assignments[propertyName] = property.value ?: NullNode.instance
+ }
+ }
+ return assignments
+ }
+}
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLTest.kt b/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLTest.kt
index e7f24d6..020edc7 100644
--- a/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLTest.kt
+++ b/ms/controllerblueprints/modules/blueprint-core/src/test/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/dsl/BluePrintDSLTest.kt
@@ -17,6 +17,7 @@
package org.onap.ccsdk.cds.controllerblueprints.core.dsl
import org.junit.Test
+import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintTypes
import org.onap.ccsdk.cds.controllerblueprints.core.jsonAsJsonType
import kotlin.test.assertNotNull
@@ -28,9 +29,11 @@
val blueprint = blueprint("sample-bp", "1.0.0",
"brindasanth@onap.com", "sample, blueprints") {
+ artifactType(BluePrintTypes.artifactTypeTemplateVelocity())
+
// For New Component Definition
- component("resource-resolution", "component-resource-resolution", "1.0.0",
- "Resource Resolution Call") {
+ component("resource-resolution", "component-script-executor", "1.0.0",
+ "Resource Resolution component.") {
implementation(180)
// Attributes ( Properties which will be set during execution)
attribute("template1-data", "string", true, "")
@@ -44,10 +47,25 @@
// Outputs
output("self-attribute-expression", "json", true, getAttribute("template1-data"))
// Artifacts
- artifacts("template1", "artifact-velocity", "Templates/template1.vtl")
+ artifact("template1", "artifact-template-velocity", "Templates/template1.vtl")
}
- workflow("resource-resolution-process", "") {
+ // Already definitions Registered Components
+ registryComponent("activate-restconf", "component-resource-resolution", "1.0.0",
+ "RestconfExecutor", "Resource Resolution component.") {
+ implementation(180)
+ // Properties
+ property("string-value1", "data")
+ // Inputs
+ input("json-content", """{ "name" : "cds"}""")
+ // Outputs
+ output("self-attribute-expression", getAttribute("template1-data"))
+ // Artifacts
+ artifact("template2", "artifact-template-velocity", "Templates/template1.vtl")
+
+ }
+
+ workflow("resource-resolution-process", "Resource Resolution wf") {
input("json-content", "json", true, "")
input("key-1", "string", true, "")
output("status", "string", true, "success")
@@ -57,6 +75,11 @@
assertNotNull(blueprint.components, "failed to get components")
assertNotNull(blueprint.workflows, "failed to get workflows")
//println(blueprint.asJsonString(true))
+
+ val serviceTemplateGenerator = BluePrintServiceTemplateGenerator(blueprint)
+ val serviceTemplate = serviceTemplateGenerator.serviceTemplate()
+ assertNotNull(serviceTemplate.topologyTemplate, "failed to get service topology template")
+ //println(serviceTemplate.asJsonString(true))
}
@Test