diff options
author | shiria <shiri.amichai@amdocs.com> | 2018-06-04 11:07:29 +0300 |
---|---|---|
committer | Avi Gaffa <avi.gaffa@amdocs.com> | 2018-06-05 14:31:34 +0000 |
commit | 09c6320df7f768e42edeaedd7ba69e6fb13d433d (patch) | |
tree | 92883e0297c3d47ab039685ca91f2f47a1dbcd46 /openecomp-be/lib/openecomp-tosca-lib/src | |
parent | d9cae980e80021dfad0bc9366d32d2cf996cfa90 (diff) |
fix get flat node type
update node type interface
update return value to object which include the type hierarchy
Change-Id: I97623c7bbad0223a174370d13aabf4c3efe9c21e
Issue-ID: SDC-1394
Signed-off-by: shiria <shiri.amichai@amdocs.com>
Diffstat (limited to 'openecomp-be/lib/openecomp-tosca-lib/src')
18 files changed, 3417 insertions, 2000 deletions
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/datatypes/ToscaFlatData.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/datatypes/ToscaFlatData.java new file mode 100644 index 0000000000..b898640df9 --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/datatypes/ToscaFlatData.java @@ -0,0 +1,57 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openecomp.sdc.tosca.datatypes; + + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; + +public class ToscaFlatData { + + private Object flatEntity; + private ToscaElementTypes elementType; + private List<String> inheritanceHierarchyType; + + public ToscaElementTypes getElementType() { + return elementType; + } + + public void setElementType(ToscaElementTypes elementType) { + this.elementType = elementType; + } + + public Object getFlatEntity() { + return flatEntity; + } + + public void setFlatEntity(Object flatEntity) { + this.flatEntity = flatEntity; + } + + public List<String> getInheritanceHierarchyType() { + return inheritanceHierarchyType; + } + + public void addInheritanceHierarchyType(String inheritedType) { + if (CollectionUtils.isEmpty(inheritanceHierarchyType)) { + inheritanceHierarchyType = new ArrayList<>(); + } + this.inheritanceHierarchyType.add(inheritedType); + } +} diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java index a8629aa287..fc411bf009 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/DataModelUtil.java @@ -45,7 +45,6 @@ import org.onap.sdc.tosca.datatypes.model.EntrySchema; import org.onap.sdc.tosca.datatypes.model.GroupDefinition; import org.onap.sdc.tosca.datatypes.model.Import; import org.onap.sdc.tosca.datatypes.model.InterfaceDefinition; -import org.onap.sdc.tosca.datatypes.model.InterfaceDefinitionTemplate; import org.onap.sdc.tosca.datatypes.model.InterfaceDefinitionType; import org.onap.sdc.tosca.datatypes.model.InterfaceType; import org.onap.sdc.tosca.datatypes.model.NodeTemplate; @@ -101,11 +100,10 @@ public class DataModelUtil { * @param substitutionMapping the substitution mapping */ public static void addSubstitutionMapping(ServiceTemplate serviceTemplate, - SubstitutionMapping substitutionMapping) { + SubstitutionMapping substitutionMapping) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Substitution Mapping", SERVICE_TEMPLATE) - .build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Substitution Mapping", SERVICE_TEMPLATE) + .build()); } if (serviceTemplate.getTopology_template() == null) { @@ -135,12 +133,11 @@ public class DataModelUtil { * @param substitutionMappingRequirementList the substitution mapping requirement list */ public static void addSubstitutionMappingReq(ServiceTemplate serviceTemplate, - String substitutionMappingRequirementId, - List<String> substitutionMappingRequirementList) { + String substitutionMappingRequirementId, + List<String> substitutionMappingRequirementList) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Substitution Mapping Requirements", - SERVICE_TEMPLATE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Substitution Mapping Requirements", + SERVICE_TEMPLATE).build()); } if (serviceTemplate.getTopology_template() == null) { @@ -149,14 +146,12 @@ public class DataModelUtil { if (serviceTemplate.getTopology_template().getSubstitution_mappings() == null) { serviceTemplate.getTopology_template().setSubstitution_mappings(new SubstitutionMapping()); } - if (serviceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() - == null) { - serviceTemplate.getTopology_template().getSubstitution_mappings() - .setRequirements(new HashMap<>()); + if (serviceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() == null) { + serviceTemplate.getTopology_template().getSubstitution_mappings().setRequirements(new HashMap<>()); } serviceTemplate.getTopology_template().getSubstitution_mappings().getRequirements() - .put(substitutionMappingRequirementId, substitutionMappingRequirementList); + .put(substitutionMappingRequirementId, substitutionMappingRequirementList); } /** @@ -167,12 +162,11 @@ public class DataModelUtil { * @param substitutionMappingCapabilityList the substitution mapping capability list */ public static void addSubstitutionMappingCapability(ServiceTemplate serviceTemplate, - String substitutionMappingCapabilityId, - List<String> substitutionMappingCapabilityList) { + String substitutionMappingCapabilityId, + List<String> substitutionMappingCapabilityList) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Substitution Mapping Capabilities", - SERVICE_TEMPLATE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Substitution Mapping Capabilities", + SERVICE_TEMPLATE).build()); } if (serviceTemplate.getTopology_template() == null) { @@ -181,14 +175,12 @@ public class DataModelUtil { if (serviceTemplate.getTopology_template().getSubstitution_mappings() == null) { serviceTemplate.getTopology_template().setSubstitution_mappings(new SubstitutionMapping()); } - if (serviceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() - == null) { - serviceTemplate.getTopology_template().getSubstitution_mappings() - .setCapabilities(new HashMap<>()); + if (serviceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() == null) { + serviceTemplate.getTopology_template().getSubstitution_mappings().setCapabilities(new HashMap<>()); } serviceTemplate.getTopology_template().getSubstitution_mappings().getCapabilities() - .putIfAbsent(substitutionMappingCapabilityId, substitutionMappingCapabilityList); + .putIfAbsent(substitutionMappingCapabilityId, substitutionMappingCapabilityList); } /** @@ -198,9 +190,8 @@ public class DataModelUtil { * @return the service template node templates and empty map if not present */ public static Map<String, NodeTemplate> getNodeTemplates(ServiceTemplate serviceTemplate) { - if (Objects.isNull(serviceTemplate) - || Objects.isNull(serviceTemplate.getTopology_template()) - || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())) { + if (Objects.isNull(serviceTemplate) || Objects.isNull(serviceTemplate.getTopology_template()) + || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates())) { return new HashMap<>(); } @@ -214,9 +205,8 @@ public class DataModelUtil { * @return the service template groups and empty map if not present */ public static Map<String, GroupDefinition> getGroups(ServiceTemplate serviceTemplate) { - if (Objects.isNull(serviceTemplate) - || Objects.isNull(serviceTemplate.getTopology_template()) - || MapUtils.isEmpty(serviceTemplate.getTopology_template().getGroups())) { + if (Objects.isNull(serviceTemplate) || Objects.isNull(serviceTemplate.getTopology_template()) + || MapUtils.isEmpty(serviceTemplate.getTopology_template().getGroups())) { return new HashMap<>(); } @@ -231,10 +221,10 @@ public class DataModelUtil { * @param nodeTemplate the node template */ public static void addNodeTemplate(ServiceTemplate serviceTemplate, String nodeTemplateId, - NodeTemplate nodeTemplate) { + NodeTemplate nodeTemplate) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Node Template", SERVICE_TEMPLATE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Node Template", SERVICE_TEMPLATE) + .build()); } TopologyTemplate topologyTemplate = serviceTemplate.getTopology_template(); if (Objects.isNull(topologyTemplate)) { @@ -253,15 +243,14 @@ public class DataModelUtil { * @param nodeType the node type * @param capabilities the capability definitions */ - public static void addNodeTypeCapabilitiesDef(NodeType nodeType, - Map<String, CapabilityDefinition> capabilities) { + public static void addNodeTypeCapabilitiesDef(NodeType nodeType, Map<String, CapabilityDefinition> capabilities) { if (MapUtils.isEmpty(capabilities) || capabilities.entrySet().isEmpty()) { return; } if (nodeType == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Capability Definition", NODE_TYPE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Capability Definition", NODE_TYPE) + .build()); } if (MapUtils.isEmpty(nodeType.getCapabilities())) { @@ -283,11 +272,10 @@ public class DataModelUtil { * @param policyDefinition the policy definition */ public static void addPolicyDefinition(ServiceTemplate serviceTemplate, String policyId, - PolicyDefinition policyDefinition) { + PolicyDefinition policyDefinition) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Policy Definition", SERVICE_TEMPLATE) - .build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Policy Definition", SERVICE_TEMPLATE) + .build()); } TopologyTemplate topologyTemplate = serviceTemplate.getTopology_template(); if (Objects.isNull(topologyTemplate)) { @@ -307,11 +295,9 @@ public class DataModelUtil { * @param nodeTypeId the node type id * @param nodeType the node type */ - public static void addNodeType(ServiceTemplate serviceTemplate, String nodeTypeId, - NodeType nodeType) { + public static void addNodeType(ServiceTemplate serviceTemplate, String nodeTypeId, NodeType nodeType) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder(NODE_TYPE, SERVICE_TEMPLATE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder(NODE_TYPE, SERVICE_TEMPLATE).build()); } if (serviceTemplate.getNode_types() == null) { serviceTemplate.setNode_types(new HashMap<>()); @@ -326,13 +312,11 @@ public class DataModelUtil { * @param relationshipTemplateId the relationship template id * @param relationshipTemplate the relationship template */ - public static void addRelationshipTemplate(ServiceTemplate serviceTemplate, - String relationshipTemplateId, - RelationshipTemplate relationshipTemplate) { + public static void addRelationshipTemplate(ServiceTemplate serviceTemplate, String relationshipTemplateId, + RelationshipTemplate relationshipTemplate) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Relationship Template", SERVICE_TEMPLATE) - .build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Relationship Template", + SERVICE_TEMPLATE).build()); } if (serviceTemplate.getTopology_template() == null) { serviceTemplate.setTopology_template(new TopologyTemplate()); @@ -341,7 +325,7 @@ public class DataModelUtil { serviceTemplate.getTopology_template().setRelationship_templates(new HashMap<>()); } serviceTemplate.getTopology_template().getRelationship_templates() - .put(relationshipTemplateId, relationshipTemplate); + .put(relationshipTemplateId, relationshipTemplate); } /** @@ -352,11 +336,10 @@ public class DataModelUtil { * @param requirementAssignment the requirement assignment */ public static void addRequirementAssignment(NodeTemplate nodeTemplate, String requirementId, - RequirementAssignment requirementAssignment) { + RequirementAssignment requirementAssignment) { if (nodeTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Requirement Assignment", "Node Template") - .build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Requirement Assignment", + "Node Template").build()); } if (requirementAssignment.getNode() == null) { throw new CoreException(new InvalidRequirementAssignmentErrorBuilder(requirementId).build()); @@ -391,11 +374,9 @@ public class DataModelUtil { * @param nodeTemplateId the node template id * @return the node template */ - public static NodeTemplate getNodeTemplate(ServiceTemplate serviceTemplate, - String nodeTemplateId) { - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getNode_templates() == null) { + public static NodeTemplate getNodeTemplate(ServiceTemplate serviceTemplate, String nodeTemplateId) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getNode_templates() == null) { return null; } return serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId); @@ -422,18 +403,12 @@ public class DataModelUtil { * @param requirementDefinitionId the requirement definition id * @return the requirement definition */ - public static Optional<RequirementDefinition> getRequirementDefinition( - NodeType nodeType, - String requirementDefinitionId) { + public static Optional<RequirementDefinition> getRequirementDefinition(NodeType nodeType, + String requirementDefinitionId) { if (nodeType == null || nodeType.getRequirements() == null || requirementDefinitionId == null) { return Optional.empty(); } - for (Map<String, RequirementDefinition> reqMap : nodeType.getRequirements()) { - if (reqMap.containsKey(requirementDefinitionId)) { - return Optional.of(reqMap.get(requirementDefinitionId)); - } - } - return Optional.empty(); + return getRequirementDefinition(nodeType.getRequirements(), requirementDefinitionId); } /** @@ -442,16 +417,19 @@ public class DataModelUtil { * @param requirementsDefinitionList requirement definition list * @param requirementKey requirement key */ - public static Optional<RequirementDefinition> getRequirementDefinition( - List<Map<String, RequirementDefinition>> requirementsDefinitionList, - String requirementKey) { + public static Optional<RequirementDefinition> getRequirementDefinition(List<Map<String, RequirementDefinition>> requirementsDefinitionList, + String requirementKey) { if (CollectionUtils.isEmpty(requirementsDefinitionList)) { return Optional.empty(); } + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); for (Map<String, RequirementDefinition> requirementMap : requirementsDefinitionList) { if (requirementMap.containsKey(requirementKey)) { - return Optional.of(requirementMap.get(requirementKey)); + RequirementDefinition requirementDefinition = toscaExtensionYamlUtil.yamlToObject( + toscaExtensionYamlUtil.objectToYaml(requirementMap.get(requirementKey)), + RequirementDefinition.class); + return Optional.of(requirementDefinition); } } return Optional.empty(); @@ -464,9 +442,8 @@ public class DataModelUtil { * @param capabilityDefinitionId the capability definition id * @return the capability definition */ - public static Optional<CapabilityDefinition> getCapabilityDefinition( - NodeType nodeType, - String capabilityDefinitionId) { + public static Optional<CapabilityDefinition> getCapabilityDefinition(NodeType nodeType, + String capabilityDefinitionId) { if (nodeType == null || nodeType.getCapabilities() == null || capabilityDefinitionId == null) { return Optional.empty(); } @@ -480,12 +457,11 @@ public class DataModelUtil { * @param groupName the group name * @param group the group */ - public static void addGroupDefinitionToTopologyTemplate(ServiceTemplate serviceTemplate, - String groupName, GroupDefinition group) { + public static void addGroupDefinitionToTopologyTemplate(ServiceTemplate serviceTemplate, String groupName, + GroupDefinition group) { if (serviceTemplate == null) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Group Definition", SERVICE_TEMPLATE) - .build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Group Definition", SERVICE_TEMPLATE) + .build()); } TopologyTemplate topologyTemplate = serviceTemplate.getTopology_template(); @@ -511,13 +487,10 @@ public class DataModelUtil { * @param groupName the group name * @param groupMemberId the group member id */ - public static void addGroupMember(ServiceTemplate serviceTemplate, - String groupName, - String groupMemberId) { + public static void addGroupMember(ServiceTemplate serviceTemplate, String groupName, String groupMemberId) { TopologyTemplate topologyTemplate = serviceTemplate.getTopology_template(); - if (Objects.isNull(topologyTemplate) - || topologyTemplate.getGroups() == null - || topologyTemplate.getGroups().get(groupName) == null) { + if (Objects.isNull(topologyTemplate) || topologyTemplate.getGroups() == null + || topologyTemplate.getGroups().get(groupName) == null) { return; } @@ -542,11 +515,9 @@ public class DataModelUtil { * @param defaultVal the default val * @return the property definition */ - public static ParameterDefinition createParameterDefinition(String type, String description, - boolean required, - List<Constraint> constraints, - EntrySchema entrySchema, - Object defaultVal) { + public static ParameterDefinition createParameterDefinition(String type, String description, boolean required, + List<Constraint> constraints, + EntrySchema entrySchema, Object defaultVal) { ParameterDefinition paramDef = new ParameterDefinition(); paramDef.setType(type); paramDef.setDescription(description); @@ -566,8 +537,8 @@ public class DataModelUtil { * @param occurrences the occurrences * @return the requirement definition */ - public static RequirementDefinition createRequirement(String capability, String node, - String relationship, Object[] occurrences) { + public static RequirementDefinition createRequirement(String capability, String node, String relationship, + Object[] occurrences) { RequirementDefinition requirementDefinition = new RequirementDefinition(); requirementDefinition.setCapability(capability); requirementDefinition.setNode(node); @@ -586,10 +557,8 @@ public class DataModelUtil { * @param constraints the constraints * @return the entry schema */ - public static EntrySchema createEntrySchema(String type, String description, - List<Constraint> constraints) { - if (Objects.isNull(type) && Objects.isNull(description) - && CollectionUtils.isEmpty(constraints)) { + public static EntrySchema createEntrySchema(String type, String description, List<Constraint> constraints) { + if (Objects.isNull(type) && Objects.isNull(description) && CollectionUtils.isEmpty(constraints)) { return null; } @@ -608,9 +577,8 @@ public class DataModelUtil { * @param nestedPropertyName the nested property name * @return the map */ - public static Map createGetInputPropertyValueFromListParameter(String inputPropertyListName, - int indexInTheList, - String... nestedPropertyName) { + public static Map createGetInputPropertyValueFromListParameter(String inputPropertyListName, int indexInTheList, + String... nestedPropertyName) { List<Object> propertyList = new ArrayList<>(); propertyList.add(inputPropertyListName); propertyList.add(indexInTheList); @@ -628,8 +596,7 @@ public class DataModelUtil { * @param propertyDefinition the property definition * @return the parameter definition ext */ - public static ParameterDefinitionExt convertPropertyDefToParameterDef( - PropertyDefinition propertyDefinition) { + public static ParameterDefinitionExt convertPropertyDefToParameterDef(PropertyDefinition propertyDefinition) { if (propertyDefinition == null) { return null; } @@ -641,8 +608,8 @@ public class DataModelUtil { parameterDefinition.set_default(propertyDefinition.get_default()); parameterDefinition.setStatus(propertyDefinition.getStatus()); parameterDefinition.setConstraints(propertyDefinition.getConstraints()); - parameterDefinition.setEntry_schema(Objects.isNull(propertyDefinition.getEntry_schema()) ? null - : propertyDefinition.getEntry_schema().clone()); + parameterDefinition.setEntry_schema(Objects.isNull(propertyDefinition.getEntry_schema()) ? null : + propertyDefinition.getEntry_schema().clone()); parameterDefinition.setHidden(false); parameterDefinition.setImmutable(false); return parameterDefinition; @@ -655,8 +622,8 @@ public class DataModelUtil { * @param outputValue the output value * @return the parameter definition ext */ - public static ParameterDefinitionExt convertAttributeDefToParameterDef( - AttributeDefinition attributeDefinition, Map<String, List> outputValue) { + public static ParameterDefinitionExt convertAttributeDefToParameterDef(AttributeDefinition attributeDefinition, + Map<String, List> outputValue) { if (attributeDefinition == null) { return null; } @@ -668,7 +635,7 @@ public class DataModelUtil { public static boolean isNodeTemplate(String entryId, ServiceTemplate serviceTemplate) { return serviceTemplate.getTopology_template().getNode_templates() != null - && serviceTemplate.getTopology_template().getNode_templates().get(entryId) != null; + && serviceTemplate.getTopology_template().getNode_templates().get(entryId) != null; } /** @@ -679,12 +646,11 @@ public class DataModelUtil { * @param parameterDefinition the parameter definition */ public static void addInputParameterToTopologyTemplate(ServiceTemplate serviceTemplate, - String parameterDefinitionId, - ParameterDefinition parameterDefinition) { + String parameterDefinitionId, + ParameterDefinition parameterDefinition) { if (Objects.isNull(serviceTemplate)) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Topology Template Input Parameter", - SERVICE_TEMPLATE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Topology Template Input Parameter", + SERVICE_TEMPLATE).build()); } TopologyTemplate topologyTemplate = serviceTemplate.getTopology_template(); if (Objects.isNull(topologyTemplate)) { @@ -705,12 +671,11 @@ public class DataModelUtil { * @param parameterDefinition the parameter definition */ public static void addOutputParameterToTopologyTemplate(ServiceTemplate serviceTemplate, - String parameterDefinitionId, - ParameterDefinition parameterDefinition) { + String parameterDefinitionId, + ParameterDefinition parameterDefinition) { if (Objects.isNull(serviceTemplate)) { - throw new CoreException( - new InvalidAddActionNullEntityErrorBuilder("Topology Template Output Parameter", - SERVICE_TEMPLATE).build()); + throw new CoreException(new InvalidAddActionNullEntityErrorBuilder("Topology Template Output Parameter", + SERVICE_TEMPLATE).build()); } TopologyTemplate topologyTemplate = serviceTemplate.getTopology_template(); if (Objects.isNull(topologyTemplate)) { @@ -730,7 +695,7 @@ public class DataModelUtil { * @param requirementDef added requirement def */ public static void addRequirementToList(List<Map<String, RequirementDefinition>> requirementList, - Map<String, RequirementDefinition> requirementDef) { + Map<String, RequirementDefinition> requirementDef) { if (requirementDef == null) { return; } @@ -748,8 +713,7 @@ public class DataModelUtil { * * @param nodeTemplate node template */ - public static Map<String, RequirementAssignment> getNodeTemplateRequirements( - NodeTemplate nodeTemplate) { + public static Map<String, RequirementAssignment> getNodeTemplateRequirements(NodeTemplate nodeTemplate) { if (Objects.isNull(nodeTemplate)) { return null; } @@ -761,14 +725,11 @@ public class DataModelUtil { } YamlUtil yamlUtil = new YamlUtil(); for (Map<String, RequirementAssignment> requirementAssignmentMap : templateRequirements) { - for (Map.Entry<String, RequirementAssignment> requirementEntry : requirementAssignmentMap - .entrySet()) { - RequirementAssignment requirementAssignment = ( - yamlUtil - .yamlToObject(yamlUtil.objectToYaml(requirementEntry.getValue()), - RequirementAssignment.class)); - nodeTemplateRequirementsAssignment - .put(requirementEntry.getKey(), requirementAssignment); + for (Map.Entry<String, RequirementAssignment> requirementEntry : requirementAssignmentMap.entrySet()) { + RequirementAssignment requirementAssignment = + (yamlUtil.yamlToObject(yamlUtil.objectToYaml(requirementEntry.getValue()), + RequirementAssignment.class)); + nodeTemplateRequirementsAssignment.put(requirementEntry.getKey(), requirementAssignment); } } return nodeTemplateRequirementsAssignment; @@ -780,24 +741,20 @@ public class DataModelUtil { * @param nodeTemplate the node template * @return the node template requirement list and null if the node has no requirements */ - public static List<Map<String, RequirementAssignment>> getNodeTemplateRequirementList( - NodeTemplate nodeTemplate) { + public static List<Map<String, RequirementAssignment>> getNodeTemplateRequirementList(NodeTemplate nodeTemplate) { ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); //Creating concrete objects List<Map<String, RequirementAssignment>> requirements = nodeTemplate.getRequirements(); List<Map<String, RequirementAssignment>> concreteRequirementList = null; if (requirements != null) { concreteRequirementList = new ArrayList<>(); - ListIterator<Map<String, RequirementAssignment>> reqListIterator = requirements - .listIterator(); + ListIterator<Map<String, RequirementAssignment>> reqListIterator = requirements.listIterator(); while (reqListIterator.hasNext()) { Map<String, RequirementAssignment> requirement = reqListIterator.next(); Map<String, RequirementAssignment> concreteRequirement = new HashMap<>(); for (Map.Entry<String, RequirementAssignment> reqEntry : requirement.entrySet()) { - RequirementAssignment requirementAssignment = ( - toscaExtensionYamlUtil - .yamlToObject(toscaExtensionYamlUtil.objectToYaml(reqEntry.getValue()), - RequirementAssignment.class)); + RequirementAssignment requirementAssignment = (toscaExtensionYamlUtil.yamlToObject( + toscaExtensionYamlUtil.objectToYaml(reqEntry.getValue()), RequirementAssignment.class)); concreteRequirement.put(reqEntry.getKey(), requirementAssignment); concreteRequirementList.add(concreteRequirement); reqListIterator.remove(); @@ -816,9 +773,8 @@ public class DataModelUtil { * @param requirementsAssignmentList requirement definition list * @param requirementKey requirement key */ - public static Optional<List<RequirementAssignment>> getRequirementAssignment( - List<Map<String, RequirementAssignment>> requirementsAssignmentList, - String requirementKey) { + public static Optional<List<RequirementAssignment>> getRequirementAssignment(List<Map<String, RequirementAssignment>> requirementsAssignmentList, + String requirementKey) { if (CollectionUtils.isEmpty(requirementsAssignmentList)) { return Optional.empty(); } @@ -827,10 +783,9 @@ public class DataModelUtil { for (Map<String, RequirementAssignment> requirementMap : requirementsAssignmentList) { if (requirementMap.containsKey(requirementKey)) { YamlUtil yamlUtil = new YamlUtil(); - RequirementAssignment requirementAssignment = ( - yamlUtil - .yamlToObject(yamlUtil.objectToYaml(requirementMap.get(requirementKey)), - RequirementAssignment.class)); + RequirementAssignment requirementAssignment = + (yamlUtil.yamlToObject(yamlUtil.objectToYaml(requirementMap.get(requirementKey)), + RequirementAssignment.class)); matchRequirementAssignmentList.add(requirementAssignment); } } @@ -846,9 +801,8 @@ public class DataModelUtil { * @param requirementsDefinitionList requirement definition list * @param requirementKey requirement key */ - public static void removeRequirementsDefinition( - List<Map<String, RequirementDefinition>> requirementsDefinitionList, - String requirementKey) { + public static void removeRequirementsDefinition(List<Map<String, RequirementDefinition>> requirementsDefinitionList, + String requirementKey) { if (requirementsDefinitionList == null) { return; } @@ -871,9 +825,8 @@ public class DataModelUtil { * @param requirementsAssignmentList requirement Assignment list * @param requirementKey requirement key */ - public static void removeRequirementsAssignment( - List<Map<String, RequirementAssignment>> requirementsAssignmentList, - String requirementKey) { + public static void removeRequirementsAssignment(List<Map<String, RequirementAssignment>> requirementsAssignmentList, + String requirementKey) { if (requirementsAssignmentList == null) { return; } @@ -898,13 +851,10 @@ public class DataModelUtil { * @param requirementKey the requirement key * @param requirementAssignmentToBeDeleted the requirement assignment to be deleted */ - public static void removeRequirementAssignment( - NodeTemplate nodeTemplate, - String requirementKey, - RequirementAssignment requirementAssignmentToBeDeleted) { + public static void removeRequirementAssignment(NodeTemplate nodeTemplate, String requirementKey, + RequirementAssignment requirementAssignmentToBeDeleted) { ToscaAnalyzerService toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - List<Map<String, RequirementAssignment>> nodeTemplateRequirements = nodeTemplate - .getRequirements(); + List<Map<String, RequirementAssignment>> nodeTemplateRequirements = nodeTemplate.getRequirements(); if (nodeTemplateRequirements == null) { return; } @@ -915,10 +865,12 @@ public class DataModelUtil { RequirementAssignment requirementAssignment = reqMap.get(requirementKey); if (requirementAssignment != null) { boolean isDesiredRequirementAssignment = toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, - requirementAssignmentToBeDeleted.getCapability(), - requirementAssignmentToBeDeleted.getNode(), - requirementAssignmentToBeDeleted.getRelationship()); + .isDesiredRequirementAssignment(requirementAssignment, + requirementAssignmentToBeDeleted + .getCapability(), + requirementAssignmentToBeDeleted.getNode(), + requirementAssignmentToBeDeleted + .getRelationship()); if (isDesiredRequirementAssignment) { iter.remove(); } @@ -950,8 +902,7 @@ public class DataModelUtil { * @param importId namespace * @return true if exist, false if not exist */ - public static boolean isImportAddedToServiceTemplate(List<Map<String, Import>> imports, - String importId) { + public static boolean isImportAddedToServiceTemplate(List<Map<String, Import>> imports, String importId) { for (Map<String, Import> anImport : imports) { if (anImport.containsKey(importId)) { return true; @@ -967,11 +918,9 @@ public class DataModelUtil { * @param outputParameterId output parameter id * @return ParameterDefinition - output parameter */ - public static ParameterDefinition getOuputParameter(ServiceTemplate serviceTemplate, - String outputParameterId) { - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getOutputs() == null) { + public static ParameterDefinition getOuputParameter(ServiceTemplate serviceTemplate, String outputParameterId) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getOutputs() == null) { return null; } return serviceTemplate.getTopology_template().getOutputs().get(outputParameterId); @@ -983,11 +932,9 @@ public class DataModelUtil { * @param serviceTemplate the service template * @return the input parameters */ - public static Map<String, ParameterDefinition> getInputParameters(ServiceTemplate - serviceTemplate) { - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getInputs() == null) { + public static Map<String, ParameterDefinition> getInputParameters(ServiceTemplate serviceTemplate) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getInputs() == null) { return null; } return serviceTemplate.getTopology_template().getInputs(); @@ -999,11 +946,9 @@ public class DataModelUtil { * @param serviceTemplate the service template * @return the relationship template */ - public static Map<String, RelationshipTemplate> getRelationshipTemplates(ServiceTemplate - serviceTemplate) { - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getRelationship_templates() == null) { + public static Map<String, RelationshipTemplate> getRelationshipTemplates(ServiceTemplate serviceTemplate) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getRelationship_templates() == null) { return null; } return serviceTemplate.getTopology_template().getRelationship_templates(); @@ -1016,10 +961,8 @@ public class DataModelUtil { * @param propertyId property id * @return Object property Value */ - public static Object getPropertyValue(NodeTemplate nodeTemplate, - String propertyId) { - if (nodeTemplate == null - || nodeTemplate.getProperties() == null) { + public static Object getPropertyValue(NodeTemplate nodeTemplate, String propertyId) { + if (nodeTemplate == null || nodeTemplate.getProperties() == null) { return null; } return nodeTemplate.getProperties().get(propertyId); @@ -1033,15 +976,13 @@ public class DataModelUtil { * @return node template properties */ public static Map<String, Object> getNodeTemplateProperties(ServiceTemplate serviceTemplate, - String nodeTemplateId) { - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getNode_templates() == null - || serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId) == null) { + String nodeTemplateId) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getNode_templates() == null + || serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId) == null) { return null; } - return serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId) - .getProperties(); + return serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId).getProperties(); } /** @@ -1051,9 +992,7 @@ public class DataModelUtil { * @param propertyKey the property key * @param propertyValue the property value */ - public static void addNodeTemplateProperty(NodeTemplate nodeTemplate, - String propertyKey, - Object propertyValue) { + public static void addNodeTemplateProperty(NodeTemplate nodeTemplate, String propertyKey, Object propertyValue) { if (Objects.isNull(nodeTemplate)) { return; } @@ -1072,9 +1011,8 @@ public class DataModelUtil { * @return the substitution mappings */ public static SubstitutionMapping getSubstitutionMappings(ServiceTemplate serviceTemplate) { - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getSubstitution_mappings() == null) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getSubstitution_mappings() == null) { return null; } return serviceTemplate.getTopology_template().getSubstitution_mappings(); @@ -1088,11 +1026,8 @@ public class DataModelUtil { * @param second the second requirement assignment object * @return true if objects are equal and false otherwise */ - public static boolean compareRequirementAssignment(RequirementAssignment first, - RequirementAssignment second) { - return ( - first.getCapability().equals(second.getCapability()) - && first.getNode().equals(second.getNode()) + public static boolean compareRequirementAssignment(RequirementAssignment first, RequirementAssignment second) { + return (first.getCapability().equals(second.getCapability()) && first.getNode().equals(second.getNode()) && first.getRelationship().equals(second.getRelationship())); } @@ -1126,8 +1061,7 @@ public class DataModelUtil { ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(obj); //Deserialize object - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream - .toByteArray()); + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); clonedObjectValue = objectInputStream.readObject(); } catch (NotSerializableException ex) { @@ -1147,15 +1081,12 @@ public class DataModelUtil { * @param nodeTemplate the node template * @param count the count */ - public static void addSubstitutionFilteringProperty(String templateName, - NodeTemplate nodeTemplate, int count) { + public static void addSubstitutionFilteringProperty(String templateName, NodeTemplate nodeTemplate, int count) { Map<String, Object> serviceTemplateFilterPropertyValue = new HashMap<>(); Map<String, Object> properties = nodeTemplate.getProperties(); - serviceTemplateFilterPropertyValue.put(ToscaConstants - .SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, templateName); + serviceTemplateFilterPropertyValue.put(ToscaConstants.SUBSTITUTE_SERVICE_TEMPLATE_PROPERTY_NAME, templateName); serviceTemplateFilterPropertyValue.put(ToscaConstants.COUNT_PROPERTY_NAME, count); - properties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, - serviceTemplateFilterPropertyValue); + properties.put(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME, serviceTemplateFilterPropertyValue); nodeTemplate.setProperties(properties); } @@ -1165,14 +1096,12 @@ public class DataModelUtil { * @param computeNodeTemplateId compute node template id * @param portNodeTemplate port node template */ - public static void addBindingReqFromPortToCompute(String computeNodeTemplateId, - NodeTemplate portNodeTemplate) { + public static void addBindingReqFromPortToCompute(String computeNodeTemplateId, NodeTemplate portNodeTemplate) { RequirementAssignment requirementAssignment = new RequirementAssignment(); requirementAssignment.setCapability(ToscaCapabilityType.NATIVE_NETWORK_BINDABLE); requirementAssignment.setRelationship(ToscaRelationshipType.NATIVE_NETWORK_BINDS_TO); requirementAssignment.setNode(computeNodeTemplateId); - addRequirementAssignment(portNodeTemplate, ToscaConstants.BINDING_REQUIREMENT_ID, - requirementAssignment); + addRequirementAssignment(portNodeTemplate, ToscaConstants.BINDING_REQUIREMENT_ID, requirementAssignment); } /** @@ -1183,18 +1112,15 @@ public class DataModelUtil { * @param mapping the mapping * @return the substitution mapping */ - public static SubstitutionMapping createSubstitutionTemplateSubMapping( - String nodeTypeKey, - NodeType substitutionNodeType, - Map<String, Map<String, List<String>>> mapping) { + public static SubstitutionMapping createSubstitutionTemplateSubMapping(String nodeTypeKey, + NodeType substitutionNodeType, + Map<String, Map<String, List<String>>> mapping) { SubstitutionMapping substitutionMapping = new SubstitutionMapping(); substitutionMapping.setNode_type(nodeTypeKey); - substitutionMapping.setCapabilities( - manageCapabilityMapping(substitutionNodeType.getCapabilities(), mapping.get(ToscaConstants - .CAPABILITY))); + substitutionMapping.setCapabilities(manageCapabilityMapping(substitutionNodeType.getCapabilities(), + mapping.get(ToscaConstants.CAPABILITY))); substitutionMapping.setRequirements( - manageRequirementMapping(substitutionNodeType.getRequirements(), - mapping.get("requirement"))); + manageRequirementMapping(substitutionNodeType.getRequirements(), mapping.get("requirement"))); return substitutionMapping; } @@ -1207,8 +1133,8 @@ public class DataModelUtil { * @param capabilityAttributes the capability attributes */ public static void addNodeTemplateCapability(NodeTemplate nodeTemplate, String capabilityId, - Map<String, Object> capabilityProperties, - Map<String, Object> capabilityAttributes) { + Map<String, Object> capabilityProperties, + Map<String, Object> capabilityAttributes) { Map<String, CapabilityAssignment> capabilities = nodeTemplate.getCapabilities(); if (Objects.isNull(capabilities)) { capabilities = new HashMap<>(); @@ -1220,9 +1146,8 @@ public class DataModelUtil { nodeTemplate.setCapabilities(capabilities); } - private static Map<String, List<String>> manageRequirementMapping( - List<Map<String, RequirementDefinition>> requirementList, - Map<String, List<String>> requirementSubstitutionMapping) { + private static Map<String, List<String>> manageRequirementMapping(List<Map<String, RequirementDefinition>> requirementList, + Map<String, List<String>> requirementSubstitutionMapping) { if (requirementList == null) { return null; } @@ -1239,9 +1164,8 @@ public class DataModelUtil { return requirementMapping; } - private static Map<String, List<String>> manageCapabilityMapping( - Map<String, CapabilityDefinition> capabilities, - Map<String, List<String>> capabilitySubstitutionMapping) { + private static Map<String, List<String>> manageCapabilityMapping(Map<String, CapabilityDefinition> capabilities, + Map<String, List<String>> capabilitySubstitutionMapping) { if (capabilities == null) { return null; } @@ -1257,14 +1181,18 @@ public class DataModelUtil { return capabilityMapping; } - - public static void addInterfaceOperation(ServiceTemplate serviceTemplate, - String interfaceId, - String operationId, - OperationDefinition operationDefinition) { + /** + * Add interface operation. + * + * @param serviceTemplate the service template + * @param interfaceId the interface id + * @param operationId the operation id + * @param operationDefinition the operation definition + */ + public static void addInterfaceOperation(ServiceTemplate serviceTemplate, String interfaceId, String operationId, + OperationDefinition operationDefinition) { Map<String, Object> interfaceTypes = serviceTemplate.getInterface_types(); - if (MapUtils.isEmpty(interfaceTypes) - || Objects.isNull(interfaceTypes.get(interfaceId))) { + if (MapUtils.isEmpty(interfaceTypes) || Objects.isNull(interfaceTypes.get(interfaceId))) { return; } @@ -1289,8 +1217,7 @@ public class DataModelUtil { interfaceValue -> convertedInterfaceTypes.put(interfaceEntry.getKey(), interfaceValue)); } catch (Exception e) { LOGGER.error("Cannot create interface object", e); - throw new CoreException( - new ToscaInvalidInterfaceValueErrorBuilder(e.getMessage()).build()); + throw new CoreException(new ToscaInvalidInterfaceValueErrorBuilder(e.getMessage()).build()); } } @@ -1298,35 +1225,23 @@ public class DataModelUtil { } public static <T extends InterfaceDefinition> Optional<T> convertObjToInterfaceDefinition(String interfaceId, - Object interfaceObj, - Class<T> interfaceClass) { + Object interfaceObj, + Class<T> interfaceClass) { try { - Optional<T> interfaceDefinition = - CommonUtil.createObjectUsingSetters(interfaceObj, interfaceClass); + Optional<T> interfaceDefinition = CommonUtil.createObjectUsingSetters(interfaceObj, interfaceClass); interfaceDefinition.ifPresent(interfaceDefinitionType1 -> updateInterfaceDefinitionOperations( - CommonUtil.getObjectAsMap(interfaceObj), - interfaceDefinitionType1, getOperationClass(interfaceClass))); + CommonUtil.getObjectAsMap(interfaceObj), interfaceDefinitionType1)); return interfaceDefinition; } catch (Exception ex) { - LOGGER.error("Could not create {} from {}", InterfaceDefinitionType.class.getName(), - interfaceId, ex); - throw new CoreException( - new CreateInterfaceObjectErrorBuilder(InterfaceDefinitionType.class.getName(), - interfaceId, - ex.getMessage()).build()); + LOGGER.error("Could not create {} from {}", InterfaceDefinitionType.class.getName(), interfaceId, ex); + throw new CoreException(new CreateInterfaceObjectErrorBuilder(InterfaceDefinitionType.class.getName(), + interfaceId, ex.getMessage()).build()); } } - private static <T extends OperationDefinition, V extends InterfaceDefinition> Class<T> getOperationClass( - Class<V> interfaceClass) { - return interfaceClass.equals(InterfaceDefinitionType.class) - ? (Class<T>) OperationDefinitionType.class - : (Class<T>) OperationDefinitionTemplate.class; - } - public static Optional<InterfaceType> convertObjToInterfaceType(String interfaceId, - Object interfaceObj) { + public static Optional<InterfaceType> convertObjToInterfaceType(String interfaceId, Object interfaceObj) { try { Optional<InterfaceType> interfaceType = CommonUtil.createObjectUsingSetters(interfaceObj, InterfaceType.class); @@ -1336,9 +1251,8 @@ public class DataModelUtil { return interfaceType; } catch (Exception ex) { LOGGER.error("Could not create {} from {}", InterfaceType.class.getName(), interfaceId, ex); - throw new CoreException( - new CreateInterfaceObjectErrorBuilder(InterfaceType.class.getName(), interfaceId, - ex.getMessage()).build()); + throw new CoreException(new CreateInterfaceObjectErrorBuilder(InterfaceType.class.getName(), interfaceId, + ex.getMessage()).build()); } } @@ -1346,6 +1260,10 @@ public class DataModelUtil { return converInterfaceToToscaInterfaceObj(interfaceType); } + public static Optional<Object> convertInterfaceDefinitionTypeToObj(InterfaceDefinitionType interfaceDefinitionType) { + return converInterfaceToToscaInterfaceObj(interfaceDefinitionType); + } + private static Optional<Object> converInterfaceToToscaInterfaceObj(Object interfaceEntity) { if (Objects.isNull(interfaceEntity)) { return Optional.empty(); @@ -1363,75 +1281,53 @@ public class DataModelUtil { return Optional.of(objectMapper.convertValue(interfaceAsMap, Object.class)); } - private static void updateInterfaceTypeOperations(Map<String, Object> interfaceAsMap, - InterfaceType interfaceType) { + private static void updateInterfaceTypeOperations(Map<String, Object> interfaceAsMap, InterfaceType interfaceType) { Set<String> fieldNames = CommonUtil.getClassFieldNames(InterfaceType.class); for (Map.Entry<String, Object> entry : interfaceAsMap.entrySet()) { Optional<? extends OperationDefinition> operationDefinition = - createOperation(entry.getKey(), entry.getValue(), fieldNames, - OperationDefinitionType.class); - operationDefinition - .ifPresent(operation -> interfaceType.addOperation(entry.getKey(), operation)); + createOperation(entry.getKey(), entry.getValue(), fieldNames, OperationDefinitionType.class); + operationDefinition.ifPresent(operation -> interfaceType.addOperation(entry.getKey(), operation)); } } private static Optional<? extends OperationDefinition> createOperation(String propertyName, - Object operationCandidate, - Set<String> fieldNames, - Class<? extends OperationDefinition> - operationClass) { + Object operationCandidate, + Set<String> fieldNames, + Class<? extends OperationDefinition> operationClass) { if (!fieldNames.contains(propertyName)) { try { return CommonUtil.createObjectUsingSetters(operationCandidate, operationClass); } catch (Exception ex) { LOGGER.error("Could not create Operation from {}", propertyName, ex); - throw new CoreException( - new CreateInterfaceOperationObjectErrorBuilder(propertyName, ex.getMessage()).build()); + throw new CoreException(new CreateInterfaceOperationObjectErrorBuilder(propertyName, ex.getMessage()) + .build()); } } return Optional.empty(); } - private static <T extends OperationDefinition> void updateInterfaceDefinitionOperations(Map<String, Object> - interfaceAsMap, - InterfaceDefinition - interfaceDefinition, - Class<T> operationClass) { - Set<String> fieldNames = CommonUtil.getClassFieldNames(interfaceDefinition.getClass()); - Optional<? extends OperationDefinition> operationDefinition; + private static <T extends OperationDefinition> void updateInterfaceDefinitionOperations(Map<String, Object> interfaceAsMap, + InterfaceDefinition interfaceDefinition) { + { + Set<String> fieldNames = CommonUtil.getClassFieldNames(InterfaceDefinitionType.class); + Optional<? extends OperationDefinition> operationDefinition; - for (Map.Entry<String, Object> entry : interfaceAsMap.entrySet()) { - operationDefinition = - createOperation(entry.getKey(), entry.getValue(), fieldNames, operationClass); - operationDefinition.ifPresent(operation -> addOperationToInterface(interfaceDefinition, - entry.getKey(), operation)); + for (Map.Entry<String, Object> entry : interfaceAsMap.entrySet()) { + operationDefinition = createOperation(entry.getKey(), entry.getValue(), fieldNames, + interfaceDefinition instanceof InterfaceDefinitionType ? OperationDefinitionType.class : + OperationDefinitionTemplate.class); + operationDefinition.ifPresent(operation -> interfaceDefinition.addOperation(entry.getKey(), operation)); + } } } - private static void addOperationToInterface(InterfaceDefinition interfaceDefinition, - String operationName, - OperationDefinition operationDefinition) { - if (interfaceDefinition instanceof InterfaceDefinitionType) { - InterfaceDefinitionType interfaceDefinitionType = - (InterfaceDefinitionType) interfaceDefinition; - interfaceDefinitionType.addOperation(operationName, (OperationDefinitionType) - operationDefinition); - } - if (interfaceDefinition instanceof InterfaceDefinitionTemplate) { - InterfaceDefinitionTemplate interfaceDefinitionTemplate = - (InterfaceDefinitionTemplate) interfaceDefinition; - interfaceDefinitionTemplate.addOperation(operationName, (OperationDefinitionTemplate) - operationDefinition); - } - } public static void addSubstitutionNodeTypeRequirements(NodeType substitutionNodeType, - List<Map<String, RequirementDefinition>> - requirementsList, - String templateName) { + List<Map<String, RequirementDefinition>> requirementsList, + String templateName) { if (CollectionUtils.isEmpty(requirementsList)) { return; } @@ -1448,9 +1344,27 @@ public class DataModelUtil { } } - public static boolean isNodeTemplateSectionMissingFromServiceTemplate( - ServiceTemplate serviceTemplate) { - return Objects.isNull(serviceTemplate.getTopology_template()) - || MapUtils.isEmpty(serviceTemplate.getTopology_template().getNode_templates()); + public static boolean isNodeTemplateSectionMissingFromServiceTemplate(ServiceTemplate serviceTemplate) { + return Objects.isNull(serviceTemplate.getTopology_template()) || MapUtils.isEmpty( + serviceTemplate.getTopology_template().getNode_templates()); + } + + /** + * Gets relationship template in a service template according to the relationship id. + * + * @param serviceTemplate the service template + * @param relationshipId the relationship id + * @return the relationship template + */ + public static Optional<RelationshipTemplate> getRelationshipTemplate(ServiceTemplate serviceTemplate, + String relationshipId) { + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getRelationship_templates() == null + || serviceTemplate.getTopology_template().getRelationship_templates().get(relationshipId) == null) { + return Optional.empty(); + } + return Optional.of(serviceTemplate.getTopology_template().getRelationship_templates().get(relationshipId)); } + + } diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaAnalyzerService.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaAnalyzerService.java index e4d75c1296..34f5a905fd 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaAnalyzerService.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaAnalyzerService.java @@ -17,7 +17,7 @@ package org.openecomp.sdc.tosca.services; import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes; -import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.ToscaFlatData; import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition; import org.onap.sdc.tosca.datatypes.model.DefinitionOfDataType; import org.onap.sdc.tosca.datatypes.model.InterfaceDefinitionType; @@ -33,67 +33,62 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public interface ToscaAnalyzerService { +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; - /* - node template with type equal to node type or derived from node type - */ - Map<String, NodeTemplate> getNodeTemplatesByType(ServiceTemplate serviceTemplate, String nodeType, - ToscaServiceModel toscaServiceModel); +public interface ToscaAnalyzerService { - Optional<NodeType> fetchNodeType(String nodeTypeKey, Collection<ServiceTemplate> serviceTemplates); + /* + node template with type equal to node type or derived from node type + */ + Map<String, NodeTemplate> getNodeTemplatesByType(ServiceTemplate serviceTemplate, String nodeType, + ToscaServiceModel toscaServiceModel); - boolean isTypeOf(NodeTemplate nodeTemplate, String nodeType, ServiceTemplate serviceTemplate, - ToscaServiceModel toscaServiceModel); + Optional<NodeType> fetchNodeType(String nodeTypeKey, Collection<ServiceTemplate> serviceTemplates); - List<RequirementAssignment> getRequirements(NodeTemplate nodeTemplate, String requirementId); + boolean isTypeOf(NodeTemplate nodeTemplate, String nodeType, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel); - Optional<NodeTemplate> getNodeTemplateById(ServiceTemplate serviceTemplate, - String nodeTemplateId); + boolean isTypeOf(InterfaceDefinitionType interfaceDefinition, String interfaceType, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel); - Optional<String> getSubstituteServiceTemplateName(String substituteNodeTemplateId, - NodeTemplate substitutableNodeTemplate); + boolean isTypeOf(DefinitionOfDataType parameterDefinition, String dataType, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel); - Map<String, NodeTemplate> getSubstitutableNodeTemplates(ServiceTemplate serviceTemplate); + List<RequirementAssignment> getRequirements(NodeTemplate nodeTemplate, String requirementId); - Optional<Map.Entry<String, NodeTemplate>> getSubstitutionMappedNodeTemplateByExposedReq( - String substituteServiceTemplateFileName, ServiceTemplate substituteServiceTemplate, - String requirementId); + Optional<NodeTemplate> getNodeTemplateById(ServiceTemplate serviceTemplate, String nodeTemplateId); - /* - match only for the input which is not null - */ - boolean isDesiredRequirementAssignment(RequirementAssignment requirementAssignment, - String capability, String node, String relationship); + Optional<String> getSubstituteServiceTemplateName(String substituteNodeTemplateId, + NodeTemplate substitutableNodeTemplate); - Object getFlatEntity(ToscaElementTypes elementType, String type, ServiceTemplate serviceTemplate, - ToscaServiceModel toscaModel); + Map<String, NodeTemplate> getSubstitutableNodeTemplates(ServiceTemplate serviceTemplate); - boolean isSubstitutableNodeTemplate(NodeTemplate nodeTemplate); + Optional<Map.Entry<String, NodeTemplate>> getSubstitutionMappedNodeTemplateByExposedReq(String substituteServiceTemplateFileName, + ServiceTemplate substituteServiceTemplate, + String requirementId); - NodeType createInitSubstitutionNodeType(ServiceTemplate substitutionServiceTemplate, - String nodeTypeDerivedFromValue); + /* + match only for the input which is not null + */ + boolean isDesiredRequirementAssignment(RequirementAssignment requirementAssignment, String capability, String node, + String relationship); - boolean isRequirementExistInNodeTemplate(NodeTemplate nodeTemplate, - String requirementId, - RequirementAssignment requirementAssignment); + ToscaFlatData getFlatEntity(ToscaElementTypes elementType, String type, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaModel); - Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties( - ServiceTemplate substitutionServiceTemplate); + boolean isSubstitutableNodeTemplate(NodeTemplate nodeTemplate); - Map<String, CapabilityDefinition> calculateExposedCapabilities( - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinitionMap); + NodeType createInitSubstitutionNodeType(ServiceTemplate substitutionServiceTemplate, + String nodeTypeDerivedFromValue); - List<Map<String, RequirementDefinition>> calculateExposedRequirements( - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment); + boolean isRequirementExistInNodeTemplate(NodeTemplate nodeTemplate, String requirementId, + RequirementAssignment requirementAssignment); - boolean isTypeOf(InterfaceDefinitionType interfaceDefinition, String interfaceType, - ServiceTemplate - serviceTemplate, ToscaServiceModel toscaServiceModel); + Map<String, PropertyDefinition> manageSubstitutionNodeTypeProperties(ServiceTemplate substitutionServiceTemplate); - boolean isTypeOf(DefinitionOfDataType parameterDefinition, String dataType, ServiceTemplate - serviceTemplate, ToscaServiceModel toscaServiceModel); + Map<String, CapabilityDefinition> calculateExposedCapabilities(Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinitionMap); + List<Map<String, RequirementDefinition>> calculateExposedRequirements(List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment); } diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java index 4ce2535401..d81983057d 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaConstants.java @@ -36,6 +36,9 @@ public class ToscaConstants { //General public static final String TOSCA_DEFINITIONS_VERSION = "tosca_simple_yaml_1_0_0"; public static final String MODELABLE_ENTITY_NAME_SELF = "SELF"; + public static final String MODELABLE_ENTITY_NAME_HOST = "HOST"; + public static final String MODELABLE_ENTITY_NAME_SOURCE = "SOURCE"; + public static final String MODELABLE_ENTITY_NAME_TARGET = "TARGET"; public static final String NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE = "substitutable"; public static final String UNBOUNDED = "UNBOUNDED"; public static final String ST_METADATA_TEMPLATE_NAME = "template_name"; 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 46d9b902ca..46e58bdc81 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 @@ -22,7 +22,7 @@ import org.apache.commons.lang3.StringUtils; import org.openecomp.core.utilities.CommonMethods; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes; -import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.datatypes.ToscaFlatData; import org.onap.sdc.tosca.datatypes.model.AttributeDefinition; import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition; import org.onap.sdc.tosca.datatypes.model.CapabilityType; @@ -38,18 +38,18 @@ import org.onap.sdc.tosca.datatypes.model.PropertyType; import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.errors.CreateInterfaceObjectErrorBuilder; import org.openecomp.sdc.tosca.errors.ToscaElementTypeNotFoundErrorBuilder; import org.openecomp.sdc.tosca.errors.ToscaFileNotFoundErrorBuilder; 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.services.DataModelUtil; +import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil; import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil; -import org.openecomp.sdc.tosca.services.ToscaUtil; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -60,877 +60,911 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.lang.reflect.InvocationTargetException; + +import org.openecomp.sdc.tosca.services.ToscaUtil; public class ToscaAnalyzerServiceImpl implements ToscaAnalyzerService { - private final String GET_NODE_TYPE_METHOD_NAME = "getNode_types"; - private final String GET_DERIVED_FROM_METHOD_NAME = "getDerived_from"; - private final String GET_TYPE_METHOD_NAME = "getType"; - private final String GET_DATA_TYPE_METHOD_NAME = "getData_types"; - private final String GET_INTERFACE_TYPE_METHOD_NAME = "getInterface_types"; - private final String TOSCA_DOT = "tosca."; - private final String DOT_ROOT = ".Root"; - - @Override - public List<Map<String, RequirementDefinition>> calculateExposedRequirements( - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment) { - - if (nodeTypeRequirementsDefinitionList == null) { - return Collections.emptyList(); - } - for (Map.Entry<String, RequirementAssignment> entry : nodeTemplateRequirementsAssignment - .entrySet()) { - if (entry.getValue().getNode() != null) { - Optional<RequirementDefinition> requirementDefinition = - DataModelUtil.getRequirementDefinition(nodeTypeRequirementsDefinitionList, entry - .getKey()); - RequirementDefinition cloneRequirementDefinition; - if (requirementDefinition.isPresent()) { - cloneRequirementDefinition = requirementDefinition.get().clone(); - updateRequirementDefinition(nodeTypeRequirementsDefinitionList, entry, - cloneRequirementDefinition); - } - } else { - for (Map<String, RequirementDefinition> nodeTypeRequirementsMap : - nodeTypeRequirementsDefinitionList) { - updateMinMaxOccurencesForNodeTypeRequirement(entry, nodeTypeRequirementsMap); - } - } - } - return nodeTypeRequirementsDefinitionList; - } - - private void updateMinMaxOccurencesForNodeTypeRequirement( - Map.Entry<String, RequirementAssignment> entry, - Map<String, RequirementDefinition> nodeTypeRequirementsMap) { - Object max = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null - && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 - ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[1] : 1; - Object min = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null - && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 - ? nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[0] : 1; - nodeTypeRequirementsMap.get(entry.getKey()).setOccurrences(new Object[]{min, max}); - } - - private void updateRequirementDefinition( - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, - Map.Entry<String, RequirementAssignment> entry, - RequirementDefinition cloneRequirementDefinition) { - if (!evaluateRequirementFulfillment(cloneRequirementDefinition)) { - CommonMethods.mergeEntryInList(entry.getKey(), cloneRequirementDefinition, - nodeTypeRequirementsDefinitionList); - } else { - DataModelUtil.removeRequirementsDefinition(nodeTypeRequirementsDefinitionList, entry - .getKey()); - } - } - - private static boolean evaluateRequirementFulfillment(RequirementDefinition - requirementDefinition) { - Object[] occurrences = requirementDefinition.getOccurrences(); - if (occurrences == null) { - requirementDefinition.setOccurrences(new Object[]{1, 1}); - return false; - } - if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { - return false; - } - - if (occurrences[1].equals(1)) { - return true; - } - occurrences[1] = (Integer) occurrences[1] - 1; - return false; - } - - @Override - public Map<String, CapabilityDefinition> calculateExposedCapabilities( - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinitionMap) { - - String capabilityKey; - String capability; - String node; - for (Map.Entry<String, Map<String, RequirementAssignment>> entry : - fullFilledRequirementsDefinitionMap.entrySet()) { - for (Map.Entry<String, RequirementAssignment> fullFilledEntry : entry.getValue().entrySet()) { - - capability = fullFilledEntry.getValue().getCapability(); - node = fullFilledEntry.getValue().getNode(); - capabilityKey = capability + "_" + node; - CapabilityDefinition capabilityDefinition = nodeTypeCapabilitiesDefinition.get( - capabilityKey); - if (capabilityDefinition != null) { - CapabilityDefinition clonedCapabilityDefinition = capabilityDefinition.clone(); - nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityDefinition.clone()); - updateNodeTypeCapabilitiesDefinition(nodeTypeCapabilitiesDefinition, capabilityKey, - clonedCapabilityDefinition); - } - } - } - - Map<String, CapabilityDefinition> exposedCapabilitiesDefinition = new HashMap<>(); - for (Map.Entry<String, CapabilityDefinition> entry : nodeTypeCapabilitiesDefinition - .entrySet()) { - exposedCapabilitiesDefinition.put(entry.getKey(), entry.getValue()); - } - return exposedCapabilitiesDefinition; - } - - private void updateNodeTypeCapabilitiesDefinition( - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, String capabilityKey, - CapabilityDefinition clonedCapabilityDefinition) { - if (evaluateCapabilityFulfillment(clonedCapabilityDefinition)) { - nodeTypeCapabilitiesDefinition.remove(capabilityKey); - } else { - nodeTypeCapabilitiesDefinition.put(capabilityKey, clonedCapabilityDefinition); - } - } - - private static boolean evaluateCapabilityFulfillment(CapabilityDefinition capabilityDefinition) { - - Object[] occurrences = capabilityDefinition.getOccurrences(); - if (occurrences == null) { - capabilityDefinition.setOccurrences(new Object[]{1, ToscaConstants.UNBOUNDED}); - return false; - } - if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { - return false; - } - - if (occurrences[1].equals(1)) { - return true; - } - occurrences[1] = (Integer) occurrences[1] - 1; - return false; - } - - /* - node template with type equal to node type or derived from node type + + private final String GET_NODE_TYPE_METHOD_NAME = "getNode_types"; + private final String GET_DERIVED_FROM_METHOD_NAME = "getDerived_from"; + private final String GET_TYPE_METHOD_NAME = "getType"; + private final String GET_DATA_TYPE_METHOD_NAME = "getData_types"; + private final String GET_INTERFACE_TYPE_METHOD_NAME = "getInterface_types"; + private final String TOSCA_DOT = "tosca."; + private final String DOT_ROOT = ".Root"; + + @Override + public List<Map<String, RequirementDefinition>> calculateExposedRequirements(List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment) { + + if (nodeTypeRequirementsDefinitionList == null) { + return Collections.emptyList(); + } + for (Map.Entry<String, RequirementAssignment> entry : nodeTemplateRequirementsAssignment.entrySet()) { + if (entry.getValue().getNode() != null) { + Optional<RequirementDefinition> requirementDefinition = + DataModelUtil.getRequirementDefinition(nodeTypeRequirementsDefinitionList, entry.getKey()); + RequirementDefinition cloneRequirementDefinition; + if (requirementDefinition.isPresent()) { + cloneRequirementDefinition = requirementDefinition.get().clone(); + updateRequirementDefinition(nodeTypeRequirementsDefinitionList, entry, cloneRequirementDefinition); + } + } else { + for (Map<String, RequirementDefinition> nodeTypeRequirementsMap : nodeTypeRequirementsDefinitionList) { + updateMinMaxOccurencesForNodeTypeRequirement(entry, nodeTypeRequirementsMap); + } + } + } + return nodeTypeRequirementsDefinitionList; + } + + private void updateMinMaxOccurencesForNodeTypeRequirement(Map.Entry<String, RequirementAssignment> entry, + Map<String, RequirementDefinition> nodeTypeRequirementsMap) { + Object max = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null + && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 ? + nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[1] : 1; + Object min = nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences() != null + && nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences().length > 0 ? + nodeTypeRequirementsMap.get(entry.getKey()).getOccurrences()[0] : 1; + nodeTypeRequirementsMap.get(entry.getKey()).setOccurrences(new Object[] {min, max}); + } + + private void updateRequirementDefinition(List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinitionList, + Map.Entry<String, RequirementAssignment> entry, + RequirementDefinition cloneRequirementDefinition) { + if (!evaluateRequirementFulfillment(cloneRequirementDefinition)) { + CommonMethods + .mergeEntryInList(entry.getKey(), cloneRequirementDefinition, nodeTypeRequirementsDefinitionList); + } else { + DataModelUtil.removeRequirementsDefinition(nodeTypeRequirementsDefinitionList, entry.getKey()); + } + } + + private static boolean evaluateRequirementFulfillment(RequirementDefinition requirementDefinition) { + Object[] occurrences = requirementDefinition.getOccurrences(); + if (occurrences == null) { + requirementDefinition.setOccurrences(new Object[] {1, 1}); + return false; + } + if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { + return false; + } + + if (occurrences[1].equals(1)) { + return true; + } + occurrences[1] = (Integer) occurrences[1] - 1; + return false; + } + + @Override + public Map<String, CapabilityDefinition> calculateExposedCapabilities(Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinitionMap) { + + String capabilityKey; + String capability; + String node; + for (Map.Entry<String, Map<String, RequirementAssignment>> entry : fullFilledRequirementsDefinitionMap + .entrySet()) { + for (Map.Entry<String, RequirementAssignment> fullFilledEntry : entry.getValue().entrySet()) { + + capability = fullFilledEntry.getValue().getCapability(); + node = fullFilledEntry.getValue().getNode(); + capabilityKey = capability + "_" + node; + CapabilityDefinition capabilityDefinition = nodeTypeCapabilitiesDefinition.get(capabilityKey); + if (capabilityDefinition != null) { + CapabilityDefinition clonedCapabilityDefinition = capabilityDefinition.clone(); + nodeTypeCapabilitiesDefinition.put(capabilityKey, capabilityDefinition.clone()); + updateNodeTypeCapabilitiesDefinition(nodeTypeCapabilitiesDefinition, capabilityKey, + clonedCapabilityDefinition); + } + } + } + + Map<String, CapabilityDefinition> exposedCapabilitiesDefinition = new HashMap<>(); + for (Map.Entry<String, CapabilityDefinition> entry : nodeTypeCapabilitiesDefinition.entrySet()) { + exposedCapabilitiesDefinition.put(entry.getKey(), entry.getValue()); + } + return exposedCapabilitiesDefinition; + } + + private void updateNodeTypeCapabilitiesDefinition(Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition, + String capabilityKey, + CapabilityDefinition clonedCapabilityDefinition) { + if (evaluateCapabilityFulfillment(clonedCapabilityDefinition)) { + nodeTypeCapabilitiesDefinition.remove(capabilityKey); + } else { + nodeTypeCapabilitiesDefinition.put(capabilityKey, clonedCapabilityDefinition); + } + } + + private static boolean evaluateCapabilityFulfillment(CapabilityDefinition capabilityDefinition) { + + Object[] occurrences = capabilityDefinition.getOccurrences(); + if (occurrences == null) { + capabilityDefinition.setOccurrences(new Object[] {1, ToscaConstants.UNBOUNDED}); + return false; + } + if (occurrences[1].equals(ToscaConstants.UNBOUNDED)) { + return false; + } + + if (occurrences[1].equals(1)) { + return true; + } + occurrences[1] = (Integer) occurrences[1] - 1; + return false; + } + + /* + node template with type equal to node type or derived from node type + */ + @Override + public Map<String, NodeTemplate> getNodeTemplatesByType(ServiceTemplate serviceTemplate, String nodeType, + ToscaServiceModel toscaServiceModel) { + Map<String, NodeTemplate> nodeTemplates = new HashMap<>(); + + if (Objects.nonNull(serviceTemplate.getTopology_template()) && MapUtils.isNotEmpty( + serviceTemplate.getTopology_template().getNode_templates())) { + for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : serviceTemplate.getTopology_template() + .getNode_templates().entrySet()) { + if (isTypeOf(nodeTemplateEntry.getValue(), nodeType, serviceTemplate, toscaServiceModel)) { + nodeTemplates.put(nodeTemplateEntry.getKey(), nodeTemplateEntry.getValue()); + } + + } + } + return nodeTemplates; + } + + @Override + public Optional<NodeType> fetchNodeType(String nodeTypeKey, Collection<ServiceTemplate> serviceTemplates) { + Optional<Map<String, NodeType>> nodeTypeMap = serviceTemplates.stream().map(ServiceTemplate::getNode_types) + .filter(nodeTypes -> Objects.nonNull(nodeTypes) + && nodeTypes + .containsKey( + nodeTypeKey)) + .findFirst(); + return nodeTypeMap.map(stringNodeTypeMap -> stringNodeTypeMap.get(nodeTypeKey)); + } + + @Override + public boolean isTypeOf(NodeTemplate nodeTemplate, String nodeType, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel) { + return isTypeOf(nodeTemplate, nodeType, GET_NODE_TYPE_METHOD_NAME, serviceTemplate, toscaServiceModel); + } + + @Override + public List<RequirementAssignment> getRequirements(NodeTemplate nodeTemplate, String requirementId) { + List<RequirementAssignment> requirements = new ArrayList<>(); + List<Map<String, RequirementAssignment>> requirementList = nodeTemplate.getRequirements(); + if (requirementList != null) { + requirementList.stream().filter(reqMap -> reqMap.get(requirementId) != null).forEach(reqMap -> { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + RequirementAssignment reqAssignment = toscaExtensionYamlUtil.yamlToObject( + toscaExtensionYamlUtil.objectToYaml(reqMap.get(requirementId)), RequirementAssignment.class); + requirements.add(reqAssignment); + }); + } + return requirements; + } + + @Override + public Optional<NodeTemplate> getNodeTemplateById(ServiceTemplate serviceTemplate, String nodeTemplateId) { + if ((serviceTemplate.getTopology_template() != null) && (serviceTemplate.getTopology_template() + .getNode_templates() != null) + && (serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId) != null)) { + return Optional.of(serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId)); + } + return Optional.empty(); + } + + @Override + public Optional<String> getSubstituteServiceTemplateName(String substituteNodeTemplateId, + NodeTemplate substitutableNodeTemplate) { + if (!isSubstitutableNodeTemplate(substitutableNodeTemplate)) { + return Optional.empty(); + } + + if (substitutableNodeTemplate.getProperties() != null && + substitutableNodeTemplate.getProperties().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); + handleNoSubstituteServiceTemplate(substituteNodeTemplateId, substituteServiceTemplate); + return Optional.of(substituteServiceTemplate.toString()); + } + } + throw new CoreException(new ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder(substituteNodeTemplateId) + .build()); + } + + private void handleNoSubstituteServiceTemplate(String substituteNodeTemplateId, Object substituteServiceTemplate) { + if (substituteServiceTemplate == null) { + throw new CoreException(new ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder(substituteNodeTemplateId) + .build()); + } + } + + @Override + public Map<String, NodeTemplate> getSubstitutableNodeTemplates(ServiceTemplate serviceTemplate) { + Map<String, NodeTemplate> substitutableNodeTemplates = new HashMap<>(); + + if (serviceTemplate == null || serviceTemplate.getTopology_template() == null + || serviceTemplate.getTopology_template().getNode_templates() == null) { + return substitutableNodeTemplates; + } + + Map<String, NodeTemplate> nodeTemplates = serviceTemplate.getTopology_template().getNode_templates(); + for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) { + String nodeTemplateId = entry.getKey(); + NodeTemplate nodeTemplate = entry.getValue(); + if (isSubstitutableNodeTemplate(nodeTemplate)) { + substitutableNodeTemplates.put(nodeTemplateId, nodeTemplate); + } + } + + return substitutableNodeTemplates; + } + + @Override + public Optional<Map.Entry<String, NodeTemplate>> getSubstitutionMappedNodeTemplateByExposedReq(String substituteServiceTemplateFileName, + ServiceTemplate substituteServiceTemplate, + String requirementId) { + if (isSubstitutionServiceTemplate(substituteServiceTemplateFileName, substituteServiceTemplate)) { + Map<String, List<String>> substitutionMappingRequirements = + substituteServiceTemplate.getTopology_template().getSubstitution_mappings().getRequirements(); + if (substitutionMappingRequirements != null) { + List<String> requirementMapping = substitutionMappingRequirements.get(requirementId); + if (requirementMapping != null && !requirementMapping.isEmpty()) { + String mappedNodeTemplateId = requirementMapping.get(0); + Optional<NodeTemplate> mappedNodeTemplate = + getNodeTemplateById(substituteServiceTemplate, mappedNodeTemplateId); + mappedNodeTemplate.orElseThrow( + () -> new CoreException(new ToscaInvalidEntryNotFoundErrorBuilder("Node Template", + mappedNodeTemplateId) + .build())); + Map.Entry<String, NodeTemplate> mappedNodeTemplateEntry = new Map.Entry<String, NodeTemplate>() { + @Override + public String getKey() { + return mappedNodeTemplateId; + } + + @Override + public NodeTemplate getValue() { + return mappedNodeTemplate.get(); + } + + @Override + public NodeTemplate setValue(NodeTemplate value) { + return null; + } + }; + return Optional.of(mappedNodeTemplateEntry); + } + } + } + return Optional.empty(); + } + + /* + match only for the input which is not null */ - @Override - public Map<String, NodeTemplate> getNodeTemplatesByType(ServiceTemplate serviceTemplate, - String nodeType, - ToscaServiceModel toscaServiceModel) { - Map<String, NodeTemplate> nodeTemplates = new HashMap<>(); - - if (Objects.nonNull(serviceTemplate.getTopology_template()) - && MapUtils.isNotEmpty(serviceTemplate.getTopology_template().getNode_templates())) { - for (Map.Entry<String, NodeTemplate> nodeTemplateEntry : serviceTemplate - .getTopology_template().getNode_templates().entrySet()) { - if (isTypeOf(nodeTemplateEntry.getValue(), nodeType, serviceTemplate, toscaServiceModel)) { - nodeTemplates.put(nodeTemplateEntry.getKey(), nodeTemplateEntry.getValue()); - } - - } - } - return nodeTemplates; - } - - @Override - public Optional<NodeType> fetchNodeType(String nodeTypeKey, Collection<ServiceTemplate> - serviceTemplates) { - Optional<Map<String, NodeType>> nodeTypeMap = serviceTemplates.stream() - .map(ServiceTemplate::getNode_types) - .filter(nodeTypes -> Objects.nonNull(nodeTypes) && nodeTypes.containsKey(nodeTypeKey)) - .findFirst(); - return nodeTypeMap.map(stringNodeTypeMap -> stringNodeTypeMap.get(nodeTypeKey)); - } - - @Override - public boolean isTypeOf(NodeTemplate nodeTemplate, String nodeType, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel) { - return isTypeOf(nodeTemplate, nodeType, GET_NODE_TYPE_METHOD_NAME, serviceTemplate, - toscaServiceModel); - } - - @Override - public List<RequirementAssignment> getRequirements(NodeTemplate nodeTemplate, - String requirementId) { - List<RequirementAssignment> requirements = new ArrayList<>(); - List<Map<String, RequirementAssignment>> requirementList = nodeTemplate.getRequirements(); - if (requirementList != null) { - requirementList.stream().filter(reqMap -> reqMap.get(requirementId) != null) - .forEach(reqMap -> { + @Override + public boolean isDesiredRequirementAssignment(RequirementAssignment requirementAssignment, String capability, + String node, String relationship) { + if (isSameCapability(requirementAssignment, capability)) { + return false; + } + + if (isSameRequirement(requirementAssignment, node)) { + return false; + } + + if (isSameRelationship(requirementAssignment, relationship)) { + return false; + } + + return !(capability == null && node == null && relationship == null); + + } + + private boolean isSameRelationship(RequirementAssignment requirementAssignment, String relationship) { + return relationship != null && (requirementAssignment.getRelationship() == null || !requirementAssignment + .getRelationship() + .equals(relationship)); + } + + private boolean isSameRequirement(RequirementAssignment requirementAssignment, String node) { + return node != null && (requirementAssignment.getNode() == null || !requirementAssignment.getNode() + .equals(node)); + } + + private boolean isSameCapability(RequirementAssignment requirementAssignment, String capability) { + return capability != null && (requirementAssignment.getCapability() == null || !requirementAssignment + .getCapability() + .equals(capability)); + } + + @Override + public ToscaFlatData getFlatEntity(ToscaElementTypes elementType, String typeId, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaModel) { + ToscaFlatData flatData = new ToscaFlatData(); + flatData.setElementType(elementType); + + switch (elementType) { + case CAPABILITY_TYPE: + flatData.setFlatEntity(new CapabilityType()); + break; + case NODE_TYPE: + flatData.setFlatEntity(new NodeType()); + break; + case DATA_TYPE: + flatData.setFlatEntity(new DataType()); + break; + default: + throw new RuntimeException("Entity[" + elementType + "] id[" + typeId + "] flat not supported"); + } + + boolean isEntityFound = + scanAnFlatEntity(elementType, typeId, flatData, serviceTemplate, toscaModel, new ArrayList<>(), 0); + if (!isEntityFound) { + throw new CoreException(new ToscaElementTypeNotFoundErrorBuilder(typeId).build()); + } + + return flatData; + } + + @Override + public boolean isSubstitutableNodeTemplate(NodeTemplate nodeTemplate) { + return nodeTemplate.getDirectives() != null && nodeTemplate.getDirectives().contains( + ToscaConstants.NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); + } + + private <T> Optional<Boolean> isTypeExistInServiceTemplateHierarchy(String typeToMatch, String typeToSearch, + String getTypesMethodName, + ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel, + Set<String> analyzedImportFiles) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Map<String, T> searchableTypes = + (Map<String, T>) serviceTemplate.getClass().getMethod(getTypesMethodName).invoke(serviceTemplate); + + if (!MapUtils.isEmpty(searchableTypes)) { + T typeObject = searchableTypes.get(typeToSearch); + if (Objects.nonNull(typeObject)) { + String derivedFromTypeVal = + (String) typeObject.getClass().getMethod(GET_DERIVED_FROM_METHOD_NAME).invoke(typeObject); + if (Objects.equals(derivedFromTypeVal, typeToMatch)) { + return Optional.of(true); + } else if (Objects.isNull(derivedFromTypeVal) || isTypeIsToscaRoot(derivedFromTypeVal)) { + return Optional.of(false); + } else { + return isTypeExistInServiceTemplateHierarchy(typeToMatch, derivedFromTypeVal, getTypesMethodName, + serviceTemplate, toscaServiceModel, null); + } + } else { + return isTypeExistInImports(typeToMatch, typeToSearch, getTypesMethodName, serviceTemplate, + toscaServiceModel, analyzedImportFiles); + } + } + return isTypeExistInImports(typeToMatch, typeToSearch, getTypesMethodName, serviceTemplate, toscaServiceModel, + analyzedImportFiles); + } + + private Optional<Boolean> isTypeExistInImports(String typeToMatch, String typeToSearch, String getTypesMethodName, + ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel, Set<String> filesScanned) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + List<Map<String, Import>> imports = serviceTemplate.getImports(); + if (CollectionUtils.isEmpty(imports)) { + return Optional.empty(); + } + + Set<String> createdFilesScanned = createFilesScannedSet(filesScanned); + + for (Map<String, Import> map : imports) { ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - RequirementAssignment reqAssignment = toscaExtensionYamlUtil - .yamlToObject(toscaExtensionYamlUtil.objectToYaml(reqMap.get(requirementId)), - RequirementAssignment.class); - requirements.add(reqAssignment); - }); - } - return requirements; - } - - @Override - public Optional<NodeTemplate> getNodeTemplateById(ServiceTemplate serviceTemplate, - String nodeTemplateId) { - if ((serviceTemplate.getTopology_template() != null) - && (serviceTemplate.getTopology_template().getNode_templates() != null) - && (serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId) - != null)) { - return Optional - .of(serviceTemplate.getTopology_template().getNode_templates().get(nodeTemplateId)); - } - return Optional.empty(); - } - - @Override - public Optional<String> getSubstituteServiceTemplateName(String substituteNodeTemplateId, - NodeTemplate substitutableNodeTemplate) { - if (!isSubstitutableNodeTemplate(substitutableNodeTemplate)) { - return Optional.empty(); - } - - if (substitutableNodeTemplate.getProperties() != null - && substitutableNodeTemplate.getProperties() - .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); - handleNoSubstituteServiceTemplate(substituteNodeTemplateId, substituteServiceTemplate); - return Optional.of(substituteServiceTemplate.toString()); - } - } - throw new CoreException( - new ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder(substituteNodeTemplateId) - .build()); - } - - private void handleNoSubstituteServiceTemplate(String substituteNodeTemplateId, - Object substituteServiceTemplate) { - if (substituteServiceTemplate == null) { - throw new CoreException( - new ToscaInvalidSubstituteNodeTemplatePropertiesErrorBuilder(substituteNodeTemplateId) - .build()); - } - } - - @Override - public Map<String, NodeTemplate> getSubstitutableNodeTemplates(ServiceTemplate serviceTemplate) { - Map<String, NodeTemplate> substitutableNodeTemplates = new HashMap<>(); - - if (serviceTemplate == null - || serviceTemplate.getTopology_template() == null - || serviceTemplate.getTopology_template().getNode_templates() == null) { - return substitutableNodeTemplates; - } - - Map<String, NodeTemplate> nodeTemplates = - serviceTemplate.getTopology_template().getNode_templates(); - for (Map.Entry<String, NodeTemplate> entry : nodeTemplates.entrySet()) { - String nodeTemplateId = entry.getKey(); - NodeTemplate nodeTemplate = entry.getValue(); - if (isSubstitutableNodeTemplate(nodeTemplate)) { - substitutableNodeTemplates.put(nodeTemplateId, nodeTemplate); - } - } - - return substitutableNodeTemplates; - } - - @Override - public Optional<Map.Entry<String, NodeTemplate>> getSubstitutionMappedNodeTemplateByExposedReq( - String substituteServiceTemplateFileName, ServiceTemplate substituteServiceTemplate, - String requirementId) { - if (isSubstitutionServiceTemplate(substituteServiceTemplateFileName, - substituteServiceTemplate)) { - Map<String, List<String>> substitutionMappingRequirements = - substituteServiceTemplate.getTopology_template().getSubstitution_mappings() - .getRequirements(); - if (substitutionMappingRequirements != null) { - List<String> requirementMapping = substitutionMappingRequirements.get(requirementId); - if (requirementMapping != null && !requirementMapping.isEmpty()) { - String mappedNodeTemplateId = requirementMapping.get(0); - Optional<NodeTemplate> mappedNodeTemplate = - getNodeTemplateById(substituteServiceTemplate, mappedNodeTemplateId); - mappedNodeTemplate.orElseThrow(() -> new CoreException( - new ToscaInvalidEntryNotFoundErrorBuilder("Node Template", mappedNodeTemplateId) - .build())); - Map.Entry<String, NodeTemplate> mappedNodeTemplateEntry = - new Map.Entry<String, NodeTemplate>() { - @Override - public String getKey() { - return mappedNodeTemplateId; + Import anImport = toscaExtensionYamlUtil + .yamlToObject(toscaExtensionYamlUtil.objectToYaml(map.values().iterator().next()), + Import.class); + handleImportWithNoFileEntry(anImport); + String importFile = anImport.getFile(); + ServiceTemplate template = toscaServiceModel.getServiceTemplates().get(fetchFileNameForImport(importFile, + serviceTemplate.getMetadata() == null ? null : serviceTemplate.getMetadata().get("filename"))); + if (Objects.isNull(template) || createdFilesScanned + .contains(ToscaUtil.getServiceTemplateFileName(template))) { + continue; + } else { + createdFilesScanned.add(ToscaUtil.getServiceTemplateFileName(template)); + } + Optional<Boolean> typeExistInServiceTemplateHierarchy = + isTypeExistInServiceTemplateHierarchy(typeToMatch, typeToSearch, getTypesMethodName, template, + toscaServiceModel, createdFilesScanned); + if (typeExistInServiceTemplateHierarchy.isPresent() && (typeExistInServiceTemplateHierarchy.get())) { + createdFilesScanned.clear(); + return Optional.of(true); + } + + } + return Optional.of(false); + } + + private void handleImportWithNoFileEntry(Import anImport) { + if (Objects.isNull(anImport) || Objects.isNull(anImport.getFile())) { + throw new RuntimeException("import without file entry"); + } + } + + private Set<String> createFilesScannedSet(Set<String> filesScanned) { + Set<String> retFileScanned = filesScanned; + if (Objects.isNull(retFileScanned)) { + retFileScanned = new HashSet<>(); + } + return retFileScanned; + } + + private boolean isTypeIsToscaRoot(String type) { + return (type.contains(TOSCA_DOT) && type.contains(DOT_ROOT)); + } + + 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, ToscaFlatData flatData, + ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, + List<String> filesScanned, int rootScanStartInx) { + + + boolean entityFound = + enrichEntityFromCurrentServiceTemplate(elementType, typeId, flatData, serviceTemplate, toscaModel, + filesScanned, rootScanStartInx); + if (!entityFound) { + List<Map<String, Import>> imports = serviceTemplate.getImports(); + if (CollectionUtils.isEmpty(imports)) { + return false; + } + boolean found = false; + for (Map<String, Import> importMap : imports) { + if (found) { + return true; } + found = isFlatEntity(importMap, flatData, serviceTemplate, filesScanned, toscaModel, elementType, + typeId); + } + return found; + } + return true; + } - @Override - public NodeTemplate getValue() { - return mappedNodeTemplate.get(); + private boolean isFlatEntity(Map<String, Import> importMap, ToscaFlatData flatData, ServiceTemplate serviceTemplate, + List<String> filesScanned, ToscaServiceModel toscaModel, + ToscaElementTypes elementType, String typeId) { + boolean found = false; + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + for (Object importObject : importMap.values()) { + Import importServiceTemplate = toscaExtensionYamlUtil + .yamlToObject(toscaExtensionYamlUtil.objectToYaml(importObject), + Import.class); + String 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); + if (Objects.isNull(template)) { + throw new CoreException(new ToscaFileNotFoundErrorBuilder(fileName).build()); + } + found = scanAnFlatEntity(elementType, typeId, flatData, template, toscaModel, filesScanned, + filesScanned.size()); + } + return found; + } + + private String fetchFileNameForImport(String importServiceTemplateFile, String currentMetadatafileName) { + if (importServiceTemplateFile.contains("../")) { + return importServiceTemplateFile.replace("../", ""); + } else if (currentMetadatafileName != null && currentMetadatafileName.indexOf('/') != -1) { + return currentMetadatafileName.substring(0, currentMetadatafileName.indexOf('/')) + "/" + + importServiceTemplateFile; + } else { + return importServiceTemplateFile; + } + + } + + private boolean enrichEntityFromCurrentServiceTemplate(ToscaElementTypes elementType, String typeId, + ToscaFlatData flatData, + ServiceTemplate serviceTemplate, + ToscaServiceModel toscaModel, + List<String> filesScanned, int rootScanStartInx) { + switch (elementType) { + case CAPABILITY_TYPE: + if (enrichCapabilityType(elementType, typeId, flatData, serviceTemplate, toscaModel, filesScanned, + rootScanStartInx)) { + return false; + } + break; + case NODE_TYPE: + if (enrichNodeTypeInfo(elementType, typeId, flatData, serviceTemplate, toscaModel, filesScanned, + rootScanStartInx)) { + return false; + } + break; + case DATA_TYPE: + if (enrichDataTypeInfo(elementType, typeId, flatData, serviceTemplate, toscaModel, filesScanned, + rootScanStartInx)) { + return false; } + break; + default: + throw new RuntimeException("Entity[" + elementType + "] id[" + typeId + "] flat not supported"); + } + + return true; + + + } + + private boolean enrichNodeTypeInfo(ToscaElementTypes elementType, String typeId, ToscaFlatData flatData, + ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, + List<String> filesScanned, int rootScanStartInx) { + String derivedFrom; + if (serviceTemplate.getNode_types() != null && serviceTemplate.getNode_types().containsKey(typeId)) { - @Override - public NodeTemplate setValue(NodeTemplate value) { - return null; + filesScanned.clear(); + flatData.addInheritanceHierarchyType(typeId); + NodeType targetNodeType = (NodeType) flatData.getFlatEntity(); + NodeType sourceNodeType = serviceTemplate.getNode_types().get(typeId); + derivedFrom = sourceNodeType.getDerived_from(); + if (derivedFrom != null) { + boolean isEntityFound = + scanAnFlatEntity(elementType, derivedFrom, flatData, serviceTemplate, toscaModel, filesScanned, + rootScanStartInx); + if (!isEntityFound) { + throw new CoreException(new ToscaElementTypeNotFoundErrorBuilder(typeId).build()); } - }; - return Optional.of(mappedNodeTemplateEntry); + } + combineNodeTypeInfo(sourceNodeType, targetNodeType); + } else { + return true; } - } + return false; } - return Optional.empty(); - } - /* - match only for the input which is not null - */ - @Override - public boolean isDesiredRequirementAssignment(RequirementAssignment requirementAssignment, - String capability, String node, - String relationship) { - if (isSameCapability(requirementAssignment, capability)) { - return false; - } - - if (isSameRequirement(requirementAssignment, node)) { - return false; - } - - if (isSameRelationship(requirementAssignment, relationship)) { - return false; - } - - return !(capability == null && node == null && relationship == null); - - } - - private boolean isSameRelationship(RequirementAssignment requirementAssignment, - String relationship) { - return relationship != null && (requirementAssignment.getRelationship() == null - || !requirementAssignment.getRelationship().equals(relationship)); - } - - private boolean isSameRequirement(RequirementAssignment requirementAssignment, String node) { - return node != null && (requirementAssignment.getNode() == null - || !requirementAssignment.getNode().equals(node)); - } - - private boolean isSameCapability(RequirementAssignment requirementAssignment, String capability) { - return capability != null && (requirementAssignment.getCapability() == null - || !requirementAssignment.getCapability().equals(capability)); - } - - @Override - public Object getFlatEntity(ToscaElementTypes elementType, String typeId, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel) { - Object returnEntity; - - switch (elementType) { - case CAPABILITY_TYPE: - returnEntity = new CapabilityType(); - break; - case NODE_TYPE: - returnEntity = new NodeType(); - break; - case DATA_TYPE: - returnEntity = new DataType(); - break; - default: - throw new RuntimeException( - "Entity[" + elementType + "] id[" + typeId + "] flat not supported"); - } - - boolean isEntityFound = - scanAnFlatEntity(elementType, typeId, returnEntity, serviceTemplate, toscaModel, - new ArrayList<>(), 0); - if (!isEntityFound) { - throw new CoreException(new ToscaElementTypeNotFoundErrorBuilder(typeId).build()); - } - - return returnEntity; - } - - @Override - public boolean isSubstitutableNodeTemplate(NodeTemplate nodeTemplate) { - return nodeTemplate.getDirectives() != null - && nodeTemplate.getDirectives().contains(ToscaConstants - .NODE_TEMPLATE_DIRECTIVE_SUBSTITUTABLE); - } - - private <T> Optional<Boolean> isTypeExistInServiceTemplateHierarchy(String typeToMatch, - String typeToSearch, - String getTypesMethodName, - ServiceTemplate serviceTemplate, - ToscaServiceModel toscaServiceModel, - Set<String> analyzedImportFiles) - throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - Map<String, T> searchableTypes = - (Map<String, T>) serviceTemplate.getClass().getMethod(getTypesMethodName) - .invoke(serviceTemplate); - - if (!MapUtils.isEmpty(searchableTypes)) { - T typeObject = searchableTypes.get(typeToSearch); - if (Objects.nonNull(typeObject)) { - String derivedFromTypeVal = - (String) typeObject.getClass().getMethod(GET_DERIVED_FROM_METHOD_NAME).invoke(typeObject); - if (Objects.equals(derivedFromTypeVal, typeToMatch)) { - return Optional.of(true); - } else if (Objects.isNull(derivedFromTypeVal) || isTypeIsToscaRoot(derivedFromTypeVal)) { - return Optional.of(false); + private boolean enrichDataTypeInfo(ToscaElementTypes elementType, String typeId, ToscaFlatData flatData, + ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, + List<String> filesScanned, int rootScanStartInx) { + String derivedFrom; + if (serviceTemplate.getData_types() != null && serviceTemplate.getData_types().containsKey(typeId)) { + + filesScanned.clear(); + flatData.addInheritanceHierarchyType(typeId); + DataType targetDataType = (DataType) flatData.getFlatEntity(); + DataType sourceDataType = serviceTemplate.getData_types().get(typeId); + derivedFrom = sourceDataType.getDerived_from(); + if (derivedFrom != null) { + boolean isEntityFound = + scanAnFlatEntity(elementType, derivedFrom, flatData, serviceTemplate, toscaModel, filesScanned, + rootScanStartInx); + if (!isEntityFound) { + throw new CoreException(new ToscaElementTypeNotFoundErrorBuilder(typeId).build()); + } + } + combineDataTypeInfo(sourceDataType, targetDataType); } else { - return isTypeExistInServiceTemplateHierarchy(typeToMatch, - derivedFromTypeVal, getTypesMethodName, serviceTemplate, toscaServiceModel, null); - } - } else { - return isTypeExistInImports(typeToMatch, typeToSearch, getTypesMethodName, - serviceTemplate, toscaServiceModel, analyzedImportFiles); - } - } - return isTypeExistInImports(typeToMatch, typeToSearch, getTypesMethodName, serviceTemplate, - toscaServiceModel, analyzedImportFiles); - } - - private Optional<Boolean> isTypeExistInImports(String typeToMatch, - String typeToSearch, - String getTypesMethodName, - ServiceTemplate serviceTemplate, - ToscaServiceModel toscaServiceModel, - Set<String> filesScanned) - throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { - List<Map<String, Import>> imports = serviceTemplate.getImports(); - if (CollectionUtils.isEmpty(imports)) { - return Optional.empty(); - } - - Set<String> createdFilesScanned = createFilesScannedSet(filesScanned); - - for (Map<String, Import> map : imports) { - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - Import anImport = toscaExtensionYamlUtil - .yamlToObject(toscaExtensionYamlUtil.objectToYaml(map.values().iterator().next()), - Import.class); - handleImportWithNoFileEntry(anImport); - String importFile = anImport.getFile(); - ServiceTemplate template = - toscaServiceModel.getServiceTemplates().get(fetchFileNameForImport(importFile, - serviceTemplate.getMetadata() == null ? null - : serviceTemplate.getMetadata().get("filename"))); - if (Objects.isNull(template) - || createdFilesScanned.contains(ToscaUtil.getServiceTemplateFileName(template))) { - continue; - } else { - createdFilesScanned.add(ToscaUtil.getServiceTemplateFileName(template)); - } - Optional<Boolean> typeExistInServiceTemplateHierarchy = - isTypeExistInServiceTemplateHierarchy(typeToMatch, typeToSearch, getTypesMethodName, - template, toscaServiceModel, createdFilesScanned); - if (typeExistInServiceTemplateHierarchy.isPresent() - && (typeExistInServiceTemplateHierarchy.get())) { - createdFilesScanned.clear(); - return Optional.of(true); - } - - } - return Optional.of(false); - } - - private void handleImportWithNoFileEntry(Import anImport) { - if (Objects.isNull(anImport) || Objects.isNull(anImport.getFile())) { - throw new RuntimeException("import without file entry"); - } - } - - private Set<String> createFilesScannedSet(Set<String> filesScanned) { - Set<String> retFileScanned = filesScanned; - if (Objects.isNull(retFileScanned)) { - retFileScanned = new HashSet<>(); - } - return retFileScanned; - } - - private boolean isTypeIsToscaRoot(String type) { - return (type.contains(TOSCA_DOT) && type.contains(DOT_ROOT)); - } - - 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, filesScanned, rootScanStartInx); - if (!entityFound) { - List<Map<String, Import>> imports = serviceTemplate.getImports(); - if (CollectionUtils.isEmpty(imports)) { + return true; + } return false; - } - boolean found = false; - for (Map<String, Import> importMap : imports) { - if (found) { - return true; - } - found = isFlatEntity(importMap, entity, serviceTemplate, filesScanned, - toscaModel, elementType, typeId); - } - return found; - } - return true; - } - - private boolean isFlatEntity(Map<String, Import> importMap, - Object entity, - ServiceTemplate serviceTemplate, - List<String> filesScanned, - ToscaServiceModel toscaModel, - ToscaElementTypes elementType, String typeId) { - boolean found = false; - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - for (Object importObject : importMap.values()) { - Import importServiceTemplate = toscaExtensionYamlUtil - .yamlToObject(toscaExtensionYamlUtil.objectToYaml(importObject), Import.class); - String fileName = fetchFileNameForImport(importServiceTemplate.getFile(), - serviceTemplate.getMetadata() == null ? null : serviceTemplate.getMetadata().get( - "filename")); - if (filesScanned.contains(fileName)) { + } + + private boolean enrichCapabilityType(ToscaElementTypes elementType, String typeId, ToscaFlatData flatData, + ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, + List<String> filesScanned, int rootScanStartInx) { + String derivedFrom; + if (serviceTemplate.getCapability_types() != null && serviceTemplate.getCapability_types() + .containsKey(typeId)) { + + filesScanned.clear(); + flatData.addInheritanceHierarchyType(typeId); + CapabilityType targetCapabilityType = (CapabilityType) flatData.getFlatEntity(); + CapabilityType sourceCapabilityType = serviceTemplate.getCapability_types().get(typeId); + derivedFrom = sourceCapabilityType.getDerived_from(); + if (derivedFrom != null) { + boolean isEntityFound = + scanAnFlatEntity(elementType, derivedFrom, flatData, serviceTemplate, toscaModel, filesScanned, + rootScanStartInx); + if (!isEntityFound) { + throw new CoreException(new ToscaElementTypeNotFoundErrorBuilder(typeId).build()); + } + } + combineCapabilityTypeInfo(sourceCapabilityType, targetCapabilityType); + } else { + return true; + } return false; - } else { - filesScanned.add(fileName); - } - ServiceTemplate template = toscaModel.getServiceTemplates().get(fileName); - if (Objects.isNull(template)) { - throw new CoreException( - new ToscaFileNotFoundErrorBuilder(fileName).build()); - } - found = scanAnFlatEntity(elementType, typeId, entity, template, toscaModel, - filesScanned, filesScanned.size()); - } - return found; - } - - private String fetchFileNameForImport(String importServiceTemplateFile, - String currentMetadatafileName) { - if (importServiceTemplateFile.contains("../")) { - return importServiceTemplateFile.replace("../", ""); - } 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, - List<String> filesScanned, - int rootScanStartInx) { - switch (elementType) { - case CAPABILITY_TYPE: - if (enrichCapabilityType(elementType, typeId, entity, serviceTemplate, toscaModel, - filesScanned, rootScanStartInx)) { - return false; - } - break; - case NODE_TYPE: - if (enrichNodeTypeInfo(elementType, typeId, entity, serviceTemplate, toscaModel, - filesScanned, rootScanStartInx)) { - return false; - } - break; - case DATA_TYPE: - if (enrichDataTypeInfo(elementType, typeId, entity, serviceTemplate, toscaModel, - filesScanned, rootScanStartInx)) { - return false; - } - break; - default: - throw new RuntimeException( - "Entity[" + elementType + "] id[" + typeId + "] flat not supported"); - } - - return true; - - - } - - private boolean enrichNodeTypeInfo(ToscaElementTypes elementType, String typeId, Object entity, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, - List<String> filesScanned, int rootScanStartInx) { - String derivedFrom; - 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 true; - } - return false; - } - - private boolean enrichDataTypeInfo(ToscaElementTypes elementType, String typeId, Object entity, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaModel, - List<String> filesScanned, int rootScanStartInx) { - String derivedFrom; - if (serviceTemplate.getData_types() != null - && serviceTemplate.getData_types().containsKey(typeId)) { - - filesScanned.clear(); - DataType targetDataType = (DataType) entity; - DataType sourceDataType = serviceTemplate.getData_types().get(typeId); - derivedFrom = sourceDataType.getDerived_from(); - if (derivedFrom != null) { - scanAnFlatEntity(elementType, derivedFrom, entity, serviceTemplate, toscaModel, - filesScanned, rootScanStartInx); - } - combineDataTypeInfo(sourceDataType, targetDataType); - } else { - return true; - } - return false; - } - - private boolean enrichCapabilityType(ToscaElementTypes elementType, String typeId, Object entity, - ServiceTemplate serviceTemplate, - ToscaServiceModel toscaModel, List<String> filesScanned, - int rootScanStartInx) { - String derivedFrom; - 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) { - scanAnFlatEntity(elementType, derivedFrom, entity, serviceTemplate, toscaModel, - filesScanned, rootScanStartInx); - } - combineCapabilityTypeInfo(sourceCapabilityType, targetCapabilityType); - } else { - return true; - } - return false; - } - - 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 combineDataTypeInfo(DataType sourceDataType, DataType targetDataType) { - targetDataType.setDerived_from(sourceDataType.getDerived_from()); - targetDataType.setDescription(sourceDataType.getDescription()); - targetDataType.setVersion(sourceDataType.getVersion()); - targetDataType.setProperties( - CommonMethods.mergeMaps(targetDataType.getProperties(), sourceDataType.getProperties())); - targetDataType.setConstraints( - CommonMethods.mergeLists(targetDataType.getConstraints(), sourceDataType.getConstraints())); - } - - - private void combineCapabilityTypeInfo(CapabilityType sourceCapabilityType, - CapabilityType targetCapabilityType) { - - 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 (StringUtils.isNotEmpty(sourceCapabilityType.getDerived_from())) { - targetCapabilityType.setDerived_from(sourceCapabilityType.getDerived_from()); - } - if (StringUtils.isNotEmpty(sourceCapabilityType.getDescription())) { - targetCapabilityType.setDescription(sourceCapabilityType.getDescription()); - } - if (StringUtils.isNotEmpty(sourceCapabilityType.getVersion())) { - targetCapabilityType.setVersion(sourceCapabilityType.getVersion()); - } - - - } - - - /* - * 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; - } - - @Override - public 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. + } + + 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())); + combineNodeTypeInterfaceInfo(sourceNodeType, targetNodeType); + 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 InterfaceDefinitionType getInterfaceDefinitionType(String interfaceName, Object interfaceDefTypeObj) { + Optional<InterfaceDefinitionType> interfaceDefinitionType = DataModelUtil.convertObjToInterfaceDefinition( + interfaceName, interfaceDefTypeObj, InterfaceDefinitionType.class); + if (!interfaceDefinitionType.isPresent()) { + throw new CoreException(new CreateInterfaceObjectErrorBuilder("InterfaceDefinitionType", interfaceName, + "Invalid interface object").build()); + } + return interfaceDefinitionType.get(); + } + + private void combineNodeTypeInterfaceInfo(NodeType sourceNodeType, NodeType targetNodeType) { + Optional<Map<String, Object>> interfaceNoMerge = combineInterfaceNoMerge(sourceNodeType, targetNodeType); + if (interfaceNoMerge.isPresent()) { + targetNodeType.setInterfaces(interfaceNoMerge.get()); + return; + } + targetNodeType.setInterfaces(combineInterfaces(sourceNodeType, targetNodeType)); + } + + private Map<String, Object> combineInterfaces(NodeType sourceNodeType, NodeType targetNodeType) { + Map<String, Object> combineInterfaces = new HashMap<>(); + for (Map.Entry<String, Object> sourceInterfaceDefEntry : sourceNodeType.getInterfaces().entrySet()) { + String interfaceName = sourceInterfaceDefEntry.getKey(); + if (!MapUtils.isEmpty(targetNodeType.getInterfaces()) && targetNodeType.getInterfaces() + .containsKey(interfaceName)) { + combineInterfaces.put(interfaceName, + combineInterfaceDefinition(interfaceName, sourceInterfaceDefEntry.getValue(), + targetNodeType.getInterfaces().get(interfaceName))); + } else { + combineInterfaces.put(sourceInterfaceDefEntry.getKey(), sourceInterfaceDefEntry.getValue()); + } + } + + for (Map.Entry<String, Object> targetInterfaceDefEntry : targetNodeType.getInterfaces().entrySet()) { + String interfaceName = targetInterfaceDefEntry.getKey(); + if (!sourceNodeType.getInterfaces().containsKey(interfaceName)) { + combineInterfaces.put(targetInterfaceDefEntry.getKey(), targetInterfaceDefEntry.getValue()); + } + } + + return combineInterfaces; + } + + private Optional<Map<String, Object>> combineInterfaceNoMerge(NodeType sourceNodeType, NodeType targetNodeType) { + if ((MapUtils.isEmpty(sourceNodeType.getInterfaces()) && MapUtils.isEmpty(targetNodeType.getInterfaces()))) { + return Optional.empty(); + } + + if (MapUtils.isEmpty(sourceNodeType.getInterfaces()) && !MapUtils.isEmpty(targetNodeType.getInterfaces())) { + return Optional.of(targetNodeType.getInterfaces()); + } + + if (!MapUtils.isEmpty(sourceNodeType.getInterfaces()) && MapUtils.isEmpty(targetNodeType.getInterfaces())) { + return Optional.of(sourceNodeType.getInterfaces()); + } + return Optional.empty(); + + } + + private Object combineInterfaceDefinition(String interfaceName, Object sourceInterfaceDefType, + Object targetInterfaceDefType) { + InterfaceDefinitionType sourceInterface = getInterfaceDefinitionType(interfaceName, sourceInterfaceDefType); + InterfaceDefinitionType targetInterface = getInterfaceDefinitionType(interfaceName, targetInterfaceDefType); + InterfaceDefinitionType combineInterface = new InterfaceDefinitionType(); + combineInterface.setType(sourceInterface.getType()); + combineInterface.setInputs(CommonMethods.mergeMaps(targetInterface.getInputs(), sourceInterface.getInputs())); + combineInterface.setOperations( + CommonMethods.mergeMaps(targetInterface.getOperations(), sourceInterface.getOperations())); + + return DataModelUtil.convertInterfaceDefinitionTypeToObj(combineInterface).get(); + } + + private void combineDataTypeInfo(DataType sourceDataType, DataType targetDataType) { + targetDataType.setDerived_from(sourceDataType.getDerived_from()); + targetDataType.setDescription(sourceDataType.getDescription()); + targetDataType.setVersion(sourceDataType.getVersion()); + targetDataType + .setProperties(CommonMethods.mergeMaps(targetDataType.getProperties(), sourceDataType.getProperties())); + targetDataType.setConstraints( + CommonMethods.mergeLists(targetDataType.getConstraints(), sourceDataType.getConstraints())); + } + + + private void combineCapabilityTypeInfo(CapabilityType sourceCapabilityType, CapabilityType targetCapabilityType) { + + 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 (StringUtils.isNotEmpty(sourceCapabilityType.getDerived_from())) { + targetCapabilityType.setDerived_from(sourceCapabilityType.getDerived_from()); + } + if (StringUtils.isNotEmpty(sourceCapabilityType.getDescription())) { + targetCapabilityType.setDescription(sourceCapabilityType.getDescription()); + } + if (StringUtils.isNotEmpty(sourceCapabilityType.getVersion())) { + targetCapabilityType.setVersion(sourceCapabilityType.getVersion()); + } + + + } + + + /* + * 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 nodeTemplate the node template - * @param requirementId the requirement id - * @param requirementAssignment the requirement assignment - * @return true if the requirement already exists and false otherwise + * @param substitutionServiceTemplate substitution serivce template + * @param nodeTypeDerivedFromValue derived from value for the created node type + * @return the node type */ - @Override - public boolean isRequirementExistInNodeTemplate(NodeTemplate nodeTemplate, - String requirementId, - RequirementAssignment requirementAssignment) { - List<Map<String, RequirementAssignment>> nodeTemplateRequirements = nodeTemplate - .getRequirements(); - return nodeTemplateRequirements != null && nodeTemplateRequirements.stream().anyMatch( - requirement -> requirement.containsKey(requirementId) && DataModelUtil - .compareRequirementAssignment(requirementAssignment, requirement.get(requirementId))); - } - - @Override - public boolean isTypeOf(InterfaceDefinitionType interfaceDefinition, String interfaceType, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel) { - return isTypeOf(interfaceDefinition, interfaceType, GET_INTERFACE_TYPE_METHOD_NAME, serviceTemplate, - toscaServiceModel); - } - - @Override - public boolean isTypeOf(DefinitionOfDataType parameterDefinition, String dataType, - ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel) { - return isTypeOf(parameterDefinition, dataType, GET_DATA_TYPE_METHOD_NAME, serviceTemplate, - toscaServiceModel); - } - - private <T> boolean isTypeOf(T object, String type, String getTypesMethodName, - ServiceTemplate serviceTemplate, - ToscaServiceModel toscaServiceModel) { - if (object == null) { - return false; - } - - try { - String objectType = (String) object.getClass().getMethod(GET_TYPE_METHOD_NAME).invoke(object); - if (Objects.equals(objectType, type)) { - return true; - } + @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; + } + + @Override + public 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; + } - Optional<Boolean> typeExistInServiceTemplateHierarchy = - isTypeExistInServiceTemplateHierarchy(type, objectType, getTypesMethodName, - serviceTemplate, toscaServiceModel, null); - return typeExistInServiceTemplateHierarchy.orElseThrow(() -> new CoreException( - new ToscaElementTypeNotFoundErrorBuilder(objectType).build())); + /** + * 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 + */ + @Override + public boolean isRequirementExistInNodeTemplate(NodeTemplate nodeTemplate, String requirementId, + RequirementAssignment requirementAssignment) { + List<Map<String, RequirementAssignment>> nodeTemplateRequirements = nodeTemplate.getRequirements(); + return nodeTemplateRequirements != null && nodeTemplateRequirements.stream().anyMatch( + requirement -> requirement.containsKey(requirementId) && DataModelUtil.compareRequirementAssignment( + requirementAssignment, requirement.get(requirementId))); + } + + @Override + public boolean isTypeOf(InterfaceDefinitionType interfaceDefinition, String interfaceType, + ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel) { + return isTypeOf(interfaceDefinition, interfaceType, GET_INTERFACE_TYPE_METHOD_NAME, serviceTemplate, + toscaServiceModel); + } - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - throw new RuntimeException(e); + @Override + public boolean isTypeOf(DefinitionOfDataType parameterDefinition, String dataType, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel) { + return isTypeOf(parameterDefinition, dataType, GET_DATA_TYPE_METHOD_NAME, serviceTemplate, toscaServiceModel); + } + + private <T> boolean isTypeOf(T object, String type, String getTypesMethodName, ServiceTemplate serviceTemplate, + ToscaServiceModel toscaServiceModel) { + if (object == null) { + return false; + } + + try { + String objectType = (String) object.getClass().getMethod(GET_TYPE_METHOD_NAME).invoke(object); + if (Objects.equals(objectType, type)) { + return true; + } + + Optional<Boolean> typeExistInServiceTemplateHierarchy = + isTypeExistInServiceTemplateHierarchy(type, objectType, getTypesMethodName, serviceTemplate, + toscaServiceModel, null); + return typeExistInServiceTemplateHierarchy.orElseThrow( + () -> new CoreException(new ToscaElementTypeNotFoundErrorBuilder(objectType).build())); + + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } } - } } + + diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/DataModelUtilTest.java b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/DataModelUtilTest.java index 419951d684..a009899003 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/DataModelUtilTest.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/DataModelUtilTest.java @@ -20,21 +20,18 @@ package org.openecomp.sdc.tosca.services; +import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; +import org.onap.sdc.tosca.datatypes.model.*; import org.openecomp.sdc.common.errors.CoreException; -import org.onap.sdc.tosca.datatypes.model.GroupDefinition; -import org.onap.sdc.tosca.datatypes.model.NodeTemplate; -import org.onap.sdc.tosca.datatypes.model.NodeType; -import org.onap.sdc.tosca.datatypes.model.PolicyDefinition; -import org.onap.sdc.tosca.datatypes.model.RelationshipTemplate; -import org.onap.sdc.tosca.datatypes.model.RequirementAssignment; -import org.onap.sdc.tosca.datatypes.model.SubstitutionMapping; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Optional; /** * @author shiria @@ -125,4 +122,34 @@ public class DataModelUtilTest { "Invalid action, can't add 'Group Definition' to 'Service Template', 'Service Template' entity is NULL."); DataModelUtil.addGroupDefinitionToTopologyTemplate(null, "123", new GroupDefinition()); } + + + @Test + public void testGetRelationshipTemplate(){ + RelationshipTemplate relationshipTemplate = new RelationshipTemplate(); + String testingRelationshipType = "testingRelationshipType"; + relationshipTemplate.setType(testingRelationshipType); + TopologyTemplate topologyTemplate = new TopologyTemplate(); + topologyTemplate.setRelationship_templates(new HashMap<>()); + String relationId = "rtest"; + topologyTemplate.getRelationship_templates().put(relationId, relationshipTemplate); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setTopology_template(topologyTemplate); + + Optional<RelationshipTemplate> relationshipTemplateOut = + DataModelUtil.getRelationshipTemplate(serviceTemplate, relationId); + Assert.assertNotNull(relationshipTemplateOut); + Assert.assertEquals(true,relationshipTemplateOut.isPresent()); + Assert.assertEquals(testingRelationshipType, relationshipTemplateOut.get().getType()); + } + + @Test + public void testGetEmptyRelationshipTemplate(){ + ServiceTemplate serviceTemplate = new ServiceTemplate(); + String relationId = "rtest"; + Optional<RelationshipTemplate> relationshipTemplateOut = + DataModelUtil.getRelationshipTemplate(serviceTemplate, relationId); + Assert.assertNotNull(relationshipTemplateOut); + Assert.assertEquals(false,relationshipTemplateOut.isPresent()); + } } diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImplTest.java b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImplTest.java index e034fb8565..71647a68a2 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImplTest.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaAnalyzerServiceImplTest.java @@ -26,18 +26,13 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.runners.MockitoJUnitRunner; +import org.onap.sdc.tosca.datatypes.model.OperationDefinitionType; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.tosca.TestUtil; import org.openecomp.sdc.tosca.datatypes.ToscaElementTypes; +import org.openecomp.sdc.tosca.datatypes.ToscaFlatData; import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; -import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition; -import org.onap.sdc.tosca.datatypes.model.DataType; -import org.onap.sdc.tosca.datatypes.model.DefinitionOfDataType; -import org.onap.sdc.tosca.datatypes.model.DataType; -import org.onap.sdc.tosca.datatypes.model.Import; -import org.onap.sdc.tosca.datatypes.model.InterfaceDefinitionType; -import org.onap.sdc.tosca.datatypes.model.InterfaceType; import org.onap.sdc.tosca.datatypes.model.NodeTemplate; import org.onap.sdc.tosca.datatypes.model.NodeType; import org.onap.sdc.tosca.datatypes.model.ParameterDefinition; @@ -47,29 +42,33 @@ import org.onap.sdc.tosca.datatypes.model.RequirementDefinition; import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; import org.onap.sdc.tosca.datatypes.model.SubstitutionMapping; import org.onap.sdc.tosca.datatypes.model.TopologyTemplate; +import org.onap.sdc.tosca.datatypes.model.CapabilityDefinition; +import org.onap.sdc.tosca.datatypes.model.Import; +import org.openecomp.sdc.tosca.services.DataModelUtil; +import org.onap.sdc.tosca.datatypes.model.InterfaceType; +import org.onap.sdc.tosca.datatypes.model.InterfaceDefinitionType; +import org.onap.sdc.tosca.datatypes.model.DataType; import org.openecomp.sdc.tosca.services.ToscaAnalyzerService; import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil; +import org.onap.sdc.tosca.datatypes.model.DefinitionOfDataType; -import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.io.IOException; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; +import static org.junit.Assert.assertEquals; + +import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil; -/** - * @author Avrahamg - * @since July 14, 2016 - */ @RunWith(MockitoJUnitRunner.class) public class ToscaAnalyzerServiceImplTest { /* @@ -79,774 +78,803 @@ public class ToscaAnalyzerServiceImplTest { NdTy: NodeType */ - private static ToscaAnalyzerService toscaAnalyzerService; - private static ToscaServiceModel toscaServiceModel; - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Mock - private NodeTemplate nodeTemplateMock; - @Mock - private ParameterDefinition parameterDefinitionMock; - @Mock - private PropertyDefinition propertyDefinitionMock; - @Mock - private InterfaceDefinitionType interfaceDefinitionMock; - @Mock - private ToscaServiceModel toscaServiceModelMock; - - @BeforeClass - public static void onlyOnceSetUp() throws IOException { - toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); - toscaServiceModel = TestUtil.loadToscaServiceModel("/mock/analyzerService/toscasubstitution/", - "/mock/globalServiceTemplates/", null); - } - - @Before - public void init() throws IOException { - MockitoAnnotations.initMocks(this); - } - - @Test - public void testGetFlatEntityNotFound() throws Exception { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Entity Type 'org.openecomp.resource.vfc.notFound' or one of its derivedFrom type hierarchy, is not defined in tosca service model"); - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - - ServiceTemplate - serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - toscaAnalyzerService - .getFlatEntity(ToscaElementTypes.NODE_TYPE, "org.openecomp.resource.vfc.notFound", - serviceTemplateFromYaml, toscaServiceModel); - } - } - - @Test - public void testGetFlatEntityFileNotFound() throws Exception { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Tosca file 'missingFile.yaml' was not found in tosca service model"); - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/ServiceTemplateFileNotFoundTest.yaml")) { - - ServiceTemplate - serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - toscaAnalyzerService - .getFlatEntity(ToscaElementTypes.NODE_TYPE, - "org.openecomp.resource.vfc.nodes.heat.cmaui_image", - serviceTemplateFromYaml, toscaServiceModel); - } - } - - @Test - public void testGetFlatEntityNodeType() throws Exception { - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - - ServiceTemplate - serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - final NodeType flatEntity = (NodeType) toscaAnalyzerService - .getFlatEntity(ToscaElementTypes.NODE_TYPE, "org.openecomp.resource.vfc.nodes.heat" + - ".cmaui_image", serviceTemplateFromYaml, toscaServiceModel); - - Assert.assertNotNull(flatEntity); - Assert.assertEquals("org.openecomp.resource.vfc.nodes.heat.nova.Server", flatEntity - .getDerived_from()); - Assert.assertEquals(20, flatEntity.getProperties().size()); - Assert.assertEquals("overridden default value", - flatEntity.getProperties().get("admin_pass").get_default()); - Assert.assertEquals("REBUILD", - flatEntity.getProperties().get("image_update_policy").get_default()); - Assert.assertNotNull(flatEntity.getProperties().get("new_property")); - } - } - - @Test - public void testGetFlatEntityDataType() throws Exception { - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - - ServiceTemplate - serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - final DataType flatEntity = (DataType) toscaAnalyzerService - .getFlatEntity(ToscaElementTypes.DATA_TYPE, - "org.openecomp.datatypes.heat.network.MyNewAddressPair", serviceTemplateFromYaml, - toscaServiceModel); - - Assert.assertNotNull(flatEntity); - Assert.assertEquals("org.openecomp.datatypes.heat.network.MyAddressPair", flatEntity - .getDerived_from()); - Assert.assertEquals(3, flatEntity.getProperties().size()); - Assert.assertEquals("overridden default value", - flatEntity.getProperties().get("mac_address").get_default()); - Assert.assertEquals(true, - flatEntity.getProperties().get("mac_address").getRequired()); - Assert.assertNotNull(flatEntity.getProperties().get("new_property")); - } - } - - @Test - public void testCalculateExposedRequirements() throws Exception { - Map<String, RequirementDefinition> nodeTypeRequirementDefinition = new HashMap<>(); - RequirementDefinition rd = new RequirementDefinition(); - rd.setCapability("tosca.capabilities.Node"); - rd.setNode("tosca.nodes.Root"); - rd.setRelationship("tosca.relationships.DependsOn"); - Object[] occurences = new Object[]{0, "UNBOUNDED"}; - rd.setOccurrences(occurences); - - RequirementDefinition rd1 = new RequirementDefinition(); - rd.setCapability("tosca.capabilities.network.Bindable"); - rd.setNode(null); - rd.setRelationship("tosca.relationships.network.BindsTo"); - Object[] occurences1 = new Object[]{1, 1}; - rd1.setOccurrences(occurences1); - - nodeTypeRequirementDefinition.put("binding", rd1); - nodeTypeRequirementDefinition.put("dependency", rd); - - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = - new HashMap<>(); - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment = new HashMap<>(); - RequirementAssignment ra = new RequirementAssignment(); - ra.setCapability("tosca.capabilities.network.Bindable"); - ra.setNode("pd_server"); - ra.setRelationship("tosca.relationships.network.BindsTo"); - nodeTemplateRequirementsAssignment.put("binding", ra); - - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition = new ArrayList<>(); - nodeTypeRequirementsDefinition.add(nodeTypeRequirementDefinition); - - List<Map<String, RequirementDefinition>> exposedRequirements = toscaAnalyzerService - .calculateExposedRequirements(nodeTypeRequirementsDefinition, - nodeTemplateRequirementsAssignment); - Assert.assertEquals(1, exposedRequirements.size()); - } - - @Test - public void testCalExpReqWithNullNodeInReqAssignment() throws Exception { - Map<String, RequirementDefinition> nodeTypeRequirementDefinition = new HashMap<>(); - RequirementDefinition rd = new RequirementDefinition(); - rd.setCapability("tosca.capabilities.Node"); - rd.setNode("tosca.nodes.Root"); - rd.setRelationship("tosca.relationships.DependsOn"); - Object[] occurences = new Object[]{0, "UNBOUNDED"}; - rd.setOccurrences(occurences); - - RequirementDefinition rd1 = new RequirementDefinition(); - rd.setCapability("tosca.capabilities.network.Bindable"); - rd.setNode(null); - rd.setRelationship("tosca.relationships.network.BindsTo"); - Object[] occurences1 = new Object[]{1, 1}; - rd1.setOccurrences(occurences1); - - nodeTypeRequirementDefinition.put("binding", rd1); - nodeTypeRequirementDefinition.put("dependency", rd); - - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = - new HashMap<>(); - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment = new HashMap<>(); - RequirementAssignment ra = new RequirementAssignment(); - ra.setCapability("tosca.capabilities.network.Bindable"); - ra.setNode(null); - ra.setRelationship("tosca.relationships.network.BindsTo"); - nodeTemplateRequirementsAssignment.put("binding", ra); - - List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition = new ArrayList<>(); - nodeTypeRequirementsDefinition.add(nodeTypeRequirementDefinition); - - List<Map<String, RequirementDefinition>> exposedRequirements = toscaAnalyzerService - .calculateExposedRequirements(nodeTypeRequirementsDefinition, - nodeTemplateRequirementsAssignment); - Assert.assertEquals(1, exposedRequirements.size()); - } - - @Test - public void testCalculateExposedCapabilities() throws Exception { - Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>(); - CapabilityDefinition cd = new CapabilityDefinition(); - cd.setType("tosca.capabilities.Scalable"); - nodeTypeCapabilitiesDefinition.put("tosca.capabilities.network.Bindable_pd_server", cd); - Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = - new HashMap<>(); - Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment = new HashMap<>(); - RequirementAssignment ra = new RequirementAssignment(); - ra.setCapability("tosca.capabilities.network.Bindable"); - ra.setNode("pd_server"); - ra.setRelationship("tosca.relationships.network.BindsTo"); - nodeTemplateRequirementsAssignment.put("binding", ra); - fullFilledRequirementsDefinition.put("pd_server", nodeTemplateRequirementsAssignment); - Map<String, CapabilityDefinition> exposedCapabilities = - toscaAnalyzerService.calculateExposedCapabilities(nodeTypeCapabilitiesDefinition, - fullFilledRequirementsDefinition); - Assert.assertEquals(1, exposedCapabilities.size()); - } - - @Test - public void testIsRequirementExistsWithInvalidReqId() throws Exception { - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - - ServiceTemplate - serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - TestUtil.createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, - toscaExtensionYamlUtil); - - NodeTemplate port_0 = - serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui_port_0"); - - RequirementAssignment ra = new RequirementAssignment(); - ra.setCapability("tosca.capabilities.network.Bindable"); - ra.setNode("server_cmaui"); - ra.setRelationship("tosca.relationships.network.BindsTo"); - - //Test With Empty requirementId - Assert.assertEquals(false, - toscaAnalyzerService.isRequirementExistInNodeTemplate(port_0, "", ra)); - - //Test With valid requirementId - Assert.assertEquals(true, - toscaAnalyzerService.isRequirementExistInNodeTemplate(port_0, "binding", ra)); - - //Test With invalid requirement assignment - RequirementAssignment ra1 = new RequirementAssignment(); - ra1.setCapability("tosca.capabilities.network.Bindable1"); - ra1.setNode("server_cmaui1"); - ra1.setRelationship("tosca.relationships.network.BindsTo1"); - Assert.assertEquals(false, - toscaAnalyzerService.isRequirementExistInNodeTemplate(port_0, "binding", ra1)); - } - } - - @Test - public void testGetRequirements() throws Exception { - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - - ServiceTemplate - serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - NodeTemplate port_0 = - serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui_port_0"); - List<RequirementAssignment> reqList = - toscaAnalyzerService.getRequirements(port_0, ToscaConstants.BINDING_REQUIREMENT_ID); - assertEquals(1, reqList.size()); - - reqList.clear(); - NodeTemplate port_1 = - serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui1_port_1"); - reqList = toscaAnalyzerService.getRequirements(port_1, ToscaConstants.LINK_REQUIREMENT_ID); - assertEquals(2, reqList.size()); - - reqList.clear(); - reqList = toscaAnalyzerService.getRequirements(port_0, ToscaConstants.LINK_REQUIREMENT_ID); - assertEquals(0, reqList.size()); - } - } - - @Test - public void testGetNodeTemplateById() throws Exception { - ServiceTemplate emptyServiceTemplate = new ServiceTemplate(); - Optional<NodeTemplate> nodeTemplate = - toscaAnalyzerService.getNodeTemplateById(emptyServiceTemplate, "test_net222"); - assertEquals(false, nodeTemplate.isPresent()); - - ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates() - .get(toscaServiceModel.getEntryDefinitionServiceTemplate()); - nodeTemplate = toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net"); - assertEquals(true, nodeTemplate.isPresent()); - - nodeTemplate = toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net222"); - assertEquals(false, nodeTemplate.isPresent()); - } - - @Test - public void testGetSubstituteServiceTemplateName() throws Exception { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Invalid Substitute Node Template invalid2, mandatory map property service_template_filter with mandatory key substitute_service_template must be defined."); - - Optional<String> substituteServiceTemplateName; - - ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates() - .get(toscaServiceModel.getEntryDefinitionServiceTemplate()); - Optional<NodeTemplate> notSubstitutableNodeTemplate = - toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net"); - assertEquals(true, notSubstitutableNodeTemplate.isPresent()); - - if (notSubstitutableNodeTemplate.isPresent()) { - substituteServiceTemplateName = toscaAnalyzerService - .getSubstituteServiceTemplateName("test_net", notSubstitutableNodeTemplate.get()); - assertEquals(false, substituteServiceTemplateName.isPresent()); - } - - Optional<NodeTemplate> substitutableNodeTemplate = - toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_nested"); - assertEquals(true, substitutableNodeTemplate.isPresent()); - if (substitutableNodeTemplate.isPresent()) { - substituteServiceTemplateName = toscaAnalyzerService - .getSubstituteServiceTemplateName("test_nested", substitutableNodeTemplate.get()); - assertEquals(true, substituteServiceTemplateName.isPresent()); - assertEquals("nestedServiceTemplate.yaml", substituteServiceTemplateName.get()); - } - - NodeTemplate invalidSubstitutableNodeTemplate1 = new NodeTemplate(); - substituteServiceTemplateName = toscaAnalyzerService - .getSubstituteServiceTemplateName("invalid1", invalidSubstitutableNodeTemplate1); - assertEquals(false, substituteServiceTemplateName.isPresent()); - - substitutableNodeTemplate.ifPresent(nodeTemplate -> { - Object serviceTemplateFilter = nodeTemplate.getProperties() - .get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); - ((Map) serviceTemplateFilter).clear(); - toscaAnalyzerService - .getSubstituteServiceTemplateName("invalid2", nodeTemplate); - - }); - } - - - @Test - public void testGetSubstitutableNodeTemplates() throws Exception { - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/ServiceTemplateSubstituteTest.yaml")) { - ServiceTemplate serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - Map<String, NodeTemplate> substitutableNodeTemplates = - toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplateFromYaml); - assertEquals(2, substitutableNodeTemplates.size()); - assertNotNull(substitutableNodeTemplates.get("test_nested1")); - assertNotNull(substitutableNodeTemplates.get("test_nested2")); - - ServiceTemplate emptyServiceTemplate = new ServiceTemplate(); - emptyServiceTemplate.setTopology_template(new TopologyTemplate()); - substitutableNodeTemplates = - toscaAnalyzerService.getSubstitutableNodeTemplates(emptyServiceTemplate); - assertEquals(0, substitutableNodeTemplates.size()); - } - - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - ServiceTemplate serviceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - Map<String, NodeTemplate> substitutableNodeTemplates = - toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplateFromYaml); - assertEquals(0, substitutableNodeTemplates.size()); - } - } - - @Test - public void testGetSubstitutionMappedNodeTemplateByExposedReq() throws Exception { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Invalid Tosca model data, missing 'Node Template' entry for 'Node Template' id cmaui_port_9"); - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - ServiceTemplate nestedServiceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService - .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml", - nestedServiceTemplateFromYaml, "local_storage_server_cmaui"); - assertEquals(true, mappedNodeTemplate.isPresent()); - mappedNodeTemplate.ifPresent(stringNodeTemplateEntry -> { - assertEquals("server_cmaui", stringNodeTemplateEntry.getKey()); - assertNotNull(stringNodeTemplateEntry.getValue()); - }); - - mappedNodeTemplate = toscaAnalyzerService - .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml", - nestedServiceTemplateFromYaml, "link_cmaui_port_invalid"); - assertEquals(true, mappedNodeTemplate.isPresent()); - mappedNodeTemplate.ifPresent(stringNodeTemplateEntry -> { - assertEquals("server_cmaui", stringNodeTemplateEntry.getKey()); - assertNotNull(stringNodeTemplateEntry.getValue()); - }); - - ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates() - .get(toscaServiceModel.getEntryDefinitionServiceTemplate()); - mappedNodeTemplate = toscaAnalyzerService.getSubstitutionMappedNodeTemplateByExposedReq( - toscaServiceModel.getEntryDefinitionServiceTemplate(), mainServiceTemplate, - "local_storage_server_cmaui"); - assertEquals(false, mappedNodeTemplate.isPresent()); - } - } - - @Test - public void invalidSubstitutableMapping() throws Exception { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Invalid Substitution Service Template invalidMappingServiceTemplate.yaml, missing mandatory file 'Node type' in substitution mapping."); - ServiceTemplate invalidMappingServiceTemplate = new ServiceTemplate(); - invalidMappingServiceTemplate.setTopology_template(new TopologyTemplate()); - invalidMappingServiceTemplate.getTopology_template() - .setSubstitution_mappings(new SubstitutionMapping()); - toscaAnalyzerService - .getSubstitutionMappedNodeTemplateByExposedReq("invalidMappingServiceTemplate.yaml", - invalidMappingServiceTemplate, "local_storage_server_cmaui"); - } - - @Test - public void substitutableMappingWithNoReqMap() throws Exception { - ServiceTemplate mainServiceTemplate = toscaServiceModel.getServiceTemplates() - .get(toscaServiceModel.getEntryDefinitionServiceTemplate()); - ServiceTemplate emptyReqMapping = new ServiceTemplate(); - emptyReqMapping.setTopology_template(new TopologyTemplate()); - emptyReqMapping.getTopology_template().setSubstitution_mappings(new SubstitutionMapping()); - emptyReqMapping.getTopology_template().getSubstitution_mappings().setNode_type("temp"); - Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService - .getSubstitutionMappedNodeTemplateByExposedReq( - toscaServiceModel.getEntryDefinitionServiceTemplate(), mainServiceTemplate, - "local_storage_server_cmaui"); - assertEquals(false, mappedNodeTemplate.isPresent()); - } - - @Test - public void testGetSubstitutionMappedNodeTemplateByExposedReqInvalid() throws Exception { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Invalid Tosca model data, missing 'Node Template' entry for 'Node Template' id cmaui_port_9"); - ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); - try (InputStream yamlFile = toscaExtensionYamlUtil - .loadYamlFileIs("/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { - ServiceTemplate nestedServiceTemplateFromYaml = - toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); - - toscaAnalyzerService - .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml", - nestedServiceTemplateFromYaml, "link_cmaui_port_invalid"); - } - } - - @Test - public void testIsDesiredRequirementAssignmentMatch() throws Exception { - - RequirementAssignment requirementAssignment = new RequirementAssignment(); - String capability = "Test.Capability"; - String node = "Test.node"; - String relationship = "Test.relationship"; - requirementAssignment.setCapability(capability); - requirementAssignment.setNode(node); - requirementAssignment.setRelationship(relationship); - - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, node, relationship)); - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, null, node, relationship)); - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, null, relationship)); - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, node, null)); - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, null, null, relationship)); - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, null, null)); - assertEquals(true, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, null, node, null)); - - } - - @Test - public void testIsDesiredRequirementAssignmentNoMatch() throws Exception { - - RequirementAssignment requirementAssignment = new RequirementAssignment(); - String capability = "Test.Capability"; - String node = "Test.node"; - String relationship = "Test.relationship"; - requirementAssignment.setCapability(capability); - requirementAssignment.setNode(node); - requirementAssignment.setRelationship(relationship); - - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, "no", node, relationship)); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, "no", "no", relationship)); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, "no", "no", "no")); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, "no", relationship)); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, node, "no")); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, capability, "no", "no")); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, "no", null, null)); - assertEquals(false, toscaAnalyzerService - .isDesiredRequirementAssignment(requirementAssignment, null, null, null)); - - - } - - @Test - public void shouldReturnFalseIfNdTmpIsNull() { - NodeTemplate nodeTemplate = null; - assertFalse(toscaAnalyzerService - .isTypeOf(nodeTemplate, ToscaNodeType.NATIVE_NETWORK, new ServiceTemplate(), - toscaServiceModelMock)); - } - - @Test - public void shouldReturnTrueIfNdTmpTypeIsOfRequestedType() { - NodeTemplate nodeTemplate = new NodeTemplate(); - String nodeTypeToSearch = ToscaNodeType.NATIVE_BLOCK_STORAGE; - nodeTemplate.setType(nodeTypeToSearch); - assertTrue(toscaAnalyzerService - .isTypeOf(nodeTemplate, nodeTypeToSearch, new ServiceTemplate(), - toscaServiceModelMock)); - } - - @Test - public void shouldReturnTrueIfDataTypeIsOfRequestedType() { - PropertyDefinition propertyDefinition = new PropertyDefinition(); - String propertyTypeToSearch = "tosca.datatypes.TimeInterval"; - propertyDefinition.setType(propertyTypeToSearch); - assertTrue(toscaAnalyzerService - .isTypeOf(propertyDefinition, propertyTypeToSearch, new ServiceTemplate(), - toscaServiceModelMock)); - } - - @Test - public void shouldReturnTrueIfInterfaceTypeIsOfRequestedType() { - InterfaceDefinitionType interfaceDefinition = new InterfaceDefinitionType(); - String interfaceTypeToSearch = "test.interface.A"; - interfaceDefinition.setType(interfaceTypeToSearch); - assertTrue(toscaAnalyzerService - .isTypeOf(interfaceDefinition, interfaceTypeToSearch, new ServiceTemplate(), - toscaServiceModelMock)); - } - - @Test - public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyAndNdTyDerivedFromRequestedType() { - String typeToMatch = ToscaNodeType.CINDER_VOLUME; - when(nodeTemplateMock.getType()).thenReturn(typeToMatch); - Map<String, NodeType> stNodeTypes = new HashMap<>(); - addNodeType(stNodeTypes, ToscaNodeType.NATIVE_COMPUTE, new NodeType()); - NodeType nodeType = createNodeType(ToscaNodeType.NATIVE_BLOCK_STORAGE); - addNodeType(stNodeTypes, typeToMatch, nodeType); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setNode_types(stNodeTypes); - assertTrue(toscaAnalyzerService - .isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_BLOCK_STORAGE, - serviceTemplate, toscaServiceModelMock)); - - } - - @Test - public void dataTypeParameterExistInHierarchy() { - String testedDataTypeKey = "test.dataType.B"; - when(parameterDefinitionMock.getType()).thenReturn(testedDataTypeKey); - dataTypeExistInHierarchy(testedDataTypeKey, parameterDefinitionMock); - - } - - @Test - public void dataTypePropertyExistInHierarchy() { - String testedDataTypeKey = "test.dataType.B"; - when(propertyDefinitionMock.getType()).thenReturn(testedDataTypeKey); - dataTypeExistInHierarchy(testedDataTypeKey, propertyDefinitionMock); - } - - private void dataTypeExistInHierarchy(String testedDataTypeKey, - DefinitionOfDataType testedDefinitionDataType) { - String typeToMatch = "test.dataType.A"; - Map<String, DataType> stDataTypes = new HashMap<>(); - addDataType(stDataTypes, "tosca.datatypes.network.NetworkInfo", new DataType()); - DataType testedDataType = createDataType(typeToMatch); - addDataType(stDataTypes, testedDataTypeKey, testedDataType); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setData_types(stDataTypes); - assertTrue(toscaAnalyzerService - .isTypeOf(testedDefinitionDataType, typeToMatch, serviceTemplate, toscaServiceModelMock)); - } - - @Test - public void interfaceTypeExistInHierarchy() { - String typeToMatch = "test.interfaceType.A"; - String testedInterfaceTypeKey = "test.interfaceType.B"; - when(interfaceDefinitionMock.getType()).thenReturn(testedInterfaceTypeKey); - Map<String, Object> stInterfaceTypes = new HashMap<>(); - stInterfaceTypes.put("tosca.interfaces.network.NetworkInfo", new InterfaceType()); - InterfaceType testedInterfaceType = createInterfaceType(typeToMatch); - stInterfaceTypes.put(testedInterfaceTypeKey, testedInterfaceType); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setInterface_types(stInterfaceTypes); - assertTrue(toscaAnalyzerService - .isTypeOf(interfaceDefinitionMock, "test.interfaceType.A", - serviceTemplate, toscaServiceModelMock)); - } - - @Test - public void shouldThrowCoreExceptionForInvalidNodeType() { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Entity Type 'AAA' or one of its derivedFrom type hierarchy, is not defined in " + - "tosca service model"); - when(nodeTemplateMock.getType()).thenReturn("AAA"); - Map<String, NodeType> stNodeTypes = new HashMap<>(); - addNodeType(stNodeTypes, "notImportant", new NodeType()); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setNode_types(stNodeTypes); - toscaAnalyzerService - .isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_COMPUTE, serviceTemplate, - toscaServiceModelMock); - } - - @Test - public void shouldThrowCoreExceptionForInvalidNodeType2Level() { - thrown.expect(CoreException.class); - thrown.expectMessage( - "Entity Type 'A' or one of its derivedFrom type hierarchy, is not defined in tosca " + - "service model"); - String typeToMatch = "A"; - when(nodeTemplateMock.getType()).thenReturn(typeToMatch); - Map<String, NodeType> stNodeTypes = new HashMap<>(); - addNodeType(stNodeTypes, "notImportant", new NodeType()); - addNodeType(stNodeTypes, "A", createNodeType("ADerivedFromB")); - addNodeType(stNodeTypes, "ADerivedFromB'", createNodeType("BDerivedFromC")); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setNode_types(stNodeTypes); - assertTrue(toscaAnalyzerService - .isTypeOf(nodeTemplateMock, "BDerivedFromC", serviceTemplate, toscaServiceModelMock)); - } - - @Test - public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyAndNotDerivedFromRequestedTypeBut2ndLevelDerivedFromMatch() { - String typeToMatch = "A"; - when(nodeTemplateMock.getType()).thenReturn(typeToMatch); - Map<String, NodeType> stNodeTypes = new HashMap<>(); - addNodeType(stNodeTypes, "notImportant", new NodeType()); - addNodeType(stNodeTypes, "A", createNodeType("ADerivedFromB")); - addNodeType(stNodeTypes, "ADerivedFromB", createNodeType("BDerivedFromC")); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setNode_types(stNodeTypes); - assertTrue(toscaAnalyzerService - .isTypeOf(nodeTemplateMock, "BDerivedFromC", serviceTemplate, toscaServiceModelMock)); - } - - private NodeType createNodeType(String derivedFrom) { - NodeType nodeType = new NodeType(); - nodeType.setDerived_from(derivedFrom); - return nodeType; - } - - private DataType createDataType(String derivedFrom) { - DataType dataType = new DataType(); - dataType.setDerived_from(derivedFrom); - return dataType; - } - - private InterfaceType createInterfaceType(String derivedFrom) { - InterfaceType interfaceType = new InterfaceType(); - interfaceType.setDerived_from(derivedFrom); - return interfaceType; - } - - private void addNodeType(Map<String, NodeType> stNodeTypes, String key, NodeType nodeType) { - stNodeTypes.put(key, nodeType); - } - - private void addDataType(Map<String, DataType> stDataTypes, String key, DataType dataType) { - stDataTypes.put(key, dataType); - } - - @Test - public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyButRequestedTypeNotMatchButFoundIn1stLevelImports() { - String typeToMatch = ToscaNodeType.CINDER_VOLUME; - when(nodeTemplateMock.getType()).thenReturn(typeToMatch); - ServiceTemplate mainST = new ServiceTemplate(); - List<Map<String, Import>> imports = new ArrayList<>(); - Map<String, Import> importMap = new HashMap<>(); - Import anImport = new Import(); - anImport.setFile("mainImport"); - importMap.put("bla bla", anImport); - imports.add(importMap); - mainST.setImports(imports); - - //create searchable service template - Map<String, NodeType> stNodeTypes = new HashMap<>(); - addNodeType(stNodeTypes, ToscaNodeType.NATIVE_COMPUTE, new NodeType()); - NodeType nodeType = createNodeType(ToscaNodeType.NATIVE_BLOCK_STORAGE); - addNodeType(stNodeTypes, typeToMatch, nodeType); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setNode_types(stNodeTypes); - - // add service templates to tosca service model - Map<String, ServiceTemplate> serviceTemplates = toscaServiceModelMock.getServiceTemplates(); - serviceTemplates.put("testMainServiceTemplate", mainST); - serviceTemplates.put("mainImport", serviceTemplate); - when(toscaServiceModelMock.getServiceTemplates()).thenReturn(serviceTemplates); - - assertTrue(toscaAnalyzerService - .isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_BLOCK_STORAGE, mainST, - toscaServiceModelMock)); - } - - @Test - public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyButRequestedTypeNotMatchButFoundIn2ndLevelImports() { - String typeToMatch = ToscaNodeType.CINDER_VOLUME; - when(nodeTemplateMock.getType()).thenReturn(typeToMatch); - ServiceTemplate mainST = new ServiceTemplate(); - List<Map<String, Import>> imports = new ArrayList<>(); - Map<String, Import> importMap = new HashMap<>(); - Import anImport = new Import(); - anImport.setFile("refToMainImport"); - importMap.put("bla bla", anImport); - imports.add(importMap); - mainST.setImports(imports); - - //create searchable service template - Map<String, NodeType> stNodeTypes = new HashMap<>(); - addNodeType(stNodeTypes, ToscaNodeType.NATIVE_COMPUTE, new NodeType()); - NodeType nodeType = createNodeType(ToscaNodeType.NATIVE_BLOCK_STORAGE); - addNodeType(stNodeTypes, typeToMatch, nodeType); - ServiceTemplate serviceTemplate = new ServiceTemplate(); - serviceTemplate.setNode_types(stNodeTypes); - - // create 1st level service template with import only - ServiceTemplate firstLevelST = new ServiceTemplate(); - List<Map<String, Import>> firstLevelImports = new ArrayList<>(); - Map<String, Import> firstLevelImportsMap = new HashMap<>(); - Import firstLevelImport = new Import(); - firstLevelImport.setFile("mainImport"); - firstLevelImportsMap.put("bla bla 2", firstLevelImport); - firstLevelImports.add(firstLevelImportsMap); - firstLevelST.setImports(firstLevelImports); - - // add service templates to tosca service model - Map<String, ServiceTemplate> serviceTemplates = toscaServiceModelMock.getServiceTemplates(); - serviceTemplates.put("testMainServiceTemplate", mainST); - serviceTemplates.put("refToMainImport", firstLevelST); - serviceTemplates.put("mainImport", serviceTemplate); - when(toscaServiceModelMock.getServiceTemplates()).thenReturn(serviceTemplates); - - assertTrue(toscaAnalyzerService - .isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_BLOCK_STORAGE, mainST, - toscaServiceModelMock)); - } - - // not found at all should throw core exception + private static ToscaAnalyzerService toscaAnalyzerService; + private static ToscaServiceModel toscaServiceModel; + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Mock + private NodeTemplate nodeTemplateMock; + @Mock + private ParameterDefinition parameterDefinitionMock; + @Mock + private PropertyDefinition propertyDefinitionMock; + @Mock + private InterfaceDefinitionType interfaceDefinitionMock; + @Mock + private ToscaServiceModel toscaServiceModelMock; + + @BeforeClass + public static void onlyOnceSetUp() throws IOException { + toscaAnalyzerService = new ToscaAnalyzerServiceImpl(); + toscaServiceModel = TestUtil.loadToscaServiceModel("/mock/analyzerService/toscasubstitution/", + "/mock/globalServiceTemplates/", null); + } + + @Before + public void init() throws IOException { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testGetFlatEntityNotFound() throws Exception { + thrown.expect(CoreException.class); + thrown.expectMessage( + "Entity Type 'org.openecomp.resource.vfc.notFound' or one of its derivedFrom type hierarchy, is not defined in tosca service model"); + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + toscaAnalyzerService.getFlatEntity(ToscaElementTypes.NODE_TYPE, "org.openecomp.resource.vfc.notFound", + serviceTemplateFromYaml, toscaServiceModel); + } + } + + @Test + public void testGetFlatEntityFileNotFound() throws Exception { + thrown.expect(CoreException.class); + thrown.expectMessage("Tosca file 'missingFile.yaml' was not found in tosca service model"); + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/ServiceTemplateFileNotFoundTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + toscaAnalyzerService + .getFlatEntity(ToscaElementTypes.NODE_TYPE, "org.openecomp.resource.vfc.nodes.heat.cmaui_image", + serviceTemplateFromYaml, toscaServiceModel); + } + } + + @Test + public void testGetFlatEntityNodeType() throws Exception { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + ToscaFlatData flatData = toscaAnalyzerService.getFlatEntity(ToscaElementTypes.NODE_TYPE, + "org.openecomp.resource.vfc.nodes.heat" + ".cmaui_image", serviceTemplateFromYaml, + toscaServiceModel); + + Assert.assertNotNull(flatData); + checkNodeTypeFlatEntity(flatData); + checkNodeTypeInheritanceHierarchy(flatData); + } + } + + private void checkNodeTypeInheritanceHierarchy(ToscaFlatData flatData) { + List<String> inheritanceHierarchyType = flatData.getInheritanceHierarchyType(); + Assert.assertNotNull(inheritanceHierarchyType); + Assert.assertEquals(4, inheritanceHierarchyType.size()); + Assert.assertEquals(true, + inheritanceHierarchyType.contains("org.openecomp.resource.vfc.nodes.heat.cmaui_image")); + Assert.assertEquals(true, + inheritanceHierarchyType.contains("org.openecomp.resource.vfc.nodes.heat.nova.Server")); + Assert.assertEquals(true, inheritanceHierarchyType.contains("tosca.nodes.Compute")); + Assert.assertEquals(true, inheritanceHierarchyType.contains("tosca.nodes.Root")); + } + + private void checkNodeTypeFlatEntity(ToscaFlatData flatData) { + Assert.assertNotNull(flatData.getFlatEntity()); + NodeType flatEntity = (NodeType) flatData.getFlatEntity(); + Assert.assertEquals("org.openecomp.resource.vfc.nodes.heat.nova.Server", flatEntity.getDerived_from()); + Assert.assertEquals(20, flatEntity.getProperties().size()); + Assert.assertEquals("overridden default value", flatEntity.getProperties().get("admin_pass").get_default()); + Assert.assertEquals("REBUILD", flatEntity.getProperties().get("image_update_policy").get_default()); + Assert.assertNotNull(flatEntity.getProperties().get("new_property")); + } + + @Test + public void testGetFlatEntityNodeTypeInterface() throws Exception { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/ServiceTemplateInterfaceInheritanceTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + ToscaFlatData flatData = toscaAnalyzerService.getFlatEntity(ToscaElementTypes.NODE_TYPE, + "org.openecomp.resource.vfc.nodes.heat.cmaui_image_extend", serviceTemplateFromYaml, + toscaServiceModel); + + Assert.assertNotNull(flatData); + Assert.assertNotNull(flatData.getFlatEntity()); + NodeType flatEntity = (NodeType) flatData.getFlatEntity(); + Assert.assertNotNull(flatEntity.getInterfaces()); + Object standardInterfaceObj = flatEntity.getInterfaces().get("Standard"); + Assert.assertNotNull(standardInterfaceObj); + Optional<InterfaceDefinitionType> standardInterface = DataModelUtil + .convertObjToInterfaceDefinition("Standard", + standardInterfaceObj, + InterfaceDefinitionType.class); + Assert.assertEquals(true, standardInterface.isPresent()); + Assert.assertEquals(2, standardInterface.get().getInputs().size()); + Assert.assertEquals(3, standardInterface.get().getOperations().size()); + OperationDefinitionType createOperation = toscaExtensionYamlUtil.yamlToObject( + toscaExtensionYamlUtil.objectToYaml(standardInterface.get().getOperations().get("create")), + OperationDefinitionType.class); + Assert.assertEquals(2, createOperation.getInputs().size()); + + List<String> inheritanceHierarchyType = flatData.getInheritanceHierarchyType(); + Assert.assertNotNull(inheritanceHierarchyType); + Assert.assertEquals(5, inheritanceHierarchyType.size()); + } + } + + + @Test + public void testGetFlatEntityDataType() throws Exception { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + ToscaFlatData flatData = toscaAnalyzerService.getFlatEntity(ToscaElementTypes.DATA_TYPE, + "org.openecomp.datatypes.heat.network.MyNewAddressPair", serviceTemplateFromYaml, + toscaServiceModel); + + Assert.assertNotNull(flatData); + Assert.assertNotNull(flatData.getFlatEntity()); + DataType flatEntity = (DataType) flatData.getFlatEntity(); + Assert.assertEquals("org.openecomp.datatypes.heat.network.MyAddressPair", flatEntity.getDerived_from()); + Assert.assertEquals(3, flatEntity.getProperties().size()); + Assert.assertEquals("overridden default value", + flatEntity.getProperties().get("mac_address").get_default()); + Assert.assertEquals(true, flatEntity.getProperties().get("mac_address").getRequired()); + Assert.assertNotNull(flatEntity.getProperties().get("new_property")); + + List<String> inheritanceHierarchyType = flatData.getInheritanceHierarchyType(); + Assert.assertNotNull(inheritanceHierarchyType); + Assert.assertEquals(4, inheritanceHierarchyType.size()); + } + } + + @Test + public void testCalculateExposedRequirements() throws Exception { + RequirementDefinition rd = new RequirementDefinition(); + rd.setCapability("tosca.capabilities.Node"); + rd.setNode("tosca.nodes.Root"); + rd.setRelationship("tosca.relationships.DependsOn"); + Object[] occurences = new Object[] {0, "UNBOUNDED"}; + rd.setOccurrences(occurences); + + RequirementDefinition rd1 = new RequirementDefinition(); + rd.setCapability("tosca.capabilities.network.Bindable"); + rd.setNode(null); + rd.setRelationship("tosca.relationships.network.BindsTo"); + Object[] occurences1 = new Object[] {1, 1}; + rd1.setOccurrences(occurences1); + + Map<String, RequirementDefinition> nodeTypeRequirementDefinition = new HashMap<>(); + nodeTypeRequirementDefinition.put("binding", rd1); + nodeTypeRequirementDefinition.put("dependency", rd); + + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = new HashMap<>(); + RequirementAssignment ra = new RequirementAssignment(); + ra.setCapability("tosca.capabilities.network.Bindable"); + ra.setNode("pd_server"); + ra.setRelationship("tosca.relationships.network.BindsTo"); + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment = new HashMap<>(); + nodeTemplateRequirementsAssignment.put("binding", ra); + + List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition = new ArrayList<>(); + nodeTypeRequirementsDefinition.add(nodeTypeRequirementDefinition); + + List<Map<String, RequirementDefinition>> exposedRequirements = toscaAnalyzerService + .calculateExposedRequirements( + nodeTypeRequirementsDefinition, + nodeTemplateRequirementsAssignment); + Assert.assertEquals(1, exposedRequirements.size()); + } + + @Test + public void testCalExpReqWithNullNodeInReqAssignment() throws Exception { + RequirementDefinition rd = new RequirementDefinition(); + rd.setCapability("tosca.capabilities.Node"); + rd.setNode("tosca.nodes.Root"); + rd.setRelationship("tosca.relationships.DependsOn"); + Object[] occurences = new Object[] {0, "UNBOUNDED"}; + rd.setOccurrences(occurences); + + RequirementDefinition rd1 = new RequirementDefinition(); + rd.setCapability("tosca.capabilities.network.Bindable"); + rd.setNode(null); + rd.setRelationship("tosca.relationships.network.BindsTo"); + Object[] occurences1 = new Object[] {1, 1}; + rd1.setOccurrences(occurences1); + + Map<String, RequirementDefinition> nodeTypeRequirementDefinition = new HashMap<>(); + nodeTypeRequirementDefinition.put("binding", rd1); + nodeTypeRequirementDefinition.put("dependency", rd); + + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = new HashMap<>(); + RequirementAssignment ra = new RequirementAssignment(); + ra.setCapability("tosca.capabilities.network.Bindable"); + ra.setNode(null); + ra.setRelationship("tosca.relationships.network.BindsTo"); + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment = new HashMap<>(); + nodeTemplateRequirementsAssignment.put("binding", ra); + + List<Map<String, RequirementDefinition>> nodeTypeRequirementsDefinition = new ArrayList<>(); + nodeTypeRequirementsDefinition.add(nodeTypeRequirementDefinition); + + List<Map<String, RequirementDefinition>> exposedRequirements = toscaAnalyzerService + .calculateExposedRequirements( + nodeTypeRequirementsDefinition, + nodeTemplateRequirementsAssignment); + Assert.assertEquals(1, exposedRequirements.size()); + } + + @Test + public void testCalculateExposedCapabilities() throws Exception { + Map<String, CapabilityDefinition> nodeTypeCapabilitiesDefinition = new HashMap<>(); + CapabilityDefinition cd = new CapabilityDefinition(); + cd.setType("tosca.capabilities.Scalable"); + nodeTypeCapabilitiesDefinition.put("tosca.capabilities.network.Bindable_pd_server", cd); + Map<String, RequirementAssignment> nodeTemplateRequirementsAssignment = new HashMap<>(); + RequirementAssignment ra = new RequirementAssignment(); + ra.setCapability("tosca.capabilities.network.Bindable"); + ra.setNode("pd_server"); + ra.setRelationship("tosca.relationships.network.BindsTo"); + nodeTemplateRequirementsAssignment.put("binding", ra); + Map<String, Map<String, RequirementAssignment>> fullFilledRequirementsDefinition = new HashMap<>(); + fullFilledRequirementsDefinition.put("pd_server", nodeTemplateRequirementsAssignment); + Map<String, CapabilityDefinition> exposedCapabilities = toscaAnalyzerService.calculateExposedCapabilities( + nodeTypeCapabilitiesDefinition, fullFilledRequirementsDefinition); + Assert.assertEquals(1, exposedCapabilities.size()); + } + + @Test + public void testIsRequirementExistsWithInvalidReqId() throws Exception { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + TestUtil.createConcreteRequirementObjectsInServiceTemplate(serviceTemplateFromYaml, toscaExtensionYamlUtil); + + + RequirementAssignment ra = new RequirementAssignment(); + ra.setCapability("tosca.capabilities.network.Bindable"); + ra.setNode("server_cmaui"); + ra.setRelationship("tosca.relationships.network.BindsTo"); + + NodeTemplate port0 = + serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui_port_0"); + //Test With Empty requirementId + Assert.assertEquals(false, toscaAnalyzerService.isRequirementExistInNodeTemplate(port0, "", ra)); + + //Test With valid requirementId + Assert.assertEquals(true, toscaAnalyzerService.isRequirementExistInNodeTemplate(port0, "binding", ra)); + + //Test With invalid requirement assignment + RequirementAssignment ra1 = new RequirementAssignment(); + ra1.setCapability("tosca.capabilities.network.Bindable1"); + ra1.setNode("server_cmaui1"); + ra1.setRelationship("tosca.relationships.network.BindsTo1"); + Assert.assertEquals(false, toscaAnalyzerService.isRequirementExistInNodeTemplate(port0, "binding", ra1)); + } + } + + @Test + public void testGetRequirements() throws Exception { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + NodeTemplate port0 = + serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui_port_0"); + List<RequirementAssignment> reqList = + toscaAnalyzerService.getRequirements(port0, ToscaConstants.BINDING_REQUIREMENT_ID); + assertEquals(1, reqList.size()); + + reqList.clear(); + NodeTemplate port1 = + serviceTemplateFromYaml.getTopology_template().getNode_templates().get("cmaui1_port_1"); + reqList = toscaAnalyzerService.getRequirements(port1, ToscaConstants.LINK_REQUIREMENT_ID); + assertEquals(2, reqList.size()); + + reqList.clear(); + reqList = toscaAnalyzerService.getRequirements(port0, ToscaConstants.LINK_REQUIREMENT_ID); + assertEquals(0, reqList.size()); + } + } + + @Test + public void testGetNodeTemplateById() throws Exception { + ServiceTemplate emptyServiceTemplate = new ServiceTemplate(); + Optional<NodeTemplate> nodeTemplate = + toscaAnalyzerService.getNodeTemplateById(emptyServiceTemplate, "test_net222"); + assertEquals(false, nodeTemplate.isPresent()); + + ServiceTemplate mainServiceTemplate = + toscaServiceModel.getServiceTemplates().get(toscaServiceModel.getEntryDefinitionServiceTemplate()); + nodeTemplate = toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net"); + assertEquals(true, nodeTemplate.isPresent()); + + nodeTemplate = toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net222"); + assertEquals(false, nodeTemplate.isPresent()); + } + + @Test + public void testGetSubstituteServiceTemplateName() throws Exception { + thrown.expect(CoreException.class); + thrown.expectMessage( + "Invalid Substitute Node Template invalid2, mandatory map property service_template_filter with mandatory key substitute_service_template must be defined."); + + Optional<String> substituteServiceTemplateName; + + ServiceTemplate mainServiceTemplate = + toscaServiceModel.getServiceTemplates().get(toscaServiceModel.getEntryDefinitionServiceTemplate()); + Optional<NodeTemplate> notSubstitutableNodeTemplate = + toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_net"); + assertEquals(true, notSubstitutableNodeTemplate.isPresent()); + + if (notSubstitutableNodeTemplate.isPresent()) { + substituteServiceTemplateName = toscaAnalyzerService.getSubstituteServiceTemplateName("test_net", + notSubstitutableNodeTemplate.get()); + assertEquals(false, substituteServiceTemplateName.isPresent()); + } + + Optional<NodeTemplate> substitutableNodeTemplate = + toscaAnalyzerService.getNodeTemplateById(mainServiceTemplate, "test_nested"); + assertEquals(true, substitutableNodeTemplate.isPresent()); + if (substitutableNodeTemplate.isPresent()) { + substituteServiceTemplateName = toscaAnalyzerService.getSubstituteServiceTemplateName("test_nested", + substitutableNodeTemplate.get()); + assertEquals(true, substituteServiceTemplateName.isPresent()); + assertEquals("nestedServiceTemplate.yaml", substituteServiceTemplateName.get()); + } + + NodeTemplate invalidSubstitutableNodeTemplate1 = new NodeTemplate(); + substituteServiceTemplateName = + toscaAnalyzerService.getSubstituteServiceTemplateName("invalid1", invalidSubstitutableNodeTemplate1); + assertEquals(false, substituteServiceTemplateName.isPresent()); + + substitutableNodeTemplate.ifPresent(nodeTemplate -> { + Object serviceTemplateFilter = + nodeTemplate.getProperties().get(ToscaConstants.SERVICE_TEMPLATE_FILTER_PROPERTY_NAME); + ((Map) serviceTemplateFilter).clear(); + toscaAnalyzerService.getSubstituteServiceTemplateName("invalid2", nodeTemplate); + + }); + } + + + @Test + public void testGetSubstitutableNodeTemplates() throws Exception { + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/ServiceTemplateSubstituteTest.yaml")) { + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + Map<String, NodeTemplate> substitutableNodeTemplates = + toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplateFromYaml); + assertEquals(2, substitutableNodeTemplates.size()); + assertNotNull(substitutableNodeTemplates.get("test_nested1")); + assertNotNull(substitutableNodeTemplates.get("test_nested2")); + + ServiceTemplate emptyServiceTemplate = new ServiceTemplate(); + emptyServiceTemplate.setTopology_template(new TopologyTemplate()); + substitutableNodeTemplates = toscaAnalyzerService.getSubstitutableNodeTemplates(emptyServiceTemplate); + assertEquals(0, substitutableNodeTemplates.size()); + } + + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + ServiceTemplate serviceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + Map<String, NodeTemplate> substitutableNodeTemplates = + toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplateFromYaml); + assertEquals(0, substitutableNodeTemplates.size()); + } + } + + @Test + public void testGetSubstitutionMappedNodeTemplateByExposedReq() throws Exception { + thrown.expect(CoreException.class); + thrown.expectMessage( + "Invalid Tosca model data, missing 'Node Template' entry for 'Node Template' id cmaui_port_9"); + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + ServiceTemplate nestedServiceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService + .getSubstitutionMappedNodeTemplateByExposedReq( + "NestedServiceTemplateSubstituteTest.yaml", + nestedServiceTemplateFromYaml, + "local_storage_server_cmaui"); + assertEquals(true, mappedNodeTemplate.isPresent()); + mappedNodeTemplate.ifPresent(stringNodeTemplateEntry -> { + assertEquals("server_cmaui", stringNodeTemplateEntry.getKey()); + assertNotNull(stringNodeTemplateEntry.getValue()); + }); + + mappedNodeTemplate = toscaAnalyzerService.getSubstitutionMappedNodeTemplateByExposedReq( + "NestedServiceTemplateSubstituteTest.yaml", nestedServiceTemplateFromYaml, + "link_cmaui_port_invalid"); + assertEquals(true, mappedNodeTemplate.isPresent()); + mappedNodeTemplate.ifPresent(stringNodeTemplateEntry -> { + assertEquals("server_cmaui", stringNodeTemplateEntry.getKey()); + assertNotNull(stringNodeTemplateEntry.getValue()); + }); + + ServiceTemplate mainServiceTemplate = + toscaServiceModel.getServiceTemplates().get(toscaServiceModel.getEntryDefinitionServiceTemplate()); + mappedNodeTemplate = toscaAnalyzerService.getSubstitutionMappedNodeTemplateByExposedReq( + toscaServiceModel.getEntryDefinitionServiceTemplate(), mainServiceTemplate, + "local_storage_server_cmaui"); + assertEquals(false, mappedNodeTemplate.isPresent()); + } + } + + @Test + public void invalidSubstitutableMapping() throws Exception { + thrown.expect(CoreException.class); + thrown.expectMessage( + "Invalid Substitution Service Template invalidMappingServiceTemplate.yaml, missing mandatory file 'Node type' in substitution mapping."); + ServiceTemplate invalidMappingServiceTemplate = new ServiceTemplate(); + invalidMappingServiceTemplate.setTopology_template(new TopologyTemplate()); + invalidMappingServiceTemplate.getTopology_template().setSubstitution_mappings(new SubstitutionMapping()); + toscaAnalyzerService.getSubstitutionMappedNodeTemplateByExposedReq("invalidMappingServiceTemplate.yaml", + invalidMappingServiceTemplate, "local_storage_server_cmaui"); + } + + @Test + public void substitutableMappingWithNoReqMap() throws Exception { + ServiceTemplate emptyReqMapping = new ServiceTemplate(); + emptyReqMapping.setTopology_template(new TopologyTemplate()); + emptyReqMapping.getTopology_template().setSubstitution_mappings(new SubstitutionMapping()); + emptyReqMapping.getTopology_template().getSubstitution_mappings().setNode_type("temp"); + ServiceTemplate mainServiceTemplate = + toscaServiceModel.getServiceTemplates().get(toscaServiceModel.getEntryDefinitionServiceTemplate()); + Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService + .getSubstitutionMappedNodeTemplateByExposedReq( + toscaServiceModel + .getEntryDefinitionServiceTemplate(), + mainServiceTemplate, + "local_storage_server_cmaui"); + assertEquals(false, mappedNodeTemplate.isPresent()); + } + + @Test + public void testGetSubstitutionMappedNodeTemplateByExposedReqInvalid() throws Exception { + thrown.expect(CoreException.class); + thrown.expectMessage( + "Invalid Tosca model data, missing 'Node Template' entry for 'Node Template' id cmaui_port_9"); + ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil(); + try (InputStream yamlFile = toscaExtensionYamlUtil.loadYamlFileIs( + "/mock/analyzerService/NestedServiceTemplateReqTest.yaml")) { + ServiceTemplate nestedServiceTemplateFromYaml = + toscaExtensionYamlUtil.yamlToObject(yamlFile, ServiceTemplate.class); + + toscaAnalyzerService + .getSubstitutionMappedNodeTemplateByExposedReq("NestedServiceTemplateSubstituteTest.yaml", + nestedServiceTemplateFromYaml, "link_cmaui_port_invalid"); + } + } + + @Test + public void testIsDesiredRequirementAssignmentMatch() throws Exception { + + RequirementAssignment requirementAssignment = new RequirementAssignment(); + String capability = "Test.Capability"; + String node = "Test.node"; + String relationship = "Test.relationship"; + requirementAssignment.setCapability(capability); + requirementAssignment.setNode(node); + requirementAssignment.setRelationship(relationship); + + assertEquals(true, toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, node, + relationship)); + assertEquals(true, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, null, node, relationship)); + assertEquals(true, toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, null, + relationship)); + assertEquals(true, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, node, null)); + assertEquals(true, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, null, null, relationship)); + assertEquals(true, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, null, null)); + assertEquals(true, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, null, node, null)); + + } + + @Test + public void testIsDesiredRequirementAssignmentNoMatch() throws Exception { + + RequirementAssignment requirementAssignment = new RequirementAssignment(); + String capability = "Test.Capability"; + String node = "Test.node"; + String relationship = "Test.relationship"; + requirementAssignment.setCapability(capability); + requirementAssignment.setNode(node); + requirementAssignment.setRelationship(relationship); + + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, "no", node, relationship)); + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, "no", "no", relationship)); + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, "no", "no", "no")); + assertEquals(false, toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, "no", + relationship)); + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, node, "no")); + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, capability, "no", "no")); + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, "no", null, null)); + assertEquals(false, + toscaAnalyzerService.isDesiredRequirementAssignment(requirementAssignment, null, null, null)); + + + } + + @Test + public void shouldReturnFalseIfNdTmpIsNull() { + NodeTemplate nodeTemplate = null; + assertFalse(toscaAnalyzerService.isTypeOf(nodeTemplate, ToscaNodeType.NATIVE_NETWORK, new ServiceTemplate(), + toscaServiceModelMock)); + } + + @Test + public void shouldReturnTrueIfNdTmpTypeIsOfRequestedType() { + NodeTemplate nodeTemplate = new NodeTemplate(); + String nodeTypeToSearch = ToscaNodeType.NATIVE_BLOCK_STORAGE; + nodeTemplate.setType(nodeTypeToSearch); + assertTrue(toscaAnalyzerService + .isTypeOf(nodeTemplate, nodeTypeToSearch, new ServiceTemplate(), toscaServiceModelMock)); + } + + @Test + public void shouldReturnTrueIfDataTypeIsOfRequestedType() { + PropertyDefinition propertyDefinition = new PropertyDefinition(); + String propertyTypeToSearch = "tosca.datatypes.TimeInterval"; + propertyDefinition.setType(propertyTypeToSearch); + assertTrue(toscaAnalyzerService.isTypeOf(propertyDefinition, propertyTypeToSearch, new ServiceTemplate(), + toscaServiceModelMock)); + } + + @Test + public void shouldReturnTrueIfInterfaceTypeIsOfRequestedType() { + InterfaceDefinitionType interfaceDefinition = new InterfaceDefinitionType(); + String interfaceTypeToSearch = "test.interface.A"; + interfaceDefinition.setType(interfaceTypeToSearch); + assertTrue(toscaAnalyzerService.isTypeOf(interfaceDefinition, interfaceTypeToSearch, new ServiceTemplate(), + toscaServiceModelMock)); + } + + @Test + public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyAndNdTyDerivedFromRequestedType() { + String typeToMatch = ToscaNodeType.CINDER_VOLUME; + when(nodeTemplateMock.getType()).thenReturn(typeToMatch); + Map<String, NodeType> stNodeTypes = new HashMap<>(); + addNodeType(stNodeTypes, ToscaNodeType.NATIVE_COMPUTE, new NodeType()); + NodeType nodeType = createNodeType(ToscaNodeType.NATIVE_BLOCK_STORAGE); + addNodeType(stNodeTypes, typeToMatch, nodeType); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setNode_types(stNodeTypes); + assertTrue(toscaAnalyzerService.isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_BLOCK_STORAGE, serviceTemplate, + toscaServiceModelMock)); + + } + + @Test + public void dataTypeParameterExistInHierarchy() { + String testedDataTypeKey = "test.dataType.B"; + when(parameterDefinitionMock.getType()).thenReturn(testedDataTypeKey); + dataTypeExistInHierarchy(testedDataTypeKey, parameterDefinitionMock); + + } + + @Test + public void dataTypePropertyExistInHierarchy() { + String testedDataTypeKey = "test.dataType.B"; + when(propertyDefinitionMock.getType()).thenReturn(testedDataTypeKey); + dataTypeExistInHierarchy(testedDataTypeKey, propertyDefinitionMock); + } + + private void dataTypeExistInHierarchy(String testedDataTypeKey, DefinitionOfDataType testedDefinitionDataType) { + String typeToMatch = "test.dataType.A"; + Map<String, DataType> stDataTypes = new HashMap<>(); + addDataType(stDataTypes, "tosca.datatypes.network.NetworkInfo", new DataType()); + DataType testedDataType = createDataType(typeToMatch); + addDataType(stDataTypes, testedDataTypeKey, testedDataType); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setData_types(stDataTypes); + assertTrue(toscaAnalyzerService + .isTypeOf(testedDefinitionDataType, typeToMatch, serviceTemplate, toscaServiceModelMock)); + } + + @Test + public void interfaceTypeExistInHierarchy() { + String typeToMatch = "test.interfaceType.A"; + String testedInterfaceTypeKey = "test.interfaceType.B"; + when(interfaceDefinitionMock.getType()).thenReturn(testedInterfaceTypeKey); + Map<String, Object> stInterfaceTypes = new HashMap<>(); + stInterfaceTypes.put("tosca.interfaces.network.NetworkInfo", new InterfaceType()); + InterfaceType testedInterfaceType = createInterfaceType(typeToMatch); + stInterfaceTypes.put(testedInterfaceTypeKey, testedInterfaceType); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setInterface_types(stInterfaceTypes); + assertTrue(toscaAnalyzerService.isTypeOf(interfaceDefinitionMock, "test.interfaceType.A", serviceTemplate, + toscaServiceModelMock)); + } + + @Test + public void shouldThrowCoreExceptionForInvalidNodeType() { + thrown.expect(CoreException.class); + thrown.expectMessage("Entity Type 'AAA' or one of its derivedFrom type hierarchy, is not defined in " + + "tosca service model"); + when(nodeTemplateMock.getType()).thenReturn("AAA"); + Map<String, NodeType> stNodeTypes = new HashMap<>(); + addNodeType(stNodeTypes, "notImportant", new NodeType()); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setNode_types(stNodeTypes); + toscaAnalyzerService + .isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_COMPUTE, serviceTemplate, toscaServiceModelMock); + } + + @Test + public void shouldThrowCoreExceptionForInvalidNodeType2Level() { + thrown.expect(CoreException.class); + thrown.expectMessage( + "Entity Type 'A' or one of its derivedFrom type hierarchy, is not defined in tosca " + "service model"); + String typeToMatch = "A"; + when(nodeTemplateMock.getType()).thenReturn(typeToMatch); + Map<String, NodeType> stNodeTypes = new HashMap<>(); + addNodeType(stNodeTypes, "notImportant", new NodeType()); + addNodeType(stNodeTypes, "A", createNodeType("ADerivedFromB")); + addNodeType(stNodeTypes, "ADerivedFromB'", createNodeType("BDerivedFromC")); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setNode_types(stNodeTypes); + assertTrue(toscaAnalyzerService + .isTypeOf(nodeTemplateMock, "BDerivedFromC", serviceTemplate, toscaServiceModelMock)); + } + + @Test + public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyAndNotDerivedFromRequestedTypeBut2ndLevelDerivedFromMatch() { + String typeToMatch = "A"; + when(nodeTemplateMock.getType()).thenReturn(typeToMatch); + Map<String, NodeType> stNodeTypes = new HashMap<>(); + addNodeType(stNodeTypes, "notImportant", new NodeType()); + addNodeType(stNodeTypes, "A", createNodeType("ADerivedFromB")); + addNodeType(stNodeTypes, "ADerivedFromB", createNodeType("BDerivedFromC")); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setNode_types(stNodeTypes); + assertTrue(toscaAnalyzerService + .isTypeOf(nodeTemplateMock, "BDerivedFromC", serviceTemplate, toscaServiceModelMock)); + } + + private NodeType createNodeType(String derivedFrom) { + NodeType nodeType = new NodeType(); + nodeType.setDerived_from(derivedFrom); + return nodeType; + } + + private DataType createDataType(String derivedFrom) { + DataType dataType = new DataType(); + dataType.setDerived_from(derivedFrom); + return dataType; + } + + private InterfaceType createInterfaceType(String derivedFrom) { + InterfaceType interfaceType = new InterfaceType(); + interfaceType.setDerived_from(derivedFrom); + return interfaceType; + } + + private void addNodeType(Map<String, NodeType> stNodeTypes, String key, NodeType nodeType) { + stNodeTypes.put(key, nodeType); + } + + private void addDataType(Map<String, DataType> stDataTypes, String key, DataType dataType) { + stDataTypes.put(key, dataType); + } + + @Test + public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyButRequestedTypeNotMatchButFoundIn1stLevelImports() { + String typeToMatch = ToscaNodeType.CINDER_VOLUME; + when(nodeTemplateMock.getType()).thenReturn(typeToMatch); + List<Map<String, Import>> imports = new ArrayList<>(); + Map<String, Import> importMap = new HashMap<>(); + Import anImport = new Import(); + anImport.setFile("mainImport"); + importMap.put("bla bla", anImport); + imports.add(importMap); + ServiceTemplate mainST = new ServiceTemplate(); + mainST.setImports(imports); + + //create searchable service template + Map<String, NodeType> stNodeTypes = new HashMap<>(); + addNodeType(stNodeTypes, ToscaNodeType.NATIVE_COMPUTE, new NodeType()); + NodeType nodeType = createNodeType(ToscaNodeType.NATIVE_BLOCK_STORAGE); + addNodeType(stNodeTypes, typeToMatch, nodeType); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setNode_types(stNodeTypes); + + // add service templates to tosca service model + Map<String, ServiceTemplate> serviceTemplates = toscaServiceModelMock.getServiceTemplates(); + serviceTemplates.put("testMainServiceTemplate", mainST); + serviceTemplates.put("mainImport", serviceTemplate); + when(toscaServiceModelMock.getServiceTemplates()).thenReturn(serviceTemplates); + + assertTrue(toscaAnalyzerService.isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_BLOCK_STORAGE, mainST, + toscaServiceModelMock)); + } + + @Test + public void shouldReturnTrueIfNdTmpTypeIsFoundInSrvTmpNdTyButRequestedTypeNotMatchButFoundIn2ndLevelImports() { + String typeToMatch = ToscaNodeType.CINDER_VOLUME; + when(nodeTemplateMock.getType()).thenReturn(typeToMatch); + List<Map<String, Import>> imports = new ArrayList<>(); + Map<String, Import> importMap = new HashMap<>(); + Import anImport = new Import(); + anImport.setFile("refToMainImport"); + importMap.put("bla bla", anImport); + imports.add(importMap); + ServiceTemplate mainST = new ServiceTemplate(); + mainST.setImports(imports); + + //create searchable service template + Map<String, NodeType> stNodeTypes = new HashMap<>(); + addNodeType(stNodeTypes, ToscaNodeType.NATIVE_COMPUTE, new NodeType()); + NodeType nodeType = createNodeType(ToscaNodeType.NATIVE_BLOCK_STORAGE); + addNodeType(stNodeTypes, typeToMatch, nodeType); + ServiceTemplate serviceTemplate = new ServiceTemplate(); + serviceTemplate.setNode_types(stNodeTypes); + + // create 1st level service template with import only + List<Map<String, Import>> firstLevelImports = new ArrayList<>(); + Map<String, Import> firstLevelImportsMap = new HashMap<>(); + Import firstLevelImport = new Import(); + firstLevelImport.setFile("mainImport"); + firstLevelImportsMap.put("bla bla 2", firstLevelImport); + firstLevelImports.add(firstLevelImportsMap); + ServiceTemplate firstLevelST = new ServiceTemplate(); + firstLevelST.setImports(firstLevelImports); + + // add service templates to tosca service model + Map<String, ServiceTemplate> serviceTemplates = toscaServiceModelMock.getServiceTemplates(); + serviceTemplates.put("testMainServiceTemplate", mainST); + serviceTemplates.put("refToMainImport", firstLevelST); + serviceTemplates.put("mainImport", serviceTemplate); + when(toscaServiceModelMock.getServiceTemplates()).thenReturn(serviceTemplates); + + assertTrue(toscaAnalyzerService.isTypeOf(nodeTemplateMock, ToscaNodeType.NATIVE_BLOCK_STORAGE, mainST, + toscaServiceModelMock)); + } + // not found at all should throw core exception } diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/analyzerService/ServiceTemplateInterfaceInheritanceTest.yaml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/analyzerService/ServiceTemplateInterfaceInheritanceTest.yaml new file mode 100644 index 0000000000..4abc7ca681 --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/analyzerService/ServiceTemplateInterfaceInheritanceTest.yaml @@ -0,0 +1,232 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +metadata: + template_name: nested +imports: +- NovaServerGlobalTypes: + file: NovaServerGlobalTypesServiceTemplate.yaml +node_types: + org.openecomp.resource.vfc.nodes.heat.cmaui_image: + derived_from: org.openecomp.resource.vfc.nodes.heat.nova.Server + properties: + admin_pass: + description: The administrator password for the server + type: string + status: SUPPORTED + default: overridden default value + required: false + new_property: + description: new property + type: string + status: SUPPORTED + required: false + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + inputs: + url_path: + type: string + interfaceID: + type: string + create: + inputs: + peering: + type: string + config: + inputs: + name: + type: string + org.openecomp.resource.vfc.nodes.heat.cmaui_image_extend: + derived_from: org.openecomp.resource.vfc.nodes.heat.cmaui_image + interfaces: + Standard: + inputs: + url_path: + type: string + required: false + type: tosca.interfaces.node.lifecycle.Standard + create: + inputs: + peeringSessions: + type: string + name: + type: string + start: + inputs: + time: + type: string + +data_types: + org.openecomp.datatypes.heat.network.MyAddressPair: + derived_from: org.openecomp.datatypes.heat.network.AddressPair + description: My MAC/IP address pairs + properties: + mac_address: + description: MAC address + type: string + status: SUPPORTED + required: false + default: overridden default value + new_property: + description: new property + type: string + status: SUPPORTED + required: false + org.openecomp.datatypes.heat.network.MyNewAddressPair: + derived_from: org.openecomp.datatypes.heat.network.MyAddressPair + description: My new MAC/IP address pairs + properties: + mac_address: + description: MAC address + type: string + status: SUPPORTED + required: true + default: overridden default value +topology_template: + inputs: + cmaui_names: + hidden: false + immutable: false + type: list + description: CMAUI1, CMAUI2 server names + entry_schema: + type: String + p1: + hidden: false + immutable: false + type: string + description: UID of OAM network + cmaui_image: + hidden: false + immutable: false + type: string + description: Image for CMAUI server + cmaui_flavor: + hidden: false + immutable: false + type: string + description: Flavor for CMAUI server + security_group_name: + hidden: false + immutable: false + description: not impotrtant + availability_zone_0: + label: availabilityzone name + hidden: false + immutable: false + type: string + description: availabilityzone name + node_templates: + server_cmaui: + type: org.openecomp.resource.vfc.nodes.heat.cmaui_image + properties: + flavor: + get_input: cmaui_flavor + availability_zone: + get_input: availability_zone_0 + image: + get_input: cmaui_image + name: + get_input: + - cmaui_names + - 0 + cmaui_port_0: + type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port + properties: + replacement_policy: AUTO + security_groups: + - get_input: security_group_name + fixed_ips: + - ip_address: + get_input: + - cmaui_oam_ips + - 0 + network: + get_input: p1 + requirements: + - binding: + capability: tosca.capabilities.network.Bindable + node: server_cmaui + relationship: tosca.relationships.network.BindsTo + cmaui1_port_1: + type: org.openecomp.resource.cp.nodes.heat.network.neutron.Port + properties: + replacement_policy: AUTO + security_groups: + - get_input: security_group_name + fixed_ips: + - subnet: subnetNameVal + ip_address: + get_input: + - cmaui_oam_ips + - 1 + - subnet: subnetNameVal2 + ip_address: + get_input: + - cmaui_oam_ips + - 1 + network: jsa_net + requirements: + - link: + capability: tosca.capabilities.network.Linkable + node: jsa_net1 + relationship: tosca.relationships.network.LinksTo + - link: + capability: tosca.capabilities.network.Linkable + node: jsa_net2 + relationship: tosca.relationships.network.LinksTo + - binding: + capability: tosca.capabilities.network.Bindable + node: server_cmaui + relationship: tosca.relationships.network.BindsTo + jsa_net1: + type: org.openecomp.resource.vl.nodes.heat.network.neutron.Net + properties: + shared: true + network_name: + get_input: jsa_net_name + jsa_net2: + type: org.openecomp.resource.vl.nodes.heat.network.neutron.Net + properties: + shared: true + network_name: + get_input: jsa_net_name + groups: + nested: + type: org.openecomp.groups.heat.HeatStack + properties: + heat_file: ../Artifacts/nested.yml + description: cmaui server template for vMMSC + members: + - server_cmaui + - cmaui_port_0 + substitution_mappings: + node_type: org.openecomp.resource.abstract.nodes.heat.nested + capabilities: + host_server_cmaui: + - server_cmaui + - host + os_server_cmaui: + - server_cmaui + - os + endpoint_server_cmaui: + - server_cmaui + - endpoint + binding_server_cmaui: + - server_cmaui + - binding + scalable_server_cmaui: + - server_cmaui + - scalable + attachment_cmaui_port_0: + - cmaui_port_0 + - attachment + requirements: + local_storage_server_cmaui: + - server_cmaui + - local_storage + link_cmaui_port_0: + - cmaui_port_0 + - link + link_cmaui_port_invalid: + - cmaui_port_9 + - link diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/CommonGlobalTypesServiceTemplate.yaml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/CommonGlobalTypesServiceTemplate.yaml index 1a183e9c50..5b85d5047b 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/CommonGlobalTypesServiceTemplate.yaml +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/CommonGlobalTypesServiceTemplate.yaml @@ -3,6 +3,9 @@ metadata: template_name: CommonGlobalTypes template_version: 1.0.0 description: TOSCA Global Types +imports: +- toscaIndex: + file: _index.yml data_types: org.openecomp.datatypes.heat.network.AddressPair: derived_from: tosca.datatypes.Root diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/_index.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/_index.yml new file mode 100644 index 0000000000..1ad0aa3a2d --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/_index.yml @@ -0,0 +1,37 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: _index.yml + version: '1.0' + +imports: +- capabilities: + file: capabilities.yml +- nodes: + file: nodes.yml +- relationships: + file: relationships.yml +- groups: + file: groups.yml +- data: + file: data.yml +- interfaces: + file: interfaces.yml +- artifacts: + file: artifacts.yml +- policies: + file: policies.yml
\ No newline at end of file diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/artifacts.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/artifacts.yml new file mode 100644 index 0000000000..8f69e5ebb7 --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/artifacts.yml @@ -0,0 +1,55 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: artifacts.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +artifact_types: + tosca.artifacts.Root: + description: This is the default (root) TOSCA Artifact Type definition that all other TOSCA base Artifact Types derive from. + + tosca.artifacts.Deployment.Image: + derived_from: tosca.artifacts.Deployment + description: This artifact type represents a parent type for any "image" which is an opaque packaging of a TOSCA Node's deployment (whether real or virtual) whose contents are typically already installed and pre-configured (i.e., "stateful") and prepared to be run on a known target container. + + tosca.artifacts.Implementation.Bash: + derived_from: tosca.artifacts.Implementation + description: This artifact type represents a Bash script type that contains Bash commands that can be executed on the Unix Bash shell. + + tosca.artifacts.Deployment.Image.VM: + derived_from: tosca.artifacts.Deployment + description: This artifact represents the parent type for all Virtual Machine (VM) image and container formatted deployment artifacts. These images contain a stateful capture of a machine (e.g., server) including operating system and installed software along with any configurations and can be run on another machine using a hypervisor which virtualizes typical server (i.e., hardware) resources. + + tosca.artifacts.Implementation.Python: + derived_from: tosca.artifacts.Implementation + description: This artifact type represents a Python file that contains Python language constructs that can be executed within a Python interpreter. + + tosca.artifacts.Deployment: + derived_from: tosca.artifacts.Root + description: This artifact type represents the parent type for all deployment artifacts in TOSCA. This class of artifacts typically represents a binary packaging of an application or service that is used to install/create or deploy it as part of a node's lifecycle. + + tosca.artifacts.File: + derived_from: tosca.artifacts.Root + description: This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type). + + tosca.artifacts.Implementation: + derived_from: tosca.artifacts.Root + description: This artifact type represents the parent type for all implementation artifacts in TOSCA. These artifacts are used to implement operations of TOSCA interfaces either directly (e.g., scripts) or indirectly (e.g., config. files). diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/capabilities.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/capabilities.yml new file mode 100644 index 0000000000..31653d927a --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/capabilities.yml @@ -0,0 +1,230 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: capabilities.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +capability_types: + tosca.capabilities.Root: + description: This is the default (root) TOSCA Capability Type definition that all other TOSCA Capability Types derive from. + + tosca.capabilities.Node: + derived_from: tosca.capabilities.Root + description: The Node capability indicates the base capabilities of a TOSCA Node Type. + + tosca.capabilities.Container: + derived_from: tosca.capabilities.Root + description: The Container capability, when included on a Node Type or Template definition, indicates that the node can act as a container for (or a host for) one or more other declared Node Types. + properties: + num_cpus: + description: Number of (actual or virtual) CPUs associated with the Compute node. + type: integer + required: false + constraints: + - greater_or_equal: 1 + cpu_frequency: + description: Specifies the operating frequency of CPU's core. This property expresses the expected frequency of one (1) CPU as provided by the property "num_cpus". + type: scalar-unit.frequency + required: false + constraints: + - greater_or_equal: 0.1 GHz + disk_size: + description: Size of the local disk available to applications running on the Compute node (default unit is MB). + type: scalar-unit.size + required: false + constraints: + - greater_or_equal: 0 MB + mem_size: + description: Size of memory available to applications running on the Compute node (default unit is MB). + type: scalar-unit.size + required: false + constraints: + - greater_or_equal: 0 MB + + tosca.capabilities.Endpoint: + derived_from: tosca.capabilities.Root + description: This is the default TOSCA type that should be used or extended to define a network endpoint capability. This includes the information to express a basic endpoint with a single port or a complex endpoint with multiple ports. By default the Endpoint is assumed to represent an address on a private network unless otherwise specified. + properties: + protocol: + description: 'The name of the protocol (i.e., the protocol prefix) that the + endpoint accepts (any OSI Layer 4-7 protocols). Examples: http, https, ftp, + tcp, udp, etc.' + type: string + default: tcp + required: true + port: + description: The optional port of the endpoint. + type: tosca.datatypes.network.PortDef + required: false + secure: + description: Requests for the endpoint to be secure and use credentials supplied on the ConnectsTo relationship. + type: boolean + default: false + required: false + url_path: + description: The optional URL path of the endpoint's address if applicable for the protocol. + type: string + required: false + port_name: + description: The optional name (or ID) of the network port this endpoint should be bound to. + type: string + required: false + network_name: + description: 'The optional name (or ID) of the network this endpoint should + be bound to. network_name: PRIVATE | PUBLIC | <network_name> | <network_id>.' + type: string + default: PRIVATE + required: false + initiator: + description: The optional indicator of the direction of the connection. + type: string + default: source + required: false + constraints: + - valid_values: + - source + - target + - peer + ports: + description: The optional map of ports the Endpoint supports (if more than one). + type: map + entry_schema: + type: tosca.datatypes.network.PortSpec + required: false + constraints: + - min_length: 1 + attributes: + ip_address: + description: 'Note: This is the IP address as propagated up by the associated + node''s host (Compute) container.' + type: string + + tosca.capabilities.Endpoint.Public: + derived_from: tosca.capabilities.Endpoint + description: |- + This capability represents a public endpoint which is accessible to the general internet (and its public IP address ranges). + This public endpoint capability also can be used to create a floating (IP) address that the underlying network assigns from a pool allocated from the application's underlying public network. This floating address is managed by the underlying network such that can be routed an application's private address and remains reliable to internet clients. + properties: + network_name: + type: string + default: PUBLIC + constraints: + - equal: PUBLIC + + tosca.capabilities.Endpoint.Admin: + derived_from: tosca.capabilities.Endpoint + description: This is the default TOSCA type that should be used or extended to define a specialized administrator endpoint capability. + properties: + secure: + description: Requests for the endpoint to be secure and use credentials supplied on the ConnectsTo relationship. + type: boolean + default: true + constraints: + - equal: true + + tosca.capabilities.Endpoint.Database: + derived_from: tosca.capabilities.Endpoint + description: This is the default TOSCA type that should be used or extended to define a specialized database endpoint capability. + + tosca.capabilities.Attachment: + derived_from: tosca.capabilities.Root + description: This is the default TOSCA type that should be used or extended to define an attachment capability of a (logical) infrastructure device node (e.g., BlockStorage node). + + tosca.capabilities.OperatingSystem: + derived_from: tosca.capabilities.Root + description: This is the default TOSCA type that should be used to express an Operating System capability for a node. + properties: + architecture: + description: 'The Operating System (OS) architecture. Examples of valid values + include: x86_32, x86_64, etc.' + type: string + required: false + type: + description: 'The Operating System (OS) type. Examples of valid values include: + linux, aix, mac, windows, etc.' + type: string + required: false + distribution: + description: 'The Operating System (OS) distribution. Examples of valid values + for a "type" of "Linux" would include: debian, fedora, rhel and ubuntu.' + type: string + required: false + version: + description: The Operating System version. + type: version + required: false + + tosca.capabilities.Scalable: + derived_from: tosca.capabilities.Root + description: This is the default TOSCA type that should be used to express a scalability capability for a node. + properties: + min_instances: + description: This property is used to indicate the minimum number of instances that should be created for the associated TOSCA Node Template by a TOSCA orchestrator. + type: integer + default: 1 + max_instances: + description: This property is used to indicate the maximum number of instances that should be created for the associated TOSCA Node Template by a TOSCA orchestrator. + type: integer + default: 1 + default_instances: + description: 'An optional property that indicates the requested default number + of instances that should be the starting number of instances a TOSCA orchestrator + should attempt to allocate. Note: The value for this property MUST be in + the range between the values set for "min_instances" and "max_instances" + properties.' + type: integer + required: false + + tosca.capabilities.network.Bindable: + derived_from: tosca.capabilities.Node + description: A node type that includes the Bindable capability indicates that it can be bound to a logical network association via a network port. + + tosca.capabilities.network.Linkable: + derived_from: tosca.capabilities.Node + description: A node type that includes the Linkable capability indicates that it can be pointed by tosca.relationships.network.LinksTo relationship type. + + tosca.capabilities.Container.Docker: + derived_from: tosca.capabilities.Container + properties: + version: + type: list + entry_schema: + type: version + required: false + publish_all: + type: boolean + default: false + required: false + publish_ports: + type: list + entry_schema: + type: PortSpec + required: false + expose_ports: + type: list + entry_schema: + type: PortSpec + required: false + volumes: + type: list + entry_schema: + type: string + required: false diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/data.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/data.yml new file mode 100644 index 0000000000..3197845dfd --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/data.yml @@ -0,0 +1,191 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: data.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +data_types: + tosca.datatypes.Root: + description: The TOSCA root Data Type all other TOSCA base Data Types derive from + + string: + derived_from: tosca.datatypes.Root + + integer: + derived_from: tosca.datatypes.Root + + boolean: + derived_from: tosca.datatypes.Root + + float: + derived_from: tosca.datatypes.Root + + range: + derived_from: tosca.datatypes.Root + + list: + derived_from: tosca.datatypes.Root + + map: + derived_from: tosca.datatypes.Root + + timestamp: + derived_from: tosca.datatypes.Root + + version: + derived_from: tosca.datatypes.Root + + scalar-unit.size: + derived_from: tosca.datatypes.Root + + scalar-unit.frequency: + derived_from: tosca.datatypes.Root + + scalar-unit.time: + derived_from: tosca.datatypes.Root + + tosca.datatypes.network.NetworkInfo: + derived_from: tosca.datatypes.Root + description: The Network type is a complex TOSCA data type used to describe logical network information. + properties: + network_name: + description: The name of the logical network. e.g., "public", "private", "admin". etc. + type: string + required: false + network_id: + description: The unique ID of for the network generated by the network provider. + type: string + required: false + addresses: + description: The list of IP addresses assigned from the underlying network. + type: list + entry_schema: + type: string + required: false + + tosca.datatypes.TimeInterval: + derived_from: tosca.datatypes.Root + properties: + start_time: + type: timestamp + required: true + end_time: + type: timestamp + required: true + + tosca.datatypes.network.PortSpec: + derived_from: tosca.datatypes.Root + description: The PortSpec type is a complex TOSCA data Type used when describing port specifications for a network connection. + properties: + protocol: + description: The required protocol used on the port. + type: string + default: tcp + constraints: + - valid_values: + - udp + - tcp + - igmp + source: + description: The optional source port. + type: tosca.datatypes.network.PortDef + required: false + source_range: + description: The optional range for source port. + type: range + required: false + constraints: + - in_range: + - 1 + - 65535 + target: + description: The optional target port. + type: tosca.datatypes.network.PortDef + required: false + target_range: + description: The optional range for target port. + type: range + required: false + constraints: + - in_range: + - 1 + - 65535 + + tosca.datatypes.network.PortDef: + derived_from: integer + description: The PortDef type is a TOSCA data Type used to define a network port. + constraints: + - in_range: + - 1 + - 65535 + + tosca.datatypes.network.PortInfo: + derived_from: tosca.datatypes.Root + description: The PortInfo type is a complex TOSCA data type used to describe network port information. + properties: + port_name: + description: The logical network port name. + type: string + required: false + port_id: + description: The unique ID for the network port generated by the network provider. + type: string + required: false + network_id: + description: The unique ID for the network. + type: string + required: false + mac_address: + description: The unique media access control address (MAC address) assigned to the port. + type: string + required: false + addresses: + description: The list of IP address(es) assigned to the port. + type: list + entry_schema: + type: string + required: false + + tosca.datatypes.Credential: + derived_from: tosca.datatypes.Root + description: The Credential type is a complex TOSCA data Type used when describing authorization credentials used to access network accessible resources. + properties: + protocol: + description: The optional protocol name. + type: string + required: false + token_type: + description: The required token type. + type: string + default: password + token: + description: The required token used as a credential for authorization or access to a networked resource. + type: string + keys: + description: The optional list of protocol-specific keys or assertions. + type: map + entry_schema: + type: string + required: false + user: + description: The optional user (name or ID) used for non-token based credentials. + type: string + required: false diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/groups.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/groups.yml new file mode 100644 index 0000000000..e7e7417baa --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/groups.yml @@ -0,0 +1,30 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: groups.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +group_types: + tosca.groups.Root: + description: This is the default (root) TOSCA Group Type definition that all other TOSCA base Group Types derive from. + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/interfaces.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/interfaces.yml new file mode 100644 index 0000000000..75a8760791 --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/interfaces.yml @@ -0,0 +1,61 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: interfaces.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +interface_types: + tosca.interfaces.Root: + description: This is the default (root) TOSCA Interface Type definition that all other TOSCA Interface Types derive from. + + tosca.interfaces.node.lifecycle.Standard: + derived_from: tosca.interfaces.Root + description: This lifecycle interface defines the essential, normative operations that TOSCA nodes may support. + stop: + description: Standard lifecycle stop operation. + start: + description: Standard lifecycle start operation. + create: + description: Standard lifecycle create operation. + configure: + description: Standard lifecycle configure operation. + delete: + description: Standard lifecycle delete operation. + + tosca.interfaces.relationship.Configure: + derived_from: tosca.interfaces.Root + description: The lifecycle interfaces define the essential, normative operations that each TOSCA Relationship Types may support. + pre_configure_source: + description: Operation to pre-configure the source endpoint. + pre_configure_target: + description: Operation to pre-configure the target endpoint. + post_configure_source: + description: Operation to post-configure the source endpoint. + post_configure_target: + description: Operation to post-configure the target endpoint. + add_target: + description: Operation to notify the source node of a target node being added via a relationship. + add_source: + description: Operation to notify the target node of a source node which is now available via a relationship. + target_changed: + description: Operation to notify source some property or attribute of the target changed + remove_target: + description: Operation to remove a target node.
\ No newline at end of file diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/nodes.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/nodes.yml new file mode 100644 index 0000000000..ec06d6dd52 --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/nodes.yml @@ -0,0 +1,371 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: nodes.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +node_types: + tosca.nodes.Root: + description: The TOSCA Root Node Type is the default type that all other TOSCA base Node Types derive from. This allows for all TOSCA nodes to have a consistent set of features for modeling and management (e.g., consistent definitions for requirements, capabilities and lifecycle interfaces). + attributes: + tosca_id: + description: A unique identifier of the realized instance of a Node Template that derives from any TOSCA normative type. + type: string + tosca_name: + description: This attribute reflects the name of the Node Template as defined in the TOSCA service template. This name is not unique to the realized instance model of corresponding deployed application as each template in the model can result in one or more instances (e.g., scaled) when orchestrated to a provider environment. + type: string + state: + description: The state of the node instance. + type: string + default: initial + capabilities: + feature: + type: tosca.capabilities.Node + requirements: + - dependency: + capability: tosca.capabilities.Node + node: tosca.nodes.Root + relationship: tosca.relationships.DependsOn + occurrences: + - 0 + - UNBOUNDED + interfaces: + Standard: + type: tosca.interfaces.node.lifecycle.Standard + + tosca.nodes.ObjectStorage: + derived_from: tosca.nodes.Root + description: The TOSCA ObjectStorage node represents storage that provides the ability to store data as objects (or BLOBs of data) without consideration for the underlying filesystem or devices. + properties: + name: + description: The logical name of the object store (or container). + type: string + size: + description: The requested initial storage size (default unit is in Gigabytes). + type: scalar-unit.size + required: false + constraints: + - greater_or_equal: 0 GB + maxsize: + description: The requested maximum storage size (default unit is in Gigabytes). + type: scalar-unit.size + required: false + constraints: + - greater_or_equal: 0 GB + capabilities: + storage_endpoint: + type: tosca.capabilities.Endpoint + + tosca.nodes.DBMS: + derived_from: tosca.nodes.SoftwareComponent + description: The TOSCA DBMS node represents a typical relational, SQL Database Management System software component or service. + properties: + root_password: + description: The optional root password for the DBMS server. + type: string + required: false + port: + description: The DBMS server's port. + type: integer + required: false + capabilities: + host: + type: tosca.capabilities.Container + valid_source_types: + - tosca.nodes.Database + + tosca.nodes.WebApplication: + derived_from: tosca.nodes.Root + description: The TOSCA WebApplication node represents a software application that can be managed and run by a TOSCA WebServer node. Specific types of web applications such as Java, etc. could be derived from this type. + properties: + context_root: + description: The web application's context root which designates the application's URL path within the web server it is hosted on. + type: string + required: false + capabilities: + app_endpoint: + type: tosca.capabilities.Endpoint + requirements: + - host: + capability: tosca.capabilities.Container + node: tosca.nodes.WebServer + relationship: tosca.relationships.HostedOn + + tosca.nodes.Compute: + derived_from: tosca.nodes.Root + description: The TOSCA Compute node represents one or more real or virtual processors of software applications or services along with other essential local resources. Collectively, the resources the compute node represents can logically be viewed as a (real or virtual) "server". + attributes: + private_address: + description: The primary private IP address assigned by the cloud provider that applications may use to access the Compute node. + type: string + public_address: + description: The primary public IP address assigned by the cloud provider that applications may use to access the Compute node. + type: string + networks: + description: The list of logical networks assigned to the compute host instance and information about them. + type: map + entry_schema: + type: tosca.datatypes.network.NetworkInfo + ports: + description: The list of logical ports assigned to the compute host instance and information about them. + type: map + entry_schema: + type: tosca.datatypes.network.PortInfo + capabilities: + host: + type: tosca.capabilities.Container + valid_source_types: + - tosca.nodes.SoftwareComponent + binding: + type: tosca.capabilities.network.Bindable + os: + type: tosca.capabilities.OperatingSystem + scalable: + type: tosca.capabilities.Scalable + endpoint: + type: tosca.capabilities.Endpoint.Admin + requirements: + - local_storage: + capability: tosca.capabilities.Attachment + node: tosca.nodes.BlockStorage + relationship: tosca.relationships.AttachesTo + occurrences: + - 0 + - UNBOUNDED + + tosca.nodes.network.Network: + derived_from: tosca.nodes.Root + description: The TOSCA Network node represents a simple, logical network service. + properties: + ip_version: + description: The IP version of the requested network. + type: integer + default: 4 + required: false + constraints: + - valid_values: + - 4 + - 6 + cidr: + description: The cidr block of the requested network. + type: string + required: false + start_ip: + description: The IP address to be used as the 1st one in a pool of addresses derived from the cidr block full IP range. + type: string + required: false + end_ip: + description: The IP address to be used as the last one in a pool of addresses derived from the cidr block full IP range. + type: string + required: false + gateway_ip: + description: The gateway IP address. + type: string + required: false + network_name: + description: An Identifier that represents an existing Network instance in the underlying cloud infrastructure - OR - be used as the name of the new created network. + type: string + required: false + network_id: + description: An Identifier that represents an existing Network instance in the underlying cloud infrastructure. This property is mutually exclusive with all other properties except network_name. + type: string + required: false + segmentation_id: + description: A segmentation identifier in the underlying cloud infrastructure (e.g., VLAN id, GRE tunnel id). If the segmentation_id is specified, the network_type or physical_network properties should be provided as well. + type: string + required: false + network_type: + description: Optionally, specifies the nature of the physical network in the underlying cloud infrastructure. Examples are flat, vlan, gre or vxlan. For flat and vlan types, physical_network should be provided too. + type: string + required: false + physical_network: + description: Optionally, identifies the physical network on top of which the network is implemented, e.g. physnet1. This property is required if network_type is flat or vlan. + type: string + required: false + dhcp_enabled: + description: Indicates the TOSCA container to create a virtual network instance with or without a DHCP service. + type: boolean + default: true + required: false + capabilities: + link: + type: tosca.capabilities.network.Linkable + + tosca.nodes.WebServer: + derived_from: tosca.nodes.SoftwareComponent + description: This TOSCA WebServer Node Type represents an abstract software component or service that is capable of hosting and providing management operations for one or more WebApplication nodes. + capabilities: + data_endpoint: + type: tosca.capabilities.Endpoint + admin_endpoint: + type: tosca.capabilities.Endpoint.Admin + host: + type: tosca.capabilities.Container + valid_source_types: + - tosca.nodes.WebApplication + + tosca.nodes.Container.Application: + derived_from: tosca.nodes.Root + description: The TOSCA Container Application node represents an application that requires Container-level virtualization technology. + requirements: + - host: + capability: tosca.capabilities.Container + relationship: tosca.relationships.HostedOn + + tosca.nodes.Container.Runtime: + derived_from: tosca.nodes.SoftwareComponent + description: The TOSCA Container Runtime node represents operating system-level virtualization technology used to run multiple application services on a single Compute host. + capabilities: + host: + type: tosca.capabilities.Container + scalable: + type: tosca.capabilities.Scalable + + tosca.nodes.SoftwareComponent: + derived_from: tosca.nodes.Root + description: The TOSCA SoftwareComponent node represents a generic software component that can be managed and run by a TOSCA Compute Node Type. + properties: + component_version: + description: The optional software component's version. + type: version + required: false + admin_credential: + description: The optional credential that can be used to authenticate to the software component. + type: tosca.datatypes.Credential + required: false + requirements: + - host: + capability: tosca.capabilities.Container + node: tosca.nodes.Compute + relationship: tosca.relationships.HostedOn + + tosca.nodes.BlockStorage: + derived_from: tosca.nodes.Root + description: '' + properties: + size: + description: The requested storage size (default unit is MB). + type: scalar-unit.size + constraints: + - greater_or_equal: 1 MB + volume_id: + description: ID of an existing volume (that is in the accessible scope of the requesting application). + type: string + required: false + snapshot_id: + description: Some identifier that represents an existing snapshot that should be used when creating the block storage (volume). + type: string + required: false + capabilities: + attachment: + type: tosca.capabilities.Attachment + + tosca.nodes.network.Port: + derived_from: tosca.nodes.Root + description: |- + The TOSCA Port node represents a logical entity that associates between Compute and Network normative types. + The Port node type effectively represents a single virtual NIC on the Compute node instance. + properties: + ip_address: + description: Allow the user to set a fixed IP address. Note that this address is a request to the provider which they will attempt to fulfill but may not be able to dependent on the network the port is associated with. + type: string + required: false + order: + description: 'The order of the NIC on the compute instance (e.g. eth2). Note: + when binding more than one port to a single compute (aka multi vNICs) and + ordering is desired, it is *mandatory* that all ports will be set with an + order value and. The order values must represent a positive, arithmetic + progression that starts with 0 (e.g. 0, 1, 2, ..., n).' + type: integer + default: 0 + required: false + constraints: + - greater_or_equal: 0 + is_default: + description: Set is_default=true to apply a default gateway route on the running compute instance to the associated network gateway. Only one port that is associated to single compute node can set as default=true. + type: boolean + default: false + required: false + ip_range_start: + description: Defines the starting IP of a range to be allocated for the compute instances that are associated by this Port. Without setting this property the IP allocation is done from the entire CIDR block of the network. + type: string + required: false + ip_range_end: + description: Defines the ending IP of a range to be allocated for the compute instances that are associated by this Port. Without setting this property the IP allocation is done from the entire CIDR block of the network. + type: string + required: false + attributes: + ip_address: + description: The IP address would be assigned to the associated compute instance. + type: string + requirements: + - link: + capability: tosca.capabilities.network.Linkable + relationship: tosca.relationships.network.LinksTo + - binding: + capability: tosca.capabilities.network.Bindable + relationship: tosca.relationships.network.BindsTo + + tosca.nodes.LoadBalancer: + derived_from: tosca.nodes.Root + description: The TOSCA Load Balancer node represents logical function that be used in conjunction with a Floating Address to distribute an application's traffic (load) across a number of instances of the application (e.g., for a clustered or scaled application). + capabilities: + client: + description: The Floating (IP) client's on the public network can connect to. + type: tosca.capabilities.Endpoint.Public + occurrences: + - 0 + - UNBOUNDED + requirements: + - application: + capability: tosca.capabilities.Endpoint + relationship: tosca.relationships.RoutesTo + occurrences: + - 0 + - UNBOUNDED + + tosca.nodes.Database: + derived_from: tosca.nodes.Root + description: The TOSCA Database node represents a logical database that can be managed and hosted by a TOSCA DBMS node. + properties: + name: + description: The logical database Name. + type: string + port: + description: The port the database service will use to listen for incoming data and requests. + type: integer + required: false + user: + description: The special user account used for database administration. + type: string + required: false + password: + description: The password associated with the user account provided in the 'user' property. + type: string + required: false + capabilities: + database_endpoint: + type: tosca.capabilities.Endpoint.Database + requirements: + - host: + capability: tosca.capabilities.Container + node: tosca.nodes.DBMS + relationship: tosca.relationships.HostedOn diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/policies.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/policies.yml new file mode 100644 index 0000000000..e2819c5360 --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/policies.yml @@ -0,0 +1,43 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: policies.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +policy_types: + tosca.policies.Root: + description: This is the default (root) TOSCA Policy Type definition that all other TOSCA base Policy Types derive from. + + tosca.policies.Update: + derived_from: tosca.policies.Root + description: This is the default (root) TOSCA Policy Type definition that is used to govern update of TOSCA nodes or groups of nodes. + + tosca.policies.Placement: + derived_from: tosca.policies.Root + description: This is the default (root) TOSCA Policy Type definition that is used to govern placement of TOSCA nodes or groups of nodes. + + tosca.policies.Performance: + derived_from: tosca.policies.Root + description: This is the default (root) TOSCA Policy Type definition that is used to declare performance requirements for TOSCA nodes or groups of nodes. + + tosca.policies.Scaling: + derived_from: tosca.policies.Root + description: This is the default (root) TOSCA Policy Type definition that is used to govern scaling of TOSCA nodes or groups of nodes. diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/relationships.yml b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/relationships.yml new file mode 100644 index 0000000000..648626ba7c --- /dev/null +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/mock/globalServiceTemplates/relationships.yml @@ -0,0 +1,106 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +tosca_definitions_version: tosca_simple_yaml_1_1 + +metadata: + filename: relationships.yml + version: '1.0' + +imports: +- tosca_index: + file: _index.yml + +relationship_types: + tosca.relationships.Root: + description: This is the default (root) TOSCA Relationship Type definition that all other TOSCA Relationship Types derive from. + attributes: + tosca_id: + description: A unique identifier of the realized instance of a Relationship Template that derives from any TOSCA normative type. + type: string + tosca_name: + description: This attribute reflects the name of the Relationship Template as defined in the TOSCA service template. This name is not unique to the realized instance model of corresponding deployed application as each template in the model can result in one or more instances (e.g., scaled) when orchestrated to a provider environment. + type: string + state: + description: The state of the relationship instance. + type: string + default: initial + interfaces: + Configure: + type: tosca.interfaces.relationship.Configure + + tosca.relationships.RoutesTo: + derived_from: tosca.relationships.ConnectsTo + description: This type represents an intentional network routing between two Endpoints in different networks. + valid_target_types: + - tosca.capabilities.Endpoint + + tosca.relationships.network.LinksTo: + derived_from: tosca.relationships.DependsOn + description: This relationship type represents an association relationship between Port and Network node types. + valid_target_types: + - tosca.capabilities.network.Linkable + + tosca.relationships.AttachesTo: + derived_from: tosca.relationships.Root + description: This type represents an attachment relationship between two nodes. For example, an AttachesTo relationship type would be used for attaching a storage node to a Compute node. + valid_target_types: + - tosca.capabilities.Attachment + properties: + location: + description: 'The relative location (e.g., path on the file system), which + provides the root location to address an attached node. e.g., a mount point + / path such as ''/usr/data''. Note: The user must provide it and it cannot + be "root".' + type: string + constraints: + - min_length: 1 + device: + description: The logical device name which for the attached device (which is represented by the target node in the model). e.g., '/dev/hda1'. + type: string + required: false + attributes: + device: + description: 'The logical name of the device as exposed to the instance. Note: + A runtime property that gets set when the model gets instantiated by the + orchestrator.' + type: string + + tosca.relationships.network.BindsTo: + derived_from: tosca.relationships.DependsOn + description: This type represents a network association relationship between Port and Compute node types. + valid_target_types: + - tosca.capabilities.network.Bindable + + tosca.relationships.HostedOn: + derived_from: tosca.relationships.Root + description: This type represents a hosting relationship between two nodes. + valid_target_types: + - tosca.capabilities.Container + + tosca.relationships.DependsOn: + derived_from: tosca.relationships.Root + description: This type represents a general dependency relationship between two nodes. + valid_target_types: + - tosca.capabilities.Node + + tosca.relationships.ConnectsTo: + derived_from: tosca.relationships.Root + description: This type represents a network connection relationship between two nodes. + valid_target_types: + - tosca.capabilities.Endpoint + properties: + credential: + type: tosca.datatypes.Credential + required: false |