1 package org.openecomp.sdc.be.components.merge.instance;
4 import org.javatuples.Pair;
5 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
6 import org.openecomp.sdc.be.dao.api.ActionStatus;
7 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
8 import org.openecomp.sdc.be.impl.ComponentsUtils;
9 import org.openecomp.sdc.be.impl.ForwardingPathUtils;
10 import org.openecomp.sdc.be.model.*;
11 import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade;
12 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
13 import org.openecomp.sdc.common.log.wrappers.Logger;
14 import org.openecomp.sdc.exception.ResponseFormat;
15 import org.springframework.beans.factory.annotation.Autowired;
18 import java.util.stream.Collectors;
20 @org.springframework.stereotype.Component
21 public class ComponentInstanceForwardingPathMerge implements ComponentInstanceMergeInterface {
23 private static Logger log = Logger.getLogger(ComponentInstanceForwardingPathMerge.class);
26 private ServiceBusinessLogic serviceBusinessLogic;
29 private ToscaOperationFacade toscaOperationFacade;
32 private ComponentsUtils componentsUtils;
35 public void saveDataBeforeMerge(DataForMergeHolder dataHolder, Component containerComponent,
36 ComponentInstance currentResourceInstance, Component originComponent) {
37 dataHolder.setOrigInstanceCapabilities(getAllInstanceCapabilities(currentResourceInstance));
38 dataHolder.setOrigInstanceNode(originComponent);
39 dataHolder.setOrigComponentInstId(currentResourceInstance.getName());
43 public Either<Component, ResponseFormat> mergeDataAfterCreate(User user, DataForMergeHolder dataHolder,
44 Component updatedContainerComponent, String newInstanceId) {
45 if (!(updatedContainerComponent instanceof Service)) {
46 // no need to handle forwarding paths
47 return Either.left(updatedContainerComponent);
49 Service service = (Service) updatedContainerComponent;
50 ComponentInstance ci = service.getComponentInstanceById(newInstanceId).orElse(null);
52 ResponseFormat responseFormat = componentsUtils
53 .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, newInstanceId);
54 return Either.right(responseFormat);
56 Either<Component, StorageOperationStatus> resourceEither = toscaOperationFacade.getToscaFullElement(ci.getComponentUid());
57 if (resourceEither.isRight() ) {
58 log.debug("Failed to fetch resource with id {} for instance {}",ci.getComponentUid() ,ci.getUniqueId());
59 ResponseFormat responseFormat = componentsUtils
60 .getResponseFormat(componentsUtils.convertFromStorageResponse(resourceEither.right().value()));
61 return Either.right(responseFormat);
64 Component fetchedComponent = resourceEither.left().value();
66 Pair<Map<String, ForwardingPathDataDefinition>, Map<String, ForwardingPathDataDefinition>> pair = new ForwardingPathUtils()
67 .updateForwardingPathOnVersionChange(service, dataHolder, fetchedComponent, newInstanceId);
68 Map<String, ForwardingPathDataDefinition> updated = pair.getValue0();
69 Map<String, ForwardingPathDataDefinition> deleted = pair.getValue1();
70 if (deleted != null && !deleted.isEmpty()) {
71 Either<Set<String>, ResponseFormat> deleteEither = serviceBusinessLogic
72 .deleteForwardingPaths(service.getUniqueId(), new HashSet<>(deleted.keySet()), user, false);
73 if (deleteEither.isRight()) {
74 if (log.isDebugEnabled()) {
75 log.debug("Failed to delete forwarding paths : {}", deleted.values().stream()
76 .map(ForwardingPathDataDefinition::getName).collect(Collectors.joining(", ", "( ", " )")));
78 return Either.right(deleteEither.right().value());
80 deleted.keySet().forEach(key -> service.getForwardingPaths().remove(key));
82 if (updated != null && !updated.isEmpty()) {
83 Service updateFPService = new Service();
84 updateFPService.setForwardingPaths(updated);
85 Either<Service, ResponseFormat> updateFPEither = serviceBusinessLogic
86 .updateForwardingPath(service.getUniqueId(), updateFPService, user, false);
87 if (updateFPEither.isRight()) {
88 if (log.isDebugEnabled()) {
89 log.debug("Failed to update forwarding paths : {}", updated.values().stream()
90 .map(ForwardingPathDataDefinition::getName).collect(Collectors.joining(", ", "( ", " )")));
92 return Either.right(updateFPEither.right().value());
94 updated.forEach((key, forwardingPathDataDefinition) -> service.getForwardingPaths().put(key,forwardingPathDataDefinition));
96 return Either.left(updatedContainerComponent);
100 private List<CapabilityDefinition> getAllInstanceCapabilities(ComponentInstance currentResourceInstance) {
101 if(currentResourceInstance.getCapabilities() == null || currentResourceInstance.getCapabilities().isEmpty()){
102 return Collections.EMPTY_LIST;
104 return currentResourceInstance.getCapabilities().values().stream().flatMap(Collection::stream)
105 .collect(Collectors.toList());