diff options
author | MichaelMorris <michael.morris@est.tech> | 2021-08-12 09:14:21 +0100 |
---|---|---|
committer | Anderson Ribeiro <anderson.ribeiro@est.tech> | 2021-08-13 18:53:24 +0000 |
commit | 276117aaa383b16a0b62e2666a612e669b8f27c8 (patch) | |
tree | 6e34078c50b768569bf97ebb8ae578c8ac9d5e0a /catalog-model/src/main/java/org | |
parent | b8bfef3a009922db72c1a618211ce03c07683e58 (diff) |
Support models extending models
Signed-off-by: MichaelMorris <michael.morris@est.tech>
Issue-ID: SDC-3668
Change-Id: Iad4d2a28c1c982e55e8835d4f30a9a212aefb6be
Diffstat (limited to 'catalog-model/src/main/java/org')
3 files changed, 59 insertions, 4 deletions
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Model.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Model.java index 99d0f6599e..9c07c0565c 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Model.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Model.java @@ -30,5 +30,10 @@ import lombok.NoArgsConstructor; public class Model { private String name; + private String derivedFrom; + + public Model(final String name) { + this.name = name; + } } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java index ddc0367a44..d4bd7996f2 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ModelOperation.java @@ -19,6 +19,7 @@ package org.openecomp.sdc.be.model.operations.impl; import fj.data.Either; + import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.EnumMap; @@ -29,17 +30,24 @@ import java.util.Optional; import java.util.stream.Collectors; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.dao.cassandra.ToscaModelImportCassandraDao; +import org.openecomp.sdc.be.dao.graph.datatype.GraphEdge; +import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation; import org.openecomp.sdc.be.dao.janusgraph.JanusGraphGenericDao; import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus; import org.openecomp.sdc.be.dao.jsongraph.GraphVertex; import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao; import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum; +import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels; import org.openecomp.sdc.be.data.model.ToscaImportByModel; import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum; +import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; import org.openecomp.sdc.be.model.Model; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.OperationException; +import org.openecomp.sdc.be.model.operations.api.DerivedFromOperation; +import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.exception.ModelOperationExceptionSupplier; import org.openecomp.sdc.be.resources.data.ModelData; import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode; @@ -55,14 +63,17 @@ public class ModelOperation { private final JanusGraphGenericDao janusGraphGenericDao; private final JanusGraphDao janusGraphDao; private final ToscaModelImportCassandraDao toscaModelImportCassandraDao; + private final DerivedFromOperation derivedFromOperation; @Autowired public ModelOperation(final JanusGraphGenericDao janusGraphGenericDao, final JanusGraphDao janusGraphDao, - final ToscaModelImportCassandraDao toscaModelImportCassandraDao) { + final ToscaModelImportCassandraDao toscaModelImportCassandraDao, + final DerivedFromOperation derivedFromOperation) { this.janusGraphGenericDao = janusGraphGenericDao; this.janusGraphDao = janusGraphDao; this.toscaModelImportCassandraDao = toscaModelImportCassandraDao; + this.derivedFromOperation = derivedFromOperation; } public Model createModel(final Model model, final boolean inTransaction) { @@ -80,7 +91,8 @@ public class ModelOperation { throw new OperationException(ActionStatus.GENERAL_ERROR, String.format("Failed to create model %s on JanusGraph with %s error", model, janusGraphOperationStatus)); } - result = new Model(createNode.left().value().getName()); + addDerivedFromRelation(model); + result = new Model(createNode.left().value().getName(), model.getDerivedFrom()); return result; } finally { if (!inTransaction) { @@ -92,6 +104,24 @@ public class ModelOperation { } } } + + private void addDerivedFromRelation(final Model model) { + final String derivedFrom = model.getDerivedFrom(); + if (derivedFrom == null) { + return; + } + log.debug("Adding derived from relation between model {} to its parent {}", + model.getName(), derivedFrom); + final Optional<Model> derivedFromModelOptional = this.findModelByName(derivedFrom); + if (derivedFromModelOptional.isPresent()) { + final Either<GraphRelation, StorageOperationStatus> result = derivedFromOperation.addDerivedFromRelation(UniqueIdBuilder.buildModelUid(model.getName()), + UniqueIdBuilder.buildModelUid(derivedFromModelOptional.get().getName()), NodeTypeEnum.Model); + if(result.isRight()) { + throw new OperationException(ActionStatus.GENERAL_ERROR, + String.format("Failed to create relationship from model % to derived from model %s on JanusGraph with %s error", model, derivedFrom, result.right().value())); + } + } + } public Optional<GraphVertex> findModelVertexByName(final String name) { if (StringUtils.isEmpty(name)) { @@ -171,7 +201,24 @@ public class ModelOperation { } private Model convertToModel(final GraphVertex modelGraphVertex) { - return new Model((String) modelGraphVertex.getMetadataProperty(GraphPropertyEnum.NAME)); + final String modelName = (String) modelGraphVertex.getMetadataProperty(GraphPropertyEnum.NAME); + + final Either<ImmutablePair<ModelData, GraphEdge>, JanusGraphOperationStatus> parentNode = + janusGraphGenericDao.getChild(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.Model), UniqueIdBuilder.buildModelUid(modelName), + GraphEdgeLabels.DERIVED_FROM, NodeTypeEnum.Model, ModelData.class); + log.debug("After retrieving DERIVED_FROM node of {}. status is {}", modelName, parentNode); + if (parentNode.isRight()) { + final JanusGraphOperationStatus janusGraphOperationStatus = parentNode.right().value(); + if (janusGraphOperationStatus != JanusGraphOperationStatus.NOT_FOUND) { + final var operationException = ModelOperationExceptionSupplier.failedToRetrieveModels(janusGraphOperationStatus).get(); + log.error(EcompLoggerErrorCode.DATA_ERROR, this.getClass().getName(), operationException.getMessage()); + throw operationException; + } + return new Model((String) modelGraphVertex.getMetadataProperty(GraphPropertyEnum.NAME)); + } else { + final ModelData parentModel = parentNode.left().value().getKey(); + return new Model((String) modelGraphVertex.getMetadataProperty(GraphPropertyEnum.NAME), parentModel.getName()); + } } } diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/ModelCreateRequest.java b/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/ModelCreateRequest.java index 0d294b42c4..685d95e4ab 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/ModelCreateRequest.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/ModelCreateRequest.java @@ -20,17 +20,20 @@ package org.openecomp.sdc.be.ui.model; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; /** * This class is responsible for holding all required fields from the create Model post request. * It also validates the Model 'name' field. */ -@Data +@Data @AllArgsConstructor @NoArgsConstructor public class ModelCreateRequest { @NotNull(message = "Model name cannot be null") @Size(min = 2, message = "Model name cannot be empty") private String name; + private String derivedFrom; } |