diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/instance/ComponentInstanceRelationMerge.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/instance/ComponentInstanceRelationMerge.java | 348 |
1 files changed, 67 insertions, 281 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/instance/ComponentInstanceRelationMerge.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/instance/ComponentInstanceRelationMerge.java index 96f878abe0..995eae701c 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/instance/ComponentInstanceRelationMerge.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/instance/ComponentInstanceRelationMerge.java @@ -1,49 +1,45 @@ package org.openecomp.sdc.be.components.merge.instance; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - +import fj.data.Either; import org.apache.commons.lang3.StringUtils; +import org.openecomp.sdc.be.components.merge.utils.CapabilityOwner; +import org.openecomp.sdc.be.components.merge.utils.ComponentInstanceBuildingBlocks; import org.openecomp.sdc.be.components.merge.utils.MergeInstanceUtils; +import org.openecomp.sdc.be.dao.utils.MapUtil; import org.openecomp.sdc.be.impl.ComponentsUtils; -import org.openecomp.sdc.be.model.CapabilityDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentInstance; -import org.openecomp.sdc.be.model.RelationshipInfo; import org.openecomp.sdc.be.model.RequirementCapabilityRelDef; -import org.openecomp.sdc.be.model.RequirementDefinition; -import org.openecomp.sdc.be.model.Resource; import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.jsontitan.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.common.datastructure.Wrapper; +import org.openecomp.sdc.common.log.wrappers.Logger; import org.openecomp.sdc.exception.ResponseFormat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import com.att.aft.dme2.internal.google.common.annotations.VisibleForTesting; - -import fj.data.Either; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; @org.springframework.stereotype.Component("ComponentInstanceRelashionMerge") public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInterface { - private static Logger log = LoggerFactory.getLogger(ComponentInstanceRelationMerge.class); - - @Autowired - private ComponentsUtils componentsUtils; + private static final Logger log = Logger.getLogger(ComponentInstanceRelationMerge.class); - @Autowired - private MergeInstanceUtils mergeInstanceUtils; - - @Autowired - private ToscaOperationFacade toscaOperationFacade; + private final ComponentsUtils componentsUtils; + private final MergeInstanceUtils mergeInstanceUtils; + private final ToscaOperationFacade toscaOperationFacade; + public ComponentInstanceRelationMerge(ComponentsUtils componentsUtils, MergeInstanceUtils mergeInstanceUtils, ToscaOperationFacade toscaOperationFacade) { + this.componentsUtils = componentsUtils; + this.mergeInstanceUtils = mergeInstanceUtils; + this.toscaOperationFacade = toscaOperationFacade; + } + @Override public void saveDataBeforeMerge(DataForMergeHolder dataHolder, Component containerComponent, ComponentInstance currentResourceInstance, Component originComponent) { @@ -58,16 +54,16 @@ public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInt currentResourceInstance); if (!relationsFrom.isEmpty() || !relationsTo.isEmpty()) { - List<ComponentInstance> vfcInstances = mergeInstanceUtils.getVfcInstances(currentResourceInstance, originComponent); + ComponentInstanceBuildingBlocks instBuildingBlocks = mergeInstanceUtils.getInstanceAtomicBuildingBlocks(currentResourceInstance, originComponent); - if (vfcInstances != null) { - List<RelationMergeInfo> fromRelInfoList = convert(relationsFrom, rel -> mapRelationRequirement(rel, vfcInstances)); - List<RelationMergeInfo> toRelInfoList = convert(relationsTo, rel -> mapRelationCapability(rel, vfcInstances)); + if (instBuildingBlocks != null) { + List<RelationMergeInfo> fromRelInfoList = convert(relationsFrom, rel -> mergeInstanceUtils.mapRelationRequirement(rel, instBuildingBlocks.getVfcInstances())); + List<RelationMergeInfo> toRelInfoList = convert(relationsTo, rel -> mergeInstanceUtils.mapRelationCapability(rel, instBuildingBlocks.getCapabilitiesOwners())); // Encapsulate all needed info in one container - VfRelationsMergeInfo vfRelationsMergeInfo = new VfRelationsMergeInfo(fromRelInfoList, toRelInfoList); + ContainerRelationsMergeInfo containerRelationsMergeInfo = new ContainerRelationsMergeInfo(fromRelInfoList, toRelInfoList); // Save it - dataHolder.setVfRelationsInfo(vfRelationsMergeInfo); + dataHolder.setVfRelationsInfo(containerRelationsMergeInfo); } } else { @@ -81,7 +77,7 @@ public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInt public Either<Component, ResponseFormat> mergeDataAfterCreate(User user, DataForMergeHolder dataHolder, Component updatedContainerComponent, String newInstanceId) { Wrapper<Either<Component, ResponseFormat>> resultWrapper = new Wrapper<>(); - VfRelationsMergeInfo vfRelationsMergeInfo = getRelationsMergeInfo(dataHolder, updatedContainerComponent, resultWrapper); + ContainerRelationsMergeInfo containerRelationsMergeInfo = getRelationsMergeInfo(dataHolder, updatedContainerComponent, resultWrapper); ComponentInstance newComponentInstance = null; if(resultWrapper.isEmpty()) { @@ -89,31 +85,13 @@ public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInt newComponentInstance = loadComponentInstance(updatedContainerComponent, newInstanceId, resultWrapper); } - if(resultWrapper.isEmpty() && vfRelationsMergeInfo != null) { + if(resultWrapper.isEmpty() && containerRelationsMergeInfo != null) { // Load VFCI and filter them by name - List<ComponentInstance> vfcInstances = mergeInstanceUtils.getVfcInstances(newComponentInstance); - if(vfcInstances != null) { - Map<String, ComponentInstance> vfciMap = mergeInstanceUtils.convertToVfciNameMap(vfcInstances); - + ComponentInstanceBuildingBlocks instanceBuildBlocks = mergeInstanceUtils.getInstanceAtomicBuildingBlocks(newComponentInstance); + if(instanceBuildBlocks != null) { // Process Relationships - List<RelationMergeInfo> toRelationsInfo = vfRelationsMergeInfo.getToRelationsInfo(); - Stream<RequirementCapabilityRelDef> toRelationsInfoStream = null; - if (toRelationsInfo != null) { - toRelationsInfoStream = toRelationsInfo.stream() - .map(oldCapInfo -> restoreCapabilityRelation(oldCapInfo, newInstanceId, vfciMap, updatedContainerComponent)) - .filter(Objects::nonNull); - } - - List<RelationMergeInfo> fromRelationsInfo = vfRelationsMergeInfo.getFromRelationsInfo(); - Stream<RequirementCapabilityRelDef> fromRelationsInfoStream = null; - if( fromRelationsInfo != null) { - //For Each old requirement relation info - fromRelationsInfoStream = fromRelationsInfo.stream() - .map(oldReqInfo -> restoreRequirementRelation(oldReqInfo, newInstanceId, vfciMap, updatedContainerComponent)) - .filter(Objects::nonNull); - } - - // Save relations in updated container (service) + Stream<RequirementCapabilityRelDef> toRelationsInfoStream = getCapabilitiesRelationInfoStream(updatedContainerComponent, newInstanceId, containerRelationsMergeInfo, instanceBuildBlocks); + Stream<RequirementCapabilityRelDef> fromRelationsInfoStream = getRequirementRelationsInfoStream(updatedContainerComponent, newInstanceId, containerRelationsMergeInfo, instanceBuildBlocks); List<RequirementCapabilityRelDef> updatedRelations = getUpdatedRelations(toRelationsInfoStream, fromRelationsInfoStream); StorageOperationStatus saveResult = toscaOperationFacade.associateResourceInstances(updatedContainerComponent.getUniqueId(), updatedRelations); if (saveResult == StorageOperationStatus.OK) { @@ -126,24 +104,31 @@ public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInt } } } - return resultWrapper.getInnerElement(); } - - @VisibleForTesting - public void setToscaOperationFacade(ToscaOperationFacade toscaOperationFacade) { - this.toscaOperationFacade = toscaOperationFacade; - } - - - @VisibleForTesting - public void setComponentsUtils(ComponentsUtils componentsUtils) { - this.componentsUtils = componentsUtils; + + private Stream<RequirementCapabilityRelDef> getRequirementRelationsInfoStream(Component updatedContainerComponent, String newInstanceId, ContainerRelationsMergeInfo containerRelationsMergeInfo, ComponentInstanceBuildingBlocks instanceBuildBlocks) { + Map<String, ComponentInstance> vfciMap = MapUtil.toMap(instanceBuildBlocks.getVfcInstances(), ComponentInstance::getName, (p1, p2) -> p1); + List<RelationMergeInfo> fromRelationsInfo = containerRelationsMergeInfo.getFromRelationsInfo(); + Stream<RequirementCapabilityRelDef> fromRelationsInfoStream = null; + if( fromRelationsInfo != null) { + fromRelationsInfoStream = fromRelationsInfo.stream() + .map(oldReqInfo -> mergeInstanceUtils.restoreRequirementRelation(oldReqInfo, newInstanceId, vfciMap, updatedContainerComponent)) + .filter(Objects::nonNull); + } + return fromRelationsInfoStream; } - - @VisibleForTesting - public void setMergeInstanceUtils(MergeInstanceUtils mergeInstanceUtils) { - this.mergeInstanceUtils = mergeInstanceUtils; + + private Stream<RequirementCapabilityRelDef> getCapabilitiesRelationInfoStream(Component updatedContainerComponent, String newInstanceId, ContainerRelationsMergeInfo containerRelationsMergeInfo, ComponentInstanceBuildingBlocks instanceBuildBlocks) { + Map<String, CapabilityOwner> capOwnersByName = MapUtil.toMap(instanceBuildBlocks.getCapabilitiesOwners(), CapabilityOwner::getName, (p1, p2) -> p1); + List<RelationMergeInfo> toRelationsInfo = containerRelationsMergeInfo.getToRelationsInfo(); + Stream<RequirementCapabilityRelDef> toRelationsInfoStream = null; + if (toRelationsInfo != null) { + toRelationsInfoStream = toRelationsInfo.stream() + .map(oldCapInfo -> mergeInstanceUtils.restoreCapabilityRelation(oldCapInfo, newInstanceId, capOwnersByName, updatedContainerComponent)) + .filter(Objects::nonNull); + } + return toRelationsInfoStream; } /** @@ -184,6 +169,10 @@ public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInt ComponentInstance currentResourceInstance) { final List<RequirementCapabilityRelDef> componentInstancesRelations = containerComponent.getComponentInstancesRelations(); + if (componentInstancesRelations == null) { + return Collections.emptyList(); + } + final String vfInstanceId = currentResourceInstance.getUniqueId(); return componentInstancesRelations.stream() @@ -194,223 +183,20 @@ public class ComponentInstanceRelationMerge implements ComponentInstanceMergeInt private List<RelationMergeInfo> convert(List<RequirementCapabilityRelDef> relationsDef, Function<RequirementCapabilityRelDef, RelationMergeInfo> mapFunc) { return relationsDef.stream() - .map(mapFunc::apply) + .map(mapFunc) .filter(Objects::nonNull) .collect(Collectors.toList()); } - private RelationMergeInfo mapRelationCapability(RequirementCapabilityRelDef relDef, List<ComponentInstance> vfcInstances) { - // Id of the VfcInstance that is the owner of the capability - String ownerId = relDef.resolveSingleRelationship().getRelation().getCapabilityOwnerId(); - return createRelationMergeInfo(vfcInstances, ownerId, currVfcInst -> mapVfcInstanceCapability(currVfcInst, relDef)); - } - - private RelationMergeInfo mapRelationRequirement(RequirementCapabilityRelDef relDef, List<ComponentInstance> vfcInstances) { - // Id of the VfcInstance that is the owner of the requirement - String ownerId = relDef.resolveSingleRelationship().getRelation().getRequirementOwnerId(); - return createRelationMergeInfo(vfcInstances, ownerId, currVfcInst -> mapVfcInstanceRequirement(currVfcInst, relDef)); - } - - private RelationMergeInfo createRelationMergeInfo(List<ComponentInstance> vfcInstances, String ownerId, Function<ComponentInstance, RelationMergeInfo> mapFunc) { - return vfcInstances.stream() - .filter(inst -> StringUtils.equals(inst.getUniqueId(), ownerId)) - .map(mapFunc::apply) - .filter(Objects::nonNull) - .findAny() - .orElse(null); - } - - - private RelationMergeInfo mapVfcInstanceCapability(ComponentInstance vfcInstance, RequirementCapabilityRelDef relDef) { - String capabilityUniqueId = relDef.resolveSingleRelationship().getRelation().getCapabilityUid(); - - - String vfcInstanceName = vfcInstance.getName(); - String vfcUid = vfcInstance.getComponentUid(); - - Either<Resource, StorageOperationStatus> vfcResource = toscaOperationFacade.getToscaElement(vfcUid); - if(vfcResource.isLeft()) { - Resource vfc = vfcResource.left().value(); - - CapabilityDefinition capabilityDef = retrieveCapabilityDefinition(capabilityUniqueId, vfc); - String capabilityType; - String capabilityName; - if (capabilityDef != null) { - capabilityType = capabilityDef.getType(); - capabilityName = capabilityDef.getName(); - } - else { - log.debug("Failed to retrieve capability type for relation with name: {} and uniqueId {}", relDef.resolveSingleRelationship().getRelation().getCapability(), capabilityUniqueId); - capabilityType = null; - capabilityName = null; - } - - return new RelationMergeInfo(capabilityType, capabilityName, vfcInstanceName, relDef); - } - else { - log.debug("Failed to load VFC by uid {}", vfcUid); - return null; - } - } - - private RelationMergeInfo mapVfcInstanceRequirement(ComponentInstance vfcInstance, RequirementCapabilityRelDef relDef) { - String requirementUniqueId = relDef.resolveSingleRelationship().getRelation().getRequirementUid(); - - String vfcInstanceName = vfcInstance.getName(); - String vfcUid = vfcInstance.getComponentUid(); - - Either<Resource, StorageOperationStatus> vfcResource = toscaOperationFacade.getToscaElement(vfcUid); - if(vfcResource.isLeft()) { - Resource vfc = vfcResource.left().value(); - - RequirementDefinition requirementDef = retrieveRequirementDefinition(requirementUniqueId, vfc); - String requirementType; - String requirementName; - if (requirementDef != null) { - requirementType = requirementDef.getCapability(); - requirementName = requirementDef.getName(); - } - else { - log.debug("Failed to retrieve requirement type for relation with name: {} and uniqueId {}", relDef.resolveSingleRelationship().getRelation().getRequirement(), requirementUniqueId); - requirementType = null; - requirementName = null; - } - - return new RelationMergeInfo(requirementType, requirementName, vfcInstanceName, relDef); - } - else { - log.debug("Failed to load VFC by uid {}", vfcUid); - return null; - } - } - - private CapabilityDefinition retrieveCapabilityDefinition(String uniqueId, Resource vfc) { - return vfc.getCapabilities().values().stream() - .flatMap(List::stream) - .filter(Objects::nonNull) - .filter(def -> uniqueId.equals(def.getUniqueId())) - .findFirst() - .orElse(null); - } - - private String retrieveCapabilityUid(String name, Component vfc) { - return vfc.getCapabilities().values().stream() - .flatMap(List::stream) - .filter(Objects::nonNull) - .filter(def -> name.equals(def.getName())) - .findFirst() - .map(CapabilityDefinition::getUniqueId) - .orElse(null); - } - - private RequirementDefinition retrieveRequirementDefinition(String uniqueId, Resource vfc) { - return vfc.getRequirements().values().stream() - .flatMap(List::stream) - .filter(Objects::nonNull) - .filter(def -> uniqueId.equals(def.getUniqueId())) - .findFirst() - .orElse(null); - } - - private String retrieveRequirementUid(String name, Component vfc) { - return vfc.getRequirements().values().stream() - .flatMap(List::stream) - .filter(Objects::nonNull) - .filter(def -> name.equals(def.getName())) - .findFirst() - .map(RequirementDefinition::getUniqueId) - .orElse(null); - } - - - - private VfRelationsMergeInfo getRelationsMergeInfo(DataForMergeHolder dataHolder, - Component updatedContainerComponent, - Wrapper<Either<Component, ResponseFormat>> resultWrapper) { - VfRelationsMergeInfo vfRelationsMergeInfo = dataHolder.getVfRelationsMergeInfo(); - if (vfRelationsMergeInfo == null) { + private ContainerRelationsMergeInfo getRelationsMergeInfo(DataForMergeHolder dataHolder, + Component updatedContainerComponent, + Wrapper<Either<Component, ResponseFormat>> resultWrapper) { + ContainerRelationsMergeInfo containerRelationsMergeInfo = dataHolder.getContainerRelationsMergeInfo(); + if (containerRelationsMergeInfo == null) { log.debug("There is no info about relations should be restored."); resultWrapper.setInnerElement(Either.left(updatedContainerComponent)); } - return vfRelationsMergeInfo; - } - - - private RequirementCapabilityRelDef restoreCapabilityRelation(RelationMergeInfo oldCapInfo, - String newInstanceId, - Map<String, ComponentInstance> vfciMap, - Component updatedContainerComponent) { - String oldVfcInstanceName = oldCapInfo.getVfcInstanceName(); - - ComponentInstance newVfcInstance = vfciMap.get(oldVfcInstanceName); - if (newVfcInstance != null) { - // Append relation to updated container - RequirementCapabilityRelDef oldRelDef = oldCapInfo.getRelDef(); - oldRelDef.setToNode(newInstanceId); - - RelationshipInfo oldRelationshipInfo = oldRelDef.resolveSingleRelationship().getRelation(); - oldRelationshipInfo.setCapabilityOwnerId(newVfcInstance.getUniqueId()); - oldRelationshipInfo.getRelationship().setType(oldCapInfo.getCapReqType()); - - - String vfcUid = newVfcInstance.getComponentUid(); - Either<Component, StorageOperationStatus> eitherComponent = toscaOperationFacade.getToscaElement(vfcUid); - - if(eitherComponent.isLeft()) { - String capabilityUid = retrieveCapabilityUid(oldCapInfo.getCapReqName() , eitherComponent.left().value()); - oldRelationshipInfo.setCapabilityUid(capabilityUid); - } - else { - log.debug("Unexpected error: resource was not loaded for VF ID: {}", vfcUid); - } - - updatedContainerComponent.getComponentInstancesRelations().add(oldRelDef); - return oldRelDef; - } - else { - log.debug("Skip relation since it was not found VFC Instance with name {}", oldVfcInstanceName); - return null; - } - } - - - - private RequirementCapabilityRelDef restoreRequirementRelation(RelationMergeInfo oldReqInfo, - String newInstanceId, - Map<String, ComponentInstance> vfciMap, - Component updatedContainerComponent) { - String oldVfcInstanceName = oldReqInfo.getVfcInstanceName(); - - ComponentInstance newVfcInstance = vfciMap.get(oldReqInfo.getVfcInstanceName()); - if (newVfcInstance != null) { - // Append relation to updated container - RequirementCapabilityRelDef oldRelDef = oldReqInfo.getRelDef(); - oldRelDef.setFromNode(newInstanceId); - - RelationshipInfo oldRelationshipInfo = oldRelDef.resolveSingleRelationship().getRelation(); - oldRelationshipInfo.setRequirementOwnerId(newVfcInstance.getUniqueId()); - oldRelationshipInfo.getRelationship().setType(oldReqInfo.getCapReqType()); - - String vfcUid = newVfcInstance.getComponentUid(); - Either<Component, StorageOperationStatus> eitherComponent = toscaOperationFacade.getToscaElement(vfcUid); - - if(eitherComponent.isLeft()) { - String requirementUid = retrieveRequirementUid(oldReqInfo.getCapReqName() , eitherComponent.left().value()); - oldRelationshipInfo.setRequirementUid(requirementUid); - } - else { - log.debug("Unexpected error: resource was not loaded for VF ID: {}", vfcUid); - } - - updatedContainerComponent.getComponentInstancesRelations().add(oldRelDef); - return oldRelDef; - } - else { - log.debug("Skip relation since it was not found VFC Instance with name {}", oldVfcInstanceName); - return null; - } + return containerRelationsMergeInfo; } - - } |