Rename packages from openecomp to onap.
[sdc.git] / openecomp-be / lib / openecomp-sdc-translator-lib / openecomp-sdc-translator-core / src / main / java / org / openecomp / sdc / translator / services / heattotosca / UnifiedCompositionUtil.java
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.MapUtils;
22 import org.onap.sdc.tosca.datatypes.model.NodeTemplate;
23 import org.onap.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;
30
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;
36 import java.util.Map;
37 import java.util.Objects;
38 import java.util.Optional;
39
40 /**
41  * Utility class for consolidation data collection helper methods.
42  */
43 public class UnifiedCompositionUtil {
44
45   private UnifiedCompositionUtil() {
46     //Hiding the implicit public constructor
47   }
48
49   /**
50    * Gets all ports per port type, which are connected to the computes from the input
51    * computeTemplateConsolidationDataCollection.
52    *
53    * @param computeTemplateConsolidationDataCollection collection of compute template
54    *                                                   consolidation data
55    * @return set of port ids, per port type
56    */
57   static Map<String, List<String>> collectAllPortsFromEachTypesFromComputes(
58       Collection<ComputeTemplateConsolidationData> computeTemplateConsolidationDataCollection) {
59     Map<String, List<String>> portTypeToIds = new HashMap<>();
60
61     for (ComputeTemplateConsolidationData compute : computeTemplateConsolidationDataCollection) {
62       Map<String, List<String>> ports = compute.getPorts();
63       if (!MapUtils.isEmpty(ports)) {
64         addPortsToMap(portTypeToIds, ports);
65       }
66     }
67
68     return portTypeToIds;
69   }
70
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);
77     }
78     return subInterfaceDataByType;
79   }
80
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());
86     }
87   }
88
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());
94     }
95     return null;
96   }
97
98   public static String getNewComputeNodeTemplateId(ServiceTemplate serviceTemplate, String computeNodeTemplateId) {
99     return getComputeTypeSuffix(serviceTemplate, computeNodeTemplateId);
100   }
101
102   static String getComputeTypeSuffix(String computeType) {
103     return DataModelUtil.getNamespaceSuffix(computeType);
104   }
105
106   public static ComputeTemplateConsolidationData getConnectedComputeConsolidationData(
107       List<UnifiedCompositionData> unifiedCompositionDataList,
108       String portNodeTemplateId) {
109     for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) {
110       if (Objects.isNull(unifiedCompositionData.getComputeTemplateConsolidationData().getPorts())) {
111         continue;
112       }
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();
118         }
119       }
120     }
121     return null;
122   }
123
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) {
129
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) {
134       //single port
135       newPortNodeTemplateId.append("_").append(portNodeTemplateId);
136     } else {
137       //consolidation port
138       newPortNodeTemplateId.append("_").append(portType);
139     }
140     return newPortNodeTemplateId.toString();
141   }
142
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();
163     }
164     return subInterfaceTemplateConsolidationData.getNodeTemplateId();
165   }
166
167   static String getSubInterfaceTypeSuffix(String nodeType) {
168     return DataModelUtil.getNamespaceSuffix(nodeType);
169   }
170
171   public static List<SubInterfaceTemplateConsolidationData> getSubInterfaceTemplateConsolidationDataList(
172       UnifiedCompositionData unifiedCompositionData) {
173     return unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList() == null ? Collections.emptyList() :
174         unifiedCompositionData.getSubInterfaceTemplateConsolidationDataList();
175   }
176
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();
184     }
185     //Add sub interface type since we have only one subinterface per type
186     return getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType());
187   }
188 }