/* * Copyright (c) 2013 Technische Universitat Wien (TUW), Distributed Systems Group. http://dsg.tuwien.ac.at * * This work was partially supported by the European Commission in terms of the CELAR FP7 project (FP7-ICT-2011-8 #317790), http://www.celarcloud.eu/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.ac.tuwien.dsg.cloud.salsa.engine.dataprocessing; import at.ac.tuwien.dsg.cloud.salsa.common.cloudservice.model.enums.SalsaEntityType; import generated.oasis.tosca.TArtifactReference; import generated.oasis.tosca.TArtifactTemplate; import generated.oasis.tosca.TCapability; import generated.oasis.tosca.TDefinitions; import generated.oasis.tosca.TDeploymentArtifact; import generated.oasis.tosca.TEntityTemplate; import generated.oasis.tosca.TExtensibleElements; import generated.oasis.tosca.TNodeTemplate; import generated.oasis.tosca.TRelationshipTemplate; import generated.oasis.tosca.TRequirement; import generated.oasis.tosca.TServiceTemplate; import generated.oasis.tosca.TTopologyTemplate; import java.util.ArrayList; import java.util.List; public class ToscaStructureQuery { // public static TServiceTemplate getFirstServiceTemplate(TDefinitions def){ // List<TExtensibleElements> lst=def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); // for (TExtensibleElements element : lst) { // if (element.getClass().equals(TServiceTemplate.class)){ // return (TServiceTemplate)element; // } // } // return null; // } public static List<TServiceTemplate> getServiceTemplateList(TDefinitions def) { List<TExtensibleElements> lst = def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); List<TServiceTemplate> serviceLst = new ArrayList<TServiceTemplate>(); for (TExtensibleElements element : lst) { if (element.getClass().equals(TServiceTemplate.class)) { serviceLst.add((TServiceTemplate) element); } } return serviceLst; } public static TTopologyTemplate getTopologyTemplate(String topoID, TDefinitions def) { List<TServiceTemplate> sers = getServiceTemplateList(def); for (TServiceTemplate ser : sers) { if (ser.getId().equals(topoID)) { return ser.getTopologyTemplate(); } } return null; } /** * Extract NodeTemplate from Topology and put in to list * * @param ser * @return */ public static List<TNodeTemplate> getNodeTemplateList(TServiceTemplate ser) { if (ser == null) { System.out.println("Some thing wrong, null TServiceTemplate."); return null; } TTopologyTemplate topo = ser.getTopologyTemplate(); List<TEntityTemplate> lst = topo.getNodeTemplateOrRelationshipTemplate(); List<TNodeTemplate> lst1 = new ArrayList<TNodeTemplate>(); for (TEntityTemplate entity : lst) { if (entity.getClass().equals(TNodeTemplate.class)) { lst1.add((TNodeTemplate) entity); } } return lst1; } /** * Extract RelationshipTemplate from Topology and put in to list * * @param ser * @return */ public static List<TRelationshipTemplate> getRelationshipTemplateList(TServiceTemplate ser) { if (ser == null) { System.out.println("Some thing wrong, null TServiceTemplate."); return null; } TTopologyTemplate topo = ser.getTopologyTemplate(); return getRelationshipTemplateList(topo); } public static List<TRelationshipTemplate> getRelationshipTemplateList(TTopologyTemplate topo) { List<TEntityTemplate> lst = topo.getNodeTemplateOrRelationshipTemplate(); List<TRelationshipTemplate> lst1 = new ArrayList<TRelationshipTemplate>(); for (TEntityTemplate entity : lst) { if (entity.getClass().equals(TRelationshipTemplate.class)) { lst1.add((TRelationshipTemplate) entity); } } return lst1; } /** * Extract RelationshipTemplate from Topology and put in to list * * @param ser * @return */ public static List<TRelationshipTemplate> getRelationshipTemplateList(String type, TServiceTemplate ser) { if (ser == null) { System.out.println("Some thing wrong, null TServiceTemplate."); return null; } TTopologyTemplate topo = ser.getTopologyTemplate(); List<TEntityTemplate> lst = topo.getNodeTemplateOrRelationshipTemplate(); List<TRelationshipTemplate> lst1 = new ArrayList<TRelationshipTemplate>(); for (TEntityTemplate entity : lst) { if (entity.getClass().equals(TRelationshipTemplate.class)) { TRelationshipTemplate rel = (TRelationshipTemplate) entity; if (rel.getType().getLocalPart().equals(type)) { lst1.add(rel); } } } return lst1; } public static TEntityTemplate getRequirementOrCapabilityById(String id, TDefinitions def) { List<TNodeTemplate> lst = getNodeTemplateList(def); for (TNodeTemplate node : lst) { if (node.getCapabilities() != null) { List<TCapability> lisReqCap = node.getCapabilities().getCapability(); for (TCapability tcap : lisReqCap) { if (tcap.getId().equals(id)) { return tcap; } } } if (node.getRequirements() != null) { List<TRequirement> lisReq = node.getRequirements().getRequirement(); for (TRequirement treq : lisReq) { if (treq.getId().equals(id)) { return treq; } } } } return null; } /** * Get list of NodeTemplate from first ServiceTemplate * * @param def * @return */ public static List<TNodeTemplate> getNodeTemplateList(TDefinitions def) { List<TExtensibleElements> serviceTemplates = def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); List<TNodeTemplate> nodes = new ArrayList<>(); for (TExtensibleElements st : serviceTemplates) { if (st.getClass().equals(TServiceTemplate.class)) { TTopologyTemplate topo = ((TServiceTemplate) st).getTopologyTemplate(); for (TEntityTemplate entity : topo.getNodeTemplateOrRelationshipTemplate()) { if (entity.getClass().equals(TNodeTemplate.class)) { nodes.add((TNodeTemplate) entity); } } } } return nodes; } /** * Get list of RelationshipTemplate from all the ServiceTemplate * * @param def * @return */ public static List<TRelationshipTemplate> getRelationshipTemplateList(TDefinitions def) { List<TExtensibleElements> ees = def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); List<TRelationshipTemplate> relas = new ArrayList<>(); for (TExtensibleElements ee : ees) { if (ee.getClass().equals(TServiceTemplate.class)) { TTopologyTemplate topo = ((TServiceTemplate) ee).getTopologyTemplate(); for (TEntityTemplate entity : topo.getNodeTemplateOrRelationshipTemplate()) { if (entity.getClass().equals(TRelationshipTemplate.class)) { relas.add((TRelationshipTemplate) entity); } } } } return relas; } /** * Get list of RelationshipTemplate from first ServiceTemplate * * @param def * @return */ public static List<TRelationshipTemplate> getRelationshipTemplateList(String type, TDefinitions def) { List<TExtensibleElements> serviceTemplates = def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); List<TRelationshipTemplate> relas = new ArrayList<>(); for (TExtensibleElements st : serviceTemplates) { if (st.getClass().equals(TServiceTemplate.class)) { TTopologyTemplate topo = ((TServiceTemplate) st).getTopologyTemplate(); for (TEntityTemplate entity : topo.getNodeTemplateOrRelationshipTemplate()) { if (entity.getClass().equals(TRelationshipTemplate.class) && entity.getType().getLocalPart().equals(type)) { relas.add((TRelationshipTemplate) entity); } } } } return relas; } public static TArtifactTemplate getArtifactTemplateById(String id, TDefinitions def) { List<TExtensibleElements> lst = def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); TArtifactTemplate art; for (TExtensibleElements ele : lst) { if (ele.getClass().equals(TArtifactTemplate.class)) { art = (TArtifactTemplate) ele; if (art.getId().equals(id)) { return art; } } } return null; } public static TNodeTemplate getNodetemplateById(String id, TDefinitions def) { List<TNodeTemplate> lst = getNodeTemplateList(def); for (TNodeTemplate node : lst) { if (node.getId().trim().equals(id.trim())) { return node; } } return null; } /** * check if there is a node with same ID, update it * * @param node * @param def * @return */ public static TDefinitions updateNoteTempplateById(TNodeTemplate node, TDefinitions def) { TNodeTemplate oldNode = getNodetemplateById(node.getId(), def); if (oldNode != null) { oldNode = node; } return def; } /* * Get all artifact URLs */ public static List<String> getDeployArtifactTemplateReferenceList(TNodeTemplate node, TDefinitions def) { if (node.getDeploymentArtifacts() == null) { return null; } List<TDeploymentArtifact> lst = node.getDeploymentArtifacts().getDeploymentArtifact(); List<String> listOfFile = new ArrayList<String>(); for (TDeploymentArtifact artiTemplate : lst) { // list have 1 unit String artiTemplateId = artiTemplate.getArtifactRef().getLocalPart(); List<TArtifactReference> lst1 = getArtifactTemplateById(artiTemplateId, def).getArtifactReferences().getArtifactReference(); for (TArtifactReference artiref : lst1) { listOfFile.add(artiref.getReference()); } } return listOfFile; } /* * Use property name in ArtifactTemplate to define the name of script among artifacts */ public static TDeploymentArtifact getFirstDeployArtifactTemplate(TNodeTemplate node, TDefinitions def) { if (node.getDeploymentArtifacts() == null) { return null; } List<TDeploymentArtifact> lst = node.getDeploymentArtifacts().getDeploymentArtifact(); return lst.get(0); } public static List<TNodeTemplate> getNodeTemplatesOfTypeList(String nodeType, TDefinitions def) { List<TNodeTemplate> lst = new ArrayList<TNodeTemplate>(); List<TNodeTemplate> allNode = getNodeTemplateList(def); for (TNodeTemplate node : allNode) { if (node.getType().getLocalPart().toUpperCase().equals(nodeType.toUpperCase())) { lst.add(node); } } return lst; } /** * Give a node, give back a chain of nodes of same RelationShipType E.g: Get all nodes HOSTON the input node VM, result could be: container, Artifact1 (VM * itself is not included) * * @param relationShipType * @param node * @param def * @return List of chain of node */ public static List<TNodeTemplate> getNodeTemplateWithRelationshipChain( String relationShipType, TNodeTemplate node, TDefinitions def) { List<TNodeTemplate> lst = new ArrayList<TNodeTemplate>(); List<TRelationshipTemplate> lstrel = getRelationshipTemplateList(relationShipType, def); System.out.println("SEE NODES CONNECTION"); for (TRelationshipTemplate rel : lstrel) { System.out.println("Node: " + node.getId() + ". rel: " + rel.getId()); TEntityTemplate entity = (TEntityTemplate) rel.getTargetElement().getRef(); System.out.println("Entity: " + entity.getId()); if (node.getId().equals(entity.getId()) && entity.getClass().equals(TNodeTemplate.class)) { System.out.println("Node: " + node.getId() + ". rel: " + rel.getId()); TNodeTemplate targetNode = (TNodeTemplate) rel.getSourceElement().getRef(); lst.add(targetNode); System.out.println("List size: " + lst.size()); lst.addAll(getNodeTemplateWithRelationshipChain(relationShipType, targetNode, def)); // recursive } } if (node.getCapabilities() == null) { return lst; } List<TCapability> nodeCaps = node.getCapabilities().getCapability(); System.out.println("SEE CAP-REQ CONNECTION"); for (TCapability cap : nodeCaps) { System.out.println("Node: " + node.getId() + ". Capa: " + cap.getId()); for (TRelationshipTemplate rel : lstrel) { System.out.println("Node: " + node.getId() + ". rel: " + rel.getId()); TEntityTemplate relcap = (TEntityTemplate) rel.getSourceElement().getRef(); if (cap.getId().equals(relcap.getId()) && cap.getClass().equals(TCapability.class)) { TRequirement relreq = (TRequirement) rel.getTargetElement().getRef(); TNodeTemplate neibor = getNodetemplateOfRequirementOrCapability(relreq.getId(), def); lst.add(neibor); System.out.println("List size: " + lst.size()); lst.addAll(getNodeTemplateWithRelationshipChain(relationShipType, neibor, def)); // recursive } } } return lst; } public static TNodeTemplate getHostOnNode(TNodeTemplate node, TDefinitions def) { List<TRelationshipTemplate> relas = getRelationshipTemplateList(def); for (TRelationshipTemplate rela : relas) { if (rela.getSourceElement().getRef().getClass().equals(TNodeTemplate.class)) { TNodeTemplate source = (TNodeTemplate) rela.getSourceElement().getRef(); if (source.getId().equals(node.getId())) { return (TNodeTemplate) rela.getTargetElement().getRef(); } } } return null; } /** * Get NodeTemplate which have Requirement or Capability * * @param reqOrCap * @param def * @return Node or null of not found */ public static TNodeTemplate getNodetemplateOfRequirementOrCapability(TEntityTemplate reqOrCap, TDefinitions def) { List<TNodeTemplate> lst = getNodeTemplateList(def); List<TEntityTemplate> lst1 = new ArrayList<TEntityTemplate>(); for (TNodeTemplate node : lst) { if (node.getRequirements() != null) { lst1.addAll(node.getRequirements().getRequirement()); } if (node.getCapabilities() != null) { lst1.addAll(node.getCapabilities().getCapability()); } for (TEntityTemplate entity : lst1) { if (entity.equals(reqOrCap)) { return node; } } } return null; } /** * Get NodeTemplate which have Requirement or Capability * * @param reqOrCapId * @param def * @return Node or null of not found */ public static TNodeTemplate getNodetemplateOfRequirementOrCapability(String reqOrCapId, TDefinitions def) { List<TNodeTemplate> lst = getNodeTemplateList(def); for (TNodeTemplate node : lst) { if (node.getCapabilities() != null) { List<TCapability> lstcap = node.getCapabilities().getCapability(); for (TEntityTemplate entity : lstcap) { if (entity.getId().equals(reqOrCapId)) { return node; } } } if (node.getRequirements() != null) { List<TRequirement> lstreq = node.getRequirements().getRequirement(); for (TEntityTemplate entity : lstreq) { if (entity.getId().equals(reqOrCapId)) { return node; } } } } return null; } /** * Get the relationship between 2 node. Node1: capability, node2: requirement * * @param node1 * @param node2 * @param def * @return The relationship or null if not found */ public static TRelationshipTemplate getRelationshipBetweenTwoNode(TNodeTemplate node1, TNodeTemplate node2, TDefinitions def) { List<TRelationshipTemplate> lstrel = getRelationshipTemplateList(def); for (TRelationshipTemplate rel : lstrel) { if (rel.getSourceElement().getRef() instanceof TNodeTemplate) { if ((rel.getSourceElement().getRef().equals(node2) && rel.getSourceElement().getRef().equals(node1)) || (rel.getSourceElement().getRef().equals(node1) && rel.getSourceElement().getRef().equals(node2))) { return rel; } } else { if (node1.getCapabilities() != null && node2.getCapabilities() != null) { // Relationship must be (node1.capability,node2.requirement) // if (node1.getCapabilities().getCapability().contains((TCapability)getRequirementOrCapabilityById((String)rel.getSourceElement().getRef(), def)) // && node2.getRequirements().getRequirement().contains((TRequirement)getRequirementOrCapabilityById((String)rel.getTargetElement().getRef(), def))){ if (node1.getCapabilities().getCapability().contains((TCapability) rel.getSourceElement().getRef()) && node2.getRequirements().getRequirement().contains((TRequirement) rel.getTargetElement().getRef())) { return rel; } } } } return null; } public static TRelationshipTemplate getRelationshipBetweenTwoCapaReq(TCapability capa, TRequirement req, TDefinitions def) { List<TRelationshipTemplate> lstrel = getRelationshipTemplateList(def); System.out.println("TESTING capa: " + capa.getId() + " and req: " + req.getId()); for (TRelationshipTemplate rel : lstrel) { System.out.println("RELA: " + rel.getId()); if (rel.getSourceElement().getRef().equals(capa) && rel.getTargetElement().getRef().equals(req)) { return rel; } } return null; } public static TCapability getCapabilitySuitsRequirement(TRequirement req, TDefinitions def) { List<TRelationshipTemplate> rels = getRelationshipTemplateList(def); for (TRelationshipTemplate rel : rels) { TEntityTemplate target = (TEntityTemplate) rel.getTargetElement().getRef(); if (target.getId().equals(req.getId())) { return (TCapability) rel.getSourceElement().getRef(); } } return null; } public static TRequirement getRequirementSuitsCapability(TCapability capa, TDefinitions def) { List<TRelationshipTemplate> rels = getRelationshipTemplateList(def); for (TRelationshipTemplate rel : rels) { TEntityTemplate source = (TEntityTemplate) rel.getSourceElement().getRef(); if (source.getId().equals(capa.getId())) { return (TRequirement) rel.getTargetElement().getRef(); } } return null; } public static TTopologyTemplate getTopologyTemplateOfNode(TNodeTemplate node, TDefinitions def) { List<TExtensibleElements> eles = def.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); for (TExtensibleElements element : eles) { if (element.getClass().equals(TServiceTemplate.class)) { TServiceTemplate ser = (TServiceTemplate) element; List<TEntityTemplate> entities = ser.getTopologyTemplate().getNodeTemplateOrRelationshipTemplate(); for (TEntityTemplate entity : entities) { if (entity.getId().equals(node.getId())) { return ser.getTopologyTemplate(); } } } } return null; } public static TNodeTemplate getNodeTemplate_ofOSType_ThatHost(TNodeTemplate node, TDefinitions def) { // this is the OS Node if (node.getType().getLocalPart().equals(SalsaEntityType.OPERATING_SYSTEM.getEntityTypeString())) { return node; } TNodeTemplate hostNode = getHostOnNode(node, def); while (hostNode != null && !hostNode.getType().getLocalPart().equals(SalsaEntityType.OPERATING_SYSTEM.getEntityTypeString())) { hostNode = getHostOnNode(hostNode, def); } return hostNode; } }