b529c7a55ed323bc2bc0bc784456811d16e20b4e
[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.datatypes.heattotosca.unifiedmodel.consolidation;
18
19 import com.google.common.collect.ArrayListMultimap;
20 import com.google.common.collect.ListMultimap;
21 import com.google.common.collect.Multimaps;
22 import org.apache.commons.collections4.CollectionUtils;
23 import org.openecomp.core.utilities.file.FileUtils;
24 import org.openecomp.sdc.heat.datatypes.model.Resource;
25 import org.openecomp.sdc.tosca.datatypes.ToscaNodeType;
26 import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil;
27
28 import java.util.List;
29 import java.util.Objects;
30 import java.util.Optional;
31
32 public class PortTemplateConsolidationData extends EntityConsolidationData {
33
34     // key - sub-interface type - for ResourceGroup it is the nested file name
35     // value - List of sub-interfaces of that type in the port
36     private final ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceConsolidationData =
37             Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
38
39     private String portType;
40
41     private String networkRole;
42
43     public String getNetworkRole() {
44         return networkRole;
45     }
46
47     public void setNetworkRole(String networkRole) {
48         this.networkRole = networkRole;
49     }
50
51     public String getPortType() {
52         return portType;
53     }
54
55     public void setPortType(String portType) {
56         this.portType = portType;
57     }
58
59     public boolean isPortBoundToSubInterface() {
60         return !subInterfaceConsolidationData.isEmpty();
61     }
62
63     /**
64     * Create Sub interface template consolidation data base on given parameters - if it doesn't exist yet.
65     *
66     * @param resource resource of sub Interface
67     * @param subInterfaceNodeTemplateId template id of sub interface
68     * @param parentPortNodeTemplateId node template id of port node to which sub interface is related
69     * @return sub interface template consolidation data entity
70     */
71     public SubInterfaceTemplateConsolidationData addSubInterfaceTemplateConsolidationData(
72             Resource resource, String subInterfaceNodeTemplateId, String parentPortNodeTemplateId) {
73         String subInterfaceType = createSubInterfaceType(resource);
74         List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
75                 subInterfaceConsolidationData.get(subInterfaceType);
76         SubInterfaceTemplateConsolidationData consolidationData = null;
77         if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) {
78             Optional<SubInterfaceTemplateConsolidationData> optionalConsolidationData =
79                     subInterfaceTemplateConsolidationDataList.stream()
80                     .filter(s -> s.getNodeTemplateId().equals(subInterfaceNodeTemplateId))
81                     .findFirst();
82             if (optionalConsolidationData.isPresent()) {
83                 consolidationData = optionalConsolidationData.get();
84             }
85         }
86
87         if (Objects.isNull(consolidationData)) {
88             consolidationData =
89                     createSubInterfaceConsolidationData(subInterfaceNodeTemplateId, parentPortNodeTemplateId);
90             addSubInterfaceConsolidationData(subInterfaceType, consolidationData);
91         }
92         return consolidationData;
93     }
94
95     private String createSubInterfaceType(Resource resource) {
96         return ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX
97             + FileUtils.getFileWithoutExtention(
98             HeatToToscaUtil.getSubInterfaceResourceType(resource));
99     }
100
101     private SubInterfaceTemplateConsolidationData createSubInterfaceConsolidationData(
102             String subInterfaceNodeTemplateId, String parentPortNodeTemplateId) {
103         SubInterfaceTemplateConsolidationData data = new SubInterfaceTemplateConsolidationData();
104         data.setNodeTemplateId(subInterfaceNodeTemplateId);
105         data.setParentPortNodeTemplateId(parentPortNodeTemplateId);
106         return data;
107     }
108
109     public void addSubInterfaceConsolidationData(String subPortType,
110                                                SubInterfaceTemplateConsolidationData
111                                                    subInterfaceTemplateConsolidationData) {
112         this.subInterfaceConsolidationData.put(subPortType, subInterfaceTemplateConsolidationData);
113     }
114
115     public boolean hasSameSubInterfaceTypes(PortTemplateConsolidationData other) {
116         return other != null && this.subInterfaceConsolidationData.keySet().equals(
117         other.subInterfaceConsolidationData.keySet());
118     }
119
120     public void copyMappedInto(ListMultimap<String, SubInterfaceTemplateConsolidationData> subInterfaceTypeToEntity) {
121         subInterfaceTypeToEntity.putAll(this.subInterfaceConsolidationData);
122     }
123
124     public void copyFlatInto(List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList) {
125         subInterfaceTemplateConsolidationDataList.addAll(subInterfaceConsolidationData.values());
126     }
127
128     public boolean isNumberOfSubInterfacesPerTypeSimilar(PortTemplateConsolidationData other) {
129         return isBothSubInterfaceConsolidationDataEmpty(this, other)
130                || isBothSubInterfaceConsolidationDataNotEmpty(this, other)
131                  && this.subInterfaceConsolidationData.keySet().stream().allMatch(
132                          subInterfaceType -> calculateSize(other.subInterfaceConsolidationData.get(subInterfaceType))
133                          ==  calculateSize(this.subInterfaceConsolidationData.get(subInterfaceType)));
134
135     }
136
137     private boolean isBothSubInterfaceConsolidationDataEmpty(
138             PortTemplateConsolidationData object, PortTemplateConsolidationData other) {
139         return object.subInterfaceConsolidationData.isEmpty() && other.subInterfaceConsolidationData.isEmpty();
140     }
141
142     private boolean isBothSubInterfaceConsolidationDataNotEmpty(
143             PortTemplateConsolidationData object, PortTemplateConsolidationData other) {
144         return !object.subInterfaceConsolidationData.isEmpty() && !other.subInterfaceConsolidationData.isEmpty();
145     }
146
147     public boolean isSubInterfaceNodeTemplateIdParameter(String nodeTemplateType) {
148         List<SubInterfaceTemplateConsolidationData> subInterfaceTemplateConsolidationDataList =
149                 this.subInterfaceConsolidationData.get(nodeTemplateType);
150         return (Objects.nonNull(subInterfaceTemplateConsolidationDataList)
151             && subInterfaceTemplateConsolidationDataList.size() > 1);
152     }
153
154     private int calculateSize(List<SubInterfaceTemplateConsolidationData> subInterfaces) {
155         return subInterfaces == null ? 0 : subInterfaces.size();
156     }
157 }