diff --git a/.idea/runConfigurations/TOSCA_Mangement_UI.xml b/.idea/runConfigurations/TOSCA_Mangement_UI.xml
index 2f33708d60..2025440e10 100644
--- a/.idea/runConfigurations/TOSCA_Mangement_UI.xml
+++ b/.idea/runConfigurations/TOSCA_Mangement_UI.xml
@@ -9,4 +9,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/runConfigurations/Topologymodeler.xml b/.idea/runConfigurations/Topologymodeler.xml
index 7aaedfb335..ad7d60abf6 100644
--- a/.idea/runConfigurations/Topologymodeler.xml
+++ b/.idea/runConfigurations/Topologymodeler.xml
@@ -9,4 +9,4 @@
-
\ No newline at end of file
+
diff --git a/.idea/runConfigurations/Workflowmodeler.xml b/.idea/runConfigurations/Workflowmodeler.xml
index d696c2014f..1f5bffa8f5 100644
--- a/.idea/runConfigurations/Workflowmodeler.xml
+++ b/.idea/runConfigurations/Workflowmodeler.xml
@@ -1,12 +1,12 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmManager.java b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmManager.java
index 286703488a..e5920a6362 100644
--- a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmManager.java
+++ b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmManager.java
@@ -41,9 +41,15 @@ static EdmmManager forRepository(IRepository repo) {
void setOneToOneMappings(List list);
- default Map getOneToOneMap() {
+ default Map getToscaToEdmmMap() {
Map typeMappings = new HashMap<>();
this.getOneToOneMappings().forEach(m -> typeMappings.put(m.toscaType, m.edmmType));
return typeMappings;
}
+
+ default Map getEdmmOneToToscaMap() {
+ Map typeMappings = new HashMap<>();
+ this.getOneToOneMappings().forEach(m -> typeMappings.put(m.edmmType, m.toscaType));
+ return typeMappings;
+ }
}
diff --git a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmUtils.java b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmUtils.java
index 8aee4410d1..f9a5b495c2 100644
--- a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmUtils.java
+++ b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/EdmmUtils.java
@@ -32,7 +32,13 @@
import org.eclipse.winery.repository.backend.IRepository;
import org.eclipse.winery.repository.backend.RepositoryFactory;
-public class EdmmUtils {
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class EdmmUtils {
+
+ public static final String IMPORTED_EDMM_NAMESPACE = "https://opentosca.org/edmm/imported/";
+ private static final Logger LOGGER = LoggerFactory.getLogger(EdmmUtils.class);
public static Map checkToscaLightCompatibility(TServiceTemplate serviceTemplate) {
ToscaLightChecker toscaLightChecker = getToscaLightChecker();
@@ -53,7 +59,7 @@ public static ToscaLightChecker getToscaLightChecker() {
Map relationshipTypes = repository.getQNameToElementMapping(RelationshipTypeId.class);
Map nodeTypes = repository.getQNameToElementMapping(NodeTypeId.class);
- Map oneToOneMap = EdmmManager.forRepository(repository).getOneToOneMap();
+ Map oneToOneMap = EdmmManager.forRepository(repository).getToscaToEdmmMap();
return new ToscaLightChecker(nodeTypes, relationshipTypes, oneToOneMap);
}
@@ -69,4 +75,35 @@ public static Map getAllToscaLightCompliantModels() {
.filter(entry -> toscaLightChecker.isToscaLightCompliant(entry.getValue()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
+
+ public static String normalizeQName(QName qName) {
+ return qName.toString()
+ .replace("{", "")
+ .replace("}", "__")
+ .replace("/", "--")
+ .replace(':', '+');
+ }
+
+ /**
+ * Tries to generate a QName from a type name. Thereby, two underscores are treated as the separation between a
+ * potential namespace and the ID
+ *
+ * @param typeName the name of the EDMM type
+ * @return a QName
+ */
+ public static QName getQNameFromType(String typeName, String namespaceSuffix) {
+ if (typeName.contains("__")) {
+ return QName.valueOf(
+ "{" +
+ typeName.replace('+', ':')
+ .replace("__", "}")
+ .replace("--", "/")
+ );
+ }
+
+ return new QName(
+ IMPORTED_EDMM_NAMESPACE + namespaceSuffix,
+ typeName
+ );
+ }
}
diff --git a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmConverter.java b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmExporter.java
similarity index 90%
rename from org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmConverter.java
rename to org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmExporter.java
index 3da6a469fb..6ca5217595 100644
--- a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmConverter.java
+++ b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmExporter.java
@@ -26,6 +26,7 @@
import javax.xml.namespace.QName;
import org.eclipse.winery.common.configuration.Environments;
+import org.eclipse.winery.edmm.EdmmUtils;
import org.eclipse.winery.model.tosca.TArtifactTemplate;
import org.eclipse.winery.model.tosca.TDeploymentArtifact;
import org.eclipse.winery.model.tosca.TEntityTemplate;
@@ -50,10 +51,14 @@
import io.github.edmm.core.parser.ScalarEntity;
import io.github.edmm.core.parser.SequenceEntity;
import io.github.edmm.core.parser.support.DefaultKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import static org.eclipse.winery.model.tosca.constants.Namespaces.TOSCA_WINERY_EXTENSIONS_NAMESPACE;
-public class EdmmConverter {
+public class EdmmExporter {
+
+ private final Logger logger = LoggerFactory.getLogger(EdmmExporter.class);
private final Map nodeTypes;
private final Map relationshipTypes;
@@ -63,20 +68,20 @@ public class EdmmConverter {
private final Map oneToOneMappings;
private final boolean useAbsolutePaths;
- public EdmmConverter(Map nodeTypes, Map relationshipTypes,
- Map nodeTypeImplementations,
- Map relationshipTypeImplementations,
- Map artifactTemplates,
- Map oneToOneMappings) {
+ public EdmmExporter(Map nodeTypes, Map relationshipTypes,
+ Map nodeTypeImplementations,
+ Map relationshipTypeImplementations,
+ Map artifactTemplates,
+ Map oneToOneMappings) {
this(nodeTypes, relationshipTypes, nodeTypeImplementations, relationshipTypeImplementations, artifactTemplates,
oneToOneMappings, true);
}
- public EdmmConverter(Map nodeTypes, Map relationshipTypes,
- Map nodeTypeImplementations,
- Map relationshipTypeImplementations,
- Map artifactTemplates,
- Map oneToOneMappings, boolean useAbsolutePaths) {
+ public EdmmExporter(Map nodeTypes, Map relationshipTypes,
+ Map nodeTypeImplementations,
+ Map relationshipTypeImplementations,
+ Map artifactTemplates,
+ Map oneToOneMappings, boolean useAbsolutePaths) {
this.nodeTypes = nodeTypes;
this.relationshipTypes = relationshipTypes;
this.nodeTypeImplementations = nodeTypeImplementations;
@@ -87,7 +92,10 @@ public EdmmConverter(Map nodeTypes, Map {
EntityId propertyEntityId = propertiesEntityId.extend(key);
@@ -281,11 +291,10 @@ private EntityId createType(TEntityType toscaType, EntityId typeRoot, EntityGrap
entityGraph.addEntity(new MappingEntity(typeRoot, entityGraph));
}
- EntityId typeEntityId;
EdmmType edmmType = oneToOneMappings.get(toscaType.getQName());
- typeEntityId = edmmType != null ?
+ EntityId typeEntityId = edmmType != null ?
typeRoot.extend(edmmType.getValue()) :
- typeRoot.extend(this.normalizeQName(toscaType.getQName()));
+ typeRoot.extend(EdmmUtils.normalizeQName(toscaType.getQName()));
// the type we are trying to create is already there!
if (entityGraph.getEntity(typeEntityId).isPresent()) {
@@ -382,12 +391,4 @@ private String getImplementationForOperation(TEntityTypeImplementation implement
}
return null;
}
-
- private String normalizeQName(QName qName) {
- return qName.toString()
- .replace("{", "")
- .replace("}", "__")
- .replace("/", "")
- .replace(':', '_');
- }
}
diff --git a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmImporter.java b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmImporter.java
new file mode 100644
index 0000000000..f0519637ba
--- /dev/null
+++ b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/model/EdmmImporter.java
@@ -0,0 +1,458 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0
+ * which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ *******************************************************************************/
+
+package org.eclipse.winery.edmm.model;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.eclipse.winery.edmm.EdmmManager;
+import org.eclipse.winery.edmm.EdmmUtils;
+import org.eclipse.winery.edmm.utils.ZipUtility;
+import org.eclipse.winery.model.ids.definitions.ArtifactTemplateId;
+import org.eclipse.winery.model.ids.definitions.NodeTypeId;
+import org.eclipse.winery.model.ids.definitions.NodeTypeImplementationId;
+import org.eclipse.winery.model.ids.definitions.RelationshipTypeId;
+import org.eclipse.winery.model.ids.definitions.RelationshipTypeImplementationId;
+import org.eclipse.winery.model.ids.definitions.ServiceTemplateId;
+import org.eclipse.winery.model.tosca.TArtifactTemplate;
+import org.eclipse.winery.model.tosca.TEntityTemplate;
+import org.eclipse.winery.model.tosca.TEntityType;
+import org.eclipse.winery.model.tosca.TNodeTemplate;
+import org.eclipse.winery.model.tosca.TNodeType;
+import org.eclipse.winery.model.tosca.TNodeTypeImplementation;
+import org.eclipse.winery.model.tosca.TRelationshipTemplate;
+import org.eclipse.winery.model.tosca.TRelationshipType;
+import org.eclipse.winery.model.tosca.TRelationshipTypeImplementation;
+import org.eclipse.winery.model.tosca.TServiceTemplate;
+import org.eclipse.winery.model.tosca.TTopologyTemplate;
+import org.eclipse.winery.model.tosca.extensions.kvproperties.PropertyDefinitionKV;
+import org.eclipse.winery.model.tosca.extensions.kvproperties.WinerysPropertiesDefinition;
+import org.eclipse.winery.repository.backend.IRepository;
+import org.eclipse.winery.repository.backend.RepositoryFactory;
+
+import io.github.edmm.core.parser.Entity;
+import io.github.edmm.core.parser.EntityGraph;
+import io.github.edmm.core.parser.ScalarEntity;
+import io.github.edmm.core.parser.support.DefaultKeys;
+import io.github.edmm.model.DeploymentModel;
+import io.github.edmm.model.Property;
+import io.github.edmm.model.component.RootComponent;
+import org.apache.commons.io.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+
+public class EdmmImporter {
+
+ private final static Logger logger = LoggerFactory.getLogger(EdmmImporter.class);
+
+ private final Map nodeTypes;
+ private final Map nodeTypeImplementations;
+ private final Map> normalizedNodeTypes = new HashMap<>();
+
+ private final Map relationshipTypes;
+
+ private final Map> normalizedRelationshipTypes = new HashMap<>();
+ private final Map relationshipTypeImplementations;
+
+ private final Map artifactTemplates;
+ private final Map> normalizedArtifactTemplates = new HashMap<>();
+
+ private final Map edmmToToscaMap;
+
+ private final IRepository repository;
+
+ private final String nodeTypesString = "nodeTypes";
+ private final String relationshipTypesString = "relationshipTypes";
+
+ public EdmmImporter() {
+ logger.debug("Initializing EDMM Importer...");
+
+ this.repository = RepositoryFactory.getRepository();
+
+ this.nodeTypes = repository.getQNameToElementMapping(NodeTypeId.class);
+ this.relationshipTypes = repository.getQNameToElementMapping(RelationshipTypeId.class);
+ this.nodeTypeImplementations = repository.getQNameToElementMapping(NodeTypeImplementationId.class);
+ this.relationshipTypeImplementations = repository.getQNameToElementMapping(RelationshipTypeImplementationId.class);
+ this.artifactTemplates = repository.getQNameToElementMapping(ArtifactTemplateId.class);
+
+ normalizeToscaTypes();
+
+ EdmmManager edmmManager = EdmmManager.forRepository(repository);
+ this.edmmToToscaMap = edmmManager.getEdmmOneToToscaMap();
+
+ logger.info("Initialized EDMM Importer!");
+ }
+
+ public void importFromStream(InputStream uploadedInputStream, String fileName, boolean overwrite) {
+ Path tempFile = null;
+ try {
+ tempFile = FileUtils.getTempDirectory().toPath().resolve(fileName);
+ Files.copy(uploadedInputStream, tempFile, REPLACE_EXISTING);
+
+ transform(tempFile, overwrite);
+ } catch (IOException e) {
+ logger.error("Cloud not save uploaded file!");
+ throw new RuntimeException(e);
+ } finally {
+ if (tempFile != null) {
+ try {
+ FileUtils.forceDelete(tempFile.toFile());
+ } catch (IOException e) {
+ logger.warn("Could not delete temp file!");
+ }
+ }
+ }
+ }
+
+ public boolean transform(Path edmmFilePath, boolean overwrite) {
+ String pathString = edmmFilePath.toString();
+ logger.info("Received path \"{}\" to import.", pathString);
+
+ Path workingDirectory = edmmFilePath;
+ Path edmmEntryFilePath = null;
+
+ if (pathString.endsWith(".zip")) {
+ try {
+ workingDirectory = ZipUtility.unpack(
+ edmmFilePath,
+ Files.createTempDirectory(edmmFilePath.getFileName().toString()).toAbsolutePath()
+ );
+ } catch (IOException e) {
+ logger.error("Could not create temporary directory!", e);
+ return false;
+ }
+ } else if (pathString.endsWith(".yml") || pathString.endsWith(".yaml")) {
+ workingDirectory = edmmFilePath.getParent();
+ edmmEntryFilePath = edmmFilePath;
+ }
+
+ if (edmmEntryFilePath == null) {
+ Path rootDir = workingDirectory;
+ File[] files = workingDirectory.toFile()
+ .listFiles((dir, name) ->
+ dir.equals(rootDir.toFile()) && (name.endsWith(".yml") || name.endsWith(".yaml"))
+ );
+
+ if (files == null || files.length == 0) {
+ logger.error("Could not find EDMM file!");
+ return false;
+ }
+
+ edmmEntryFilePath = files[0].toPath();
+ }
+
+ try {
+ // If the EDMM Model does not contain components, the DeploymentModel.of throws an IllegalStateException
+ DeploymentModel deploymentModel = DeploymentModel.of(edmmEntryFilePath.toFile());
+ logger.info("Successfully stored EDMM deployment model\"{}\"", deploymentModel.getName());
+ return importEdmmModel(deploymentModel, overwrite);
+ } catch (Exception e) {
+ logger.error("Error while loading EDMM model!", e);
+ return false;
+ }
+ }
+
+ public boolean transform(String edmmYaml, boolean overwrite) {
+ return importEdmmModel(DeploymentModel.of(edmmYaml), overwrite);
+ }
+
+ private boolean importEdmmModel(DeploymentModel deploymentModel, boolean overwrite) {
+ logger.info("Starting to import \"{}\"", deploymentModel.getName());
+
+ EntityGraph deploymentModelGraph = deploymentModel.getGraph();
+ Optional componentTypesOptional = deploymentModelGraph.getEntity(EntityGraph.COMPONENT_TYPES);
+ if (componentTypesOptional.isPresent()) {
+ Set componentTypes = componentTypesOptional.get().getChildren();
+ logger.debug("Found {} Component Types to import", componentTypes.size());
+
+ componentTypes.forEach(this::importComponentTypes);
+ }
+
+ Optional relationTypesOptional = deploymentModelGraph.getEntity(EntityGraph.RELATION_TYPES);
+ if (relationTypesOptional.isPresent()) {
+ Set relationTypes = relationTypesOptional.get().getChildren();
+ logger.debug("Found {} Relation Types to import", relationTypes.size());
+
+ relationTypes.forEach(this::importRelationTypes);
+ }
+
+ Set components = deploymentModel.getComponents();
+ logger.debug("Found {} Components to import", components.size());
+ importEdmmApplication(deploymentModel, components, overwrite);
+
+ return true;
+ }
+
+ private void importRelationTypes(Entity entity) {
+ String typeName = entity.getName();
+
+ QName qName = existsQNameForType(typeName, relationshipTypesString);
+
+ if (qName == null) {
+ logger.debug("Creating new Relationship Type \"{}\"", typeName);
+ qName = EdmmUtils.getQNameFromType(typeName, relationshipTypesString);
+ TRelationshipType.Builder builder = new TRelationshipType.Builder(qName);
+
+ importTypeSpecificElements(entity, builder, relationshipTypesString);
+
+ RelationshipTypeId relationshipTypeId = new RelationshipTypeId(qName);
+ try {
+ repository.setElement(relationshipTypeId, builder.build());
+ } catch (IOException e) {
+ logger.error("Could not create Relationship Type with QName: \"{}\"", relationshipTypeId.getQName());
+ }
+
+ logger.debug("Created new Relationship Type \"{}\"", qName);
+ }
+ }
+
+ private void importEdmmApplication(DeploymentModel deploymentModel, Set components, boolean overwrite) {
+ String deploymentModelName = deploymentModel.getName() != null
+ ? deploymentModel.getName().replaceAll(".y(a?)ml", "")
+ : "Imported-EDMM_" + System.currentTimeMillis();
+
+ ServiceTemplateId serviceTemplateId = new ServiceTemplateId(
+ new QName(EdmmUtils.IMPORTED_EDMM_NAMESPACE + "serviceTemplates", deploymentModelName)
+ );
+ if (repository.exists(serviceTemplateId) && !overwrite) {
+ logger.info("Service Template with id \"{}\" already exists and should not be overridden!", serviceTemplateId.getQName());
+ return;
+ }
+
+ logger.info("Importing EDMM-Model as Service Template with id \"{}\"", serviceTemplateId.getQName());
+
+ TTopologyTemplate topologyTemplate = new TTopologyTemplate.Builder().build();
+ components.forEach(entity -> importComponents(entity, topologyTemplate));
+ components.forEach(entity -> importRelations(entity, topologyTemplate));
+
+ TServiceTemplate importedServiceTemplate = new TServiceTemplate.Builder(
+ deploymentModelName,
+ serviceTemplateId.getNamespace().getDecoded(),
+ topologyTemplate
+ )
+ .setName(deploymentModelName)
+ .build();
+
+ try {
+ repository.setElement(
+ serviceTemplateId,
+ importedServiceTemplate
+ );
+ } catch (IOException e) {
+ logger.error("Error while saving the ServiceTemplate \"{}\"", serviceTemplateId);
+ }
+ }
+
+ private void importComponents(RootComponent component, TTopologyTemplate topologyTemplate) {
+ QName type = getQNameForType(component.getType(), nodeTypesString);
+ TNodeTemplate.Builder nodeBuilder = new TNodeTemplate.Builder(
+ component.getId(),
+ type
+ )
+ .setName(component.getName());
+
+ addPropertiesToTEntityTemplate(component.getProperties(), nodeBuilder, nodeTypesString);
+
+ topologyTemplate.addNodeTemplate(nodeBuilder.build());
+ }
+
+ private void importRelations(RootComponent entity, TTopologyTemplate topologyTemplate) {
+ TNodeTemplate source = topologyTemplate.getNodeTemplate(entity.getId());
+
+ entity.getRelations().forEach(relation -> {
+ QName relationType = this.getQNameForType(relation.getId(), relationshipTypesString);
+
+ TNodeTemplate target = topologyTemplate.getNodeTemplate(relation.getTarget());
+ TRelationshipTemplate.Builder relationshipBuilder = new TRelationshipTemplate.Builder(
+ entity.getId() + "-" + relation.getId() + "-" + relation.getTarget(),
+ relationType,
+ source,
+ target
+ ).setName(relation.getName());
+
+ // Properties for relations are currently unsupported by the EDMM parser...
+ // java.lang.ClassCastException: class io.github.edmm.core.parser.ScalarEntity cannot be cast to
+ // class io.github.edmm.core.parser.MappingEntity (io.github.edmm.core.parser.ScalarEntity and
+ // io.github.edmm.core.parser.MappingEntity are in unnamed module of loader 'app')
+ // this.addPropertiesToTEntityTemplate(relation.getProperties(), relationshipBuilder, relationshipTypesString);
+
+ topologyTemplate.addRelationshipTemplate(
+ relationshipBuilder.build()
+ );
+ });
+ }
+
+ private void importComponentTypes(Entity entity) {
+ String typeName = entity.getName();
+
+ QName qName = existsQNameForType(typeName, nodeTypesString);
+
+ if (qName == null) {
+ logger.debug("Creating new Node Type \"{}\"", typeName);
+ qName = EdmmUtils.getQNameFromType(typeName, nodeTypesString);
+ TNodeType.Builder builder = new TNodeType.Builder(qName);
+
+ importTypeSpecificElements(entity, builder, nodeTypesString);
+
+ NodeTypeId nodeTypeId = new NodeTypeId(qName);
+ try {
+ repository.setElement(nodeTypeId, builder.build());
+ } catch (IOException e) {
+ logger.error("Could not create NodeType with QName: \"{}\"", nodeTypeId.getQName());
+ }
+
+ logger.debug("Created new Node Type \"{}\"", qName);
+ }
+ }
+
+ private void importTypeSpecificElements(Entity entity, TEntityType.Builder> builder, String toscaType) {
+ entity.getChildren().forEach(typeAttributes -> {
+ if (typeAttributes.getName().equals(DefaultKeys.EXTENDS) && typeAttributes instanceof ScalarEntity) {
+ String parentType = ((ScalarEntity) typeAttributes).getValue();
+ if (parentType != null && !parentType.isEmpty()) {
+ QName parent = getQNameForType(parentType, toscaType);
+ builder.setDerivedFrom(parent);
+ }
+ }
+ if (typeAttributes.getName().equals(DefaultKeys.PROPERTIES)) {
+ addPropertiesToTEntityType(typeAttributes.getChildren(), builder);
+ }
+ });
+ }
+
+ private QName getQNameForType(String typeName, String toscaType) {
+ QName qName = existsQNameForType(typeName, toscaType);
+
+ if (qName == null) {
+ logger.debug("Creating new Node Type \"{}\"", typeName);
+ qName = EdmmUtils.getQNameFromType(typeName, toscaType);
+ } else {
+ logger.debug("Found existing Node Type \"{}\" matching requested Type! Reusing it...", qName);
+ logger.debug("Type was: \"{}\"", typeName);
+ }
+
+ return qName;
+ }
+
+ private QName existsQNameForType(String typeName, String toscaType) {
+ QName qName = this.edmmToToscaMap.get(new EdmmType(typeName));
+ TEntityType type = null;
+
+ if (qName != null) {
+ if (toscaType.equals(nodeTypesString)) {
+ type = this.nodeTypes.get(qName);
+ } else if (toscaType.equals(relationshipTypesString)) {
+ type = this.relationshipTypes.get(qName);
+ }
+ }
+
+ if (type == null) {
+ Map.Entry entry = null;
+
+ if (toscaType.equals(nodeTypesString)) {
+ entry = normalizedNodeTypes.get(typeName);
+ } else if (toscaType.equals(relationshipTypesString)) {
+ entry = normalizedRelationshipTypes.get(typeName);
+ }
+
+ if (entry != null) {
+ qName = entry.getKey();
+ }
+ }
+ return qName;
+ }
+
+ private void addPropertiesToTEntityTemplate(Map propertiesMap, TEntityTemplate.Builder> tempalteBuilder, String toscaType) {
+ TEntityTemplate.WineryKVProperties wineryKVProperties = new TEntityTemplate.WineryKVProperties();
+ wineryKVProperties.setNamespace(EdmmUtils.IMPORTED_EDMM_NAMESPACE + toscaType);
+ wineryKVProperties.setElementName("Properties");
+
+ propertiesMap.forEach(
+ (key, value) -> {
+ if (!key.equals("name")) {
+ wineryKVProperties.addProperty(key, value.getValue());
+ }
+ }
+ );
+
+ if (wineryKVProperties.getKVProperties().size() > 0) {
+ tempalteBuilder.setProperties(wineryKVProperties);
+ }
+ }
+
+ private void addPropertiesToTEntityType(Set children, TEntityType.Builder> builder) {
+ ArrayList propertyDefinitions = new ArrayList<>();
+ children.forEach(property -> {
+ String propertyName = property.getName();
+ Optional child = property.getChild(DefaultKeys.TYPE);
+ if (child.isPresent()) {
+ Entity entity = child.get();
+ if (entity instanceof ScalarEntity) {
+ propertyDefinitions.add(
+ new PropertyDefinitionKV(propertyName, ((ScalarEntity) entity).getValue())
+ );
+ }
+ } else {
+ logger.warn("Could not find property type of Property \"{}\"", property);
+ }
+ });
+
+ if (!propertyDefinitions.isEmpty()) {
+ TEntityType.PropertiesDefinition properties = builder.getProperties();
+ if (properties instanceof WinerysPropertiesDefinition) {
+ ((WinerysPropertiesDefinition) properties).getPropertyDefinitions().addAll(propertyDefinitions);
+ } else {
+ WinerysPropertiesDefinition winerysPropertiesDefinition = new WinerysPropertiesDefinition();
+ winerysPropertiesDefinition.setPropertyDefinitions(propertyDefinitions);
+ builder.setProperties(winerysPropertiesDefinition);
+ }
+ }
+ }
+
+ /**
+ * Loads the required Type Definitions and creates a "normalized" definitions map.
+ */
+ private void normalizeToscaTypes() {
+ nodeTypes.entrySet()
+ .forEach(entry -> normalizedNodeTypes.put(
+ EdmmUtils.normalizeQName(entry.getKey()),
+ entry
+ ));
+
+ relationshipTypes.entrySet()
+ .forEach(entry -> normalizedRelationshipTypes.put(
+ EdmmUtils.normalizeQName(entry.getKey()),
+ entry
+ ));
+
+ artifactTemplates.entrySet()
+ .forEach(entry -> normalizedArtifactTemplates.put(
+ EdmmUtils.normalizeQName(entry.getKey()),
+ entry
+ ));
+ }
+}
diff --git a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/utils/ZipUtility.java b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/utils/ZipUtility.java
index 6a3da1644c..05905e5bb6 100644
--- a/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/utils/ZipUtility.java
+++ b/org.eclipse.winery.edmm/src/main/java/org/eclipse/winery/edmm/utils/ZipUtility.java
@@ -13,7 +13,6 @@
*******************************************************************************/
package org.eclipse.winery.edmm.utils;
-import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -32,7 +31,7 @@ public static void pack(Path sourcePath, Path destPath) {
* @param zipFilePath the Path of the zip file to unpack
* @param destDirPath the Path of the directory where we want the unzipped files, if the direcory exists it will be
* overwritten
- * @return it return destDirPath
+ * @return it returns the destination file path
*/
public static Path unpack(Path zipFilePath, Path destDirPath) throws IOException {
if (Files.exists(destDirPath)) {
@@ -40,18 +39,16 @@ public static Path unpack(Path zipFilePath, Path destDirPath) throws IOException
}
Files.createDirectory(destDirPath);
- ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipFilePath.toFile()));
-
- ZipEntry zipEntry = zipInputStream.getNextEntry();
- while (zipEntry != null) {
-
- Path newFile = destDirPath.resolve(zipEntry.getName());
- Files.createDirectories(newFile.getParent());
- Files.copy(zipInputStream, newFile);
- zipEntry = zipInputStream.getNextEntry();
+ try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFilePath.toFile().toPath()))) {
+ ZipEntry zipEntry = zipInputStream.getNextEntry();
+ while (zipEntry != null) {
+ Path newFile = destDirPath.resolve(zipEntry.getName());
+ Files.createDirectories(newFile.getParent());
+ Files.copy(zipInputStream, newFile);
+ zipEntry = zipInputStream.getNextEntry();
+ }
+ zipInputStream.closeEntry();
}
- zipInputStream.closeEntry();
- zipInputStream.close();
return destDirPath;
}
diff --git a/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmConverterTest.java b/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmExporterTest.java
similarity index 67%
rename from org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmConverterTest.java
rename to org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmExporterTest.java
index e99a46c5b6..3c539944ab 100644
--- a/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmConverterTest.java
+++ b/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmExporterTest.java
@@ -34,9 +34,9 @@
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
-public class EdmmConverterTest extends EdmmDependantTest {
+public class EdmmExporterTest extends EdmmDependantTest {
- protected EdmmConverterTest() throws UnsupportedEncodingException {
+ protected EdmmExporterTest() throws UnsupportedEncodingException {
}
@Test
@@ -49,9 +49,9 @@ void transformOneNodeTemplate() {
TServiceTemplate serviceTemplate = new TServiceTemplate();
serviceTemplate.setTopologyTemplate(topology.build());
- EdmmConverter edmmConverter = new EdmmConverter(nodeTypes, relationshipTypes, nodeTypeImplementations,
+ EdmmExporter edmmExporter = new EdmmExporter(nodeTypes, relationshipTypes, nodeTypeImplementations,
relationshipTypeImplementations, artifactTemplates, edmm1to1Mapping);
- EntityGraph transform = edmmConverter.transform(serviceTemplate);
+ EntityGraph transform = edmmExporter.transform(serviceTemplate);
assertNotNull(transform);
assertEquals(15, transform.vertexSet().size());
@@ -67,9 +67,9 @@ void transformDerivedFrom() {
TServiceTemplate serviceTemplate = new TServiceTemplate();
serviceTemplate.setTopologyTemplate(topology.build());
- EdmmConverter edmmConverter = new EdmmConverter(nodeTypes, relationshipTypes, nodeTypeImplementations,
+ EdmmExporter edmmExporter = new EdmmExporter(nodeTypes, relationshipTypes, nodeTypeImplementations,
relationshipTypeImplementations, artifactTemplates, edmm1to1Mapping);
- EntityGraph transform = edmmConverter.transform(serviceTemplate);
+ EntityGraph transform = edmmExporter.transform(serviceTemplate);
assertNotNull(transform);
assertTrue(transform.vertexSet().stream().anyMatch(entity ->
@@ -88,9 +88,9 @@ void transformProperties() {
TServiceTemplate serviceTemplate = new TServiceTemplate();
serviceTemplate.setTopologyTemplate(topology.build());
- EdmmConverter edmmConverter = new EdmmConverter(nodeTypes, relationshipTypes, nodeTypeImplementations,
+ EdmmExporter edmmExporter = new EdmmExporter(nodeTypes, relationshipTypes, nodeTypeImplementations,
relationshipTypeImplementations, artifactTemplates, edmm1to1Mapping);
- EntityGraph transform = edmmConverter.transform(serviceTemplate);
+ EntityGraph transform = edmmExporter.transform(serviceTemplate);
assertNotNull(transform);
assertTrue(transform.vertexSet().stream().anyMatch(entity ->
@@ -132,9 +132,9 @@ void transformTopologyWithRelationsAndRelationTypes() {
TServiceTemplate serviceTemplate = new TServiceTemplate();
serviceTemplate.setTopologyTemplate(topology.build());
- EdmmConverter edmmConverter = new EdmmConverter(nodeTypes, relationshipTypes, nodeTypeImplementations,
+ EdmmExporter edmmExporter = new EdmmExporter(nodeTypes, relationshipTypes, nodeTypeImplementations,
relationshipTypeImplementations, artifactTemplates, edmm1to1Mapping);
- EntityGraph transform = edmmConverter.transform(serviceTemplate);
+ EntityGraph transform = edmmExporter.transform(serviceTemplate);
assertNotNull(transform);
assertTrue(transform.vertexSet().stream().anyMatch(entity ->
@@ -163,9 +163,9 @@ void transformTopologyWithOperations() {
TServiceTemplate serviceTemplate = new TServiceTemplate.Builder("testST", topology.build())
.build();
- EdmmConverter edmmConverter = new EdmmConverter(nodeTypes, relationshipTypes, nodeTypeImplementations,
+ EdmmExporter edmmExporter = new EdmmExporter(nodeTypes, relationshipTypes, nodeTypeImplementations,
relationshipTypeImplementations, artifactTemplates, edmm1to1Mapping, false);
- EntityGraph transform = edmmConverter.transform(serviceTemplate);
+ EntityGraph transform = edmmExporter.transform(serviceTemplate);
assertNotNull(transform);
@@ -197,77 +197,79 @@ void transformTopology() {
serviceTemplate.setTopologyTemplate(topology.build());
// endregion
- EdmmConverter edmmConverter = new EdmmConverter(nodeTypes, relationshipTypes, nodeTypeImplementations,
+ EdmmExporter edmmExporter = new EdmmExporter(nodeTypes, relationshipTypes, nodeTypeImplementations,
relationshipTypeImplementations, artifactTemplates, edmm1to1Mapping, false);
- EntityGraph transform = edmmConverter.transform(serviceTemplate);
+ EntityGraph transform = edmmExporter.transform(serviceTemplate);
StringWriter stringWriter = new StringWriter();
transform.generateYamlOutput(stringWriter);
- assertEquals("---\n" +
- "components:\n" +
- " test_node_1:\n" +
- " type: great_type\n" +
- " relations:\n" +
- " - connects_to: test_node_2\n" +
- " - hosted_on: test_node_3\n" +
- " properties:\n" +
- " name: test_node_1\n" +
- " artifacts:\n" +
- " - war: /artifacttemplates/https%3A%2F%2Fex.org%2Ftosca%2Fto%2Fedmm/testNode1-DA/files/da.war\n" +
- " test_node_3:\n" +
- " type: https_ex.orgtoscatoedmm__test_node_type_3\n" +
- " properties:\n" +
- " public_key: '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----'\n" +
- " ssh_port: '22'\n" +
- " os_family: ubuntu\n" +
- " name: test_node_3\n" +
- " test_node_2:\n" +
- " relations:\n" +
- " - hosted_on: test_node_3\n" +
- " type: https_ex.orgtoscatoedmm__test_node_type_2\n" +
- " properties:\n" +
- " name: test_node_2\n" +
- " test_node_4:\n" +
- " operations:\n" +
- " stop: /artifacttemplates/https%3A%2F%2Fex.org%2Ftosca%2Fto%2Fedmm/startTestNode4/files/script.sh\n" +
- " start: /artifacttemplates/https%3A%2F%2Fex.org%2Ftosca%2Fto%2Fedmm/startTestNode4/files/script.sh\n" +
- " type: https_ex.orgtoscatoedmm__test_node_type_4\n" +
- " relations:\n" +
- " - hosted_on: test_node_1\n" +
- " properties:\n" +
- " name: test_node_4\n" +
- "relation_types:\n" +
- " depends_on:\n" +
- " extends: null\n" +
- " hosted_on:\n" +
- " extends: depends_on\n" +
- " connects_to:\n" +
- " extends: depends_on\n" +
- "multi_id: '12345'\n" +
- "component_types:\n" +
- " great_type:\n" +
- " extends: base\n" +
- " https_ex.orgtoscatoedmm__test_node_type_2:\n" +
- " extends: software_component\n" +
- " compute:\n" +
- " extends: base\n" +
- " https_ex.orgtoscatoedmm__test_node_type_3:\n" +
- " extends: compute\n" +
- " properties:\n" +
- " public_key:\n" +
- " type: string\n" +
- " ssh_port:\n" +
- " type: number\n" +
- " os_family:\n" +
- " type: string\n" +
- " web_application:\n" +
- " extends: base\n" +
- " https_ex.orgtoscatoedmm__test_node_type_4:\n" +
- " extends: web_application\n" +
- " software_component:\n" +
- " extends: base\n" +
- " base:\n" +
- " extends: null\n" +
- "version: edm_1_0\n", stringWriter.toString());
+ assertEquals("""
+ ---
+ components:
+ test_node_1:
+ type: great_type
+ relations:
+ - connects_to: test_node_2
+ - hosted_on: test_node_3
+ properties:
+ name: test_node_1
+ artifacts:
+ - war: /artifacttemplates/https%3A%2F%2Fex.org%2Ftosca%2Fto%2Fedmm/testNode1-DA/files/da.war
+ test_node_3:
+ type: https+----ex.org--tosca--to--edmm__test_node_type_3
+ properties:
+ public_key: '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----'
+ ssh_port: '22'
+ os_family: ubuntu
+ name: test_node_3
+ test_node_2:
+ type: https+----ex.org--tosca--to--edmm__test_node_type_2
+ relations:
+ - hosted_on: test_node_3
+ properties:
+ name: test_node_2
+ test_node_4:
+ operations:
+ stop: /artifacttemplates/https%3A%2F%2Fex.org%2Ftosca%2Fto%2Fedmm/startTestNode4/files/script.sh
+ start: /artifacttemplates/https%3A%2F%2Fex.org%2Ftosca%2Fto%2Fedmm/startTestNode4/files/script.sh
+ type: https+----ex.org--tosca--to--edmm__test_node_type_4
+ relations:
+ - hosted_on: test_node_1
+ properties:
+ name: test_node_4
+ relation_types:
+ depends_on:
+ extends: null
+ hosted_on:
+ extends: depends_on
+ connects_to:
+ extends: depends_on
+ multi_id: '12345'
+ component_types:
+ great_type:
+ extends: base
+ compute:
+ extends: base
+ web_application:
+ extends: base
+ https+----ex.org--tosca--to--edmm__test_node_type_2:
+ extends: software_component
+ https+----ex.org--tosca--to--edmm__test_node_type_3:
+ extends: compute
+ properties:
+ public_key:
+ type: string
+ ssh_port:
+ type: number
+ os_family:
+ type: string
+ https+----ex.org--tosca--to--edmm__test_node_type_4:
+ extends: web_application
+ software_component:
+ extends: base
+ base:
+ extends: null
+ version: edm_1_0
+ """, stringWriter.toString());
}
}
diff --git a/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmImporterTest.java b/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmImporterTest.java
new file mode 100644
index 0000000000..41f18fdaef
--- /dev/null
+++ b/org.eclipse.winery.edmm/src/test/java/org/eclipse/winery/edmm/model/EdmmImporterTest.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0, or the Apache Software License 2.0
+ * which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ *******************************************************************************/
+
+package org.eclipse.winery.edmm.model;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.eclipse.winery.model.ids.definitions.NodeTypeId;
+import org.eclipse.winery.model.ids.definitions.RelationshipTypeId;
+import org.eclipse.winery.model.ids.definitions.ServiceTemplateId;
+import org.eclipse.winery.model.tosca.TEntityTemplate;
+import org.eclipse.winery.model.tosca.TNodeTemplate;
+import org.eclipse.winery.model.tosca.TNodeType;
+import org.eclipse.winery.model.tosca.TRelationshipTemplate;
+import org.eclipse.winery.model.tosca.TRelationshipType;
+import org.eclipse.winery.model.tosca.TServiceTemplate;
+import org.eclipse.winery.model.tosca.TTopologyTemplate;
+import org.eclipse.winery.model.tosca.extensions.kvproperties.PropertyDefinitionKV;
+import org.eclipse.winery.repository.TestWithGitBackedRepository;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class EdmmImporterTest extends TestWithGitBackedRepository {
+
+ @Test
+ void importComponentTypesTest() throws Exception {
+ this.setRevisionTo("origin/plain");
+ EdmmImporter edmmImporter = new EdmmImporter();
+
+ File edmmFile = loadFromClasspath("edmmModels/componentTypes.yaml");
+ assertTrue(
+ edmmImporter.transform(edmmFile.toPath(), true)
+ );
+
+ TNodeType ubuntuType = repository.getElement(new NodeTypeId(
+ QName.valueOf("{http://opentosca.org/example/applications/nodetypes}test_ubuntu_w1-wip1")
+ ));
+ assertNotNull(ubuntuType);
+ assertNotNull(ubuntuType.getWinerysPropertiesDefinition());
+ List properties = ubuntuType.getWinerysPropertiesDefinition().getPropertyDefinitions();
+ assertNotNull(properties);
+ assertEquals(1, properties.size());
+ PropertyDefinitionKV ipProperty = properties.get(0);
+ assertEquals("ip-address", ipProperty.getKey());
+ assertEquals("string", ipProperty.getType());
+ assertNotNull(ubuntuType.getDerivedFrom());
+ assertEquals(
+ QName.valueOf("{http://opentosca.org/baseelements/nodetypes}VM"),
+ ubuntuType.getDerivedFrom().getType()
+ );
+
+ TRelationshipType customRelType = repository.getElement(new RelationshipTypeId(
+ QName.valueOf("{https://opentosca.org/edmm/imported/relationshipTypes}customType")
+ ));
+ assertNotNull(customRelType);
+ assertNotNull(customRelType.getWinerysPropertiesDefinition());
+ List relProperties = customRelType.getWinerysPropertiesDefinition().getPropertyDefinitions();
+ assertNotNull(relProperties);
+ assertEquals(1, relProperties.size());
+ PropertyDefinitionKV myProperty = relProperties.get(0);
+ assertEquals("myProperty", myProperty.getKey());
+ assertEquals("string", ipProperty.getType());
+ assertNotNull(customRelType.getDerivedFrom());
+ assertEquals(
+ QName.valueOf("{http://docs.oasis-open.org/tosca/ns/2011/12/ToscaBaseTypes}DependsOn"),
+ customRelType.getDerivedFrom().getType()
+ );
+ }
+
+ @Test
+ void importWholeDeploymentModelTest() throws Exception {
+ EdmmImporter edmmImporter = new EdmmImporter();
+
+ File edmmFile = loadFromClasspath("edmmModels/MySQL-OpenStack.yml");
+ assertTrue(
+ edmmImporter.transform(edmmFile.toPath(), true)
+ );
+
+ TServiceTemplate serviceTemplate = repository.getElement(new ServiceTemplateId(
+ QName.valueOf("{https://opentosca.org/edmm/imported/serviceTemplates}MySQL-OpenStack")
+ ));
+ assertNotNull(serviceTemplate);
+ TTopologyTemplate topologyTemplate = serviceTemplate.getTopologyTemplate();
+ assertNotNull(topologyTemplate);
+
+ assertEquals(3, topologyTemplate.getNodeTemplates().size());
+ TNodeTemplate mySQLDbms = topologyTemplate.getNodeTemplate("MySQL_DBMS");
+ assertNotNull(mySQLDbms);
+ assertEquals(
+ QName.valueOf("{https://opentosca.org/edmm/imported/nodeTypes}mysql_dbms"),
+ mySQLDbms.getType()
+ );
+ assertNotNull(mySQLDbms.getProperties());
+ assertTrue(mySQLDbms.getProperties() instanceof TEntityTemplate.WineryKVProperties);
+ LinkedHashMap properties = ((TEntityTemplate.WineryKVProperties) mySQLDbms.getProperties()).getKVProperties();
+ assertEquals(3, properties.size());
+ assertEquals("3306", properties.get("port"));
+ assertEquals("petclinic", properties.get("root_password"));
+ assertEquals("8", properties.get("version"));
+
+ TNodeTemplate compute = topologyTemplate.getNodeTemplate("Compute");
+ assertNotNull(compute);
+ assertEquals(
+ QName.valueOf("{http://opentosca.org/baseelements/nodetypes}VM"),
+ compute.getType()
+ );
+ assertNotNull(compute.getProperties());
+ assertTrue(compute.getProperties() instanceof TEntityTemplate.WineryKVProperties);
+ properties = ((TEntityTemplate.WineryKVProperties) compute.getProperties()).getKVProperties();
+ assertEquals(7, properties.size());
+ assertEquals("empty", properties.get("public_key"));
+ assertEquals("id_rsa", properties.get("key_name"));
+ assertEquals("linux", properties.get("os_family"));
+ assertEquals("193.196.52.76", properties.get("public_address"));
+ assertEquals("ubuntu", properties.get("machine_image"));
+ assertEquals("large", properties.get("instance_type"));
+ assertEquals("~/.ssh/id_rsa", properties.get("private_key_path"));
+
+ TNodeTemplate database = topologyTemplate.getNodeTemplate("MySQL_Database");
+ assertNotNull(database);
+ assertEquals(
+ QName.valueOf("{https://opentosca.org/edmm/imported/nodeTypes}mysql_database"),
+ database.getType()
+ );
+ assertNotNull(database.getProperties());
+ assertTrue(database.getProperties() instanceof TEntityTemplate.WineryKVProperties);
+ properties = ((TEntityTemplate.WineryKVProperties) database.getProperties()).getKVProperties();
+ assertEquals(3, properties.size());
+ assertEquals("petclinic", properties.get("password"));
+ assertEquals("petclinic", properties.get("schema_name"));
+ assertEquals("pc", properties.get("user"));
+
+ assertNotNull(topologyTemplate.getRelationshipTemplates());
+ assertEquals(2, topologyTemplate.getRelationshipTemplates().size());
+ TRelationshipTemplate databaseHostedOn = topologyTemplate.getRelationshipTemplate("MySQL_Database-hosted_on-MySQL_DBMS");
+ assertNotNull(databaseHostedOn);
+ assertEquals("MySQL_DBMS", databaseHostedOn.getTargetElement().getRef().getId());
+ assertEquals("MySQL_Database", databaseHostedOn.getSourceElement().getRef().getId());
+ assertEquals(
+ QName.valueOf("{http://docs.oasis-open.org/tosca/ns/2011/12/ToscaBaseTypes}HostedOn"),
+ databaseHostedOn.getType()
+ );
+
+ TRelationshipTemplate dbmsHostedOn = topologyTemplate.getRelationshipTemplate("MySQL_DBMS-hosted_on-Compute");
+ assertNotNull(dbmsHostedOn);
+ assertEquals("Compute", dbmsHostedOn.getTargetElement().getRef().getId());
+ assertEquals("MySQL_DBMS", dbmsHostedOn.getSourceElement().getRef().getId());
+ assertEquals(
+ QName.valueOf("{http://docs.oasis-open.org/tosca/ns/2011/12/ToscaBaseTypes}HostedOn"),
+ dbmsHostedOn.getType()
+ );
+ }
+
+ private File loadFromClasspath(String path) throws URISyntaxException {
+ URL resource = ClassLoader.getSystemClassLoader().getResource(path);
+ if (resource == null) {
+ throw new RuntimeException("Could not find file " + path + " on classpath!");
+ }
+ return new File(resource.toURI());
+ }
+}
diff --git a/org.eclipse.winery.edmm/src/test/resources/edmmModels/MySQL-OpenStack.yml b/org.eclipse.winery.edmm/src/test/resources/edmmModels/MySQL-OpenStack.yml
new file mode 100644
index 0000000000..724b7e9d24
--- /dev/null
+++ b/org.eclipse.winery.edmm/src/test/resources/edmmModels/MySQL-OpenStack.yml
@@ -0,0 +1,95 @@
+---
+components:
+ MySQL_DBMS:
+ operations:
+ start: C:\tosca-definitions\modeling-repository/artifacttemplates/https%3A%2F%2Fedmm.uni-stuttgart.de%2Fartifacttemplates/MySQL_DBMS-Start/files/start.sh
+ create: C:\tosca-definitions\modeling-repository/artifacttemplates/https%3A%2F%2Fedmm.uni-stuttgart.de%2Fartifacttemplates/MySQL_DBMS-Create/files/create.sh
+ relations:
+ - hosted_on: Compute
+ type: mysql_dbms
+ properties:
+ port: '3306'
+ root_password: petclinic
+ name: dbms
+ version: '8'
+ Compute:
+ type: compute
+ properties:
+ public_key: empty
+ key_name: id_rsa
+ os_family: linux
+ name: ubuntu_db
+ public_address: 193.196.52.76
+ machine_image: ubuntu
+ instance_type: large
+ private_key_path: ~/.ssh/id_rsa
+ artifacts:
+ - provider: C:\tosca-definitions\modeling-repository/artifacttemplates/https%3A%2F%2Fedmm.uni-stuttgart.de%2Fartifacttemplates/Ubuntu-OpenStack-Provider/files/openstack.json
+ MySQL_Database:
+ operations:
+ configure: C:\tosca-definitions\modeling-repository/artifacttemplates/https%3A%2F%2Fedmm.uni-stuttgart.de%2Fartifacttemplates/MySQL_Database-Configure/files/configure.sh
+ relations:
+ - hosted_on: MySQL_DBMS
+ type: mysql_database
+ properties:
+ password: petclinic
+ name: db
+ schema_name: petclinic
+ user: pc
+ artifacts:
+ - sql: C:\tosca-definitions\modeling-repository/artifacttemplates/https%3A%2F%2Fedmm.uni-stuttgart.de%2Fartifacttemplates/Petclinic-Schema/files/schema.sql
+relation_types:
+ depends_on:
+ extends: null
+ hosted_on:
+ extends: depends_on
+multi_id: '12345'
+component_types:
+ compute:
+ extends: base
+ properties:
+ public_key:
+ type: string
+ key_name:
+ type: string
+ os_family:
+ type: string
+ machine_image:
+ type: string
+ instance_type:
+ type: string
+ database:
+ extends: base
+ properties:
+ password:
+ type: string
+ schema_name:
+ type: string
+ user:
+ type: string
+ dbms:
+ extends: software_component
+ properties:
+ port:
+ type: integer
+ root_password:
+ type: string
+ software_component:
+ extends: base
+ mysql_dbms:
+ extends: dbms
+ properties:
+ port:
+ type: integer
+ root_password:
+ type: string
+ version:
+ type: string
+ mysql_database:
+ extends: database
+version: edm_1_0
+orchestration_technology:
+ terraform:
+ - Compute
+ - MySQL_DBMS
+ - MySQL_Database
diff --git a/org.eclipse.winery.edmm/src/test/resources/edmmModels/componentTypes.yaml b/org.eclipse.winery.edmm/src/test/resources/edmmModels/componentTypes.yaml
new file mode 100644
index 0000000000..91e5c46531
--- /dev/null
+++ b/org.eclipse.winery.edmm/src/test/resources/edmmModels/componentTypes.yaml
@@ -0,0 +1,50 @@
+---
+version: edm_1_0
+components:
+relation_types:
+ depends_on:
+ extends: null
+ hosted_on:
+ extends: depends_on
+ customType:
+ extends: depends_on
+ properties:
+ myProperty:
+ type: string
+component_types:
+ compute:
+ extends: base
+ database:
+ extends: base
+ properties:
+ password:
+ type: string
+ schema_name:
+ type: string
+ user:
+ type: string
+ http+----opentosca.org--example--applications--nodetypes__test_ubuntu_w1-wip1:
+ extends: compute
+ properties:
+ ip-address:
+ type: string
+ dbms:
+ extends: software_component
+ properties:
+ port:
+ type: integer
+ root_password:
+ type: string
+ software_component:
+ extends: base
+ mysql_dbms:
+ extends: dbms
+ properties:
+ port:
+ type: integer
+ root_password:
+ type: string
+ version:
+ type: string
+ mysql_database:
+ extends: database
diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts b/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts
index b5dd02111c..4e87d80c10 100644
--- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts
+++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/canvas/canvas.component.ts
@@ -12,8 +12,8 @@
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
********************************************************************************/
import {
- AfterViewInit, Component, ElementRef, HostListener, Input, KeyValueDiffers, NgZone, OnChanges, OnDestroy, OnInit,
- QueryList, Renderer2, SimpleChanges, ViewChild, ViewChildren
+ AfterViewInit, Component, ElementRef, HostListener, Input, KeyValueDiffers, NgZone, OnChanges, OnDestroy, OnInit, QueryList, Renderer2, SimpleChanges,
+ ViewChild, ViewChildren
} from '@angular/core';
import { JsPlumbService } from '../services/jsPlumb.service';
import { EntityType, TNodeTemplate, TRelationshipTemplate, VisualEntityType } from '../models/ttopology-template';
@@ -53,9 +53,7 @@ import { TopologyTemplateUtil } from '../models/topologyTemplateUtil';
import { ReqCapRelationshipService } from '../services/req-cap-relationship.service';
import { TPolicy } from '../models/policiesModalData';
import { ManageTopologyService } from '../services/manage-topology.service';
-import {
- WineryRepositoryConfigurationService
-} from '../../../../tosca-management/src/app/wineryFeatureToggleModule/WineryRepositoryConfiguration.service';
+import { WineryRepositoryConfigurationService } from '../../../../tosca-management/src/app/wineryFeatureToggleModule/WineryRepositoryConfiguration.service';
import { RequirementDefinitionModel } from '../models/requirementDefinitonModel';
import { CapabilityDefinitionModel } from '../models/capabilityDefinitionModel';
import { WineryRowData } from '../../../../tosca-management/src/app/wineryTableModule/wineryTable.component';
@@ -64,15 +62,11 @@ import { PolicyService } from '../services/policy.service';
import { QName } from '../../../../shared/src/app/model/qName';
import { TopologyModelerConfiguration } from '../models/topologyModelerConfiguration';
import { SubMenuItems } from '../../../../tosca-management/src/app/model/subMenuItem';
-import {
- AttributeMappingType
-} from '../../../../tosca-management/src/app/instance/refinementModels/attributeMappings/attributeMapping';
+import { AttributeMappingType } from '../../../../tosca-management/src/app/instance/refinementModels/attributeMappings/attributeMapping';
// tslint:disable-next-line:max-line-length
import { DetailsSidebarState } from '../sidebars/node-details/node-details-sidebar';
import { KvProperty } from '../../../../tosca-management/src/app/model/keyValueItem';
-import {
- WineryNamespaceSelectorService
-} from '../../../../tosca-management/src/app/wineryNamespaceSelector/wineryNamespaceSelector.service';
+import { WineryNamespaceSelectorService } from '../../../../tosca-management/src/app/wineryNamespaceSelector/wineryNamespaceSelector.service';
@Component({
selector: 'winery-canvas',
@@ -2472,7 +2466,8 @@ export class CanvasComponent implements OnInit, OnDestroy, OnChanges, AfterViewI
if (this.jsPlumbBindConnection === false) {
this.jsPlumbBindConnection = true;
this.newJsPlumbInstance.bind('connection', info => {
- const sourceElement = info.sourceId.substring(0, info.sourceId.indexOf('_E'));
+ // the info-element contains the node's id with an "_Endpoint" suffix, thus parse the actual ID...
+ const sourceElement = info.sourceId.substring(0, info.sourceId.lastIndexOf('_Endpoint'));
const currentTypeValid = this.entityTypes.relationshipTypes.some((relType) => relType.qName === this.selectedRelationshipType.qName);
const currentSourceIdValid = this.allNodeTemplates.some((node) => node.id === sourceElement);
if (sourceElement && currentTypeValid && currentSourceIdValid) {
diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.css b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.css
index 7ab46dca8e..e2fb347d19 100644
--- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.css
+++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.css
@@ -18,7 +18,6 @@ div.node {
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
- z-index: 60;
font-size: small;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
background: #ffffff;
@@ -40,6 +39,7 @@ div.pattern {
border-radius: 9%;
width: 75px;
height: 75px;
+ z-index: 10;
}
.patternImage {
@@ -258,3 +258,7 @@ div.overlay .overlay-icon {
top: 0;
transform: translate(50%, -50%);
}
+
+div.pattern > bs-tooltip-container {
+ z-index: 50;
+}
diff --git a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.html b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.html
index 264bb75507..66b337b1b8 100644
--- a/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.html
+++ b/org.eclipse.winery.frontends/app/topologymodeler/src/app/node/node.component.html
@@ -12,7 +12,7 @@
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-->
-