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