diff options
author | 2019-03-19 09:59:02 +0100 | |
---|---|---|
committer | 2019-03-22 13:24:43 +0100 | |
commit | 5873269dcf426377a037e28a0b16bd18af582a7e (patch) | |
tree | bfd24cc65aa4cd929f1864734449223eae7e035b /csarvalidation/src/main | |
parent | 0d4544eb82a2ca79d7724e5c1da70d3943db76eb (diff) |
PNF TC R293901
Change-Id: I6acfa94ce0fac2b3c46688601c3ec553af4c8b66
Issue-ID: VNFSDK-386
Signed-off-by: Zebek Bogumil <bogumil.zebek@nokia.com>
Diffstat (limited to 'csarvalidation/src/main')
9 files changed, 242 insertions, 52 deletions
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<String, ?> yaml = (Map<String, ?>) 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 + * <p> + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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 + * <p> + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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<CSARArchive.CSARError> 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 + * <p> + * 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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"; + } + + +} diff --git a/csarvalidation/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand b/csarvalidation/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand index d868756..800784c 100644 --- a/csarvalidation/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand +++ b/csarvalidation/src/main/resources/META-INF/services/org.onap.cli.fw.cmd.OnapCommand @@ -43,3 +43,4 @@ org.onap.cvc.csar.cc.sol004.VTPValidateCSARR66070 org.onap.cvc.csar.cc.sol004.VTPValidateCSARR77707 org.onap.cvc.csar.cc.sol004.VTPValidateCSARR77786 org.onap.cvc.csar.cc.sol004.VTPValidateCSARR87234 +org.onap.cvc.csar.cc.sol004.VTPValidateCSARR293901 diff --git a/csarvalidation/src/main/resources/open-cli-schema/sol004/vtp-validate-csar-r293901.yaml b/csarvalidation/src/main/resources/open-cli-schema/sol004/vtp-validate-csar-r293901.yaml new file mode 100644 index 0000000..34f75e5 --- /dev/null +++ b/csarvalidation/src/main/resources/open-cli-schema/sol004/vtp-validate-csar-r293901.yaml @@ -0,0 +1,59 @@ +# 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. + +open_cli_schema_version: 1.0 + +name: csar-validate-r293901 + +description: | + For a VNF/PNF package CSAR MUST contains a TOSCA-Metadata directory with the TOSCA.meta metadata file. + The TOSCA.meta metadata file MUST includes block_0 with the Entry-Definitions keyword pointing to a TOSCA definitions + YAML file. + Additional keyname extension must be included as following: + -ETSI-Entry-Manifest + -ETSI-Entry-Change-Log + +info: + product: onap-vtp + version: 1.0 + service: validation + author: ONAP VTP Team onap-discuss@lists.onap.org + +parameters: + - name: csar + description: CSAR file path + long_option: csar + short_option: b + type: binary + is_optional: false + +results: + direction: landscape + attributes: + - name: code + description: Error code + scope: short + type: string + - name: message + description: Error message + scope: short + type: string + - name: file + description: File in which error occured + scope: short + type: string + - name: line-no + description: Line no at which error occured + scope: short + type: string diff --git a/csarvalidation/src/main/resources/vnfreqs.properties b/csarvalidation/src/main/resources/vnfreqs.properties index dde122f..f290fb8 100644 --- a/csarvalidation/src/main/resources/vnfreqs.properties +++ b/csarvalidation/src/main/resources/vnfreqs.properties @@ -1,3 +1,3 @@ -vnfreqs.enabled=r02454,r04298,r07879,r09467,r13390,r23823,r26881,r27310,r35851,r40293,r43958,r66070,r77707,r77786,r87234,r10087,r21322,r26885,r40820,r35854,r65486,r17852,r46527,r15837,r54356,r67895,r95321,r32155,r01123,r51347 +vnfreqs.enabled=r02454,r04298,r07879,r09467,r13390,r23823,r26881,r27310,r35851,r40293,r43958,r66070,r77707,r77786,r87234,r10087,r21322,r26885,r40820,r35854,r65486,r17852,r46527,r15837,r54356,r67895,r95321,r32155,r01123,r51347,r293901 # ignored all chef and ansible related tests errors.ignored=0x1005,0x1006,r07879-0x1000,r13390-0x1000,r27310-0x1000,r40293-0x1000,r77786-0x1000
\ No newline at end of file |