diff options
Diffstat (limited to 'asdctool/src/main/java/org/openecomp/sdc/asdctool/migration/tasks/mig1806/SDCInstancesMigration.java')
-rw-r--r-- | asdctool/src/main/java/org/openecomp/sdc/asdctool/migration/tasks/mig1806/SDCInstancesMigration.java | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/asdctool/src/main/java/org/openecomp/sdc/asdctool/migration/tasks/mig1806/SDCInstancesMigration.java b/asdctool/src/main/java/org/openecomp/sdc/asdctool/migration/tasks/mig1806/SDCInstancesMigration.java new file mode 100644 index 0000000000..4786839250 --- /dev/null +++ b/asdctool/src/main/java/org/openecomp/sdc/asdctool/migration/tasks/mig1806/SDCInstancesMigration.java @@ -0,0 +1,237 @@ +package org.openecomp.sdc.asdctool.migration.tasks.mig1806; + +import fj.data.Either; +import org.openecomp.sdc.asdctool.migration.core.DBVersion; +import org.openecomp.sdc.asdctool.migration.core.task.Migration; +import org.openecomp.sdc.asdctool.migration.core.task.MigrationResult; +import org.openecomp.sdc.be.dao.jsongraph.GraphVertex; +import org.openecomp.sdc.be.dao.jsongraph.TitanDao; +import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum; +import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum; +import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum; +import org.openecomp.sdc.be.dao.titan.TitanOperationStatus; +import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition; +import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition; +import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum; +import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum; +import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; +import org.openecomp.sdc.be.model.jsontitan.enums.JsonConstantKeysEnum; +import org.openecomp.sdc.be.model.jsontitan.operations.NodeTemplateOperation; +import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; +import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter; +import org.openecomp.sdc.common.log.wrappers.Logger; +import org.springframework.stereotype.Component; + +import java.math.BigInteger; +import java.util.*; +import java.util.Map.Entry; + +@Component +public class SDCInstancesMigration implements Migration { + + private TitanDao titanDao; + private NodeTemplateOperation nodeTemplateOperation; + + private static final Logger log = Logger.getLogger(SDCInstancesMigration.class); + + private static final String ALLOTTED_CATEGORY = "Allotted Resource"; + + private static final List<String> UUID_PROPS_NAMES = Arrays.asList("providing_service_uuid", "providing_service_uuid"); + + + public SDCInstancesMigration(TitanDao titanDao, NodeTemplateOperation nodeTemplateOperation) { + this.titanDao = titanDao; + this.nodeTemplateOperation = nodeTemplateOperation; + } + + @Override + public String description() { + return "connect instances in container to its origins"; + } + + @Override + public DBVersion getVersion() { + return DBVersion.from(BigInteger.valueOf(1806), BigInteger.valueOf(0)); + } + + @Override + public MigrationResult migrate() { + StorageOperationStatus status = connectAllContainers(); + + return status == StorageOperationStatus.OK ? MigrationResult.success() : MigrationResult.error("failed to create connection between instances and origins. Error : " + status); + } + + private StorageOperationStatus connectAllContainers() { + StorageOperationStatus status; + Map<GraphPropertyEnum, Object> hasNotProps = new EnumMap<>(GraphPropertyEnum.class); + hasNotProps.put(GraphPropertyEnum.IS_DELETED, true); + hasNotProps.put(GraphPropertyEnum.RESOURCE_TYPE, ResourceTypeEnum.CVFC); + + status = titanDao.getByCriteria(VertexTypeEnum.TOPOLOGY_TEMPLATE, null, hasNotProps, JsonParseFlagEnum.ParseAll) + .either(this::connectAll, this::handleError); + return status; + } + + private StorageOperationStatus handleError(TitanOperationStatus err) { + return DaoStatusConverter.convertTitanStatusToStorageStatus(TitanOperationStatus.NOT_FOUND == err ? TitanOperationStatus.OK : err); + } + + private StorageOperationStatus connectAll(List<GraphVertex> containersV) { + StorageOperationStatus status = StorageOperationStatus.OK; + for (GraphVertex container : containersV) { + status = handleOneContainer(container); + if (status != StorageOperationStatus.OK) { + break; + } + } + return status; + } + + private StorageOperationStatus handleOneContainer(GraphVertex containerV) { + StorageOperationStatus status = StorageOperationStatus.OK; + + boolean needConnectAllotted = false; + ComponentTypeEnum componentType = containerV.getType(); + Map<String, MapPropertiesDataDefinition> instanceProperties = null; + if (componentType == ComponentTypeEnum.RESOURCE) { + Either<GraphVertex, TitanOperationStatus> subcategoryV = titanDao.getChildVertex(containerV, EdgeLabelEnum.CATEGORY, JsonParseFlagEnum.NoParse); + if (subcategoryV.isRight()) { + log.debug("Failed to fetch category vertex for resource {} error {} ", containerV.getUniqueId(), subcategoryV.right().value()); + return StorageOperationStatus.GENERAL_ERROR; + } + GraphVertex catV = subcategoryV.left().value(); + Map<GraphPropertyEnum, Object> metadataProperties = catV.getMetadataProperties(); + + String name = (String) metadataProperties.get(GraphPropertyEnum.NAME); + if (name.equals(ALLOTTED_CATEGORY)) { + log.debug("Find allotted resource {}.", containerV.getUniqueId()); + needConnectAllotted = true; + Either<Map<String, MapPropertiesDataDefinition>, StorageOperationStatus> instProperties = getInstProperties(containerV); + if ( instProperties.isRight() ){ + return instProperties.right().value(); + } + instanceProperties = instProperties.left().value(); + } + } + Map<String, CompositionDataDefinition> jsonComposition = (Map<String, CompositionDataDefinition>) containerV.getJson(); + if (jsonComposition != null && !jsonComposition.isEmpty()) { + try { + status = connectInstances(containerV, needConnectAllotted, instanceProperties, jsonComposition); + + } finally { + if (status == StorageOperationStatus.OK) { + titanDao.commit(); + } else { + titanDao.rollback(); + } + } + } + return status; + } + + private Either<Map<String, MapPropertiesDataDefinition>, StorageOperationStatus> getInstProperties(GraphVertex containerV) { + Map<String, MapPropertiesDataDefinition> instanceProperties; + Either<GraphVertex, TitanOperationStatus> instProps = titanDao.getChildVertex(containerV, EdgeLabelEnum.INST_PROPERTIES, JsonParseFlagEnum.ParseAll); + + if (instProps.isRight()) { + if (instProps.right().value() == TitanOperationStatus.NOT_FOUND) { + instanceProperties = new HashMap<>(); + } else { + log.debug("Failed to fetch instance properties vertex for resource {} error {} ", containerV.getUniqueId(), instProps.right().value()); + return Either.right(StorageOperationStatus.GENERAL_ERROR); + } + } else { + instanceProperties = (Map<String, MapPropertiesDataDefinition>) instProps.left().value().getJson(); + } + return Either.left(instanceProperties); + } + + private StorageOperationStatus connectInstances(GraphVertex containerV, boolean needConnectAllotted, Map<String, MapPropertiesDataDefinition> instanceProperties, + Map<String, CompositionDataDefinition> jsonComposition) { + StorageOperationStatus status = StorageOperationStatus.OK; + CompositionDataDefinition compositionDataDefinition = jsonComposition.get(JsonConstantKeysEnum.COMPOSITION.getValue()); + Map<String, ComponentInstanceDataDefinition> componentInstances = compositionDataDefinition.getComponentInstances(); + for (Map.Entry<String, ComponentInstanceDataDefinition> entry : componentInstances.entrySet()) { + status = handleInstance(containerV, needConnectAllotted, instanceProperties, entry); + if ( status != StorageOperationStatus.OK){ + if ( status == StorageOperationStatus.NOT_FOUND ){ + log.debug("reset status and continue"); + status = StorageOperationStatus.OK; + }else{ + log.debug("Failed handle instance. exit"); + break; + } + } + } + return status; + } + + private StorageOperationStatus handleInstance(GraphVertex containerV, boolean needConnectAllotted, Map<String, MapPropertiesDataDefinition> instanceProperties, Map.Entry<String, ComponentInstanceDataDefinition> entry) { + ComponentInstanceDataDefinition instance = entry.getValue(); + StorageOperationStatus status = nodeTemplateOperation.createInstanceEdge(containerV, instance); + if (status != StorageOperationStatus.OK) { + if ( status == StorageOperationStatus.NOT_FOUND ){ + Boolean highest = (Boolean) containerV.getMetadataProperties().get(GraphPropertyEnum.IS_HIGHEST_VERSION); + log.debug("No origin for instance {} with ID {}. The component is highest ={}, Reset status and continue.. ", instance.getUniqueId(), instance.getComponentUid(), highest); + status = StorageOperationStatus.OK; + }else{ + log.debug("Failed to connect in container {} instance {} to origin {} error {} ", containerV.getUniqueId(), instance.getUniqueId(), instance.getComponentUid(), status); + return status; + } + } + if (needConnectAllotted) { + status = connectAllotedInstances(containerV, instanceProperties, instance); + } + return status; + } + + private StorageOperationStatus connectAllotedInstances(GraphVertex containerV, Map<String, MapPropertiesDataDefinition> instanceProperties, ComponentInstanceDataDefinition instance) { + StorageOperationStatus status = StorageOperationStatus.OK; + if ( instanceProperties != null ){ + MapPropertiesDataDefinition mapPropertiesDataDefinition = instanceProperties.get(instance.getUniqueId()); + if ( mapPropertiesDataDefinition != null ){ + status = checkAllottedPropertyAndConnect(containerV, instance, mapPropertiesDataDefinition); + }else{ + log.debug("No isntances properties for instance {}", instance.getUniqueId()); + } + } + return status; + } + + private StorageOperationStatus checkAllottedPropertyAndConnect(GraphVertex containerV, ComponentInstanceDataDefinition instance, MapPropertiesDataDefinition mapPropertiesDataDefinition) { + Map<String, PropertyDataDefinition> mapToscaDataDefinition = mapPropertiesDataDefinition.getMapToscaDataDefinition(); + StorageOperationStatus status = StorageOperationStatus.OK; + Optional<Entry<String, PropertyDataDefinition>> findFirst = mapToscaDataDefinition + .entrySet() + .stream() + .filter(e -> UUID_PROPS_NAMES.contains(e.getKey())) + .findFirst(); + + if ( findFirst.isPresent() ){ + PropertyDataDefinition property = findFirst.get().getValue(); + String serviceUUID = property.getValue(); + if ( serviceUUID != null ){ + log.debug("Defined reference service on property {} value {} on instance {}", property.getName(), property.getValue(), instance.getUniqueId() ); + status = nodeTemplateOperation.createAllottedOfEdge(containerV.getUniqueId(), instance.getUniqueId(), serviceUUID); + if ( status != StorageOperationStatus.OK ){ + if ( status == StorageOperationStatus.NOT_FOUND ){ + Boolean highest = (Boolean) containerV.getMetadataProperties().get(GraphPropertyEnum.IS_HIGHEST_VERSION); + log.debug("No origin for allotted reference {} with UUID {}. the component highest = {}, Reset status and continue.. ", instance.getUniqueId(), serviceUUID, highest); + status = StorageOperationStatus.OK; + }else{ + log.debug("Failed to connect in container {} instance {} to allotted service {} error {} ", containerV.getUniqueId(), instance.getUniqueId(), instance.getComponentUid(), status); + return status; + } + } + }else{ + log.debug("No value for property {} on instance {}", property.getName(),instance.getUniqueId() ); + } + }else{ + log.debug("No sercific properties of dependencies for instance {}", instance.getUniqueId()); + } + return status; + } + +} |