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
21 import org.onap.ccsdk.cds.controllerblueprints.core.BlueprintTypes
22 import org.onap.ccsdk.cds.controllerblueprints.core.asJsonPrimitive
23 import org.onap.ccsdk.cds.controllerblueprints.core.data.NodeTemplate
24 import org.onap.ccsdk.cds.controllerblueprints.core.jsonAsJsonType
25 import kotlin.test.assertNotNull
27 class BlueprintDSLTest {
30 fun testOperationDSLWorkflow() {
32 val blueprint = blueprint(
34 "brindasanth@onap.com", "sample, blueprints"
37 artifactType(BlueprintTypes.artifactTypeTemplateVelocity())
39 // For New Component Definition
41 "resource-resolution", "component-script-executor", "1.0.0",
42 "Resource Resolution component."
45 // Attributes ( Properties which will be set during execution)
46 attribute("template1-data", "string", true, "")
49 property("string-value1", "string", true, "sample")
50 property("string-value2", "string", true, getInput("key-1"))
52 input("json-content", "json", true, """{ "name" : "cds"}""")
53 input("template-content", "string", true, getArtifact("template1"))
55 output("self-attribute-expression", "json", true, getAttribute("template1-data"))
57 artifact("template1", "artifact-template-velocity", "Templates/template1.vtl")
60 // Already definitions Registered Components
62 "activate-restconf", "component-resource-resolution", "1.0.0",
63 "RestconfExecutor", "Resource Resolution component."
67 property("string-value1", "data")
69 input("json-content", """{ "name" : "cds"}""")
71 output("self-attribute-expression", getAttribute("template1-data"))
73 artifact("template2", "artifact-template-velocity", "Templates/template1.vtl")
76 workflow("resource-resolution-process", "Resource Resolution wf") {
77 input("json-content", "json", true, "")
78 input("key-1", "string", true, "")
79 output("status", "string", true, "success")
80 step("resource-resolution-call", "resource-resolution", "Resource Resolution component invoke")
83 assertNotNull(blueprint.components, "failed to get components")
84 assertNotNull(blueprint.workflows, "failed to get workflows")
85 // println(blueprint.asJsonString(true))
87 val serviceTemplateGenerator = BlueprintServiceTemplateGenerator(blueprint)
88 val serviceTemplate = serviceTemplateGenerator.serviceTemplate()
89 assertNotNull(serviceTemplate.topologyTemplate, "failed to get service topology template")
90 // println(serviceTemplate.asJsonString(true))
94 fun testServiceTemplate() {
95 val serviceTemplate = serviceTemplate(
97 "brindasanth@onap.com", "sample, blueprints"
99 metadata("release", "1806")
100 import("Definition/data_types.json")
101 dsl("rest-endpoint", """{ "selector" : "odl-selector"}""")
102 dsl("db-endpoint", """{ "selector" : "db-selector"}""")
105 nodeTypeResourceSource()
108 artifactTypeTemplateVelocity()
109 artifactTypeTempleJinja()
110 artifactTypeScriptKotlin()
111 artifactTypeMappingResource()
112 artifactTypeComponentJar()
113 artifactTypeK8sProfileFolder()
114 artifactTypeK8sConfigFolder()
116 relationshipTypeConnectsTo()
117 relationshipTypeDependsOn()
118 relationshipTypeHostedOn()
121 nodeTemplateOperation(
122 nodeTemplateName = "activate", type = "sample-node-type", interfaceName = "RestconfExecutor",
123 description = "sample activation"
125 implementation(360, "SELF") {
126 primary("Scripts/sample.py")
127 dependencies("one", "two")
130 property("json-content", """{ "name" : "cds"}""")
131 property("array-content", """["controller", "blueprints"]""")
132 property("int-value", 234)
133 property("boolean-value", true)
134 property("string-value", "sample")
135 property("input-expression", getInput("key-1"))
136 property("self-property-expression", getProperty("key-1"))
137 property("self-artifact-expression", getArtifact("key-1"))
138 property("other-artifact-expression", getNodeTemplateArtifact("node-1", "key-1"))
141 property("self-attribute-expression", getAttribute("key-1"))
144 // Other way of defining Node Template with artifacts, implementation
145 nodeTemplate("resolve", "sample-resolve-type", "Resource Resolution") {
146 operation("ResourceResolutionExecutor", "") {
149 property("boolean-value", true)
150 property("string-value", "sample")
153 property("resolve-expression", getAttribute("key-1"))
156 artifact("sample-template", "artifact-velocity", "Templates/sample-template.vtl")
159 workflow("resource-resolution", "to resolve resources") {
160 step("resource-resolution-call", "resolve", "Resource Resolution component invoke")
162 // Alternate way to define workflow
163 workflow("activate", "to resolve resources") {
164 // Alternate step definition
165 step("netconf-activate-call", "activate", "call activation component") {
170 property("request-content", "json", true)
173 property("response-content", "json", true) {
174 value(getAttribute("key-1"))
175 defaultValue("""{ "status" : "success"}""".jsonAsJsonType())
182 // println(serviceTemplate.asJsonString(true))
183 assertNotNull(serviceTemplate.artifactTypes, "failed to get artifactTypes")
184 assertNotNull(serviceTemplate.nodeTypes, "failed to get nodeTypes")
185 assertNotNull(serviceTemplate.relationshipTypes, "failed to get relationshipTypes")
186 assertNotNull(serviceTemplate.topologyTemplate, "failed to get topology template")
187 assertNotNull(serviceTemplate.topologyTemplate?.nodeTemplates, "failed to get nodeTypes")
189 serviceTemplate.topologyTemplate?.nodeTemplates!!["activate"],
190 "failed to get nodeTypes(activate)"
195 fun testNodeTypePropertyConstrains() {
196 val nodeType = nodeType("data-node", "1.0.0", "tosca.Nodes.root", "") {
197 property("ip-address", "string", true, "") {
198 defaultValue("127.0.0.1")
200 validValues(arrayListOf("""127.0.0.1""".asJsonPrimitive()))
206 property("disk-space", "string", true, "") {
209 validValues("""["200KB", "400KB"]""")
211 inRange("""["100KB", "500KB" ]""")
216 validValues("""[ 200, 400]""")
217 greaterOrEqual("10KB")
224 assertNotNull(nodeType, "failed to get nodeType")
225 // println(nodeType.asJsonString(true))
229 fun testServiceTemplateWorkflow() {
230 val serviceTemplate = serviceTemplate(
231 "sample-bp", "1.0.0",
232 "brindasanth@onap.com", "sample, blueprints"
235 workflowNodeTemplate("activate", "component-resource-resolution", "") {
236 operation("ResourceResolutionExecutor", "") {
238 property("string-value", "sample")
244 assertNotNull(serviceTemplate.topologyTemplate, "failed to get topology template")
245 assertNotNull(serviceTemplate.topologyTemplate?.workflows?.get("activate"), "failed to get workflow(activate)")
246 // println(serviceTemplate.asJsonString(true))
250 fun testNodeTemplateOperationTypes() {
252 val testNodeTemplateInstance = BlueprintTypes.nodeTemplateComponentTestExecutor(
253 id = "test-node-template",
257 prop1("i am property1")
258 prop2("i am property2")
260 definedOperation("") {
263 request("i am request")
266 response(getAttribute("attribute1"))
270 assertNotNull(testNodeTemplateInstance, "failed to get test node template")
271 // println(testNodeTemplateInstance.asJsonString(true))
275 fun BlueprintTypes.nodeTemplateComponentTestExecutor(
278 block: TestNodeTemplateOperationImplBuilder.() -> Unit
281 return TestNodeTemplateOperationImplBuilder(id, description).apply(block).build()
284 class TestNodeTemplateOperationImplBuilder(id: String, description: String) :
285 AbstractNodeTemplateOperationImplBuilder<TestProperty, TestInput, TestOutput>(
286 id, "component-test-executor",
287 "ComponentTestExecutor",
291 class TestProperty : PropertiesAssignmentBuilder() {
293 fun prop1(prop1: String) {
294 property("prop1", prop1.asJsonPrimitive())
297 fun prop2(prop2: String) {
298 property("prop2", prop2.asJsonPrimitive())
302 class TestInput : PropertiesAssignmentBuilder() {
304 fun request(request: String) {
305 property("request", request.asJsonPrimitive())
309 class TestOutput : PropertiesAssignmentBuilder() {
311 fun response(response: String) {
312 response(response.asJsonPrimitive())
315 fun response(response: JsonNode) {
316 property("response", response)