From 5873269dcf426377a037e28a0b16bd18af582a7e Mon Sep 17 00:00:00 2001 From: Bogumil Zebek Date: Tue, 19 Mar 2019 09:59:02 +0100 Subject: PNF TC R293901 Change-Id: I6acfa94ce0fac2b3c46688601c3ec553af4c8b66 Issue-ID: VNFSDK-386 Signed-off-by: Zebek Bogumil --- .../main/java/org/onap/cvc/csar/CSARArchive.java | 53 ++++++++++++-------- .../main/java/org/onap/cvc/csar/PnfCSARError.java | 47 ++++++++++++++++++ .../java/org/onap/cvc/csar/PnfManifestParser.java | 31 ++---------- .../org/onap/cvc/csar/cc/VTPValidateCSARBase.java | 10 ++-- .../onap/cvc/csar/cc/VTPValidatePnfCSARBase.java | 33 ++++++++++++ .../cvc/csar/cc/sol004/VTPValidateCSARR293901.java | 58 ++++++++++++++++++++++ 6 files changed, 181 insertions(+), 51 deletions(-) create mode 100644 csarvalidation/src/main/java/org/onap/cvc/csar/PnfCSARError.java create mode 100644 csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidatePnfCSARBase.java create mode 100644 csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR293901.java (limited to 'csarvalidation/src/main/java') diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/CSARArchive.java b/csarvalidation/src/main/java/org/onap/cvc/csar/CSARArchive.java index 24cef0e..c7792ae 100644 --- a/csarvalidation/src/main/java/org/onap/cvc/csar/CSARArchive.java +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/CSARArchive.java @@ -29,12 +29,11 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.apache.commons.io.FileUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; import com.fasterxml.jackson.core.JsonProcessingException; @@ -46,8 +45,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Kanagaraj Manickam kanagaraj.manickam@huawei.com * */ -public class CSARArchive { - private static final Logger LOG = LoggerFactory.getLogger(CSARArchive.class); +public class CSARArchive implements AutoCloseable { public static final String SOL0004_2_4_1 = "V2.4.1 (2018-02)"; @@ -870,33 +868,37 @@ public class CSARArchive { return errors; } - private void unzip(String csarPath) throws IOException { + private void unzip(String csarPath, Path destination) throws IOException { File csarFile = new File(csarPath); if (!csarFile.exists()) { throw new RuntimeException(csarPath + " does not exist"); } - try (ZipInputStream csar = new ZipInputStream(new BufferedInputStream(new FileInputStream(csarFile)))){ + try (ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(csarFile)))){ + ZipEntry entry; - byte[] buffer = new byte[2048]; - while ((entry = csar.getNextEntry()) != null) { + while ((entry = zipInputStream.getNextEntry()) != null) { - File filePath = new File(this.tempDir + File.separator + entry.getName()); + File filePath = new File(destination + File.separator + entry.getName()); - if (!filePath.getParentFile().isDirectory()) { - filePath.getParentFile().delete(); + if(entry.isDirectory()){ + filePath.mkdirs(); + } else { + extract(zipInputStream, filePath); } - filePath.getParentFile().mkdirs(); + } + } + } - try (FileOutputStream fos = new FileOutputStream(filePath); - BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length)) { + private void extract(ZipInputStream csar, File filePath) throws IOException { + byte[] buffer = new byte[2048]; + try (FileOutputStream fos = new FileOutputStream(filePath); + BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length)) { - int len; - while ((len = csar.read(buffer)) > 0) { - bos.write(buffer, 0, len); - } - } + int len; + while ((len = csar.read(buffer)) > 0) { + bos.write(buffer, 0, len); } } } @@ -984,6 +986,10 @@ public class CSARArchive { } private void parseDefinitionMetadata() throws IOException { + if(Objects.isNull(this.definitionYamlFile)){ + return; + } + try(FileInputStream ipStream = new FileInputStream(this.definitionYamlFile)) { Map yaml = (Map) new Yaml().load(ipStream); @@ -1295,7 +1301,7 @@ public class CSARArchive { this.tempDir = Paths.get(TEMP_DIR + File.separator + System.currentTimeMillis()); this.tempDir.toFile().mkdirs(); - this.unzip(csarPath); + this.unzip(csarPath, this.tempDir); } public void parse() throws IOException { //Find out the mode of CSAR @@ -1319,4 +1325,11 @@ public class CSARArchive { public File getFileFromCsar(String path) { return new File(this.tempDir.toFile().getAbsolutePath() + File.separator + path); } + + @Override + public void close() throws Exception { + if(this.tempDir != null){ + cleanup(); + } + } } diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/PnfCSARError.java b/csarvalidation/src/main/java/org/onap/cvc/csar/PnfCSARError.java new file mode 100644 index 0000000..56e524f --- /dev/null +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/PnfCSARError.java @@ -0,0 +1,47 @@ +/* + * Copyright 2019 Nokia + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.onap.cvc.csar; + +public class PnfCSARError extends CSARArchive.CSARError { + public PnfCSARError(String errorCode, String message, int lineNumber, String file) { + super(errorCode); + this.message = message; + this.file = file; + this.lineNumber = lineNumber; + } + + public static class PnfCSARErrorInvalidEntry extends PnfCSARError { + public PnfCSARErrorInvalidEntry(String entry, String file, int lineNumber) { + super("0x2000", "Invalid. Entry [" + entry + "]", lineNumber, file); + } + } + + public static class PnfCSARErrorWarning extends PnfCSARError { + public PnfCSARErrorWarning(String entry, String file, int lineNumber) { + super("0x2001", "Warning. Entry [" + entry + "]", lineNumber, file); + } + } + + public static class PnfCSARErrorEntryMissing extends PnfCSARError { + public PnfCSARErrorEntryMissing(String entry, String file, int lineNumber) { + super("0x2002", "Missing. Entry [" + entry + "]", lineNumber, file); + } + } +} + + diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/PnfManifestParser.java b/csarvalidation/src/main/java/org/onap/cvc/csar/PnfManifestParser.java index 5694049..ea52841 100644 --- a/csarvalidation/src/main/java/org/onap/cvc/csar/PnfManifestParser.java +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/PnfManifestParser.java @@ -17,6 +17,9 @@ package org.onap.cvc.csar; import com.google.common.collect.Lists; import org.apache.commons.lang3.tuple.Pair; +import org.onap.cvc.csar.PnfCSARError.PnfCSARErrorEntryMissing; +import org.onap.cvc.csar.PnfCSARError.PnfCSARErrorInvalidEntry; +import org.onap.cvc.csar.PnfCSARError.PnfCSARErrorWarning; import java.io.IOException; import java.nio.file.Files; @@ -192,32 +195,4 @@ class PnfManifestParser { } - - private static class PnfCSARError extends CSARArchive.CSARError { - PnfCSARError(String errorCode, String message, int lineNumber, String file) { - super(errorCode); - this.message = message; - this.file = file; - this.lineNumber = lineNumber; - } - } - - private static class PnfCSARErrorInvalidEntry extends PnfCSARError { - PnfCSARErrorInvalidEntry(String entry, String file, int lineNumber) { - super("0x2000", "Invalid. Entry [" + entry + "]", lineNumber, file); - } - } - - private static class PnfCSARErrorWarning extends PnfCSARError { - PnfCSARErrorWarning(String entry, String file, int lineNumber) { - super("0x2001", "Warning. Entry [" + entry + "]", lineNumber, file); - } - } - - private static class PnfCSARErrorEntryMissing extends PnfCSARError { - PnfCSARErrorEntryMissing(String entry, String file, int lineNumber) { - super("0x2002", "Missing. Entry [" + entry + "]", lineNumber, file); - } - } - } diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidateCSARBase.java b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidateCSARBase.java index d07884d..d879ff3 100644 --- a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidateCSARBase.java +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidateCSARBase.java @@ -42,14 +42,14 @@ public abstract class VTPValidateCSARBase extends OnapCommand { String path = (String) getParametersMap().get("csar").getValue(); //execute - try { - CSARArchive csar = new CSARArchive(); + try (CSARArchive csar = this.createArchiveInstance()){ csar.init(path); csar.parse(); + errors.addAll(csar.getErrors()); + this.validateCSAR(csar); - csar.cleanup(); } catch (Exception e) { LOG.error(this.getVnfReqsNo() + ": Failed to validate CSAR" , e); throw new OnapCommandExecutionFailed(e.getMessage()); @@ -65,4 +65,8 @@ public abstract class VTPValidateCSARBase extends OnapCommand { this.getResult().setOutput(this.errors); } + + protected CSARArchive createArchiveInstance(){ + return new CSARArchive(); + } } diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidatePnfCSARBase.java b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidatePnfCSARBase.java new file mode 100644 index 0000000..2effffd --- /dev/null +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/VTPValidatePnfCSARBase.java @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Nokia + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.onap.cvc.csar.cc; + +import org.onap.cvc.csar.CSARArchive; +import org.onap.cvc.csar.PnfCSARArchive; + +import java.util.List; + +public abstract class VTPValidatePnfCSARBase extends VTPValidateCSARBase { + protected CSARArchive createArchiveInstance(){ + return new PnfCSARArchive(); + } + + public List getErrors(){ + return this.errors; + } +} diff --git a/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR293901.java b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR293901.java new file mode 100644 index 0000000..09edc34 --- /dev/null +++ b/csarvalidation/src/main/java/org/onap/cvc/csar/cc/sol004/VTPValidateCSARR293901.java @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Nokia + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.onap.cvc.csar.cc.sol004; + + +import org.onap.cli.fw.schema.OnapCommandSchema; +import org.onap.cvc.csar.CSARArchive; +import org.onap.cvc.csar.PnfCSARError.PnfCSARErrorEntryMissing; +import org.onap.cvc.csar.cc.VTPValidatePnfCSARBase; + +import java.util.Objects; + +@OnapCommandSchema(schema = "vtp-validate-csar-r293901.yaml") +public class VTPValidateCSARR293901 extends VTPValidatePnfCSARBase { + + private static final int UNKNOWN_LINE_NUMBER = -1; + + @Override + protected void validateCSAR(CSARArchive csar) { + final CSARArchive.TOSCAMeta toscaMeta = csar.getToscaMeta(); + if (Objects.isNull(toscaMeta.getEntryManifestMf())) { + this.errors.add(new PnfCSARErrorEntryMissing( + "ETSI-Entry-Manifest", + CSARArchive.TOSCA_Metadata__TOSCA_Meta, + UNKNOWN_LINE_NUMBER) + ); + } + if (Objects.isNull(toscaMeta.getEntryChangeLog())) { + this.errors.add(new PnfCSARErrorEntryMissing( + "ETSI-Entry-Change-Log", + CSARArchive.TOSCA_Metadata__TOSCA_Meta, + UNKNOWN_LINE_NUMBER) + ); + } + } + + @Override + protected String getVnfReqsNo() { + return "R293901"; + } + + +} -- cgit 1.2.3-korg