package alien4cloud.topology.validation; import org.alien4cloud.tosca.model.types.NodeType; import org.alien4cloud.tosca.model.templates.Topology; import alien4cloud.topology.TopologyService; import alien4cloud.topology.TopologyServiceCore; import alien4cloud.topology.task.SuggestionsTask; import com.google.common.collect.Maps; import lombok.SneakyThrows; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; /** * Performs validation by checking that no nodes in a topology are abstract (and cannot be instanciated). */ @Component public class TopologyAbstractNodeValidationService { @Resource private TopologyServiceCore topologyServiceCore; @Resource private TopologyService topologyService; /** * Find replacements components for abstract nodes in a Topology */ @SneakyThrows({ IOException.class }) public List<SuggestionsTask> findReplacementForAbstracts(Topology topology) { Map<String, NodeType> nodeTempNameToAbstractIndexedNodeTypes = topologyServiceCore.getIndexedNodeTypesFromTopology(topology, true, true, true); Map<String, Map<String, Set<String>>> nodeTemplatesToFilters = Maps.newHashMap(); for (Map.Entry<String, NodeType> idntEntry : nodeTempNameToAbstractIndexedNodeTypes.entrySet()) { topologyService.processNodeTemplate(topology, Maps.immutableEntry(idntEntry.getKey(), topology.getNodeTemplates().get(idntEntry.getKey())), nodeTemplatesToFilters); } return topologyService.searchForNodeTypes(topology.getWorkspace(), nodeTemplatesToFilters, nodeTempNameToAbstractIndexedNodeTypes); } }