Merge "Controller Blueprints Microservice"
authorDan Timoney <dt5972@att.com>
Tue, 4 Sep 2018 15:07:26 +0000 (15:07 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 4 Sep 2018 15:07:26 +0000 (15:07 +0000)
14 files changed:
ms/controllerblueprints/modules/core/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/core/utils/JacksonUtils.kt
ms/controllerblueprints/modules/resource-dict/src/main/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/validator/ResourceAssignmentValidator.java [deleted file]
ms/controllerblueprints/modules/resource-dict/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/resource/dict/ResourceDefinition.kt
ms/controllerblueprints/modules/resource-dict/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/resource/dict/service/ResourceAssignmentValidationService.kt
ms/controllerblueprints/modules/resource-dict/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/BulkResourceSequencingUtils.kt [new file with mode: 0644]
ms/controllerblueprints/modules/resource-dict/src/test/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/BulkResourceSequencingUtilsTest.java [new file with mode: 0644]
ms/controllerblueprints/modules/resource-dict/src/test/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/ResourceDictionaryUtilsTest.java
ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ConfigModelCreateService.java
ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ResourceAssignmentValidationService.java [new file with mode: 0644]
ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ServiceTemplateService.java
ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/validator/ServiceTemplateValidator.java
ms/controllerblueprints/modules/service/src/test/java/org/onap/ccsdk/apps/controllerblueprints/service/validator/ServiceTemplateValidationTest.java
ms/controllerblueprints/modules/service/src/test/resources/enhance/enhance-template.json
ms/controllerblueprints/modules/service/src/test/resources/enhance/enhanced-template.json

index c41124e..9eef1ca 100644 (file)
@@ -58,6 +58,13 @@ object JacksonUtils {
         return readValue(content, valueType)\r
     }\r
 \r
+    @JvmStatic\r
+    fun <T> readValueFromClassPathFile(fileName: String, valueType: Class<T>): T? {\r
+        val content: String = IOUtils.toString(JacksonUtils::class.java.classLoader.getResourceAsStream(fileName), Charset.defaultCharset())\r
+                ?: throw BluePrintException(String.format("Failed to read json file : %s", fileName))\r
+        return readValue(content, valueType)\r
+    }\r
+\r
     @JvmStatic\r
     fun jsonNodeFromObject(from: kotlin.Any): JsonNode = jacksonObjectMapper().convertValue(from, JsonNode::class.java)\r
 \r
diff --git a/ms/controllerblueprints/modules/resource-dict/src/main/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/validator/ResourceAssignmentValidator.java b/ms/controllerblueprints/modules/resource-dict/src/main/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/validator/ResourceAssignmentValidator.java
deleted file mode 100644 (file)
index c9b37c2..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*\r
- * Copyright © 2017-2018 AT&T Intellectual Property.\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
- * You may obtain a copy of the License at\r
- *\r
- *     http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-package org.onap.ccsdk.apps.controllerblueprints.resource.dict.validator;\r
-\r
-import org.apache.commons.lang3.StringUtils;\r
-import org.apache.commons.lang3.text.StrBuilder;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.data.CapabilityAssignment;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
-import org.onap.ccsdk.apps.controllerblueprints.core.utils.TopologicalSortingUtils;\r
-import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import java.util.*;\r
-\r
-/**\r
- * ResourceAssignmentValidator.java Purpose:\r
- *\r
- * @author Brinda Santh\r
- */\r
-public class ResourceAssignmentValidator {\r
-    private static final Logger log = LoggerFactory.getLogger(ResourceAssignmentValidator.class);\r
-    private List<ResourceAssignment> assignments;\r
-    private Map<String, ResourceAssignment> resourceAssignmentMap = new HashMap<>();\r
-    private StrBuilder validationMessage = new StrBuilder();\r
-\r
-    public ResourceAssignmentValidator(List<ResourceAssignment> assignments) {\r
-        this.assignments = assignments;\r
-    }\r
-\r
-    public ResourceAssignmentValidator(NodeTemplate nodeTemplate) throws BluePrintException {\r
-\r
-        if (nodeTemplate != null && nodeTemplate.getCapabilities() != null) {\r
-            CapabilityAssignment capabilityAssignment =\r
-                    nodeTemplate.getCapabilities().get(ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING);\r
-            if (capabilityAssignment != null && capabilityAssignment.getProperties() != null) {\r
-                Object mappingObject =\r
-                        capabilityAssignment.getProperties().get(ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING);\r
-                if (mappingObject != null) {\r
-                    String mappingContent = JacksonUtils.getJson(mappingObject);\r
-                    if (StringUtils.isNotBlank(mappingContent)) {\r
-                        this.assignments =\r
-                                JacksonUtils.getListFromJson(mappingContent, ResourceAssignment.class);\r
-                    } else {\r
-                        validationMessage\r
-                                .appendln(String.format("Failed to transform Mapping Content (%s) ", mappingContent));\r
-                        throw new BluePrintException(\r
-                                String.format("Failed to transform Mapping Content (%s) ", mappingContent));\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    /**\r
-     * This is a validateResourceAssignment to validate the Topology Template\r
-     *\r
-     * @return boolean\r
-     * @throws BluePrintException BluePrintException\r
-     */\r
-    public boolean validateResourceAssignment() throws BluePrintException {\r
-        if (assignments != null && !assignments.isEmpty()) {\r
-            validateDuplicateDictionaryKeys();\r
-            validateCyclicDependency();\r
-            if (validationMessage.length() > 0) {\r
-                throw new BluePrintException("Resource Assignment Validation :" + validationMessage.toString());\r
-            }\r
-        }\r
-        return true;\r
-    }\r
-\r
-    @SuppressWarnings("squid:S3776")\r
-    private void validateDuplicateDictionaryKeys() {\r
-        this.assignments.forEach(resourceMapping -> {\r
-            if (resourceMapping != null) {\r
-                if (!resourceAssignmentMap.containsKey(resourceMapping.getName())) {\r
-                    resourceAssignmentMap.put(resourceMapping.getName(), resourceMapping);\r
-                } else {\r
-                    validationMessage.appendln(String.format("Duplicate Assignment Template Key (%s) is Present",\r
-                            resourceMapping.getName()));\r
-                }\r
-            }\r
-        });\r
-\r
-        if (!assignments.isEmpty()) {\r
-            Set<String> uniqueSet = new HashSet<>();\r
-            for (ResourceAssignment resourceAssignment : assignments) {\r
-                if (resourceAssignment != null) {\r
-                    boolean added = uniqueSet.add(resourceAssignment.getDictionaryName());\r
-                    if (!added) {\r
-                        validationMessage.appendln(\r
-                                String.format("Duplicate Assignment Dictionary Key (%s) present with Template Key (%s)",\r
-                                        resourceAssignment.getDictionaryName(), resourceAssignment.getName()));\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    private void validateCyclicDependency() {\r
-        TopologicalSortingUtils<ResourceAssignment> topologySorting = new TopologicalSortingUtils<>();\r
-        this.resourceAssignmentMap.forEach((mappingKey, mapping) -> {\r
-            if (mapping != null) {\r
-                if (mapping.getDependencies() != null && !mapping.getDependencies().isEmpty()) {\r
-                    for (String dependency : mapping.getDependencies()) {\r
-                        topologySorting.add(resourceAssignmentMap.get(dependency), mapping);\r
-                    }\r
-                } else {\r
-                    topologySorting.add(null, mapping);\r
-                }\r
-            }\r
-        });\r
-\r
-        if (!topologySorting.isDag()) {\r
-            String graph = getTopologicalGraph(topologySorting);\r
-            validationMessage.appendln("Cyclic Dependency :" + graph);\r
-        }\r
-    }\r
-\r
-\r
-    public String getTopologicalGraph(TopologicalSortingUtils<ResourceAssignment> topologySorting) {\r
-        StringBuilder s = new StringBuilder();\r
-        if (topologySorting != null) {\r
-            Map<ResourceAssignment, List<ResourceAssignment>> neighbors = topologySorting.getNeighbors();\r
-\r
-            neighbors.forEach((v, vs) -> {\r
-                if (v == null) {\r
-                    s.append("\n    * -> [");\r
-                    for (ResourceAssignment resourceAssignment : vs) {\r
-                        s.append("(" + resourceAssignment.getDictionaryName() + ":" + resourceAssignment.getName()\r
-                                + "),");\r
-                    }\r
-                    s.append("]");\r
-                } else {\r
-                    s.append("\n    (" + v.getDictionaryName() + ":" + v.getName() + ") -> [");\r
-                    for (ResourceAssignment resourceAssignment : vs) {\r
-                        s.append("(" + resourceAssignment.getDictionaryName() + ":" + resourceAssignment.getName()\r
-                                + "),");\r
-                    }\r
-                    s.append("]");\r
-                }\r
-            });\r
-        }\r
-        return s.toString();\r
-    }\r
-}\r
index 2287c6c..b4d68cb 100644 (file)
@@ -18,18 +18,19 @@ package org.onap.ccsdk.apps.controllerblueprints.resource.dict
 
 import com.fasterxml.jackson.annotation.JsonFormat
 import com.fasterxml.jackson.annotation.JsonProperty
+import org.apache.commons.lang3.builder.ToStringBuilder
 import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate
 import org.onap.ccsdk.apps.controllerblueprints.core.data.PropertyDefinition
 import java.io.Serializable
 import java.util.*
 
-open class ResourceDefinition{
+open class ResourceDefinition {
 
     @JsonProperty(value = "name", required = true)
     lateinit var name: String
 
     @JsonProperty(value = "property", required = true)
-    lateinit var property : PropertyDefinition
+    lateinit var property: PropertyDefinition
 
     var tags: String? = null
 
@@ -81,6 +82,16 @@ open class ResourceAssignment {
 
     @JsonProperty("updated-by")
     var updatedBy: String? = null
+
+    override fun toString(): String {
+        return StringBuilder()
+                .append("[")
+                .append("name=", name)
+                .append(", dictionaryName=", dictionaryName)
+                .append(", dictionarySource=", dictionarySource)
+                .append("]")
+                .toString()
+    }
 }
 
 /**
index 6a78ac8..4578aca 100644 (file)
@@ -22,7 +22,6 @@ import org.apache.commons.lang3.text.StrBuilder
 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException
 import org.onap.ccsdk.apps.controllerblueprints.core.utils.TopologicalSortingUtils
 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment
-import org.onap.ccsdk.apps.controllerblueprints.resource.dict.validator.ResourceAssignmentValidator
 import org.slf4j.LoggerFactory
 import java.io.Serializable
 
@@ -43,18 +42,21 @@ interface ResourceAssignmentValidationService : Serializable {
  * @author Brinda Santh
  */
 open class ResourceAssignmentValidationDefaultService : ResourceAssignmentValidationService {
-    private val log = LoggerFactory.getLogger(ResourceAssignmentValidator::class.java)
-    open var resourceAssignments: List<ResourceAssignment> = arrayListOf()
-    open var resourceAssignmentMap: MutableMap<String, ResourceAssignment> = hashMapOf()
+    private val log = LoggerFactory.getLogger(ResourceAssignmentValidationDefaultService::class.java)
+
+    open var resourceAssignmentMap: Map<String, ResourceAssignment> = hashMapOf()
     open val validationMessage = StrBuilder()
 
     override fun validate(resourceAssignments: List<ResourceAssignment>): Boolean {
-        this.resourceAssignments = resourceAssignments
-        validateSources(resourceAssignments)
-        validateDuplicateDictionaryKeys()
-        validateCyclicDependency()
-        if (StringUtils.isNotBlank(validationMessage)) {
-            throw BluePrintException("Resource Assignment Validation :" + validationMessage.toString())
+        try {
+            validateSources(resourceAssignments)
+            validateTemplateNDictionaryKeys(resourceAssignments)
+            validateCyclicDependency(resourceAssignments)
+            if (StringUtils.isNotBlank(validationMessage)) {
+                throw BluePrintException("Resource Assignment Validation Failure")
+            }
+        } catch (e: Exception) {
+            throw BluePrintException("Resource Assignment Validation :" + validationMessage.toString(), e)
         }
         return true
     }
@@ -63,40 +65,54 @@ open class ResourceAssignmentValidationDefaultService : ResourceAssignmentValida
         log.info("validating resource assignment sources")
     }
 
-    open fun validateDuplicateDictionaryKeys() {
-        val uniqueDictionaryKeys = hashSetOf<String>()
+    open fun validateTemplateNDictionaryKeys(resourceAssignments: List<ResourceAssignment>) {
 
-        this.resourceAssignments.forEach { resourceAssignment ->
-            // Check Duplicate Names
-            if (!resourceAssignmentMap.containsKey(resourceAssignment.name)) {
-                resourceAssignmentMap[resourceAssignment.name] = resourceAssignment
-            } else {
-                validationMessage.appendln(String.format("Duplicate Assignment Template Key (%s) is Present",
-                        resourceAssignment.name))
-            }
-            // Check duplicate Dictionary Keys
-            if (!uniqueDictionaryKeys.contains(resourceAssignment.dictionaryName!!)) {
-                uniqueDictionaryKeys.add(resourceAssignment.dictionaryName!!)
-            } else {
-                validationMessage.appendln(
-                        String.format("Duplicate Assignment Dictionary Key (%s) present with Template Key (%s)",
-                                resourceAssignment.dictionaryName, resourceAssignment.name))
-            }
+        resourceAssignmentMap = resourceAssignments.map { it.name to it }.toMap()
+
+        val duplicateKeyNames = resourceAssignments.groupBy { it.name }
+                .filter { it.value.size > 1 }
+                .map { it.key }
+
+        if (duplicateKeyNames.isNotEmpty()) {
+            validationMessage.appendln(String.format("Duplicate Assignment Template Keys (%s) is Present", duplicateKeyNames))
+        }
+
+        val duplicateDictionaryKeyNames = resourceAssignments.groupBy { it.dictionaryName }
+                .filter { it.value.size > 1 }
+                .map { it.key }
+        if (duplicateDictionaryKeyNames.isNotEmpty()) {
+            validationMessage.appendln(String.format("Duplicate Assignment Dictionary Keys (%s) is Present", duplicateDictionaryKeyNames))
+        }
+
+        val dependenciesNames = resourceAssignments.mapNotNull { it.dependencies }.flatten()
+
+        log.info("Resource assignment definitions : {}", resourceAssignmentMap.keys)
+        log.info("Resource assignment Dictionary dependencies : {}", dependenciesNames)
+
+        val notPresentDictionaries = dependenciesNames.filter { !resourceAssignmentMap.containsKey(it) }.distinct()
+        if (notPresentDictionaries.isNotEmpty()) {
+            validationMessage.appendln(String.format("No assignments for Dictionary Keys (%s)", notPresentDictionaries))
+        }
+
+        if (StringUtils.isNotBlank(validationMessage)) {
+            throw BluePrintException("Resource Assignment Validation Failure")
         }
     }
 
-    open fun validateCyclicDependency() {
+    open fun validateCyclicDependency(resourceAssignments: List<ResourceAssignment>) {
         val startResourceAssignment = ResourceAssignment()
         startResourceAssignment.name = "*"
 
         val topologySorting = TopologicalSortingUtils<ResourceAssignment>()
-        this.resourceAssignmentMap.forEach { assignmentKey, assignment ->
-            if (CollectionUtils.isNotEmpty(assignment.dependencies)) {
-                for (dependency in assignment.dependencies!!) {
-                    topologySorting.add(resourceAssignmentMap[dependency]!!, assignment)
+
+        resourceAssignmentMap.map { it.value }.map { resourceAssignment ->
+            if (CollectionUtils.isNotEmpty(resourceAssignment.dependencies)) {
+                resourceAssignment.dependencies!!.map {
+                    log.info("Topological Graph link from {} to {}", it, resourceAssignment.name)
+                    topologySorting.add(resourceAssignmentMap[it]!!, resourceAssignment)
                 }
             } else {
-                topologySorting.add(startResourceAssignment, assignment)
+                topologySorting.add(startResourceAssignment, resourceAssignment)
             }
         }
 
diff --git a/ms/controllerblueprints/modules/resource-dict/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/BulkResourceSequencingUtils.kt b/ms/controllerblueprints/modules/resource-dict/src/main/kotlin/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/BulkResourceSequencingUtils.kt
new file mode 100644 (file)
index 0000000..82fbd3a
--- /dev/null
@@ -0,0 +1,108 @@
+/*\r
+ *  Copyright © 2017-2018 AT&T Intellectual Property.\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
+ *  You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ */\r
+\r
+package org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils\r
+\r
+import org.apache.commons.collections.CollectionUtils\r
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.TopologicalSortingUtils\r
+import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment\r
+import org.slf4j.LoggerFactory\r
+import java.util.ArrayList\r
+/**\r
+ * BulkResourceSequencingUtils.\r
+ *\r
+ * @author Brinda Santh\r
+ */\r
+object BulkResourceSequencingUtils {\r
+    private val log = LoggerFactory.getLogger(BulkResourceSequencingUtils::class.java)\r
+\r
+    @JvmStatic\r
+    fun process(resourceAssignments: MutableList<ResourceAssignment>): List<List<ResourceAssignment>> {\r
+        val resourceAssignmentMap: MutableMap<String, ResourceAssignment> = hashMapOf()\r
+        val sequenceBatchResourceAssignment = ArrayList<List<ResourceAssignment>>()\r
+        log.info("Assignments ({})", resourceAssignments)\r
+        // Prepare Map\r
+        resourceAssignments.forEach { resourceAssignment ->\r
+            log.trace("Processing Key ({})", resourceAssignment.name)\r
+            resourceAssignmentMap.put(resourceAssignment.name, resourceAssignment)\r
+        }\r
+\r
+        val startResourceAssignment = ResourceAssignment()\r
+        startResourceAssignment.name = "*"\r
+\r
+        // Preepare Sorting Map\r
+        val topologySorting = TopologicalSortingUtils<ResourceAssignment>()\r
+        resourceAssignmentMap.forEach { _, resourceAssignment ->\r
+            if (CollectionUtils.isNotEmpty(resourceAssignment.dependencies)) {\r
+                for (dependency in resourceAssignment.dependencies!!) {\r
+                    topologySorting.add(resourceAssignmentMap[dependency]!!, resourceAssignment)\r
+                }\r
+            } else {\r
+                topologySorting.add(startResourceAssignment, resourceAssignment)\r
+            }\r
+        }\r
+\r
+        val sequencedResourceAssignments: MutableList<ResourceAssignment> = topologySorting.topSort()!! as MutableList<ResourceAssignment>\r
+        log.info("Sorted Sequenced Assignments ({})", sequencedResourceAssignments)\r
+\r
+        var batchResourceAssignment: MutableList<ResourceAssignment>? = null\r
+        var batchAssignmentName: MutableList<String>? = null\r
+\r
+        // Prepare Sorting\r
+        sequencedResourceAssignments.forEachIndexed { index, resourceAssignment ->\r
+\r
+            var previousResourceAssignment: ResourceAssignment? = null\r
+\r
+            if (index > 0) {\r
+                previousResourceAssignment = sequencedResourceAssignments[index - 1]\r
+            }\r
+\r
+            var dependencyPresence = false\r
+            if (batchAssignmentName != null && resourceAssignment.dependencies != null) {\r
+                dependencyPresence = CollectionUtils.containsAny(batchAssignmentName, resourceAssignment.dependencies)\r
+            }\r
+\r
+            log.trace("({}) -> Checking ({}), with ({}), result ({})", resourceAssignment.name,\r
+                    batchAssignmentName, resourceAssignment.dependencies, dependencyPresence)\r
+\r
+            if (previousResourceAssignment != null && resourceAssignment.dictionarySource != null\r
+                    && resourceAssignment.dictionarySource!!.equals(previousResourceAssignment.dictionarySource, true)\r
+                    && !dependencyPresence) {\r
+                batchResourceAssignment!!.add(resourceAssignment)\r
+                batchAssignmentName!!.add(resourceAssignment.name)\r
+            } else {\r
+                if (batchResourceAssignment != null) {\r
+                    sequenceBatchResourceAssignment.add(batchResourceAssignment!!)\r
+                    log.trace("Created old Set ({})", batchAssignmentName)\r
+                }\r
+                batchResourceAssignment = arrayListOf()\r
+                batchResourceAssignment!!.add(resourceAssignment)\r
+\r
+                batchAssignmentName = arrayListOf()\r
+                batchAssignmentName!!.add(resourceAssignment.name)\r
+            }\r
+\r
+            if (index == sequencedResourceAssignments.size - 1) {\r
+                log.trace("Created old Set ({})", batchAssignmentName)\r
+                sequenceBatchResourceAssignment.add(batchResourceAssignment!!)\r
+            }\r
+        }\r
+        log.info("Batched Sequence : ({})", sequenceBatchResourceAssignment)\r
+\r
+        return sequenceBatchResourceAssignment\r
+    }\r
+\r
+}
\ No newline at end of file
diff --git a/ms/controllerblueprints/modules/resource-dict/src/test/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/BulkResourceSequencingUtilsTest.java b/ms/controllerblueprints/modules/resource-dict/src/test/java/org/onap/ccsdk/apps/controllerblueprints/resource/dict/utils/BulkResourceSequencingUtilsTest.java
new file mode 100644 (file)
index 0000000..c7444db
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+ *  Copyright © 2017-2018 AT&T Intellectual Property.\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
+ *  You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ */\r
+\r
+package org.onap.ccsdk.apps.controllerblueprints.resource.dict.utils;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
+import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
+import java.util.List;\r
+/**\r
+ * BulkResourceSequencingUtils.\r
+ *\r
+ * @author Brinda Santh\r
+ */\r
+public class BulkResourceSequencingUtilsTest {\r
+\r
+    @Test\r
+    public void testProcess(){\r
+        List<ResourceAssignment> assignments = JacksonUtils.getListFromClassPathFile("validation/success.json", ResourceAssignment.class);\r
+        Assert.assertNotNull("failed to get ResourceAssignment from validation/success.json ", assignments);\r
+        BulkResourceSequencingUtils.process(assignments);\r
+    }\r
+}
\ No newline at end of file
index f521371..9c1a045 100644 (file)
@@ -21,6 +21,7 @@ import com.google.common.base.Preconditions;
 import org.apache.commons.collections.CollectionUtils;\r
 import org.apache.commons.io.IOUtils;\r
 import org.apache.commons.lang3.StringUtils;\r
+import org.jetbrains.annotations.NotNull;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant;\r
@@ -290,31 +291,29 @@ public class ConfigModelCreateService {
      * @return ConfigModel\r
      * @throws BluePrintException BluePrintException\r
      */\r
-    public ConfigModel publishConfigModel(Long id) throws BluePrintException {\r
+    public ConfigModel publishConfigModel(@NotNull Long id) throws BluePrintException {\r
         ConfigModel dbConfigModel = null;\r
-        if (id != null) {\r
-            Optional<ConfigModel> dbConfigModelOptional = configModelRepository.findById(id);\r
-            if (dbConfigModelOptional.isPresent()) {\r
-                dbConfigModel = dbConfigModelOptional.get();\r
-                List<ConfigModelContent> configModelContents = dbConfigModel.getConfigModelContents();\r
-                if (configModelContents != null && !configModelContents.isEmpty()) {\r
-                    for (ConfigModelContent configModelContent : configModelContents) {\r
-                        if (configModelContent.getContentType()\r
-                                .equals(ConfigModelConstant.MODEL_CONTENT_TYPE_TOSCA_JSON)) {\r
-                            ServiceTemplate serviceTemplate = JacksonUtils\r
-                                    .readValue(configModelContent.getContent(), ServiceTemplate.class);\r
-                            if (serviceTemplate != null) {\r
-                                validateServiceTemplate(serviceTemplate);\r
-                            }\r
+        Optional<ConfigModel> dbConfigModelOptional = configModelRepository.findById(id);\r
+        if (dbConfigModelOptional.isPresent()) {\r
+            dbConfigModel = dbConfigModelOptional.get();\r
+            List<ConfigModelContent> configModelContents = dbConfigModel.getConfigModelContents();\r
+            if (configModelContents != null && !configModelContents.isEmpty()) {\r
+                for (ConfigModelContent configModelContent : configModelContents) {\r
+                    if (configModelContent.getContentType()\r
+                            .equals(ConfigModelConstant.MODEL_CONTENT_TYPE_TOSCA_JSON)) {\r
+                        ServiceTemplate serviceTemplate = JacksonUtils\r
+                                .readValue(configModelContent.getContent(), ServiceTemplate.class);\r
+                        if (serviceTemplate != null) {\r
+                            validateServiceTemplate(serviceTemplate);\r
                         }\r
                     }\r
                 }\r
-                dbConfigModel.setPublished(ApplicationConstants.ACTIVE_Y);\r
-                configModelRepository.save(dbConfigModel);\r
-                log.info("Config model ({}) published successfully.", id);\r
-\r
             }\r
-\r
+            dbConfigModel.setPublished(ApplicationConstants.ACTIVE_Y);\r
+            configModelRepository.save(dbConfigModel);\r
+            log.info("Config model ({}) published successfully.", id);\r
+        } else {\r
+            throw new BluePrintException(String.format("Couldn't get Config model for id :(%s)", id));\r
         }\r
         return dbConfigModel;\r
     }\r
diff --git a/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ResourceAssignmentValidationService.java b/ms/controllerblueprints/modules/service/src/main/java/org/onap/ccsdk/apps/controllerblueprints/service/ResourceAssignmentValidationService.java
new file mode 100644 (file)
index 0000000..1228e2e
--- /dev/null
@@ -0,0 +1,29 @@
+/*\r
+ *  Copyright © 2017-2018 AT&T Intellectual Property.\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
+ *  You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ */\r
+\r
+package org.onap.ccsdk.apps.controllerblueprints.service;\r
+\r
+import org.onap.ccsdk.apps.controllerblueprints.resource.dict.service.ResourceAssignmentValidationDefaultService;\r
+import org.springframework.stereotype.Service;\r
+/**\r
+ * ResourceAssignmentValidationService.\r
+ *\r
+ * @author Brinda Santh\r
+ */\r
+@Service\r
+public class ResourceAssignmentValidationService extends ResourceAssignmentValidationDefaultService {\r
+\r
+}
\ No newline at end of file
index 70cee3c..3e3c8e2 100644 (file)
@@ -20,7 +20,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate;\r
 import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
-import org.onap.ccsdk.apps.controllerblueprints.resource.dict.validator.ResourceAssignmentValidator;\r
 import org.onap.ccsdk.apps.controllerblueprints.service.domain.ConfigModelContent;\r
 import org.onap.ccsdk.apps.controllerblueprints.service.model.AutoMapResponse;\r
 import org.onap.ccsdk.apps.controllerblueprints.service.repository.ResourceDictionaryRepository;\r
@@ -45,21 +44,24 @@ public class ServiceTemplateService {
 \r
     private ConfigModelCreateService configModelCreateService;\r
     private BluePrintEnhancerService bluePrintEnhancerService;\r
+    private ResourceAssignmentValidationService resourceAssignmentValidationService;\r
 \r
     /**\r
      * This is a SchemaGeneratorService constructor\r
      *\r
-     * @param dataDictionaryRepository dataDictionaryRepository\r
-     * @param configModelCreateService configModelCreateService\r
-     * @param bluePrintEnhancerService bluePrintEnhancerService\r
+     * @param dataDictionaryRepository            dataDictionaryRepository\r
+     * @param configModelCreateService            configModelCreateService\r
+     * @param bluePrintEnhancerService            bluePrintEnhancerService\r
+     * @param resourceAssignmentValidationService resourceAssignmentValidationService\r
      */\r
     public ServiceTemplateService(ResourceDictionaryRepository dataDictionaryRepository,\r
                                   ConfigModelCreateService configModelCreateService,\r
-                                  BluePrintEnhancerService bluePrintEnhancerService) {\r
+                                  BluePrintEnhancerService bluePrintEnhancerService,\r
+                                  ResourceAssignmentValidationService resourceAssignmentValidationService) {\r
         this.dataDictionaryRepository = dataDictionaryRepository;\r
         this.configModelCreateService = configModelCreateService;\r
         this.bluePrintEnhancerService = bluePrintEnhancerService;\r
-\r
+        this.resourceAssignmentValidationService = resourceAssignmentValidationService;\r
     }\r
 \r
     /**\r
@@ -105,13 +107,7 @@ public class ServiceTemplateService {
      */\r
     public List<ResourceAssignment> validateResourceAssignments(List<ResourceAssignment> resourceAssignments)\r
             throws BluePrintException {\r
-        try {\r
-            ResourceAssignmentValidator resourceAssignmentValidator =\r
-                    new ResourceAssignmentValidator(resourceAssignments);\r
-            resourceAssignmentValidator.validateResourceAssignment();\r
-        } catch (BluePrintException e) {\r
-            throw new BluePrintException(e.getMessage(), e);\r
-        }\r
+        resourceAssignmentValidationService.validate(resourceAssignments);\r
         return resourceAssignments;\r
     }\r
 \r
index 848a32f..42adf1a 100644 (file)
 package org.onap.ccsdk.apps.controllerblueprints.service.validator;\r
 \r
 import com.google.common.base.Preconditions;\r
+import org.apache.commons.collections.MapUtils;\r
 import org.apache.commons.lang3.StringUtils;\r
 import org.jetbrains.annotations.NotNull;\r
+import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintConstants;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.BluePrintException;\r
+import org.onap.ccsdk.apps.controllerblueprints.core.ConfigModelConstant;\r
+import org.onap.ccsdk.apps.controllerblueprints.core.data.CapabilityAssignment;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.data.NodeTemplate;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.service.BluePrintValidatorDefaultService;\r
 import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
-import org.onap.ccsdk.apps.controllerblueprints.resource.dict.validator.ResourceAssignmentValidator;\r
+import org.onap.ccsdk.apps.controllerblueprints.resource.dict.ResourceAssignment;\r
+import org.onap.ccsdk.apps.controllerblueprints.resource.dict.service.ResourceAssignmentValidationDefaultService;\r
+import org.onap.ccsdk.apps.controllerblueprints.resource.dict.service.ResourceAssignmentValidationService;\r
 \r
 import java.util.HashMap;\r
+import java.util.List;\r
 import java.util.Map;\r
 \r
 /**\r
@@ -62,7 +69,7 @@ public class ServiceTemplateValidator extends BluePrintValidatorDefaultService {
     /**\r
      * This is a validateServiceTemplate\r
      *\r
-     * @param serviceTemplate\r
+     * @param serviceTemplate serviceTemplate\r
      * @return boolean\r
      * @throws BluePrintException BluePrintException\r
      */\r
@@ -76,7 +83,7 @@ public class ServiceTemplateValidator extends BluePrintValidatorDefaultService {
     /**\r
      * This is a getMetaData to get the key information during the\r
      *\r
-     * @return Map<String, String>\r
+     * @return Map<String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               String>\r
      */\r
     public Map<String, String> getMetaData() {\r
         return metaData;\r
@@ -104,9 +111,37 @@ public class ServiceTemplateValidator extends BluePrintValidatorDefaultService {
     private void validateNodeTemplateCustom(@NotNull String nodeTemplateName, @NotNull NodeTemplate nodeTemplate)\r
             throws BluePrintException {\r
         String derivedFrom = getBluePrintContext().nodeTemplateNodeType(nodeTemplateName).getDerivedFrom();\r
-        if ("tosca.nodes.Artifact".equals(derivedFrom)) {\r
-            ResourceAssignmentValidator resourceAssignmentValidator = new ResourceAssignmentValidator(nodeTemplate);\r
-            resourceAssignmentValidator.validateResourceAssignment();\r
+\r
+        if (BluePrintConstants.MODEL_TYPE_NODE_ARTIFACT.equals(derivedFrom)) {\r
+            List<ResourceAssignment> resourceAssignment = getResourceAssignments(nodeTemplate);\r
+            ResourceAssignmentValidationService resourceAssignmentValidationService = new ResourceAssignmentValidationDefaultService();\r
+            resourceAssignmentValidationService.validate(resourceAssignment);\r
+        }\r
+    }\r
+\r
+    private List<ResourceAssignment> getResourceAssignments(@NotNull NodeTemplate nodeTemplate) {\r
+\r
+        List<ResourceAssignment> resourceAssignment = null;\r
+\r
+        if (MapUtils.isNotEmpty(nodeTemplate.getCapabilities())) {\r
+\r
+            CapabilityAssignment capabilityAssignment =\r
+                    nodeTemplate.getCapabilities().get(ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING);\r
+            if (capabilityAssignment != null && capabilityAssignment.getProperties() != null) {\r
+                Object mappingObject =\r
+                        capabilityAssignment.getProperties().get(ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING);\r
+                if (mappingObject != null) {\r
+                    String mappingContent = JacksonUtils.getJson(mappingObject);\r
+                    Preconditions.checkArgument(StringUtils.isNotBlank(mappingContent),\r
+                            String.format("Failed to get capability mapping property (%s) ", ConfigModelConstant.CAPABILITY_PROPERTY_MAPPING));\r
+\r
+                    resourceAssignment = JacksonUtils.getListFromJson(mappingContent, ResourceAssignment.class);\r
+\r
+                    Preconditions.checkNotNull(resourceAssignment,\r
+                            String.format("Failed to get resource assignment info from the content (%s) ", mappingContent));\r
+                }\r
+            }\r
         }\r
+        return resourceAssignment;\r
     }\r
 }\r
index 0ef5445..e41e90a 100644 (file)
@@ -20,6 +20,8 @@ package org.onap.ccsdk.apps.controllerblueprints.service.validator;
 import org.apache.commons.io.FileUtils;\r
 import org.junit.Assert;\r
 import org.junit.Test;\r
+import org.onap.ccsdk.apps.controllerblueprints.core.data.ServiceTemplate;\r
+import org.onap.ccsdk.apps.controllerblueprints.core.utils.JacksonUtils;\r
 import org.onap.ccsdk.apps.controllerblueprints.service.utils.ConfigModelUtils;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -40,9 +42,22 @@ public class ServiceTemplateValidationTest {
 \r
     @Test\r
     public void validateServiceTemplate() throws Exception {\r
-        String file = "load/blueprints/baseconfiguration/Definitions/activation-blueprint.json";\r
+        validateServiceTemplate("load/blueprints/baseconfiguration/Definitions/activation-blueprint.json");\r
+        validateServiceTemplate("load/blueprints/vrr-test/Definitions/vrr-test.json");\r
+    }\r
+\r
+    //@Test\r
+    public void validateEnhancedServiceTemplate() throws Exception {\r
+        ServiceTemplate serviceTemplate = JacksonUtils\r
+                .readValueFromClassPathFile("enhance/enhanced-template.json", ServiceTemplate.class);\r
+        ServiceTemplateValidator serviceTemplateValidator = new ServiceTemplateValidator();\r
+        Boolean valid = serviceTemplateValidator.validateServiceTemplate(serviceTemplate);\r
+        Assert.assertTrue("Failed to validate blueprints", valid);\r
+    }\r
+\r
+    private void validateServiceTemplate(String fileName) throws Exception {\r
         String serviceTemplateContent =\r
-                FileUtils.readFileToString(new File(file), Charset.defaultCharset());\r
+                FileUtils.readFileToString(new File(fileName), Charset.defaultCharset());\r
         ServiceTemplateValidator serviceTemplateValidator = new ServiceTemplateValidator();\r
         serviceTemplateValidator.validateServiceTemplate(serviceTemplateContent);\r
         Assert.assertNotNull("Failed to validate blueprints", serviceTemplateValidator);\r
index a4ba930..fedf1da 100644 (file)
                   "dictionary-name": "wan-aggregate-ipv4-addresses",\r
                   "dictionary-source": "mdsal",\r
                   "dependencies": [\r
-                    "service-instance-id",\r
-                    "oam-network-role",\r
-                    "oam-v4-ip-type ",\r
-                    "oam-vm-type"\r
+                    "service-instance-id"\r
                   ],\r
                   "version": 0\r
                 },\r
index e003309..0633c64 100644 (file)
                 "input-param" : false,\r
                 "dictionary-name" : "wan-aggregate-ipv4-addresses",\r
                 "dictionary-source" : "mdsal",\r
-                "dependencies" : [ "service-instance-id", "oam-network-role", "oam-v4-ip-type ", "oam-vm-type" ],\r
+                "dependencies" : [ "service-instance-id" ],\r
                 "version" : 0\r
               }, {\r
                 "name" : "hostname",\r