package alien4cloud.deployment; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.inject.Inject; import org.apache.commons.collections4.MapUtils; import org.springframework.stereotype.Service; import org.alien4cloud.tosca.model.types.NodeType; import alien4cloud.model.deployment.DeploymentTopology; import alien4cloud.model.orchestrators.locations.LocationResourceTemplate; import org.alien4cloud.tosca.model.templates.NodeTemplate; import alien4cloud.paas.wf.WorkflowsBuilderService; import alien4cloud.paas.wf.WorkflowsBuilderService.TopologyContext; import alien4cloud.topology.task.AbstractTask; import alien4cloud.topology.task.TaskCode; import alien4cloud.topology.task.TopologyTask; import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * Perform validation of a topology before deployment. */ @Service public class DeploymentNodeSubstitutionValidationService { @Inject private WorkflowsBuilderService workflowsBuilderService; @Inject private IDeploymentNodeSubstitutionService deploymentNodeSubstitutionService; /** * Perform validation of a deployment topology against substitutions. * * @param deploymentTopology The topology to check. * @return A List of tasks: Nodes that can be substituted but are not. */ public List<AbstractTask> validateNodeSubstitutions(DeploymentTopology deploymentTopology) { TopologyContext topologyContext = workflowsBuilderService.buildTopologyContext(deploymentTopology); List<AbstractTask> tasks = Lists.newArrayList(); Map<String, List<LocationResourceTemplate>> availableSubstitutions = deploymentNodeSubstitutionService.getAvailableSubstitutions(deploymentTopology); if (MapUtils.isNotEmpty(availableSubstitutions)) { Map<String, String> substitutions = deploymentTopology.getSubstitutedNodes(); if (substitutions == null) { substitutions = Maps.newHashMap(); } for (Entry<String, List<LocationResourceTemplate>> availableSubstitution : availableSubstitutions.entrySet()) { if (substitutions.get(availableSubstitution.getKey()) == null) { addTask(availableSubstitution.getKey(), topologyContext, tasks); } } } return tasks; } private void addTask(String nodeTemplateName, TopologyContext topologyContext, List<AbstractTask> tasks) { NodeTemplate nodeTemplate = topologyContext.getTopology().getNodeTemplates().get(nodeTemplateName); NodeType nodeType = topologyContext.findElement(NodeType.class, nodeTemplate.getType()); TopologyTask task = new TopologyTask(nodeTemplateName, nodeType); task.setCode(TaskCode.NODE_NOT_SUBSTITUTED); tasks.add(task); } }