/** * Add dangling requirement nodes for the specified node in the topology. * * @param topology The topology template * @param nodeTemplate The specific node template for which to add dangling requirements. */ public void addDanglingRequirements(Topology topology, TopologyContext topologyContext, NodeTemplate nodeTemplate, String requirementSkipAutoCompletion) { if (!enabled) { return; } // Get the node type NodeType nodeType = ToscaContext.get(NodeType.class, nodeTemplate.getType()); for (RequirementDefinition requirementDefinition : nodeType.getRequirements()) { if (!requirementDefinition.getId().equals(requirementSkipAutoCompletion)) { // let's count current requirement fullfillment count int relationshipCount = countRelationshipsForRequirement(nodeTemplate, requirementDefinition); if (requirementDefinition.getLowerBound() > relationshipCount) { // we need to add some dangling requirement nodes addDanglingNodes(topology, topologyContext, nodeTemplate, requirementDefinition, requirementDefinition.getLowerBound() - relationshipCount); } } } }
/** * Check if the upperBound of a requirement is reached on a node template * * @param nodeTemplate the node to check for requirement bound * @param requirementName the name of the requirement * @param dependencies the dependencies of the topology * @return true if requirement upper bound is reached, false otherwise */ public boolean isRequirementUpperBoundReachedForSource(NodeTemplate nodeTemplate, String requirementName, Set<CSARDependency> dependencies) { NodeType relatedIndexedNodeType = toscaTypeSearchService.getRequiredElementInDependencies(NodeType.class, nodeTemplate.getType(), dependencies); Requirement requirement = nodeTemplate.getRequirements().get(requirementName); if (nodeTemplate.getRelationships() == null || nodeTemplate.getRelationships().isEmpty()) { return false; } RequirementDefinition requirementDefinition = getRequirementDefinition(relatedIndexedNodeType.getRequirements(), requirementName, requirement.getType()); if (requirementDefinition.getUpperBound() == Integer.MAX_VALUE) { return false; } int count = countRelationshipsForRequirement(nodeTemplate, requirementDefinition); return count >= requirementDefinition.getUpperBound(); }
if (CollectionUtils.isNotEmpty(relatedIndexedNodeType.getRequirements())) { for (RequirementDefinition reqDef : relatedIndexedNodeType.getRequirements()) { int count = countRelationshipsForRequirement(nodeTemp, reqDef); if (count < reqDef.getLowerBound()) { task.getRequirementsToImplement().add(new RequirementToSatisfy(reqDef.getId(), reqDef.getType(), reqDef.getLowerBound() - count));