2  * Copyright © 2017-2018 AT&T Intellectual Property.
 
   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.apps.controllerblueprints.core.validation
 
  19 import com.att.eelf.configuration.EELFLogger
 
  20 import com.att.eelf.configuration.EELFManager
 
  21 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException
 
  22 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintTypes
 
  23 import org.onap.ccsdk.apps.controllerblueprints.core.checkNotEmptyNThrow
 
  24 import org.onap.ccsdk.apps.controllerblueprints.core.data.*
 
  25 import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintNodeTypeValidator
 
  26 import org.onap.ccsdk.apps.controllerblueprints.core.interfaces.BluePrintTypeValidatorService
 
  27 import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintContext
 
  28 import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintRuntimeService
 
  31 open class BluePrintNodeTypeValidatorImpl(private val bluePrintTypeValidatorService: BluePrintTypeValidatorService) : BluePrintNodeTypeValidator {
 
  33     private val log: EELFLogger = EELFManager.getInstance().getLogger(BluePrintServiceTemplateValidatorImpl::class.toString())
 
  35     lateinit var bluePrintRuntimeService: BluePrintRuntimeService<*>
 
  36     lateinit var bluePrintContext: BluePrintContext
 
  37     var paths: MutableList<String> = arrayListOf()
 
  39     override fun validate(bluePrintRuntimeService: BluePrintRuntimeService<*>, nodeTypeName: String, nodeType: NodeType) {
 
  40         log.trace("Validating NodeType($nodeTypeName)")
 
  41         this.bluePrintRuntimeService = bluePrintRuntimeService
 
  42         this.bluePrintContext = bluePrintRuntimeService.bluePrintContext()
 
  44         paths.add(nodeTypeName)
 
  46         val derivedFrom: String = nodeType.derivedFrom
 
  48         checkValidNodeTypesDerivedFrom(nodeTypeName, derivedFrom)
 
  50         if (!BluePrintTypes.rootNodeTypes().contains(derivedFrom)) {
 
  51             bluePrintContext.serviceTemplate.nodeTypes?.get(derivedFrom)
 
  52                     ?: throw BluePrintException("Failed to get derivedFrom NodeType($derivedFrom)'s for NodeType($nodeTypeName)")
 
  55         nodeType.properties?.let { bluePrintTypeValidatorService.validatePropertyDefinitions(bluePrintRuntimeService, nodeType.properties!!) }
 
  56         nodeType.capabilities?.let { validateCapabilityDefinitions(nodeTypeName, nodeType) }
 
  57         nodeType.requirements?.let { validateRequirementDefinitions(nodeTypeName, nodeType) }
 
  58         nodeType.interfaces?.let { validateInterfaceDefinitions(nodeType.interfaces!!) }
 
  60         paths.removeAt(paths.lastIndex)
 
  63     fun checkValidNodeTypesDerivedFrom(nodeTypeName: String, derivedFrom: String) {
 
  64         check(BluePrintTypes.validNodeTypeDerivedFroms.contains(derivedFrom)) {
 
  65             throw BluePrintException("Failed to get node type ($nodeTypeName)'s  derivedFrom($derivedFrom) definition ")
 
  69     open fun validateCapabilityDefinitions(nodeTypeName: String, nodeType: NodeType) {
 
  70         val capabilities = nodeType.capabilities
 
  71         paths.add("capabilities")
 
  72         capabilities?.forEach { capabilityName, capabilityDefinition ->
 
  73             paths.add(capabilityName)
 
  75             validateCapabilityDefinition(nodeTypeName, nodeType, capabilityName, capabilityDefinition)
 
  77             paths.removeAt(paths.lastIndex)
 
  79         paths.removeAt(paths.lastIndex)
 
  82     open fun validateCapabilityDefinition(nodeTypeName: String, nodeType: NodeType, capabilityName: String,
 
  83                                           capabilityDefinition: CapabilityDefinition) {
 
  84         val capabilityType = capabilityDefinition.type
 
  85         check(BluePrintTypes.validCapabilityTypes.contains(capabilityType)) {
 
  86             throw BluePrintException("failed to get CapabilityType($capabilityType) for NodeType($nodeTypeName)")
 
  90     open fun validateRequirementDefinitions(nodeName: String, nodeType: NodeType) {
 
  91         paths.add("requirements")
 
  92         val requirements = nodeType.requirements
 
  94         requirements?.forEach { requirementDefinitionName, requirementDefinition ->
 
  95             paths.add(requirementDefinitionName)
 
  96             validateRequirementDefinition(nodeName, nodeType, requirementDefinitionName, requirementDefinition)
 
  97             paths.removeAt(paths.lastIndex)
 
  99         paths.removeAt(paths.lastIndex)
 
 102     open fun validateRequirementDefinition(nodeTypeName: String, nodeType: NodeType, requirementDefinitionName: String,
 
 103                                            requirementDefinition: RequirementDefinition) {
 
 105         log.info("validating NodeType({}) RequirementDefinition ({}) ", nodeTypeName, requirementDefinitionName)
 
 106         val requirementNodeTypeName = requirementDefinition.node!!
 
 107         val capabilityName = requirementDefinition.capability
 
 108         val relationship = requirementDefinition.relationship!!
 
 110         check(BluePrintTypes.validRelationShipDerivedFroms.contains(relationship)) {
 
 111             throw BluePrintException("failed to get relationship($relationship) for NodeType($nodeTypeName)'s requirement($requirementDefinitionName)")
 
 114         val relationShipNodeType = bluePrintContext.serviceTemplate.nodeTypes?.get(requirementNodeTypeName)
 
 115                 ?: throw BluePrintException("failed to get requirement NodeType($requirementNodeTypeName)'s for requirement($requirementDefinitionName) ")
 
 117         relationShipNodeType.capabilities?.get(capabilityName)
 
 118                 ?: throw BluePrintException("failed to get requirement NodeType($requirementNodeTypeName)'s " +
 
 119                         "capability($nodeTypeName) for NodeType ($capabilityName)'s requirement($requirementDefinitionName) ")
 
 123     open fun validateInterfaceDefinitions(interfaces: MutableMap<String, InterfaceDefinition>) {
 
 124         paths.add("interfaces")
 
 125         interfaces.forEach { interfaceName, interfaceDefinition ->
 
 126             paths.add(interfaceName)
 
 127             interfaceDefinition.operations?.let { validateOperationDefinitions(interfaceDefinition.operations!!) }
 
 128             paths.removeAt(paths.lastIndex)
 
 130         paths.removeAt(paths.lastIndex)
 
 133     open fun validateOperationDefinitions(operations: MutableMap<String, OperationDefinition>) {
 
 134         paths.add("operations")
 
 135         operations.forEach { opertaionName, operationDefinition ->
 
 136             paths.add(opertaionName)
 
 137             operationDefinition.implementation?.let { validateImplementation(operationDefinition.implementation!!) }
 
 139             operationDefinition.inputs?.let {
 
 140                 bluePrintTypeValidatorService.validatePropertyDefinitions(bluePrintRuntimeService, operationDefinition.inputs!!)
 
 143             operationDefinition.outputs?.let {
 
 144                 bluePrintTypeValidatorService.validatePropertyDefinitions(bluePrintRuntimeService, operationDefinition.outputs!!)
 
 146             paths.removeAt(paths.lastIndex)
 
 148         paths.removeAt(paths.lastIndex)
 
 151     open fun validateImplementation(implementation: Implementation) {
 
 152         checkNotEmptyNThrow(implementation.primary)