Sync Integ to Master
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / instance / ComponentCapabilitiesPropertiesMergeBL.java
1 package org.openecomp.sdc.be.components.merge.instance;
2
3 import fj.data.Either;
4 import org.apache.commons.collections.CollectionUtils;
5 import org.openecomp.sdc.be.components.merge.capability.CapabilityResolver;
6 import org.openecomp.sdc.be.components.merge.property.DataDefinitionsValuesMergingBusinessLogic;
7 import org.openecomp.sdc.be.dao.api.ActionStatus;
8 import org.openecomp.sdc.be.dao.utils.MapUtil;
9 import org.openecomp.sdc.be.impl.ComponentsUtils;
10 import org.openecomp.sdc.be.model.CapabilityDefinition;
11 import org.openecomp.sdc.be.model.Component;
12 import org.openecomp.sdc.be.model.ComponentInstance;
13 import org.openecomp.sdc.be.model.ComponentParametersView;
14 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
15 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 import java.util.List;
20 import java.util.Map;
21
22 @org.springframework.stereotype.Component
23 public class ComponentCapabilitiesPropertiesMergeBL implements ComponentsMergeCommand {
24
25     private static final Logger LOGGER = LoggerFactory.getLogger(ComponentCapabilitiesPropertiesMergeBL.class);
26
27     private DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
28     private ToscaOperationFacade toscaOperationFacade;
29     private ComponentsUtils componentsUtils;
30     private CapabilityResolver capabilityResolver;
31
32     public ComponentCapabilitiesPropertiesMergeBL(DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic, ToscaOperationFacade toscaOperationFacade, ComponentsUtils componentsUtils, CapabilityResolver capabilityResolver) {
33         this.dataDefinitionsValuesMergingBusinessLogic = dataDefinitionsValuesMergingBusinessLogic;
34         this.toscaOperationFacade = toscaOperationFacade;
35         this.componentsUtils = componentsUtils;
36         this.capabilityResolver = capabilityResolver;
37     }
38
39     @Override
40     public String description() {
41         return "merge component instances capabilities properties";
42     }
43
44     @Override
45     public ActionStatus mergeComponents(Component prevComponent, Component currentComponent) {
46         StorageOperationStatus mergeStatus = getCmptWithCapabilitiesProps(currentComponent.getUniqueId())
47                 .either(currCmptWithCap -> mergeCmptCalculatedCapabilitiesProperties(prevComponent, currCmptWithCap),
48                         err -> err);
49         return componentsUtils.convertFromStorageResponse(mergeStatus);
50     }
51
52     public ActionStatus mergeComponentInstanceCapabilities(Component currentComponent, Component origInstanceCmpt, String instanceId, List<CapabilityDefinition> prevInstanceCapabilities) {
53         if (CollectionUtils.isEmpty(prevInstanceCapabilities)) {
54             return ActionStatus.OK;
55         }
56         Map<CapabilityDefinition, CapabilityDefinition> oldToNewCap = capabilityResolver.resolvePrevCapToNewCapability(currentComponent, origInstanceCmpt, instanceId, prevInstanceCapabilities);
57         oldToNewCap.forEach(this::mergeCapabilityProperties);
58         StorageOperationStatus updateStatus = updateInstanceCapabilitiesProperties(currentComponent, instanceId);
59         return componentsUtils.convertFromStorageResponse(updateStatus);
60     }
61
62     private StorageOperationStatus mergeCmptCalculatedCapabilitiesProperties(Component prevComponent, Component currentComponent) {
63         List<ComponentInstance> prevInstances = prevComponent.getComponentInstances();
64         if (prevInstances == null) {
65             return StorageOperationStatus.OK;
66         }
67         prevInstances.forEach(prevInstance -> mergeInstanceCapabilities(prevInstance, currentComponent));
68         return updateComponentCapabilitiesProperties(currentComponent);
69     }
70
71     private void mergeInstanceCapabilities(ComponentInstance prevInstance, Component currComponent) {
72         ComponentInstance currInstance = MapUtil.toMap(currComponent.getComponentInstances(), ComponentInstance::getName).get(prevInstance.getName());
73         Map<CapabilityDefinition, CapabilityDefinition> oldToNewCapabilities = capabilityResolver.resolvePrevCapIdToNewCapability(prevInstance, currInstance);
74         oldToNewCapabilities.forEach(this::mergeCapabilityProperties);
75     }
76
77     private void mergeCapabilityProperties(CapabilityDefinition prevCapability, CapabilityDefinition currCapability) {
78         dataDefinitionsValuesMergingBusinessLogic.mergeInstanceDataDefinitions(prevCapability.getProperties(), currCapability.getProperties());
79     }
80
81     private StorageOperationStatus updateComponentCapabilitiesProperties(Component currComponent) {
82         return toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(currComponent);
83     }
84
85     private StorageOperationStatus updateInstanceCapabilitiesProperties(Component currComponent, String instanceId) {
86         return toscaOperationFacade.updateComponentInstanceCapabilityProperties(currComponent, instanceId);
87     }
88
89     private Either<Component, StorageOperationStatus> getCmptWithCapabilitiesProps(String cmptId) {
90         ComponentParametersView propertiesCapabilitiesFilter = new ComponentParametersView(true);
91         propertiesCapabilitiesFilter.setIgnoreCapabiltyProperties(false);
92         propertiesCapabilitiesFilter.setIgnoreComponentInstances(false);
93         propertiesCapabilitiesFilter.setIgnoreCapabilities(false);
94         return toscaOperationFacade.getToscaElement(cmptId, propertiesCapabilitiesFilter)
95                 .right()
96                 .map(err -> {
97                    LOGGER.debug("failed to fetch cmpt {} with properties capabilities. status: {}", cmptId, err);
98                    return err;
99                 });
100
101     }
102
103 }