1 package org.openecomp.sdc.be.tosca;
5 import org.openecomp.sdc.be.components.impl.exceptions.SdcResourceNotFoundException;
6 import org.openecomp.sdc.be.dao.titan.TitanOperationStatus;
7 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
8 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
9 import org.openecomp.sdc.be.model.*;
10 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
11 import org.openecomp.sdc.be.tosca.model.IToscaMetadata;
12 import org.openecomp.sdc.be.tosca.model.ToscaMetadata;
13 import org.openecomp.sdc.be.tosca.model.ToscaPolicyTemplate;
14 import org.openecomp.sdc.common.log.wrappers.Logger;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.stereotype.Service;
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.List;
22 import java.util.function.Supplier;
23 import java.util.stream.Collectors;
25 import static org.apache.commons.collections.CollectionUtils.isEmpty;
26 import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
27 import static org.apache.commons.collections.MapUtils.isNotEmpty;
28 import static org.apache.commons.lang.StringUtils.isNotEmpty;
31 public class PolicyExportParserImpl implements PolicyExportParser {
33 private static final Logger log = Logger.getLogger(PolicyExportParserImpl.class);
35 private ApplicationDataTypeCache dataTypeCache;
36 private Map<String, DataTypeDefinition> dataTypes;
37 private PropertyConvertor propertyConvertor = PropertyConvertor.getInstance();
40 public PolicyExportParserImpl(ApplicationDataTypeCache dataTypeCache) {
41 this.dataTypeCache = dataTypeCache;
42 this.dataTypes = getDataTypes();
45 private Map<String, DataTypeDefinition> getDataTypes() {
46 Either<Map<String, DataTypeDefinition>, TitanOperationStatus> dataTypesEither = dataTypeCache.getAll();
47 if (dataTypesEither.isRight()) {
48 log.error("Failed to retrieve all data types {}", dataTypesEither.right().value());
49 throw new SdcResourceNotFoundException();
52 return dataTypesEither.left().value();
56 public Map<String, ToscaPolicyTemplate> getPolicies(Component component) {
57 Map<String, ToscaPolicyTemplate> toscaPolicies = null;
58 Map<String, PolicyDefinition> policies = component.getPolicies();
59 if (isNotEmpty(policies)) {
61 toscaPolicies = policies.values().stream().collect(
63 PolicyDefinition::getName,
64 policy->getToscaPolicyTemplate(policy,component)));
65 log.debug("policies converted");
70 private ToscaPolicyTemplate getToscaPolicyTemplate(PolicyDefinition policyDefinition,Component component) {
72 String type = policyDefinition.getPolicyTypeName();
73 IToscaMetadata metadata = getToscaPolicyTemplateMetadata(policyDefinition);
74 Map<String, Object> properties = getToscaPolicyTemplateProperties(policyDefinition);
75 List<String> targets = getToscaPolicyTemplateTargets(
76 policyDefinition,component.getComponentInstances(),component.getGroups());
78 return new ToscaPolicyTemplate(type, metadata, properties, targets);
81 private List<String> getToscaPolicyTemplateTargets(PolicyDefinition policyDefinition,
82 List<ComponentInstance> componentInstances, List<GroupDefinition> groups) {
84 Map<PolicyTargetType, List<String>> targets = policyDefinition.getTargets();
85 List<String> targetNames = null;
87 if (targets == null || targets.isEmpty()) {
91 List<String> componentInstancesTargets = targets.get(PolicyTargetType.COMPONENT_INSTANCES);
92 List<String> groupTargets = targets.get(PolicyTargetType.GROUPS);
94 if (isNotEmpty(componentInstancesTargets) && isNotEmpty(componentInstances)) {
95 // get target names by Id from component instances
96 Map<String, String> targetNamesByIdFromComponentInstances =
97 getTargetNamesByIdFromComponentInstances(componentInstances);
98 targetNames = targetNamesLazyInstantiation(targetNames);
99 addTargetNames(componentInstancesTargets, targetNames, targetNamesByIdFromComponentInstances);
103 if (isNotEmpty(groupTargets) && isNotEmpty(groups)) {
104 // get target names by id from group definitions
105 Map<String, String> targetNamesByIdFromGroupDefinitions = getTargetNamesByIdFromGroupDefinitions(groups);
106 targetNames = targetNamesLazyInstantiation(targetNames);
107 addTargetNames(groupTargets, targetNames, targetNamesByIdFromGroupDefinitions);
114 private List<String> targetNamesLazyInstantiation(List<String> targetNames) {
115 if (targetNames == null) {
116 targetNames = new ArrayList<>();
121 private void addTargetNames(List<String> targets, List<String> targetNames,
122 Map<String, String> targetNamesById) {
124 if (!targetNamesById.isEmpty()) {
126 for (String id : targets) {
127 String name = targetNamesById.get(id);
129 targetNames.add(name);
135 private Map<String, String> getTargetNamesByIdFromGroupDefinitions(List<GroupDefinition> groups) {
136 return groups.stream().collect(
137 Collectors.toMap(GroupDefinition::getUniqueId, GroupDefinition::getName));
140 private Map<String, String> getTargetNamesByIdFromComponentInstances(List<ComponentInstance> componentInstances) {
141 return componentInstances.stream().collect(
142 Collectors.toMap(ComponentInstance::getUniqueId,ComponentInstance::getName));
145 private Map<String, Object> getToscaPolicyTemplateProperties(PolicyDefinition policyDefinition) {
147 List<PropertyDataDefinition> tempProperties = policyDefinition.getProperties();
149 if (isEmpty(tempProperties)) {
153 Map<String, Object> props = new HashMap<>();
155 tempProperties.forEach(input ->
156 propertyConvertor.convertAndAddValue(dataTypes, props, input, getPropertyValue(input))
159 if (props.isEmpty()) {
166 private Supplier<String> getPropertyValue(PropertyDataDefinition propertyDataDefinition) {
168 if (isNotEmpty(propertyDataDefinition.getValue())) {
169 return propertyDataDefinition.getValue();
171 return propertyDataDefinition.getDefaultValue();
176 private IToscaMetadata getToscaPolicyTemplateMetadata(PolicyDefinition policyDefinition) {
177 IToscaMetadata metadata = new ToscaMetadata();
178 metadata.setInvariantUUID(policyDefinition.getInvariantUUID());
179 metadata.setUUID(policyDefinition.getPolicyUUID());
180 metadata.setName(policyDefinition.getName());
181 metadata.setVersion(policyDefinition.getVersion());