summaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java')
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java686
1 files changed, 306 insertions, 380 deletions
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java
index 00781c1512..15289025b1 100644
--- a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/composition/CompositionDataExtractorImpl.java
@@ -13,10 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.openecomp.sdc.vendorsoftwareproduct.services.impl.composition;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
@@ -27,7 +33,11 @@ import org.onap.sdc.tosca.services.ToscaExtensionYamlUtil;
import org.openecomp.sdc.common.errors.CoreException;
import org.openecomp.sdc.logging.api.Logger;
import org.openecomp.sdc.logging.api.LoggerFactory;
-import org.openecomp.sdc.tosca.datatypes.*;
+import org.openecomp.sdc.tosca.datatypes.ToscaCapabilityType;
+import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
+import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
+import org.openecomp.sdc.tosca.datatypes.ToscaRelationshipType;
+import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
import org.openecomp.sdc.tosca.errors.ToscaInvalidEntryNotFoundErrorBuilder;
import org.openecomp.sdc.tosca.errors.ToscaInvalidSubstituteNodeTemplateErrorBuilder;
import org.openecomp.sdc.tosca.errors.ToscaMissingSubstitutionMappingForReqCapErrorBuilder;
@@ -35,427 +45,343 @@ import org.openecomp.sdc.tosca.services.ToscaAnalyzerService;
import org.openecomp.sdc.tosca.services.ToscaConstants;
import org.openecomp.sdc.tosca.services.impl.ToscaAnalyzerServiceImpl;
import org.openecomp.sdc.vendorsoftwareproduct.services.composition.CompositionDataExtractor;
-import org.openecomp.sdc.vendorsoftwareproduct.types.composition.*;
-
-import java.util.*;
-import java.util.stream.Collectors;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Component;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComponentData;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.CompositionData;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ComputeData;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.ExtractCompositionDataContext;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Image;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Network;
+import org.openecomp.sdc.vendorsoftwareproduct.types.composition.Nic;
public class CompositionDataExtractorImpl implements CompositionDataExtractor {
- protected static Logger logger;
- private static ToscaAnalyzerService toscaAnalyzerService;
- static {
- logger = LoggerFactory.getLogger(CompositionDataExtractorImpl.class);
- toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
- }
+ protected static Logger logger;
+ private static ToscaAnalyzerService toscaAnalyzerService;
- /**
- * Extract service composition data composition data.
- *
- * @param toscaServiceModel the tosca service model
- * @return the composition data
- */
- public CompositionData extractServiceCompositionData(ToscaServiceModel toscaServiceModel) {
- ExtractCompositionDataContext context = new ExtractCompositionDataContext();
- String entryDefinitionServiceTemplateFileName =
- toscaServiceModel.getEntryDefinitionServiceTemplate();
- ServiceTemplate entryDefinitionServiceTemplate =
- toscaServiceModel.getServiceTemplates().get(entryDefinitionServiceTemplateFileName);
- extractServiceCompositionData(entryDefinitionServiceTemplateFileName,
- entryDefinitionServiceTemplate, toscaServiceModel, context);
-
- CompositionData compositionData = new CompositionData();
- compositionData.setNetworks(context.getNetworks());
- compositionData.setComponents(context.getComponents());
- return compositionData;
- }
-
- private void extractServiceCompositionData(String serviceTemplateFileName,
- ServiceTemplate serviceTemplate,
- ToscaServiceModel toscaServiceModel,
- ExtractCompositionDataContext context) {
- if (context.getHandledServiceTemplates().contains(serviceTemplateFileName)) {
- return;
+ static {
+ logger = LoggerFactory.getLogger(CompositionDataExtractorImpl.class);
+ toscaAnalyzerService = new ToscaAnalyzerServiceImpl();
}
- context.addNetworks(extractNetworks(serviceTemplate, toscaServiceModel));
- extractComponents(serviceTemplate, toscaServiceModel, context);
- handleSubstitution(serviceTemplate, toscaServiceModel, context);
- context.addHandledServiceTemplates(serviceTemplateFileName);
- }
- private void handleSubstitution(ServiceTemplate serviceTemplate,
- ToscaServiceModel toscaServiceModel,
- ExtractCompositionDataContext context) {
- Map<String, NodeTemplate> substitutableNodeTemplates =
- toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplate);
-
- if (substitutableNodeTemplates != null) {
- for (String substitutableNodeTemplateId : substitutableNodeTemplates.keySet()) {
- handleSubstitutableNodeTemplate(serviceTemplate, toscaServiceModel,
- substitutableNodeTemplateId,
- substitutableNodeTemplates.get(substitutableNodeTemplateId), context);
- }
+ /**
+ * Extract service composition data composition data.
+ *
+ * @param toscaServiceModel the tosca service model
+ * @return the composition data
+ */
+ public CompositionData extractServiceCompositionData(ToscaServiceModel toscaServiceModel) {
+ ExtractCompositionDataContext context = new ExtractCompositionDataContext();
+ String entryDefinitionServiceTemplateFileName = toscaServiceModel.getEntryDefinitionServiceTemplate();
+ ServiceTemplate entryDefinitionServiceTemplate = toscaServiceModel.getServiceTemplates().get(entryDefinitionServiceTemplateFileName);
+ extractServiceCompositionData(entryDefinitionServiceTemplateFileName, entryDefinitionServiceTemplate, toscaServiceModel, context);
+ CompositionData compositionData = new CompositionData();
+ compositionData.setNetworks(context.getNetworks());
+ compositionData.setComponents(context.getComponents());
+ return compositionData;
}
- }
- private void handleSubstitutableNodeTemplate(ServiceTemplate serviceTemplate,
- ToscaServiceModel toscaServiceModel,
- String substitutableNodeTemplateId,
- NodeTemplate substitutableNodeTemplate,
- ExtractCompositionDataContext context) {
- ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
- Optional<String> substituteServiceTemplateFileName = toscaAnalyzerService
- .getSubstituteServiceTemplateName(substitutableNodeTemplateId, substitutableNodeTemplate);
- if (!substituteServiceTemplateFileName.isPresent()) {
- throw new CoreException(
- new ToscaInvalidSubstituteNodeTemplateErrorBuilder(substitutableNodeTemplateId).build());
- }
- if (context.getHandledServiceTemplates().contains(substituteServiceTemplateFileName.get())) {
- //each substitution is should be handled once, and will get the connection to the upper
- // service level according to the first one which was processed
- return;
- }
-
- ServiceTemplate substituteServiceTemplate =
- toscaServiceModel.getServiceTemplates().get(substituteServiceTemplateFileName.get());
- extractServiceCompositionData(substituteServiceTemplateFileName.get(),
- substituteServiceTemplate, toscaServiceModel, context);
-
- List<Map<String, RequirementAssignment>> substitutableRequirements =
- substitutableNodeTemplate.getRequirements();
-
- if (CollectionUtils.isEmpty(substitutableRequirements)) {
- return;
+ private void extractServiceCompositionData(String serviceTemplateFileName, ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel,
+ ExtractCompositionDataContext context) {
+ if (context.getHandledServiceTemplates().contains(serviceTemplateFileName)) {
+ return;
+ }
+ context.addNetworks(extractNetworks(serviceTemplate, toscaServiceModel));
+ extractComponents(serviceTemplate, toscaServiceModel, context);
+ handleSubstitution(serviceTemplate, toscaServiceModel, context);
+ context.addHandledServiceTemplates(serviceTemplateFileName);
}
- for (Map<String, RequirementAssignment> substitutableReq : substitutableRequirements) {
- substitutableReq.keySet().stream().filter(reqId -> {
- RequirementAssignment reqAssignment = toscaExtensionYamlUtil
- .yamlToObject(toscaExtensionYamlUtil.objectToYaml(substitutableReq.get(reqId)),
- RequirementAssignment.class);
- return isLinkToNetworkRequirementAssignment(reqAssignment);
- }).forEach(reqId -> {
- RequirementAssignment linkToNetworkRequirement = toscaExtensionYamlUtil
- .yamlToObject(toscaExtensionYamlUtil.objectToYaml(substitutableReq.get(reqId)),
- RequirementAssignment.class);
- String connectedNodeId = linkToNetworkRequirement.getNode();
- Optional<NodeTemplate> connectedNodeTemplate =
- toscaAnalyzerService.getNodeTemplateById(serviceTemplate, connectedNodeId);
-
- if (connectedNodeTemplate.isPresent() && toscaAnalyzerService
- .isTypeOf(connectedNodeTemplate.get(), ToscaNodeType.NATIVE_NETWORK,
- serviceTemplate, toscaServiceModel)) {
- Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService
- .getSubstitutionMappedNodeTemplateByExposedReq(
- substituteServiceTemplateFileName.get(), substituteServiceTemplate, reqId);
- if (!mappedNodeTemplate.isPresent()) {
- throw new CoreException(new ToscaMissingSubstitutionMappingForReqCapErrorBuilder(
- ToscaMissingSubstitutionMappingForReqCapErrorBuilder.MappingExposedEntry
- .REQUIREMENT, connectedNodeId).build());
- }
-
- if (toscaAnalyzerService.isTypeOf(mappedNodeTemplate.get().getValue(),
- ToscaNodeType.NATIVE_NETWORK_PORT, serviceTemplate,
- toscaServiceModel)) {
- Nic port = context.getNics().get(mappedNodeTemplate.get().getKey());
- if (port != null) {
- port.setNetworkName(connectedNodeId);
- } else {
- logger.warn(
- "Different ports define for the same component which is used in different "
- + "substitution service templates.");
+ private void handleSubstitution(ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel, ExtractCompositionDataContext context) {
+ Map<String, NodeTemplate> substitutableNodeTemplates = toscaAnalyzerService.getSubstitutableNodeTemplates(serviceTemplate);
+ if (substitutableNodeTemplates != null) {
+ for (String substitutableNodeTemplateId : substitutableNodeTemplates.keySet()) {
+ handleSubstitutableNodeTemplate(serviceTemplate, toscaServiceModel, substitutableNodeTemplateId,
+ substitutableNodeTemplates.get(substitutableNodeTemplateId), context);
}
- }
- } else if (!connectedNodeTemplate.isPresent()) {
- throw new CoreException(
- new ToscaInvalidEntryNotFoundErrorBuilder("Node Template", connectedNodeId).build());
}
- });
}
- }
- private boolean isLinkToNetworkRequirementAssignment(RequirementAssignment requirement) {
- return toscaAnalyzerService.isDesiredRequirementAssignment(requirement,
- ToscaCapabilityType.NATIVE_NETWORK_LINKABLE, null,
- ToscaRelationshipType.NATIVE_NETWORK_LINK_TO);
- }
-
-
- private void connectPortToNetwork(Nic port, NodeTemplate portNodeTemplate) {
- List<RequirementAssignment> linkRequirementsToNetwork =
- toscaAnalyzerService.getRequirements(portNodeTemplate, ToscaConstants.LINK_REQUIREMENT_ID);
+ private void handleSubstitutableNodeTemplate(ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel,
+ String substitutableNodeTemplateId, NodeTemplate substitutableNodeTemplate,
+ ExtractCompositionDataContext context) {
+ ToscaExtensionYamlUtil toscaExtensionYamlUtil = new ToscaExtensionYamlUtil();
+ Optional<String> substituteServiceTemplateFileName = toscaAnalyzerService
+ .getSubstituteServiceTemplateName(substitutableNodeTemplateId, substitutableNodeTemplate);
+ if (!substituteServiceTemplateFileName.isPresent()) {
+ throw new CoreException(new ToscaInvalidSubstituteNodeTemplateErrorBuilder(substitutableNodeTemplateId).build());
+ }
+ if (context.getHandledServiceTemplates().contains(substituteServiceTemplateFileName.get())) {
+ //each substitution is should be handled once, and will get the connection to the upper
- //port is connected to one network
- for (RequirementAssignment linkRequirementToNetwork : linkRequirementsToNetwork) {
- port.setNetworkName(linkRequirementToNetwork.getNode());
+ // service level according to the first one which was processed
+ return;
+ }
+ ServiceTemplate substituteServiceTemplate = toscaServiceModel.getServiceTemplates().get(substituteServiceTemplateFileName.get());
+ extractServiceCompositionData(substituteServiceTemplateFileName.get(), substituteServiceTemplate, toscaServiceModel, context);
+ List<Map<String, RequirementAssignment>> substitutableRequirements = substitutableNodeTemplate.getRequirements();
+ if (CollectionUtils.isEmpty(substitutableRequirements)) {
+ return;
+ }
+ for (Map<String, RequirementAssignment> substitutableReq : substitutableRequirements) {
+ substitutableReq.keySet().stream().filter(reqId -> {
+ RequirementAssignment reqAssignment = toscaExtensionYamlUtil
+ .yamlToObject(toscaExtensionYamlUtil.objectToYaml(substitutableReq.get(reqId)), RequirementAssignment.class);
+ return isLinkToNetworkRequirementAssignment(reqAssignment);
+ }).forEach(reqId -> {
+ RequirementAssignment linkToNetworkRequirement = toscaExtensionYamlUtil
+ .yamlToObject(toscaExtensionYamlUtil.objectToYaml(substitutableReq.get(reqId)), RequirementAssignment.class);
+ String connectedNodeId = linkToNetworkRequirement.getNode();
+ Optional<NodeTemplate> connectedNodeTemplate = toscaAnalyzerService.getNodeTemplateById(serviceTemplate, connectedNodeId);
+ if (connectedNodeTemplate.isPresent() && toscaAnalyzerService
+ .isTypeOf(connectedNodeTemplate.get(), ToscaNodeType.NATIVE_NETWORK, serviceTemplate, toscaServiceModel)) {
+ Optional<Map.Entry<String, NodeTemplate>> mappedNodeTemplate = toscaAnalyzerService
+ .getSubstitutionMappedNodeTemplateByExposedReq(substituteServiceTemplateFileName.get(), substituteServiceTemplate, reqId);
+ if (!mappedNodeTemplate.isPresent()) {
+ throw new CoreException(new ToscaMissingSubstitutionMappingForReqCapErrorBuilder(
+ ToscaMissingSubstitutionMappingForReqCapErrorBuilder.MappingExposedEntry.REQUIREMENT, connectedNodeId).build());
+ }
+ if (toscaAnalyzerService
+ .isTypeOf(mappedNodeTemplate.get().getValue(), ToscaNodeType.NATIVE_NETWORK_PORT, serviceTemplate, toscaServiceModel)) {
+ Nic port = context.getNics().get(mappedNodeTemplate.get().getKey());
+ if (port != null) {
+ port.setNetworkName(connectedNodeId);
+ } else {
+ logger.warn(
+ "Different ports define for the same component which is used in different " + "substitution service templates.");
+ }
+ }
+ } else if (!connectedNodeTemplate.isPresent()) {
+ throw new CoreException(new ToscaInvalidEntryNotFoundErrorBuilder("Node Template", connectedNodeId).build());
+ }
+ });
+ }
}
- }
- /*
- return Map with key - compute node template id, value - list of connected port node template id
- */
- private Map<String, List<String>> getComputeToPortsConnection(
- Map<String, NodeTemplate> portNodeTemplates) {
- Map<String, List<String>> computeToPortConnection = new HashMap<>();
- if (MapUtils.isEmpty(portNodeTemplates)) {
- return computeToPortConnection;
+ private boolean isLinkToNetworkRequirementAssignment(RequirementAssignment requirement) {
+ return toscaAnalyzerService.isDesiredRequirementAssignment(requirement, ToscaCapabilityType.NATIVE_NETWORK_LINKABLE, null,
+ ToscaRelationshipType.NATIVE_NETWORK_LINK_TO);
}
- for (String portId : portNodeTemplates.keySet()) {
- List<RequirementAssignment> bindingRequirementsToCompute = toscaAnalyzerService
- .getRequirements(portNodeTemplates.get(portId), ToscaConstants.BINDING_REQUIREMENT_ID);
- for (RequirementAssignment bindingRequirementToCompute : bindingRequirementsToCompute) {
- computeToPortConnection
- .putIfAbsent(bindingRequirementToCompute.getNode(), new ArrayList<>());
- computeToPortConnection.get(bindingRequirementToCompute.getNode()).add(portId);
- }
- }
- return computeToPortConnection;
- }
- private void extractComponents(ServiceTemplate serviceTemplate,
- ToscaServiceModel toscaServiceModel,
- ExtractCompositionDataContext context) {
- Map<String, NodeTemplate> computeNodeTemplates = toscaAnalyzerService
- .getNodeTemplatesByType(serviceTemplate, ToscaNodeType.NATIVE_COMPUTE,
- toscaServiceModel);
- if (MapUtils.isEmpty(computeNodeTemplates)) {
- return;
+ private void connectPortToNetwork(Nic port, NodeTemplate portNodeTemplate) {
+ List<RequirementAssignment> linkRequirementsToNetwork = toscaAnalyzerService
+ .getRequirements(portNodeTemplate, ToscaConstants.LINK_REQUIREMENT_ID);
+ //port is connected to one network
+ for (RequirementAssignment linkRequirementToNetwork : linkRequirementsToNetwork) {
+ port.setNetworkName(linkRequirementToNetwork.getNode());
+ }
}
- Map<String, List<String>> imageNodeTemplates = getComponentImages(computeNodeTemplates,
- toscaServiceModel);
- Map<String, List<String>> computeFlavorNodeTemplates =
- getComponentComputeFlavor(computeNodeTemplates, toscaServiceModel);
- Map<String, NodeTemplate> portNodeTemplates = toscaAnalyzerService
- .getNodeTemplatesByType(serviceTemplate, ToscaNodeType.NATIVE_NETWORK_PORT,
- toscaServiceModel);
- Map<String, List<String>> computeToPortsConnection =
- getComputeToPortsConnection(portNodeTemplates);
- Map<String, List<String>> computesGroupedByType =
- getNodeTemplatesGroupedByType(computeNodeTemplates);
- computesGroupedByType.keySet()
- .stream()
- .filter(nodeType ->
- !context.getCreatedComponents().contains(nodeType))
- .forEach(nodeType -> extractComponent(serviceTemplate, computeToPortsConnection,
- computesGroupedByType, imageNodeTemplates, computeFlavorNodeTemplates, nodeType,
- context));
- }
-
- private Map<String,List<String>> getComponentImages(Map<String, NodeTemplate>
- computeNodeTemplates,
- ToscaServiceModel toscaServiceModel) {
- return getComponentProperty(ToscaConstants.COMPUTE_IMAGE, computeNodeTemplates, toscaServiceModel);
- }
-
- private Map<String,List<String>> getComponentComputeFlavor(Map<String, NodeTemplate>
- computeNodeTemplates,
- ToscaServiceModel toscaServiceModel) {
- return getComponentProperty(ToscaConstants.COMPUTE_FLAVOR, computeNodeTemplates, toscaServiceModel);
- }
-
- private Map<String, List<String>> getComponentProperty(String propertyName,
- Map<String, NodeTemplate> computeNodeTemplates,
- ToscaServiceModel toscaServiceModel) {
- Map<String,List<String>> componentPropertyValues = new HashMap<>();
- for (String component : computeNodeTemplates.keySet()) {
- List<String> computes = new ArrayList<>();
- Map<String,Object> properties = computeNodeTemplates.get(component).getProperties();
-
- if(MapUtils.isEmpty(properties)){
- continue;
- }
-
- List<Object> computesList = properties.entrySet()
- .stream()
- .filter(map -> map.getKey().equals(propertyName))
- .map(Map.Entry::getValue)
- .collect(Collectors.toList());
- for (Object obj : computesList) {
- if (obj instanceof String) {
- computes.add((String) obj);
- } else {
- Map<String, String> objMap = new ObjectMapper().convertValue(obj, Map.class);
- computes.add(getInputs(toscaServiceModel, objMap.get("get_input")));
+ /*
+ return Map with key - compute node template id, value - list of connected port node template id
+ */
+ private Map<String, List<String>> getComputeToPortsConnection(Map<String, NodeTemplate> portNodeTemplates) {
+ Map<String, List<String>> computeToPortConnection = new HashMap<>();
+ if (MapUtils.isEmpty(portNodeTemplates)) {
+ return computeToPortConnection;
}
- }
- componentPropertyValues.put(component,computes);
+ for (String portId : portNodeTemplates.keySet()) {
+ List<RequirementAssignment> bindingRequirementsToCompute = toscaAnalyzerService
+ .getRequirements(portNodeTemplates.get(portId), ToscaConstants.BINDING_REQUIREMENT_ID);
+ for (RequirementAssignment bindingRequirementToCompute : bindingRequirementsToCompute) {
+ computeToPortConnection.putIfAbsent(bindingRequirementToCompute.getNode(), new ArrayList<>());
+ computeToPortConnection.get(bindingRequirementToCompute.getNode()).add(portId);
+ }
+ }
+ return computeToPortConnection;
}
- return componentPropertyValues;
- }
-
- private String getInputs(ToscaServiceModel toscaServiceModel, String inputValue) {
- String mainTemplate = toscaServiceModel.getEntryDefinitionServiceTemplate();
- List<ServiceTemplate> toscaServiceTemplates = toscaServiceModel.getServiceTemplates().entrySet()
- .stream()
- .filter(map -> map.getKey().equals(mainTemplate))
- .map(Map.Entry::getValue)
- .collect(Collectors.toList());
- ServiceTemplate serviceTemplate = toscaServiceTemplates.get(0);
- if (Objects.nonNull(serviceTemplate.getTopology_template())
- && MapUtils.isNotEmpty(serviceTemplate.getTopology_template().getInputs())) {
- for (Map.Entry<String, ParameterDefinition> inputEntry : serviceTemplate
- .getTopology_template().getInputs().entrySet()) {
- if (inputEntry.getKey().equals(inputValue)) {
- String value;
- try {
- value= (String) inputEntry.getValue().get_default();
- } catch (Exception e) {
- logger.debug(e.getMessage(), e);
- value = inputEntry.getValue().get_default().toString();
- }
- return value;
+ private void extractComponents(ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel, ExtractCompositionDataContext context) {
+ Map<String, NodeTemplate> computeNodeTemplates = toscaAnalyzerService
+ .getNodeTemplatesByType(serviceTemplate, ToscaNodeType.NATIVE_COMPUTE, toscaServiceModel);
+ if (MapUtils.isEmpty(computeNodeTemplates)) {
+ return;
}
- }
+ Map<String, List<String>> imageNodeTemplates = getComponentImages(computeNodeTemplates, toscaServiceModel);
+ Map<String, List<String>> computeFlavorNodeTemplates = getComponentComputeFlavor(computeNodeTemplates, toscaServiceModel);
+ Map<String, NodeTemplate> portNodeTemplates = toscaAnalyzerService
+ .getNodeTemplatesByType(serviceTemplate, ToscaNodeType.NATIVE_NETWORK_PORT, toscaServiceModel);
+ Map<String, List<String>> computeToPortsConnection = getComputeToPortsConnection(portNodeTemplates);
+ Map<String, List<String>> computesGroupedByType = getNodeTemplatesGroupedByType(computeNodeTemplates);
+ computesGroupedByType.keySet().stream().filter(nodeType -> !context.getCreatedComponents().contains(nodeType)).forEach(
+ nodeType -> extractComponent(serviceTemplate, computeToPortsConnection, computesGroupedByType, imageNodeTemplates,
+ computeFlavorNodeTemplates, nodeType, context));
}
- return inputValue;
- }
-
- private void extractComponent(ServiceTemplate serviceTemplate,
- Map<String, List<String>> computeToPortsConnection,
- Map<String, List<String>> computesGroupedByType,
- Map<String, List<String>> imageList,
- Map<String, List<String>> computeFlavorNodeTemplates,
- String computeNodeType,
- ExtractCompositionDataContext context) {
- ComponentData component = new ComponentData();
- component.setName(computeNodeType);
- component.setDisplayName(getComponentDisplayName(component.getName()));
- Component componentModel = new Component();
- componentModel.setData(component);
-
- String computeId = computesGroupedByType.get(computeNodeType).get(0);
- List<String> connectedPortIds = computeToPortsConnection.get(computeId);
- List<String> images = imageList.get(computeId);
- List<String> computeFlavors = computeFlavorNodeTemplates.get(computeId);
- if (CollectionUtils.isNotEmpty(connectedPortIds)) {
- componentModel.setNics(new ArrayList<>());
- componentModel.setImages(new ArrayList<>());
- componentModel.setCompute(new ArrayList<>());
-
- connectedPortIds.forEach(portId -> {
- Nic port = extractPort(serviceTemplate, portId);
- componentModel.getNics().add(port);
- context.addNic(portId, port);
- });
-
- if (CollectionUtils.isNotEmpty(images)) {
- images.forEach(image -> {
- Image img = new Image(image);
- componentModel.getImages().add(img);
- context.addImage(image, img);
- });
- }
-
- if (CollectionUtils.isNotEmpty(computeFlavors)) {
- computeFlavors.forEach(flavor -> {
- ComputeData computeFlavor = new ComputeData(flavor);
- componentModel.getCompute().add(computeFlavor);
- context.addCompute(flavor, computeFlavor);
- });
- }
+ private Map<String, List<String>> getComponentImages(Map<String, NodeTemplate> computeNodeTemplates, ToscaServiceModel toscaServiceModel) {
+ return getComponentProperty(ToscaConstants.COMPUTE_IMAGE, computeNodeTemplates, toscaServiceModel);
}
- context.addComponent(componentModel);
- context.getCreatedComponents().add(computeNodeType);
- }
- private Nic extractPort(ServiceTemplate serviceTemplate, String portNodeTemplateId) {
- Optional<NodeTemplate> portNodeTemplate =
- toscaAnalyzerService.getNodeTemplateById(serviceTemplate, portNodeTemplateId);
- if (portNodeTemplate.isPresent()) {
- Nic port = new Nic();
- port.setName(portNodeTemplateId);
- connectPortToNetwork(port, portNodeTemplate.get());
- return port;
- } else {
- throw new CoreException(
- new ToscaInvalidEntryNotFoundErrorBuilder("Node Template", portNodeTemplateId).build());
+ private Map<String, List<String>> getComponentComputeFlavor(Map<String, NodeTemplate> computeNodeTemplates, ToscaServiceModel toscaServiceModel) {
+ return getComponentProperty(ToscaConstants.COMPUTE_FLAVOR, computeNodeTemplates, toscaServiceModel);
}
- }
- private Map<String, List<String>> getNodeTemplatesGroupedByType(
- Map<String, NodeTemplate> nodeTemplates) {
- Map<String, List<String>> nodeTemplatesGrouped =
- new HashMap<>(); //key - node type, value - list of node ids with this type
- for (String nodeId : nodeTemplates.keySet()) {
- String nodeType = nodeTemplates.get(nodeId).getType();
- nodeTemplatesGrouped.putIfAbsent(nodeType, new ArrayList<>());
- nodeTemplatesGrouped.get(nodeType).add(nodeId);
+ private Map<String, List<String>> getComponentProperty(String propertyName, Map<String, NodeTemplate> computeNodeTemplates,
+ ToscaServiceModel toscaServiceModel) {
+ Map<String, List<String>> componentPropertyValues = new HashMap<>();
+ for (String component : computeNodeTemplates.keySet()) {
+ List<String> computes = new ArrayList<>();
+ Map<String, Object> properties = computeNodeTemplates.get(component).getProperties();
+ if (MapUtils.isEmpty(properties)) {
+ continue;
+ }
+ List<Object> computesList = properties.entrySet().stream().filter(map -> map.getKey().equals(propertyName)).map(Map.Entry::getValue)
+ .collect(Collectors.toList());
+ for (Object obj : computesList) {
+ if (obj instanceof String) {
+ computes.add((String) obj);
+ } else {
+ Map<String, String> objMap = new ObjectMapper().convertValue(obj, Map.class);
+ computes.add(getInputs(toscaServiceModel, objMap.get("get_input")));
+ }
+ }
+ componentPropertyValues.put(component, computes);
+ }
+ return componentPropertyValues;
}
- return nodeTemplatesGrouped;
- }
- private List<Network> extractNetworks(ServiceTemplate serviceTemplate,
- ToscaServiceModel toscaServiceModel) {
- List<Network> networks = new ArrayList<>();
- Map<String, NodeTemplate> networkNodeTemplates = toscaAnalyzerService
- .getNodeTemplatesByType(serviceTemplate, ToscaNodeType.NATIVE_NETWORK,
- toscaServiceModel);
- if (MapUtils.isEmpty(networkNodeTemplates)) {
- return networks;
- }
- for (String networkId : networkNodeTemplates.keySet()) {
- Network network = new Network();
- network.setName(networkId);
- Optional<Boolean> networkDhcpValue =
- getNetworkDhcpValue(serviceTemplate, networkNodeTemplates.get(networkId));
- network.setDhcp(networkDhcpValue.orElse(true));
- networks.add(network);
+ private String getInputs(ToscaServiceModel toscaServiceModel, String inputValue) {
+ String mainTemplate = toscaServiceModel.getEntryDefinitionServiceTemplate();
+ List<ServiceTemplate> toscaServiceTemplates = toscaServiceModel.getServiceTemplates().entrySet().stream()
+ .filter(map -> map.getKey().equals(mainTemplate)).map(Map.Entry::getValue).collect(Collectors.toList());
+ ServiceTemplate serviceTemplate = toscaServiceTemplates.get(0);
+ if (Objects.nonNull(serviceTemplate.getTopology_template()) && MapUtils.isNotEmpty(serviceTemplate.getTopology_template().getInputs())) {
+ for (Map.Entry<String, ParameterDefinition> inputEntry : serviceTemplate.getTopology_template().getInputs().entrySet()) {
+ if (inputEntry.getKey().equals(inputValue)) {
+ String value;
+ try {
+ value = (String) inputEntry.getValue().get_default();
+ } catch (Exception e) {
+ logger.debug(e.getMessage(), e);
+ value = inputEntry.getValue().get_default().toString();
+ }
+ return value;
+ }
+ }
+ }
+ return inputValue;
}
- return networks;
- }
- //dhcp default value is true
- private Optional<Boolean> getNetworkDhcpValue(ServiceTemplate serviceTemplate,
- NodeTemplate networkNodeTemplate) {
- if (networkNodeTemplate == null) {
- return Optional.empty();
- }
- if (networkNodeTemplate.getProperties() == null
- || networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME)
- == null) {
- return Optional.of(true);
+ private void extractComponent(ServiceTemplate serviceTemplate, Map<String, List<String>> computeToPortsConnection,
+ Map<String, List<String>> computesGroupedByType, Map<String, List<String>> imageList,
+ Map<String, List<String>> computeFlavorNodeTemplates, String computeNodeType,
+ ExtractCompositionDataContext context) {
+ ComponentData component = new ComponentData();
+ component.setName(computeNodeType);
+ component.setDisplayName(getComponentDisplayName(component.getName()));
+ Component componentModel = new Component();
+ componentModel.setData(component);
+ String computeId = computesGroupedByType.get(computeNodeType).get(0);
+ List<String> connectedPortIds = computeToPortsConnection.get(computeId);
+ List<String> images = imageList.get(computeId);
+ List<String> computeFlavors = computeFlavorNodeTemplates.get(computeId);
+ if (CollectionUtils.isNotEmpty(connectedPortIds)) {
+ componentModel.setNics(new ArrayList<>());
+ componentModel.setImages(new ArrayList<>());
+ componentModel.setCompute(new ArrayList<>());
+ connectedPortIds.forEach(portId -> {
+ Nic port = extractPort(serviceTemplate, portId);
+ componentModel.getNics().add(port);
+ context.addNic(portId, port);
+ });
+ if (CollectionUtils.isNotEmpty(images)) {
+ images.forEach(image -> {
+ Image img = new Image(image);
+ componentModel.getImages().add(img);
+ context.addImage(image, img);
+ });
+ }
+ if (CollectionUtils.isNotEmpty(computeFlavors)) {
+ computeFlavors.forEach(flavor -> {
+ ComputeData computeFlavor = new ComputeData(flavor);
+ componentModel.getCompute().add(computeFlavor);
+ context.addCompute(flavor, computeFlavor);
+ });
+ }
+ }
+ context.addComponent(componentModel);
+ context.getCreatedComponents().add(computeNodeType);
}
- Object dhcp =
- networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME);
- if (dhcp instanceof String) {
- return Optional.of(Boolean.valueOf((String) dhcp));
- } else if (dhcp instanceof Boolean) {
- return Optional.of((Boolean) dhcp);
- } else if (dhcp instanceof Map) {
- String inputParameterName =
- (String) ((Map) dhcp).get(ToscaFunctions.GET_INPUT.getFunctionName());
- if (inputParameterName != null) {
- ParameterDefinition inputParameterDefinition =
- serviceTemplate.getTopology_template().getInputs().get(inputParameterName);
- if (inputParameterDefinition != null) {
- if (inputParameterDefinition.get_default() != null) {
- return Optional.of(Boolean.valueOf(inputParameterDefinition.get_default().toString()));
- }
+ private Nic extractPort(ServiceTemplate serviceTemplate, String portNodeTemplateId) {
+ Optional<NodeTemplate> portNodeTemplate = toscaAnalyzerService.getNodeTemplateById(serviceTemplate, portNodeTemplateId);
+ if (portNodeTemplate.isPresent()) {
+ Nic port = new Nic();
+ port.setName(portNodeTemplateId);
+ connectPortToNetwork(port, portNodeTemplate.get());
+ return port;
} else {
- throw new CoreException(
- new ToscaInvalidEntryNotFoundErrorBuilder("Input Parameter", inputParameterName)
- .build());
+ throw new CoreException(new ToscaInvalidEntryNotFoundErrorBuilder("Node Template", portNodeTemplateId).build());
}
- }
}
- return Optional.of(true);
- }
- @Override
- public String getComponentDisplayName(String componentName) {
- if (componentName == null) {
- return null;
+ private Map<String, List<String>> getNodeTemplatesGroupedByType(Map<String, NodeTemplate> nodeTemplates) {
+ Map<String, List<String>> nodeTemplatesGrouped =
+ new HashMap<>(); //key - node type, value - list of node ids with this type
+ for (String nodeId : nodeTemplates.keySet()) {
+ String nodeType = nodeTemplates.get(nodeId).getType();
+ nodeTemplatesGrouped.putIfAbsent(nodeType, new ArrayList<>());
+ nodeTemplatesGrouped.get(nodeType).add(nodeId);
+ }
+ return nodeTemplatesGrouped;
}
- String delimiterChar = ".";
- if (componentName.contains(delimiterChar)) {
- return componentName.substring(componentName.lastIndexOf(delimiterChar) + 1);
+
+ private List<Network> extractNetworks(ServiceTemplate serviceTemplate, ToscaServiceModel toscaServiceModel) {
+ List<Network> networks = new ArrayList<>();
+ Map<String, NodeTemplate> networkNodeTemplates = toscaAnalyzerService
+ .getNodeTemplatesByType(serviceTemplate, ToscaNodeType.NATIVE_NETWORK, toscaServiceModel);
+ if (MapUtils.isEmpty(networkNodeTemplates)) {
+ return networks;
+ }
+ for (String networkId : networkNodeTemplates.keySet()) {
+ Network network = new Network();
+ network.setName(networkId);
+ Optional<Boolean> networkDhcpValue = getNetworkDhcpValue(serviceTemplate, networkNodeTemplates.get(networkId));
+ network.setDhcp(networkDhcpValue.orElse(true));
+ networks.add(network);
+ }
+ return networks;
}
- return componentName;
- }
+ //dhcp default value is true
+ private Optional<Boolean> getNetworkDhcpValue(ServiceTemplate serviceTemplate, NodeTemplate networkNodeTemplate) {
+ if (networkNodeTemplate == null) {
+ return Optional.empty();
+ }
+ if (networkNodeTemplate.getProperties() == null
+ || networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME) == null) {
+ return Optional.of(true);
+ }
+ Object dhcp = networkNodeTemplate.getProperties().get(ToscaConstants.DHCP_ENABLED_PROPERTY_NAME);
+ if (dhcp instanceof String) {
+ return Optional.of(Boolean.valueOf((String) dhcp));
+ } else if (dhcp instanceof Boolean) {
+ return Optional.of((Boolean) dhcp);
+ } else if (dhcp instanceof Map) {
+ String inputParameterName = (String) ((Map) dhcp).get(ToscaFunctions.GET_INPUT.getFunctionName());
+ if (inputParameterName != null) {
+ ParameterDefinition inputParameterDefinition = serviceTemplate.getTopology_template().getInputs().get(inputParameterName);
+ if (inputParameterDefinition != null) {
+ if (inputParameterDefinition.get_default() != null) {
+ return Optional.of(Boolean.valueOf(inputParameterDefinition.get_default().toString()));
+ }
+ } else {
+ throw new CoreException(new ToscaInvalidEntryNotFoundErrorBuilder("Input Parameter", inputParameterName).build());
+ }
+ }
+ }
+ return Optional.of(true);
+ }
+ @Override
+ public String getComponentDisplayName(String componentName) {
+ if (componentName == null) {
+ return null;
+ }
+ String delimiterChar = ".";
+ if (componentName.contains(delimiterChar)) {
+ return componentName.substring(componentName.lastIndexOf(delimiterChar) + 1);
+ }
+ return componentName;
+ }
}