diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-tosca-lib/src')
3 files changed, 180 insertions, 47 deletions
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaFileOutputService.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaFileOutputService.java index 334ff6f567..54f7890888 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaFileOutputService.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/ToscaFileOutputService.java @@ -26,7 +26,7 @@ public interface ToscaFileOutputService { byte[] createOutputFile(ToscaServiceModel toscaServiceModel, FileContentHandler externalArtifacts); - String createMetaFile(String entryDefinitionsFileName); + String createMetaFile(String entryDefinitionsFileName, boolean isAsdPackage); String getArtifactsFolderName(); } diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImpl.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImpl.java index d0df54b105..1fb3858717 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImpl.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImpl.java @@ -15,20 +15,6 @@ */ package org.openecomp.sdc.tosca.services.impl; -import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.CREATED_BY_ENTRY; -import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.CSAR_VERSION_ENTRY; -import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ENTRY_DEFINITIONS; -import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.TOSCA_META_FILE_VERSION_ENTRY; - -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; import org.apache.commons.io.IOUtils; import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; import org.openecomp.core.utilities.file.FileContentHandler; @@ -36,11 +22,28 @@ import org.openecomp.core.utilities.file.FileUtils; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.tosca.csar.AsdPackageHelper; import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; import org.openecomp.sdc.tosca.exceptions.CsarCreationErrorBuilder; import org.openecomp.sdc.tosca.exceptions.CsarMissingEntryPointErrorBuilder; import org.openecomp.sdc.tosca.services.ToscaFileOutputService; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static org.openecomp.sdc.tosca.csar.ManifestTokenType.ENTRY_DEFINITION_TYPE; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.CREATED_BY_ENTRY; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.CSAR_VERSION_ENTRY; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.ENTRY_DEFINITIONS; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryVersion261.TOSCA_META_FILE_VERSION_ENTRY; + public class ToscaFileOutputServiceCsarImpl implements ToscaFileOutputService { static final String EXTERNAL_ARTIFACTS_FOLDER_NAME = "Artifacts"; @@ -56,6 +59,11 @@ public class ToscaFileOutputServiceCsarImpl implements ToscaFileOutputService { private static final String SPACE = " "; private static final String FILE_SEPARATOR = File.separator; private static final Logger logger = LoggerFactory.getLogger(ToscaFileOutputServiceCsarImpl.class); + private final AsdPackageHelper asdPackageHelper; + + public ToscaFileOutputServiceCsarImpl(AsdPackageHelper asdPackageHelper) { + this.asdPackageHelper = asdPackageHelper; + } @Override public byte[] createOutputFile(ToscaServiceModel toscaServiceModel, FileContentHandler externalArtifacts) { @@ -63,13 +71,13 @@ public class ToscaFileOutputServiceCsarImpl implements ToscaFileOutputService { try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(baos))) { packDefinitions(zos, toscaServiceModel.getServiceTemplates()); FileContentHandler artifactFiles = toscaServiceModel.getArtifactFiles(); - if (artifactFiles != null && !artifactFiles.isEmpty()) { - packArtifacts(zos, artifactFiles); - } if (toscaServiceModel.getEntryDefinitionServiceTemplate() == null) { throw new CoreException(new CsarMissingEntryPointErrorBuilder().build()); } - createAndPackToscaMetaFile(zos, toscaServiceModel.getEntryDefinitionServiceTemplate()); + if (artifactFiles != null) { + packArtifacts(zos, artifactFiles); + } + createAndPackToscaMetaFile(zos, toscaServiceModel.getEntryDefinitionServiceTemplate(), isAsdPackage(artifactFiles)); if (externalArtifacts != null) { packExternalArtifacts(zos, externalArtifacts); } @@ -80,11 +88,12 @@ public class ToscaFileOutputServiceCsarImpl implements ToscaFileOutputService { } @Override - public String createMetaFile(String entryDefinitionsFileName) { + public String createMetaFile(String entryDefinitionsFileName, boolean isAsdPackage) { return TOSCA_META_FILE_VERSION_ENTRY.getName() + META_FILE_DELIMITER + SPACE + TOSCA_META_FILE_VERSION_VALUE + System.lineSeparator() + CSAR_VERSION_ENTRY.getName() + META_FILE_DELIMITER + SPACE + CSAR_VERSION_VALUE + System.lineSeparator() + CREATED_BY_ENTRY.getName() + META_FILE_DELIMITER + SPACE + CREATED_BY_VALUE + System.lineSeparator() + ENTRY_DEFINITIONS.getName() + META_FILE_DELIMITER + SPACE - + DEFINITIONS_FOLDER_NAME + FILE_SEPARATOR + entryDefinitionsFileName; + + DEFINITIONS_FOLDER_NAME + FILE_SEPARATOR + entryDefinitionsFileName + + (isAsdPackage ? System.lineSeparator() + ENTRY_DEFINITION_TYPE.getToken() + META_FILE_DELIMITER + SPACE + "asd" : ""); } @Override @@ -92,8 +101,14 @@ public class ToscaFileOutputServiceCsarImpl implements ToscaFileOutputService { return ARTIFACTS_FOLDER_NAME; } - private void createAndPackToscaMetaFile(ZipOutputStream zos, String entryDefinitionsFileName) throws IOException { - String metaFile = createMetaFile(entryDefinitionsFileName); + private boolean isAsdPackage(FileContentHandler artifactFiles){ + + return artifactFiles != null && !artifactFiles.isEmpty() && asdPackageHelper.isAsdPackage(artifactFiles); + + } + + private void createAndPackToscaMetaFile(ZipOutputStream zos, String entryDefinitionsFileName, boolean isAsdPackage) throws IOException { + String metaFile = createMetaFile(entryDefinitionsFileName, isAsdPackage); zos.putNextEntry(new ZipEntry(TOSCA_META_FOLDER_NAME + FILE_SEPARATOR + TOSCA_META_FILE_NAME)); writeBytesToZip(zos, new ByteArrayInputStream(metaFile.getBytes())); } diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImplTest.java b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImplTest.java index df7fa2af97..107d166823 100644 --- a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImplTest.java +++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/services/impl/ToscaFileOutputServiceCsarImplTest.java @@ -20,9 +20,22 @@ package org.openecomp.sdc.tosca.services.impl; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; +import org.openecomp.core.utilities.file.FileContentHandler; +import org.openecomp.sdc.common.errors.CoreException; +import org.openecomp.sdc.tosca.csar.AsdPackageHelper; +import org.openecomp.sdc.tosca.csar.ManifestTokenType; +import org.openecomp.sdc.tosca.csar.ManifestUtils; +import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; +import org.openecomp.sdc.tosca.services.ToscaConstants; +import org.openecomp.sdc.tosca.services.ToscaUtil; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; @@ -32,43 +45,43 @@ import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.MockitoAnnotations; -import org.onap.sdc.tosca.datatypes.model.ServiceTemplate; -import org.openecomp.core.utilities.file.FileContentHandler; -import org.openecomp.sdc.common.errors.CoreException; -import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel; -import org.openecomp.sdc.tosca.services.ToscaConstants; -import org.openecomp.sdc.tosca.services.ToscaUtil; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.openecomp.sdc.tosca.csar.ManifestTokenType.APPLICATION_NAME; +import static org.openecomp.sdc.tosca.csar.ManifestTokenType.APPLICATION_PROVIDER; +import static org.openecomp.sdc.tosca.csar.ManifestTokenType.ATTRIBUTE_VALUE_SEPARATOR; +import static org.openecomp.sdc.tosca.csar.ManifestTokenType.ENTRY_DEFINITION_TYPE; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryAsd.CREATED_BY_ENTRY; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryAsd.CSAR_VERSION_ENTRY; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryAsd.ENTRY_DEFINITIONS; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryAsd.ETSI_ENTRY_MANIFEST; +import static org.openecomp.sdc.tosca.csar.ToscaMetaEntryAsd.TOSCA_META_FILE_VERSION_ENTRY; +import static org.openecomp.sdc.tosca.csar.ToscaMetadataFileInfo.TOSCA_META_PATH_FILE_NAME; public class ToscaFileOutputServiceCsarImplTest { - @InjectMocks - private ToscaFileOutputServiceCsarImpl toscaFileOutputServiceCsarImpl; + private static ToscaFileOutputServiceCsarImpl toscaFileOutputServiceCsarImpl; - @Before - public void init() { - MockitoAnnotations.openMocks(this); + @BeforeAll + public static void setupBeforeClass() { + toscaFileOutputServiceCsarImpl = new ToscaFileOutputServiceCsarImpl(new AsdPackageHelper(new ManifestUtils())); } @Test public void testCreationMetaFile() { - String createdMeta = toscaFileOutputServiceCsarImpl.createMetaFile("entryFile.yaml"); + String createdMeta = toscaFileOutputServiceCsarImpl.createMetaFile("entryFile.yaml", false); String expectedMeta = "TOSCA-Meta-File-Version: 1.0\n" + "CSAR-Version: 1.1\n" + "Created-By: ASDC Onboarding portal\n" + "Entry-Definitions: Definitions" + File.separator + "entryFile.yaml"; - Assert.assertEquals(createdMeta.replaceAll("\\s+", ""), expectedMeta.replaceAll("\\s+", "")); + assertEquals(createdMeta.replaceAll("\\s+", ""), expectedMeta.replaceAll("\\s+", "")); } @Test public void testCSARFileCreationWithExternalArtifacts() throws IOException { ToscaFileOutputServiceCsarImpl toscaFileOutputServiceCSARImpl = - new ToscaFileOutputServiceCsarImpl(); + new ToscaFileOutputServiceCsarImpl(new AsdPackageHelper(new ManifestUtils())); ServiceTemplate mainServiceTemplate = new ServiceTemplate(); Map<String, String> metadata1 = new HashMap<>(); metadata1.put("Template_author", "OPENECOMP"); @@ -140,6 +153,112 @@ public class ToscaFileOutputServiceCsarImplTest { } @Test + public void testAsdCSARFileCreationWithExternalArtifacts() throws IOException { + + ServiceTemplate mainServiceTemplate = new ServiceTemplate(); + Map<String, String> metadata1 = new HashMap<>(); + metadata1.put("Template_author", "OPENECOMP"); + metadata1.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, "ST1"); + metadata1.put("Template_version", "1.0.0"); + metadata1.put("filename", "asd.yaml"); + mainServiceTemplate.setMetadata(metadata1); + mainServiceTemplate.setTosca_definitions_version("tosca_simple_yaml_1_0_0"); + mainServiceTemplate.setDescription("testing desc tosca service template"); + + ServiceTemplate additionalServiceTemplate = new ServiceTemplate(); + Map<String, String> metadata2 = new HashMap<>(); + metadata2.put("Template_author", "OPENECOMP"); + metadata2.put(ToscaConstants.ST_METADATA_TEMPLATE_NAME, "ST2"); + metadata2.put("Template_version", "1.0.0"); + additionalServiceTemplate.setTosca_definitions_version("tosca_simple_yaml_1_0_0"); + additionalServiceTemplate.setDescription("testing desc tosca service template"); + additionalServiceTemplate.setMetadata(metadata2); + + FileContentHandler handler = new FileContentHandler(); + String metaFile = new StringBuilder() + .append(TOSCA_META_FILE_VERSION_ENTRY.getName()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.0").append("\n") + .append(CSAR_VERSION_ENTRY.getName()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" 1.1").append("\n") + .append(CREATED_BY_ENTRY.getName()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append(" Vendor").append("\n") + .append(ENTRY_DEFINITIONS.getName()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append("Definitions/asd.yaml").append("\n") + .append(ETSI_ENTRY_MANIFEST.getName() + ATTRIBUTE_VALUE_SEPARATOR.getToken() + "asd.mf").append("\n").toString(); + handler.addFile(TOSCA_META_PATH_FILE_NAME, metaFile.getBytes(StandardCharsets.UTF_8)); + + Map<String, byte[]> manifestMap = new HashMap<>(); + String manifestContent = new StringBuilder().append("metadata") + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append("\n") + .append(ENTRY_DEFINITION_TYPE.getToken()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append("asd").append("\n") + .append(ManifestTokenType.RELEASE_DATE_TIME.getToken()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append("2021-10-21T11:30:00+05:00").append("\n") + .append(APPLICATION_NAME.getToken()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append("SampleApp").append("\n") + .append(APPLICATION_PROVIDER.getToken()) + .append(ATTRIBUTE_VALUE_SEPARATOR.getToken()).append("MyCompany") + .toString(); + String manifestFile = "asd.mf"; + manifestMap.put(manifestFile, manifestContent.getBytes()); + handler.setFiles(manifestMap); + + Map<String, ServiceTemplate> definitionsInput = new HashMap<>(); + definitionsInput + .put(ToscaUtil.getServiceTemplateFileName(mainServiceTemplate), mainServiceTemplate); + definitionsInput.put(ToscaUtil.getServiceTemplateFileName(additionalServiceTemplate), + additionalServiceTemplate); + + Map<String, byte[]> dummyHeatArtifacts = new HashMap<>(); + String file1Content = "this is file number 1"; + String file2Content = "this is file number 2"; + String file1 = "file1.xml"; + dummyHeatArtifacts.put(file1, file1Content.getBytes()); + String file2 = "file2.yml"; + dummyHeatArtifacts.put(file2, file2Content.getBytes()); + handler.setFiles(dummyHeatArtifacts); + + + FileContentHandler heatFiles = new FileContentHandler(); + heatFiles.setFiles(dummyHeatArtifacts); + heatFiles.addAll(handler); + Map<String, byte[]> licenseArtifacts = new HashMap<>(); + + FileContentHandler licenseArtifactsFiles = new FileContentHandler(); + + licenseArtifacts.put( + ToscaFileOutputServiceCsarImpl.EXTERNAL_ARTIFACTS_FOLDER_NAME + File.separator + + "license-file-1.xml", file1Content.getBytes()); + licenseArtifacts.put( + ToscaFileOutputServiceCsarImpl.EXTERNAL_ARTIFACTS_FOLDER_NAME + File.separator + + "license-file-2.xml", file1Content.getBytes()); + + licenseArtifactsFiles.setFiles(licenseArtifacts); + + byte[] csarFile = toscaFileOutputServiceCsarImpl.createOutputFile( + new ToscaServiceModel(heatFiles, definitionsInput, + ToscaUtil.getServiceTemplateFileName(mainServiceTemplate)), licenseArtifactsFiles); + + File file = File.createTempFile("resultFile", "zip"); + try (FileOutputStream fos = new FileOutputStream(file)) { + fos.write(csarFile); + } + + try (ZipFile zipFile = new ZipFile(file)) { + + Enumeration<? extends ZipEntry> entries = zipFile.entries(); + int count = 0; + while (entries.hasMoreElements()) { + count++; + entries.nextElement(); + } + assertEquals(9, count); + } + + Files.delete(Paths.get(file.getAbsolutePath())); + } + + @Test public void testCSARFileCreation_noArtifacts() throws IOException { ServiceTemplate serviceTemplate = new ServiceTemplate(); Map<String, String> metadata = new HashMap<>(); @@ -171,22 +290,21 @@ public class ToscaFileOutputServiceCsarImplTest { count++; entries.nextElement(); } - Assert.assertEquals(2, count); + assertEquals(2, count); } Files.delete(Paths.get(file.getAbsolutePath())); } - @Test(expected = CoreException.class) + @Test public void testCreateOutputFileEntryDefinitionServiceTemplateIsNull() { ToscaServiceModel toscaServiceModel = new ToscaServiceModel(); toscaServiceModel.setServiceTemplates(Collections.emptyMap()); - - toscaFileOutputServiceCsarImpl.createOutputFile(toscaServiceModel, null); + assertThrows(CoreException.class, () -> toscaFileOutputServiceCsarImpl.createOutputFile(toscaServiceModel, null)); } @Test public void testGetArtifactsFolderName() { - Assert.assertEquals("Artifacts", toscaFileOutputServiceCsarImpl.getArtifactsFolderName()); + assertEquals("Artifacts", toscaFileOutputServiceCsarImpl.getArtifactsFolderName()); } } |