diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java')
-rw-r--r-- | openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java | 529 |
1 files changed, 381 insertions, 148 deletions
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java index a11bff4b6a..e7aacb96cf 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImpl.java @@ -24,25 +24,37 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.openecomp.core.utilities.CommonMethods; import org.openecomp.sdc.common.errors.CoreException; -import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType; +import org.openecomp.sdc.datatypes.error.ErrorLevel; +import org.openecomp.sdc.logging.context.impl.MdcDataErrorMessage; +import org.openecomp.sdc.logging.types.LoggerConstants; +import org.openecomp.sdc.logging.types.LoggerErrorCode; +import org.openecomp.sdc.logging.types.LoggerErrorDescription; +import org.openecomp.sdc.logging.types.LoggerTragetServiceName; import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.model.AttributeDefinition; import org.openecomp.sdc.tosca.datatypes.model.CapabilityType; import org.openecomp.sdc.tosca.datatypes.model.Import; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.NodeType; +import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PropertyDefinition; +import org.openecomp.sdc.tosca.datatypes.model.PropertyType; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.sdc.tosca.errors.ToscaInvalidEntryNotFoundErrorBuilder; import org.openecomp.sdc.tosca.errors.ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder; import org.openecomp.sdc.tosca.errors.ToscaInvalidSubstitutionServiceTemplateErrorBuilder; import org.openecomp.sdc.tosca.errors.ToscaNodeTypeNotFoundErrorBuilder; +import org.openecomp.sdc.tosca.services.DataModelUtil; import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.tosca.services.ToscaUtil; import org.openecomp.sdc.tosca.services.yamlutil.ToscaExtensionYamlUtil; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -53,7 +65,7 @@ import java.util.Set; public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { /* - node template with type equal to node type or derived from node type. + node template with type equal to node type or derived from node type */ @Override public Map<String, NodeTemplate> getNodeTemplatesByType(ServiceTemplate serviceTemplate, @@ -75,6 +87,19 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { } @Override + public Optional<NodeType> fetchNodeType(String nodeTypeKey, Collection<ServiceTemplate> + serviceTemplates) { + Optional<Map<String, NodeType>> nodeTypeMap = serviceTemplates.stream() + .map(st -> st.getNode_types()) + .filter(nodeTypes -> Objects.nonNull(nodeTypes) && nodeTypes.containsKey(nodeTypeKey)) + .findFirst(); + if (nodeTypeMap.isPresent()) { + return Optional.ofNullable(nodeTypeMap.get().values().iterator().next()); + } + return Optional.empty(); + } + + @Override public boolean isTypeOf(NodeTemplate nodeTemplate, String nodeType, ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel) { if (nodeTemplate == null) { @@ -92,88 +117,6 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { new ToscaNodeTypeNotFoundErrorBuilder(nodeTemplate.getType()).build())); } - - private Optional<Boolean> isNodeTypeExistInServiceTemplateHierarchy(String nodeTypeToMatch, - String nodeTypeToSearch, - ServiceTemplate serviceTemplate, - ToscaServiceModel toscaServiceModel, - Set<String> analyzedImportFiles) { - Map<String, NodeType> searchableNodeTypes = serviceTemplate.getNode_types(); - if (!MapUtils.isEmpty(searchableNodeTypes)) { - NodeType nodeType = searchableNodeTypes.get(nodeTypeToSearch); - if (Objects.nonNull(nodeType)) { - if (Objects.equals(nodeType.getDerived_from(), nodeTypeToMatch)) { - return Optional.of(true); - } else if (isNodeTypeIsToscaRoot(nodeType)) { - return Optional.of(false); - } else { - return isNodeTypeExistInServiceTemplateHierarchy(nodeTypeToMatch, - nodeType.getDerived_from(), serviceTemplate, toscaServiceModel, null); - } - } else { - return isNodeTypeExistInImports(nodeTypeToMatch, nodeTypeToSearch, serviceTemplate, - toscaServiceModel, analyzedImportFiles); - } - } - return isNodeTypeExistInImports(nodeTypeToMatch, nodeTypeToSearch, serviceTemplate, - toscaServiceModel, analyzedImportFiles); - - } - - private Optional<Boolean> isNodeTypeExistInImports(String nodeTypeToMatch, - String nodeTypeToSearch, - ServiceTemplate serviceTemplate, - ToscaServiceModel toscaServiceModel, - Set<String> analyzedImportFiles) { - Map<String, Import> imports = serviceTemplate.getImports(); - if (imports == null) { - return Optional.empty(); - } - - analyzedImportFiles = createAnalyzedImportFilesSet(analyzedImportFiles); - for (Import anImport : imports.values()) { - if (Objects.isNull(anImport) || Objects.isNull(anImport.getFile())) { - throw new RuntimeException("import without file entry"); - } - String importFile = anImport.getFile(); - if (analyzedImportFiles.contains(importFile)) { - continue; - } - addImportFileToAnalyzedImportFilesSet(analyzedImportFiles, importFile); - ServiceTemplate template = toscaServiceModel.getServiceTemplates().get(importFile); - Optional<Boolean> nodeTypeExistInServiceTemplateHierarchy = - isNodeTypeExistInServiceTemplateHierarchy(nodeTypeToMatch, nodeTypeToSearch, template, - toscaServiceModel, analyzedImportFiles); - if (nodeTypeExistInServiceTemplateHierarchy.isPresent()) { - if (nodeTypeExistInServiceTemplateHierarchy.get()) { - return Optional.of(true); - } - } - } - return Optional.of(false); - } - - private Set<String> addImportFileToAnalyzedImportFilesSet(Set<String> analyzedImportFiles, - String importFile) { - analyzedImportFiles.add(importFile); - return analyzedImportFiles; - } - - private Set<String> createAnalyzedImportFilesSet(Set<String> analyzedImportFiles) { - if (Objects.isNull(analyzedImportFiles)) { - analyzedImportFiles = new HashSet<>(); - } - return analyzedImportFiles; - } - - private boolean isNodeTypeIsToscaRoot(NodeType stNodeType) { - return Objects.equals(stNodeType.getDerived_from(), ToscaNodeType.ROOT.getDisplayName()); - } - - private boolean isNodeTemplateOfTypeNodeType(NodeTemplate nodeTemplate, String nodeType) { - return Objects.equals(nodeTemplate.getType(), nodeType); - } - @Override public List<RequirementAssignment> getRequirements(NodeTemplate nodeTemplate, String requirementId) { @@ -197,8 +140,8 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { String nodeTemplateId) { if ((serviceTemplate.getTopology_template() != null) && (serviceTemplate.getTopology_template().getNode_templates() != null) - && (serviceTemplate.getTopology_template().getNode_templates() - .get(nodeTemplateId) != null)) { + && (serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId) + != null)) { return Optional .of(serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId)); } @@ -214,13 +157,16 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { if (substitutableNodeTemplate.getProperties() != null && substitutableNodeTemplate.getProperties() - .get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME) != null) { + .get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME) != null) { Object serviceTemplateFilter = substitutableNodeTemplate.getProperties() .get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); if (serviceTemplateFilter != null && serviceTemplateFilter instanceof Map) { Object substituteServiceTemplate = ((Map) serviceTemplateFilter) .get(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME); if (substituteServiceTemplate == null) { + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.ADD_ENTITIES_TO_TOSCA, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.INVALID_PROPERTY); throw new CoreException( new ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder(substituteNodeTemplateId) .build()); @@ -228,6 +174,9 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { return Optional.of(substituteServiceTemplate.toString()); } } + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.ADD_ENTITIES_TO_TOSCA, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.INVALID_PROPERTY); throw new CoreException( new ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder(substituteNodeTemplateId) .build()); @@ -255,28 +204,6 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { return substitutableNodeTemplates; } - private boolean isSubstitutableNodeTemplate(NodeTemplate nodeTemplate) { - return nodeTemplate.getDirectives() != null - && nodeTemplate.getDirectives().contains(ToscaConstants - .NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); - } - - private boolean isSubstitutionServiceTemplate(String substituteServiceTemplateFileName, - ServiceTemplate substituteServiceTemplate) { - if (substituteServiceTemplate != null - && substituteServiceTemplate.getTopology_template() != null - && substituteServiceTemplate.getTopology_template().getSubstitution_mappings() != null) { - if (substituteServiceTemplate.getTopology_template().getSubstitution_mappings() - .getNode_type() == null) { - throw new CoreException(new ToscaInvalidSubstitutionServiceTemplateErrorBuilder( - substituteServiceTemplateFileName).build()); - } - return true; - } - return false; - - } - @Override public Optional<Map.Entry<String, NodeTemplate>> getSubstitutionMappedNodeTemplateByExposedReq( String substituteServiceTemplateFileName, ServiceTemplate substituteServiceTemplate, @@ -319,7 +246,6 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { return Optional.empty(); } - /* match only for the input which is not null */ @@ -361,62 +287,245 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { case CAPABILITY_TYPE: returnEntity = new CapabilityType(); break; + case NODE_TYPE: + returnEntity = new NodeType(); + break; default: + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.ADD_ENTITIES_TO_TOSCA, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.UNSUPPORTED_ENTITY); throw new RuntimeException( "Entity[" + elementType + "] id[" + typeId + "] flat not supported"); } - scanAnFlatEntity(elementType, typeId, returnEntity, serviceTemplate, toscaModel); + scanAnFlatEntity(elementType, typeId, returnEntity, serviceTemplate, toscaModel, + new ArrayList<String>(), 0); return returnEntity; } - private void scanAnFlatEntity(ToscaElementTypes elementType, String typeId, Object entity, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel) { + @Override + public boolean isSubstitutableNodeTemplate(NodeTemplate nodeTemplate) { + return nodeTemplate.getDirectives() != null + && nodeTemplate.getDirectives().contains(ToscaConstants + .NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); + } + + private Optional<Boolean> isNodeTypeExistInServiceTemplateHierarchy( + String nodeTypeToMatch, + String nodeTypeToSearch, + ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel, + Set<String> analyzedImportFiles) { + Map<String, NodeType> searchableNodeTypes = serviceTemplate.getNode_types(); + if (!MapUtils.isEmpty(searchableNodeTypes)) { + NodeType nodeType = searchableNodeTypes.get(nodeTypeToSearch); + if (Objects.nonNull(nodeType)) { + if (Objects.equals(nodeType.getDerived_from(), nodeTypeToMatch)) { + return Optional.of(true); + } else if (isNodeTypeIsToscaRoot(nodeType)) { + return Optional.of(false); + } else { + return isNodeTypeExistInServiceTemplateHierarchy(nodeTypeToMatch, + nodeType.getDerived_from(), serviceTemplate, toscaServiceModel, null); + } + } else { + return isNodeTypeExistInImports(nodeTypeToMatch, nodeTypeToSearch, serviceTemplate, + toscaServiceModel, analyzedImportFiles); + } + } + return isNodeTypeExistInImports(nodeTypeToMatch, nodeTypeToSearch, serviceTemplate, + toscaServiceModel, analyzedImportFiles); + + } + + private Optional<Boolean> isNodeTypeExistInImports(String nodeTypeToMatch, + String nodeTypeToSearch, + ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel, + Set<String> filesScanned) { + List<Map<String, Import>> imports = serviceTemplate.getImports(); + if (CollectionUtils.isEmpty(imports)) { + return Optional.empty(); + } + + filesScanned = createFilesScannedSet(filesScanned); + + for (Map<String, Import> map : imports) { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + Import anImport = toscaExtensionYamlUtil + .yamlToObject(toscaExtensionYamlUtil.objectToYaml(map.values().iterator().next()), + Import.class); + if (Objects.isNull(anImport) || Objects.isNull(anImport.getFile())) { + throw new RuntimeException("import without file entry"); + } + String importFile = anImport.getFile(); + ServiceTemplate template = + toscaServiceModel.getServiceTemplates().get(fetchFileNameForImport(importFile, + serviceTemplate.getMetadata() == null ? null + : serviceTemplate.getMetadata().get("filename"))); + if (filesScanned.contains(ToscaUtil.getServiceTemplateFileName(template))) { + continue; + } else { + filesScanned.add(ToscaUtil.getServiceTemplateFileName(template)); + } + Optional<Boolean> nodeTypeExistInServiceTemplateHierarchy = + isNodeTypeExistInServiceTemplateHierarchy(nodeTypeToMatch, nodeTypeToSearch, template, + toscaServiceModel, filesScanned); + if (nodeTypeExistInServiceTemplateHierarchy.isPresent()) { + if (nodeTypeExistInServiceTemplateHierarchy.get()) { + filesScanned.clear(); + return Optional.of(true); + } + } + + } + return Optional.of(false); + } + + private Set<String> addImportFileToAnalyzedImportFilesSet(Set<String> analyzedImportFiles, + String importFile) { + analyzedImportFiles.add(importFile); + return analyzedImportFiles; + } + + private Set<String> createFilesScannedSet(Set<String> filesScanned) { + if (Objects.isNull(filesScanned)) { + filesScanned = new HashSet<>(); + } + return filesScanned; + } + + private boolean isNodeTypeIsToscaRoot(NodeType stNodeType) { + return Objects.equals(stNodeType.getDerived_from(), ToscaNodeType.NATIVE_ROOT); + } + + private boolean isNodeTemplateOfTypeNodeType(NodeTemplate nodeTemplate, String nodeType) { + return Objects.equals(nodeTemplate.getType(), nodeType); + } + + private boolean isSubstitutionServiceTemplate(String substituteServiceTemplateFileName, + ServiceTemplate substituteServiceTemplate) { + if (substituteServiceTemplate != null + && substituteServiceTemplate.getTopology_template() != null + && substituteServiceTemplate.getTopology_template().getSubstitution_mappings() != null) { + if (substituteServiceTemplate.getTopology_template().getSubstitution_mappings() + .getNode_type() == null) { + throw new CoreException(new ToscaInvalidSubstitutionServiceTemplateErrorBuilder( + substituteServiceTemplateFileName).build()); + } + return true; + } + return false; + + } + + private boolean scanAnFlatEntity(ToscaElementTypes elementType, String typeId, Object entity, + ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, + List<String> filesScanned, int rootScanStartInx) { boolean entityFound = enrichEntityFromCurrentServiceTemplate(elementType, typeId, entity, serviceTemplate, - toscaModel); + toscaModel, filesScanned, rootScanStartInx); if (!entityFound) { - Map<String, Import> imports = serviceTemplate.getImports(); - if (MapUtils.isEmpty(imports)) { - return; + List<Map<String, Import>> imports = serviceTemplate.getImports(); + if (CollectionUtils.isEmpty(imports)) { + return false; } - for (Import importServiceTemplate : imports.values()) { - ServiceTemplate template = - toscaModel.getServiceTemplates().get(importServiceTemplate.getFile()); - scanAnFlatEntity(elementType, typeId, entity, template, toscaModel); + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + boolean found = false; + for (Map<String, Import> importMap : imports) { + if (found) { + return true; + } + String filename = ""; + for (Object importObject : importMap.values()) { + Import importServiceTemplate = toscaExtensionYamlUtil + .yamlToObject(toscaExtensionYamlUtil.objectToYaml(importObject), Import.class); + filename = fetchFileNameForImport(importServiceTemplate.getFile(), + serviceTemplate.getMetadata() == null ? null : serviceTemplate.getMetadata().get + ("filename")); + if (filesScanned.contains(filename)) { + return false; + } else { + filesScanned.add(filename); + } + ServiceTemplate template = + toscaModel.getServiceTemplates() + .get(filename); + found = + scanAnFlatEntity(elementType, typeId, entity, template, toscaModel, filesScanned, + filesScanned.size()); + } } + return found; } + return true; + } + private String fetchFileNameForImport(String importServiceTemplateFile, + String currentMetadatafileName) { + if (importServiceTemplateFile.contains("../")) { + return importServiceTemplateFile.replace("../", ""); + } else if (importServiceTemplateFile.contains("/")) { + return importServiceTemplateFile; + } else if (currentMetadatafileName != null) { + return currentMetadatafileName.substring(0, currentMetadatafileName.indexOf("/")) + "/" + + importServiceTemplateFile; + } else { + return importServiceTemplateFile; + } } private boolean enrichEntityFromCurrentServiceTemplate(ToscaElementTypes elementType, String typeId, Object entity, ServiceTemplate serviceTemplate, - ToscaServiceModel toscaModel) { + ToscaServiceModel toscaModel, + List<String> filesScanned, + int rootScanStartInx) { String derivedFrom; switch (elementType) { case CAPABILITY_TYPE: if (serviceTemplate.getCapability_types() != null && serviceTemplate.getCapability_types().containsKey(typeId)) { + filesScanned.clear(); CapabilityType targetCapabilityType = ((CapabilityType) entity); CapabilityType sourceCapabilityType = serviceTemplate.getCapability_types().get(typeId); derivedFrom = sourceCapabilityType.getDerived_from(); - if (derivedFrom != null - && !ToscaCapabilityType.NFV_METRIC.getDisplayName().equals(derivedFrom)) { - scanAnFlatEntity(elementType, derivedFrom, entity, serviceTemplate, toscaModel); + if (derivedFrom != null) { + scanAnFlatEntity(elementType, derivedFrom, entity, serviceTemplate, toscaModel, + filesScanned, rootScanStartInx); } combineCapabilityTypeInfo(sourceCapabilityType, targetCapabilityType); } else { return false; } break; + case NODE_TYPE: + if (serviceTemplate.getNode_types() != null + && serviceTemplate.getNode_types().containsKey(typeId)) { + + filesScanned.clear(); + NodeType targetNodeType = ((NodeType) entity); + NodeType sourceNodeType = serviceTemplate.getNode_types().get(typeId); + derivedFrom = sourceNodeType.getDerived_from(); + if (derivedFrom != null) { + scanAnFlatEntity(elementType, derivedFrom, entity, serviceTemplate, toscaModel, + filesScanned, rootScanStartInx); + } + combineNodeTypeInfo(sourceNodeType, targetNodeType); + } else { + return false; + } + break; default: + MdcDataErrorMessage.createErrorMessageAndUpdateMdc(LoggerConstants.TARGET_ENTITY_DB, + LoggerTragetServiceName.ADD_ENTITIES_TO_TOSCA, ErrorLevel.ERROR.name(), + LoggerErrorCode.DATA_ERROR.getErrorCode(), LoggerErrorDescription.UNSUPPORTED_ENTITY); throw new RuntimeException( "Entity[" + elementType + "] id[" + typeId + "] flat not supported"); } @@ -426,37 +535,44 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { } + private void combineNodeTypeInfo(NodeType sourceNodeType, NodeType targetNodeType) { + targetNodeType.setDerived_from(sourceNodeType.getDerived_from()); + targetNodeType.setDescription(sourceNodeType.getDescription()); + targetNodeType.setVersion(sourceNodeType.getVersion()); + targetNodeType.setProperties( + CommonMethods.mergeMaps(targetNodeType.getProperties(), sourceNodeType.getProperties())); + targetNodeType.setInterfaces( + CommonMethods.mergeMaps(targetNodeType.getInterfaces(), sourceNodeType.getInterfaces())); + targetNodeType.setArtifacts( + CommonMethods.mergeMaps(targetNodeType.getArtifacts(), sourceNodeType.getArtifacts())); + targetNodeType.setAttributes( + CommonMethods.mergeMaps(targetNodeType.getAttributes(), sourceNodeType.getAttributes())); + targetNodeType.setCapabilities(CommonMethods + .mergeMaps(targetNodeType.getCapabilities(), sourceNodeType.getCapabilities())); + targetNodeType.setRequirements(CommonMethods + .mergeListsOfMap(targetNodeType.getRequirements(), sourceNodeType.getRequirements())); + + } + + private void combineCapabilityTypeInfo(CapabilityType sourceCapabilityType, CapabilityType targetCapabilityType) { - if (MapUtils.isNotEmpty(sourceCapabilityType.getAttributes())) { - if (targetCapabilityType.getAttributes() == null) { - targetCapabilityType.setAttributes(new HashMap<>()); - } - targetCapabilityType.getAttributes().putAll(sourceCapabilityType.getAttributes()); - } - if (MapUtils.isNotEmpty(sourceCapabilityType.getProperties())) { - if (targetCapabilityType.getProperties() == null) { - targetCapabilityType.setProperties(new HashMap<>()); - } - targetCapabilityType.getProperties().putAll(sourceCapabilityType.getProperties()); - } + targetCapabilityType.setAttributes(CommonMethods + .mergeMaps(targetCapabilityType.getAttributes(), sourceCapabilityType.getAttributes())); + targetCapabilityType.setProperties(CommonMethods + .mergeMaps(targetCapabilityType.getProperties(), sourceCapabilityType.getProperties())); + targetCapabilityType.setValid_source_types(CommonMethods + .mergeLists(targetCapabilityType.getValid_source_types(), + sourceCapabilityType.getValid_source_types())); - if (CollectionUtils.isNotEmpty(sourceCapabilityType.getValid_source_types())) { - if (targetCapabilityType.getValid_source_types() == null) { - targetCapabilityType.setValid_source_types(new ArrayList<>()); - } - targetCapabilityType.getValid_source_types() - .addAll(sourceCapabilityType.getValid_source_types()); - } - - if (CommonMethods.isEmpty(sourceCapabilityType.getDerived_from())) { + if (!CommonMethods.isEmpty(sourceCapabilityType.getDerived_from())) { targetCapabilityType.setDerived_from(sourceCapabilityType.getDerived_from()); } - if (CommonMethods.isEmpty(sourceCapabilityType.getDescription())) { + if (!CommonMethods.isEmpty(sourceCapabilityType.getDescription())) { targetCapabilityType.setDescription(sourceCapabilityType.getDescription()); } - if (CommonMethods.isEmpty(sourceCapabilityType.getVersion())) { + if (!CommonMethods.isEmpty(sourceCapabilityType.getVersion())) { targetCapabilityType.setVersion(sourceCapabilityType.getVersion()); } @@ -464,4 +580,121 @@ public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { } + /* + * Create node type according to the input substitution service template, while the substitution + * service template can be mappted to this node type, for substitution mapping. + * + * @param substitutionServiceTemplate substitution serivce template + * @param nodeTypeDerivedFromValue derived from value for the created node type + * @return the node type + */ + @Override + public NodeType createInitSubstitutionNodeType(ServiceTemplate substitutionServiceTemplate, + String nodeTypeDerivedFromValue) { + NodeType substitutionNodeType = new NodeType(); + substitutionNodeType.setDerived_from(nodeTypeDerivedFromValue); + substitutionNodeType.setDescription(substitutionServiceTemplate.getDescription()); + substitutionNodeType + .setProperties(manageSubstitutionNodeTypeProperties(substitutionServiceTemplate)); + substitutionNodeType + .setAttributes(manageSubstitutionNodeTypeAttributes(substitutionServiceTemplate)); + return substitutionNodeType; + } + + private Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties( + ServiceTemplate substitutionServiceTemplate) { + Map<String, PropertyDefinition> substitutionNodeTypeProperties = new HashMap<>(); + Map<String, ParameterDefinition> properties = + substitutionServiceTemplate.getTopology_template().getInputs(); + if (properties == null) { + return null; + } + + PropertyDefinition propertyDefinition; + String toscaPropertyName; + for (Map.Entry<String, ParameterDefinition> entry : properties.entrySet()) { + toscaPropertyName = entry.getKey(); + propertyDefinition = new PropertyDefinition(); + ParameterDefinition parameterDefinition = + substitutionServiceTemplate.getTopology_template().getInputs().get(toscaPropertyName); + propertyDefinition.setType(parameterDefinition.getType()); + propertyDefinition.setDescription(parameterDefinition.getDescription()); + propertyDefinition.set_default(parameterDefinition.get_default()); + if (parameterDefinition.getRequired() != null) { + propertyDefinition.setRequired(parameterDefinition.getRequired()); + } + if (propertyDefinition.get_default() != null) { + propertyDefinition.setRequired(false); + } + if (!CollectionUtils.isEmpty(parameterDefinition.getConstraints())) { + propertyDefinition.setConstraints(parameterDefinition.getConstraints()); + } + propertyDefinition.setEntry_schema(parameterDefinition.getEntry_schema()); + if (parameterDefinition.getStatus() != null) { + propertyDefinition.setStatus(parameterDefinition.getStatus()); + } + substitutionNodeTypeProperties.put(toscaPropertyName, propertyDefinition); + } + return substitutionNodeTypeProperties; + } + + private Map<String, AttributeDefinition> manageSubstitutionNodeTypeAttributes( + ServiceTemplate substitutionServiceTemplate) { + Map<String, AttributeDefinition> substitutionNodeTypeAttributes = new HashMap<>(); + Map<String, ParameterDefinition> attributes = + substitutionServiceTemplate.getTopology_template().getOutputs(); + if (attributes == null) { + return null; + } + AttributeDefinition attributeDefinition; + String toscaAttributeName; + + for (Map.Entry<String, ParameterDefinition> entry : attributes.entrySet()) { + attributeDefinition = new AttributeDefinition(); + toscaAttributeName = entry.getKey(); + ParameterDefinition parameterDefinition = + substitutionServiceTemplate.getTopology_template().getOutputs().get(toscaAttributeName); + if (parameterDefinition.getType() != null && !parameterDefinition.getType().isEmpty()) { + attributeDefinition.setType(parameterDefinition.getType()); + } else { + attributeDefinition.setType(PropertyType.STRING.getDisplayName()); + } + attributeDefinition.setDescription(parameterDefinition.getDescription()); + attributeDefinition.set_default(parameterDefinition.get_default()); + attributeDefinition.setEntry_schema(parameterDefinition.getEntry_schema()); + if (Objects.nonNull(parameterDefinition.getStatus())) { + attributeDefinition.setStatus(parameterDefinition.getStatus()); + } + substitutionNodeTypeAttributes.put(toscaAttributeName, attributeDefinition); + } + return substitutionNodeTypeAttributes; + } + + /** + * Checks if the requirement exists in the node template. + * + * @param nodeTemplate the node template + * @param requirementId the requirement id + * @param requirementAssignment the requirement assignment + * @return true if the requirement already exists and false otherwise + */ + public boolean isRequirementExistInNodeTemplate(NodeTemplate nodeTemplate, + String requirementId, + RequirementAssignment requirementAssignment) { + boolean result = false; + List<Map<String, RequirementAssignment>> nodeTemplateRequirements = nodeTemplate + .getRequirements(); + if (nodeTemplateRequirements != null) { + for (Map<String, RequirementAssignment> requirement : nodeTemplateRequirements) { + if (requirement.containsKey(requirementId)) { + result = DataModelUtil.compareRequirementAssignment(requirementAssignment, + requirement.get(requirementId)); + if (result) { + break; + } + } + } + } + return result; + } } |