package alien4cloud.topology.validation;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import org.alien4cloud.tosca.catalog.index.IToscaTypeSearchService;
import org.alien4cloud.tosca.model.CSARDependency;
import org.alien4cloud.tosca.model.definitions.CapabilityDefinition;
import org.alien4cloud.tosca.model.templates.Capability;
import org.alien4cloud.tosca.model.templates.NodeTemplate;
import org.alien4cloud.tosca.model.templates.RelationshipTemplate;
import org.alien4cloud.tosca.model.types.NodeType;
import org.springframework.stereotype.Component;
import alien4cloud.exception.NotFoundException;
import alien4cloud.topology.TopologyServiceCore;
/**
*
*/
@Component
public class TopologyCapabilityBoundsValidationServices {
@Resource
private IToscaTypeSearchService toscaTypeSearchService;
@Resource
private TopologyServiceCore topologyServiceCore;
//
public boolean isCapabilityUpperBoundReachedForTarget(String nodeTemplateName, Map<String, NodeTemplate> nodeTemplates, String capabilityName,
Set<CSARDependency> dependencies) {
NodeTemplate nodeTemplate = nodeTemplates.get(nodeTemplateName);
NodeType relatedIndexedNodeType = toscaTypeSearchService.getRequiredElementInDependencies(NodeType.class, nodeTemplate.getType(), dependencies);
chekCapability(nodeTemplateName, capabilityName, nodeTemplate);
CapabilityDefinition capabilityDefinition = getCapabilityDefinition(relatedIndexedNodeType.getCapabilities(), capabilityName);
if (capabilityDefinition.getUpperBound() == Integer.MAX_VALUE) {
return false;
}
List<RelationshipTemplate> targetRelatedRelationships = topologyServiceCore.getTargetRelatedRelatonshipsTemplate(nodeTemplateName, nodeTemplates);
if (targetRelatedRelationships == null || targetRelatedRelationships.isEmpty()) {
return false;
}
int count = 0;
for (RelationshipTemplate rel : targetRelatedRelationships) {
if (rel.getTargetedCapabilityName().equals(capabilityName)) {
count++;
}
}
return count >= capabilityDefinition.getUpperBound();
}
private CapabilityDefinition getCapabilityDefinition(Collection<CapabilityDefinition> capabilityDefinitions, String capabilityName) {
for (CapabilityDefinition capabilityDef : capabilityDefinitions) {
if (capabilityDef.getId().equals(capabilityName)) {
return capabilityDef;
}
}
throw new NotFoundException("Capability definition [" + capabilityName + "] cannot be found");
}
private void chekCapability(String nodeTemplateName, String capabilityName, NodeTemplate nodeTemplate) {
boolean capablityExists = false;
if (nodeTemplate.getCapabilities() != null) {
for (Map.Entry<String, Capability> capaEntry : nodeTemplate.getCapabilities().entrySet()) {
if (capaEntry.getKey().equals(capabilityName)) {
capablityExists = true;
}
}
}
if (!capablityExists) {
throw new NotFoundException("A capability with name [" + capabilityName + "] cannot be found in the target node [" + nodeTemplateName + "].");
}
}
}