use of org.eclipse.winery.model.ids.definitions.NodeTypeId in project winery by eclipse.
the class SelfContainmentPackager method createSelfContainedVersion.
public DefinitionsChildId createSelfContainedVersion(DefinitionsChildId entryId) throws IOException {
ServiceTemplateId newServiceTemplateId = new ServiceTemplateId(VersionSupport.getSelfContainedVersion(entryId));
if (!repository.exists(newServiceTemplateId)) {
repository.duplicate(entryId, newServiceTemplateId);
TServiceTemplate serviceTemplate = repository.getElement(newServiceTemplateId);
Collection<DefinitionsChildId> referencedElements = repository.getReferencedDefinitionsChildIds(newServiceTemplateId);
for (DefinitionsChildId elementId : referencedElements) {
if (elementId instanceof NodeTypeId) {
Collection<NodeTypeImplementationId> nodeTypeImplementationIds = repository.getAllElementsReferencingGivenType(NodeTypeImplementationId.class, elementId.getQName());
if (nodeTypeImplementationIds.stream().noneMatch(DefinitionsChildId::isSelfContained)) {
// self-contained element does not exist yet!
List<TNodeTypeImplementation> nodeTypeImplementations = nodeTypeImplementationIds.stream().map(repository::getElement).filter(element -> element.getImplementationArtifacts() != null).collect(Collectors.toList());
for (TNodeTypeImplementation impl : nodeTypeImplementations) {
Optional<SelfContainmentPlugin> nodeTypeBasedPlugin = this.selfContainmentPlugins.stream().filter(plugin -> plugin.canHandleNodeType(elementId.getQName(), repository)).findFirst();
if (nodeTypeBasedPlugin.isPresent()) {
NodeTypeImplementationId selfContainedNodeTypeImpl = getSelfContainedNodeTypeImplId(impl);
try {
repository.duplicate(new NodeTypeImplementationId(impl.getTargetNamespace(), impl.getIdFromIdOrNameField(), false), selfContainedNodeTypeImpl);
TNodeTypeImplementation selfContained = this.repository.getElement(selfContainedNodeTypeImpl);
nodeTypeBasedPlugin.get().downloadDependenciesBasedOnNodeType(selfContained, this.repository);
repository.setElement(selfContainedNodeTypeImpl, selfContained);
} catch (IOException e) {
logger.error("While creating self-contained Node Type Implementation", e);
}
} else if (impl.getImplementationArtifacts() != null) {
createSelfContainedNodeTypeImplementation(impl);
}
}
}
} else if (elementId instanceof ArtifactTemplateId) {
if (serviceTemplate.getTopologyTemplate() != null) {
TArtifactTemplate artifactTemplate = repository.getElement(elementId);
SelfContainmentPlugin.GeneratedArtifacts generatedArtifacts = this.downloadArtifacts(elementId.getQName(), artifactTemplate.getType());
if (generatedArtifacts != null && generatedArtifacts.selfContainedArtifactQName != null) {
// first, we need to identify the element that is referencing the artifact
serviceTemplate.getTopologyTemplate().getNodeTemplates().stream().map(TNodeTemplate::getDeploymentArtifacts).filter(Objects::nonNull).filter(daList -> daList.stream().anyMatch(da -> da.getArtifactRef() != null && da.getArtifactRef().equals(elementId.getQName()))).flatMap(Collection::stream).forEach(da -> da.setArtifactRef(generatedArtifacts.selfContainedArtifactQName));
}
}
}
}
repository.setElement(newServiceTemplateId, serviceTemplate);
} else {
logger.info("Self-contained version already exists! '{}'", newServiceTemplateId.getQName());
}
return newServiceTemplateId;
}
use of org.eclipse.winery.model.ids.definitions.NodeTypeId in project winery by eclipse.
the class DataFlowResource method createNodeTemplate.
/**
* Create a NodeTemplate corresponding to the given filter with the given type, properties and artifacts and add it
* to the topology of the incomplete deployment model.
*/
private TTopologyTemplate createNodeTemplate(TTopologyTemplate topology, NodeTypeId nodeTypeId, String templateName, Map<String, String> properties, List<QName> artifacts) {
// get NodeType to access Requirements for the completion and available properties
IRepository repo = RepositoryFactory.getRepository();
TNodeType nodeType = repo.getElement(nodeTypeId);
if (Objects.isNull(nodeType)) {
return null;
}
TNodeTemplate.Builder templateBuilder = new TNodeTemplate.Builder(templateName, nodeTypeId.getQName());
// add the defined properties to the NodeTemplate
if (Objects.nonNull(properties)) {
LinkedHashMap<String, String> propertyList = new LinkedHashMap<>();
if (Objects.nonNull(nodeType.getWinerysPropertiesDefinition())) {
// add empty property for NodeType properties to avoid errors due to missing properties
WinerysPropertiesDefinition def = nodeType.getWinerysPropertiesDefinition();
for (PropertyDefinitionKV prop : def.getPropertyDefinitions()) {
propertyList.put(prop.getKey(), "");
}
}
// add all properties which are defined at the filter
propertyList.putAll(properties);
TEntityTemplate.WineryKVProperties nodeProperties = new TEntityTemplate.WineryKVProperties();
nodeProperties.setKVProperties(propertyList);
templateBuilder.setProperties(nodeProperties);
}
// add all requirements which are defined by the corresponding NodeType
if (nodeType.getRequirementDefinitions() != null) {
for (TRequirementDefinition requirementDef : nodeType.getRequirementDefinitions()) {
String requirementId = templateName + "-" + requirementDef.getName();
templateBuilder.addRequirement(new TRequirement.Builder(requirementId, requirementDef.getName(), requirementDef.getRequirementType()).build());
}
}
// add the DAs to the NodeTemplate
if (Objects.nonNull(artifacts) && !artifacts.isEmpty()) {
LOGGER.debug("{} artifacts specified for filter {}", artifacts.size(), templateName);
// get the IDs of all available ArtifactTemplates
List<ArtifactTemplateId> artifactTemplateIds = repo.getAllDefinitionsChildIds().stream().filter(id -> id.getGroup().equals(ARTIFACT_TEMPLATE_GROUP) && id instanceof ArtifactTemplateId).map(id -> (ArtifactTemplateId) id).collect(Collectors.toList());
for (QName artifactName : artifacts) {
Optional<ArtifactTemplateId> idOptional = artifactTemplateIds.stream().filter(id -> id.getQName().equals(artifactName)).findFirst();
if (idOptional.isPresent()) {
ArtifactTemplateId artifactTemplateId = idOptional.get();
TArtifactTemplate artifactTemplate = repo.getElement(artifactTemplateId);
templateBuilder.addDeploymentArtifact(new TDeploymentArtifact.Builder(artifactName.toString(), artifactTemplate.getType()).setArtifactRef(artifactName).build());
} else {
LOGGER.warn("Filter '{}' specifies DA with name '{}' but no such artifact available in repository!", templateName, artifactName);
}
}
}
topology.addNodeTemplate(templateBuilder.build());
return topology;
}
use of org.eclipse.winery.model.ids.definitions.NodeTypeId in project winery by eclipse.
the class DataFlowResource method parseDataFlowToServiceTemplate.
@POST
@Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response parseDataFlowToServiceTemplate(DataFlowModel dataFlowModel) {
if (Objects.isNull(dataFlowModel)) {
return Response.status(Response.Status.BAD_REQUEST).entity("Passed data flow model is null!").build();
}
if (Objects.isNull(dataFlowModel.getId().getNamespaceURI())) {
return Response.status(Response.Status.BAD_REQUEST).entity("Namespace must be defined for the data flow " + "model ID!").build();
}
IRepository repo = RepositoryFactory.getRepository();
ServiceTemplateId templateId = new ServiceTemplateId(dataFlowModel.getId());
if (repo.exists(templateId)) {
return Response.status(Response.Status.CONFLICT).entity("ServiceTemplate with name of the data flow model already exists!").build();
}
TDefinitions definitions = BackendUtils.createWrapperDefinitionsAndInitialEmptyElement(repo, templateId);
TServiceTemplate serviceTemplate = definitions.getServiceTemplates().stream().filter(template -> template.getId().equals(templateId.getQName().getLocalPart()) && templateId.getQName().getNamespaceURI().equals(template.getTargetNamespace())).findFirst().orElse(null);
if (Objects.isNull(serviceTemplate)) {
return Response.serverError().entity("Unable to create ServiceTemplate for the given data flow model!").build();
}
TTopologyTemplate topology = serviceTemplate.getTopologyTemplate();
if (Objects.isNull(topology)) {
topology = new TTopologyTemplate.Builder().build();
}
// iterate over all filters of the data flow and create corresponding NodeTemplates
for (DataFlowModel.Filter filter : dataFlowModel.getFilters()) {
if (Objects.isNull(filter.getType())) {
return Response.serverError().entity("Type is missing for a filter!").build();
}
NodeTypeId nodeTypeId = BackendUtils.getDefinitionsChildId(NodeTypeId.class, filter.getType());
if (!repo.exists(nodeTypeId)) {
TNodeType newNodeType = new TNodeType.Builder(nodeTypeId.getQName().getLocalPart()).setTargetNamespace(nodeTypeId.getQName().getNamespaceURI()).build();
try {
BackendUtils.persist(repo, nodeTypeId, newNodeType);
} catch (IOException e) {
return Response.serverError().entity("Unable to create NodeType " + filter.getType() + " which is not contained in the repository!").build();
}
}
topology = handleFilter(topology, nodeTypeId, filter.getId(), filter.getProperties(), filter.getArtifacts(), filter.getLocation(), filter.getProvider());
if (Objects.isNull(topology)) {
return Response.serverError().entity("Unable to handle filter with name: " + filter.getId()).build();
}
}
// without available connectsTo RelationshipType the transformation can not be done
RelationshipTypeId relationTypeId = BackendUtils.getDefinitionsChildId(RelationshipTypeId.class, ToscaBaseTypes.connectsToRelationshipType);
if (!repo.exists(relationTypeId)) {
return Response.serverError().entity("Unable to parse data flow model without available connectsTo " + "RelationshipType!").build();
}
// create connectsTo RelationshipTemplates between NodeTemplates corresponding to connected filters
for (DataFlowModel.Pipes pipe : dataFlowModel.getPipes()) {
if (Objects.isNull(pipe.getSource()) || Objects.isNull(pipe.getTarget())) {
return Response.serverError().entity("Unable to create RelationshipTemplate for pipe with source or " + "target equal to null!").build();
}
TNodeTemplate source = topology.getNodeTemplate(pipe.getSource());
TNodeTemplate target = topology.getNodeTemplate(pipe.getTarget());
if (Objects.isNull(source) || Objects.isNull(target)) {
return Response.serverError().entity("Unable to find NodeTemplates for relation with source: " + pipe.getSource() + " and target: " + pipe.getTarget()).build();
}
TRelationshipTemplate relationshipTemplate = createRelationshipTemplate(relationTypeId, source, target, pipe.getDataTransferType());
if (Objects.isNull(relationshipTemplate)) {
return Response.serverError().entity("Unable to create RelationshipTemplate between " + source.getId() + " and " + target.getId()).build();
}
topology.addRelationshipTemplate(relationshipTemplate);
}
serviceTemplate.setTopologyTemplate(topology);
try {
BackendUtils.persist(repo, templateId, definitions);
return Response.created(new URI(RestUtils.getAbsoluteURL(templateId))).build();
} catch (IOException e) {
return Response.serverError().entity("IOException while persisting ServiceTemplate for data flow model!").build();
} catch (URISyntaxException e) {
return Response.serverError().entity("Unable to parse URI for created ServiceTemplate!").build();
}
}
use of org.eclipse.winery.model.ids.definitions.NodeTypeId in project winery by eclipse.
the class DataFlowResource method mergeTemplateForDataSource.
/**
* Replace a filter corresponding to a running and placed data source by a ServiceTemplate with the same location
* and provider tag which contains a NodeTemplate of the NodeType specified for the data source filter.
*/
private TTopologyTemplate mergeTemplateForDataSource(TTopologyTemplate topology, NodeTypeId nodeTypeId, String templateName, Map<String, String> properties, String location, String provider) {
// get all ServiceTemplates in the repo
IRepository repo = RepositoryFactory.getRepository();
List<ServiceTemplateId> serviceTemplateIds = repo.getAllDefinitionsChildIds().stream().filter(id -> id.getGroup().equals(SERVICE_TEMPLATE_GROUP) && id instanceof ServiceTemplateId).map(id -> (ServiceTemplateId) id).collect(Collectors.toList());
for (ServiceTemplateId id : serviceTemplateIds) {
TServiceTemplate serviceTemplate = repo.getElement(id);
// only ServiceTemplates with location and provider tags are possible substitution candidates
if (containsMatchingTags(serviceTemplate, location, provider) && containsMatchingNodeType(serviceTemplate, nodeTypeId)) {
LOGGER.debug("Found suited substitution candidate for filter {}: {}", templateName, id.getQName());
TTopologyTemplate substitutionTopology = serviceTemplate.getTopologyTemplate();
TNodeTemplate filterCorrespondingNode = null;
LinkedHashMap<String, String> filterCorrespondingNodeProperties = null;
Map<String, String> nameMap = new HashMap<>();
if (substitutionTopology == null) {
continue;
}
// insert all NodeTemplates from the substitution candidate
for (TNodeTemplate node : substitutionTopology.getNodeTemplates()) {
LinkedHashMap<String, String> propertyList = ModelUtilities.getPropertiesKV(node);
if (propertyList == null) {
propertyList = new LinkedHashMap<>();
}
if (node.getType().equals(nodeTypeId.getQName())) {
// the NodeTemplate from the data flow model must be renamed to the given name
nameMap.put(node.getId(), templateName);
node.setId(templateName);
filterCorrespondingNode = node;
filterCorrespondingNodeProperties = propertyList;
} else if (Objects.nonNull(topology.getNodeTemplate(node.getId()))) {
// all existing names must be changed too
while (Objects.nonNull(topology.getNodeTemplate(node.getId() + "-" + IdCounter))) {
IdCounter++;
}
nameMap.put(node.getId(), node.getId() + "-" + IdCounter);
node.setId(node.getId() + "-" + IdCounter);
}
// update properties of the NodeTemplate if they are set at the filter
Map<String, String> propertyCopy = new HashMap<>(properties);
for (String propertyName : propertyCopy.keySet()) {
if (propertyName != null && propertyList.containsKey(propertyName)) {
propertyList.put(propertyName, properties.get(propertyName));
properties.remove(propertyName);
}
}
// set the state of all components related to the data source to running
propertyList.put("State", "Running");
ModelUtilities.setPropertiesKV(node, propertyList);
topology.addNodeTemplate(node);
}
// add all properties that are not defined in the NodeTypes to the node corresponding to the filter
if (Objects.nonNull(filterCorrespondingNode)) {
LOGGER.debug("{} properties defined without property at a matching type. Adding to filter " + "NodeTemplate!", properties.size());
for (String propertyName : properties.keySet()) {
filterCorrespondingNodeProperties.put(propertyName, properties.get(propertyName));
}
ModelUtilities.setPropertiesKV(filterCorrespondingNode, filterCorrespondingNodeProperties);
// add location and provider attribute to the NodeTemplate
filterCorrespondingNode.getOtherAttributes().put(ModelUtilities.NODE_TEMPLATE_REGION, location);
filterCorrespondingNode.getOtherAttributes().put(ModelUtilities.NODE_TEMPLATE_PROVIDER, provider);
}
// add all relations from the substitution fragment to the incomplete topology
for (TRelationshipTemplate relation : substitutionTopology.getRelationshipTemplates()) {
// update source id if it was changed
String sourceId = relation.getSourceElement().getRef().getId();
if (nameMap.containsKey(sourceId)) {
TNodeTemplate nodeTemplate = topology.getNodeTemplate(nameMap.get(sourceId));
if (nodeTemplate != null) {
relation.setSourceNodeTemplate(nodeTemplate);
}
}
// update target id if it was changed
if (nameMap.containsKey(relation.getTargetElement().getRef().getId())) {
relation.setTargetNodeTemplate(topology.getNodeTemplate(nameMap.get(relation.getTargetElement().getRef().getId())));
}
// update id if RelationshipTemplate with same id exists
if (Objects.nonNull(topology.getRelationshipTemplate(relation.getId()))) {
while (Objects.nonNull(topology.getRelationshipTemplate(relation.getId() + "-" + IdCounter))) {
IdCounter++;
}
relation.setId(relation.getId() + "-" + IdCounter);
}
topology.addRelationshipTemplate(relation);
}
return topology;
}
}
// no substitution of data source possible
return null;
}
use of org.eclipse.winery.model.ids.definitions.NodeTypeId in project winery by eclipse.
the class IRepository method getReferencedDefinitionsChildIds.
default Collection<DefinitionsChildId> getReferencedDefinitionsChildIds(RelationshipTypeId id) {
// add all implementations
Collection<DefinitionsChildId> ids = new ArrayList<>(this.getAllElementsReferencingGivenType(RelationshipTypeImplementationId.class, id.getQName()));
final TRelationshipType relationshipType = this.getElement(id);
TRelationshipType.ValidSource validSource = relationshipType.getValidSource();
if (validSource != null) {
QName typeRef = validSource.getTypeRef();
// can be a node type or a requirement type
// similar code as for valid target (difference: req/cap)
NodeTypeId ntId = new NodeTypeId(typeRef);
if (this.exists(ntId)) {
ids.add(ntId);
} else {
RequirementTypeId rtId = new RequirementTypeId(typeRef);
ids.add(rtId);
}
}
TRelationshipType.ValidTarget validTarget = relationshipType.getValidTarget();
if (validTarget != null) {
QName typeRef = validTarget.getTypeRef();
// can be a node type or a capability type
// similar code as for valid target (difference: req/cap)
NodeTypeId ntId = new NodeTypeId(typeRef);
if (this.exists(ntId)) {
ids.add(ntId);
} else {
CapabilityTypeId capId = new CapabilityTypeId(typeRef);
ids.add(capId);
}
}
List<QName> validTargetList = relationshipType.getValidTargetList();
if (validTargetList != null) {
for (QName typeRef : validTargetList) {
CapabilityTypeId capId = new CapabilityTypeId(typeRef);
if (this.exists(capId)) {
ids.add(capId);
}
}
}
getReferencedDefinitionsOfProperties(ids, relationshipType.getProperties());
return ids;
}
Aggregations