Added oparent to sdc main
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / merge / instance / ComponentCapabilitiesPropertiesMergeBL.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.be.components.merge.instance;
22
23 import fj.data.Either;
24 import org.apache.commons.collections.CollectionUtils;
25 import org.openecomp.sdc.be.components.merge.VspComponentsMergeCommand;
26 import org.openecomp.sdc.be.components.merge.capability.CapabilityResolver;
27 import org.openecomp.sdc.be.components.merge.property.DataDefinitionsValuesMergingBusinessLogic;
28 import org.openecomp.sdc.be.dao.api.ActionStatus;
29 import org.openecomp.sdc.be.dao.utils.MapUtil;
30 import org.openecomp.sdc.be.impl.ComponentsUtils;
31 import org.openecomp.sdc.be.model.CapabilityDefinition;
32 import org.openecomp.sdc.be.model.Component;
33 import org.openecomp.sdc.be.model.ComponentInstance;
34 import org.openecomp.sdc.be.model.ComponentParametersView;
35 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
36 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
37 import org.openecomp.sdc.common.log.wrappers.Logger;
38 import org.springframework.core.annotation.Order;
39
40 import java.util.List;
41 import java.util.Map;
42
43 import static org.openecomp.sdc.be.components.merge.resource.ResourceDataMergeBusinessLogic.ANY_ORDER_COMMAND;
44
45 @org.springframework.stereotype.Component
46 @Order(ANY_ORDER_COMMAND)
47 public class ComponentCapabilitiesPropertiesMergeBL implements VspComponentsMergeCommand {
48
49     private static final Logger log = Logger.getLogger(ComponentCapabilitiesPropertiesMergeBL.class);
50
51     private final DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic;
52     private final ToscaOperationFacade toscaOperationFacade;
53     private final ComponentsUtils componentsUtils;
54     private final CapabilityResolver capabilityResolver;
55
56     public ComponentCapabilitiesPropertiesMergeBL(DataDefinitionsValuesMergingBusinessLogic dataDefinitionsValuesMergingBusinessLogic, ToscaOperationFacade toscaOperationFacade, ComponentsUtils componentsUtils, CapabilityResolver capabilityResolver) {
57         this.dataDefinitionsValuesMergingBusinessLogic = dataDefinitionsValuesMergingBusinessLogic;
58         this.toscaOperationFacade = toscaOperationFacade;
59         this.componentsUtils = componentsUtils;
60         this.capabilityResolver = capabilityResolver;
61     }
62
63     @Override
64     public String description() {
65         return "merge component instances capabilities properties";
66     }
67
68     @Override
69     public ActionStatus mergeComponents(Component prevComponent, Component currentComponent) {
70         StorageOperationStatus mergeStatus = getCmptWithCapabilitiesProps(currentComponent.getUniqueId())
71                 .either(currCmptWithCap -> mergeCmptCalculatedCapabilitiesProperties(prevComponent, currCmptWithCap),
72                         err -> err);
73         return componentsUtils.convertFromStorageResponse(mergeStatus);
74     }
75
76     public ActionStatus mergeComponentInstanceCapabilities(Component currentComponent, Component origInstanceCmpt, String instanceId, List<CapabilityDefinition> prevInstanceCapabilities) {
77         if (CollectionUtils.isEmpty(prevInstanceCapabilities)) {
78             return ActionStatus.OK;
79         }
80         Map<CapabilityDefinition, CapabilityDefinition> oldToNewCap = capabilityResolver.resolvePrevCapToNewCapability(currentComponent, origInstanceCmpt, instanceId, prevInstanceCapabilities);
81         oldToNewCap.forEach(this::mergeCapabilityProperties);
82         StorageOperationStatus updateStatus = updateInstanceCapabilitiesProperties(currentComponent, instanceId);
83         return componentsUtils.convertFromStorageResponse(updateStatus);
84     }
85
86     private StorageOperationStatus mergeCmptCalculatedCapabilitiesProperties(Component prevComponent, Component currentComponent) {
87         List<ComponentInstance> prevInstances = prevComponent.getComponentInstances();
88         if (prevInstances == null) {
89             return StorageOperationStatus.OK;
90         }
91         prevInstances.forEach(prevInstance -> mergeInstanceCapabilities(prevInstance, currentComponent));
92         return updateComponentCapabilitiesProperties(currentComponent);
93     }
94
95     private void mergeInstanceCapabilities(ComponentInstance prevInstance, Component currComponent) {
96         ComponentInstance currInstance = MapUtil.toMap(currComponent.getComponentInstances(), ComponentInstance::getName).get(prevInstance.getName());
97         Map<CapabilityDefinition, CapabilityDefinition> oldToNewCapabilities = capabilityResolver.resolvePrevCapIdToNewCapability(prevInstance, currInstance);
98         oldToNewCapabilities.forEach(this::mergeCapabilityProperties);
99     }
100
101     private void mergeCapabilityProperties(CapabilityDefinition prevCapability, CapabilityDefinition currCapability) {
102         dataDefinitionsValuesMergingBusinessLogic.mergeInstanceDataDefinitions(prevCapability.getProperties(), currCapability.getProperties());
103     }
104
105     private StorageOperationStatus updateComponentCapabilitiesProperties(Component currComponent) {
106         return toscaOperationFacade.updateComponentCalculatedCapabilitiesProperties(currComponent);
107     }
108
109     private StorageOperationStatus updateInstanceCapabilitiesProperties(Component currComponent, String instanceId) {
110         return toscaOperationFacade.updateComponentInstanceCapabilityProperties(currComponent, instanceId);
111     }
112
113     private Either<Component, StorageOperationStatus> getCmptWithCapabilitiesProps(String cmptId) {
114         ComponentParametersView propertiesCapabilitiesFilter = new ComponentParametersView(true);
115         propertiesCapabilitiesFilter.setIgnoreCapabiltyProperties(false);
116         propertiesCapabilitiesFilter.setIgnoreComponentInstances(false);
117         propertiesCapabilitiesFilter.setIgnoreCapabilities(false);
118         return toscaOperationFacade.getToscaElement(cmptId, propertiesCapabilitiesFilter)
119                 .right()
120                 .map(err -> {
121                    log.debug("failed to fetch cmpt {} with properties capabilities. status: {}", cmptId, err);
122                    return err;
123                 });
124
125     }
126
127 }