summaryrefslogtreecommitdiffstats
path: root/openecomp-be/lib
diff options
context:
space:
mode:
Diffstat (limited to 'openecomp-be/lib')
-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.java27
-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.java214
-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.java215
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/nonManoConfig.yaml5
-rw-r--r--openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/vnfPackage/vnf1/Definitions/MainServiceTemplate.yaml97
-rw-r--r--openecomp-be/lib/openecomp-tosca-lib/src/main/java/org/openecomp/sdc/tosca/csar/CSARConstants.java7
6 files changed, 469 insertions, 96 deletions
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
index a6b58167f9..0a271c9d87 100644
--- 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
@@ -20,10 +20,14 @@
package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.Optional;
import org.openecomp.core.utilities.file.FileContentHandler;
import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
import org.openecomp.sdc.tosca.csar.Manifest;
-import java.io.IOException;
+import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
public interface ETSIService {
@@ -38,11 +42,22 @@ public interface ETSIService {
boolean isSol004WithToscaMetaDirectory(FileContentHandler handler) throws IOException;
/**
- * Update file structure. Moves non mano files to Artifacts/Deployment/non mano key location
- * @param handler
- * @param manifest
+ * Update file structure. Moves non mano files to the correct folder based on the manifest non mano type.
+ *
+ * @param handler The file handler containing the artifacts to move.
+ * @return A Map with pairs of from and to path of the moved artifacts.
+ */
+ Optional<Map<String, Path>> moveNonManoFileToArtifactFolder(final FileContentHandler handler)
+ throws IOException;
+
+ /**
+ * Updates the main descriptor paths referring the artifacts that were moved.
+ *
+ * @param toscaServiceModel The tosca service model containing the main descriptor.
+ * @param fromToMovedArtifactMap A Map representing the from and to artifacts path changes.
*/
- void moveNonManoFileToArtifactFolder(FileContentHandler handler, Manifest manifest);
+ void updateMainDescriptorPaths(final ToscaServiceModel toscaServiceModel,
+ final Map<String, Path> fromToMovedArtifactMap);
/**
* Retrieves the manifest file from the CSAR
@@ -64,4 +79,6 @@ public interface ETSIService {
* @throws IOException when TOSCA.meta file or manifest file is invalid
*/
ResourceTypeEnum getResourceType(Manifest manifest) throws IOException;
+
+ Path getOriginalManifestPath(final FileContentHandler handler) throws IOException;
}
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
index 1b74b0094f..e727078daa 100644
--- 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
@@ -20,40 +20,54 @@
package org.openecomp.sdc.vendorsoftwareproduct.services.impl.etsi;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.ARTIFACTS_FOLDER;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_MF_FILE_NAME;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.MANIFEST_PNF_METADATA;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ENTRY_DEFINITIONS;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_CHANGE_LOG;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_MANIFEST;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ORIG_PATH_FILE_NAME;
+import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_PATH_FILE_NAME;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.io.IOUtils;
+import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
import org.onap.sdc.tosca.parser.utils.YamlToObjectConverter;
+import org.onap.sdc.tosca.services.YamlUtil;
import org.openecomp.core.utilities.file.FileContentHandler;
import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
import org.openecomp.sdc.tosca.csar.Manifest;
import org.openecomp.sdc.tosca.csar.OnboardingToscaMetadata;
import org.openecomp.sdc.tosca.csar.SOL004ManifestOnboarding;
import org.openecomp.sdc.tosca.csar.ToscaMetadata;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Map;
-
-import static org.openecomp.sdc.tosca.csar.CSARConstants.MAIN_SERVICE_TEMPLATE_MF_FILE_NAME;
-import static org.openecomp.sdc.tosca.csar.CSARConstants.MANIFEST_PNF_METADATA;
-import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ENTRY_DEFINITIONS;
-import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_CHANGE_LOG;
-import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ETSI_ENTRY_MANIFEST;
-import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_ORIG_PATH_FILE_NAME;
-import static org.openecomp.sdc.tosca.csar.CSARConstants.TOSCA_META_PATH_FILE_NAME;
+import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
public class ETSIServiceImpl implements ETSIService {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ETSIServiceImpl.class);
+
private Configuration configuration;
public ETSIServiceImpl() throws IOException {
- InputStream io = getClass().getClassLoader().getResourceAsStream("nonManoConfig.yaml");
+ final 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();
+ final String data = IOUtils.toString(io, StandardCharsets.UTF_8);
+ final YamlToObjectConverter yamlToObjectConverter = new YamlToObjectConverter();
configuration = yamlToObjectConverter.convertFromString(data, Configuration.class);
}
@@ -63,52 +77,136 @@ public class ETSIServiceImpl implements ETSIService {
@Override
public boolean isSol004WithToscaMetaDirectory(FileContentHandler handler) throws IOException {
- Map<String, byte[]> templates = handler.getFiles();
+ final Map<String, byte[]> templates = handler.getFiles();
return isMetaFilePresent(templates) && hasMetaMandatoryEntries(getMetadata(handler));
}
@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);
+ public Optional<Map<String, Path>> moveNonManoFileToArtifactFolder(final FileContentHandler handler) throws IOException {
+ final Manifest manifest;
+ try {
+ manifest = getManifest(handler);
+ } catch (final IOException ex) {
+ if (LOGGER.isErrorEnabled()) {
+ LOGGER.error("An error occurred while getting the manifest file", ex);
+ }
+ throw ex;
+ }
+ final Path originalManifestPath;
+ try {
+ originalManifestPath = getOriginalManifestPath(handler);
+ } catch (final IOException ex) {
+ if (LOGGER.isErrorEnabled()) {
+ LOGGER.error("An error occurred while getting the original manifest path", ex);
+ }
+ throw ex;
}
+ final Map<String, Path> fromToPathMap = new HashMap<>();
+ final Map<String, NonManoType> nonManoKeyFolderMapping = configuration.getNonManoKeyFolderMapping();
+ manifest.getNonManoSources().entrySet().stream()
+ .filter(manifestNonManoSourceEntry -> nonManoKeyFolderMapping.containsKey(manifestNonManoSourceEntry.getKey()))
+ .forEach(manifestNonManoSourceEntry -> {
+ final NonManoType nonManoType = nonManoKeyFolderMapping.get(manifestNonManoSourceEntry.getKey());
+ final List<String> nonManoFileList = manifestNonManoSourceEntry.getValue();
+ final Map<String, Path> actualFromToPathMap = nonManoFileList.stream()
+ .map(nonManoFilePath -> {
+ final Path normalizedFilePath = resolveNonManoFilePath(originalManifestPath, nonManoFilePath);
+ final Optional<Path> changedPath = updateNonManoPathInHandler(handler, nonManoType, normalizedFilePath);
+ if (changedPath.isPresent()) {
+ final Map<String, Path> fromAndToPathMap = new HashMap<>();
+ fromAndToPathMap.put(nonManoFilePath, Paths.get(ARTIFACTS_FOLDER).resolve(changedPath.get()));
+ return fromAndToPathMap;
+ }
+ return null;
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toMap(
+ fromToPathEntry -> fromToPathEntry.keySet().iterator().next(),
+ fromToPathEntry -> fromToPathEntry.values().iterator().next()
+ ));
+ fromToPathMap.putAll(actualFromToPathMap);
+ });
+
+ return MapUtils.isEmpty(fromToPathMap) ? Optional.empty() : Optional.of(fromToPathMap);
}
+ /**
+ * Resolves the non mano file path based on the original manifest path of the onboarded package.
+ *
+ * @param originalManifestPath The original path from the onboarded package manifest
+ * @param nonManoFilePath The non mano file path defined in the manifest
+ * @return The resolved and normalized non mano path.
+ */
+ private Path resolveNonManoFilePath(final Path originalManifestPath, final String nonManoFilePath) {
+ return originalManifestPath.resolve(Paths.get(nonManoFilePath)).normalize();
+ }
- 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);
+ /**
+ * Updates the non mano file path in the package file handler based on the non mano type.
+ *
+ * @param handler The package file handler
+ * @param nonManoType The Non Mano type of the file to update
+ * @param nonManoOriginalFilePath The Non Mano file original path
+ * @return The new file path if it was updated in the package file handler, otherwise empty.
+ */
+ private Optional<Path> updateNonManoPathInHandler(final FileContentHandler handler, final NonManoType nonManoType,
+ final Path nonManoOriginalFilePath) {
+ final Path fixedSourcePath = fixNonManoPath(nonManoOriginalFilePath);
+ final Map<String, byte[]> packageFileMap = handler.getFiles();
+ if (packageFileMap.containsKey(fixedSourcePath.toString())) {
+ final Path newNonManoPath = Paths.get(nonManoType.getType(), nonManoType.getLocation()
+ , fixedSourcePath.getFileName().toString());
+ if (!packageFileMap.containsKey(newNonManoPath.toString())) {
+ packageFileMap.put(newNonManoPath.toString(), packageFileMap.remove(fixedSourcePath.toString()));
+ return Optional.of(newNonManoPath);
}
}
+
+ return Optional.empty();
}
- private void updateLocation(String key, String nonManoKey, Map<String, byte[]> files) {
- if (nonManoKey == null || nonManoKey.isEmpty()) {
- return;
+ /**
+ * Fix the original non mano file path to the ONAP package file path.
+ *
+ * Non mano artifacts that were inside the {@link org.openecomp.sdc.tosca.csar.CSARConstants#ARTIFACTS_FOLDER} path
+ * are not moved when parsed to ONAP package, but the Manifest declaration can still have the {@link
+ * org.openecomp.sdc.tosca.csar.CSARConstants#ARTIFACTS_FOLDER} reference in it. If so, that reference is removed.
+ *
+ * @param nonManoOriginalFilePath The original non mano file path
+ * @return The non mano fixed path to ONAP package structure.
+ */
+ private Path fixNonManoPath(final Path nonManoOriginalFilePath) {
+ final Path rootArtifactsPath = Paths.get("/", ARTIFACTS_FOLDER);
+ if (nonManoOriginalFilePath.startsWith(rootArtifactsPath)) {
+ return rootArtifactsPath.relativize(nonManoOriginalFilePath);
}
- 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));
- }
+ final Path relativeArtifactsPath = Paths.get(ARTIFACTS_FOLDER);
+ if (nonManoOriginalFilePath.startsWith(relativeArtifactsPath)) {
+ return relativeArtifactsPath.relativize(nonManoOriginalFilePath);
}
+
+ return nonManoOriginalFilePath;
}
- private String getFileName(String key) {
- return key.substring(key.lastIndexOf('/') + 1);
+ @Override
+ public void updateMainDescriptorPaths(final ToscaServiceModel toscaServiceModel,
+ final Map<String, Path> fromToMovedArtifactMap) {
+ final ServiceTemplate entryDefinition = toscaServiceModel.getServiceTemplates()
+ .get(toscaServiceModel.getEntryDefinitionServiceTemplate());
+ final YamlUtil yamlUtil = new YamlUtil();
+ final String[] entryDefinitionYaml = {yamlUtil.objectToYaml(entryDefinition)};
+ fromToMovedArtifactMap.forEach((fromPath, toPath) -> entryDefinitionYaml[0] = entryDefinitionYaml[0]
+ .replaceAll(fromPath, toPath.toString()));
+
+ toscaServiceModel.addServiceTemplate(toscaServiceModel.getEntryDefinitionServiceTemplate()
+ , yamlUtil.yamlToObject(entryDefinitionYaml[0], ServiceTemplate.class));
}
- private boolean hasMetaMandatoryEntries(ToscaMetadata toscaMetadata) {
- Map<String, String> metaDataEntries = toscaMetadata.getMetaEntries();
- return metaDataEntries.containsKey(TOSCA_META_ENTRY_DEFINITIONS) && metaDataEntries.containsKey(TOSCA_META_ETSI_ENTRY_MANIFEST)
- && metaDataEntries.containsKey(TOSCA_META_ETSI_ENTRY_CHANGE_LOG);
+ private boolean hasMetaMandatoryEntries(final ToscaMetadata toscaMetadata) {
+ final Map<String, String> metaDataEntries = toscaMetadata.getMetaEntries();
+ return metaDataEntries.containsKey(TOSCA_META_ENTRY_DEFINITIONS) && metaDataEntries
+ .containsKey(TOSCA_META_ETSI_ENTRY_MANIFEST)
+ && metaDataEntries.containsKey(TOSCA_META_ETSI_ENTRY_CHANGE_LOG);
}
private boolean isMetaFilePresent(Map<String, byte[]> handler) {
@@ -125,7 +223,7 @@ public class ETSIServiceImpl implements ETSIService {
// Valid manifest should contain whether vnf or pnf related metadata data exclusively in SOL004 standard,
// validation of manifest done during package upload stage
if (manifest != null && !manifest.getMetadata().isEmpty()
- && MANIFEST_PNF_METADATA.stream().anyMatch(e -> manifest.getMetadata().containsKey(e))) {
+ && MANIFEST_PNF_METADATA.stream().anyMatch(e -> manifest.getMetadata().containsKey(e))) {
return ResourceTypeEnum.PNF;
}
// VNF is default resource type
@@ -138,25 +236,43 @@ public class ETSIServiceImpl implements ETSIService {
}
private Manifest getManifest(FileContentHandler handler, String manifestLocation) throws IOException {
- try(InputStream manifestInputStream = getManifestInputStream(handler, manifestLocation)) {
+ try (InputStream manifestInputStream = getManifestInputStream(handler, manifestLocation)) {
Manifest onboardingManifest = new SOL004ManifestOnboarding();
onboardingManifest.parse(manifestInputStream);
return onboardingManifest;
}
}
+ public Path getOriginalManifestPath(final FileContentHandler handler) throws IOException {
+ final ToscaMetadata metadata = getOriginalMetadata(handler);
+ final String originalMetadataPath = metadata.getMetaEntries().get(TOSCA_META_ETSI_ENTRY_MANIFEST);
+ final Path path = Paths.get(originalMetadataPath);
+ return path.getParent() == null ? Paths.get("") : path.getParent();
+ }
+
private ToscaMetadata getMetadata(FileContentHandler handler) throws IOException {
ToscaMetadata metadata;
if (handler.containsFile(TOSCA_META_PATH_FILE_NAME)) {
- metadata = OnboardingToscaMetadata.parseToscaMetadataFile(handler.getFileContent(TOSCA_META_PATH_FILE_NAME));
+ metadata = OnboardingToscaMetadata
+ .parseToscaMetadataFile(handler.getFileContent(TOSCA_META_PATH_FILE_NAME));
} else if (handler.containsFile(TOSCA_META_ORIG_PATH_FILE_NAME)) {
- metadata = OnboardingToscaMetadata.parseToscaMetadataFile(handler.getFileContent(TOSCA_META_ORIG_PATH_FILE_NAME));
+ metadata = OnboardingToscaMetadata
+ .parseToscaMetadataFile(handler.getFileContent(TOSCA_META_ORIG_PATH_FILE_NAME));
} else {
throw new IOException("TOSCA.meta file not found!");
}
return metadata;
}
+ private ToscaMetadata getOriginalMetadata(final FileContentHandler handler) throws IOException {
+ if (handler.containsFile(TOSCA_META_ORIG_PATH_FILE_NAME)) {
+ return OnboardingToscaMetadata
+ .parseToscaMetadataFile(handler.getFileContent(TOSCA_META_ORIG_PATH_FILE_NAME));
+ } else {
+ throw new IOException(String.format("%s file not found", TOSCA_META_ORIG_PATH_FILE_NAME));
+ }
+ }
+
private InputStream getManifestInputStream(FileContentHandler handler, String manifestLocation) throws IOException {
InputStream io;
if (manifestLocation == null || !handler.containsFile(manifestLocation)) {
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
index dc456a1970..3d70948b2f 100644
--- 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
@@ -20,47 +20,62 @@
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 static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.io.IOException;
+import java.io.InputStream;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
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;
+import java.util.Optional;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.sdc.tosca.datatypes.model.ServiceTemplate;
+import org.onap.sdc.tosca.parser.utils.YamlToObjectConverter;
+import org.onap.sdc.tosca.services.YamlUtil;
+import org.openecomp.core.utilities.file.FileContentHandler;
+import org.openecomp.sdc.tosca.csar.Manifest;
+import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
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" +
- "ETSI-Entry-Manifest: MainServiceTemplate.mf\n" +
- "ETSI-Entry-Change-Log: MainServiceTemplate.log";
+ "CSAR-Version: 1.0\n" +
+ "Created-By: Kuku\n" +
+ "Entry-Definitions: MainServiceTemplate.yaml\n" +
+ "ETSI-Entry-Manifest: MainServiceTemplate.mf\n" +
+ "ETSI-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";
+ "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);
+ etsiService = Mockito.spy(new ETSIServiceImpl(configuration));
}
@After
@@ -71,42 +86,60 @@ public class ETSIServiceImplTest {
@Test
public void testIsSol004TrueOrigin() throws IOException {
FileContentHandler fileContentHandler = new FileContentHandler();
- fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta.original", sol004MetaFile.getBytes(StandardCharsets.UTF_8));
+ fileContentHandler
+ .addFile("TOSCA-Metadata/TOSCA.meta.original", sol004MetaFile.getBytes(StandardCharsets.UTF_8));
assertTrue(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
}
@Test
- public void testIsSol004True() throws IOException {
+ public void testIsSol004True() throws IOException {
FileContentHandler fileContentHandler = new FileContentHandler();
fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta", sol004MetaFile.getBytes(StandardCharsets.UTF_8));
assertTrue(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
}
@Test
- public void testIsSol004False() throws IOException {
+ public void testIsSol004False() throws IOException {
FileContentHandler fileContentHandler = new FileContentHandler();
fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta.original", metaFile.getBytes(StandardCharsets.UTF_8));
assertFalse(etsiService.isSol004WithToscaMetaDirectory(fileContentHandler));
}
@Test
- public void testIsSol004FalseWithNull() throws IOException {
+ public void testIsSol004FalseWithNull() throws IOException {
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();
+ final Map<String, List<String>> nonManoTypeAndSourceMapInManifest = new HashMap<>();
+ nonManoTypeAndSourceMapInManifest.put("Some", Collections.singletonList("Some/test.xml"));
+ final Manifest manifest = mock(Manifest.class);
+ when(manifest.getNonManoSources()).thenReturn(nonManoTypeAndSourceMapInManifest);
+ final 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));
+ fileContentHandler.addFile("TOSCA-Metadata/TOSCA.meta.original", new byte[1]);
+ fileContentHandler.addFile("MainServiceTemplate.mf", new byte[1]);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("")).when(etsiService).getOriginalManifestPath(fileContentHandler);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler);
+ assertThat("Should contain moved file", fileContentHandler.getFileList(), hasItem(finalNonManoLocation));
+ }
+
+
+ @Test
+ public void testMoveNonManoFileInArtifactFolderToNonManoOnapPath() throws IOException {
+ final Map<String, List<String>> nonManoTypeAndSourceMapInManifest = new HashMap<>();
+ nonManoTypeAndSourceMapInManifest.put("Some", Collections.singletonList("Artifacts/Some/test.xml"));
+ final FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("Some/test.xml", new byte[1]);
+ final Manifest manifest = mock(Manifest.class);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("")).when(etsiService).getOriginalManifestPath(fileContentHandler);
+ when(manifest.getNonManoSources()).thenReturn(nonManoTypeAndSourceMapInManifest);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler);
+ assertThat("Should contain moved file", fileContentHandler.getFileList(), hasItem(finalNonManoLocation));
}
@Test
@@ -118,8 +151,11 @@ public class ETSIServiceImplTest {
FileContentHandler fileContentHandler = new FileContentHandler();
fileContentHandler.addFile("test.xml", new byte[1]);
Manifest manifest = mock(Manifest.class);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("")).when(etsiService).getOriginalManifestPath(fileContentHandler);
when(manifest.getNonManoSources()).thenReturn(nonManoSources);
- etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler);
+ String finalOtherNonManoLocation = "Informational/OTHER/test.xml";
assertFalse(fileContentHandler.containsFile(finalOtherNonManoLocation));
}
@@ -132,8 +168,10 @@ public class ETSIServiceImplTest {
FileContentHandler fileContentHandler = new FileContentHandler();
fileContentHandler.addFile(finalNonManoLocation, new byte[1]);
Manifest manifest = mock(Manifest.class);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("")).when(etsiService).getOriginalManifestPath(fileContentHandler);
when(manifest.getNonManoSources()).thenReturn(nonManoSources);
- etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler);
assertTrue(fileContentHandler.containsFile(finalNonManoLocation));
}
@@ -144,10 +182,111 @@ public class ETSIServiceImplTest {
sources.add("Artifacts/Deployment/test.xml");
nonManoSources.put("Some", sources);
FileContentHandler fileContentHandler = new FileContentHandler();
- fileContentHandler.addFile("Artifacts/Deployment/test.xml", new byte[1]);
+ fileContentHandler.addFile("Deployment/test.xml", new byte[1]);
Manifest manifest = mock(Manifest.class);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("")).when(etsiService).getOriginalManifestPath(fileContentHandler);
when(manifest.getNonManoSources()).thenReturn(nonManoSources);
- etsiService.moveNonManoFileToArtifactFolder(fileContentHandler, manifest);
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler);
assertTrue(fileContentHandler.containsFile(finalNonManoLocation));
}
+
+ @Test
+ public void givenManifestNotInRoot_moveNonManoFileToNonManoOnapFolder() throws IOException {
+ //given manifest non mano files under key "onap_other", inside and outside Artifacts folder,
+ // with relative and absolute paths.
+ final Map<String, List<String>> nonManoTypeAndSourceMapInManifest = new HashMap<>();
+ nonManoTypeAndSourceMapInManifest.put("onap_other",
+ Arrays.asList("../../Artifacts/Artifacts/Deployment/relativePathInsideSubArtifact.xml",
+ "../../Files/scriptInFilesPath.sh",
+ "/Artifacts/Deployment/absolutePathInsideArtifact.xml"));
+ //given ONAP package fileHandler
+ final FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("Artifacts/Deployment/relativePathInsideSubArtifact.xml", new byte[1]);
+ fileContentHandler.addFile("Deployment/absolutePathInsideArtifact.xml", new byte[1]);
+ fileContentHandler.addFile("Files/scriptInFilesPath.sh", new byte[1]);
+ //given onboarded manifest in two/lvlFolder folder
+ final Manifest manifest = mock(Manifest.class);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("two/lvlFolder")).when(etsiService).getOriginalManifestPath(fileContentHandler);
+ when(manifest.getNonManoSources()).thenReturn(nonManoTypeAndSourceMapInManifest);
+ //when files are non mano moved
+ etsiService.moveNonManoFileToArtifactFolder(fileContentHandler);
+ assertThat("Should contain moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/OTHER/relativePathInsideSubArtifact.xml"));
+ assertThat("Should contain moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/OTHER/absolutePathInsideArtifact.xml"));
+ assertThat("Should contain moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/OTHER/scriptInFilesPath.sh"));
+ }
+
+ @Test
+ public void givenManifestInRoot_moveNonManoFileToNonManoOnapFolder() throws IOException {
+ //given manifest non mano files under key "onap_other", inside and outside Artifacts folder
+ final Map<String, List<String>> nonManoSourceMap = new HashMap<>();
+ nonManoSourceMap.put("onap_other",
+ Arrays.asList("Artifacts/Deployment/ANOTHER/authorized_keys",
+ "Files/scriptInFilesPath.sh")
+ );
+ //given manifest non mano file under key "Some"
+ nonManoSourceMap.put("Some",
+ Collections.singletonList("Files/willMoveToSome.sh")
+ );
+ //given ONAP package fileHandler
+ final FileContentHandler fileContentHandler = new FileContentHandler();
+ fileContentHandler.addFile("Deployment/ANOTHER/authorized_keys", new byte[1]);
+ fileContentHandler.addFile("Files/scriptInFilesPath.sh", new byte[1]);
+ fileContentHandler.addFile("Files/willMoveToSome.sh", new byte[1]);
+ fileContentHandler.addFile("Deployment/willNotMove.xml", new byte[1]);
+ //given onboarded manifest in root folder
+ final Manifest manifest = mock(Manifest.class);
+ when(manifest.getNonManoSources()).thenReturn(nonManoSourceMap);
+ doReturn(manifest).when(etsiService).getManifest(fileContentHandler);
+ doReturn(Paths.get("")).when(etsiService).getOriginalManifestPath(fileContentHandler);
+ final Optional<Map<String, Path>> fromToPathMap = etsiService
+ .moveNonManoFileToArtifactFolder(fileContentHandler);
+ assertThat("Files should be moved", fromToPathMap.isPresent(), is(true));
+ assertThat("Should contain moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/OTHER/authorized_keys"));
+ assertThat("Should contain moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/OTHER/scriptInFilesPath.sh"));
+ assertThat("Should contain moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/VES_EVENTS/willMoveToSome.sh"));
+ assertThat("Should contain not moved file", fileContentHandler.getFileList(),
+ hasItem("Deployment/willNotMove.xml"));
+ }
+
+ @Test
+ public void givenMovedFiles_updateDescriptorReferences() {
+ //given moved files
+ final Map<String, Path> fromToPathMap = new HashMap<>();
+ final String file1OriginalPath = "Artifacts/Deployment/ANOTHER/authorized_keys";
+ final Path file1Path = Paths.get("Artifacts", "Deployment", "OTHER", "authorized_keys");
+ fromToPathMap.put(file1OriginalPath, file1Path);
+ final String file2OriginalPath = "Artifacts/Deployment/ANOTHER/image";
+ final Path file2Path = Paths.get("Artifacts", "Deployment", "OTHER", "image");
+ fromToPathMap.put(file2OriginalPath, file2Path);
+ //given main descriptor
+ final InputStream mainServiceTemplateYamlFile = getClass().getClassLoader()
+ .getResourceAsStream("vnfPackage/vnf1/Definitions/MainServiceTemplate.yaml");
+ final ServiceTemplate mainServiceTemplate = new YamlUtil()
+ .yamlToObject(mainServiceTemplateYamlFile, ServiceTemplate.class);
+ final HashMap<String, ServiceTemplate> serviceTemplateMap = new HashMap<>();
+ serviceTemplateMap.put("MainServiceTemplate.yaml", mainServiceTemplate);
+ final ToscaServiceModel toscaServiceModel = new ToscaServiceModel(null, serviceTemplateMap,
+ "MainServiceTemplate.yaml");
+ //when descriptor is updated
+ etsiService.updateMainDescriptorPaths(toscaServiceModel, fromToPathMap);
+ //then
+ final String serviceTemplatesAsYaml = new YamlUtil().objectToYaml(toscaServiceModel.getServiceTemplates());
+ assertThat("Descriptor should not contain reference to file", serviceTemplatesAsYaml,
+ not(containsString(file1OriginalPath)));
+ assertThat("Descriptor should not contain reference to file", serviceTemplatesAsYaml,
+ not(containsString(file2OriginalPath)));
+ assertThat("Descriptor should contain reference to file", serviceTemplatesAsYaml,
+ containsString(file1Path.toString()));
+ assertThat("Descriptor should contain reference to file", serviceTemplatesAsYaml,
+ containsString(file2Path.toString()));
+ }
+
}
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
index 32c6b1ce57..914e9ff59d 100644
--- 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
@@ -4,4 +4,7 @@ nonManoKeyFolderMapping:
type: Deployment
Other:
location: VES_EVENTS
- type: Informational \ No newline at end of file
+ type: Informational
+ onap_other:
+ location: OTHER
+ type: Deployment \ 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/resources/vnfPackage/vnf1/Definitions/MainServiceTemplate.yaml b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/vnfPackage/vnf1/Definitions/MainServiceTemplate.yaml
new file mode 100644
index 0000000000..3ed5f5ce00
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-vendor-software-product-lib/openecomp-sdc-vendor-software-product-core/src/test/resources/vnfPackage/vnf1/Definitions/MainServiceTemplate.yaml
@@ -0,0 +1,97 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+metadata:
+ VNFD_SCHEMA_VERSION: 2.5.1+1
+ template_name: Main
+ template_version: '1.0'
+ template_author: onap
+topology_template:
+ node_templates:
+ VDU_vgw_0:
+ type: tosca.nodes.nfv.Vdu.Compute
+ properties:
+ name:
+ get_input: vgw_name_0
+ description: vgw
+ vdu_profile:
+ min_number_of_instances: 1
+ max_number_of_instances: 1
+ watchdog: none
+ inject_files:
+ source_path: ../Artifacts/Deployment/ANOTHER/authorized_keys
+ dest_path: /home/ubuntu/.ssh/authorized_keys
+ meta_data:
+ vnf_id:
+ get_input: vnf_id
+ vf_module_id:
+ get_input: vf_module_id
+ mux_gw_private_net_ipaddr:
+ get_input: vgw_private_ip_0
+ oam_ipaddr:
+ get_input: vgw_private_ip_1
+ oam_cidr:
+ get_input: onap_private_net_cidr
+ cpe_public_net_cidr:
+ get_input: cpe_public_net_cidr
+ mux_gw_private_net_cidr:
+ get_input: mux_gw_private_net_cidr
+ mux_ip_addr:
+ get_input: mux_ip_addr
+ vg_vgmux_tunnel_vni:
+ get_input: vg_vgmux_tunnel_vni
+ install_script_version:
+ get_input: install_script_version
+ cloud_env:
+ get_input: cloud_env
+ nexus_artifact_repo:
+ get_input: nexus_artifact_repo
+ boot_data: |
+ #!/bin/bash
+ METADATA=`curl -s http://169.254.169.254/openstack/2012-08-10/meta_data.json`
+ apt-get -y install jq
+
+ get_metadata () {
+ echo $METADATA | jq -r ".meta.$1"
+ }
+
+ # Create configuration files
+ mkdir /opt/config
+ echo "$(get_metadata oam_ipaddr)" > /opt/config/oam_ipaddr.txt
+ echo "$(get_metadata oam_cidr)" > /opt/config/oam_cidr.txt
+ echo "$(get_metadata cpe_public_net_cidr)" > /opt/config/cpe_public_net_cidr.txt
+ echo "$(get_metadata mux_gw_private_net_ipaddr)" > /opt/config/mux_gw_private_net_ipaddr.txt
+ echo "$(get_metadata mux_gw_private_net_cidr)" > /opt/config/mux_gw_private_net_cidr.txt
+ echo "$(get_metadata install_script_version)" > /opt/config/install_script_version.txt
+ echo "$(get_metadata cloud_env)" > /opt/config/cloud_env.txt
+ echo "$(get_metadata mux_ip_addr)" > /opt/config/mux_ip_addr.txt
+ echo "$(get_metadata vg_vgmux_tunnel_vni)" > /opt/config/vg_vgmux_tunnel_vni.txt
+ echo "$(get_metadata nexus_artifact_repo)" > /opt/config/nexus_artifact_repo.txt
+
+ # Download and run install script
+ apt-get -y install unzip
+ INSTALL_SCRIPT_VERSION=$(get_metadata install_script_version)
+ NEXUS_ARTIFACT_REPO=$(get_metadata nexus_artifact_repo)
+ if [[ "${INSTALL_SCRIPT_VERSION}" =~ "SNAPSHOT" ]]; then REPO=snapshots; else REPO=releases; fi
+ curl -k -L "${NEXUS_ARTIFACT_REPO}/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.demo.vnf.vcpe&a=vcpe-scripts&e=zip&v=${INSTALL_SCRIPT_VERSION}" -o /opt/vcpe-scripts-${INSTALL_SCRIPT_VERSION}.zip
+ unzip -j /opt/vcpe-scripts-${INSTALL_SCRIPT_VERSION}.zip -d /opt v_gw_install.sh
+ cd /opt
+ chmod +x v_gw_install.sh
+ ./v_gw_install.sh
+ capabilities:
+ virtual_compute:
+ properties:
+ virtual_memory:
+ virtual_mem_size: 4096 MB
+ vdu_mem_requirements:
+ memoryPageSize: '{"schemaVersion": "0", "schemaSelector": "", "hardwarePlatform":
+ "generic", "mandatory": "true", "configurationValue": "2 MB"}'
+ numberOfPages: '{"schemaVersion": "0","schemaSelector": "","hardwarePlatform":
+ "generic","mandatory": "true", "configurationValue": "1024"}'
+ virtual_cpu:
+ num_virtual_cpu: 2
+ cpu_architecture: generic
+ virtual_local_storage:
+ - size_of_storage: 40 GB
+ artifacts:
+ sw_image:
+ type: tosca.artifacts.nfv.SwImage
+ file: ../Artifacts/Deployment/ANOTHER/image \ 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
index 06e2de1628..7a42758322 100644
--- 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
@@ -25,14 +25,15 @@ public class CSARConstants {
public static final ImmutableSet<String> ELIGBLE_FOLDERS = of("Artifacts/","Definitions/",
"Licenses/", "TOSCA-Metadata/");
+ public static final String ARTIFACTS_FOLDER = "Artifacts";
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_PATH_FILE_NAME = "TOSCA-Metadata/TOSCA.meta";
public static final String TOSCA_META_FILE_VERSION_ENTRY = "TOSCA-Meta-File-Version";
public static final String TOSCA_META_CSAR_VERSION_ENTRY = "CSAR-Version";
public static final String TOSCA_META_CREATED_BY_ENTRY = "Created-By";
- public static final String TOSCA_META_ENTRY_DEFINITIONS="Entry-Definitions";
+ public static final String TOSCA_META_ENTRY_DEFINITIONS ="Entry-Definitions";
public static final String TOSCA_META_ETSI_ENTRY_MANIFEST ="ETSI-Entry-Manifest";
public static final String TOSCA_META_ETSI_ENTRY_CHANGE_LOG ="ETSI-Entry-Change-Log";
public static final String TOSCA_META_ETSI_ENTRY_TESTS = "ETSI-Entry-Tests";
@@ -64,7 +65,7 @@ public class CSARConstants {
public static final String CMD_END = "----END CMS-----";
public static final String SEPARATOR_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";
+ public static final String TOSCA_META_ORIG_PATH_FILE_NAME = "TOSCA-Metadata/TOSCA.meta.original";
public static final String TOSCA_META_FILE_VERSION = "1.0";
public static final String CSAR_VERSION_1_0 = "1.0";