2 * Copyright © 2019 IBM.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.ccsdk.cds.controllerblueprints.core.dsl
19 import com.fasterxml.jackson.databind.JsonNode
20 import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
21 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonType
22 import org.onap.ccsdk.cds.controllerblueprints.core.data.ArtifactDefinition
23 import org.onap.ccsdk.cds.controllerblueprints.core.data.CapabilityAssignment
24 import org.onap.ccsdk.cds.controllerblueprints.core.data.Implementation
25 import org.onap.ccsdk.cds.controllerblueprints.core.data.InterfaceAssignment
26 import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate
27 import org.onap.ccsdk.cds.controllerblueprints.core.data.OperationAssignment
28 import org.onap.ccsdk.cds.controllerblueprints.core.data.RelationshipTemplate
29 import org.onap.ccsdk.cds.controllerblueprints.core.data.RequirementAssignment
30 import org.onap.ccsdk.cds.controllerblueprints.core.data.TopologyTemplate
31 import org.onap.ccsdk.cds.controllerblueprints.core.data.Workflow
32 import kotlin.reflect.KClass
33 import kotlin.reflect.KMutableProperty1
34 import kotlin.reflect.full.createInstance
35 import kotlin.reflect.jvm.reflect
37 open class TopologyTemplateBuilder {
39 private var topologyTemplate = TopologyTemplate()
40 var nodeTemplates: MutableMap<String, NodeTemplate>? = null
41 var relationshipTemplates: MutableMap<String, RelationshipTemplate>? = null
42 private var workflows: MutableMap<String, Workflow>? = null
44 fun nodeTemplate(id: String, type: String, description: String, block: NodeTemplateBuilder.() -> Unit) {
45 if (nodeTemplates == null) nodeTemplates = hashMapOf()
46 nodeTemplates!![id] = NodeTemplateBuilder(id, type, description).apply(block).build()
49 fun nodeTemplate(nodeTemplate: NodeTemplate) {
50 if (nodeTemplates == null) nodeTemplates = hashMapOf()
51 nodeTemplates!![nodeTemplate.id!!] = nodeTemplate
54 fun relationshipTemplate(
58 block: RelationshipTemplateBuilder.() -> Unit
60 if (relationshipTemplates == null) relationshipTemplates = hashMapOf()
61 relationshipTemplates!![id] = RelationshipTemplateBuilder(id, type, description).apply(block).build()
64 fun relationshipTemplate(relationshipTemplate: RelationshipTemplate) {
65 if (relationshipTemplates == null) relationshipTemplates = hashMapOf()
66 relationshipTemplates!![relationshipTemplate.id!!] = relationshipTemplate
69 fun nodeTemplateOperation(
70 nodeTemplateName: String,
72 interfaceName: String,
74 operationBlock: OperationAssignmentBuilder<PropertiesAssignmentBuilder,
75 PropertiesAssignmentBuilder>.() -> Unit
77 if (nodeTemplates == null) nodeTemplates = hashMapOf()
79 val nodeTemplateBuilder = NodeTemplateBuilder(nodeTemplateName, type, description)
80 nodeTemplateBuilder.operation(interfaceName, "$description operation", operationBlock)
81 nodeTemplates!![nodeTemplateName] = nodeTemplateBuilder.build()
84 fun workflow(id: String, description: String, block: WorkflowBuilder.() -> Unit) {
85 if (workflows == null) workflows = hashMapOf()
86 workflows!![id] = WorkflowBuilder(id, description).apply(block).build()
89 fun workflow(workflow: Workflow) {
90 if (workflows == null) workflows = hashMapOf()
91 workflows!![workflow.id!!] = workflow
94 // TODO("populate inputs, outputs")
95 fun workflowNodeTemplate(
97 nodeTemplateType: String,
99 block: NodeTemplateBuilder.() -> Unit
101 if (nodeTemplates == null) nodeTemplates = hashMapOf()
103 if (workflows == null) workflows = hashMapOf()
105 val workflowBuilder = WorkflowBuilder(actionName, description)
106 workflowBuilder.nodeTemplateStep(actionName, description)
107 // Workflow name is NodeTemplate name
108 workflows!![actionName] = workflowBuilder.build()
110 nodeTemplates!![actionName] =
111 NodeTemplateBuilder(actionName, nodeTemplateType, description).apply(block).build()
114 fun build(): TopologyTemplate {
115 topologyTemplate.nodeTemplates = nodeTemplates
116 topologyTemplate.relationshipTemplates = relationshipTemplates
117 topologyTemplate.workflows = workflows
118 return topologyTemplate
122 open class NodeTemplateBuilder(
123 private val id: String,
124 private val type: String,
125 private val description: String? = ""
128 var nodeTemplate: NodeTemplate = NodeTemplate()
129 var properties: MutableMap<String, JsonNode>? = null
130 var interfaces: MutableMap<String, InterfaceAssignment>? = null
131 var artifacts: MutableMap<String, ArtifactDefinition>? = null
132 var capabilities: MutableMap<String, CapabilityAssignment>? = null
133 var requirements: MutableMap<String, RequirementAssignment>? = null
135 fun properties(properties: Map<String, JsonNode>) {
136 if (this.properties == null) this.properties = hashMapOf()
137 this.properties!!.putAll(properties)
140 fun properties(block: PropertiesAssignmentBuilder.() -> Unit) {
141 if (properties == null) properties = hashMapOf()
142 properties = PropertiesAssignmentBuilder().apply(block).build()
145 open fun <Prop : PropertiesAssignmentBuilder> typedProperties(block: Prop.() -> Unit) {
146 if (properties == null) properties = hashMapOf()
147 val instance: Prop = (block.reflect()?.parameters?.get(0)?.type?.classifier as KClass<Prop>).createInstance()
148 properties = instance.apply(block).build()
151 open fun <In : PropertiesAssignmentBuilder, Out : PropertiesAssignmentBuilder> typedOperation(
152 interfaceName: String,
153 description: String = "",
154 block: OperationAssignmentBuilder<In, Out>.() -> Unit
156 if (interfaces == null) interfaces = hashMapOf()
158 val interfaceAssignment = InterfaceAssignment()
159 val defaultOperationName = BluePrintConstants.DEFAULT_STEP_OPERATION
160 interfaceAssignment.operations = hashMapOf()
161 interfaceAssignment.operations!![defaultOperationName] =
162 OperationAssignmentBuilder<In, Out>(defaultOperationName, description).apply(block).build()
163 interfaces!![interfaceName] = interfaceAssignment
167 interfaceName: String,
169 block: OperationAssignmentBuilder<PropertiesAssignmentBuilder, PropertiesAssignmentBuilder>.() -> Unit
171 typedOperation<PropertiesAssignmentBuilder, PropertiesAssignmentBuilder>(interfaceName, description, block)
174 fun artifact(id: String, type: String, file: String) {
175 if (artifacts == null) artifacts = hashMapOf()
176 artifacts!![id] = ArtifactDefinitionBuilder(id, type, file).build()
179 fun artifact(id: String, type: String, file: String, block: ArtifactDefinitionBuilder.() -> Unit) {
180 if (artifacts == null) artifacts = hashMapOf()
181 artifacts!![id] = ArtifactDefinitionBuilder(id, type, file).apply(block).build()
184 fun artifacts(artifacts: MutableMap<String, ArtifactDefinition>?) {
185 this.artifacts = artifacts
188 fun capability(id: String, block: CapabilityAssignmentBuilder.() -> Unit) {
189 if (capabilities == null) capabilities = hashMapOf()
190 capabilities!![id] = CapabilityAssignmentBuilder(id).apply(block).build()
193 fun capabilities(capabilities: MutableMap<String, CapabilityAssignment>) {
194 if (this.capabilities == null) this.capabilities = hashMapOf()
195 this.capabilities!!.putAll(capabilities)
198 fun requirement(id: String, capability: String, node: String, relationship: String) {
199 if (requirements == null) requirements = hashMapOf()
200 requirements!![id] = RequirementAssignmentBuilder(id, capability, node, relationship).build()
203 fun requirements(requirements: MutableMap<String, RequirementAssignment>) {
204 if (this.requirements == null) this.requirements = hashMapOf()
205 this.requirements!!.putAll(requirements)
208 open fun build(): NodeTemplate {
210 nodeTemplate.type = type
211 nodeTemplate.description = description
212 nodeTemplate.properties = properties
213 nodeTemplate.interfaces = interfaces
214 nodeTemplate.artifacts = artifacts
215 nodeTemplate.capabilities = capabilities
216 nodeTemplate.requirements = requirements
221 open class RelationshipTemplateBuilder(
222 private val id: String,
223 private val type: String,
224 private val description: String? = ""
227 var relationshipTemplate: RelationshipTemplate = RelationshipTemplate()
228 var properties: MutableMap<String, JsonNode>? = null
230 fun properties(properties: Map<String, JsonNode>) {
231 if (this.properties == null) this.properties = hashMapOf()
232 this.properties!!.putAll(properties)
235 fun properties(block: PropertiesAssignmentBuilder.() -> Unit) {
236 if (properties == null) properties = hashMapOf()
237 properties = PropertiesAssignmentBuilder().apply(block).build()
240 fun property(id: String, value: Any) {
241 if (properties == null) properties = hashMapOf()
242 properties!![id] = value.asJsonType()
245 fun property(id: String, value: JsonNode) {
246 if (properties == null) properties = hashMapOf()
247 properties!![id] = value
250 fun copy(copy: String) {
251 relationshipTemplate.copy = copy
254 open fun <Prop : PropertiesAssignmentBuilder> typedProperties(block: Prop.() -> Unit) {
255 if (properties == null) properties = hashMapOf()
256 val instance: Prop = (block.reflect()?.parameters?.get(0)?.type?.classifier as KClass<Prop>).createInstance()
257 properties = instance.apply(block).build()
260 open fun build(): RelationshipTemplate {
261 relationshipTemplate.id = id
262 relationshipTemplate.type = type
263 relationshipTemplate.description = description
264 relationshipTemplate.properties = properties
265 return relationshipTemplate
269 class ArtifactDefinitionBuilder(private val id: String, private val type: String, private val file: String) {
271 private var artifactDefinition: ArtifactDefinition = ArtifactDefinition()
272 private var properties: MutableMap<String, JsonNode>? = null
274 fun repository(repository: String) {
275 artifactDefinition.repository = repository
278 fun deployPath(deployPath: String) {
279 artifactDefinition.deployPath = deployPath
282 fun properties(block: PropertiesAssignmentBuilder.() -> Unit) {
283 if (properties == null)
284 properties = hashMapOf()
285 properties = PropertiesAssignmentBuilder().apply(block).build()
288 fun build(): ArtifactDefinition {
289 artifactDefinition.id = id
290 artifactDefinition.type = type
291 artifactDefinition.file = file
292 artifactDefinition.properties = properties
293 return artifactDefinition
297 open class CapabilityAssignmentBuilder(private val id: String) {
299 var capabilityAssignment: CapabilityAssignment = CapabilityAssignment()
300 var attributes: MutableMap<String, JsonNode>? = null
301 var properties: MutableMap<String, JsonNode>? = null
303 fun attributes(block: AttributesAssignmentBuilder.() -> Unit) {
304 if (attributes == null) attributes = hashMapOf()
305 attributes = AttributesAssignmentBuilder().apply(block).build()
308 fun properties(block: PropertiesAssignmentBuilder.() -> Unit) {
309 if (properties == null) properties = hashMapOf()
310 properties = PropertiesAssignmentBuilder().apply(block).build()
313 fun property(id: String, value: Any) {
314 if (properties == null) properties = hashMapOf()
315 properties!![id] = value.asJsonType()
318 fun property(id: String, value: JsonNode) {
319 if (properties == null) properties = hashMapOf()
320 properties!![id] = value
323 open fun build(): CapabilityAssignment {
324 capabilityAssignment.properties = properties
325 capabilityAssignment.attributes = attributes
326 return capabilityAssignment
330 open class RequirementAssignmentBuilder(
331 private val id: String,
332 private val capability: String,
333 private val node: String,
334 private val relationship: String
337 private var requirementAssignment: RequirementAssignment = RequirementAssignment()
339 fun build(): RequirementAssignment {
340 requirementAssignment.id = id
341 requirementAssignment.capability = capability
342 requirementAssignment.node = node
343 requirementAssignment.relationship = relationship
344 return requirementAssignment
348 class InterfaceAssignmentBuilder(private val id: String) {
350 private var interfaceAssignment: InterfaceAssignment = InterfaceAssignment()
351 private var operations: MutableMap<String, OperationAssignment>? = null
355 description: String? = "",
356 block: OperationAssignmentBuilder<PropertiesAssignmentBuilder, PropertiesAssignmentBuilder>.() -> Unit
358 if (operations == null)
359 operations = hashMapOf()
360 operations!![id] = OperationAssignmentBuilder<PropertiesAssignmentBuilder, PropertiesAssignmentBuilder>(
362 ).apply(block).build()
365 fun build(): InterfaceAssignment {
366 interfaceAssignment.id = id
367 interfaceAssignment.operations = operations
368 return interfaceAssignment
372 class OperationAssignmentBuilder<In : PropertiesAssignmentBuilder, Out : PropertiesAssignmentBuilder>(
373 private val id: String,
374 private val description: String? = ""
377 private var operationAssignment: OperationAssignment = OperationAssignment()
379 fun implementation(implementation: Implementation?) {
380 operationAssignment.implementation = implementation
383 fun implementation(timeout: Int, operationHost: String? = BluePrintConstants.PROPERTY_SELF) {
384 operationAssignment.implementation = Implementation().apply {
385 this.operationHost = operationHost!!
386 this.timeout = timeout
392 operationHost: String? = BluePrintConstants.PROPERTY_SELF,
393 block: ImplementationBuilder.() -> Unit
395 operationAssignment.implementation = ImplementationBuilder(timeout, operationHost!!).apply(block).build()
398 fun inputs(inputs: MutableMap<String, JsonNode>?) {
399 operationAssignment.inputs = inputs
402 fun inputs(block: In.() -> Unit) {
403 val instance: In = (block.reflect()?.parameters?.get(0)?.type?.classifier as KClass<In>).createInstance()
404 operationAssignment.inputs = instance.apply(block).build()
407 fun outputs(outputs: MutableMap<String, JsonNode>?) {
408 operationAssignment.outputs = outputs
411 fun outputs(block: Out.() -> Unit) {
412 val instance: Out = (block.reflect()?.parameters?.get(0)?.type?.classifier as KClass<Out>).createInstance()
413 operationAssignment.outputs = instance.apply(block).build()
416 fun build(): OperationAssignment {
417 operationAssignment.id = id
418 operationAssignment.description = description
419 return operationAssignment
423 class ImplementationBuilder(private val timeout: Int, private val operationHost: String) {
425 private val implementation = Implementation()
427 fun primary(primary: String) {
428 implementation.primary = primary
431 fun dependencies(vararg dependencies: String) {
432 if (implementation.dependencies == null)
433 implementation.dependencies = arrayListOf()
434 dependencies.forEach {
435 implementation.dependencies!!.add(it)
439 fun build(): Implementation {
440 implementation.timeout = timeout
441 implementation.operationHost = operationHost
442 return implementation
446 open class PropertiesAssignmentBuilder {
448 var properties: MutableMap<String, JsonNode> = hashMapOf()
450 fun property(id: String, value: Any) {
451 property(id, value.asJsonType())
454 fun property(id: String, value: JsonNode) {
455 properties[id] = value
458 fun property(kProperty: KMutableProperty1<*, *>, value: JsonNode) {
459 properties[kProperty.name] = value
462 open fun build(): MutableMap<String, JsonNode> {
467 open class AttributesAssignmentBuilder {
469 var attributes: MutableMap<String, JsonNode> = hashMapOf()
471 fun attribute(id: String, value: String) {
472 attribute(id, value.asJsonType())
475 fun attribute(id: String, value: JsonNode) {
476 attributes[id] = value
479 fun build(): MutableMap<String, JsonNode> {