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;
24 import fj.data.Either;
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.PolicyTargetType;
28 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
29 import org.openecomp.sdc.be.model.Component;
30 import org.openecomp.sdc.be.model.ComponentInstance;
31 import org.openecomp.sdc.be.model.DataTypeDefinition;
32 import org.openecomp.sdc.be.model.GroupDefinition;
33 import org.openecomp.sdc.be.model.PolicyDefinition;
34 import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache;
35 import org.openecomp.sdc.be.tosca.model.IToscaMetadata;
36 import org.openecomp.sdc.be.tosca.model.ToscaMetadata;
37 import org.openecomp.sdc.be.tosca.model.ToscaPolicyTemplate;
38 import org.openecomp.sdc.common.log.wrappers.Logger;
39 import org.springframework.beans.factory.annotation.Autowired;
41 import java.util.ArrayList;
42 import java.util.HashMap;
43 import java.util.List;
45 import java.util.function.Supplier;
46 import java.util.stream.Collectors;
47 import org.springframework.context.event.EventListener;
49 import static org.apache.commons.collections.CollectionUtils.isEmpty;
50 import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
51 import static org.apache.commons.collections.MapUtils.isNotEmpty;
52 import static org.apache.commons.lang.StringUtils.isNotEmpty;
54 @org.springframework.stereotype.Component
55 public class PolicyExportParserImpl implements PolicyExportParser {
57 private static final Logger log = Logger.getLogger(PolicyExportParserImpl.class);
59 private ApplicationDataTypeCache dataTypeCache;
60 private Map<String, DataTypeDefinition> dataTypes;
61 private PropertyConvertor propertyConvertor;
64 public PolicyExportParserImpl(ApplicationDataTypeCache dataTypeCache, PropertyConvertor propertyConvertor) {
65 this.dataTypeCache = dataTypeCache;
66 this.propertyConvertor = propertyConvertor;
67 this.dataTypes = getDataTypes();
70 private Map<String, DataTypeDefinition> getDataTypes() {
71 Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> dataTypesEither = dataTypeCache.getAll();
72 if (dataTypesEither.isRight()) {
73 log.error("Failed to retrieve all data types {}", dataTypesEither.right().value());
74 throw new SdcResourceNotFoundException();
77 return dataTypesEither.left().value();
81 public void onDataTypesCacheChangedEvent(
82 ApplicationDataTypeCache.DataTypesCacheChangedEvent dataTypesCacheChangedEvent) {
83 dataTypes = dataTypesCacheChangedEvent.getNewData();
84 log.debug("Data types cache updated.");
88 public Map<String, ToscaPolicyTemplate> getPolicies(Component component) {
89 Map<String, ToscaPolicyTemplate> toscaPolicies = null;
90 Map<String, PolicyDefinition> policies = component.getPolicies();
91 if (isNotEmpty(policies)) {
93 toscaPolicies = policies.values().stream().collect(
95 PolicyDefinition::getName,
96 policy->getToscaPolicyTemplate(policy,component)));
97 log.debug("policies converted");
102 private ToscaPolicyTemplate getToscaPolicyTemplate(PolicyDefinition policyDefinition,Component component) {
104 String type = policyDefinition.getPolicyTypeName();
105 IToscaMetadata metadata = getToscaPolicyTemplateMetadata(policyDefinition);
106 Map<String, Object> properties = getToscaPolicyTemplateProperties(policyDefinition);
107 List<String> targets = getToscaPolicyTemplateTargets(
108 policyDefinition,component.getComponentInstances(),component.getGroups());
110 return new ToscaPolicyTemplate(type, metadata, properties, targets);
113 private List<String> getToscaPolicyTemplateTargets(PolicyDefinition policyDefinition,
114 List<ComponentInstance> componentInstances, List<GroupDefinition> groups) {
116 Map<PolicyTargetType, List<String>> targets = policyDefinition.getTargets();
117 List<String> targetNames = null;
119 if (targets == null || targets.isEmpty()) {
123 List<String> componentInstancesTargets = targets.get(PolicyTargetType.COMPONENT_INSTANCES);
124 List<String> groupTargets = targets.get(PolicyTargetType.GROUPS);
126 if (isNotEmpty(componentInstancesTargets) && isNotEmpty(componentInstances)) {
127 // get target names by Id from component instances
128 Map<String, String> targetNamesByIdFromComponentInstances =
129 getTargetNamesByIdFromComponentInstances(componentInstances);
130 targetNames = targetNamesLazyInstantiation(targetNames);
131 addTargetNames(componentInstancesTargets, targetNames, targetNamesByIdFromComponentInstances);
135 if (isNotEmpty(groupTargets) && isNotEmpty(groups)) {
136 // get target names by id from group definitions
137 Map<String, String> targetNamesByIdFromGroupDefinitions = getTargetNamesByIdFromGroupDefinitions(groups);
138 targetNames = targetNamesLazyInstantiation(targetNames);
139 addTargetNames(groupTargets, targetNames, targetNamesByIdFromGroupDefinitions);
146 private List<String> targetNamesLazyInstantiation(List<String> targetNames) {
147 if (targetNames == null) {
148 targetNames = new ArrayList<>();
153 private void addTargetNames(List<String> targets, List<String> targetNames,
154 Map<String, String> targetNamesById) {
156 if (!targetNamesById.isEmpty()) {
158 for (String id : targets) {
159 String name = targetNamesById.get(id);
161 targetNames.add(name);
167 private Map<String, String> getTargetNamesByIdFromGroupDefinitions(List<GroupDefinition> groups) {
168 return groups.stream().collect(
169 Collectors.toMap(GroupDefinition::getUniqueId, GroupDefinition::getName));
172 private Map<String, String> getTargetNamesByIdFromComponentInstances(List<ComponentInstance> componentInstances) {
173 return componentInstances.stream().collect(
174 Collectors.toMap(ComponentInstance::getUniqueId,ComponentInstance::getName));
177 private Map<String, Object> getToscaPolicyTemplateProperties(PolicyDefinition policyDefinition) {
179 List<PropertyDataDefinition> tempProperties = policyDefinition.getProperties();
181 if (isEmpty(tempProperties)) {
185 Map<String, Object> props = new HashMap<>();
187 tempProperties.forEach(input ->
188 propertyConvertor.convertAndAddValue(dataTypes, props, input, getPropertyValue(input))
191 if (props.isEmpty()) {
198 private Supplier<String> getPropertyValue(PropertyDataDefinition propertyDataDefinition) {
200 if (isNotEmpty(propertyDataDefinition.getValue())) {
201 return propertyDataDefinition.getValue();
203 return propertyDataDefinition.getDefaultValue();
208 private IToscaMetadata getToscaPolicyTemplateMetadata(PolicyDefinition policyDefinition) {
209 IToscaMetadata metadata = new ToscaMetadata();
210 metadata.setInvariantUUID(policyDefinition.getInvariantUUID());
211 metadata.setUUID(policyDefinition.getPolicyUUID());
212 metadata.setName(policyDefinition.getName());
213 metadata.setVersion(policyDefinition.getVersion());