82fb4b0c8e9a1319c0d35ddaf622aa3aac7b14b9
[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
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;
27 import java.util.Map;
28 import java.util.Objects;
29 import java.util.Optional;
30
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;
41
42 /**
43  * Utility class for consolidation data collection helper methods.
44  */
45 public class UnifiedCompositionUtil {
46
47   private UnifiedCompositionUtil() {
48     //Hiding the implicit public constructor
49   }
50
51   /**
52    * Gets all ports per port type, which are connected to the computes from the input
53    * computeTemplateConsolidationDataCollection.
54    *
55    * @param computeTemplateConsolidationDataCollection collection of compute template
56    *                                                   consolidation data
57    * @return set of port ids, per port type
58    */
59   static Map<String, List<String>> collectAllPortsFromEachTypesFromComputes(
60       Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) {
61     Map<String, List<String>> portTypeToIds = new HashMap<>();
62
63     for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) {
64       Map<String, List<String>> ports = compute.getPorts();
65       if (!MapUtils.isEmpty(ports)) {
66         addPortsToMap(portTypeToIds, ports);
67       }
68     }
69
70     return portTypeToIds;
71   }
72
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);
79     }
80     return subInterfaceDataByType;
81   }
82
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());
88     }
89   }
90
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());
96     }
97     return null;
98   }
99
100   public static String getNewComputeNodeTemplateId(ServiceTemplate serviceTemplate, String computeNodeTemplateId) {
101     return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
102   }
103
104   static String getComputeTypeSuffix(String computeType) {
105     return DataModelUtil.getNamespaceSuffix(computeType);
106   }
107
108   public static ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
109       List<UnifiedCompositionData> unifiedCompositionDataList,
110       String portNodeTemplateId) {
111     for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
112       if (Objects.isNull(unifiedCompositionData.getComputeTemplateConsolidationData().getPorts())) {
113         continue;
114       }
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();
120         }
121       }
122     }
123     return null;
124   }
125
126   public static PortTemplateConsolidationData getPortTemplateConsolidationDataForPort(List<UnifiedCompositionData>
127                                                                                              unifiedCompositionDataList,
128                                                                                       String portNodeTemplateId) {
129     for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
130       if (CollectionUtils.isEmpty(unifiedCompositionData.getPortTemplateConsolidationDataList())) {
131         continue;
132       }
133       List<PortTemplateConsolidationData> portTemplateConsolidationDataList =
134               unifiedCompositionData.getPortTemplateConsolidationDataList();
135       for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) {
136         if (portTemplateConsolidationData.getNodeTemplateId().equals(portNodeTemplateId)) {
137           return portTemplateConsolidationData;
138         }
139       }
140     }
141     return null;
142   }
143
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) {
149
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) {
156       //single port
157       newPortNodeTemplateId.append("_").append(portNodeTemplateId);
158     } else {
159       //consolidation port
160       newPortNodeTemplateId.append("_").append(portType);
161     }
162     return newPortNodeTemplateId.toString();
163   }
164
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();
185     }
186     return subInterfaceTemplateConsolidationData.getNodeTemplateId();
187   }
188
189   static String getSubInterfaceTypeSuffix(String nodeType) {
190     return DataModelUtil.getNamespaceSuffix(nodeType);
191   }
192
193   public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
194       UnifiedCompositionData unifiedCompositionData) {
195     return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? Collections.emptyList() :
196         unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
197   }
198
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();
206     }
207     //Add sub interface type since we have only one subinterface per type
208     return getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
209   }
210
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));
218
219         return portIdsPerPortType;
220     }
221 }