aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib
diff options
context:
space:
mode:
authorkooper <sergey.sachkov@est.tech>2019-03-04 13:47:51 +0000
committerkooper <sergey.sachkov@est.tech>2019-03-04 13:47:51 +0000
commit11e9d33f2f50ad3990905fba184b7c10d255070a (patch)
tree32e1a0ba3d5da03a41202e9bf28c28f099601972 /openecomp-be/lib
parent7deb4e0e5f6cf06b7fbb27c6bda4e91f847f4075 (diff)
Add manifest non mano set support
Issue-ID: SDC-2141 Change-Id: I056e8f7c1da8f17ce8583207660882f85a4d11a4 Signed-off-by: kooper <sergey.sachkov@est.tech>
Diffstat (limited to 'openecomp-be/lib')
-rw-r--r--openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java1
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIService.java42
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/pom.xml5
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/Configuration.java10
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImpl.java115
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/NonManoType.java29
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/resources/nonManoConfig.yaml19
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImplTest.java133
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/nonManoConfig.yaml7
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/CSARConstants.java45
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/Manifest.java56
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/OnboardingManifest.java234
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/csar/ManifestParsingTest.java114
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InValidNonManoTosca.mf36
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTocsaNonManoGarbadgeAtEnd.mf34
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca1.mf11
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca2.mf18
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca3.mf7
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca4.mf12
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidNonManoTosca.mf33
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidTosca.mf15
21 files changed, 976 insertions, 0 deletions
diff --git a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
index f1f84231cd..adb8c5ff98 100644
--- a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
+++ b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
@@ -32,6 +32,7 @@ public enum Messages {
MANIFEST_INVALID_LINE("Manifest contains invalid line : %s"),
MANIFEST_NO_METADATA("Manifest must contain metadata"),
MANIFEST_NO_SOURCES("Manifest must contain Source"),
+ MANIFEST_EMPTY("Manifest must contain data"),
MANIFEST_PARSER_INTERNAL("Invalid manifest file"),
METADATA_PARSER_INTERNAL("Invalid Metadata file"),
METADATA_NO_ENTRY_DEFINITIONS("TOSCA.meta must contain Entry Definitions"),
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIService.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIService.java
new file mode 100644
index 0000000000..69ce97efc5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-api/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIService.java
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+
+import org.openecomp.core.utilities.file.FileContentHandler;
+import org.openecomp.sdc.tosca.csar.Manifest;
+
+
+public interface ETSIService {
+ /**
+ * Checks package structure is CSAR with TOSCA-Metadata directory according to SOL004 v2.5.1
+ * and contains mandatory Entries in Tosca.meta
+ * @param handler contains csar artifacts
+ * @return true if all condition matched, false otherwise
+ */
+ boolean isSol004WithToscaMetaDirectory(FileContentHandler handler);
+
+ /**
+ * Update file structure. Moves non mano files to Artifacts/Deployment/non mano key location
+ * @param handler
+ * @param manifest
+ */
+ void moveNonManoFileToArtifactFolder(FileContentHandler handler, Manifest manifest);
+}
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/pom.xml b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/pom.xml
index 450acd6583..08e8a0881a 100644
--- a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/pom.xml
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/pom.xml
@@ -112,6 +112,11 @@
<artifactId>openecomp-sdc-vendor-license-api</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/Configuration.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/Configuration.java
new file mode 100644
index 0000000000..e2f9a4efaf
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/Configuration.java
@@ -0,0 +1,10 @@
+package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+
+import java.util.Map;
+
+import lombok.Data;
+
+@Data
+public class Configuration {
+ private Map<String, NonManoType> nonManoKeyFolderMapping;
+}
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImpl.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImpl.java
new file mode 100644
index 0000000000..b3002abf6e
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImpl.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+
+import org.apache.commons.io.IOUtils;
+import org.onap.sdc.tosca.parser.utils.YamlToObjectConverter;
+import org.openecomp.core.utilities.file.FileContentHandler;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.openecomp.sdc.tosca.csar.Manifest;
+
+import static org.openecomp.sdc.tosca.csar.CSARConstants.*;
+
+public class ETSIServiceImpl implements ETSIService {
+
+ private Configuration configuration;
+
+ public ETSIServiceImpl() throws IOException {
+ InputStream io = getClass().getClassLoader().getResourceAsStream("nonManoConfig.yaml");
+ if(io == null){
+ throw new IOException("Non Mano configuration not found");
+ }
+ String data = IOUtils.toString(io, StandardCharsets.UTF_8);
+ YamlToObjectConverter yamlToObjectConverter = new YamlToObjectConverter();
+ configuration = yamlToObjectConverter.convertFromString(data, Configuration.class);
+ }
+
+ public ETSIServiceImpl(Configuration configuration) {
+ this.configuration = configuration;
+ }
+
+ @Override
+ public boolean isSol004WithToscaMetaDirectory(FileContentHandler handler) {
+ Map<String, byte[]> templates = handler.getFiles();
+ return isMetaFilePresent(templates) && hasMetaMandatoryEntries(templates);
+ }
+
+ @Override
+ public void moveNonManoFileToArtifactFolder(FileContentHandler handler, Manifest manifest) {
+ for (Map.Entry<String, List<String>> entry : manifest.getNonManoSources().entrySet()) {
+ String e = entry.getKey();
+ List<String> k = entry.getValue();
+ updateNonManoLocation(handler, e, k);
+ }
+ }
+
+ private void updateNonManoLocation(FileContentHandler handler, String nonManoKey, List<String> sources) {
+ Map<String, byte[]> files = handler.getFiles();
+ for (String key : sources) {
+ if (files.containsKey(key)) {
+ updateLocation(key, nonManoKey, files);
+ }
+ }
+ }
+
+ private void updateLocation(String key, String nonManoKey, Map<String, byte[]> files){
+ if (nonManoKey == null || nonManoKey.isEmpty()) {
+ return;
+ }
+ Map<String, NonManoType> map = configuration.getNonManoKeyFolderMapping();
+ if (map.containsKey(nonManoKey)) {
+ NonManoType nonManoPair = map.get(nonManoKey);
+ String newLocation = nonManoPair.getType() + "/" +
+ nonManoPair.getLocation() + "/" + getFileName(key);
+ if (!files.containsKey(newLocation)) {
+ files.put(newLocation, files.remove(key));
+ }
+ }
+ }
+
+
+ private String getFileName(String key) {
+ return key.substring(key.lastIndexOf('/') + 1);
+ }
+
+ private boolean hasMetaMandatoryEntries(Map<String, byte[]> templates) {
+ Optional<byte[]> meta = templates.entrySet().stream().filter(e -> e.getKey().equals(TOSCA_META_PATH_FILE_NAME)
+ || e.getKey().equals(TOSCA_META_ORIG_PATH_FILE_NAME)).findFirst().map(Map.Entry::getValue);
+ if (!meta.isPresent()) {
+ return false;
+ }
+ String metaContent = new String(meta.get(), StandardCharsets.UTF_8);
+ return metaContent.contains(TOSCA_META_ENTRY_DEFINITIONS) && metaContent.contains(TOSCA_META_ENTRY_MANIFEST)
+ && metaContent.contains(TOSCA_META_ENTRY_CHANGE_LOG);
+ }
+
+ private boolean isMetaFilePresent(Map<String, byte[]> handler) {
+ return handler.containsKey(TOSCA_META_PATH_FILE_NAME) || handler.containsKey(TOSCA_META_ORIG_PATH_FILE_NAME);
+ }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/NonManoType.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/NonManoType.java
new file mode 100644
index 0000000000..e10c102593
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/NonManoType.java
@@ -0,0 +1,29 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+
+
+import lombok.Data;
+
+@Data
+public class NonManoType {
+ private String location;
+ private String type;
+}
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/resources/nonManoConfig.yaml b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/resources/nonManoConfig.yaml
new file mode 100644
index 0000000000..c444e66c48
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/resources/nonManoConfig.yaml
@@ -0,0 +1,19 @@
+nonManoKeyFolderMapping:
+ onap_ves_events:
+ location: VES_EVENTS
+ type: Deployment
+ onap_pm_dictionary:
+ location: PM_DICTIONARY
+ type: Deployment
+ onap_yang_modules:
+ location: YANG_MODULES
+ type: Deployment
+ onap_ansible_playbooks:
+ location: ANSIBLE_PLAYBOOK
+ type: Deployment
+ onap_scripts:
+ location: SCRIPTS
+ type: Deployment
+ onap_others:
+ location: OTHER
+ type: Informational \ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImplTest.java b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImplTest.java
new file mode 100644
index 0000000000..ae69415f1d
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/services/impl/etsi/ETSIServiceImplTest.java
@@ -0,0 +1,133 @@
+package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.sdc.tosca.parser.utils.YamlToObjectConverter;
+import org.openecomp.core.utilities.file.FileContentHandler;
+import org.openecomp.sdc.tosca.csar.Manifest;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class ETSIServiceImplTest {
+ private ETSIService etsiService;
+ private String sol004MetaFile = "TOSCA-Meta-Version: 1.0\n" +
+ "CSAR-Version: 1.0\n" +
+ "Created-By: Kuku\n" +
+ "Entry-Definitions: MainServiceTemplate.yaml\n" +
+ "Entry-Manifest: MainServiceTemplate.mf\n" +
+ "Entry-Change-Log: MainServiceTemplate.log";
+ private String metaFile = "TOSCA-Meta-Version: 1.0\n" +
+ "CSAR-Version: 1.0\n" +
+ "Created-By: Kuku\n" +
+ "Entry-Definitions: MainServiceTemplate.yaml";
+
+ private String finalNonManoLocation = "Deployment/VES_EVENTS/test.xml";
+ private String finalOtherNonManoLocation = "Informational/OTHER/test.xml";
+
+ @Before
+ public void setUp() throws IOException {
+ YamlToObjectConverter yamlToObjectConverter = new YamlToObjectConverter();
+ Configuration configuration = yamlToObjectConverter.convert("src/test/resources",
+ Configuration.class, "nonManoConfig.yaml");
+ etsiService = new ETSIServiceImpl(configuration);
+ }
+
+ @After
+ public void tearDown() {
+ etsiService = null;
+ }
+
+ @Test
+ public void testIsSol004TrueOrigin() {
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta.original", sol004MetaFile.getBytes(StandardCharsets.UTF_8));
+ assertTrue(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
+ }
+
+ @Test
+ public void testIsSol004True() {
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta", sol004MetaFile.getBytes(StandardCharsets.UTF_8));
+ assertTrue(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
+ }
+
+ @Test
+ public void testIsSol004False() {
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta.original", metaFile.getBytes(StandardCharsets.UTF_8));
+ assertFalse(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
+ }
+
+ @Test
+ public void testIsSol004FalseWithNull() {
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ assertFalse(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
+ }
+
+ @Test
+ public void testMoveNonManoFileToArtifactFolder() throws IOException {
+ Map<String, List<String>> nonManoSources = new HashMap<>();
+ List<String> sources = new ArrayList<>();
+ sources.add("Some/test.xml");
+ nonManoSources.put("Some", sources);
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("Some/test.xml", new byte[1]);
+ Manifest manifest = mock(Manifest.class);
+ when(manifest.getNonManoSources()).thenReturn(nonManoSources);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ assertTrue(fileContentHandler.containsFile(finalNonManoLocation));
+ }
+
+ @Test
+ public void testMoveNonManoFileToArtifactFolderFileNotInFolder() throws IOException {
+ Map<String, List<String>> nonManoSources = new HashMap<>();
+ List<String> sources = new ArrayList<>();
+ sources.add("test.xml");
+ nonManoSources.put("foo", sources);
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("test.xml", new byte[1]);
+ Manifest manifest = mock(Manifest.class);
+ when(manifest.getNonManoSources()).thenReturn(nonManoSources);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ assertFalse(fileContentHandler.containsFile(finalOtherNonManoLocation));
+ }
+
+ @Test
+ public void testMoveNonManoFileToArtifactFolderNoMove() throws IOException {
+ Map<String, List<String>> nonManoSources = new HashMap<>();
+ List<String> sources = new ArrayList<>();
+ sources.add(finalNonManoLocation);
+ nonManoSources.put("Some", sources);
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile(finalNonManoLocation, new byte[1]);
+ Manifest manifest = mock(Manifest.class);
+ when(manifest.getNonManoSources()).thenReturn(nonManoSources);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ assertTrue(fileContentHandler.containsFile(finalNonManoLocation));
+ }
+
+ @Test
+ public void testMoveNonManoFileToArtifactFolderMoveToKeyFolder() throws IOException {
+ Map<String, List<String>> nonManoSources = new HashMap<>();
+ List<String> sources = new ArrayList<>();
+ sources.add("Artifacts/Deployment/test.xml");
+ nonManoSources.put("Some", sources);
+ FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("Artifacts/Deployment/test.xml", new byte[1]);
+ Manifest manifest = mock(Manifest.class);
+ when(manifest.getNonManoSources()).thenReturn(nonManoSources);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ assertTrue(fileContentHandler.containsFile(finalNonManoLocation));
+ }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/nonManoConfig.yaml b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/nonManoConfig.yaml
new file mode 100644
index 0000000000..32c6b1ce57
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/nonManoConfig.yaml
@@ -0,0 +1,7 @@
+nonManoKeyFolderMapping:
+ Some:
+ location: VES_EVENTS
+ type: Deployment
+ Other:
+ location: VES_EVENTS
+ type: Informational \ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/CSARConstants.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/CSARConstants.java
new file mode 100644
index 0000000000..94786fe0df
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/CSARConstants.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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.openecomp.sdc.tosca.csar;
+
+import com.google.common.collect.ImmutableSet;
+
+import static com.google.common.collect.ImmutableSet.of;
+public class CSARConstants {
+
+ public static final ImmutableSet<String> ELIGBLE_FOLDERS = of("Artifacts/","Definitions/",
+ "Licenses/", "TOSCA-Metadata/");
+
+ public static final String MAIN_SERVICE_TEMPLATE_MF_FILE_NAME = "MainServiceTemplate.mf";
+ public static final String MAIN_SERVICE_TEMPLATE_YAML_FILE_NAME = "MainServiceTemplate.yaml";
+ public static final String TOSCA_META_PATH_FILE_NAME="TOSCA-Metadata/TOSCA.meta";
+ public static final String TOSCA_META_ENTRY_DEFINITIONS="Entry-Definitions";
+ public static final String TOSCA_META_ENTRY_MANIFEST="Entry-Manifest";
+ public static final String TOSCA_META_ENTRY_CHANGE_LOG="Entry-Change-Log";
+ public static final ImmutableSet<String> ELIGIBLE_FILES =
+ of(MAIN_SERVICE_TEMPLATE_MF_FILE_NAME,MAIN_SERVICE_TEMPLATE_YAML_FILE_NAME);
+
+ public static final String METADATA_MF_ATTRIBUTE = "metadata";
+ public static final String SOURCE_MF_ATTRIBUTE = "Source";
+ public static final String SEPERATOR_MF_ATTRIBUTE = ":";
+ public static final String NON_MANO_MF_ATTRIBUTE = "non_mano_artifact_sets";
+ public static final String TOSCA_META_ORIG_PATH_FILE_NAME="TOSCA-Metadata/TOSCA.meta.original";
+
+ private CSARConstants() {
+
+ }
+}
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/Manifest.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/Manifest.java
new file mode 100644
index 0000000000..2aac3a7be5
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/Manifest.java
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.tosca.csar;
+
+import java.util.List;
+import java.util.Map;
+
+public interface Manifest {
+ /**
+ * Returns if manifest is valid
+ * @return true/false
+ */
+ boolean isValid();
+
+ /**
+ * Metadata section of manifest
+ * @return
+ */
+ Map<String, String> getMetadata();
+
+ /**
+ * Source section of manifest
+ * @return
+ */
+ List<String> getSources();
+
+ /**
+ * Validation errors of manifest
+ * @return
+ */
+ List<String> getErrors();
+
+ /**
+ * non mano section of manifest sol004 #4.3.7
+ * @return
+ */
+ Map<String, List<String>> getNonManoSources();
+}
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/OnboardingManifest.java b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/OnboardingManifest.java
new file mode 100644
index 0000000000..8858128b38
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/OnboardingManifest.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright © 2016-2017 European Support Limited
+ *
+ * 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.openecomp.sdc.tosca.csar;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.openecomp.sdc.common.errors.Messages;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder.getErrorWithParameters;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.METADATA_MF_ATTRIBUTE;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.NON_MANO_MF_ATTRIBUTE;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.SEPERATOR_MF_ATTRIBUTE;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.SOURCE_MF_ATTRIBUTE;
+
+public class OnboardingManifest implements Manifest{
+ private static final Logger LOGGER = LoggerFactory.getLogger(OnboardingManifest.class);
+ private Map<String, String> metadata;
+ private List<String> sources;
+ private List<String> errors;
+ private Map<String, List<String>> nonManoSources;
+
+ private OnboardingManifest() {
+ errors = new ArrayList<>();
+ sources = new ArrayList<>();
+ metadata = new HashMap<>();
+ nonManoSources = new HashMap<>();
+ }
+
+ /**
+ * This Method will parse manifest, extracting fields mandatory/non-mandatory,
+ * if error occurred it's recorded and will be used for deciding if manifest is valid
+ * @param is manifest file input stream
+ * @return Manifest object
+ */
+ public static Manifest parse(InputStream is) {
+ OnboardingManifest manifest = new OnboardingManifest();
+ try {
+ ImmutableList<String> lines = manifest.readAllLines(is);
+ manifest.processManifest(lines);
+ } catch (IOException e){
+ LOGGER.error(e.getMessage(),e);
+ manifest.errors.add(Messages.MANIFEST_PARSER_INTERNAL.getErrorMessage());
+ }
+ return manifest;
+ }
+
+ private void processManifest(ImmutableList<String> lines) {
+ if(lines == null || lines.isEmpty()){
+ errors.add(Messages.MANIFEST_EMPTY.getErrorMessage());
+ return;
+ }
+ Iterator<String> iterator = lines.iterator();
+ //SOL004 #4.3.2: The manifest file shall start with the package metadata
+ String line = iterator.next();
+ if(!line.trim().equals(METADATA_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)){
+ reportError(line);
+ return;
+ }
+ //handle metadata
+ processMetadata(iterator);
+
+ if (errors.isEmpty()) {
+ if (metadata.isEmpty()) {
+ errors.add(Messages.MANIFEST_NO_METADATA.getErrorMessage());
+ }
+ if (sources.isEmpty()) {
+ errors.add(Messages.MANIFEST_NO_SOURCES.getErrorMessage());
+ }
+ }
+ }
+
+ private void processSourcesAndNonManoSources(Iterator<String> iterator, String prevLine) {
+ if(prevLine.isEmpty()){
+ if(iterator.hasNext()){
+ processSourcesAndNonManoSources(iterator, iterator.next());
+ }
+ }else if(prevLine.startsWith(SOURCE_MF_ATTRIBUTE+SEPERATOR_MF_ATTRIBUTE)){
+ processSource(iterator, prevLine);
+ } else if(prevLine.startsWith(NON_MANO_MF_ATTRIBUTE+SEPERATOR_MF_ATTRIBUTE)){
+ //non mano should be the last bit in manifest file,
+ // all sources after non mano will be placed to the last non mano
+ // key, if any other structure met error reported
+ processNonManoInputs(iterator, iterator.next());
+ }else{
+ reportError(prevLine);
+ }
+ }
+
+ private void processSource(Iterator<String> iterator, String prevLine) {
+ String value = prevLine.substring((SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE).length()).trim();
+ sources.add(value);
+ if(iterator.hasNext()) {
+ processSourcesAndNonManoSources(iterator, iterator.next());
+ }
+ }
+
+ private void processMetadata(Iterator<String> iterator) {
+ if(!iterator.hasNext()){
+ return;
+ }
+ String line = iterator.next();
+ if(line.isEmpty()){
+ processMetadata(iterator);
+ return;
+ }
+ String[] metaSplit = line.split(SEPERATOR_MF_ATTRIBUTE);
+ if (metaSplit.length < 2){
+ return;
+ }
+ if (!metaSplit[0].equals(SOURCE_MF_ATTRIBUTE) && !metaSplit[0].equals(NON_MANO_MF_ATTRIBUTE)){
+ String value = line.substring((metaSplit[0] + SEPERATOR_MF_ATTRIBUTE).length()).trim();
+ metadata.put(metaSplit[0],value);
+ processMetadata(iterator);
+ }
+ else {
+ processSourcesAndNonManoSources(iterator, line);
+ }
+ }
+
+ private void processNonManoInputs(Iterator<String> iterator, String prevLine) {
+ //Non Mano input should always start with key, if no key available report an error
+ if(prevLine.trim().equals(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)){
+ reportError(prevLine);
+ return;
+ }
+ //key should contain : separator
+ if(!prevLine.contains(SEPERATOR_MF_ATTRIBUTE)){
+ reportError(prevLine);
+ return;
+ }
+ //key shouldn't have value in the same line
+ String[] metaSplit = prevLine.trim().split(SEPERATOR_MF_ATTRIBUTE);
+ if (metaSplit.length > 1){
+ reportError(prevLine);
+ return;
+ }
+ int index = prevLine.indexOf(':');
+ if(index > 0){
+ prevLine = prevLine.substring(0, index);
+ }
+ processNonManoSource(iterator, prevLine, new ArrayList<>());
+
+ }
+
+ private void processNonManoSource(Iterator<String> iterator, String key, List<String> sources) {
+ if(!iterator.hasNext()){
+ return;
+ }
+ String line = iterator.next();
+ if(line.isEmpty()){
+ processNonManoSource(iterator, key, sources);
+ }else if(line.trim().startsWith(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)){
+ String value = line.replace(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE, "").trim();
+ sources.add(value);
+ processNonManoSource(iterator, key, sources);
+ }else {
+ processNonManoInputs(iterator, line);
+ }
+ nonManoSources.put(key.trim(), sources);
+ }
+
+ private void reportError(String line) {
+ errors.add(getErrorWithParameters(Messages.MANIFEST_INVALID_LINE.getErrorMessage(), line));
+ }
+
+ private ImmutableList<String> readAllLines(InputStream is) throws IOException {
+ if(is == null){
+ throw new IOException("Input Stream cannot be null!");
+ }
+ ImmutableList.Builder<String> builder = ImmutableList.<String> builder();
+ try (BufferedReader bufferedReader = new BufferedReader(
+ new InputStreamReader(is, StandardCharsets.UTF_8.newDecoder()))) {
+ bufferedReader.lines().forEach(builder::add);
+ }
+ return builder.build();
+ }
+
+ public Map<String, String> getMetadata() {
+ if (!isValid()){
+ return Collections.emptyMap();
+ }
+ return ImmutableMap.copyOf(metadata);
+ }
+
+ public List<String> getSources() {
+ if (!isValid()){
+ return Collections.emptyList();
+ }
+ return ImmutableList.copyOf(sources);
+ }
+
+ public List<String> getErrors() {
+ return ImmutableList.copyOf(errors);
+ }
+
+ public boolean isValid() {
+ return errors.isEmpty();
+ }
+
+ public Map<String, List<String>> getNonManoSources() {
+ if (!isValid()){
+ return Collections.emptyMap();
+ }
+ return ImmutableMap.copyOf(nonManoSources);
+ }
+}
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/csar/ManifestParsingTest.java b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/csar/ManifestParsingTest.java
new file mode 100644
index 0000000000..c6008f03d7
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/csar/ManifestParsingTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.openecomp.sdc.tosca.csar;
+
+import org.junit.Test;
+import org.openecomp.sdc.common.errors.Messages;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+
+public class ManifestParsingTest {
+
+ @Test
+ public void testSuccessfulParsing() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/ValidTosca.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertTrue(onboardingManifest.isValid());
+ assertEquals(onboardingManifest.getMetadata().size(), 4);
+ assertEquals(onboardingManifest.getSources().size(), 5);
+ }
+ }
+
+ @Test
+ public void testNoMetadataParsing() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/InvalidTosca1.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertFalse(onboardingManifest.isValid());
+ assertTrue(onboardingManifest.getErrors().stream().anyMatch(error -> error
+ .contains(Messages.MANIFEST_INVALID_LINE.getErrorMessage().substring(0, 10))));
+ }
+ }
+
+ @Test
+ public void testBrokenMDParsing() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/InvalidTosca2.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertFalse(onboardingManifest.isValid());
+ assertTrue(onboardingManifest.getErrors().stream().anyMatch(error -> error
+ .contains(Messages.MANIFEST_INVALID_LINE.getErrorMessage().substring(0, 10))));
+ }
+ }
+
+ @Test
+ public void testNoMetaParsing() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/InvalidTosca4.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertFalse(onboardingManifest.isValid());
+ assertTrue(onboardingManifest.getErrors().stream().anyMatch(error -> error
+ .contains(Messages.MANIFEST_NO_METADATA.getErrorMessage().substring(0, 10))));
+ }
+ }
+
+ @Test
+ public void testSuccessfulNonManoParsing() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/ValidNonManoTosca.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertTrue(onboardingManifest.isValid());
+ assertEquals(onboardingManifest.getMetadata().size(), 4);
+ assertEquals(onboardingManifest.getSources().size(), 5);
+ assertEquals(onboardingManifest.getNonManoSources().size(), 2);
+ }
+ }
+
+ @Test
+ public void testFailfulNonManoParsing() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/InValidNonManoTosca.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertFalse(onboardingManifest.isValid());
+ }
+ }
+
+ @Test
+ public void testFailfulNonManoParsingWithGarbadge() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/InvalidTocsaNonManoGarbadgeAtEnd.mf")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertFalse(onboardingManifest.isValid());
+ }
+ }
+
+ @Test
+ public void testParseManifestWithNoFile() throws IOException {
+ try (InputStream is = getClass()
+ .getResourceAsStream("/vspmanager.csar/manifest/SOME_WRONG_FILE")) {
+ Manifest onboardingManifest = OnboardingManifest.parse(is);
+ assertFalse(onboardingManifest.isValid());
+ }
+ }
+}
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InValidNonManoTosca.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InValidNonManoTosca.mf
new file mode 100644
index 0000000000..9cced6b371
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InValidNonManoTosca.mf
@@ -0,0 +1,36 @@
+metadata:
+ vnf_product_name: Mock
+ vnf_provider_id: ZTE
+ vnf_package_version: 1.0
+ vnf_release_data_time: 2017.01.01T10:00+03:00
+
+Source: MainServiceTemplate.yaml
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml
+
+non_mano_artifact_sets:
+ foo_bar:
+ Source: foobar/foo/foo.yaml
+
+ Source: foobar/foo/foo.script
+
+ Source: foobar/bar/descriptor.xml
+
+ prv.happy-nfv.cool:
+
+ Source: happy/cool/123.html
+
+ Source: happy/cool/cool.json
+
+ Source: happy/cool/hot/hot_or_cool.json
+
+
+vnf_product_name: Mock
+vnf_provider_id: ZTE
+vnf_package_version: 1.0 \ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTocsaNonManoGarbadgeAtEnd.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTocsaNonManoGarbadgeAtEnd.mf
new file mode 100644
index 0000000000..cfe6bc48da
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTocsaNonManoGarbadgeAtEnd.mf
@@ -0,0 +1,34 @@
+metadata:
+ vnf_product_name: Mock
+ vnf_provider_id: ZTE
+ vnf_package_version: 1.0
+ vnf_release_data_time: 2017.01.01T10:00+03:00
+
+Source: MainServiceTemplate.yaml
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml
+
+non_mano_artifact_sets:
+ foo_bar:
+ Source: foobar/foo/foo.yaml
+
+ Source: foobar/foo/foo.script
+
+ Source: foobar/bar/descriptor.xml
+
+ prv.happy-nfv.cool:
+
+ Source: happy/cool/123.html
+
+ Source: happy/cool/cool.json
+
+ Source: happy/cool/hot/hot_or_cool.json
+
+
+some garbadge \ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca1.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca1.mf
new file mode 100644
index 0000000000..ebdec213d3
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca1.mf
@@ -0,0 +1,11 @@
+
+
+Source: MainServiceTemplate.yaml
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca2.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca2.mf
new file mode 100644
index 0000000000..057f54867b
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca2.mf
@@ -0,0 +1,18 @@
+metadata:
+ vnf_product_name: Mock
+ vnf_provider_id: ZTE
+
+Source: MainServiceTemplate.yaml
+
+ vnf_package_version: 1.0
+ vnf_release_data_time: 2017.01.01T10:00+03:00
+
+
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca3.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca3.mf
new file mode 100644
index 0000000000..64e9445f7f
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca3.mf
@@ -0,0 +1,7 @@
+metadata:
+ vnf_product_name: Mock
+ vnf_provider_id: ZTE
+ vnf_package_version: 1.0
+ vnf_release_data_time: 2017.01.01T10:00+03:00
+
+
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca4.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca4.mf
new file mode 100644
index 0000000000..d8e291c4a3
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca4.mf
@@ -0,0 +1,12 @@
+metadata:
+
+
+Source: MainServiceTemplate.yaml
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidNonManoTosca.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidNonManoTosca.mf
new file mode 100644
index 0000000000..25ec14c7cc
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidNonManoTosca.mf
@@ -0,0 +1,33 @@
+metadata:
+ vnf_product_name: Mock
+ vnf_provider_id: ZTE
+ vnf_package_version: 1.0
+ vnf_release_data_time: 2017.01.01T10:00+03:00
+
+Source: MainServiceTemplate.yaml
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml
+
+non_mano_artifact_sets:
+ foo_bar:
+ Source: foobar/foo/foo.yaml
+
+ Source: foobar/foo/foo.script
+
+ Source: foobar/bar/descriptor.xml
+
+ prv.happy-nfv.cool:
+
+ Source: happy/cool/123.html
+
+ Source: happy/cool/cool.json
+
+ Source: happy/cool/hot/hot_or_cool.json
+
+
diff --git a/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidTosca.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidTosca.mf
new file mode 100644
index 0000000000..b2accb7a1c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidTosca.mf
@@ -0,0 +1,15 @@
+metadata:
+ vnf_product_name: Mock
+ vnf_provider_id: ZTE
+ vnf_package_version: 1.0
+ vnf_release_data_time: 2017.01.01T10:00+03:00
+
+Source: MainServiceTemplate.yaml
+
+Source: Definitions/GlobalSubstitutionTypesServiceTemplate.yaml
+
+Source: Artifacts/install.sh
+
+Source: Artifacts/create_stack.sh
+
+Source: Licenses/license.xml