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.components.merge.policy;
23 import org.openecomp.sdc.be.components.merge.ComponentsGlobalMergeCommand;
24 import org.openecomp.sdc.be.components.merge.VspComponentsMergeCommand;
25 import org.openecomp.sdc.be.dao.api.ActionStatus;
26 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
27 import org.openecomp.sdc.be.impl.ComponentsUtils;
28 import org.openecomp.sdc.be.model.Component;
29 import org.openecomp.sdc.be.model.ComponentInstance;
30 import org.openecomp.sdc.be.model.GroupDefinition;
31 import org.openecomp.sdc.be.model.PolicyDefinition;
32 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
33 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
34 import org.openecomp.sdc.common.log.wrappers.Logger;
35 import org.springframework.core.annotation.Order;
39 import static java.util.Collections.emptyList;
40 import static java.util.stream.Collectors.toList;
41 import static org.apache.commons.collections.CollectionUtils.isEmpty;
42 import static org.apache.commons.collections.MapUtils.isEmpty;
43 import static org.openecomp.sdc.be.components.merge.resource.ResourceDataMergeBusinessLogic.ANY_ORDER_COMMAND;
45 @org.springframework.stereotype.Component
46 @Order(ANY_ORDER_COMMAND)
47 public class PoliciesMergeCommand implements ComponentsGlobalMergeCommand, VspComponentsMergeCommand {
49 private static final Logger log = Logger.getLogger(PoliciesMergeCommand.class);
50 private final ToscaOperationFacade toscaOperationFacade;
51 private final ComponentsUtils componentsUtils;
53 public PoliciesMergeCommand(ToscaOperationFacade toscaOperationFacade, ComponentsUtils componentsUtils) {
54 this.toscaOperationFacade = toscaOperationFacade;
55 this.componentsUtils = componentsUtils;
59 public ActionStatus mergeComponents(Component prevComponent, Component currentComponent) {
60 log.debug("#mergeComponents - merging user defined policies to current component {}", currentComponent.getUniqueId());
61 if (isEmpty(prevComponent.getPolicies())) {
62 return ActionStatus.OK;
64 Map<String, PolicyDefinition> policiesToMerge = resolvePoliciesForMerge(prevComponent, currentComponent);
65 return associatePoliciesToComponent(currentComponent, policiesToMerge);
68 private ActionStatus associatePoliciesToComponent(Component currentComponent, Map<String, PolicyDefinition> policiesToMerge) {
69 log.debug("#associatePoliciesToComponent - associating {} policies into component {}", policiesToMerge.size(), currentComponent.getUniqueId());
70 currentComponent.setPolicies(policiesToMerge);
71 StorageOperationStatus associateResult = toscaOperationFacade.associatePoliciesToComponent(currentComponent.getUniqueId(), new ArrayList<>(policiesToMerge.values()));
72 return componentsUtils.convertFromStorageResponse(associateResult);
76 public String description() {
77 return "merge component policies";
80 private Map<String, PolicyDefinition> resolvePoliciesForMerge(Component prevComponent, Component currentComponent) {
81 Map<String, PolicyDefinition> policies = prevComponent.getPolicies();
82 policies.values().forEach(policy -> updatePolicyTargets(policy, prevComponent, currentComponent));
86 private void updatePolicyTargets(PolicyDefinition policy, Component prevComponent, Component currComponent) {
87 log.debug("#updatePolicyTargets - updating policy {} targets for component {}", policy.getUniqueId(), currComponent.getUniqueId());
88 if (isEmpty(policy.getTargets())) {
91 Map<PolicyTargetType, List<String>> targets = buildPolicyTargetsMap(policy, prevComponent, currComponent);
92 policy.setTargets(targets);
95 private Map<PolicyTargetType, List<String>> buildPolicyTargetsMap(PolicyDefinition policy, Component prevComponent, Component currComponent) {
96 List<String> componentInstanceTargets = resolveNewComponentInstanceTargets(policy, prevComponent, currComponent);
97 List<String> groupTargets = resolveNewGroupTargets(policy, prevComponent, currComponent);
98 Map<PolicyTargetType, List<String>> targets = new HashMap<>();
99 targets.put(PolicyTargetType.COMPONENT_INSTANCES, componentInstanceTargets);
100 targets.put(PolicyTargetType.GROUPS, groupTargets);
104 private List<String> resolveNewComponentInstanceTargets(PolicyDefinition policy, Component prevComponent, Component currComponent) {
105 List<String> prevCompInstanceTargets = policy.resolveComponentInstanceTargets();
106 if (isEmpty(prevCompInstanceTargets)) {
109 return resolveInstanceTargetsByInstanceName(prevComponent, currComponent, prevCompInstanceTargets);
112 private List<String> resolveNewGroupTargets(PolicyDefinition policy, Component prevComponent, Component currComponent) {
113 List<String> prevGroupTargets = policy.resolveGroupTargets();
114 if (isEmpty(prevGroupTargets)) {
117 return resolveGroupTargetsByInvariantName(prevComponent, currComponent, prevGroupTargets);
120 private List<String> resolveInstanceTargetsByInstanceName(Component prevComponent, Component currComponent, List<String> prevCompInstanceTargets) {
121 return prevCompInstanceTargets.stream()
122 .map(prevInstId -> resolveNewInstId(prevComponent, currComponent, prevInstId))
123 .filter(Optional::isPresent)
128 private List<String> resolveGroupTargetsByInvariantName(Component prevComponent, Component currComponent, List<String> prevGroupTargets) {
129 return prevGroupTargets.stream()
130 .map(prevGroupId -> resolveNewGroupId(prevComponent, currComponent, prevGroupId))
131 .filter(Optional::isPresent)
136 private Optional<String> resolveNewInstId(Component prevCmpt, Component newCmpt, String prevInstanceId) {
137 return prevCmpt.getComponentInstanceById(prevInstanceId)
138 .map(ComponentInstance::getName)
139 .flatMap(newCmpt::getComponentInstanceByName)
140 .map(ComponentInstance::getUniqueId);
143 private Optional<String> resolveNewGroupId(Component prevCmpt, Component newCmpt, String prevGroupId) {
144 return prevCmpt.getGroupById(prevGroupId)
145 .map(GroupDefinition::getInvariantName)
146 .flatMap(newCmpt::getGroupByInvariantName)
147 .map(GroupDefinition::getUniqueId);