2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.tosca;
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;
48 import java.util.Collection;
49 import java.util.HashMap;
50 import java.util.List;
52 import java.util.Optional;
53 import java.util.function.Predicate;
54 import java.util.function.Supplier;
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;
66 public class GroupExportParserImpl implements GroupExportParser {
68 private static final Logger log = Logger.getLogger(GroupExportParserImpl.class);
70 private Map<String, DataTypeDefinition> dataTypes;
71 private ApplicationDataTypeCache dataTypeCache;
72 private final PropertyConvertor propertyConvertor;
75 public GroupExportParserImpl(ApplicationDataTypeCache dataTypeCache, PropertyConvertor propertyConvertor) {
76 this.dataTypeCache = dataTypeCache;
77 this.propertyConvertor = propertyConvertor;
78 this.dataTypes = getDataTypes();
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();
88 return dataTypesEither.left().value();
92 public Map<String, ToscaGroupTemplate> getGroups(Component component) {
93 List<GroupDefinition> groups = component.getGroups();
95 if (isEmpty(groups)) {
99 return groups.stream()
100 .collect(toMap(GroupDefinition::getName,
101 group -> getToscaGroupTemplate(component, group)));
105 public ToscaGroupTemplate getToscaGroupTemplate(GroupInstance groupInstance, String componentInstanceInvariantName) {
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());
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();
121 IToscaMetadata toscaMetadata = getToscaGroupTemplateMetadata(groupName, invariantUUID, groupUUID, version, groupType, customizationUUID);
122 Map<String, Object> properties = getToscaGroupTemplateProperties(groupInstanceProperties);
124 return new ToscaGroupTemplate(groupType, toscaMetadata, properties);
127 private ToscaGroupTemplate getToscaGroupTemplate(Component component, GroupDefinition groupDefinition) {
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();
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);
141 return new ToscaGroupTemplate(groupType, members, toscaMetadata, properties, capabilities);
144 private Map<String, ToscaTemplateCapability> getToscaGroupTemplateCapabilities(GroupDefinition group) {
145 if (isEmpty(group.getCapabilities())) {
149 Map<String, ToscaTemplateCapability> toscaGroupTemplateCapabilities = group.getCapabilities().values()
151 .flatMap(Collection::stream)
152 .filter(c -> isNotEmptyProperties(c.getProperties()))
153 .collect(toMap(c-> getCapabilityName(c, group), this::getToscaTemplateCapability));
155 if (isNotEmpty(toscaGroupTemplateCapabilities)) {
156 return toscaGroupTemplateCapabilities;
162 private String getCapabilityName(CapabilityDefinition capability, GroupDefinition group) {
163 if(ComponentUtilities.isNotUpdatedCapReqName(group.getNormalizedName() + ".", capability.getName(), capability.getPreviousName())){
164 return capability.getName();
166 return capability.getPreviousName();
169 private boolean isNotEmptyProperties(List<ComponentInstanceProperty> properties) {
170 return isNotEmpty(properties) && properties.stream()
171 .filter(isComponentInstancePropertiesNotEmpty())
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);
185 return toscaTemplateCapability;
188 private Predicate<? super ComponentInstanceProperty> isComponentInstancePropertiesNotEmpty() {
190 return (c.getName() != null && (c.getValue() != null || c.getDefaultValue() != null));
194 private String fetchCapabilityValue(ComponentInstanceProperty componentInstanceProperty) {
195 if(componentInstanceProperty.getValue() != null) {
196 return componentInstanceProperty.getValue();
198 return componentInstanceProperty.getDefaultValue();
202 private List<String> getToscaGroupTemplateMembers(Component component, Map<String, String> members) {
203 if (members == null) {
206 return members.values()
208 .map(memberId -> getMemberNameByMemberId(component, memberId))
209 .filter(Optional::isPresent)
214 private Optional<String> getMemberNameByMemberId(Component component, String memberId) {
215 return getComponentInstanceNameByInstanceId(component, memberId);
218 private IToscaMetadata getToscaGroupTemplateMetadata(String groupName,String invariantUUID,
219 String groupUUID,String version,String type, String customizationUUID) {
221 IToscaMetadata toscaMetadata = getToscaMetadataByType(type);
223 toscaMetadata.setName(groupName);
224 toscaMetadata.setInvariantUUID(invariantUUID);
225 toscaMetadata.setUUID(groupUUID);
226 toscaMetadata.setVersion(version);
227 toscaMetadata.setCustomizationUUID(customizationUUID);
228 return toscaMetadata;
231 private IToscaMetadata getToscaMetadataByType(String type) {
232 IToscaMetadata toscaMetadata;
233 if (GroupUtils.isVfModule(type)) {
234 toscaMetadata = new VfModuleToscaMetadata();
236 toscaMetadata = new ToscaMetadata();
238 return toscaMetadata;
241 private Map<String, Object> getToscaGroupTemplateProperties(List<? extends PropertyDataDefinition> tempProperties) {
243 if (isEmpty(tempProperties)) {
247 Map<String, Object> props = new HashMap<>();
249 tempProperties.forEach(input ->
250 propertyConvertor.convertAndAddValue(dataTypes, props, input, getPropertyValue(input))
253 if (props.isEmpty()) {
260 private Supplier<String> getPropertyValue(PropertyDataDefinition propertyDataDefinition) {
262 if (isNotEmpty(propertyDataDefinition.getValue())) {
263 return propertyDataDefinition.getValue();
265 return propertyDataDefinition.getDefaultValue();