diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/BlockStorageComputeWFModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/BlockStorageComputeWFModifier.java index 546e10e..35c72d2 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/BlockStorageComputeWFModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/BlockStorageComputeWFModifier.java @@ -1,8 +1,13 @@ package alien4cloud.paas.yorc.modifier; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContextual; -import lombok.extern.slf4j.Slf4j; +import static alien4cloud.utils.AlienUtils.safe; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Resource; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.alm.deployment.configuration.flow.TopologyModifierSupport; import org.alien4cloud.tosca.editor.operations.workflow.ConnectStepFromOperation; @@ -14,15 +19,11 @@ import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.workflow.Workflow; import org.alien4cloud.tosca.model.workflow.WorkflowStep; -import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; -import javax.annotation.Resource; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static alien4cloud.utils.AlienUtils.safe; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContextual; +import lombok.extern.slf4j.Slf4j; /** * A {@code BlockStorageComputeWFModifier} is a Topology modifier that explore a {@link Topology} to swap Compute and BlockStorage @@ -60,7 +61,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { Workflow installWF = topology.getWorkflows().get("install"); Workflow uninstallWF = topology.getWorkflows().get("uninstall"); - Set bsSet = TopologyNavigationUtil.getNodesOfType(topology, TOSCA_NODES_BLOCK_STORAGE, true); + Set bsSet = this.getNodesOfType(context, topology, TOSCA_NODES_BLOCK_STORAGE, true); // Let's process all BS bsSet.forEach(bs -> safe(bs.getRelationships()).forEach((rn, rt) -> { diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/DockerToSingularityModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/DockerToSingularityModifier.java index 866ae12..ec08831 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/DockerToSingularityModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/DockerToSingularityModifier.java @@ -101,27 +101,27 @@ protected void doProcess(Topology topology, FlowExecutionContext context) { // replace all yorc.nodes.slurm.ContainerJobUnit by // yorc.nodes.slurm.SingularityJob - Set containerJobUnitNodes = TopologyNavigationUtil.getNodesOfType(topology, + Set containerJobUnitNodes = this.getNodesOfType(context, topology, SLURM_TYPES_CONTAINER_JOB_UNIT, false); containerJobUnitNodes.forEach(nodeTemplate -> transformContainerJobUnit(csar, topology, context, nodeTemplate)); // replace all yorc.nodes.slurm.ContainerJobUnit by // yorc.nodes.slurm.SingularityJob if not already hosted on a ContainerJobUnit - Set containerRuntimeNodes = TopologyNavigationUtil.getNodesOfType(topology, + Set containerRuntimeNodes = this.getNodesOfType(context, topology, SLURM_TYPES_CONTAINER_RUNTIME, false); containerRuntimeNodes.forEach(nodeTemplate -> transformContainerRuntime(csar, topology, context, nodeTemplate)); // replace all tosca.nodes.Container.Application.DockerContainer by // yorc.nodes.slurm.SingularityJob if hosted on a ContainerRuntime transformed // into a yorc.nodes.slurm.SingularityJob - Set containerNodes = TopologyNavigationUtil.getNodesOfType(topology, + Set containerNodes = this.getNodesOfType(context, topology, A4C_TYPES_APPLICATION_DOCKER_CONTAINER, true); containerNodes.forEach( nodeTemplate -> transformContainer(csar, topology, context, functionEvaluatorContext, nodeTemplate)); // for each volume node, populate the 'volumes' property of the corresponding // deployment resource - Set volumeNodes = TopologyNavigationUtil.getNodesOfType(topology, + Set volumeNodes = this.getNodesOfType(context, topology, SLURM_TYPES_HOST_TO_CONTAINER_VOLUME, true); volumeNodes.forEach(nodeTemplate -> transformContainerVolume(csar, topology, context, nodeTemplate)); @@ -131,15 +131,30 @@ protected void doProcess(Topology topology, FlowExecutionContext context) { safe(replacementMap.keySet()).forEach(nodeName -> removeNode(csar, topology, nodeName)); } - protected void linkDependsOn(Csar csar, FlowExecutionContext context, Topology topology, + protected void linkDependsOn(Csar csar, FlowExecutionContext context, + Topology topology, Map> containersDependencies, Map replacementMap) { containersDependencies.forEach((source, targets) -> { + boolean sourceReplaced = true; + boolean targetReplaced = true; NodeTemplate sourceNode = replacementMap.get(source); - safe(targets).forEach(target -> { + if (sourceNode == null) { + // not replaced in this modifier + sourceReplaced = false; + sourceNode = topology.getNodeTemplates().get(source); + } + for (String target : targets) { NodeTemplate targetNode = replacementMap.get(target); - addRelationshipTemplate(csar, topology, sourceNode, targetNode.getName(), + if (targetNode == null) { + // not replaced in this modifier + targetReplaced = false; + targetNode = topology.getNodeTemplates().get(target); + } + if (sourceReplaced || targetReplaced) { + addRelationshipTemplate(csar, topology, sourceNode, targetNode.getName(), NormativeRelationshipConstants.DEPENDS_ON, "dependency", "feature"); - }); + } + } }); } @@ -171,7 +186,7 @@ protected String getTargetJobTypeVersion() { */ protected void transformContainerJobUnit(Csar csar, Topology topology, FlowExecutionContext context, NodeTemplate nodeTemplate) { - NodeTemplate singularityNode = addNodeTemplate(csar, topology, nodeTemplate.getName() + "_Singularity", + NodeTemplate singularityNode = addNodeTemplate(context, csar, topology, nodeTemplate.getName() + "_Singularity", getTargetJobType(), getTargetJobTypeVersion()); addToReplacementMap(context, nodeTemplate, singularityNode); setNodeTagValue(singularityNode, A4C_D2S_MODIFIER_TAG + "_created_from", nodeTemplate.getName()); @@ -340,13 +355,12 @@ private void transformContainer(Csar csar, Topology topology, FlowExecutionConte Set dependents = TopologyNavigationUtil.getSourceNodesByRelationshipType(topology, nodeTemplate, NormativeRelationshipConstants.DEPENDS_ON); dependents.forEach(sourceNode -> { - Set d = containersDependencies.get(sourceNode.getName()); - if (d == null) { - d = Sets.newHashSet(); - containersDependencies.put(sourceNode.getName(), d); - } - d.add(nodeTemplate.getName()); + containersDependencies.computeIfAbsent(sourceNode.getName(), k-> Sets.newHashSet()).add(nodeTemplate.getName()); }); + Set dependsOn =TopologyNavigationUtil.getTargetNodes(topology, nodeTemplate, "dependency"); + for (NodeTemplate targetNode : dependsOn) { + containersDependencies.computeIfAbsent(nodeTemplate.getName(), k-> Sets.newHashSet()).add(targetNode.getName()); + } } protected void transformContainerOperation(Csar csar, FlowExecutionContext context, diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/FipTopologyModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/FipTopologyModifier.java index 64a1bc7..3c329fc 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/FipTopologyModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/FipTopologyModifier.java @@ -1,9 +1,14 @@ package alien4cloud.paas.yorc.modifier; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContextual; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.alm.deployment.configuration.flow.TopologyModifierSupport; import org.alien4cloud.tosca.catalog.index.IToscaTypeSearchService; @@ -14,11 +19,12 @@ import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.types.NodeType; import org.alien4cloud.tosca.normative.constants.NormativeRelationshipConstants; -import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; -import javax.inject.Inject; -import java.util.*; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContextual; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; /** * Modifies an OpenStack topology to add a new Floating IP Node template @@ -50,7 +56,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { Csar csar = new Csar(topology.getArchiveName(), topology.getArchiveVersion()); - Set publicNetworksNodes = TopologyNavigationUtil.getNodesOfType(topology, "yorc.nodes.openstack.PublicNetwork", false); + Set publicNetworksNodes = this.getNodesOfType(context, topology, "yorc.nodes.openstack.PublicNetwork", false); String fipConnectivityCap = "yorc.capabilities.openstack.FIPConnectivity"; String fipNodeType = "yorc.nodes.openstack.FloatingIP"; @@ -61,7 +67,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { publicNetworksNodes.forEach(networkNodeTemplate -> { final AbstractPropertyValue networkName = networkNodeTemplate.getProperties().get("floating_network_name"); - // For each Node Template requiring a connection to this Public + // For each Node Template requiring a connection to this Public // Network, creating a new Floating IP Node Template for (NodeTemplate nodeTemplate : new ArrayList<>(topology.getNodeTemplates().values())) { @@ -73,7 +79,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { Map properties = new LinkedHashMap<>(); properties.put("floating_network_name", networkName); - + Map capabilities = new LinkedHashMap<>(); Capability connectionCap = new Capability(); connectionCap.setType(fipConnectivityCap); @@ -86,10 +92,10 @@ private void doProcess(Topology topology, FlowExecutionContext context) { } // Creating a new Floating IP Node Template that will be - // associated to this Node Template requiring a + // associated to this Node Template requiring a // connection to the Public Network String fipName = "FIP" + nodeTemplate.getName(); - NodeTemplate fipNodeTemplate = addNodeTemplate( + NodeTemplate fipNodeTemplate = addNodeTemplate(context, csar, topology, fipName, @@ -131,12 +137,12 @@ private void doProcess(Topology topology, FlowExecutionContext context) { networkNodeTemplate.getName()); }); - // Removing Public Network nodes for which a new Floating IP Node + // Removing Public Network nodes for which a new Floating IP Node // template was created - nodesToRemove.forEach(pnn -> removeNode(topology, pnn)); + nodesToRemove.forEach(pnn -> removeNode(context, topology, pnn)); // Creating a relationship between each new Floating IP Node Template - // and the Source Node Template having a connectivity requirement + // and the Source Node Template having a connectivity requirement relationshipsToAdd.forEach( rel -> addRelationshipTemplate( csar, topology, diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/GangjaModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/GangjaModifier.java index 286928e..d36aab1 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/GangjaModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/GangjaModifier.java @@ -1,20 +1,27 @@ package alien4cloud.paas.yorc.modifier; -import alien4cloud.deployment.ArtifactProcessorService; -import alien4cloud.paas.wf.TopologyContext; -import alien4cloud.paas.wf.WorkflowSimplifyService; -import alien4cloud.paas.wf.WorkflowsBuilderService; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContext; -import alien4cloud.tosca.context.ToscaContextual; -import alien4cloud.tosca.parser.ToscaParser; -import alien4cloud.utils.CloneUtil; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; + import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import lombok.extern.slf4j.Slf4j; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.alm.deployment.configuration.flow.TopologyModifierSupport; -import org.alien4cloud.tosca.model.definitions.*; +import org.alien4cloud.tosca.model.definitions.AbstractPropertyValue; +import org.alien4cloud.tosca.model.definitions.ComplexPropertyValue; +import org.alien4cloud.tosca.model.definitions.DeploymentArtifact; +import org.alien4cloud.tosca.model.definitions.IValue; +import org.alien4cloud.tosca.model.definitions.PropertyDefinition; +import org.alien4cloud.tosca.model.definitions.ScalarPropertyValue; import org.alien4cloud.tosca.model.templates.NodeTemplate; import org.alien4cloud.tosca.model.templates.RelationshipTemplate; import org.alien4cloud.tosca.model.templates.ServiceNodeTemplate; @@ -24,15 +31,16 @@ import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import alien4cloud.deployment.ArtifactProcessorService; +import alien4cloud.paas.wf.TopologyContext; +import alien4cloud.paas.wf.WorkflowSimplifyService; +import alien4cloud.paas.wf.WorkflowsBuilderService; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContext; +import alien4cloud.tosca.context.ToscaContextual; +import alien4cloud.tosca.parser.ToscaParser; +import alien4cloud.utils.CloneUtil; +import lombok.extern.slf4j.Slf4j; @Slf4j @Component("gangja-resolver-modifier") @@ -99,7 +107,7 @@ protected void doProcess(Topology topology, FlowExecutionContext context) { log.debug("ARM processing topology"); } - Set nodes = TopologyNavigationUtil.getNodesOfType(topology, NODE_TYPE_TO_EXPORE, true, false); + Set nodes = this.getNodesOfType(context, topology, NODE_TYPE_TO_EXPORE, true, false); nodes.stream().forEach(nodeTemplate -> { // check if node has org.alien4cloud.artifacts.GangjaConfig artefacts if (hasGangjaFile(nodeTemplate)) { diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/GoogleAddressTopologyModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/GoogleAddressTopologyModifier.java index 1efabc8..56cfc79 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/GoogleAddressTopologyModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/GoogleAddressTopologyModifier.java @@ -1,9 +1,14 @@ package alien4cloud.paas.yorc.modifier; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContextual; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.alm.deployment.configuration.flow.TopologyModifierSupport; import org.alien4cloud.tosca.catalog.index.IToscaTypeSearchService; @@ -14,11 +19,12 @@ import org.alien4cloud.tosca.model.templates.NodeTemplate; import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.types.NodeType; -import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; -import javax.inject.Inject; -import java.util.*; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContextual; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; @Slf4j @Component(value = GoogleAddressTopologyModifier.YORC_GOOGLE_ADDRESS_MODIFIER_TAG) @@ -44,7 +50,7 @@ public void process(Topology topology, FlowExecutionContext context) { private void doProcess(Topology topology, FlowExecutionContext context) { Csar csar = new Csar(topology.getArchiveName(), topology.getArchiveVersion()); - Set publicNetworksNodes = TopologyNavigationUtil.getNodesOfType(topology, "yorc.nodes.google.PublicNetwork", false); + Set publicNetworksNodes = this.getNodesOfType(context, topology, "yorc.nodes.google.PublicNetwork", false); String assignableCap = "yorc.capabilities.Assignable"; String addressTypeName = "yorc.nodes.google.Address"; @@ -97,7 +103,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { // Creating a new Address Node Template that will be // associated to this Node Template requiring an assignment String name = nodeTemplate.getName() + "_address"; - NodeTemplate addressNodeTemplate = addNodeTemplate( + NodeTemplate addressNodeTemplate = addNodeTemplate(context, csar, topology, name, @@ -133,7 +139,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { // Removing Public Network nodes for which a new Address Node // template was created - nodesToRemove.forEach(pnn -> removeNode(topology, pnn)); + nodesToRemove.forEach(pnn -> removeNode(context, topology, pnn)); // Creating a relationship between each new Google Address Node Template // and the Source Node Template having an assignment requirement diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/GooglePrivateNetworkTopologyModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/GooglePrivateNetworkTopologyModifier.java index 208993c..055dec3 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/GooglePrivateNetworkTopologyModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/GooglePrivateNetworkTopologyModifier.java @@ -1,9 +1,14 @@ package alien4cloud.paas.yorc.modifier; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContextual; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import javax.inject.Inject; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.alm.deployment.configuration.flow.TopologyModifierSupport; import org.alien4cloud.tosca.catalog.index.IToscaTypeSearchService; @@ -14,11 +19,12 @@ import org.alien4cloud.tosca.model.templates.NodeTemplate; import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.types.NodeType; -import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; -import javax.inject.Inject; -import java.util.*; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContextual; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; @Slf4j @Component(value = GooglePrivateNetworkTopologyModifier.YORC_GOOGLE_PRIVATE_NETWORK_MODIFIER_TAG) @@ -53,7 +59,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { return; } - Set privateNetworksNodes = TopologyNavigationUtil.getNodesOfType(topology, "yorc.nodes.google.PrivateNetwork", false); + Set privateNetworksNodes = this.getNodesOfType(context, topology, "yorc.nodes.google.PrivateNetwork", false); List relationshipsToAdd = new ArrayList<>(); List relationshipsToRemove = new ArrayList<>(); @@ -95,7 +101,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { // Otherwise check is this subnet has a node type String subnetNodeName = buildSubnetNodeName(privNetNodeTemplate.getName(), subnet); - Optional opt = findSubnetNodeByName(topology, subnetNodeName); + Optional opt = findSubnetNodeByName(context, topology, subnetNodeName); if (opt.isPresent()) { replaceNetworkRelationship(nodeTemplate, subnetNodeName, privNetNodeTemplate.getName(), relationshipTemplate.getName(), relationshipsToAdd, relationshipsToRemove, context); return; @@ -113,7 +119,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { // check secondly the optional default subnet which can be provided by cidr/cidr_region String defaultSubnetNodeName = buildSubnetNodeName(privNetNodeTemplate.getName(), "default"); - Optional opt = findSubnetNodeByName(topology, defaultSubnetNodeName); + Optional opt = findSubnetNodeByName(context, topology, defaultSubnetNodeName); if (opt.isPresent()) { // Check if the region is matching String defaultRegion = ((ScalarPropertyValue) opt.get().getProperties().get("region")).getValue(); @@ -124,7 +130,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { } // check finally among all existing subnets and retrieve the first regional matching with the node zone - opt = findFirstSubnetNodeByRegion(topology, region); + opt = findFirstSubnetNodeByRegion(context, topology, region); if (opt.isPresent()) { replaceNetworkRelationship(nodeTemplate, opt.get().getName(), privNetNodeTemplate.getName(), relationshipTemplate.getName(), relationshipsToAdd, relationshipsToRemove, context); return; @@ -198,7 +204,7 @@ private void createSubnets(final NodeTemplate networkNode, final Csar csar, fina String subA4CName = buildSubnetNodeName(networkNode.getName(), name); // Add subnet node template - NodeTemplate subnetNodeTemplate = addNodeTemplate( + NodeTemplate subnetNodeTemplate = addNodeTemplate(context, csar, topology, subA4CName, @@ -252,7 +258,7 @@ private void createSubnets(final NodeTemplate networkNode, final Csar csar, fina } String subA4CName = buildSubnetNodeName(networkNode.getName(), "default"); - NodeTemplate subnetNodeTemplate = addNodeTemplate( + NodeTemplate subnetNodeTemplate = addNodeTemplate(context, csar, topology, subA4CName, @@ -280,13 +286,13 @@ private void createSubnets(final NodeTemplate networkNode, final Csar csar, fina } } - private Optional findSubnetNodeByName(final Topology topology, final String subnetNodeName) { - Set subnets = TopologyNavigationUtil.getNodesOfType(topology, "yorc.nodes.google.Subnetwork", false); + private Optional findSubnetNodeByName(final FlowExecutionContext context,final Topology topology, final String subnetNodeName) { + Set subnets = this.getNodesOfType(context, topology, "yorc.nodes.google.Subnetwork", false); return subnets.stream().filter(subnet -> subnet.getName().equals(subnetNodeName)).findAny(); } - private Optional findFirstSubnetNodeByRegion(final Topology topology, final String region) { - Set subnets = TopologyNavigationUtil.getNodesOfType(topology, "yorc.nodes.google.Subnetwork", false); + private Optional findFirstSubnetNodeByRegion(final FlowExecutionContext context, final Topology topology, final String region) { + Set subnets = this.getNodesOfType(context, topology, "yorc.nodes.google.Subnetwork", false); return subnets.stream().filter(subnet -> ((ScalarPropertyValue) subnet.getProperties().get("region")).getValue().equals(region)).findFirst(); } diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/KubernetesTopologyModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/KubernetesTopologyModifier.java index ad1b8b7..4770789 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/KubernetesTopologyModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/KubernetesTopologyModifier.java @@ -12,7 +12,6 @@ import org.alien4cloud.tosca.model.Csar; import org.alien4cloud.tosca.model.templates.NodeTemplate; import org.alien4cloud.tosca.model.templates.Topology; -import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; import alien4cloud.component.ICSARRepositorySearchService; @@ -98,15 +97,15 @@ private void doProcess(Topology topology, FlowExecutionContext context) { // Insure that Yorc kubernetes types archive added as dependency to the topology // // Treat deployment resource types - transformKubernetesResourceTypes(topology, csar, "deployment", yorcKubernetesTypesArchiveVersion); + transformKubernetesResourceTypes(context, topology, csar, "deployment", yorcKubernetesTypesArchiveVersion); // Treat job resource types - transformKubernetesResourceTypes(topology, csar, "job", yorcKubernetesTypesArchiveVersion); + transformKubernetesResourceTypes(context, topology, csar, "job", yorcKubernetesTypesArchiveVersion); // Treat service resource types - transformKubernetesResourceTypes(topology, csar, "service", yorcKubernetesTypesArchiveVersion); + transformKubernetesResourceTypes(context, topology, csar, "service", yorcKubernetesTypesArchiveVersion); // Treat statefulset resource types - transformKubernetesResourceTypes(topology, csar, "statefulSet", yorcKubernetesTypesArchiveVersion); + transformKubernetesResourceTypes(context, topology, csar, "statefulSet", yorcKubernetesTypesArchiveVersion); // Treat simple resource types - transformKubernetesResourceTypes(topology, csar, "simple", yorcKubernetesTypesArchiveVersion); + transformKubernetesResourceTypes(context, topology, csar, "simple", yorcKubernetesTypesArchiveVersion); } /** @@ -117,7 +116,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { * @param resourceType the desired Yorc type * @param resourceArchiveVersion the desired Yorc version */ - private void transformKubernetesResourceTypes(Topology topology, Csar csar, String resourceType, String resourceArchiveVersion) { + private void transformKubernetesResourceTypes(FlowExecutionContext context, Topology topology, Csar csar, String resourceType, String resourceArchiveVersion) { String sourceResourceType = null; String targetResourceType = null; @@ -154,7 +153,7 @@ private void transformKubernetesResourceTypes(Topology topology, Csar csar, Stri final String effectiveTargetResourceType = targetResourceType; - Set serviceNodes = TopologyNavigationUtil.getNodesOfType(topology, sourceResourceType, false); + Set serviceNodes = this.getNodesOfType(context, topology, sourceResourceType, false); serviceNodes.forEach(serviceNodeTemplate -> { diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/OpenStackBSComputeWFModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/OpenStackBSComputeWFModifier.java index 8c653dd..5e24bdd 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/OpenStackBSComputeWFModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/OpenStackBSComputeWFModifier.java @@ -1,8 +1,12 @@ package alien4cloud.paas.yorc.modifier; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContextual; -import lombok.extern.slf4j.Slf4j; +import static alien4cloud.utils.AlienUtils.safe; + +import java.util.Map; +import java.util.Set; + +import javax.annotation.Resource; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.alm.deployment.configuration.flow.TopologyModifierSupport; import org.alien4cloud.tosca.editor.operations.workflow.ConnectStepFromOperation; @@ -14,14 +18,11 @@ import org.alien4cloud.tosca.model.templates.Topology; import org.alien4cloud.tosca.model.workflow.Workflow; import org.alien4cloud.tosca.model.workflow.WorkflowStep; -import org.alien4cloud.tosca.utils.TopologyNavigationUtil; import org.springframework.stereotype.Component; -import javax.annotation.Resource; -import java.util.Map; -import java.util.Set; - -import static alien4cloud.utils.AlienUtils.safe; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContextual; +import lombok.extern.slf4j.Slf4j; /** * A {@code OpenStackBSComputeWFModifier} is a Topology modifier that explore a {@link Topology} to swap Compute and BlockStorage @@ -62,7 +63,7 @@ private void doProcess(Topology topology, FlowExecutionContext context) { Workflow installWF = topology.getWorkflows().get("install"); Workflow uninstallWF = topology.getWorkflows().get("uninstall"); - Set bsSet = TopologyNavigationUtil.getNodesOfType(topology, YORC_OPENSTACK_BS_TYPE, true); + Set bsSet = this.getNodesOfType(context, topology, YORC_OPENSTACK_BS_TYPE, true); // Let's process all BS bsSet.forEach(bs -> safe(bs.getRelationships()).forEach((rn, rt) -> { diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/YorcLocationModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/YorcLocationModifier.java index 97d3dc9..c2cf679 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/YorcLocationModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/YorcLocationModifier.java @@ -2,9 +2,6 @@ import static alien4cloud.utils.AlienUtils.safe; -import java.util.Map; -import java.util.Optional; - import javax.annotation.Resource; import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; @@ -16,6 +13,7 @@ import alien4cloud.common.MetaPropertiesService; import alien4cloud.model.common.MetaPropertyTarget; import alien4cloud.model.orchestrators.locations.Location; +import alien4cloud.orchestrators.locations.services.LocationService; /** * YorcLocationModifier allow to set the location metadata on nodes to indicate @@ -36,38 +34,38 @@ public class YorcLocationModifier extends TopologyModifierSupport { @Resource protected MetaPropertiesService metaPropertiesService; + @Resource + protected LocationService locationService; + @Override public void process(Topology topology, FlowExecutionContext context) { String yorcLocation = getProvidedMetaproperty(context, YORC_LOCATION_METAPROP_NAME); if (yorcLocation != null && !"".equals(yorcLocation)) { - setYorcLocation(topology, yorcLocation); + setYorcLocation(topology, context, yorcLocation); return; } Location location = getLocation(context); if (location!= null) { - setYorcLocation(topology, location.getName()); + setYorcLocation(topology, context, location.getName()); } } - private void setYorcLocation(Topology topology, String yorcLocation) { - safe(topology.getNodeTemplates()).values().forEach(node -> { + private void setYorcLocation(Topology topology, FlowExecutionContext context, String yorcLocation) { + safe(this.getNodes(context, topology)).forEach(node -> { setNodeTagValue(node, YORC_LOCATION_TAG_NAME, yorcLocation); }); } private Location getLocation(FlowExecutionContext context) { - Object deploymentLocations = context.getExecutionCache() - .get(FlowExecutionContext.DEPLOYMENT_LOCATIONS_MAP_CACHE_KEY); - if (deploymentLocations != null && deploymentLocations instanceof Map) { - Map locations = (Map) deploymentLocations; - Optional l = locations.values().stream().findFirst(); - if (l.isPresent()) { - return l.get(); - } + String locationId = (String) context.getExecutionCache() + .get(FlowExecutionContext.ORIGIN_LOCATION_FOR_MODIFIER); + if (locationId == null) { + context.log().error("A context location is expected for YorcLocationModifier, this modifier may be bind to the wrong phase"); + return null; } - return null; + return locationService.getOrFail(locationId); } /** diff --git a/src/main/java/alien4cloud/paas/yorc/modifier/policies/OpenStackServerGroupTopologyModifier.java b/src/main/java/alien4cloud/paas/yorc/modifier/policies/OpenStackServerGroupTopologyModifier.java index 4a456e0..e156601 100644 --- a/src/main/java/alien4cloud/paas/yorc/modifier/policies/OpenStackServerGroupTopologyModifier.java +++ b/src/main/java/alien4cloud/paas/yorc/modifier/policies/OpenStackServerGroupTopologyModifier.java @@ -15,10 +15,18 @@ */ package alien4cloud.paas.yorc.modifier.policies; -import alien4cloud.paas.wf.validation.WorkflowValidator; -import alien4cloud.tosca.context.ToscaContextual; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import static alien4cloud.utils.AlienUtils.safe; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.inject.Inject; + import org.alien4cloud.alm.deployment.configuration.flow.FlowExecutionContext; import org.alien4cloud.tosca.catalog.index.IToscaTypeSearchService; import org.alien4cloud.tosca.model.Csar; @@ -32,11 +40,10 @@ import org.alien4cloud.tosca.model.types.PolicyType; import org.springframework.stereotype.Component; -import javax.inject.Inject; -import java.util.*; -import java.util.stream.Collectors; - -import static alien4cloud.utils.AlienUtils.safe; +import alien4cloud.paas.wf.validation.WorkflowValidator; +import alien4cloud.tosca.context.ToscaContextual; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; @Slf4j @@ -145,7 +152,7 @@ private void apply(final PolicyTemplate policy, final Topology topology, final F // Creating a new Server group associated to the policy String name = policy.getName() + "_sg"; - NodeTemplate serverGroupNodeTemplate = addNodeTemplate( + NodeTemplate serverGroupNodeTemplate = addNodeTemplate(context, csar, topology, name,