/******************************************************************************* * Copyright (c) 2015 Inria * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * - Philippe Merle <philippe.merle@inria.fr> *******************************************************************************/ package org.occiware.clouddesigner.occi.simulation.design.services; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.business.api.session.SessionManager; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.occiware.clouddesigner.occi.Attribute; import org.occiware.clouddesigner.occi.AttributeState; import org.occiware.clouddesigner.occi.Configuration; import org.occiware.clouddesigner.occi.Extension; import org.occiware.clouddesigner.occi.Kind; import org.occiware.clouddesigner.occi.Link; import org.occiware.clouddesigner.occi.Mixin; import org.occiware.clouddesigner.occi.OCCIFactory; import org.occiware.clouddesigner.occi.OCCIRegistry; import org.occiware.clouddesigner.occi.Resource; import org.occiware.clouddesigner.occi.design.dialog.LoadExtensionDialog; import org.occiware.clouddesigner.occi.simulation.cloudsim.handlers.BrigeConfigSimulation; import org.occiware.clouddesigner.occi.simulation.cloudsim.handlers.Parser.Entity; import org.occiware.clouddesigner.occi.util.OcciHelper; import org.occiware.clouddesigner.occi.simulation.cloudsim.handlers.Simulation; public class DesignServices { public static final Set<String> attributesToOmit = new HashSet<String>(); static { attributesToOmit.add("occi.core.id"); attributesToOmit.add("occi.core.source"); attributesToOmit.add("occi.core.target"); }; String scheme = "http://occiware.org/simulation#"; String core = "http://schemas.ogf.org/occi/core#"; public void tagDatacenter(Resource resource) { tagResource(resource, "datacenter"); } public void tagHost(Resource resource) { tagResource(resource, "host"); } public void tagVM(Resource resource) { tagResource(resource, "VM"); } public void tagApplication(Resource resource) { tagResource(resource, "cloudlet"); } public void tagStorage(Resource resource) { //tagResource(resource, "storage"); System.out.println("Not yet implemented"); } public void tagNetwork(Resource resource) { //tagResource(resource, "network"); System.out.println("Not yet implemented"); } public void addPackage(Resource resource){ //add core to use package Configuration configuration = OcciHelper.getConfiguration(resource); Extension extension = OcciHelper.loadExtension(resource.getKind().getScheme()); List<Extension> extensions = configuration.getUse(); if(extensions.size() == 0){ configuration.getUse().add(OcciHelper.loadExtension(scheme)); configuration.getUse().add(OcciHelper.loadExtension(core)); }else { if(!schemeExists(configuration, extension.getScheme())){ configuration.getUse().add(OcciHelper.loadExtension(resource.getKind().getScheme())); } } } public static boolean schemeExists(Configuration configuration, String scheme){ Extension extension = OcciHelper.loadExtension(scheme); ArrayList<String> schemas = new ArrayList<String>(); for(Extension ex: configuration.getUse()){ schemas.add(ex.getScheme()); } return schemas.contains(extension.getScheme()); } public boolean isCompute(Resource resource){ String scheme = resource.getKind().getScheme(); String term = resource.getKind().getTerm(); final Extension extension = OcciHelper.loadExtension(scheme); for(Kind kind: extension.getKinds()){ if(kind.getTerm().equals(term)){ Kind d = kind.getParent(); while(d!=null && !d.getTerm().equals("compute")){ d = d.getParent(); } if(d !=null && d.getTerm().equals("compute")) return true; } } return false; } public void tagResource(Resource resource, String term) { if(resource.getKind().getTerm().equals("resource") || isCompute(resource)){ //add core to use package addPackage(resource); //if resource is tagged if(tagedBefore(resource)){ JOptionPane.showMessageDialog(null, "This resource is tagged"); return; } final Extension extension = OcciHelper.loadExtension(scheme); for (Mixin mixin : extension.getMixins()) { if(mixin.getTerm().contains(term)){ resource.getMixins().add(mixin); for(Attribute att: mixin.getAttributes()){ AttributeState as = OCCIFactory.eINSTANCE.createAttributeState(); as.setName(att.getName()); as.setValue(att.getDefault()); resource.getAttributes().add(as); } } } }else{ System.out.println("This resource is not a compute"); Shell shell = this.getShell(); MessageDialog.openInformation(shell, "Info", "This resource is not a compute"); } } public void start(Configuration config) { System.out.println("start simulation ... "); //print(conf); BrigeConfigSimulation bridge = new BrigeConfigSimulation(config); Map<Entity, Set<Entity>> entities= bridge.ExtaractEntities(); Shell shell = this.getShell(); String msg = bridge.checkEntities(); //System.out.println("msg: "+msg); if(msg==null){ System.out.println("Configuration contains correct informations"); Simulation simulation = new Simulation(entities); simulation.runExtension(); if(simulation.getCloudSimError()){ JOptionPane.showMessageDialog(null, "Thanks to verify your configuration", "Simulation Result", JOptionPane.INFORMATION_MESSAGE); return; } //verify the additionnal entities verifyTheAdditionnalResource(simulation.entities, config); JOptionPane.showMessageDialog(null, simulation.getResult(), "Simulation Result", JOptionPane.INFORMATION_MESSAGE); return; }else{ System.err.println("Thanks to verify your linked resources in configuration"); MessageDialog.openInformation(shell, "Info", "Thanks to verify your linked resources in configuration \n" + msg); } } public boolean tagedBefore(Resource resource){ for(Mixin mixin : resource.getMixins()){ if(mixin.getTerm().equals("datacenter") || mixin.getTerm().equals("host") || mixin.getTerm().equals("VM") || mixin.getTerm().equals("cloudlet")) return true; } return false; } public Shell getShell() { Display _current = Display.getCurrent(); return _current.getActiveShell(); } public static void print(Configuration configuration) { System.out.println("Configuration"); System.out.println(" - used extensions:"); for(Extension extension : configuration.getUse()) { System.out.println(" * Extension " + extension.getName() + " " + extension.getScheme()); } System.out.println(" - resources:"); for(Resource resource : configuration.getResources()) { System.out.println(" * Resource id " + resource.getId()); Kind resourceKind = resource.getKind(); System.out.println(" - Kind " + resourceKind.getScheme() + resourceKind.getTerm()); System.out.println(" - mixins:"); for(Mixin mixin : resource.getMixins()) { System.out.println(" * Mixin " + mixin.getScheme() + mixin.getTerm()); } System.out.println(" - attributes:"); for(AttributeState as : resource.getAttributes()) { System.out.println(" * AttributeState " + as.getName() + "=" + as.getValue()); } System.out.println(" - links:"); for(Link link : resource.getLinks()) { System.out.println(" * Link id " + link.getId()); Kind linkKind = link.getKind(); System.out.println(" - Kind " + linkKind.getScheme() + linkKind.getTerm()); System.out.println(" - mixins:"); for(Mixin mixin : link.getMixins()) { System.out.println(" * Mixin " + mixin.getScheme() + mixin.getTerm()); } System.out.println(" - attributes:"); for(AttributeState as : link.getAttributes()) { System.out.println(" * AttributeState " + as.getName() + "=" + as.getValue()); } Resource source = link.getSource(); System.out.println(" - source id " + source.getId()); Resource target = link.getTarget(); if(target != null) { System.out.println(" - target id " + target.getId()); } else { System.out.println(" - no target"); } } } } public void importConfiguration(Configuration configuration) { Shell shell = Display.getCurrent().getActiveShell(); Session session = SessionManager.INSTANCE.getSession(configuration); //LoadExtensionDialog dialog = new LoadExtensionDialog(shell, session.getTransactionalEditingDomain()); LoadConfigurationDialog dialog = new LoadConfigurationDialog(shell, session.getTransactionalEditingDomain()); dialog.open(); if(!schemeExists(configuration, scheme)){ org.occiware.clouddesigner.occi.Extension extension = OcciHelper.loadExtension(scheme); configuration.getUse().add(extension); } URI uri_ = dialog.getURIs().get(0); Configuration conf = OcciHelper.loadConfiguration(uri_.toString()); org.occiware.clouddesigner.occi.OCCIFactory factory = org.occiware.clouddesigner.occi.OCCIFactory.eINSTANCE; List<org.occiware.clouddesigner.occi.Resource> targetConfigurationResources = configuration.getResources(); Map<String, org.occiware.clouddesigner.occi.Resource> targetResources = new HashMap<String,org.occiware.clouddesigner.occi.Resource>(); for(Resource resource : conf.getResources()) { if(!schemeExists(configuration, resource.getKind().getScheme())){ org.occiware.clouddesigner.occi.Extension extension = OcciHelper.loadExtension(resource.getKind().getScheme()); configuration.getUse().add(extension); } Resource targetResource = factory.createResource(); targetConfigurationResources.add(targetResource); copyEntity(configuration, resource,targetResource); targetResources.put(resource.getId(), targetResource); } for(Resource resource : conf.getResources()) { Resource targetResource = targetResources.get(resource.getId()); for(Link sourceLink: resource.getLinks()){ org.occiware.clouddesigner.occi.Link targetLink = factory.createLink(); targetLink.setSource(targetResource); copyEntity(configuration, sourceLink, targetLink); // Set the target's link target. String sourceLinkTarget = sourceLink.getTarget().getId(); org.occiware.clouddesigner.occi.Resource linkTargetResource = targetResources.get(sourceLinkTarget); if(linkTargetResource != null) { targetLink.setTarget(linkTargetResource); } else { System.err.println("Resource " + sourceLinkTarget + " unknown!"); } } } } private static void copyEntity(Configuration configuration, Link source, Link target) { target.setId(source.getId()); String sourceKindIdentifier = source.getId(); org.occiware.clouddesigner.occi.Kind targetKind = searchKind(configuration, source.getKind()); if(targetKind != null) { target.setKind(targetKind); } else { System.err.println("Kind " + sourceKindIdentifier + " unknown!"); } List<org.occiware.clouddesigner.occi.Mixin> targetMixins = target.getMixins(); for(Mixin mixin : source.getMixins()) { org.occiware.clouddesigner.occi.Mixin targetMixin = searchMixin(configuration, mixin); if(targetMixin != null) { targetMixins.add(targetMixin); } else { System.err.println("Mixin unknown!"); } } } private static void copyEntity(Configuration configuration, Resource source, Resource target) { target.setId(source.getId()); org.occiware.clouddesigner.occi.Kind targetKind = searchKind(configuration, source.getKind()); if(targetKind != null) { target.setKind(targetKind); } else { System.err.println("Kind unknown!"); } List<org.occiware.clouddesigner.occi.Mixin> targetMixins = target.getMixins(); for(Mixin mixin : source.getMixins()) { org.occiware.clouddesigner.occi.Mixin targetMixin = searchMixin(configuration, mixin); if(targetMixin != null) { targetMixins.add(targetMixin); } else { System.err.println("Mixin unknown!"); } } // Create all target entity's attributes. List<org.occiware.clouddesigner.occi.AttributeState> targetAttributes = target.getAttributes(); for(AttributeState att: source.getAttributes()) { String attributeName = att.getName(); if(!attributesToOmit.contains(attributeName)) { org.occiware.clouddesigner.occi.AttributeState targetAttribute = org.occiware.clouddesigner.occi.OCCIFactory.eINSTANCE.createAttributeState(); targetAttributes.add(targetAttribute); targetAttribute.setName(att.getName()); targetAttribute.setValue(att.getValue()); } } } private static org.occiware.clouddesigner.occi.Kind searchKind(org.occiware.clouddesigner.occi.Configuration configuration, Kind kind) { org.occiware.clouddesigner.occi.Extension extension = OcciHelper.loadExtension(kind.getScheme().toString()); if(!schemeExists(configuration, kind.getScheme().toString())){ configuration.getUse().add(extension); } String term = kind.getTerm(); for(org.occiware.clouddesigner.occi.Kind k : extension.getKinds()) { if(term.equals(k.getTerm())) { return k; } } return null; } private static org.occiware.clouddesigner.occi.Mixin searchMixin(org.occiware.clouddesigner.occi.Configuration configuration, Mixin mixin) { String mixinSchemeWithoutSharp = schemeWithoutSharp(mixin.getScheme().toString()); org.occiware.clouddesigner.occi.Extension extension = null; for(org.occiware.clouddesigner.occi.Extension ext : configuration.getUse()) { if(mixinSchemeWithoutSharp.startsWith(schemeWithoutSharp(ext.getScheme()))) { extension = ext; break; } } if(extension == null) { if(!schemeExists(configuration, mixin.getScheme().toString()) ){ extension = OcciHelper.loadExtension(mixin.getScheme().toString()); configuration.getUse().add(extension); } } String term = mixin.getTerm(); for(org.occiware.clouddesigner.occi.Mixin m : extension.getMixins()) { if(term.equals(m.getTerm())) { return m; } } org.occiware.clouddesigner.occi.Mixin result = org.occiware.clouddesigner.occi.OCCIFactory.eINSTANCE.createMixin(); result.setScheme(mixin.getScheme().toString()); result.setTerm(mixin.getTerm()); extension.getMixins().add(result); return result; } private static String schemeWithoutSharp(String scheme) { return scheme.substring(0, scheme.length()-2); } private void verifyTheAdditionnalResource(ConcurrentHashMap<Entity, Set<Entity>> entities,Configuration conf){ Map<String, org.occiware.clouddesigner.occi.Resource> targetResources = new HashMap<String,org.occiware.clouddesigner.occi.Resource>(); for(Entity entity: entities.keySet()){ boolean exist=false; for(Resource resource : conf.getResources()) { if(entity.getId().equals(resource.getId())) exist=true; } if(!exist){ System.out.println("resource to ADD: "+entity); System.out.println("Linked to : "+entities.get(entity)); } } for(Resource resource : conf.getResources()){ boolean exist=false; for(Entity entity: entities.keySet()) { if(entity.getId().equals(resource.getId())) exist=true; } if(!exist){ System.out.println("resource to Remove: "+resource); } } } }