Load model default imports during CSAR Generation 96/123396/7
authorKrupaNagabhushan <krupa.nagabhushan@est.tech>
Thu, 19 Aug 2021 10:17:36 +0000 (11:17 +0100)
committerMichael Morris <michael.morris@est.tech>
Mon, 23 Aug 2021 14:32:23 +0000 (14:32 +0000)
Issue-ID: SDC-3674
Signed-off-by: KrupaNagabhushan <krupa.nagabhushan@est.tech>
Change-Id: I89dc555a2a90f1ac44b44655e36a75a79ac38bd0

catalog-be/src/main/docker/backend/chef-repo/cookbooks/sdc-catalog-be/files/default/error-configuration.yaml
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CsarUtils.java
catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java

index cbbd5ee..8f5b2b6 100644 (file)
@@ -2545,3 +2545,10 @@ errors:
         messageId: "SVC4153"
     }
 
+    #-----------SVC4154---------------------------
+    CSAR_TOSCA_IMPORTS_ERROR: {
+        code: 500,
+        message: "Error: An error has occurred while including the default TOSCA imports in the CSAR",
+        messageId: "SVC4154"
+    }
+
index 3756ac5..823ddc4 100644 (file)
@@ -31,6 +31,7 @@ import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -76,6 +77,8 @@ import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
 import org.openecomp.sdc.be.dao.cassandra.SdcSchemaFilesCassandraDao;
+import org.openecomp.sdc.be.dao.cassandra.ToscaModelImportCassandraDao;
+import org.openecomp.sdc.be.data.model.ToscaImportByModel;
 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
@@ -169,6 +172,8 @@ public class CsarUtils {
     private ToscaExportHandler toscaExportUtils;
     @Autowired(required = false)
     private List<CsarEntryGenerator> generators;
+    @Autowired(required = false)
+    private ToscaModelImportCassandraDao toscaModelImportCassandraDao;
     private String versionFirstThreeOctets;
 
     public CsarUtils() {
@@ -426,16 +431,21 @@ public class CsarUtils {
         if (zipOutputStreamOrResponseFormat != null && zipOutputStreamOrResponseFormat.isRight()) {
             return zipOutputStreamOrResponseFormat;
         }
-        //retrieve SDC.zip from Cassandra
-        Either<byte[], ResponseFormat> latestSchemaFilesFromCassandra = getLatestSchemaFilesFromCassandra();
-        if (latestSchemaFilesFromCassandra.isRight()) {
-            log.error("Error retrieving SDC Schema files from cassandra");
-            return Either.right(latestSchemaFilesFromCassandra.right().value());
+        if (component.getModel() == null) {
+            //retrieve SDC.zip from Cassandra
+            Either<byte[], ResponseFormat> latestSchemaFiles = getLatestSchemaFilesFromCassandra();
+            if (latestSchemaFiles.isRight()) {
+                log.error("Error retrieving SDC Schema files from cassandra");
+                return Either.right(latestSchemaFiles.right().value());
+            }
+            final byte[] schemaFileZip = latestSchemaFiles.left().value();
+            final List<String> nodesFromPackage = findNonRootNodesFromPackage(dependencies);
+            //add files from retrieved SDC.zip to Definitions folder in CSAR
+            addSchemaFilesFromCassandra(zip, schemaFileZip, nodesFromPackage);
+        } else {
+            //retrieve schema files by model from Cassandra
+            addSchemaFilesByModel(zip, component.getModel());
         }
-        final byte[] schemaFileZip = latestSchemaFilesFromCassandra.left().value();
-        final List<String> nodesFromPackage = findNonRootNodesFromPackage(dependencies);
-        //add files from retrieved SDC.zip to Definitions folder in CSAR
-        addSchemaFilesFromCassandra(zip, schemaFileZip, nodesFromPackage);
         Either<CsarDefinition, ResponseFormat> collectedComponentCsarDefinition = collectComponentCsarDefinition(component);
         if (collectedComponentCsarDefinition.isRight()) {
             return Either.right(collectedComponentCsarDefinition.right().value());
@@ -799,6 +809,22 @@ public class CsarUtils {
             .bind(iff(List::isEmpty, () -> schemaFileFetchError(fto), s -> Either.left(s.iterator().next().getPayloadAsArray())));
     }
 
+    private void addSchemaFilesByModel(final ZipOutputStream zipOutputStream, final String model) {
+        try {
+            final List<ToscaImportByModel> schemaImportsByModel = toscaModelImportCassandraDao.findAllByModel(model);
+            for (ToscaImportByModel toscaImportByModel : schemaImportsByModel) {
+                final ZipEntry zipEntry = new ZipEntry(DEFINITIONS_PATH + toscaImportByModel.getFullPath());
+                zipOutputStream.putNextEntry(zipEntry);
+                final byte[] content = toscaImportByModel.getContent().getBytes(StandardCharsets.UTF_8);
+                zipOutputStream.write(content, 0, content.length);
+                zipOutputStream.closeEntry();
+            }
+        } catch (IOException e) {
+            log.error("Error while writing the schema files by model to the CSAR " + "{}", e);
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.CSAR_TOSCA_IMPORTS_ERROR));
+        }
+    }
+
     private F<CassandraOperationStatus, ResponseFormat> schemaFilesFetchDBError(String firstThreeOctets) {
         return cos -> {
             log.debug("Failed to get the schema files SDC-Version: {} Conformance-Level {}. Please fix DB table accordingly.", firstThreeOctets,
index 8b8c315..b70d676 100644 (file)
@@ -47,6 +47,7 @@ import java.util.stream.Collectors;
 import lombok.NoArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.ImmutableTriple;
@@ -55,7 +56,9 @@ import org.onap.sdc.tosca.services.YamlUtil;
 import org.openecomp.sdc.be.components.impl.exceptions.SdcResourceNotFoundException;
 import org.openecomp.sdc.be.config.Configuration;
 import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.cassandra.ToscaModelImportCassandraDao;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.data.model.ToscaImportByModel;
 import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
@@ -168,6 +171,7 @@ public class ToscaExportHandler {
     private OutputConverter outputConverter;
     private InterfaceLifecycleOperation interfaceLifecycleOperation;
     private InterfacesOperationsConverter interfacesOperationsConverter;
+    private ToscaModelImportCassandraDao toscaModelImportCassandraDao;
 
     @Autowired
     public ToscaExportHandler(final ApplicationDataTypeCache applicationDataTypeCache,
@@ -180,7 +184,8 @@ public class ToscaExportHandler {
                               final InputConverter inputConverter,
                               final OutputConverter outputConverter,
                               final InterfaceLifecycleOperation interfaceLifecycleOperation,
-                              final InterfacesOperationsConverter interfacesOperationsConverter) {
+                              final InterfacesOperationsConverter interfacesOperationsConverter,
+                              final ToscaModelImportCassandraDao toscaModelImportCassandraDao) {
         this.applicationDataTypeCache = applicationDataTypeCache;
         this.toscaOperationFacade = toscaOperationFacade;
         this.capabilityRequirementConverter = capabilityRequirementConverter;
@@ -192,6 +197,7 @@ public class ToscaExportHandler {
         this.outputConverter = outputConverter;
         this.interfaceLifecycleOperation = interfaceLifecycleOperation;
         this.interfacesOperationsConverter = interfacesOperationsConverter;
+        this.toscaModelImportCassandraDao = toscaModelImportCassandraDao;
     }
 
     public static String getInterfaceFilename(String artifactName) {
@@ -211,7 +217,7 @@ public class ToscaExportHandler {
     }
 
     public Either<ToscaRepresentation, ToscaError> exportComponentInterface(final Component component, final boolean isAssociatedComponent) {
-        final List<Map<String, Map<String, String>>> imports = new ArrayList<>(getDefaultToscaImportConfig());
+        final List<Map<String, Map<String, String>>> imports = new ArrayList<>(getDefaultToscaImports(component.getModel()));
         if (CollectionUtils.isEmpty(imports)) {
             log.debug(FAILED_TO_GET_DEFAULT_IMPORTS_CONFIGURATION);
             return Either.right(ToscaError.GENERAL_ERROR);
@@ -274,7 +280,7 @@ public class ToscaExportHandler {
     }
 
     public Either<ToscaTemplate, ToscaError> convertToToscaTemplate(final Component component) {
-        final List<Map<String, Map<String, String>>> defaultToscaImportConfig = getDefaultToscaImportConfig();
+        final List<Map<String, Map<String, String>>> defaultToscaImportConfig = getDefaultToscaImports(component.getModel());
         if (CollectionUtils.isEmpty(defaultToscaImportConfig)) {
             log.debug(FAILED_TO_GET_DEFAULT_IMPORTS_CONFIGURATION);
             return Either.right(ToscaError.GENERAL_ERROR);
@@ -297,6 +303,19 @@ public class ToscaExportHandler {
         }
     }
 
+    public List<Map<String, Map<String, String>>> getDefaultToscaImports(final String model) {
+        if (model == null) {
+            return getDefaultToscaImportConfig();
+        }
+        final List<ToscaImportByModel> importsByModel = toscaModelImportCassandraDao.findAllByModel(model);
+        final List<Map<String, Map<String, String>>> importList = new ArrayList<>();
+        for(ToscaImportByModel toscaImportByModel: importsByModel) {
+            final String fileName = FilenameUtils.getBaseName(toscaImportByModel.getFullPath());
+            importList.add(Map.of(fileName, Map.of("file", toscaImportByModel.getFullPath())));
+        }
+        return importList;
+    }
+
     private Either<ToscaTemplate, ToscaError> convertToscaTemplate(Component component, ToscaTemplate toscaNode) {
         Either<ImmutablePair<ToscaTemplate, Map<String, Component>>, ToscaError> importsRes = fillImports(component, toscaNode);
         if (importsRes.isRight()) {
@@ -508,7 +527,7 @@ public class ToscaExportHandler {
     }
 
     private Either<ImmutablePair<ToscaTemplate, Map<String, Component>>, ToscaError> fillImports(Component component, ToscaTemplate toscaTemplate) {
-        final List<Map<String, Map<String, String>>> defaultToscaImportConfig = getDefaultToscaImportConfig();
+        final List<Map<String, Map<String, String>>> defaultToscaImportConfig = getDefaultToscaImports(component.getModel());
         if (CollectionUtils.isEmpty(defaultToscaImportConfig)) {
             log.debug(FAILED_TO_GET_DEFAULT_IMPORTS_CONFIGURATION);
             return Either.right(ToscaError.GENERAL_ERROR);
index 771d52f..074d70b 100644 (file)
@@ -123,7 +123,7 @@ class InterfacesOperationsConverterTest {
             addInterfaceTypeElement(component, new ArrayList<>());
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate("test");
         template.setInterface_types(interfaceTypeElement);
         final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
@@ -151,7 +151,7 @@ class InterfacesOperationsConverterTest {
             addInterfaceTypeElement(component, new ArrayList<>());
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate("testService");
         template.setInterface_types(interfaceTypeElement);
         final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
@@ -177,7 +177,7 @@ class InterfacesOperationsConverterTest {
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate(NODE_TYPE_NAME);
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put(NODE_TYPE_NAME, nodeType);
@@ -207,7 +207,7 @@ class InterfacesOperationsConverterTest {
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate("testService");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put(NODE_TYPE_NAME, nodeType);
@@ -266,7 +266,7 @@ class InterfacesOperationsConverterTest {
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, null, false);
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate("test");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put("test", nodeType);
@@ -300,7 +300,7 @@ class InterfacesOperationsConverterTest {
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate("test");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put("test", nodeType);
@@ -349,7 +349,7 @@ class InterfacesOperationsConverterTest {
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
         ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         ToscaTemplate template = new ToscaTemplate("test");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put("test", nodeType);
@@ -384,7 +384,7 @@ class InterfacesOperationsConverterTest {
         final ToscaNodeType nodeType = new ToscaNodeType();
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
         final ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null, null,
-            interfacesOperationsConverter);
+            interfacesOperationsConverter, null);
         final ToscaTemplate template = new ToscaTemplate("testService");
         final Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put(NODE_TYPE_NAME, nodeType);
index 731ff63..6374be1 100644 (file)
@@ -121,5 +121,7 @@ public enum ActionStatus {
     //Requirement related
     REQUIREMENT_NOT_FOUND, REQUIREMENT_NAME_MANDATORY, REQUIREMENT_CAPABILITY_MANDATORY, REQUIREMENT_NAME_ALREADY_IN_USE, REQUIREMENT_DELETION_NOT_ALLOWED_USED_IN_COMPOSITION, REQUIREMENT_UPDATE_NOT_ALLOWED_USED_IN_COMPOSITION, INVALID_REQUIREMENT_NAME,
     //Abstract template related
-    ABSTRACT, NORMAL
+    ABSTRACT, NORMAL,
+    //including default imports in CSAR related
+    CSAR_TOSCA_IMPORTS_ERROR
 }