4d9a269c2ebdc6eebc4005d2642c3ef9f7807003
[sdc.git] /
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.openecomp.sdc.translator.services.heattotosca;
18
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;
35
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Map;
41 import java.util.Objects;
42 import java.util.Set;
43 import java.util.stream.Collectors;
44
45 /**
46  * Utility class for consolidation data collection helper methods.
47  */
48 public class UnifiedCompositionUtil {
49
50   protected static Logger logger = LoggerFactory.getLogger(UnifiedCompositionUtil.class);
51
52   private UnifiedCompositionUtil() {
53     //Hiding the implicit public constructor
54   }
55
56   /**
57    * Gets all ports per port type, which are connected to the computes from the input
58    * computeTemplateConsolidationDataCollection.
59    *
60    * @param computeTemplateConsolidationDataCollection collection of compute template
61    *                                                   consolidation data
62    * @return set of port ids, per port type
63    */
64   static Map<String, List<String>> collectAllPortsFromEachTypesFromComputes(
65       Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) {
66     Map<String, List<String>> portTypeToIds = new HashMap<>();
67
68     for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) {
69       Map<String, List<String>> ports = compute.getPorts();
70       if (!MapUtils.isEmpty(ports)) {
71         addPortsToMap(portTypeToIds, ports);
72       }
73     }
74
75     return portTypeToIds;
76   }
77
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)) {
85         continue;
86       }
87       for (String subInterfaceNodeType : allSubInterfaceNodeTypes) {
88         subInterfaceDataByType.putAll(subInterfaceNodeType,
89             port.getSubInterfaceConsolidationData(subInterfaceNodeType));
90       }
91     }
92     return subInterfaceDataByType;
93   }
94
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());
105     }
106     return subInterfaceNodeTemplateIds;
107   }
108
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());
114     }
115   }
116
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());
122     }
123     return null;
124   }
125
126   public static String getNewComputeNodeTemplateId(ServiceTemplate serviceTemplate, String computeNodeTemplateId) {
127     return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
128   }
129
130   static String getComputeTypeSuffix(String computeType) {
131     return DataModelUtil.getNamespaceSuffix(computeType);
132   }
133
134   public static ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
135       List<UnifiedCompositionData> unifiedCompositionDataList,
136       String portNodeTemplateId) {
137     for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
138       if (Objects.isNull(unifiedCompositionData.getComputeTemplateConsolidationData().getPorts())) {
139         continue;
140       }
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();
146         }
147       }
148     }
149     return null;
150   }
151
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) {
157
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) {
162       //single port
163       newPortNodeTemplateId.append("_").append(portNodeTemplateId);
164     } else {
165       //consolidation port
166       newPortNodeTemplateId.append("_").append(portType);
167     }
168     return newPortNodeTemplateId.toString();
169   }
170
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());
194         } else {
195           //Add sub interface type since we have only one subinterface per type
196           String subInterfaceTypeSuffix = getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
197           newSubInterfaceNodeTemplateId.append("_").append(subInterfaceTypeSuffix);
198         }
199         return newSubInterfaceNodeTemplateId.toString();
200       }
201     }
202     return subInterfaceTemplateConsolidationData.getNodeTemplateId();
203   }
204
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());
215     }
216     return portTemplateConsolidationData;
217   }
218
219   static String getSubInterfaceTypeSuffix(String nodeType) {
220     return DataModelUtil.getNamespaceSuffix(nodeType);
221   }
222
223   public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
224       UnifiedCompositionData unifiedCompositionData) {
225     return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? new
226         ArrayList<>() : unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
227   }
228
229 }