From 38d98f8852f3e1e15300946aef95c65d3fca70b4 Mon Sep 17 00:00:00 2001 From: imamSidero Date: Fri, 2 Sep 2022 15:47:46 +0100 Subject: [PATCH] Import unknown artifact types on Service Import creating non existing artifact types added in the import files on service import Issue-ID: SDC-4153 Signed-off-by: Imam hussain Change-Id: I477cbc76dece828bc9eee96e66cd24a71fc8c2bb --- .../openecomp/sdc/be/components/csar/CsarInfo.java | 3 ++ .../sdc/be/components/csar/OnboardedCsarInfo.java | 14 +++++++++ .../sdc/be/components/csar/ServiceCsarInfo.java | 8 ++++++ .../components/impl/ArtifactTypeImportManager.java | 4 +-- .../impl/ServiceImportBusinessLogic.java | 32 ++++++++++++++++++++- .../impl/ServiceImportBusinessLogicTest.java | 14 +++++++-- .../resources/csars/service-Ser09080002-csar.csar | Bin 64137 -> 63901 bytes .../operations/impl/ArtifactTypeOperation.java | 2 +- .../java/org/openecomp/sdc/be/utils/TypeUtils.java | 2 +- 9 files changed, 72 insertions(+), 7 deletions(-) diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java index 0bc6224273..b845b104fe 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/CsarInfo.java @@ -90,6 +90,7 @@ public abstract class CsarInfo { @Getter private Map createdNodes; protected Map datatypeDefinitions; + protected Map artifacttypeDefinitions; private Map policytypeDefinitions; @@ -178,6 +179,8 @@ public abstract class CsarInfo { */ public abstract Map getDataTypes(); + public abstract Map getArtifactTypes(); + public Map getPolicyTypes() { if (policytypeDefinitions == null) { policytypeDefinitions = new HashMap<>(); diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/OnboardedCsarInfo.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/OnboardedCsarInfo.java index 85f64699d4..8ab05b9bc8 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/OnboardedCsarInfo.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/OnboardedCsarInfo.java @@ -188,6 +188,20 @@ public class OnboardedCsarInfo extends CsarInfo { } } + @Override + public Map getArtifactTypes() { + if (artifacttypeDefinitions == null) { + artifacttypeDefinitions = new HashMap<>(); + for (Map.Entry entry : globalSubstitutes) { + final String yamlFileContents = new String(entry.getValue()); + final Map mappedToscaTemplate = new Yaml().load(yamlFileContents); + artifacttypeDefinitions.putAll(getTypesFromTemplate(mappedToscaTemplate, TypeUtils.ToscaTagNamesEnum.ARTIFACT_TYPES)); + } + artifacttypeDefinitions.putAll(getTypesFromTemplate(mappedToscaMainTemplate, TypeUtils.ToscaTagNamesEnum.ARTIFACT_TYPES)); + } + return artifacttypeDefinitions; + } + @Override public Map getDataTypes() { if (datatypeDefinitions == null) { 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 08f777db1f..4a9fa5eb18 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 @@ -152,6 +152,14 @@ public class ServiceCsarInfo extends CsarInfo { return definitions; } + public Map getArtifactTypes() { + final Map artifactsTypes = new HashMap<>(); + mainTemplateImports.entrySet().stream() + .forEach(entry -> artifactsTypes.putAll(getTypesFromTemplate(entry.getValue(), TypeUtils.ToscaTagNamesEnum.ARTIFACT_TYPES))); + artifactsTypes.putAll(getTypesFromTemplate(getMappedToscaMainTemplate(), TypeUtils.ToscaTagNamesEnum.ARTIFACT_TYPES)); + return artifactsTypes; + } + public List getNodeTypesUsed() { if (nodeTypeDefinitions == null) { nodeTypeDefinitions = new ArrayList<>(); diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactTypeImportManager.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactTypeImportManager.java index 441dfa741a..83e8ae77b6 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactTypeImportManager.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ArtifactTypeImportManager.java @@ -39,7 +39,7 @@ public class ArtifactTypeImportManager { private final ArtifactTypeOperation artifactTypeOperation; private final ComponentsUtils componentsUtils; - private final CommonImportManager commonImportManager;; + private final CommonImportManager commonImportManager; @Autowired public ArtifactTypeImportManager(final ArtifactTypeOperation artifactTypeOperation, final ComponentsUtils componentsUtils, @@ -67,7 +67,7 @@ public class ArtifactTypeImportManager { } private Either, ActionStatus> createArtifactTypeFromYml( - final String artifactTypesYml, final String modelName) { + final String artifactTypesYml, final String modelName) { final Either, ActionStatus> artifactTypes = commonImportManager.createElementTypesFromYml(artifactTypesYml, this::createArtifactTypeDefinition); if (artifactTypes.isLeft()) { diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java index ccf7e5cb73..1e867e66da 100644 --- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceImportBusinessLogic.java @@ -90,6 +90,7 @@ import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType; import org.openecomp.sdc.be.impl.ComponentsUtils; import org.openecomp.sdc.be.info.NodeTypeInfoToUpdateArtifacts; import org.openecomp.sdc.be.model.ArtifactDefinition; +import org.openecomp.sdc.be.model.ArtifactTypeDefinition; import org.openecomp.sdc.be.model.AttributeDefinition; import org.openecomp.sdc.be.model.CapabilityDefinition; import org.openecomp.sdc.be.model.CapabilityRequirementRelationship; @@ -135,6 +136,7 @@ import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter; import org.openecomp.sdc.be.model.operations.StorageException; import org.openecomp.sdc.be.model.operations.api.IGraphLockOperation; 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.UniqueIdBuilder; import org.openecomp.sdc.be.model.tosca.ToscaPropertyType; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; @@ -184,10 +186,12 @@ public class ServiceImportBusinessLogic { private final ResourceImportManager resourceImportManager; private final JanusGraphDao janusGraphDao; private final ArtifactsBusinessLogic artifactsBusinessLogic; + private final ArtifactTypeImportManager artifactTypeImportManager; private final IGraphLockOperation graphLockOperation; private final ToscaFunctionService toscaFunctionService; private final DataTypeBusinessLogic dataTypeBusinessLogic; private ApplicationDataTypeCache applicationDataTypeCache; + private final ArtifactTypeOperation artifactTypeOperation; public ServiceImportBusinessLogic(final GroupBusinessLogic groupBusinessLogic, final ArtifactsBusinessLogic artifactsBusinessLogic, final ComponentsUtils componentsUtils, final ToscaOperationFacade toscaOperationFacade, @@ -198,7 +202,8 @@ public class ServiceImportBusinessLogic { final ServiceImportParseLogic serviceImportParseLogic, final PolicyBusinessLogic policyBusinessLogic, final ResourceImportManager resourceImportManager, final JanusGraphDao janusGraphDao, final IGraphLockOperation graphLockOperation, final ToscaFunctionService toscaFunctionService, - final DataTypeBusinessLogic dataTypeBusinessLogic) { + final DataTypeBusinessLogic dataTypeBusinessLogic, final ArtifactTypeOperation artifactTypeOperation, + ArtifactTypeImportManager artifactTypeImportManager) { this.componentsUtils = componentsUtils; this.toscaOperationFacade = toscaOperationFacade; this.serviceBusinessLogic = serviceBusinessLogic; @@ -216,6 +221,8 @@ public class ServiceImportBusinessLogic { this.graphLockOperation = graphLockOperation; this.toscaFunctionService = toscaFunctionService; this.dataTypeBusinessLogic = dataTypeBusinessLogic; + this.artifactTypeOperation = artifactTypeOperation; + this.artifactTypeImportManager = artifactTypeImportManager; } @Autowired @@ -263,6 +270,12 @@ public class ServiceImportBusinessLogic { applicationDataTypeCache.reload(service.getModel(), UniqueIdBuilder.buildDataTypeUid(service.getModel(), createdOrUpdatedDataType.getKey())); }); } + + final Map artifactTypesToCreate = getArtifactTypesToCreate(service.getModel(), csarInfo); + if (MapUtils.isNotEmpty(artifactTypesToCreate)) { + artifactTypeImportManager.createArtifactTypes(new Yaml().dump(artifactTypesToCreate), service.getModel(),true); + } + final List nodeTypesToCreate = getNodeTypesToCreate(service.getModel(), csarInfo); if (CollectionUtils.isNotEmpty(nodeTypesToCreate)) { createNodeTypes(nodeTypesToCreate, service.getModel(), csarInfo.getModifier()); @@ -302,6 +315,23 @@ public class ServiceImportBusinessLogic { } return dataTypesToCreate; } + + private Map getArtifactTypesToCreate(final String model, final CsarInfo csarInfo) { + final Map artifactTypesToCreate = new HashMap<>(); + final Map artifactTypesMap = csarInfo.getArtifactTypes(); + if (MapUtils.isNotEmpty(artifactTypesMap)) { + for (final Entry artifactTypeEntry : artifactTypesMap.entrySet()) { + final Either result = + artifactTypeOperation.getArtifactTypeByUid(UniqueIdBuilder.buildArtifactTypeUid(model,artifactTypeEntry.getKey())); + if (result.isRight() && StorageOperationStatus.NOT_FOUND.equals(result.right().value())) { + artifactTypesToCreate.put(artifactTypeEntry.getKey(), artifactTypeEntry.getValue()); + log.info("Deploying new artifact type={}, to model={}, from package={}", + artifactTypeEntry.getKey(), model, csarInfo.getCsarUUID()); + } + } + } + return artifactTypesToCreate; + } private boolean hasNewProperties(final Either result, final Map> dataType) { return result.isLeft() && dataType.containsKey("properties") && result.left().value().getProperties() != null 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 a77ef5bd76..6b92c4a3ea 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 @@ -80,6 +80,7 @@ import org.openecomp.sdc.be.externalapi.servlet.ArtifactExternalServlet; import org.openecomp.sdc.be.impl.ServletUtils; import org.openecomp.sdc.be.info.NodeTypeInfoToUpdateArtifacts; import org.openecomp.sdc.be.model.ArtifactDefinition; +import org.openecomp.sdc.be.model.ArtifactTypeDefinition; import org.openecomp.sdc.be.model.AttributeDefinition; import org.openecomp.sdc.be.model.CapabilityDefinition; import org.openecomp.sdc.be.model.Component; @@ -112,6 +113,7 @@ import org.openecomp.sdc.be.model.User; import org.openecomp.sdc.be.model.cache.ApplicationDataTypeCache; import org.openecomp.sdc.be.model.operations.api.ICapabilityTypeOperation; import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus; +import org.openecomp.sdc.be.model.operations.impl.ArtifactTypeOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.servlets.AbstractValidationsServlet; import org.openecomp.sdc.be.tosca.CsarUtils; @@ -134,7 +136,9 @@ class ServiceImportBusinessLogicTest extends ServiceImportBussinessLogicBaseTest private final AbstractValidationsServlet servlet = new ArtifactExternalServlet(userBusinessLogic, componentInstanceBusinessLogic, componentsUtils, servletUtils, resourceImportManager, artifactsBusinessLogic); private final ApplicationDataTypeCache applicationDataTypeCache = mock(ApplicationDataTypeCache.class); + private final ArtifactTypeOperation artifactTypeOperation = mock(ArtifactTypeOperation.class); private final DataTypeBusinessLogic dataTypeBusinessLogic = mock(DataTypeBusinessLogic.class); + private final ArtifactTypeImportManager artifactTypeImportManager = mock(ArtifactTypeImportManager.class); @InjectMocks private ServiceImportBusinessLogic sIBL; @@ -245,8 +249,8 @@ class ServiceImportBusinessLogicTest extends ServiceImportBussinessLogicBaseTest when(applicationDataTypeCache.get(any(), eq("onap.datatypes.ToscaConceptIdentifier.datatype"))).thenReturn(Either.left(typeToBeUpdated)); when(applicationDataTypeCache.get(any(), matches("^((?!(tosca.datatypes.test_|onap.datatypes.ToscaConceptIdentifier)).)*$"))).thenReturn(Either.left(new DataTypeDefinition())); - - + when(artifactTypeOperation.getArtifactTypeByUid(contains("tosca.testartifacts.Name"))).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND)); + when(artifactTypeOperation.getArtifactTypeByUid(contains("tosca.artifacts"))).thenReturn(Either.left(null)); when(toscaOperationFacade.getLatestByToscaResourceName(contains("org.openecomp.resource"), isNull())) .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND)); when(toscaOperationFacade.getLatestByToscaResourceName(contains("tosca.nodes."), isNull())) @@ -277,6 +281,12 @@ class ServiceImportBusinessLogicTest extends ServiceImportBussinessLogicBaseTest assertNotNull(yamlMap.get("tosca.datatypes.test_b")); assertNotNull(yamlMap.get("onap.datatypes.ToscaConceptIdentifier")); + ArgumentCaptor artifactTypes = ArgumentCaptor.forClass(String.class); + verify(artifactTypeImportManager).createArtifactTypes(artifactTypes.capture(),isNull(), anyBoolean()); + Map artifactTypesMap = new Yaml().load(artifactTypes.getValue()); + assertEquals(1, artifactTypesMap.size()); + assertNotNull(artifactTypesMap.get("tosca.testartifacts.Name")); + ArgumentCaptor> nodeTypes = ArgumentCaptor.forClass(Map.class); verify(resourceImportManager).importAllNormativeResource(nodeTypes.capture(), any(), any(), any(), anyBoolean(), anyBoolean()); diff --git a/catalog-be/src/test/resources/csars/service-Ser09080002-csar.csar b/catalog-be/src/test/resources/csars/service-Ser09080002-csar.csar index 00a6981272417da50820be5d0615ca2bce3b9ca2..815b798ec3b13aeaa3ea0803e0f802fcb44fe1e5 100644 GIT binary patch delta 2121 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 diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ArtifactTypeOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ArtifactTypeOperation.java index 8dfea30340..35ea9acd12 100644 --- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ArtifactTypeOperation.java +++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/ArtifactTypeOperation.java @@ -296,7 +296,7 @@ public class ArtifactTypeOperation extends AbstractOperation implements IArtifac return result; } - private Either getArtifactTypeByUid(String uniqueId) { + public Either getArtifactTypeByUid(String uniqueId) { LOGGER.debug("#getArtifactTypeByUid - fetching artifact type with id {}", uniqueId); return janusGraphGenericDao.getNode(UniqueIdBuilder.getKeyByNodeType(NodeTypeEnum.ArtifactType), uniqueId, ArtifactTypeData.class).right() .map(DaoStatusConverter::convertJanusGraphStatusToStorageStatus).left() diff --git a/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java b/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java index cfbb6db76d..ca349514f3 100644 --- a/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java +++ b/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java @@ -60,7 +60,7 @@ public class TypeUtils { REQUIREMENTS("requirements"), NODE("node"), RELATIONSHIP("relationship"), CAPABILITY("capability"), INTERFACES("interfaces"), NODE_FILTER("node_filter"), TOSCA_ID("tosca_id"), // Artifacts - ARTIFACTS("artifacts"), FILE("file"), + ARTIFACTS("artifacts"), ARTIFACT_TYPES("artifact_types"), FILE("file"), // Heat env Validation PARAMETERS("parameters"), // Import Validations -- 2.16.6