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.CollectionUtils;
22 import org.apache.commons.collections4.MapUtils;
23 import org.openecomp.sdc.logging.api.Logger;
24 import org.openecomp.sdc.logging.api.LoggerFactory;
25 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
26 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
27 import org.openecomp.sdc.tosca.services.DataModelUtil;
28 import org.openecomp.sdc.tosca.services.ToscaUtil;
29 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
30 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
31 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
32 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.FilePortConsolidationData;
33 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
34 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.HashMap;
39 import java.util.List;
41 import java.util.Objects;
43 import java.util.stream.Collectors;
46 * Utility class for consolidation data collection helper methods.
48 public class UnifiedCompositionUtil {
50 protected static Logger logger = LoggerFactory.getLogger(UnifiedCompositionUtil.class);
52 private UnifiedCompositionUtil() {
53 //Hiding the implicit public constructor
57 * Gets all ports per port type, which are connected to the computes from the input
58 * computeTemplateConsolidationDataCollection.
60 * @param computeTemplateConsolidationDataCollection collection of compute template
62 * @return set of port ids, per port type
64 static Map<String, List<String>> collectAllPortsFromEachTypesFromComputes(
65 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) {
66 Map<String, List<String>> portTypeToIds = new HashMap<>();
68 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) {
69 Map<String, List<String>> ports = compute.getPorts();
70 if (!MapUtils.isEmpty(ports)) {
71 addPortsToMap(portTypeToIds, ports);
78 static ListMultimap<String, SubInterfaceTemplateConsolidationData>
79 collectAllSubInterfacesOfEachTypesFromPorts(Collection<PortTemplateConsolidationData>
80 portTemplateConsolidationDataCollection) {
81 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceDataByType = ArrayListMultimap.create();
82 for (PortTemplateConsolidationData port : portTemplateConsolidationDataCollection) {
83 Set<String> allSubInterfaceNodeTypes = port.getAllSubInterfaceNodeTypes();
84 if (CollectionUtils.isEmpty(allSubInterfaceNodeTypes)) {
87 for (String subInterfaceNodeType : allSubInterfaceNodeTypes) {
88 subInterfaceDataByType.putAll(subInterfaceNodeType,
89 port.getSubInterfaceConsolidationData(subInterfaceNodeType));
92 return subInterfaceDataByType;
95 static List<String> getSubInterfaceNodeTemplateIdsByType(PortTemplateConsolidationData
96 portTemplateConsolidationData,
97 String subInterfaceType) {
98 List<String> subInterfaceNodeTemplateIds = new ArrayList<>();
99 List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
100 portTemplateConsolidationData.getSubInterfaceConsolidationData(subInterfaceType);
101 if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) {
102 subInterfaceNodeTemplateIds = subInterfaceTemplateConsolidationDataList.stream()
103 .map(SubInterfaceTemplateConsolidationData::getNodeTemplateId)
104 .collect(Collectors.toList());
106 return subInterfaceNodeTemplateIds;
109 private static void addPortsToMap(Map<String, List<String>> portTypeToIds,
110 Map<String, List<String>> ports) {
111 for (Map.Entry<String, List<String>> portTypeToIdEntry : ports.entrySet()) {
112 portTypeToIds.putIfAbsent(portTypeToIdEntry.getKey(), new ArrayList<>());
113 portTypeToIds.get(portTypeToIdEntry.getKey()).addAll(portTypeToIdEntry.getValue());
117 static String getComputeTypeSuffix(ServiceTemplate serviceTemplate,
118 String computeNodeTemplateId) {
119 NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
120 if (Objects.nonNull(computeNodeTemplate)) {
121 return getComputeTypeSuffix(computeNodeTemplate.getType());
126 public static String getNewComputeNodeTemplateId(ServiceTemplate serviceTemplate, String computeNodeTemplateId) {
127 return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
130 static String getComputeTypeSuffix(String computeType) {
131 return DataModelUtil.getNamespaceSuffix(computeType);
134 public static ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
135 List<UnifiedCompositionData> unifiedCompositionDataList,
136 String portNodeTemplateId) {
137 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
138 if (Objects.isNull(unifiedCompositionData.getComputeTemplateConsolidationData().getPorts())) {
141 Collection<List<String>> portsCollection =
142 unifiedCompositionData.getComputeTemplateConsolidationData().getPorts().values();
143 for (List<String> portIdList : portsCollection) {
144 if (portIdList.contains(portNodeTemplateId)) {
145 return unifiedCompositionData.getComputeTemplateConsolidationData();
152 //The ID should be <vm_type>_<port_type> or <vm_type>_<portNodeTemplateId>
153 public static String getNewPortNodeTemplateId(
154 String portNodeTemplateId,
155 String connectedComputeNodeType,
156 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
158 StringBuilder newPortNodeTemplateId = new StringBuilder();
159 String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId);
160 newPortNodeTemplateId.append(DataModelUtil.getNamespaceSuffix(connectedComputeNodeType));
161 if (computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
163 newPortNodeTemplateId.append("_").append(portNodeTemplateId);
166 newPortNodeTemplateId.append("_").append(portType);
168 return newPortNodeTemplateId.toString();
171 public static String getNewSubInterfaceNodeTemplateId(ServiceTemplate serviceTemplate,
172 String connectedComputeNodeType,
173 ComputeTemplateConsolidationData computeTemplateConsolidationData,
174 SubInterfaceTemplateConsolidationData
175 subInterfaceTemplateConsolidationData,
176 TranslationContext context) {
177 //The ID should be <vm_type>_<portType/NodetemplateId>_<subInterface_type>
178 // or <vm_type>_<portType/NodetemplateId>_<subInterfaceNodeTemplateId>
179 StringBuilder newSubInterfaceNodeTemplateId = new StringBuilder();
180 newSubInterfaceNodeTemplateId.append(getNewPortNodeTemplateId(subInterfaceTemplateConsolidationData
181 .getParentPortNodeTemplateId(), connectedComputeNodeType, computeTemplateConsolidationData));
182 PortTemplateConsolidationData portTemplateConsolidationData =
183 getSubInterfacePortTemplateConsolidationData(serviceTemplate, subInterfaceTemplateConsolidationData, context);
184 NodeTemplate subInterfaceNodeTemplate =
185 DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData.getNodeTemplateId());
186 if (Objects.nonNull(portTemplateConsolidationData)) {
187 List<String> subInterfaceNodeTemplateIdsByType =
188 UnifiedCompositionUtil.getSubInterfaceNodeTemplateIdsByType(portTemplateConsolidationData,
189 subInterfaceNodeTemplate.getType());
190 if (CollectionUtils.isNotEmpty(subInterfaceNodeTemplateIdsByType)) {
191 //If there are more than one subinterfaces with same type use node template id
192 if (subInterfaceNodeTemplateIdsByType.size() > 1) {
193 newSubInterfaceNodeTemplateId.append("_").append(subInterfaceTemplateConsolidationData.getNodeTemplateId());
195 //Add sub interface type since we have only one subinterface per type
196 String subInterfaceTypeSuffix = getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
197 newSubInterfaceNodeTemplateId.append("_").append(subInterfaceTypeSuffix);
199 return newSubInterfaceNodeTemplateId.toString();
202 return subInterfaceTemplateConsolidationData.getNodeTemplateId();
205 static PortTemplateConsolidationData getSubInterfacePortTemplateConsolidationData(ServiceTemplate serviceTemplate,
206 SubInterfaceTemplateConsolidationData
207 subInterfaceTemplateConsolidationData,
208 TranslationContext context) {
209 FilePortConsolidationData filePortConsolidationData = context.getConsolidationData().getPortConsolidationData()
210 .getFilePortConsolidationData(ToscaUtil.getServiceTemplateFileName(serviceTemplate));
211 PortTemplateConsolidationData portTemplateConsolidationData = null;
212 if (filePortConsolidationData != null) {
213 portTemplateConsolidationData = filePortConsolidationData
214 .getPortTemplateConsolidationData(subInterfaceTemplateConsolidationData.getParentPortNodeTemplateId());
216 return portTemplateConsolidationData;
219 static String getSubInterfaceTypeSuffix(String nodeType) {
220 return DataModelUtil.getNamespaceSuffix(nodeType);
223 public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
224 UnifiedCompositionData unifiedCompositionData) {
225 return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? new
226 ArrayList<>() : unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();