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;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.List;
28 import java.util.Objects;
29 import java.util.Optional;
31 import org.apache.commons.collections4.CollectionUtils;
32 import org.apache.commons.collections4.MapUtils;
33 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
34 import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
35 import org.openecomp.sdc.tosca.services.DataModelUtil;
36 import org.openecomp.sdc.translator.datatypes.heattotosca.TranslationContext;
37 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionData;
38 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.ComputeTemplateConsolidationData;
39 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.PortTemplateConsolidationData;
40 import org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolidation.SubInterfaceTemplateConsolidationData;
43 * Utility class for consolidation data collection helper methods.
45 public class UnifiedCompositionUtil {
47 private UnifiedCompositionUtil() {
48 //Hiding the implicit public constructor
52 * Gets all ports per port type, which are connected to the computes from the input
53 * computeTemplateConsolidationDataCollection.
55 * @param computeTemplateConsolidationDataCollection collection of compute template
57 * @return set of port ids, per port type
59 static Map<String, List<String>> collectAllPortsFromEachTypesFromComputes(
60 Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) {
61 Map<String, List<String>> portTypeToIds = new HashMap<>();
63 for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) {
64 Map<String, List<String>> ports = compute.getPorts();
65 if (!MapUtils.isEmpty(ports)) {
66 addPortsToMap(portTypeToIds, ports);
73 static ListMultimap<String, SubInterfaceTemplateConsolidationData>
74 collectAllSubInterfacesOfEachTypesFromPorts(Collection<PortTemplateConsolidationData>
75 portTemplateConsolidationDataCollection) {
76 ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceDataByType = ArrayListMultimap.create();
77 for (PortTemplateConsolidationData port : portTemplateConsolidationDataCollection) {
78 port.copyMappedInto(subInterfaceDataByType);
80 return subInterfaceDataByType;
83 private static void addPortsToMap(Map<String, List<String>> portTypeToIds,
84 Map<String, List<String>> ports) {
85 for (Map.Entry<String, List<String>> portTypeToIdEntry : ports.entrySet()) {
86 portTypeToIds.putIfAbsent(portTypeToIdEntry.getKey(), new ArrayList<>());
87 portTypeToIds.get(portTypeToIdEntry.getKey()).addAll(portTypeToIdEntry.getValue());
91 static String getComputeTypeSuffix(ServiceTemplate serviceTemplate,
92 String computeNodeTemplateId) {
93 NodeTemplate computeNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, computeNodeTemplateId);
94 if (Objects.nonNull(computeNodeTemplate)) {
95 return getComputeTypeSuffix(computeNodeTemplate.getType());
100 public static String getNewComputeNodeTemplateId(ServiceTemplate serviceTemplate, String computeNodeTemplateId) {
101 return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
104 static String getComputeTypeSuffix(String computeType) {
105 return DataModelUtil.getNamespaceSuffix(computeType);
108 public static ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
109 List<UnifiedCompositionData> unifiedCompositionDataList,
110 String portNodeTemplateId) {
111 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
112 if (Objects.isNull(unifiedCompositionData.getComputeTemplateConsolidationData().getPorts())) {
115 Collection<List<String>> portsCollection =
116 unifiedCompositionData.getComputeTemplateConsolidationData().getPorts().values();
117 for (List<String> portIdList : portsCollection) {
118 if (portIdList.contains(portNodeTemplateId)) {
119 return unifiedCompositionData.getComputeTemplateConsolidationData();
126 public static PortTemplateConsolidationData getPortTemplateConsolidationDataForPort(List<UnifiedCompositionData>
127 unifiedCompositionDataList,
128 String portNodeTemplateId) {
129 for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
130 if (CollectionUtils.isEmpty(unifiedCompositionData.getPortTemplateConsolidationDataList())) {
133 List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
134 unifiedCompositionData.getPortTemplateConsolidationDataList();
135 for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
136 if (portTemplateConsolidationData.getNodeTemplateId().equals(portNodeTemplateId)) {
137 return portTemplateConsolidationData;
144 //The ID should be <vm_type>_<port_type> or <vm_type>_<portNodeTemplateId>
145 public static String getNewPortNodeTemplateId(
146 String portNodeTemplateId,
147 String connectedComputeNodeType,
148 ComputeTemplateConsolidationData computeTemplateConsolidationData) {
150 StringBuilder newPortNodeTemplateId = new StringBuilder();
151 String portType = ConsolidationDataUtil.getPortType(portNodeTemplateId,
152 DataModelUtil.getNamespaceSuffix(connectedComputeNodeType));
153 newPortNodeTemplateId.append(DataModelUtil.getNamespaceSuffix(connectedComputeNodeType));
154 if (computeTemplateConsolidationData.getPorts().get(portType) != null
155 && computeTemplateConsolidationData.getPorts().get(portType).size() > 1) {
157 newPortNodeTemplateId.append("_").append(portNodeTemplateId);
160 newPortNodeTemplateId.append("_").append(portType);
162 return newPortNodeTemplateId.toString();
165 public static String getNewSubInterfaceNodeTemplateId(ServiceTemplate serviceTemplate,
166 String connectedComputeNodeType,
167 ComputeTemplateConsolidationData computeTemplateConsolidationData,
168 SubInterfaceTemplateConsolidationData
169 subInterfaceTemplateConsolidationData,
170 TranslationContext context) {
171 //The ID should be <vm_type>_<portType/NodetemplateId>_<subInterface_type>
172 // or <vm_type>_<portType/NodetemplateId>_<subInterfaceNodeTemplateId>
173 StringBuilder newSubInterfaceNodeTemplateId = new StringBuilder();
174 newSubInterfaceNodeTemplateId.append(getNewPortNodeTemplateId(subInterfaceTemplateConsolidationData
175 .getParentPortNodeTemplateId(), connectedComputeNodeType, computeTemplateConsolidationData));
176 Optional<PortTemplateConsolidationData> portTemplateConsolidationData =
177 subInterfaceTemplateConsolidationData.getParentPortTemplateConsolidationData(serviceTemplate, context);
178 NodeTemplate subInterfaceNodeTemplate =
179 DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData.getNodeTemplateId());
180 if (portTemplateConsolidationData.isPresent()) {
181 String subInterfaceSuffix = getSubInterfaceSuffix(portTemplateConsolidationData.get(),
182 subInterfaceNodeTemplate, subInterfaceTemplateConsolidationData);
183 newSubInterfaceNodeTemplateId.append("_").append(subInterfaceSuffix);
184 return newSubInterfaceNodeTemplateId.toString();
186 return subInterfaceTemplateConsolidationData.getNodeTemplateId();
189 static String getSubInterfaceTypeSuffix(String nodeType) {
190 return DataModelUtil.getNamespaceSuffix(nodeType);
193 public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
194 UnifiedCompositionData unifiedCompositionData) {
195 return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? Collections.emptyList() :
196 unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
199 private static String getSubInterfaceSuffix(PortTemplateConsolidationData portTemplateConsolidationData,
200 NodeTemplate subInterfaceNodeTemplate,
201 SubInterfaceTemplateConsolidationData
202 subInterfaceTemplateConsolidationData) {
203 if (portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(subInterfaceNodeTemplate.getType())) {
204 //If there are more than one subinterfaces with same type use node template id
205 return subInterfaceTemplateConsolidationData.getNodeTemplateId();
207 //Add sub interface type since we have only one subinterface per type
208 return getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
211 public static Map<String, List<String>> collectAllPortsOfEachTypeFromComputes(
212 List<UnifiedCompositionData> unifiedCompositionDataList) {
213 Map<String, List<String>> portIdsPerPortType = new HashMap<>();
214 unifiedCompositionDataList
215 .forEach(unifiedCompositionData ->
216 unifiedCompositionData.getComputeTemplateConsolidationData()
217 .collectAllPortsOfEachTypeFromCompute(portIdsPerPortType));
219 return portIdsPerPortType;