Controller Blueprints Microservice
authorBrinda Santh <brindasanth@in.ibm.com>
Thu, 6 Sep 2018 01:47:01 +0000 (21:47 -0400)
committerBrinda Santh <brindasanth@in.ibm.com>
Thu, 6 Sep 2018 01:47:01 +0000 (21:47 -0400)
Add Controller Blueprint NodeTemplate Interface, Operation, Input and Output validation

Change-Id: I6fae38cc8a4a36ddacc93bcea4b0061f846c6aba
Issue-ID: CCSDK-484
Signed-off-by: Brinda Santh <brindasanth@in.ibm.com>
components/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/service/BluePrintValidatorService.kt

index a3b68e0..a60f532 100644 (file)
@@ -1,5 +1,6 @@
 /*\r
  * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ * Modifications Copyright © 2018 IBM.\r
  *\r
  * Licensed under the Apache License, Version 2.0 (the "License");\r
  * you may not use this file except in compliance with the License.\r
@@ -187,7 +188,7 @@ open class BluePrintValidatorDefaultService : BluePrintValidatorService {
         nodeTemplate.properties?.let { validatePropertyAssignments(nodeType.properties!!, nodeTemplate.properties!!) }\r
         nodeTemplate.capabilities?.let { validateCapabilityAssignments(nodeTemplate.capabilities!!) }\r
         nodeTemplate.requirements?.let { validateRequirementAssignments(nodeTemplate.requirements!!) }\r
-        nodeTemplate.interfaces?.let { validateInterfaceAssignments(nodeTemplate.interfaces!!) }\r
+        nodeTemplate.interfaces?.let { validateInterfaceAssignments(nodeType, nodeTemplateName, nodeTemplate) }\r
         paths.removeAt(paths.lastIndex)\r
     }\r
 \r
@@ -293,10 +294,71 @@ open class BluePrintValidatorDefaultService : BluePrintValidatorService {
     }\r
 \r
     @Throws(BluePrintException::class)\r
-    open fun validateInterfaceAssignments(interfaces: MutableMap<String, InterfaceAssignment>) {\r
+    open fun validateInterfaceAssignments(nodeType: NodeType, nodeTemplateName: String, nodeTemplate: NodeTemplate) {\r
+\r
+        val interfaces = nodeTemplate.interfaces\r
+        paths.add("interfaces")\r
+        interfaces?.forEach { interfaceAssignmentName, interfaceAssignment ->\r
+            paths.add(interfaceAssignmentName)\r
+            val interfaceDefinition = nodeType.interfaces?.get(interfaceAssignmentName)\r
+                    ?: throw BluePrintException(format("Failed to get nodeTemplate({}) interface definition ({}) from" +\r
+                            " node type ({}) ", nodeTemplateName, interfaceAssignmentName, nodeTemplate.type))\r
+\r
+            validateInterfaceAssignment(nodeTemplateName, interfaceAssignmentName, interfaceDefinition,\r
+                    interfaceAssignment)\r
+            paths.removeAt(paths.lastIndex)\r
+        }\r
+        paths.removeAt(paths.lastIndex)\r
+\r
 \r
     }\r
 \r
+    @Throws(BluePrintException::class)\r
+    open fun validateInterfaceAssignment(nodeTemplateName: String, interfaceAssignmentName: String,\r
+                                         interfaceDefinition: InterfaceDefinition,\r
+                                         interfaceAssignment: InterfaceAssignment) {\r
+\r
+        val operations = interfaceAssignment.operations\r
+        operations?.let {\r
+            validateInterfaceOperationsAssignment(nodeTemplateName, interfaceAssignmentName, interfaceDefinition,\r
+                    interfaceAssignment)\r
+        }\r
+\r
+    }\r
+\r
+    @Throws(BluePrintException::class)\r
+    open fun validateInterfaceOperationsAssignment(nodeTemplateName: String, interfaceAssignmentName: String,\r
+                                                   interfaceDefinition: InterfaceDefinition,\r
+                                                   interfaceAssignment: InterfaceAssignment) {\r
+\r
+        val operations = interfaceAssignment.operations\r
+        operations?.let {\r
+            it.forEach { operationAssignmentName, operationAssignments ->\r
+\r
+                val operationDefinition = interfaceDefinition.operations?.get(operationAssignmentName)\r
+                        ?: throw BluePrintException(format("Failed to get nodeTemplate({}) operation definition ({}) ",\r
+                                nodeTemplateName, operationAssignmentName))\r
+\r
+                log.info("Validation Node Template({}) Interface({}) Operation ({})", nodeTemplateName,\r
+                        interfaceAssignmentName, operationAssignmentName)\r
+\r
+                val inputs = operationAssignments.inputs\r
+                val outputs = operationAssignments.outputs\r
+\r
+                inputs?.forEach { propertyName, propertyAssignment ->\r
+                    val propertyDefinition = operationDefinition.inputs?.get(propertyName)\r
+                            ?: throw BluePrintException(format("Failed to get nodeTemplate({}) operation definition ({}) " +\r
+                                    "property definition({})", nodeTemplateName, operationAssignmentName, propertyName))\r
+                    // Check the property values with property definition\r
+                    validatePropertyAssignment(propertyName, propertyDefinition, propertyAssignment)\r
+                }\r
+\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+\r
     @Throws(BluePrintException::class)\r
     open fun validateInterfaceDefinitions(interfaces: MutableMap<String, InterfaceDefinition>) {\r
         paths.add("interfaces")\r
@@ -360,14 +422,13 @@ open class BluePrintValidatorDefaultService : BluePrintValidatorService {
 \r
         } else if (BluePrintTypes.validCollectionTypes().contains(propertyType)) {\r
 \r
-            isValid = JacksonUtils.checkJsonNodeValueOfCollectionType(propertyType, propertyAssignment)\r
             val entrySchemaType = propertyDefinition.entrySchema?.type\r
                     ?: throw BluePrintException(format("Failed to get Entry Schema type for the collection property ({})", propertyName))\r
 \r
             if (!BluePrintTypes.validPropertyTypes().contains(entrySchemaType)) {\r
                 checkPropertyDataType(entrySchemaType, propertyName)\r
             }\r
-\r
+            isValid = JacksonUtils.checkJsonNodeValueOfCollectionType(propertyType, propertyAssignment)\r
         } else {\r
             checkPropertyDataType(propertyType, propertyName)\r
             isValid = true\r