981c444197fe86b231afc1d07b1afe1e868aa6b4
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / tosca / GroupExportParserImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.tosca;
22
23 import fj.data.Either;
24 import org.apache.commons.lang.StringUtils;
25 import org.openecomp.sdc.be.components.impl.exceptions.SdcResourceNotFoundException;
26 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
27 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
28 import org.openecomp.sdc.be.model.CapabilityDefinition;
29 import org.openecomp.sdc.be.model.Component;
30 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
31 import org.openecomp.sdc.be.model.DataTypeDefinition;
32 import org.openecomp.sdc.be.model.GroupDefinition;
33 import org.openecomp.sdc.be.model.GroupInstance;
34 import org.openecomp.sdc.be.model.GroupInstanceProperty;
35 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
36 import org.openecomp.sdc.be.model.utils.ComponentUtilities;
37 import org.openecomp.sdc.be.model.utils.GroupUtils;
38 import org.openecomp.sdc.be.tosca.model.IToscaMetadata;
39 import org.openecomp.sdc.be.tosca.model.ToscaGroupTemplate;
40 import org.openecomp.sdc.be.tosca.model.ToscaMetadata;
41 import org.openecomp.sdc.be.tosca.model.ToscaTemplateCapability;
42 import org.openecomp.sdc.be.tosca.model.VfModuleToscaMetadata;
43 import org.openecomp.sdc.common.api.Constants;
44 import org.openecomp.sdc.common.log.wrappers.Logger;
45 import org.springframework.beans.factory.annotation.Autowired;
46 import org.springframework.stereotype.Service;
47
48 import java.util.Collection;
49 import java.util.HashMap;
50 import java.util.List;
51 import java.util.Map;
52 import java.util.Optional;
53 import java.util.function.Predicate;
54 import java.util.function.Supplier;
55
56 import static java.util.stream.Collectors.toList;
57 import static java.util.stream.Collectors.toMap;
58 import static org.apache.commons.collections.CollectionUtils.isEmpty;
59 import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
60 import static org.apache.commons.collections.MapUtils.isEmpty;
61 import static org.apache.commons.collections.MapUtils.isNotEmpty;
62 import static org.apache.commons.lang.StringUtils.isNotEmpty;
63 import static org.openecomp.sdc.be.model.utils.ComponentUtilities.getComponentInstanceNameByInstanceId;
64
65 @Service
66 public class GroupExportParserImpl implements GroupExportParser {
67
68     private static final Logger log = Logger.getLogger(GroupExportParserImpl.class);
69
70     private Map<String, DataTypeDefinition> dataTypes;
71     private ApplicationDataTypeCache dataTypeCache;
72     private final PropertyConvertor propertyConvertor;
73     
74     @Autowired
75         public GroupExportParserImpl(ApplicationDataTypeCache dataTypeCache, PropertyConvertor propertyConvertor) {
76                 this.dataTypeCache = dataTypeCache;
77                 this.propertyConvertor = propertyConvertor;
78                 this.dataTypes = getDataTypes();
79         }
80     
81     private Map<String, DataTypeDefinition> getDataTypes()  {
82                 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> dataTypesEither = dataTypeCache.getAll();
83                 if (dataTypesEither.isRight()) {
84                         log.error("Failed to retrieve all data types {}", dataTypesEither.right().value()); 
85                         throw new SdcResourceNotFoundException(); 
86                 }
87                 
88                 return dataTypesEither.left().value();
89         }
90     
91         @Override
92         public Map<String, ToscaGroupTemplate> getGroups(Component component) {
93                 List<GroupDefinition> groups = component.getGroups();
94
95                 if (isEmpty(groups)) {
96                         return null;
97                 }
98                 
99                 return groups.stream()
100                                 .collect(toMap(GroupDefinition::getName,
101                                                   group -> getToscaGroupTemplate(component, group)));
102         }
103         
104         @Override
105         public ToscaGroupTemplate getToscaGroupTemplate(GroupInstance groupInstance, String componentInstanceInvariantName) {
106                 
107                 String groupName = groupInstance.getName();
108                 if (StringUtils.isNotEmpty(componentInstanceInvariantName)) {
109                         String prefix = componentInstanceInvariantName + Constants.GROUP_POLICY_NAME_DELIMETER;
110                         if (groupName.startsWith(prefix)) {
111                                 groupName = groupName.substring(prefix.length());
112                         }
113                 }
114                 String invariantUUID = groupInstance.getInvariantUUID();
115                 String groupUUID = groupInstance.getGroupUUID();
116                 String version = groupInstance.getVersion();
117                 List<GroupInstanceProperty> groupInstanceProperties = groupInstance.convertToGroupInstancesProperties();
118                 String groupType = groupInstance.getType();
119                 String customizationUUID = groupInstance.getCustomizationUUID();
120
121                 IToscaMetadata toscaMetadata = getToscaGroupTemplateMetadata(groupName, invariantUUID, groupUUID, version, groupType, customizationUUID);               
122                 Map<String, Object> properties = getToscaGroupTemplateProperties(groupInstanceProperties);
123                 
124         return new ToscaGroupTemplate(groupType, toscaMetadata, properties);
125         }
126
127         private ToscaGroupTemplate getToscaGroupTemplate(Component component, GroupDefinition groupDefinition) {
128
129                 String groupName = groupDefinition.getName();
130                 String invariantUUID = groupDefinition.getInvariantUUID();
131                 String groupUUID = groupDefinition.getGroupUUID();
132                 String version = groupDefinition.getVersion();
133                 String groupType = groupDefinition.getType();
134                 List<PropertyDataDefinition> groupDefinitionProperties = groupDefinition.getProperties();
135                 
136                 List<String> members = getToscaGroupTemplateMembers(component, groupDefinition.getMembers());
137                 IToscaMetadata toscaMetadata = getToscaGroupTemplateMetadata(groupName, invariantUUID, groupUUID, version,groupType, null);             
138                 Map<String, Object> properties = getToscaGroupTemplateProperties(groupDefinitionProperties);
139                 Map<String, ToscaTemplateCapability> capabilities = getToscaGroupTemplateCapabilities(groupDefinition);
140
141                 return new ToscaGroupTemplate(groupType, members, toscaMetadata, properties, capabilities);
142         }
143         
144         private Map<String, ToscaTemplateCapability> getToscaGroupTemplateCapabilities(GroupDefinition group) {
145                 if (isEmpty(group.getCapabilities())) {
146                         return null;
147                 }
148
149                 Map<String, ToscaTemplateCapability> toscaGroupTemplateCapabilities = group.getCapabilities().values()
150                                 .stream()
151                                 .flatMap(Collection::stream)
152                                 .filter(c -> isNotEmptyProperties(c.getProperties()))
153                                 .collect(toMap(c-> getCapabilityName(c, group), this::getToscaTemplateCapability));
154
155                 if (isNotEmpty(toscaGroupTemplateCapabilities)) {
156                         return toscaGroupTemplateCapabilities;
157                 } else {
158                         return null;
159                 }
160         }
161
162         private String getCapabilityName(CapabilityDefinition capability, GroupDefinition group) {
163         if(ComponentUtilities.isNotUpdatedCapReqName(group.getNormalizedName() + ".", capability.getName(), capability.getPreviousName())){
164                 return capability.getName();
165                 }
166                 return capability.getPreviousName();
167         }
168
169         private boolean isNotEmptyProperties(List<ComponentInstanceProperty> properties) {
170         return isNotEmpty(properties) && properties.stream()
171                                 .filter(isComponentInstancePropertiesNotEmpty())
172                                 .findFirst()
173                                 .isPresent();
174         }
175
176         private ToscaTemplateCapability getToscaTemplateCapability(CapabilityDefinition capability) {
177                 ToscaTemplateCapability toscaTemplateCapability = new ToscaTemplateCapability();
178                 Map<String, Object> toscaCapabilityProperties = capability.getProperties().stream()
179                                 .filter(isComponentInstancePropertiesNotEmpty())
180                                 .collect(toMap(ComponentInstanceProperty::getName,
181                                                                                   this::fetchCapabilityValue));
182                 if(isNotEmpty(toscaCapabilityProperties)) {
183                         toscaTemplateCapability.setProperties(toscaCapabilityProperties);
184                 }
185                 return toscaTemplateCapability;
186         }
187
188         private Predicate<? super ComponentInstanceProperty> isComponentInstancePropertiesNotEmpty() {
189                 return c -> {
190                         return (c.getName() != null && (c.getValue() != null || c.getDefaultValue() != null));
191                 };
192         }
193
194         private String fetchCapabilityValue(ComponentInstanceProperty componentInstanceProperty) {
195                 if(componentInstanceProperty.getValue() != null) {
196                         return componentInstanceProperty.getValue();
197                 }else {
198                         return componentInstanceProperty.getDefaultValue();
199                 }
200         }
201
202         private List<String> getToscaGroupTemplateMembers(Component component, Map<String, String> members) {
203                 if (members == null) {
204                         return null;
205                 }
206                 return members.values()
207                                 .stream()
208                                 .map(memberId -> getMemberNameByMemberId(component, memberId))
209                                 .filter(Optional::isPresent)
210                                 .map(Optional::get)
211                                 .collect(toList());
212         }
213
214         private Optional<String> getMemberNameByMemberId(Component component, String memberId) {
215         return getComponentInstanceNameByInstanceId(component, memberId);
216         }
217
218         private IToscaMetadata getToscaGroupTemplateMetadata(String groupName,String invariantUUID,
219                                                                      String groupUUID,String version,String type, String customizationUUID) {
220                                 
221                 IToscaMetadata toscaMetadata = getToscaMetadataByType(type);
222                 
223                 toscaMetadata.setName(groupName);
224                 toscaMetadata.setInvariantUUID(invariantUUID);
225                 toscaMetadata.setUUID(groupUUID);
226                 toscaMetadata.setVersion(version);
227                 toscaMetadata.setCustomizationUUID(customizationUUID);
228                 return toscaMetadata;
229         }
230
231         private IToscaMetadata getToscaMetadataByType(String type) {
232                 IToscaMetadata toscaMetadata;
233                 if (GroupUtils.isVfModule(type)) {
234                         toscaMetadata = new VfModuleToscaMetadata();
235                 } else {
236                         toscaMetadata = new ToscaMetadata();
237                 }
238                 return toscaMetadata;
239         }
240
241         private Map<String, Object> getToscaGroupTemplateProperties(List<? extends PropertyDataDefinition> tempProperties) {
242                                 
243                 if (isEmpty(tempProperties)) {
244                         return null;
245                 }
246                                 
247                 Map<String, Object> props = new HashMap<>();
248
249                 tempProperties.forEach(input -> 
250                         propertyConvertor.convertAndAddValue(dataTypes, props, input, getPropertyValue(input))
251                 );
252
253                 if (props.isEmpty()) {
254                         return null;
255                 } else {
256                         return props;
257                 }       
258         }
259
260         private Supplier<String> getPropertyValue(PropertyDataDefinition propertyDataDefinition) {
261                 return () -> {
262                         if (isNotEmpty(propertyDataDefinition.getValue())) {
263                                 return propertyDataDefinition.getValue();
264                         } else {
265                                 return propertyDataDefinition.getDefaultValue();
266                         }
267                 };
268         }
269 }