diff options
author | Maciej Malewski <maciej.malewski@nokia.com> | 2020-07-13 12:22:05 +0200 |
---|---|---|
committer | Bogumil Zebek <bogumil.zebek@nokia.com> | 2020-07-13 11:16:08 +0000 |
commit | 89e3a96553b1607fa7ab3ee9dd69150be3a75a81 (patch) | |
tree | 262ab9c3d0fc6e1c3fda74be3cc03221f1f98bbb | |
parent | acc4f065bea5608a4e812f6126c102abe8206748 (diff) |
Fix validation process
Rule must check if files defined in a manifest file are available in a csar artifact.
Code created by Bogumil Zebek.
Issue-ID: VNFSDK-583
Signed-off-by: Maciej Malewski <maciej.malewski@nokia.com>
Change-Id: I890a67bb8f62af306825f2c7d150baffac385671
3 files changed, 81 insertions, 13 deletions
diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123.java b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123.java index 69563b0..a7c5737 100644 --- a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123.java +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123.java @@ -26,6 +26,7 @@ import org.onap.cvc.csar.parser.SourcesParser; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -46,30 +47,78 @@ public class VTPValidateCSARR01123 extends VTPValidateCSARBase { CSARErrorNotAllFilesLocatedInCSARWhereListedInManifest(List<String> fileInCsarThatAreNotLocatedInManifest) { super("Source", CSARArchive.TOSCA_METADATA); - this.setCode("0x1000"); - this.message = "files: " + this.setCode("0x1001"); + this.message = "file(s): [" + String.join(", ", fileInCsarThatAreNotLocatedInManifest) - + " are located in CSAR, but are not located in Manifest as Source"; + + "] available in CSAR, but cannot be found in Manifest as Source"; + } + } + + public static class CSARErrorNotAllFilesLocatedInManifestWhereListedInCsar extends CSARErrorEntryMissing { + CSARErrorNotAllFilesLocatedInManifestWhereListedInCsar(List<String> fileInCsarThatAreNotLocatedInManifest) { + super("Source", + CSARArchive.TOSCA_METADATA); + this.setCode("0x1002"); + this.message = "file(s): [" + + String.join(", ", fileInCsarThatAreNotLocatedInManifest) + + "] defined in Manifest as Source, but cannot be found in CSAR"; } } @Override protected void validateCSAR(CSARArchive csar) throws Exception { + verifyThatProviderDataAreDefined(csar); + verifyPackageFileStructure(csar); + } + + private void verifyPackageFileStructure(CSARArchive csar) throws IOException { + Path rootFolder = getRootFolder(csar); + List<String> filesInCsar = getAllFilesInDirectory(rootFolder); + List<String> sourcesInManifest = getAllFilesFromManifestSources(csar.getManifest()); + + if (areAllFilesDefinedInManifest(filesInCsar, sourcesInManifest)) { + verifyThatAllFilesFromCsarAreDefinedInManifest(filesInCsar, sourcesInManifest); + verifyThatAllFilesDefinedInManifestAreAvailableInCsar(sourcesInManifest, filesInCsar); + } + } + + private void verifyThatProviderDataAreDefined(CSARArchive csar) { if (csar.getVendorName() == null || csar.getVersion() == null) { errors.add(new CSARErrorEntryVNFProviderDetailsNotFound()); } - Path rootFolder = csar.getWorkspace().getPathToCsarFolder() - .orElseThrow(() -> new IOException("Couldn't find CSAR root catalog")); - List<String> filesInCsar = getAllFilesInDirectory(rootFolder); - List<String> sourcesInManifest = getAllFilesFromManifestSources(csar.getManifest()); + } - if (filesInCsar.size() != sourcesInManifest.size() || !sourcesInManifest.containsAll(filesInCsar)) { - filesInCsar.removeAll(sourcesInManifest); - errors.add(new VTPValidateCSARR01123.CSARErrorNotAllFilesLocatedInCSARWhereListedInManifest(filesInCsar)); + private Path getRootFolder(CSARArchive csar) throws IOException { + return csar.getWorkspace().getPathToCsarFolder() + .orElseThrow(() -> new IOException("Couldn't find CSAR root catalog")); + } + + + private void verifyThatAllFilesDefinedInManifestAreAvailableInCsar(List<String> sourcesInManifest, List<String> filesInCsar) { + if(!filesInCsar.containsAll(sourcesInManifest)){ + List<String> sourcesNotAvailableInCsarFile = fetchElementsNotAvailableAtSecondList(sourcesInManifest, filesInCsar); + errors.add(new CSARErrorNotAllFilesLocatedInManifestWhereListedInCsar(sourcesNotAvailableInCsarFile)); } } + private void verifyThatAllFilesFromCsarAreDefinedInManifest(List<String> filesInCsar, List<String> sourcesInManifest) { + if(!sourcesInManifest.containsAll(filesInCsar) ){ + List<String> filesNotDefinedInManifestFile = fetchElementsNotAvailableAtSecondList(filesInCsar, sourcesInManifest); + errors.add(new CSARErrorNotAllFilesLocatedInCSARWhereListedInManifest(filesNotDefinedInManifestFile)); + } + } + + private List<String> fetchElementsNotAvailableAtSecondList(List<String> firstList, List<String> secondList) { + List<String> copyOfFirstList = new ArrayList<>(firstList); + copyOfFirstList.removeAll(secondList); + return copyOfFirstList; + } + + private boolean areAllFilesDefinedInManifest(List<String> filesInCsar, List<String> sourcesInManifest) { + return filesInCsar.size() != sourcesInManifest.size(); + } + private List<String> getAllFilesFromManifestSources(CSARArchive.Manifest manifest) { return manifest.getSources() .stream() diff --git a/csarvalidation/src/test/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123IntegrationTest.java b/csarvalidation/src/test/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123IntegrationTest.java index d08e00c..a3112ce 100644 --- a/csarvalidation/src/test/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123IntegrationTest.java +++ b/csarvalidation/src/test/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR01123IntegrationTest.java @@ -67,7 +67,7 @@ public class VTPValidateCSARR01123IntegrationTest { } @Test - public void shouldReportThatFileIsNotPresentInSources() throws Exception { + public void shouldReportThatFileAvailableInCsarIsNotPresentInManifestSources() throws Exception { // given configureTestCase(testCase, TEST_CSAR_DIRECTORY + "csar-option1-invalid-noFileInManifest.csar", "vtp-validate-csar-r01123.yaml", IS_PNF); @@ -89,6 +89,25 @@ public class VTPValidateCSARR01123IntegrationTest { } @Test + public void shouldReportThatFilePresentInManifestIsNotPresentInCsarFile() throws Exception { + // given + configureTestCase(testCase, TEST_CSAR_DIRECTORY + "csar-option1-invalid-missing-files.csar", "vtp-validate-csar-r01123.yaml", IS_PNF); + + // when + testCase.execute(); + + Condition<String> containingMissingFiles = new HamcrestCondition<>(allOf( + containsString("Definitions/a.yaml"), + containsString("Definitions/b.yaml") + )); + + // then + List<CSARArchive.CSARError> errors = testCase.getErrors(); + assertThat(errors.size()).isEqualTo(1); + assertThat(convertToMessagesList(errors)).haveExactly(1, containingMissingFiles); + } + + @Test public void shouldReportThatVendorNameIsMissingAndThatFileIsNotPresentInSource() throws Exception { // given configureTestCase(testCase, TEST_CSAR_DIRECTORY + "csar-option1-invalid-noVendor-noFileInManifest.csar", "vtp-validate-csar-r01123.yaml", IS_PNF); @@ -120,7 +139,7 @@ public class VTPValidateCSARR01123IntegrationTest { // then List<CSARArchive.CSARError> errors = testCase.getErrors(); - assertThat(errors.size()).isEqualTo(0); + assertThat(errors.size()).isZero(); } @Test @@ -133,7 +152,7 @@ public class VTPValidateCSARR01123IntegrationTest { // then List<CSARArchive.CSARError> errors = testCase.getErrors(); - assertThat(errors.size()).isEqualTo(0); + assertThat(errors.size()).isZero(); } @Test diff --git a/csarvalidation/src/test/resources/pnf/r01123/csar-option1-invalid-missing-files.csar b/csarvalidation/src/test/resources/pnf/r01123/csar-option1-invalid-missing-files.csar Binary files differnew file mode 100644 index 0000000..bab095d --- /dev/null +++ b/csarvalidation/src/test/resources/pnf/r01123/csar-option1-invalid-missing-files.csar |