/* * 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.smartdeployment.SALSA; 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.TDeploymentArtifacts; import generated.oasis.tosca.TEntityTemplate; import generated.oasis.tosca.TEntityTemplate.Properties; import generated.oasis.tosca.TExtensibleElements; import generated.oasis.tosca.TNodeTemplate; import generated.oasis.tosca.TNodeTemplate.Capabilities; import generated.oasis.tosca.TNodeTemplate.Requirements; import generated.oasis.tosca.TRelationshipTemplate; import generated.oasis.tosca.TRelationshipTemplate.SourceElement; import generated.oasis.tosca.TRelationshipTemplate.TargetElement; import generated.oasis.tosca.TRequirement; import generated.oasis.tosca.TServiceTemplate; import generated.oasis.tosca.TTopologyTemplate; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import at.ac.tuwien.dsg.cloud.salsa.common.artifact.Artifact; import at.ac.tuwien.dsg.cloud.salsa.common.artifact.ArtifactFormat; import at.ac.tuwien.dsg.cloud.salsa.common.artifact.Artifacts; import at.ac.tuwien.dsg.cloud.salsa.common.artifact.Repositories; import at.ac.tuwien.dsg.cloud.salsa.common.artifact.RepositoryFormat; import at.ac.tuwien.dsg.cloud.salsa.common.cloudservice.model.enums.SalsaEntityType; import at.ac.tuwien.dsg.cloud.salsa.common.cloudservice.model.enums.SalsaRelationshipType; import at.ac.tuwien.dsg.cloud.salsa.common.interfaces.SalsaException; import at.ac.tuwien.dsg.cloud.salsa.engine.exceptions.ServicedataProcessingException; import at.ac.tuwien.dsg.cloud.salsa.engine.utils.EngineLogger; import at.ac.tuwien.dsg.cloud.salsa.engine.utils.SalsaConfiguration; import at.ac.tuwien.dsg.cloud.salsa.tosca.extension.SalsaMappingProperties; import at.ac.tuwien.dsg.cloud.salsa.tosca.extension.SalsaMappingProperties.SalsaMappingProperty; import at.ac.tuwien.dsg.cloud.salsa.engine.dataprocessing.ToscaStructureQuery; import at.ac.tuwien.dsg.cloud.salsa.engine.dataprocessing.ToscaXmlProcess; import java.util.logging.Level; import java.util.logging.Logger; /** * This class contain methods to enrich the Tosca: - Generate dependency nodes - Reduce node to the infrastructure level at different format * * @author Duc-Hung Le * */ public class ToscaEnricherSALSA { TDefinitions toscaDef; TDefinitions knowledgeBase; TTopologyTemplate knowledgeTopo; Artifacts artifactList = new Artifacts(); Repositories repoList = new Repositories(); public ToscaEnricherSALSA(TDefinitions def) { this.toscaDef = def; try { knowledgeBase = ToscaXmlProcess.readToscaFile(ToscaEnricherSALSA.class .getResource("/data/salsa.knowledge.xml").getFile()); knowledgeTopo = ((TServiceTemplate) knowledgeBase.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().get(0)).getTopologyTemplate(); artifactList.importFromXML(ToscaEnricherSALSA.class.getResource("/data/salsa.artifacts.xml").getFile()); repoList.importFromXML(ToscaEnricherSALSA.class.getResource("/data/salsa.repo.xml").getFile()); } catch (IOException e1) { EngineLogger.logger.error("Not found knowledge base file. " + e1); } catch (JAXBException e2) { EngineLogger.logger.error("Error when parsing knowledge base file. " + e2); } } public TDefinitions enrichHighLevelTosca() throws SalsaException { // TODO: implement the looping of all ServiceTemplate Topology List<TExtensibleElements> ees = toscaDef.getServiceTemplateOrNodeTypeOrNodeTypeImplementation(); for (TExtensibleElements ee : ees) { if (ee.getClass().equals(TServiceTemplate.class)) { System.out.println("Enriching in: " + ((TServiceTemplate) ee).getId()); TTopologyTemplate topo = ((TServiceTemplate) ee).getTopologyTemplate(); //List<TEntityTemplate> nodeLst = topo.getNodeTemplateOrRelationshipTemplate(); List<TNodeTemplate> nodeLst = ToscaStructureQuery.getNodeTemplateList((TServiceTemplate) ee); // read all NodeTemplate of the ServiceTemplate //List<TNodeTemplate> nodeLst = ToscaStructureQuery .getNodeTemplateList(toscaDef); for (TEntityTemplate node : nodeLst) { System.out.println("NODE: " + node.getId()); if (node.getClass().equals(TNodeTemplate.class)) { addHostonNodeForOneNodeTemplate((TNodeTemplate) node, topo); } } //cleanEmptyProperties(nodeLst); cleanLOCALRelationship(topo); // enrichArtifactRepo(SalsaConfiguration.getRepoPrefix() + "/" + toscaDef.getId()); enrichArtifactRepo(SalsaConfiguration.getRepoPrefix() + "/" + toscaDef.getId()); addOSNodeConfig(topo); createComplexRelationship(SalsaRelationshipType.CONNECTTO, this.toscaDef); } } //TTopologyTemplate topo = ((TServiceTemplate) toscaDef.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().get(0)).getTopologyTemplate(); return null; } /* * This method generate the node that can host the current node. E.g: war -> * tomcat -> jre -> VM software -> VM jar -> jre -> VM */ int counter = 0; public TNodeTemplate addHostonNodeForOneNodeTemplate(TNodeTemplate node, TTopologyTemplate topo) throws SalsaException{ /* iterate through the knowledge topology and extend a node if needed. * - Retrieve new node, add an artifact reference, add into this.def * - Create new HOSTON relationship, add into this.def * - Query the artifact repo, create artifact template with id of the reference above * */ EngineLogger.logger.debug("Enriching node: " + node.getId()); // find if there is a node that host this node, so it doesn't need to be generated TNodeTemplate hostedNode = getHostedNode(node, topo); if (hostedNode != null) { System.out.println("This node already has a node that hosts it: " + hostedNode.getId()); return hostedNode; } TNodeTemplate nextNode = null; // if there are some LOCAL relationship, and we deploy on the same target List<TNodeTemplate> localNodes = getLocalNode(node, topo); for (TNodeTemplate localNode : localNodes) { hostedNode = getHostedNode(localNode, topo); if (hostedNode != null) { System.out.println("Found a LOCAL rela between 2 node: " + localNode.getId() + " and " + node.getId()); nextNode = hostedNode; } } // if we found no hosted node, try to create a new node if (nextNode == null) { nextNode = nextNewNode(node); if (nextNode == null) { System.out.println("This node is OS type, no more extending"); return null; // no more extending. } EngineLogger.logger.debug("Generated a next node of type: " + nextNode.getId()); topo.getNodeTemplateOrRelationshipTemplate().add(nextNode); Artifact art = this.artifactList.searchArtifact(nextNode.getId()); // refine some fields nextNode.setType(new QName(nextNode.getId())); nextNode.setId(nextNode.getId() + "_OF_" + node.getId()); // nextNode.setMinInstances(1); // nextNode.setMaxInstances("unbounded"); if (node.getReference() != null) { String[] ref = node.getReference().split("/"); nextNode.setReference(ref[0] + "/" + nextNode.getId()); } if (art != null) { // some node have artifact. some node like os doesn't String artId = "Artifact_" + nextNode.getId(); // build the deployment artifact and attach to the new node TDeploymentArtifact dArt = new TDeploymentArtifact(); dArt.setArtifactRef(new QName(artId)); dArt.setArtifactType(new QName(art.getFirstMirror().getArtifactFormat().toString())); dArt.setName("Artifact for " + nextNode.getId()); TDeploymentArtifacts dArts = new TDeploymentArtifacts(); dArts.getDeploymentArtifact().add(dArt); nextNode.setDeploymentArtifacts(dArts); // merge the repository info with above artifact to have full direct URL String repoEndpoint = repoList.getRepoEndpoint(art.getFirstMirror().getRepository()); TArtifactTemplate artTemp = new TArtifactTemplate(); artTemp.setId(repoEndpoint + art.getFirstMirror().getReference()); TDeploymentArtifact da = new TDeploymentArtifact(); da.setArtifactType(new QName(art.getFirstMirror().getArtifactFormat().toString())); da.setArtifactRef(new QName("Artifact_OF_" + nextNode.getId())); nextNode.getDeploymentArtifacts().getDeploymentArtifact().add(da); toscaDef.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(artTemp); } } // relationship between node and newNode TRelationshipTemplate rela = createNewRela(node, nextNode); topo.getNodeTemplateOrRelationshipTemplate().add(rela); // move properties moveProperties(node, nextNode, node.getType().getLocalPart()); // Add the operations to that node properties. After the moving above, we have properties if (nextNode.getProperties() == null) { nextNode.setProperties(new Properties()); } // try { // SalsaMappingProperties operProps = (SalsaMappingProperties)nextNode.getProperties().getAny(); // SalsaMappingProperties.SalsaMappingProperty map = new SalsaMappingProperties.SalsaMappingProperty(); // map.setPropType("operations"); // if (art!=null && art.getOperationList()!=null){ // for (Operation ope : art.getOperationList()) { // map.put(ope.getOpName(), ope.getOpCommand()); // } // operProps.getProperties().add(map); // } //some debug // ToscaXmlProcess.writeToscaDefinitionToFile(toscaDef, "/tmp/salsa/" + counter + ".xml"); // } catch (JAXBException | IOException ex) { // throw new ServicedataProcessingException(toscaDef.getId(), ex); // } // recursive addHostonNodeForOneNodeTemplate(nextNode, topo); counter++; return nextNode; } // end method host on adding public void addLocalDependencyNodeForOneNodeTemplate(TNodeTemplate node, TTopologyTemplate topo) { EngineLogger.logger.debug("Enriching node: " + node.getId()); List<TNodeTemplate> lst = getLocalNode(node, topo); for (TNodeTemplate nextNode : lst) { EngineLogger.logger.debug("Generated a local node of type: " + nextNode.getId()); topo.getNodeTemplateOrRelationshipTemplate().add(nextNode); Artifact art = this.artifactList.searchArtifact(nextNode.getId()); // refine some fields nextNode.setType(new QName(nextNode.getId())); nextNode.setId(nextNode.getId() + "_OF_" + node.getId()); if (node.getReference() != null) { String[] ref = node.getReference().split("/"); nextNode.setReference(ref[0] + "/" + nextNode.getId()); } if (art != null) { // some node have artifact. some node like os doesn't String artId = "Artifact_" + nextNode.getId(); // build the deployment artifact and attach to the new node TDeploymentArtifact dArt = new TDeploymentArtifact(); dArt.setArtifactRef(new QName(artId)); dArt.setArtifactType(new QName(art.getFirstMirror().getArtifactFormat().toString())); dArt.setName("Artifact for " + nextNode.getId()); TDeploymentArtifacts dArts = new TDeploymentArtifacts(); dArts.getDeploymentArtifact().add(dArt); nextNode.setDeploymentArtifacts(dArts); // merge the repository info with above artifact to have full direct URL String repoEndpoint = repoList.getRepoEndpoint(art.getFirstMirror().getRepository()); TArtifactTemplate artTemp = new TArtifactTemplate(); artTemp.setId(repoEndpoint + art.getFirstMirror().getReference()); TDeploymentArtifact da = new TDeploymentArtifact(); da.setArtifactType(new QName(art.getFirstMirror().getArtifactFormat().toString())); da.setArtifactRef(new QName("Artifact_OF_" + nextNode.getId())); nextNode.getDeploymentArtifacts().getDeploymentArtifact().add(da); toscaDef.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(artTemp); } // relationship between node and newNode TRelationshipTemplate rela = createNewRela(node, nextNode); topo.getNodeTemplateOrRelationshipTemplate().add(rela); } } private TRelationshipTemplate createNewRela(TNodeTemplate node, TNodeTemplate nextNode) { System.out.println("Create new Relationship between: " + node.getId() + " and " + nextNode.getId()); TRelationshipTemplate rela = new TRelationshipTemplate(); rela.setId(node.getId() + "_HOSTON_" + nextNode.getId()); rela.setType(new QName(SalsaRelationshipType.HOSTON.getRelationshipTypeString())); SourceElement source = new SourceElement(); source.setRef(node); TargetElement target = new TargetElement(); target.setRef(nextNode); rela.setSourceElement(source); rela.setTargetElement(target); return rela; } private TNodeTemplate getHostedNode(TNodeTemplate node, TTopologyTemplate topo) { List<TEntityTemplate> entities = topo.getNodeTemplateOrRelationshipTemplate(); for (TEntityTemplate enti : entities) { if (enti.getClass().equals(TRelationshipTemplate.class)) { System.out.println("Looking for HostOn node. Checking Rela: " + enti.getId() + ", type: " + ((TRelationshipTemplate) enti).getType().getLocalPart()); if (((TRelationshipTemplate) enti).getType().getLocalPart().equals(SalsaRelationshipType.HOSTON.getRelationshipTypeString())) { SourceElement source = ((TRelationshipTemplate) enti).getSourceElement(); if (node.getId().equals(((TEntityTemplate) source.getRef()).getId())) { TargetElement target = ((TRelationshipTemplate) enti).getTargetElement(); return (TNodeTemplate) target.getRef(); } } } } return null; } private SalsaRelationshipType getRelaBetweenTwoNode(TNodeTemplate node1, TNodeTemplate node2, TTopologyTemplate topo) { List<TEntityTemplate> entities = topo.getNodeTemplateOrRelationshipTemplate(); for (TEntityTemplate enti : entities) { if (enti.getClass().equals(TRelationshipTemplate.class)) { TEntityTemplate e1 = (TEntityTemplate) ((TRelationshipTemplate) enti).getSourceElement().getRef(); TEntityTemplate e2 = (TEntityTemplate) ((TRelationshipTemplate) enti).getTargetElement().getRef(); if (e1.getId().equals(node1.getId()) && e2.getId().equals(node2.getId())) { return SalsaRelationshipType.fromString(enti.getType().getLocalPart()); } if (e2.getId().equals(node1.getId()) && e1.getId().equals(node2.getId())) { return SalsaRelationshipType.fromString(enti.getType().getLocalPart()); } } } return null; } private List<TNodeTemplate> getLocalNode(TNodeTemplate node, TTopologyTemplate topo) { List<TNodeTemplate> result = new ArrayList<>(); List<TEntityTemplate> entities = topo.getNodeTemplateOrRelationshipTemplate(); for (TEntityTemplate enti : entities) { if (enti.getClass().equals(TNodeTemplate.class)) { if (getRelaBetweenTwoNode(node, (TNodeTemplate) enti, topo) == SalsaRelationshipType.LOCAL) { result.add((TNodeTemplate) enti); } } } return result; } private TNodeTemplate nextNewNode(TNodeTemplate node) { // search on the knowledge the relationship which node is the source List<TRelationshipTemplate> relaList = ToscaStructureQuery.getRelationshipTemplateList(knowledgeTopo); for (TRelationshipTemplate rela : relaList) { TNodeTemplate source = (TNodeTemplate) rela.getSourceElement().getRef(); if (source.getId().equals(node.getType().getLocalPart())) { TNodeTemplate newNode = new TNodeTemplate(); TNodeTemplate refNode = (TNodeTemplate) rela.getTargetElement().getRef(); newNode.setId(refNode.getId()); if (refNode.getProperties() != null && refNode.getProperties().getAny() != null) { newNode.setProperties(new Properties()); newNode.getProperties().setAny((refNode.getProperties().getAny())); newNode.setMinInstances(refNode.getMinInstances()); newNode.setMaxInstances(refNode.getMaxInstances()); } return newNode; } } return null; } private List<TNodeTemplate> nextNewNodeLOCAL(TNodeTemplate node) { // search on the knowledge the relationship which node is the source List<TRelationshipTemplate> relaList = ToscaStructureQuery.getRelationshipTemplateList(knowledgeTopo); List<TNodeTemplate> localDependency = new ArrayList<TNodeTemplate>(); for (TRelationshipTemplate rela : relaList) { if (rela.getType().getLocalPart().equals(SalsaRelationshipType.LOCAL.getRelationshipTypeString())) { TNodeTemplate source = (TNodeTemplate) rela.getSourceElement().getRef(); if (source.getId().equals(node.getType().getLocalPart())) { TNodeTemplate newNode = new TNodeTemplate(); TNodeTemplate refNode = (TNodeTemplate) rela.getTargetElement().getRef(); newNode.setId(refNode.getId()); if (refNode.getProperties() != null && refNode.getProperties().getAny() != null) { newNode.setProperties(new Properties()); newNode.getProperties().setAny((refNode.getProperties().getAny())); newNode.setMinInstances(refNode.getMinInstances()); newNode.setMaxInstances(refNode.getMaxInstances()); } localDependency.add(newNode); } } } return localDependency; } /* * Mode all properties which not belong to node1 to node2 node2.properties * will be deleted and replace with new one */ private void moveProperties(TNodeTemplate node1, TNodeTemplate node2, String keepType) { if (node1.getProperties() == null || node1.getProperties().getAny() == null) { return; } System.out.println("moving " + node1.getId() + " to " + node2.getId()); SalsaMappingProperties p1 = (SalsaMappingProperties) node1.getProperties().getAny(); EngineLogger.logger.debug("movingProperties - 1"); List<SalsaMappingProperty> fixedListP1 = new ArrayList<>(p1.getProperties()); EngineLogger.logger.debug("movingProperties - 2"); SalsaMappingProperties newProp = null; if (node2.getProperties() != null && node2.getProperties().getAny() != null) { EngineLogger.logger.debug("movingProperties - 2-1"); newProp = (SalsaMappingProperties) node2.getProperties().getAny(); if (newProp == null) { EngineLogger.logger.debug("movingProperties - 2-1-1-1-1-1"); } } else { EngineLogger.logger.debug("movingProperties - 2-2"); newProp = new SalsaMappingProperties(); } EngineLogger.logger.debug("movingProperties - 3"); for (SalsaMappingProperty prop : fixedListP1) { if (!prop.getType().equals(keepType) && !prop.getType().equals("BundleConfig") && !prop.getType().equals("Operations") && !prop.getType().equals("action")) { // move from req.prop ==> node.prop EngineLogger.logger.debug("movingProperties - 4"); //p2.getProperties().add(prop); newProp.getProperties().add(prop); EngineLogger.logger.debug("movingProperties - 4-1"); p1.getProperties().remove(prop); EngineLogger.logger.debug("movingProperties - 4-2"); } } EngineLogger.logger.debug("movingProperties - 5"); Properties toscaProp = new Properties(); toscaProp.setAny(newProp); EngineLogger.logger.debug("movingProperties - 6"); node2.setProperties(toscaProp); EngineLogger.logger.debug("movingProperties - 7"); } private void cleanEmptyProperties(List<TNodeTemplate> nodeLst) { for (TNodeTemplate node : nodeLst) { if (node.getProperties() != null) { SalsaMappingProperties maps = (SalsaMappingProperties) node.getProperties().getAny(); if (maps.getProperties().size() == 0) { node.setProperties(null); } } } } private void cleanLOCALRelationship(TTopologyTemplate topo) { List<TEntityTemplate> entities = topo.getNodeTemplateOrRelationshipTemplate(); Iterator<TEntityTemplate> iterator = entities.iterator(); while (iterator.hasNext()) { TEntityTemplate enti = iterator.next(); if (enti.getClass().equals(TRelationshipTemplate.class)) { if (((TRelationshipTemplate) enti).getType().getLocalPart().equals(SalsaRelationshipType.LOCAL.getRelationshipTypeString())) { iterator.remove(); } } } } private void addOSNodeConfig(TTopologyTemplate topo) { List<TEntityTemplate> entities = topo.getNodeTemplateOrRelationshipTemplate(); boolean found = false; for (TEntityTemplate enti : entities) { if (enti.getType().getLocalPart().equals(SalsaEntityType.OPERATING_SYSTEM.getEntityTypeString())) { System.out.println("Checking OS configuration for node: " + enti.getId()); TNodeTemplate node = (TNodeTemplate) enti; SalsaMappingProperties maps = null; if (node.getProperties() == null) { System.out.println("OS node " + enti.getId() + " has no properties field"); maps = new SalsaMappingProperties(); } else { System.out.println("debug 1"); maps = (SalsaMappingProperties) node.getProperties().getAny(); System.out.println("debug 2"); if (maps == null) { System.out.println("debug 3"); maps = new SalsaMappingProperties(); } found = false; for (SalsaMappingProperty imap : maps.getProperties()) { System.out.println("debug 4"); if (imap.getType().equals(SalsaEntityType.OPERATING_SYSTEM.getEntityTypeString())) { System.out.println("The OS node " + enti.getId() + " has the OS property already, no change."); found = true; } } if (found) { continue; } } if (!found) { System.out.println("Start write out some configuration for node: " + enti.getId()); // can put some optimization processing here, now get the default values InputStream input = ToscaEnricherSALSA.class.getResourceAsStream("/cloudconfig.default.properties"); java.util.Properties prop = new java.util.Properties(); try { prop.load(input); } catch (IOException e) { EngineLogger.logger.error("Couldn't find the default cloud configuration file."); return; } String provider = prop.getProperty("provider"); String instanceType = prop.getProperty("instanceType"); String baseImage = prop.getProperty("baseImage"); String packages = ""; System.out.println("Write the configuration: " + provider + ", " + instanceType + ", " + baseImage); Map<String, String> map = new HashMap<>(); map.put("provider", provider); map.put("instanceType", instanceType); map.put("baseImage", baseImage); map.put("packages", packages); maps.put(SalsaEntityType.OPERATING_SYSTEM.getEntityTypeString(), map); EngineLogger.logger.debug("Map of properties is created"); node.getProperties().setAny(maps); node.setMinInstances(1); node.setMaxInstances("unbounded"); EngineLogger.logger.debug("Done adding configuration"); } //if !found } } } public void createComplexRelationship(SalsaRelationshipType type, TDefinitions def) { List<TRelationshipTemplate> lst = ToscaStructureQuery.getRelationshipTemplateList(def); for (TRelationshipTemplate rela : lst) { if (rela.getType().getLocalPart().equals(type.getRelationshipTypeString())) { createRelationshipWithCapabilityAndRequirement(rela); } } } /* * Add capability and requirement for nodes if relationship is at two node * Node source: requirement, node target: capability */ private void createRelationshipWithCapabilityAndRequirement(TRelationshipTemplate rela) { SourceElement testNode = rela.getSourceElement(); if (testNode.getRef().getClass().equals(TNodeTemplate.class)) { // rela between 2 node TNodeTemplate node2 = (TNodeTemplate) rela.getSourceElement().getRef(); TNodeTemplate node1 = (TNodeTemplate) rela.getTargetElement().getRef(); if (node1.getCapabilities() == null) { node1.setCapabilities(new Capabilities()); } TCapability newCapa = new TCapability(); newCapa.setId(node1.getId() + "_capa_for_" + node2.getId()); newCapa.setName(node1.getId() + "_capa_for_" + node2.getId()); node1.getCapabilities().getCapability().add(newCapa); if (node2.getRequirements() == null) { node2.setRequirements(new Requirements()); } TRequirement newReq = new TRequirement(); newReq.setId(node2.getId() + "_req_" + node1.getId()); newReq.setName(node2.getId() + "_req_" + node1.getId()); node2.getRequirements().getRequirement().add(newReq); SourceElement sou = new SourceElement(); sou.setRef(newCapa); rela.setSourceElement(sou); TargetElement tar = new TargetElement(); tar.setRef(newReq); rela.setTargetElement(tar); //topo.getNodeTemplateOrRelationshipTemplate().add(rela); } } private void enrichArtifactRepo(String prefixRepo) { for (TExtensibleElements ee : toscaDef.getServiceTemplateOrNodeTypeOrNodeTypeImplementation()) { if (ee.getClass().equals(TArtifactTemplate.class)) { if (((TArtifactTemplate) ee).getArtifactReferences() != null) { for (TArtifactReference ref : ((TArtifactTemplate) ee).getArtifactReferences().getArtifactReference()) { String refstr = ref.getReference(); if (!refstr.startsWith("http://") && !refstr.startsWith("https://") && !refstr.startsWith("file://")) { refstr = refstr.startsWith("/") ? refstr.substring(1) : refstr; ref.setReference(prefixRepo + "/" + refstr); } } } } } } /* * Generate: knowledge base, artifact mapping, repositories */ public static void main(String[] args) throws Exception { // generate a set of node template of specific type SALSA support which // use for the enricher } private static void generateDataFile() { TDefinitions defi = new TDefinitions(); TServiceTemplate ser = new TServiceTemplate(); defi.getServiceTemplateOrNodeTypeOrNodeTypeImplementation().add(ser); ser.setTopologyTemplate(new TTopologyTemplate()); ser.getTopologyTemplate().getNodeTemplateOrRelationshipTemplate(); List<TEntityTemplate> en = ser.getTopologyTemplate() .getNodeTemplateOrRelationshipTemplate(); TNodeTemplate os_node = new TNodeTemplate(); os_node.setId("os"); SalsaMappingProperties map = new SalsaMappingProperties(); map.put("os", "instanceType", "000000960"); map.put("os", "provider", "dsg@openstack"); map.put("os", "baseImage", "000000960"); map.put("os", "packages", ""); os_node.getProperties().setAny(map); en.add(generateNode("os")); en.add(generateNode("bin")); en.add(generateNode("sh")); en.add(generateNode("jre")); en.add(generateNode("tomcat")); en.add(generateNode("war")); en.add(generateNode("image")); en.add(generateNode("software")); en.add(generateRela("software", "os", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("sh", "os", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("bin", "os", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("jre", "os", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("tomcat", "os", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("war", "tomcat", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("image", "os", SalsaRelationshipType.HOSTON, defi)); en.add(generateRela("tomcat", "jre", SalsaRelationshipType.LOCAL, defi)); // remove // tomcat-LOCAL-jre, // add // jre-hoston-os_tomcat try { ToscaXmlProcess.writeToscaElementToFile(defi,"/tmp/salsa.knowledge.xml"); } catch (JAXBException | IOException ex) { System.out.println("Cannot write TOSCA knowlegde file."); } // Generate the repository // Repositories repos = new Repositories(); // repos.addRepo( // "salsa-repo", // RepositoryFormat.maven2, // "http://128.130.172.215:8080/nexus-2.8.0-05/service/local/artifact/maven/redirect?"); // repos.addRepo("github", RepositoryFormat.git, "https://github.com/"); // repos.addRepo( // "dsg-openstack-image", // RepositoryFormat.nova, // "http://openstack.infosys.tuwien.ac.at:8774/v2/9fee130e30784e33a7d3c9bd4f5a60ce"); // repos.addRepo("local", RepositoryFormat.apt, ""); // repos.exportToXML("/tmp/salsa.repo.xml"); // generate the artifact type Artifacts arts = new Artifacts(); Artifact art = new Artifact("tomcat7", ArtifactFormat.deb, "local", "tomcat7"); art.addOperation("deploy", "apt-get -y install tomcat7"); art.addOperation("undeploy", "apt-get -y remove tomcat7"); art.addOperation("start", "service tomcat7 start"); art.addOperation("stop", "service tomcat7 start"); art.addOperation("pid", "/var/run/tomcat7.pid"); arts.add(art); art = new Artifact("apache2", ArtifactFormat.deb, "local", "apache2"); art.addOperation("deploy", "apt-get -y install apache2"); art.addOperation("undeploy", "apt-get -y remove apache2"); art.addOperation("start", "service apache2 start"); art.addOperation("stop", "service apache2 start"); art.addOperation("pid", "/run/apache2.pid"); arts.add(art); art = new Artifact("mela", ArtifactFormat.sh, "salsa-repo", "r=salsa-artifacts&g=mela-server&a=install-mela&v=LATEST&e=sh"); art.addOperation("deploy", "install-mela.sh"); art.addOperation("start", "/etc/init.d/mela-data-service start; /etc/init.d/mela-analysis-service start"); art.addOperation("stop", "/etc/init.d/mela-data-service stop; /etc/init.d/mela-analysis-service stop"); art.addOperation("pid", "/tmp/mela-analysis-service.pid"); arts.add(art); // arts.add(new Artifact("hadoop", ArtifactFormat.sh, "salsa-repo", // "")); arts.exportToXML("/tmp/salsa.artifacts.xml"); } private static TRelationshipTemplate generateRela(String source, String target, SalsaRelationshipType type, TDefinitions def) { TRelationshipTemplate rela = new TRelationshipTemplate(); SourceElement s = new SourceElement(); s.setRef(ToscaStructureQuery.getNodetemplateById(source, def)); TargetElement t = new TargetElement(); t.setRef(ToscaStructureQuery.getNodetemplateById(target, def)); rela.setSourceElement(s); rela.setTargetElement(t); rela.setType(new QName(type.toString())); return rela; } private static TNodeTemplate generateNode(String type) { TNodeTemplate node = new TNodeTemplate(); node.setId(type); return node; } }