From 18b6345a65843bcea872125cd0888ced7c521588 Mon Sep 17 00:00:00 2001 From: MichaelMorris Date: Tue, 21 Mar 2023 16:31:56 +0000 Subject: Add robustness to type creation on service import Change-Id: I2c6bf2a13f8972c3c336ee032d4d0fda22f90938 Issue-ID: SDC-4355 Signed-off-by: MichaelMorris --- .../sdc/be/components/csar/CsarBusinessLogic.java | 7 ++- .../sdc/be/components/csar/ServiceCsarInfo.java | 67 +++++++++++++++------- .../be/components/ResourceImportManagerTest.java | 3 +- .../be/components/csar/CsarBusinessLogicTest.java | 4 +- .../be/components/csar/ServiceCsarInfoTest.java | 5 +- .../impl/ServiceImportBusinessLogicTest.java | 3 +- .../impl/ServiceImportParseLogicTest.java | 3 +- .../be/model/operations/impl/ModelOperation.java | 2 +- 8 files changed, 65 insertions(+), 29 deletions(-) diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogic.java index 0df8555b47..36c16bed9e 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogic.java @@ -50,6 +50,7 @@ import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.CsarOperation; import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode; import org.openecomp.sdc.common.log.wrappers.Logger; @@ -64,15 +65,17 @@ public class CsarBusinessLogic extends BaseBusinessLogic { private static final String FAILED = " failed"; private final YamlTemplateParsingHandler yamlHandler; private CsarOperation csarOperation; + private ModelOperation modelOperation; @Autowired public CsarBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation, IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation, InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation, YamlTemplateParsingHandler yamlHandler, - ArtifactsOperations artifactToscaOperation) { + ArtifactsOperations artifactToscaOperation, ModelOperation modelOperation) { super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation); this.yamlHandler = yamlHandler; + this.modelOperation = modelOperation; } @Autowired @@ -160,7 +163,7 @@ public class CsarBusinessLogic extends BaseBusinessLogic { oldResource.getComponentMetadataDefinition().getMetadataDataDefinition().setImportedToscaChecksum(checksum); } return new ServiceCsarInfo(user, csarUUID, csar, service.getName(), service.getModel(), toscaYamlCsarStatus.getKey(), - toscaYamlCsarStatus.getValue(), true); + toscaYamlCsarStatus.getValue(), true, modelOperation); } public ParsedToscaYamlInfo getParsedToscaYamlInfo(String topologyTemplateYaml, String yamlName, Map nodeTypesInfo, diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfo.java index dc77c6044f..cd73f70cc5 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfo.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfo.java @@ -35,13 +35,13 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; + import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; import org.openecomp.sdc.be.components.impl.ImportUtils; import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum; import org.openecomp.sdc.be.components.impl.ImportUtils.ToscaElementTypeEnum; import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum; -import org.openecomp.sdc.be.model.InterfaceDefinition; import org.openecomp.sdc.be.model.NodeTypeDefinition; import org.openecomp.sdc.be.model.NodeTypeInfo; import org.openecomp.sdc.be.model.NodeTypeMetadata; @@ -49,8 +49,10 @@ import org.openecomp.sdc.be.model.NullNodeTypeMetadata; import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.category.CategoryDefinition; import org.openecomp.sdc.be.model.category.SubCategoryDefinition; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.be.utils.TypeUtils; import org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum; +import org.openecomp.sdc.common.api.Constants; import org.openecomp.sdc.common.log.wrappers.Logger; import org.yaml.snakeyaml.Yaml; @@ -63,12 +65,14 @@ public class ServiceCsarInfo extends CsarInfo { private final Map> mainTemplateImports; private List nodeTypeDefinitions; private final String model; + private final ModelOperation modelOperation; public ServiceCsarInfo(final User modifier, final String csarUUID, final Map csar, final String vfResourceName, final String model, - final String mainTemplateName, final String mainTemplateContent, final boolean isUpdate) { + final String mainTemplateName, final String mainTemplateContent, final boolean isUpdate, final ModelOperation modelOperation) { super(modifier, csarUUID, csar, vfResourceName, mainTemplateName, mainTemplateContent, isUpdate); this.model = model; + this.modelOperation = modelOperation; final Path mainTemplateDir = Paths.get(getMainTemplateName().substring(0, getMainTemplateName().lastIndexOf('/') + 1)); final Collection filesHandled = new HashSet<>(); filesHandled.add(Paths.get(mainTemplateName)); @@ -190,7 +194,7 @@ public class ServiceCsarInfo extends CsarInfo { if (nodeTypeDefinitions == null) { nodeTypeDefinitions = new ArrayList<>(); final Set nodeTypesUsed = getNodeTypesUsedInToscaTemplate(getMappedToscaMainTemplate()); - nodeTypeDefinitions.addAll(getNodeTypeDefinitions(nodeTypesUsed)); + nodeTypeDefinitions.addAll(getNodeTypeDefinitions(nodeTypesUsed).values()); } nodeTypeDefinitions = sortNodeTypesByDependencyOrder(nodeTypeDefinitions); return nodeTypeDefinitions; @@ -226,11 +230,11 @@ public class ServiceCsarInfo extends CsarInfo { return dependencies; } - private Set getNodeTypeDefinitions(final Set nodeTypesToGet) { - final Set foundNodeTypes = getTypes(nodeTypesToGet); - final Set nodeTypesToReturn = new HashSet<>(foundNodeTypes); + private Map getNodeTypeDefinitions(final Set nodeTypesToGet) { + final Map foundNodeTypes = getTypes(nodeTypesToGet); + final Map nodeTypesToReturn = new HashMap<>(foundNodeTypes); final Set recursiveNodeTypesToGet = new HashSet<>(); - foundNodeTypes.forEach(nodeTypeDef -> { + foundNodeTypes.values().forEach(nodeTypeDef -> { Either derivedFromTypeEither = findToscaElement((Map) nodeTypeDef.getMappedNodeType().getValue(), TypeUtils.ToscaTagNamesEnum.DERIVED_FROM, ToscaElementTypeEnum.STRING); @@ -240,25 +244,46 @@ public class ServiceCsarInfo extends CsarInfo { }); recursiveNodeTypesToGet.removeAll(nodeTypesToGet); if (CollectionUtils.isNotEmpty(recursiveNodeTypesToGet)) { - nodeTypesToReturn.addAll(getNodeTypeDefinitions(recursiveNodeTypesToGet)); + nodeTypesToReturn.putAll(getNodeTypeDefinitions(recursiveNodeTypesToGet)); } return nodeTypesToReturn; } - private Set getTypes(final Set nodeTypes) { - Set nodeTypeDefinitionsLocal = new HashSet<>(); - mainTemplateImports.values().forEach(template -> { - final Map types = getTypesFromTemplate(template, ToscaTagNamesEnum.NODE_TYPES, nodeTypes); - if (MapUtils.isNotEmpty(types)) { - types.entrySet().forEach(typesEntry -> { - final NodeTypeMetadata metadata = - getMetaDataFromTemplate(template, typesEntry.getKey()); - nodeTypeDefinitionsLocal.add(new NodeTypeDefinition(typesEntry, metadata)); - }); - } - }); - return nodeTypeDefinitionsLocal; + private Map getTypes(final Set nodeTypes) { + final Map nodeTypeDefinitionsMap = new HashMap<>(); + final Set lowerPrecedenceImports = new HashSet<>(); + + if (model != null && !model.equals(Constants.DEFAULT_MODEL_NAME)) { + final Set modelImports = new HashSet<>(); + modelOperation.findAllModelImports(model, true).forEach(modelImport -> modelImports.add("Definitions/" + modelImport.getFullPath())); + + lowerPrecedenceImports.add("Definitions/" + ModelOperation.ADDITIONAL_TYPE_DEFINITIONS_PATH); + lowerPrecedenceImports.addAll(modelImports); + + mainTemplateImports.entrySet().stream().filter(entry -> modelImports.contains(entry.getKey())) + .forEach(template -> addTypesFromTemplate(nodeTypeDefinitionsMap, template.getValue(), nodeTypes)); + + mainTemplateImports.entrySet().stream().filter(entry -> entry.getKey().equals(ModelOperation.ADDITIONAL_TYPE_DEFINITIONS_PATH.toString())) + .forEach(template -> addTypesFromTemplate(nodeTypeDefinitionsMap, template.getValue(), nodeTypes)); + } + + mainTemplateImports.entrySet().stream().filter(entry -> !lowerPrecedenceImports.contains(entry.getKey())) + .forEach(template -> addTypesFromTemplate(nodeTypeDefinitionsMap, template.getValue(), nodeTypes)); + + return nodeTypeDefinitionsMap; + } + + + private void addTypesFromTemplate(final Map nodeTypeDefinitionsMap, final Map mappedTemplate, + final Set nodeTypes) { + final Map types = getTypesFromTemplate(mappedTemplate, ToscaTagNamesEnum.NODE_TYPES, nodeTypes); + if (MapUtils.isNotEmpty(types)) { + types.entrySet().forEach(typesEntry -> { + final NodeTypeMetadata metadata = getMetaDataFromTemplate(mappedTemplate, typesEntry.getKey()); + nodeTypeDefinitionsMap.put(typesEntry.getKey(), new NodeTypeDefinition(typesEntry, metadata)); + }); + } } @SuppressWarnings("unchecked") diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java index 5c981e3b8b..7822bd8134 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/ResourceImportManagerTest.java @@ -100,6 +100,7 @@ import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.CapabilityTypeOperation; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.be.model.tosca.constraints.GreaterOrEqualConstraint; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.UserBusinessLogic; @@ -770,7 +771,7 @@ class ResourceImportManagerTest { assertNotNull(mainTemplateService); final String mainTemplateContent = new String(mainTemplateService); - return new ServiceCsarInfo(user, csarUuid, csar, vfReousrceName, null, mainTemplateName, mainTemplateContent, false); + return new ServiceCsarInfo(user, csarUuid, csar, vfReousrceName, null, mainTemplateName, mainTemplateContent, false, mock(ModelOperation.class)); } catch (URISyntaxException | ZipException e) { fail(e); } diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogicTest.java index 66c8a51471..fec288a953 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogicTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/CsarBusinessLogicTest.java @@ -60,6 +60,7 @@ import org.openecomp.sdc.be.model.VendorSoftwareProduct; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.CsarOperation; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.common.zip.ZipUtils; import org.openecomp.sdc.common.zip.exception.ZipException; @@ -73,9 +74,10 @@ class CsarBusinessLogicTest extends BaseBusinessLogicMock { private final ComponentsUtils componentsUtils = Mockito.mock(ComponentsUtils.class); private final User user = Mockito.mock(User.class); private final YamlTemplateParsingHandler yamlHandler = Mockito.mock(YamlTemplateParsingHandler.class); + private final ModelOperation modelOperation = Mockito.mock(ModelOperation.class); private final CsarBusinessLogic csarBusinessLogic = new CsarBusinessLogic(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, - interfaceOperation, interfaceLifecycleTypeOperation, yamlHandler, artifactToscaOperation); + interfaceOperation, interfaceLifecycleTypeOperation, yamlHandler, artifactToscaOperation, modelOperation); private static final String CSAR_UUID = "csarUUID"; private static final String CSAR_ENTRY = "Definitions/tosca_mock_vf.yaml"; diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfoTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfoTest.java index a51c406be8..5260aea537 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfoTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/csar/ServiceCsarInfoTest.java @@ -23,6 +23,8 @@ package org.openecomp.sdc.be.components.csar; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.mock; + import java.io.File; import java.net.URISyntaxException; import java.util.Map; @@ -33,6 +35,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.openecomp.sdc.be.config.ConfigurationManager; import org.openecomp.sdc.be.model.User; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.common.impl.ExternalConfiguration; import org.openecomp.sdc.common.impl.FSConfigurationSource; import org.openecomp.sdc.common.zip.ZipUtils; @@ -62,7 +65,7 @@ class ServiceCsarInfoTest { final File csarFile = new File(ServiceCsarInfoTest.class.getClassLoader().getResource(csarFileName).toURI()); final Map payload = ZipUtils.readZip(csarFile, false); String mainTemplateContent = new String(payload.get(mainTemplateName)); - return new ServiceCsarInfo(user, CSAR_UUID, payload, SERVICE_NAME, null, mainTemplateName, mainTemplateContent, true); + return new ServiceCsarInfo(user, CSAR_UUID, payload, SERVICE_NAME, null, mainTemplateName, mainTemplateContent, true, mock(ModelOperation.class)); } @SuppressWarnings("unchecked") diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java index dc8e6176b0..bd61fdbb58 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogicTest.java @@ -117,6 +117,7 @@ import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; import org.openecomp.sdc.be.model.operations.impl.ArtifactTypeOperation; import org.openecomp.sdc.be.model.operations.impl.CapabilityTypeOperation; import org.openecomp.sdc.be.model.operations.impl.GroupTypeOperation; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.servlets.AbstractValidationsServlet; import org.openecomp.sdc.be.tosca.CsarUtils; @@ -2500,7 +2501,7 @@ class ServiceImportBusinessLogicTest extends ServiceImportBussinessLogicBaseTest assertNotNull(mainTemplateService); final String mainTemplateContent = new String(mainTemplateService); - return new ServiceCsarInfo(user, csarUuid, csar, vfReousrceName, null, mainTemplateName, mainTemplateContent, false); + return new ServiceCsarInfo(user, csarUuid, csar, vfReousrceName, null, mainTemplateName, mainTemplateContent, false, mock(ModelOperation.class)); } catch (URISyntaxException | ZipException e) { fail(e); } diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java index 66ba214ae3..4f90947bd2 100644 --- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java +++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ServiceImportParseLogicTest.java @@ -105,6 +105,7 @@ import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation; import org.openecomp.sdc.be.model.operations.api.IElementOperation; import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; +import org.openecomp.sdc.be.model.operations.impl.ModelOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.user.Role; import org.openecomp.sdc.common.api.Constants; @@ -2091,7 +2092,7 @@ class ServiceImportParseLogicTest extends ServiceImportBussinessLogicBaseTestSet assertNotNull(mainTemplateService); final String mainTemplateContent = new String(mainTemplateService); - return new ServiceCsarInfo(user, csarUuid, csar, vfReousrceName, null, mainTemplateName, mainTemplateContent, false); + return new ServiceCsarInfo(user, csarUuid, csar, vfReousrceName, null, mainTemplateName, mainTemplateContent, false, mock(ModelOperation.class)); } catch (URISyntaxException | ZipException e) { fail(e); } 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 785ca41033..3ff3fb0673 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 @@ -75,7 +75,7 @@ import org.yaml.snakeyaml.Yaml; @Component("model-operation") public class ModelOperation { - static final Path ADDITIONAL_TYPE_DEFINITIONS_PATH = Path.of(ADDITIONAL_TYPE_DEFINITIONS); + public static final Path ADDITIONAL_TYPE_DEFINITIONS_PATH = Path.of(ADDITIONAL_TYPE_DEFINITIONS); private static final Logger log = Logger.getLogger(ModelOperation.class); private final JanusGraphGenericDao janusGraphGenericDao; private final JanusGraphDao janusGraphDao; -- cgit 1.2.3-korg