Add manifest non mano set support 88/79388/6
authorkooper <sergey.sachkov@est.tech>
Mon, 4 Mar 2019 13:47:51 +0000 (13:47 +0000)
committerkooper <sergey.sachkov@est.tech>
Mon, 4 Mar 2019 13:47:51 +0000 (13:47 +0000)
Issue-ID: SDC-2141

Change-Id: I056e8f7c1da8f17ce8583207660882f85a4d11a4
Signed-off-by: kooper <sergey.sachkov@est.tech>
28 files changed:
catalog-be/src/test/resources/config/mock.txt [deleted file]
openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/VendorSoftwareProductManagerImpl.java
openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/OrchestrationTemplateCSARHandler.java
openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/OnboardingManifest.java [deleted file]
openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/OnboardingToscaMetadata.java
openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/resources/nonManoConfig.yaml [new file with mode: 0644]
openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/impl/VendorSoftwareProductManagerImplTest.java
openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/errors/Messages.java
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 with mode: 0644]
openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/pom.xml
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 with mode: 0644]
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 with mode: 0644]
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 with mode: 0644]
openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/main/resources/nonManoConfig.yaml [new file with mode: 0644]
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 with mode: 0644]
openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/nonManoConfig.yaml [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/CSARConstants.java [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/CSARConstants.java with 81% similarity]
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/Manifest.java [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/OnboardingManifest.java [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/test/java/org/openecomp/sdc/tosca/csar/ManifestParsingTest.java [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/java/org/openecomp/sdc/vendorsoftwareproduct/upload/csar/ManifestParsingTest.java with 54% similarity]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InValidNonManoTosca.mf [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTocsaNonManoGarbadgeAtEnd.mf [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca1.mf [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/manifest/InvalidTosca1.mf with 100% similarity]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca2.mf [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/manifest/InvalidTosca2.mf with 100% similarity]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca3.mf [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/manifest/InvalidTosca3.mf with 100% similarity]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/InvalidTosca4.mf [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/manifest/InvalidTosca4.mf with 100% similarity]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidNonManoTosca.mf [new file with mode: 0644]
openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidTosca.mf [moved from openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/test/resources/vspmanager.csar/manifest/ValidTosca.mf with 100% similarity]

diff --git a/catalog-be/src/test/resources/config/mock.txt b/catalog-be/src/test/resources/config/mock.txt
deleted file mode 100644 (file)
index e69de29..0000000
index 275aee6..19d06ed 100644 (file)
@@ -19,6 +19,7 @@ package org.openecomp.sdc.vendorsoftwareproduct.impl;
 import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder.candidateDataNotProcessedOrAbortedErrorBuilder;
 import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder.invalidProcessedCandidate;
 import static org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder.vspMissingDeploymentFlavorErrorBuilder;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_MF_FILE_NAME;
 
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayInputStream;
@@ -106,8 +107,12 @@ import org.openecomp.sdc.vendorsoftwareproduct.errors.PackageInvalidErrorBuilder
 import org.openecomp.sdc.vendorsoftwareproduct.errors.PackageNotFoundErrorBuilder;
 import org.openecomp.sdc.vendorsoftwareproduct.errors.TranslationFileCreationErrorBuilder;
 import org.openecomp.sdc.vendorsoftwareproduct.errors.VendorSoftwareProductInvalidErrorBuilder;
+import org.openecomp.sdc.tosca.csar.Manifest;
+import org.openecomp.sdc.tosca.csar.OnboardingManifest;
 import org.openecomp.sdc.vendorsoftwareproduct.informationArtifact.InformationArtifactGenerator;
+import org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi.ETSIService;
 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
+import org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi.ETSIServiceImpl;
 import org.openecomp.sdc.vendorsoftwareproduct.services.schemagenerator.SchemaGenerator;
 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireResponse;
 import org.openecomp.sdc.vendorsoftwareproduct.types.QuestionnaireValidationResult;
@@ -655,7 +660,7 @@ public class VendorSoftwareProductManagerImpl implements VendorSoftwareProductMa
   }
 
   @Override
-  public PackageInfo createPackage(String vspId, Version version) {
+  public PackageInfo createPackage(String vspId, Version version) throws IOException {
     ToscaServiceModel toscaServiceModel = enrichedServiceModelDao.getServiceModel(vspId, version);
     VspDetails vspDetails = vspInfoDao.get(new VspDetails(vspId, version));
     Version vlmVersion = vspDetails.getVlmVersion();
@@ -669,7 +674,13 @@ public class VendorSoftwareProductManagerImpl implements VendorSoftwareProductMa
     FileContentHandler licenseArtifacts = licenseArtifactsService
         .createLicenseArtifacts(vspDetails.getId(), vspDetails.getVendorId(), vlmVersion,
             vspDetails.getFeatureGroups());
-    //todo add tosca validation here
+    ETSIService etsiService = new ETSIServiceImpl();
+    if(etsiService.isSol004WithToscaMetaDirectory(toscaServiceModel.getArtifactFiles())){
+        FileContentHandler handler = toscaServiceModel.getArtifactFiles();
+        Manifest onboardingManifest = OnboardingManifest.parse(handler.getFileContent(MAIN_SERVICE_TEMPLATE_MF_FILE_NAME));
+      etsiService.moveNonManoFileToArtifactFolder(handler, onboardingManifest);
+
+    }
     packageInfo.setTranslatedFile(ByteBuffer.wrap(
         toscaServiceTemplateServiceCsar.createOutputFile(toscaServiceModel, licenseArtifacts)));
 
index 4047937..bfe602b 100644 (file)
@@ -31,7 +31,8 @@ import org.openecomp.sdc.datatypes.error.ErrorLevel;
 import org.openecomp.sdc.datatypes.error.ErrorMessage;
 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.OrchestrationTemplateCandidateData;
 import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
-import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.OnboardingManifest;
+import org.openecomp.sdc.tosca.csar.Manifest;
+import org.openecomp.sdc.tosca.csar.OnboardingManifest;
 import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.OnboardingToscaMetadata;
 import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
 import org.openecomp.sdc.vendorsoftwareproduct.types.UploadFileResponse;
@@ -45,7 +46,11 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 
 import static org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder.getErrorWithParameters;
-import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.*;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.ELIGBLE_FOLDERS;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.ELIGIBLE_FILES;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_MF_FILE_NAME;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_YAML_FILE_NAME;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_PATH_FILE_NAME;
 
 public class OrchestrationTemplateCSARHandler extends BaseOrchestrationTemplateHandler
     implements OrchestrationTemplateFileHandler {
@@ -114,7 +119,7 @@ public class OrchestrationTemplateCSARHandler extends BaseOrchestrationTemplateH
 
     try (InputStream fileContent = contentMap.getFileContent(MAIN_SERVICE_TEMPLATE_MF_FILE_NAME)) {
 
-      OnboardingManifest onboardingManifest = new OnboardingManifest(fileContent);
+      Manifest onboardingManifest = OnboardingManifest.parse(fileContent);
       if (!onboardingManifest.isValid()) {
         onboardingManifest.getErrors().forEach(error -> uploadFileResponse.addStructureError(
             SdcCommon.UPLOAD_FILE, new ErrorMessage(ErrorLevel.ERROR, error)));
diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/OnboardingManifest.java b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/java/org/openecomp/sdc/vendorsoftwareproduct/impl/orchestration/csar/OnboardingManifest.java
deleted file mode 100644 (file)
index fd3d3c4..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * 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.vendorsoftwareproduct.impl.orchestration.csar;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.apache.commons.lang.StringUtils;
-import org.openecomp.sdc.common.errors.Messages;
-import org.openecomp.sdc.logging.api.Logger;
-import org.openecomp.sdc.logging.api.LoggerFactory;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-import static org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder.getErrorWithParameters;
-import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.*;
-
-public class OnboardingManifest {
-    private static final Logger LOGGER = LoggerFactory.getLogger(OnboardingManifest.class);
-    private Map<String, String> metadata;
-    private List<String> sources;
-    private List<String> errors;
-    private State state;
-    private enum State {
-        START, PROCESS_METADATA, PROCESS_SOURCES, ERROR
-    }
-
-    public OnboardingManifest(InputStream is) {
-        errors = new ArrayList<>();
-        sources = new ArrayList<>();
-        metadata = new HashMap<>();
-        parseManifest(is);
-    }
-
-    private void parseManifest(InputStream is) {
-        try {
-            ImmutableList<String> lines = readAllLines(is);
-            state = State.START;
-
-            for (String line : lines) {
-                line = line.trim();
-                if (!StringUtils.isEmpty(line.trim())) {
-                    state = processLine(state, line);
-                }
-            }
-            if (errors.isEmpty()) {
-                if (metadata.isEmpty()) {
-                    errors.add(Messages.MANIFEST_NO_METADATA.getErrorMessage());
-                }
-                if (sources.isEmpty()) {
-                    errors.add(Messages.MANIFEST_NO_SOURCES.getErrorMessage());
-                }
-            }
-        } catch (IOException e){
-            LOGGER.error(e.getMessage(),e);
-            errors.add(Messages.MANIFEST_PARSER_INTERNAL.getErrorMessage());
-        }
-    }
-
-    private State processLine(State state, String line) {
-        State newState = state;
-        switch (state) {
-            case START:
-                newState = startProcessLine(state, line);
-                break;
-            case PROCESS_METADATA:
-                newState = processMetaData(state, line);
-                break;
-            case PROCESS_SOURCES:
-                processSourceLine(line);
-
-                break;
-            case ERROR:
-                break;
-            default:
-        }
-        return newState;
-    }
-
-    private State startProcessLine(State state, String line) {
-        State newState = state;
-        if (line.trim().equals(METADATA_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE)) {
-            newState = State.PROCESS_METADATA;
-        } else {
-            reportError(line);
-        }
-        return newState;
-    }
-
-    private State processMetaData(State state, String line) {
-        State newState = state;
-        String[] metaSplit = line.split(SEPERATOR_MF_ATTRIBUTE);
-        if (metaSplit.length < 2){
-            reportError(line);
-            return state;
-        }
-        if (!metaSplit[0].equals(SOURCE_MF_ATTRIBUTE)){
-            String value = line.replace(metaSplit[0] + SEPERATOR_MF_ATTRIBUTE, "").trim();
-            metadata.put(metaSplit[0],value);
-        } else {
-            newState = State.PROCESS_SOURCES;
-            processSourceLine(line);
-        }
-        return newState;
-    }
-
-    private void processSourceLine(String line) {
-        if (line.startsWith(SOURCE_MF_ATTRIBUTE+SEPERATOR_MF_ATTRIBUTE)){
-            String value = line.replaceAll(SOURCE_MF_ATTRIBUTE + SEPERATOR_MF_ATTRIBUTE, "").trim();
-            sources.add(value);
-        }else {
-            reportError(line);
-        }
-    }
-
-    private void reportError(String line) {
-        errors.add(getErrorWithParameters(Messages.MANIFEST_INVALID_LINE.getErrorMessage(), line));
-        state = State.ERROR;
-    }
-
-    private ImmutableList<String> readAllLines(InputStream is) throws IOException {
-        ImmutableList.Builder<String> builder = ImmutableList.<String> builder();
-        try (Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8.newDecoder());
-             BufferedReader bufferedReader = new BufferedReader(reader);) {
-            for (; ; ) {
-                String line = bufferedReader.readLine();
-                if (line == null)
-                    break;
-                builder.add(line);
-            }
-        }
-        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();
-    }
-}
index 037e76a..6f06289 100644 (file)
@@ -27,8 +27,8 @@ import java.io.IOException;
 import org.apache.commons.io.IOUtils;
 import java.util.List;
 
-import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.TOSCA_META_ENTRY_DEFINITIONS;
-import static org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.CSARConstants.SEPERATOR_MF_ATTRIBUTE;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ENTRY_DEFINITIONS;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.SEPERATOR_MF_ATTRIBUTE;
 
 public class OnboardingToscaMetadata {
 
diff --git a/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/resources/nonManoConfig.yaml b/openecomp-be/backend/openecomp-sdc-vendor-software-product-manager/src/main/resources/nonManoConfig.yaml
new file mode 100644 (file)
index 0000000..b7e4b5b
--- /dev/null
@@ -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
index a858e18..6e9d1ea 100644 (file)
@@ -409,7 +409,7 @@ public class VendorSoftwareProductManagerImplTest {
   }
 
   @Test
-  public void testCreatePackage() {
+  public void testCreatePackage() throws IOException {
     /*VspDetails vspDetailsMock = new VspDetails("vspId", new Version(1, 0));
     doReturn(vspDetailsMock).when(vspInfoDaoMock).get(anyObject());*/
     VersionInfo versionInfo = new VersionInfo();
index f1f8423..adb8c5f 100644 (file)
@@ -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 (file)
index 0000000..69ce97e
--- /dev/null
@@ -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);
+}
index 450acd6..08e8a08 100644 (file)
             <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 (file)
index 0000000..e2f9a4e
--- /dev/null
@@ -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 (file)
index 0000000..b3002ab
--- /dev/null
@@ -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 (file)
index 0000000..e10c102
--- /dev/null
@@ -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 (file)
index 0000000..c444e66
--- /dev/null
@@ -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 (file)
index 0000000..ae69415
--- /dev/null
@@ -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 (file)
index 0000000..32c6b1c
--- /dev/null
@@ -0,0 +1,7 @@
+nonManoKeyFolderMapping:
+  Some:
+    location: VES_EVENTS
+    type: Deployment
+  Other:
+    location: VES_EVENTS
+    type: Informational
\ No newline at end of file
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar;
+package org.openecomp.sdc.tosca.csar;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -28,12 +28,16 @@ public class CSARConstants {
     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 (file)
index 0000000..2aac3a7
--- /dev/null
@@ -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 (file)
index 0000000..8858128
--- /dev/null
@@ -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);
+    }
+}
  * limitations under the License.
  */
 
-package org.openecomp.sdc.vendorsoftwareproduct.upload.csar;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
+package org.openecomp.sdc.tosca.csar;
 
+import org.junit.Test;
 import org.openecomp.sdc.common.errors.Messages;
-import org.openecomp.sdc.vendorsoftwareproduct.impl.orchestration.csar.OnboardingManifest;
 
 import java.io.IOException;
 import java.io.InputStream;
-import org.testng.annotations.Test;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 
 public class ManifestParsingTest {
@@ -34,7 +33,7 @@ public class ManifestParsingTest {
   public void testSuccessfulParsing() throws IOException {
     try (InputStream is = getClass()
         .getResourceAsStream("/vspmanager.csar/manifest/ValidTosca.mf")) {
-      OnboardingManifest onboardingManifest = new OnboardingManifest(is);
+      Manifest onboardingManifest = OnboardingManifest.parse(is);
       assertTrue(onboardingManifest.isValid());
       assertEquals(onboardingManifest.getMetadata().size(), 4);
       assertEquals(onboardingManifest.getSources().size(), 5);
@@ -45,7 +44,7 @@ public class ManifestParsingTest {
   public void testNoMetadataParsing() throws IOException {
     try (InputStream is = getClass()
         .getResourceAsStream("/vspmanager.csar/manifest/InvalidTosca1.mf")) {
-      OnboardingManifest onboardingManifest = new OnboardingManifest(is);
+      Manifest onboardingManifest = OnboardingManifest.parse(is);
       assertFalse(onboardingManifest.isValid());
       assertTrue(onboardingManifest.getErrors().stream().anyMatch(error -> error
           .contains(Messages.MANIFEST_INVALID_LINE.getErrorMessage().substring(0, 10))));
@@ -56,7 +55,7 @@ public class ManifestParsingTest {
   public void testBrokenMDParsing() throws IOException {
     try (InputStream is = getClass()
         .getResourceAsStream("/vspmanager.csar/manifest/InvalidTosca2.mf")) {
-      OnboardingManifest onboardingManifest = new OnboardingManifest(is);
+      Manifest onboardingManifest = OnboardingManifest.parse(is);
       assertFalse(onboardingManifest.isValid());
       assertTrue(onboardingManifest.getErrors().stream().anyMatch(error -> error
           .contains(Messages.MANIFEST_INVALID_LINE.getErrorMessage().substring(0, 10))));
@@ -67,12 +66,49 @@ public class ManifestParsingTest {
   public void testNoMetaParsing() throws IOException {
     try (InputStream is = getClass()
         .getResourceAsStream("/vspmanager.csar/manifest/InvalidTosca4.mf")) {
-      OnboardingManifest onboardingManifest = new OnboardingManifest(is);
+      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 (file)
index 0000000..9cced6b
--- /dev/null
@@ -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 (file)
index 0000000..cfe6bc4
--- /dev/null
@@ -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/ValidNonManoTosca.mf b/openecomp-be/lib/openecomp-tosca-lib/src/test/resources/vspmanager.csar/manifest/ValidNonManoTosca.mf
new file mode 100644 (file)
index 0000000..25ec14c
--- /dev/null
@@ -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
+
+