Refactoring Consolidation Service
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / version / PolicyTargetsUpdateOperation.java
1 package org.openecomp.sdc.be.components.impl.version;
2
3 import static org.apache.commons.collections.CollectionUtils.isEmpty;
4
5 import java.util.List;
6 import java.util.function.UnaryOperator;
7
8 import org.openecomp.sdc.be.dao.api.ActionStatus;
9 import org.openecomp.sdc.be.impl.ComponentsUtils;
10 import org.openecomp.sdc.be.model.Component;
11 import org.openecomp.sdc.be.model.ComponentInstance;
12 import org.openecomp.sdc.be.model.PolicyDefinition;
13 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
14 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 @org.springframework.stereotype.Component
19 public class PolicyTargetsUpdateOperation implements PostChangeVersionOperation {
20
21     private static final Logger log = LoggerFactory.getLogger(PolicyTargetsUpdateOperation.class);
22     private final ToscaOperationFacade toscaOperationFacade;
23     private final ComponentsUtils componentsUtils;
24
25     public PolicyTargetsUpdateOperation(ToscaOperationFacade toscaOperationFacade, ComponentsUtils componentsUtils) {
26         this.toscaOperationFacade = toscaOperationFacade;
27         this.componentsUtils = componentsUtils;
28     }
29
30     @Override
31     public ActionStatus onChangeVersion(Component container, ComponentInstance prevVersion, ComponentInstance newVersion) {
32         return replacePolicyTargetsInstanceId(container, prevVersion, newVersion);
33     }
34
35     private ActionStatus replacePolicyTargetsInstanceId(Component container, ComponentInstance prevVersion, ComponentInstance newVersion) {
36         log.debug("#replacePolicyTargetsInstanceId - replacing all policy targets for component instance {} with component instance {}", prevVersion.getUniqueId(), newVersion.getUniqueId());
37         List<PolicyDefinition> policiesWithPrevInstanceAsTarget = container.resolvePoliciesByComponentInstanceTarget(prevVersion.getUniqueId());
38         if (isEmpty(policiesWithPrevInstanceAsTarget)) {
39             return ActionStatus.OK;
40         }
41         replaceTargetsPrevInstanceIdWithNewInstanceId(prevVersion, newVersion, policiesWithPrevInstanceAsTarget);
42         return updatePolicies(container, policiesWithPrevInstanceAsTarget);
43     }
44
45     private ActionStatus updatePolicies(Component policiesContainer, List<PolicyDefinition> policiesToUpdate) {
46         log.debug("#updatePolicies - updating {} policies for container {}", policiesToUpdate.size(), policiesContainer.getUniqueId());
47         StorageOperationStatus updatePolicyResult = toscaOperationFacade.updatePoliciesOfComponent(policiesContainer.getUniqueId(), policiesToUpdate);
48         return componentsUtils.convertFromStorageResponse(updatePolicyResult, policiesContainer.getComponentType());
49     }
50
51     private void replaceTargetsPrevInstanceIdWithNewInstanceId(ComponentInstance prevVersion, ComponentInstance newVersion, List<PolicyDefinition> policiesWithPrevInstanceAsTarget) {
52         policiesWithPrevInstanceAsTarget.forEach(policy -> updatePolicyTargetWithNewInstanceVersion(policy, prevVersion.getUniqueId(), newVersion.getUniqueId()));
53     }
54
55     private void updatePolicyTargetWithNewInstanceVersion(PolicyDefinition policyDefinition, String prevInstanceId, String newInstanceId) {
56         List<String> policyInstanceTargets = policyDefinition.resolveComponentInstanceTargets();
57         if (isEmpty(policyInstanceTargets)) {
58             return;
59         }
60         policyInstanceTargets.replaceAll(prevInstanceIdByNewInstanceId(prevInstanceId, newInstanceId));
61     }
62
63     private UnaryOperator<String> prevInstanceIdByNewInstanceId(String prevInstanceId, String newInstanceId) {
64         return instId -> instId.equals(prevInstanceId) ? newInstanceId: instId;
65     }
66
67 }