1 package org.openecomp.sdc.be.tosca;
4 import org.apache.commons.lang.StringUtils;
5 import org.openecomp.sdc.be.components.impl.exceptions.SdcResourceNotFoundException;
6 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
7 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
8 import org.openecomp.sdc.be.model.*;
9 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
10 import org.openecomp.sdc.be.model.utils.ComponentUtilities;
11 import org.openecomp.sdc.be.model.utils.GroupUtils;
12 import org.openecomp.sdc.be.tosca.model.*;
13 import org.openecomp.sdc.common.api.Constants;
14 import org.openecomp.sdc.common.log.wrappers.Logger;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.stereotype.Service;
19 import java.util.function.Predicate;
20 import java.util.function.Supplier;
22 import static java.util.stream.Collectors.toList;
23 import static java.util.stream.Collectors.toMap;
24 import static org.apache.commons.collections.CollectionUtils.isEmpty;
25 import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
26 import static org.apache.commons.collections.MapUtils.isEmpty;
27 import static org.apache.commons.collections.MapUtils.isNotEmpty;
28 import static org.apache.commons.lang.StringUtils.isNotEmpty;
29 import static org.openecomp.sdc.be.model.utils.ComponentUtilities.getComponentInstanceNameByInstanceId;
32 public class GroupExportParserImpl implements GroupExportParser {
34 private static final Logger log = Logger.getLogger(GroupExportParserImpl.class);
36 private Map<String, DataTypeDefinition> dataTypes;
37 private ApplicationDataTypeCache dataTypeCache;
38 private PropertyConvertor propertyConvertor = PropertyConvertor.getInstance();
41 public GroupExportParserImpl(ApplicationDataTypeCache dataTypeCache) {
42 this.dataTypeCache = dataTypeCache;
43 this.dataTypes = getDataTypes();
46 private Map<String, DataTypeDefinition> getDataTypes() {
47 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> dataTypesEither = dataTypeCache.getAll();
48 if (dataTypesEither.isRight()) {
49 log.error("Failed to retrieve all data types {}", dataTypesEither.right().value());
50 throw new SdcResourceNotFoundException();
53 return dataTypesEither.left().value();
57 public Map<String, ToscaGroupTemplate> getGroups(Component component) {
58 List<GroupDefinition> groups = component.getGroups();
60 if (isEmpty(groups)) {
64 return groups.stream()
65 .collect(toMap(GroupDefinition::getName,
66 group -> getToscaGroupTemplate(component, group)));
70 public ToscaGroupTemplate getToscaGroupTemplate(GroupInstance groupInstance, String componentInstanceInvariantName) {
72 String groupName = groupInstance.getName();
73 if (StringUtils.isNotEmpty(componentInstanceInvariantName)) {
74 String prefix = componentInstanceInvariantName + Constants.GROUP_POLICY_NAME_DELIMETER;
75 if (groupName.startsWith(prefix)) {
76 groupName = groupName.substring(prefix.length());
79 String invariantUUID = groupInstance.getInvariantUUID();
80 String groupUUID = groupInstance.getGroupUUID();
81 String version = groupInstance.getVersion();
82 List<GroupInstanceProperty> groupInstanceProperties = groupInstance.convertToGroupInstancesProperties();
83 String groupType = groupInstance.getType();
84 String customizationUUID = groupInstance.getCustomizationUUID();
86 IToscaMetadata toscaMetadata = getToscaGroupTemplateMetadata(groupName, invariantUUID, groupUUID, version, groupType, customizationUUID);
87 Map<String, Object> properties = getToscaGroupTemplateProperties(groupInstanceProperties);
89 return new ToscaGroupTemplate(groupType, toscaMetadata, properties);
92 private ToscaGroupTemplate getToscaGroupTemplate(Component component, GroupDefinition groupDefinition) {
94 String groupName = groupDefinition.getName();
95 String invariantUUID = groupDefinition.getInvariantUUID();
96 String groupUUID = groupDefinition.getGroupUUID();
97 String version = groupDefinition.getVersion();
98 String groupType = groupDefinition.getType();
99 List<PropertyDataDefinition> groupDefinitionProperties = groupDefinition.getProperties();
101 List<String> members = getToscaGroupTemplateMembers(component, groupDefinition.getMembers());
102 IToscaMetadata toscaMetadata = getToscaGroupTemplateMetadata(groupName, invariantUUID, groupUUID, version,groupType, null);
103 Map<String, Object> properties = getToscaGroupTemplateProperties(groupDefinitionProperties);
104 Map<String, ToscaTemplateCapability> capabilities = getToscaGroupTemplateCapabilities(groupDefinition);
106 return new ToscaGroupTemplate(groupType, members, toscaMetadata, properties, capabilities);
109 private Map<String, ToscaTemplateCapability> getToscaGroupTemplateCapabilities(GroupDefinition group) {
110 if (isEmpty(group.getCapabilities())) {
114 Map<String, ToscaTemplateCapability> toscaGroupTemplateCapabilities = group.getCapabilities().values()
116 .flatMap(Collection::stream)
117 .filter(c -> isNotEmptyProperties(c.getProperties()))
118 .collect(toMap(c-> getCapabilityName(c, group), this::getToscaTemplateCapability));
120 if (isNotEmpty(toscaGroupTemplateCapabilities)) {
121 return toscaGroupTemplateCapabilities;
127 private String getCapabilityName(CapabilityDefinition capability, GroupDefinition group) {
128 if(ComponentUtilities.isNotUpdatedCapReqName(group.getNormalizedName() + ".", capability.getName(), capability.getPreviousName())){
129 return capability.getName();
131 return capability.getPreviousName();
134 private boolean isNotEmptyProperties(List<ComponentInstanceProperty> properties) {
135 return isNotEmpty(properties) && properties.stream()
136 .filter(isComponentInstancePropertiesNotEmpty())
141 private ToscaTemplateCapability getToscaTemplateCapability(CapabilityDefinition capability) {
142 ToscaTemplateCapability toscaTemplateCapability = new ToscaTemplateCapability();
143 Map<String, Object> toscaCapabilityProperties = capability.getProperties().stream()
144 .filter(isComponentInstancePropertiesNotEmpty())
145 .collect(toMap(ComponentInstanceProperty::getName,
146 this::fetchCapabilityValue));
147 if(isNotEmpty(toscaCapabilityProperties)) {
148 toscaTemplateCapability.setProperties(toscaCapabilityProperties);
150 return toscaTemplateCapability;
153 private Predicate<? super ComponentInstanceProperty> isComponentInstancePropertiesNotEmpty() {
155 return (c.getName() != null && (c.getValue() != null || c.getDefaultValue() != null));
159 private String fetchCapabilityValue(ComponentInstanceProperty componentInstanceProperty) {
160 if(componentInstanceProperty.getValue() != null) {
161 return componentInstanceProperty.getValue();
163 return componentInstanceProperty.getDefaultValue();
167 private List<String> getToscaGroupTemplateMembers(Component component, Map<String, String> members) {
168 if (members == null) {
171 return members.values()
173 .map(memberId -> getMemberNameByMemberId(component, memberId))
174 .filter(Optional::isPresent)
179 private Optional<String> getMemberNameByMemberId(Component component, String memberId) {
180 return getComponentInstanceNameByInstanceId(component, memberId);
183 private IToscaMetadata getToscaGroupTemplateMetadata(String groupName,String invariantUUID,
184 String groupUUID,String version,String type, String customizationUUID) {
186 IToscaMetadata toscaMetadata = getToscaMetadataByType(type);
188 toscaMetadata.setName(groupName);
189 toscaMetadata.setInvariantUUID(invariantUUID);
190 toscaMetadata.setUUID(groupUUID);
191 toscaMetadata.setVersion(version);
192 toscaMetadata.setCustomizationUUID(customizationUUID);
193 return toscaMetadata;
196 private IToscaMetadata getToscaMetadataByType(String type) {
197 IToscaMetadata toscaMetadata;
198 if (GroupUtils.isVfModule(type)) {
199 toscaMetadata = new VfModuleToscaMetadata();
201 toscaMetadata = new ToscaMetadata();
203 return toscaMetadata;
206 private Map<String, Object> getToscaGroupTemplateProperties(List<? extends PropertyDataDefinition> tempProperties) {
208 if (isEmpty(tempProperties)) {
212 Map<String, Object> props = new HashMap<>();
214 tempProperties.forEach(input ->
215 propertyConvertor.convertAndAddValue(dataTypes, props, input, getPropertyValue(input))
218 if (props.isEmpty()) {
225 private Supplier<String> getPropertyValue(PropertyDataDefinition propertyDataDefinition) {
227 if (isNotEmpty(propertyDataDefinition.getValue())) {
228 return propertyDataDefinition.getValue();
230 return propertyDataDefinition.getDefaultValue();