2 * Copyright © 2016-2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openecomp.sdc.translator.services.heattotosca;
19 import com.google.common.collect.ArrayListMultimap;
20 import com.google.common.collect.ListMultimap;
21 import org.apache.commons.collections4.MapUtils;
22 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
23 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
24 import org.openecomp.sdc.tosca.services.DataModelUtil;
25 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
26 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
27 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
28 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
29 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
31 import java.util.ArrayList;
32 import java.util.Collection;
33 import java.util.Collections;
34 import java.util.HashMap;
35 import java.util.List;
37 import java.util.Objects;
38 import java.util.Optional;
41 * Utility class for consolidation data collection helper methods.
43 public class UnifiedCompositionUtil {
45 private UnifiedCompositionUtil() {
46 //Hiding the implicit public constructor
50 * Gets all ports per port type, which are connected to the computes from the input
51 * computeTemplateConsolidationDataCollection.
53 * @param computeTemplateConsolidationDataCollection collection of compute template
55 * @return set of port ids, per port type
57 static Map<String, List<String>> collectAllPortsFromEachTypesFromComputes(
58 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) {
59 Map<String, List<String>> portTypeToIds = new HashMap<>();
61 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) {
62 Map<String, List<String>> ports = compute.getPorts();
63 if (!MapUtils.isEmpty(ports)) {
64 addPortsToMap(portTypeToIds, ports);
71 static ListMultimap<String, SubInterfaceTemplateConsolidationData>
72 collectAllSubInterfacesOfEachTypesFromPorts(Collection<PortTemplateConsolidationData>
73 portTemplateConsolidationDataCollection) {
74 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceDataByType = ArrayListMultimap.create();
75 for (PortTemplateConsolidationData port : portTemplateConsolidationDataCollection) {
76 port.copyMappedInto(subInterfaceDataByType);
78 return subInterfaceDataByType;
81 private static void addPortsToMap(Map<String, List<String>> portTypeToIds,
82 Map<String, List<String>> ports) {
83 for (Map.Entry<String, List<String>> portTypeToIdEntry : ports.entrySet()) {
84 portTypeToIds.putIfAbsent(portTypeToIdEntry.getKey(), new ArrayList<>());
85 portTypeToIds.get(portTypeToIdEntry.getKey()).addAll(portTypeToIdEntry.getValue());
89 static String getComputeTypeSuffix(ServiceTemplate serviceTemplate,
90 String computeNodeTemplateId) {
91 NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
92 if (Objects.nonNull(computeNodeTemplate)) {
93 return getComputeTypeSuffix(computeNodeTemplate.getType());
98 public static String getNewComputeNodeTemplateId(ServiceTemplate serviceTemplate, String computeNodeTemplateId) {
99 return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
102 static String getComputeTypeSuffix(String computeType) {
103 return DataModelUtil.getNamespaceSuffix(computeType);
106 public static ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
107 List<UnifiedCompositionData> unifiedCompositionDataList,
108 String portNodeTemplateId) {
109 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
110 if (Objects.isNull(unifiedCompositionData.getComputeTemplateConsolidationData().getPorts())) {
113 Collection<List<String>> portsCollection =
114 unifiedCompositionData.getComputeTemplateConsolidationData().getPorts().values();
115 for (List<String> portIdList : portsCollection) {
116 if (portIdList.contains(portNodeTemplateId)) {
117 return unifiedCompositionData.getComputeTemplateConsolidationData();
124 //The ID should be <vm_type>_<port_type> or <vm_type>_<portNodeTemplateId>
125 public static String getNewPortNodeTemplateId(
126 String portNodeTemplateId,
127 String connectedComputeNodeType,
128 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
130 StringBuilder newPortNodeTemplateId = new StringBuilder();
131 String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId);
132 newPortNodeTemplateId.append(DataModelUtil.getNamespaceSuffix(connectedComputeNodeType));
133 if (computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
135 newPortNodeTemplateId.append("_").append(portNodeTemplateId);
138 newPortNodeTemplateId.append("_").append(portType);
140 return newPortNodeTemplateId.toString();
143 public static String getNewSubInterfaceNodeTemplateId(ServiceTemplate serviceTemplate,
144 String connectedComputeNodeType,
145 ComputeTemplateConsolidationData computeTemplateConsolidationData,
146 SubInterfaceTemplateConsolidationData
147 subInterfaceTemplateConsolidationData,
148 TranslationContext context) {
149 //The ID should be <vm_type>_<portType/NodetemplateId>_<subInterface_type>
150 // or <vm_type>_<portType/NodetemplateId>_<subInterfaceNodeTemplateId>
151 StringBuilder newSubInterfaceNodeTemplateId = new StringBuilder();
152 newSubInterfaceNodeTemplateId.append(getNewPortNodeTemplateId(subInterfaceTemplateConsolidationData
153 .getParentPortNodeTemplateId(), connectedComputeNodeType, computeTemplateConsolidationData));
154 Optional<PortTemplateConsolidationData> portTemplateConsolidationData =
155 subInterfaceTemplateConsolidationData.getParentPortTemplateConsolidationData(serviceTemplate, context);
156 NodeTemplate subInterfaceNodeTemplate =
157 DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData.getNodeTemplateId());
158 if (portTemplateConsolidationData.isPresent()) {
159 String subInterfaceSuffix = getSubInterfaceSuffix(portTemplateConsolidationData.get(),
160 subInterfaceNodeTemplate, subInterfaceTemplateConsolidationData);
161 newSubInterfaceNodeTemplateId.append("_").append(subInterfaceSuffix);
162 return newSubInterfaceNodeTemplateId.toString();
164 return subInterfaceTemplateConsolidationData.getNodeTemplateId();
167 static String getSubInterfaceTypeSuffix(String nodeType) {
168 return DataModelUtil.getNamespaceSuffix(nodeType);
171 public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
172 UnifiedCompositionData unifiedCompositionData) {
173 return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? Collections.emptyList() :
174 unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
177 private static String getSubInterfaceSuffix(PortTemplateConsolidationData portTemplateConsolidationData,
178 NodeTemplate subInterfaceNodeTemplate,
179 SubInterfaceTemplateConsolidationData
180 subInterfaceTemplateConsolidationData) {
181 if (portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(subInterfaceNodeTemplate.getType())) {
182 //If there are more than one subinterfaces with same type use node template id
183 return subInterfaceTemplateConsolidationData.getNodeTemplateId();
185 //Add sub interface type since we have only one subinterface per type
186 return getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());