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
+++ /dev/null
-/*\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
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
@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()
+ }
}
/**
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
* @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
}
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)
}
}
--- /dev/null
+/*\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
--- /dev/null
+/*\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
\r
import java.util.HashMap;\r
import java.util.Map;\r
-\r
+/**\r
+ * ResourceDictionaryUtilsTest.\r
+ *\r
+ * @author Brinda Santh\r
+ */\r
public class ResourceDictionaryUtilsTest {\r
private static final Logger log = LoggerFactory.getLogger(ResourceDictionaryUtilsTest.class);\r
\r
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
* @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
--- /dev/null
+/*\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
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
\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
*/\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
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
/**\r
* This is a validateServiceTemplate\r
*\r
- * @param serviceTemplate\r
+ * @param serviceTemplate serviceTemplate\r
* @return boolean\r
* @throws BluePrintException BluePrintException\r
*/\r
/**\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
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
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
\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
"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
"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