aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvasraz <vasyl.razinkov@est.tech>2023-10-03 14:55:02 +0100
committerVasyl Razinkov <vasyl.razinkov@est.tech>2023-10-03 13:57:10 +0000
commitd37d9e6adead6a6568aafb2ac831237de32fbdca (patch)
tree03cffa2a2119a369efed361feb804325dc2e3005
parent39dd951527bf62568cf5815a6b1e4901c2b89c3f (diff)
Fix 'missing properties after service import'-bug
Signed-off-by: Vasyl Razinkov <vasyl.razinkov@est.tech> Change-Id: Id8fa4c7d57e023a7e676a455bf5fae65cc6b9cf1 Issue-ID: SDC-4643
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CommonCsarGenerator.java86
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java18
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaRepresentation.java3
3 files changed, 86 insertions, 21 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CommonCsarGenerator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CommonCsarGenerator.java
index 16df325b24..677be6056d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CommonCsarGenerator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/CommonCsarGenerator.java
@@ -77,6 +77,7 @@ import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
import org.openecomp.sdc.be.dao.cassandra.SdcSchemaFilesCassandraDao;
import org.openecomp.sdc.be.data.model.ToscaImportByModel;
+import org.openecomp.sdc.be.datatypes.components.ResourceMetadataDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
@@ -110,6 +111,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.Yaml;
/**
@@ -240,7 +242,8 @@ public class CommonCsarGenerator {
addSchemaFilesFromCassandra(zip, schemaFileZip, nodesFromPackage, definitionsPath);
} else {
//retrieve schema files by model from Cassandra
- addSchemaFilesByModel(zip, component.getModel(), definitionsPath, addDependencies);
+ addSchemaFilesByModel(zip, component.getModel(), definitionsPath, addDependencies,
+ dependencies.stream().map(d -> d.getRight()).collect(Collectors.toList()));
}
Either<CsarDefinition, ResponseFormat> collectedComponentCsarDefinition = collectComponentCsarDefinition(component);
if (collectedComponentCsarDefinition.isRight()) {
@@ -396,8 +399,7 @@ public class CommonCsarGenerator {
for (Triple<String, String, Component> d : dependencies) {
String cassandraId = d.getMiddle();
Component childComponent = d.getRight();
- Either<byte[], ResponseFormat> entryData = getEntryData(cassandraId, childComponent).right()
- .map(componentsUtils::getResponseFormat);
+ Either<byte[], ResponseFormat> entryData = getEntryData(cassandraId, childComponent).right().map(componentsUtils::getResponseFormat);
if (entryData.isRight()) {
return Either.right(entryData.right().value());
}
@@ -548,9 +550,9 @@ public class CommonCsarGenerator {
final String definitionsPath) {
final int initSize = 2048;
LOGGER.debug("Starting copy from Schema file zip to CSAR zip");
- try (final ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(
- schemaFileZip)); final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
- byteArrayOutputStream, initSize)) {
+ try (final ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(schemaFileZip));
+ final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream, initSize)) {
ZipEntry entry;
while ((entry = zipInputStream.getNextEntry()) != null) {
ZipUtils.checkForZipSlipInRead(entry);
@@ -652,12 +654,13 @@ public class CommonCsarGenerator {
}
private void addSchemaFilesByModel(final ZipOutputStream zipOutputStream, final String modelName,
- final String definitionsPath, final boolean isSingleImportsFile) {
+ final String definitionsPath, final boolean isSingleImportsFile,
+ final List<Component> dependencies) {
try {
- final List<ToscaImportByModel> modelDefaultImportList = modelOperation.findAllModelImports(modelName, true);
final Set<Path> writtenEntryPathList = new HashSet<>();
- final var defsPath = Path.of(definitionsPath);
- Map<Path, byte[]> contentToMerge = new HashMap<>();
+ final Path defsPath = Path.of(definitionsPath);
+ final Map<Path, byte[]> contentToMerge = new HashMap<>();
+ final List<ToscaImportByModel> modelDefaultImportList = modelOperation.findAllModelImports(modelName, true);
for (final ToscaImportByModel toscaImportByModel : modelDefaultImportList) {
var importPath = Path.of(toscaImportByModel.getFullPath());
if (!isSingleImportsFile) {
@@ -694,6 +697,7 @@ public class CommonCsarGenerator {
zipOutputStream.putNextEntry(zipEntry);
writtenEntryPathList.add(entry.getKey());
mergingContent = mergeContent(mergingContent, entry.getValue());
+ mergingContent = updateMergingContentFromDependencies(mergingContent, dependencies);
zipOutputStream.write(mergingContent, 0, mergingContent.length);
zipOutputStream.closeEntry();
}
@@ -706,13 +710,72 @@ public class CommonCsarGenerator {
}
}
+ private byte[] updateMergingContentFromDependencies(final byte[] mergingContent, final List<Component> dependencies) {
+ final DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(FlowStyle.BLOCK);
+ final Yaml yaml = new Yaml(options);
+ final Map<String, Object> stringObjectMap = (Map<String, Object>) yaml.load(new String(mergingContent));
+ final Map<String, Object> nodeTypes = (Map<String, Object>) stringObjectMap.get("node_types");
+ for (final Component dependency : dependencies) {
+ final Map<String, Object> dependencyAsMap = yaml.load(yaml.dumpAsMap(dependency));
+ final String toscaResourceName = ((ResourceMetadataDataDefinition) dependency.getComponentMetadataDefinition()
+ .getMetadataDataDefinition()).getToscaResourceName();
+ final Map<String, Object> nodeType = (Map<String, Object>) nodeTypes.get(toscaResourceName);
+ final Map<String, Object> propertiesFromDependency = (Map<String, Object>) ((List) dependencyAsMap.get("properties"))
+ .stream().collect(Collectors.toMap(s -> ((Map<String, Object>) s).get("name"), s -> s));
+ if (MapUtils.isNotEmpty(nodeType) && MapUtils.isNotEmpty(propertiesFromDependency)) {
+ final Map<String, Object> propertiesFromMergingContent = (Map<String, Object>) nodeType.get("properties");
+ final Map<String, Object> updatedMap = updatePropertiesFromDependency(propertiesFromMergingContent, propertiesFromDependency);
+ nodeType.replace("properties", updatedMap);
+ nodeTypes.replace(toscaResourceName, nodeType);
+ }
+ }
+ stringObjectMap.replace("node_types", nodeTypes);
+ return yaml.dumpAsMap(stringObjectMap).getBytes();
+ }
+
+ private Map<String, Object> updatePropertiesFromDependency(final Map<String, Object> propertiesFromMergingContent,
+ final Map<String, Object> propertiesFromDependency) {
+ final Map<String, Object> result = new HashMap<>();
+ for (final Entry<String, Object> entry : propertiesFromDependency.entrySet()) {
+ final Map<String, Object> propertiesMap = new HashMap<>();
+ final String key = entry.getKey();
+ final Object value = entry.getValue();
+ if (propertiesFromMergingContent instanceof Map) {
+ final Object object = propertiesFromMergingContent.get(key);
+ if (object instanceof Map) {
+ ((Map<String, Object>) object).keySet().forEach(s ->
+ propertiesMap.put(s, ((Map<String, Object>) value).get(s))
+ );
+ } else {
+ propertiesMap.putAll(createProperties(value));
+ }
+ } else {
+ propertiesMap.putAll(createProperties(value));
+ }
+ result.put(key, propertiesMap);
+ }
+ return result;
+ }
+
+ private Map<String, Object> createProperties(final Object value) {
+ final Map<String, Object> propertiesMap = new HashMap<>();
+ propertiesMap.put("type", ((Map<String, Object>) value).get("type"));
+ propertiesMap.put("required", ((Map<String, Object>) value).get("required"));
+ final Object entrySchema = ((Map<String, Object>) value).get("entry_schema");
+ if (entrySchema != null) {
+ propertiesMap.put("entry_schema", entrySchema);
+ }
+ return propertiesMap;
+ }
+
private byte[] mergeContent(final byte[] first, final byte[] second) {
byte[] merged = new byte[0];
final Map<String, Object> firstMap = new Yaml().load(new String(first));
final Map<String, Object> secondMap = new Yaml().load(new String(second));
if (MapUtils.isNotEmpty(secondMap)) {
final DumperOptions options = new DumperOptions();
- options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
+ options.setDefaultFlowStyle(FlowStyle.BLOCK);
final Yaml yaml = new Yaml(options);
for (final Entry<String, Object> secondMapEntry : secondMap.entrySet()) {
final Map<String, Object> newMap = new HashMap<>();
@@ -1271,4 +1334,5 @@ public class CommonCsarGenerator {
}
}
+
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
index 8c802bc43e..163b67a44f 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
@@ -795,7 +795,7 @@ public class ToscaExportHandler {
private void addDependencies(final List<Map<String, Map<String, String>>> imports, final List<Triple<String, String, Component>> dependencies,
final Component fetchedComponent, final boolean isSkipImports) {
final Set<Component> componentsList = new LinkedHashSet<>();
- if (fetchedComponent instanceof Resource && !isSkipImports) {
+ if (fetchedComponent instanceof Resource) {
log.debug("fetchedComponent is a resource {}", fetchedComponent);
final Optional<Map<String, String>> derivedFromMapOfIdToName = getDerivedFromMapOfIdToName(fetchedComponent, componentsList);
if (derivedFromMapOfIdToName.isPresent() && !derivedFromMapOfIdToName.get().isEmpty()) {
@@ -808,9 +808,9 @@ public class ToscaExportHandler {
}
}
});
- setImports(imports, dependencies, componentsList);
+ setImports(imports, dependencies, componentsList, isSkipImports);
} else {
- setImports(imports, dependencies, fetchedComponent);
+ setImports(imports, dependencies, fetchedComponent, isSkipImports);
}
}
}
@@ -844,12 +844,12 @@ public class ToscaExportHandler {
* Creates a resource map and adds it to the import list.
*/
private void setImports(final List<Map<String, Map<String, String>>> imports, final List<Triple<String, String, Component>> dependencies,
- final Set<Component> componentsList) {
- componentsList.forEach(component -> setImports(imports, dependencies, component));
+ final Set<Component> componentsList, boolean isSkipImports) {
+ componentsList.forEach(component -> setImports(imports, dependencies, component, isSkipImports));
}
private void setImports(final List<Map<String, Map<String, String>>> imports, final List<Triple<String, String, Component>> dependencies,
- final Component component) {
+ final Component component, boolean isSkipImports) {
final Map<String, ArtifactDefinition> toscaArtifacts = component.getToscaArtifacts();
final ArtifactDefinition artifactDefinition = toscaArtifacts.get(ASSET_TOSCA_TEMPLATE);
if (artifactDefinition != null) {
@@ -860,9 +860,11 @@ public class ToscaExportHandler {
keyNameBuilder.append(component.getComponentType().toString().toLowerCase());
keyNameBuilder.append("-");
keyNameBuilder.append(component.getName());
- addImports(imports, keyNameBuilder, files);
+ if (!isSkipImports) {
+ addImports(imports, keyNameBuilder, files);
+ }
dependencies.add(new ImmutableTriple<>(artifactName, artifactDefinition.getEsId(), component));
- if (!ModelConverter.isAtomicComponent(component)) {
+ if (!ModelConverter.isAtomicComponent(component) && !isSkipImports) {
final Map<String, String> interfaceFiles = new HashMap<>();
interfaceFiles.put(IMPORTS_FILE_KEY, getInterfaceFilename(artifactName));
keyNameBuilder.append("-interface");
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaRepresentation.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaRepresentation.java
index 07463f83e4..8713be97fd 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaRepresentation.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaRepresentation.java
@@ -26,11 +26,10 @@ import org.apache.commons.lang3.tuple.Triple;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.tosca.model.ToscaTemplate;
+@Getter
public class ToscaRepresentation {
- @Getter
private final byte[] mainYaml;
- @Getter
private final Option<List<Triple<String, String, Component>>> dependencies;
private ToscaRepresentation(byte[] mainYaml, Option<List<Triple<String, String, Component>>> dependencies) {