diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/META-INF/MANIFEST.MF b/edu.kit.ipd.descartes.adaptation.model.repository/META-INF/MANIFEST.MF index 2d69bc81cdfe8e95d09538ec150465e803ba4b2d..cc8993b9dfe5b94cc71af00b39135c006200aaab 100644 --- a/edu.kit.ipd.descartes.adaptation.model.repository/META-INF/MANIFEST.MF +++ b/edu.kit.ipd.descartes.adaptation.model.repository/META-INF/MANIFEST.MF @@ -7,10 +7,15 @@ Bundle-Activator: edu.kit.ipd.descartes.adaptation.model.repository.Activator Bundle-Vendor: Descartes Research Group Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Import-Package: edu.kit.ipd.descartes.core, + edu.kit.ipd.descartes.identifier, edu.kit.ipd.descartes.mm.adaptation, edu.kit.ipd.descartes.mm.adaptationpoints, edu.kit.ipd.descartes.mm.containerrepository, edu.kit.ipd.descartes.mm.resourcelandscape, + edu.kit.ipd.descartes.perfdatarepo, + edu.kit.ipd.descartes.ql.models.mapping.domain, + edu.kit.ipd.descartes.ql.models.mapping.mapping, + edu.kit.ipd.descartes.ql.models.repository, org.apache.log4j;version="1.2.15", org.eclipse.core.resources, org.eclipse.core.runtime;version="3.4.0", @@ -25,4 +30,5 @@ Import-Package: edu.kit.ipd.descartes.core, org.eclipse.emf.ecore.xmi.impl, org.osgi.framework;version="1.3.0" Export-Package: edu.kit.ipd.descartes.adaptation.model.repository, - edu.kit.ipd.descartes.adaptation.model.repository.dmm + edu.kit.ipd.descartes.adaptation.model.repository.dmm, + edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/IPerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/IPerformanceDataRepositoryHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..3c2fb18a74149ba7f69800b59ca20af0065087fd --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/IPerformanceDataRepositoryHandler.java @@ -0,0 +1,17 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import org.eclipse.emf.ecore.EObject; + +import edu.kit.ipd.descartes.perfdatarepo.Impact; +import edu.kit.ipd.descartes.perfdatarepo.Result; + +public interface IPerformanceDataRepositoryHandler { + + public void load(String modelFileUri); + + public Impact getLatestImpact(); + + public Result getCurrentSystemState(); + + public EObject getRepository(); +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..56c6402c47dac43ab38b5e46e75422e590618dcc --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryHandler.java @@ -0,0 +1,62 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import static edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo.PerfDataRepoConverter.convertObservableImpact; + +import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; + +import edu.kit.ipd.descartes.adaptation.model.repository.AbstractEcoreModelLoader; +import edu.kit.ipd.descartes.perfdatarepo.Impact; +import edu.kit.ipd.descartes.perfdatarepo.Result; +import edu.kit.ipd.descartes.ql.models.repository.Observation; +import edu.kit.ipd.descartes.ql.models.repository.ObservationRepository; +//import edu.kit.ipd.descartes.adaptation.model.repository.dmm.AdaptationProcessModelLoader; + +public class ObservationRepositoryHandler implements IPerformanceDataRepositoryHandler { + + private static Logger logger = Logger.getLogger(ObservationRepositoryHandler.class); + private AbstractEcoreModelLoader modelLoader = null; + private ObservationRepository repository = null; + + public ObservationRepositoryHandler() { + modelLoader = ObservationRepositoryModelLoader.getInstance(); + logger.debug("ObservationRepositoryHandler loaded."); + } + + @Override + public Impact getLatestImpact() { + return convertObservableImpact(repository.getLatestImpact()); + } + + @Override + public void load(String modelFileUri) { + repository = (ObservationRepository) modelLoader.load(URI.createFileURI(modelFileUri)); + } + + @Override + public Result getCurrentSystemState() { + Observation o = repository.getLatestObservation(); + +// WeightedTactic latestTactic = TacticsHistory.getInstance().getLatestAppliedTactic(); +// if (latestTactic == null) { +// o = repository.getLatestObservation(); +// } else { +// // TODO: Blue Yonder specific, introduce abstraction layer +// String expName = BlueYonderExperimentTracker.getInstance.getExperimentNameForDistributedDataCenter(AdaptationProcessModelLoader.getDistributedDataCenter()); +// logger.debug("Searching for result of " + expName); +// o = ObservationRepositoryHelper.getResultEndingWith(expName, repository); +// } + + if (o == null) + return null; + else + return PerfDataRepoConverter.convertResult(o); + } + + @Override + public EObject getRepository() { + return repository; + } + +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryHelper.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..578508a298159d2e881a8485c9c23d45d922e151 --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryHelper.java @@ -0,0 +1,52 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import java.util.List; + +import org.eclipse.emf.ecore.util.EcoreUtil; + +import edu.kit.ipd.descartes.ql.models.repository.ObservableImpact; +import edu.kit.ipd.descartes.ql.models.repository.Observation; +import edu.kit.ipd.descartes.ql.models.repository.ObservationRepository; + +public class ObservationRepositoryHelper { + + public static ObservableImpact searchImpactOfTactic(String name, ObservationRepository repository) { + // Get correct result + Observation o = getResultEndingWith(name, repository); + + // Derive impact from result + ObservableImpact i = getImpactForObservation(o, repository); + return i; + } + + public static ObservableImpact getImpactForObservation(Observation o, ObservationRepository repo) { + if (o == null || repo == null) + return null; + + List<ObservableImpact> impacts = repo.getImpacts(); + for (ObservableImpact oi : impacts) { + if (EcoreUtil.equals(oi.getAfter(), o)) + return oi; + } + + return null; + } + + /** + * Searches the observation repository for an observation that ends with the given suffix. + * + * @param suffix + * @return first result that ends the given suffix, null otherwise. + */ + public static Observation getResultEndingWith(String suffix, ObservationRepository repo) { + if (suffix == null || repo == null) + return null; + + List<Observation> results = repo.getObservations(); + for (Observation o : results) { + if (o.getIdentifier().endsWith(suffix)) + return o; + } + return null; + } +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryModelLoader.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryModelLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..56eb8cfa5405a9e3d87d7a11c40ec777e1568a2b --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/ObservationRepositoryModelLoader.java @@ -0,0 +1,45 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; + +import edu.kit.ipd.descartes.adaptation.model.repository.AbstractEcoreModelLoader; +import edu.kit.ipd.descartes.ql.models.repository.RepositoryPackage; + +public class ObservationRepositoryModelLoader extends AbstractEcoreModelLoader { + + public static final EPackage[] OBSERVATION_REPO_EPACKAGES = new EPackage[] { + RepositoryPackage.eINSTANCE + }; + + private static ObservationRepositoryModelLoader instance = null; + + public static ObservationRepositoryModelLoader getInstance() { + if (instance == null) { + instance = new ObservationRepositoryModelLoader(); + } + return instance; + } + + private ObservationRepositoryModelLoader() { + initializeResourceSet(new ResourceSetImpl()); + } + + @Override + public void initializeResourceSet(ResourceSet resourceSet) { + setResourceSet(resourceSet); + + /* Register the default resource factory -- only needed for stand-alone! */ + getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap() + .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); + + /* Register also the packages needed for the DMM meta model */ + for (EPackage ePackage : OBSERVATION_REPO_EPACKAGES) { + getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap().put(ePackage.getNsURI(), ePackage); + } + } + +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerfDataRepoConverter.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerfDataRepoConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..5aacbad2ddbd6afcb5f8359c6373e6dc459a720d --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerfDataRepoConverter.java @@ -0,0 +1,79 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import java.util.ArrayList; +import java.util.Collection; + +import edu.kit.ipd.descartes.perfdatarepo.Impact; +import edu.kit.ipd.descartes.perfdatarepo.MeasuredEntity; +import edu.kit.ipd.descartes.perfdatarepo.MetricType; +import edu.kit.ipd.descartes.perfdatarepo.MetricValue; +import edu.kit.ipd.descartes.perfdatarepo.PerfdatarepoFactory; +import edu.kit.ipd.descartes.perfdatarepo.Result; +import edu.kit.ipd.descartes.ql.models.mapping.domain.DecimalResult; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Entity; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Probe; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Resource; +import edu.kit.ipd.descartes.ql.models.mapping.domain.Service; +import edu.kit.ipd.descartes.ql.models.mapping.mapping.EntityMapping; +import edu.kit.ipd.descartes.ql.models.repository.ObservableImpact; +import edu.kit.ipd.descartes.ql.models.repository.Observation; + +public class PerfDataRepoConverter { + + public static Impact convertObservableImpact(ObservableImpact o) { + if (o == null) + return null; + Impact impact = PerfdatarepoFactory.eINSTANCE.createImpact(); + impact.setId(o.getIdentifier()); + impact.setName("ObservableImpact (ID: " + o.getIdentifier() + ")"); + impact.setBefore(convertResult(o.getBefore())); + impact.setAfter(convertResult(o.getAfter())); + return impact; + } + + public static Result convertResult(Observation o) { + Result result = PerfdatarepoFactory.eINSTANCE.createResult(); + result.setId(o.getIdentifier()); + result.setName("Observation (ID: " + o.getIdentifier() + ")"); + Collection<MetricValue> values = convertMapping(o.getObservation()); + result.getMetricValues().addAll(values); + return result; + } + + public static Collection<MetricValue> convertMapping(EntityMapping observation) { + Collection<MetricValue> values = new ArrayList<MetricValue>(); + + for (Resource r : observation.getResources()) { + values.addAll(convertProbes(r)); + } + + for (Service s : observation.getServices()) { + values.addAll(convertProbes(s)); + } + + return values; + } + + private static Collection<MetricValue> convertProbes(Entity e) { + Collection<MetricValue> values = new ArrayList<MetricValue>(); + MetricType mType = PerfdatarepoFactory.eINSTANCE.createMetricType(); + mType.setName(e.getProbes().get(0).getMetricName()); + mType.setId(e.getProbes().get(0).getMetricName()); + MeasuredEntity entity = PerfdatarepoFactory.eINSTANCE.createMeasuredEntity(); + entity.setName(e.getAlias()); + entity.setId(e.getIdentifier()); + + for (Probe p : e.getProbes()) { + DecimalResult r = (DecimalResult) p; + MetricValue value = PerfdatarepoFactory.eINSTANCE.createMetricValue(); + value.setMeasuredEntity(entity); + value.setName(e.getAlias() + ": " + r.getMetricName()); + value.setMetricType(mType); + value.setValue(r.getValue().doubleValue()); + values.add(value); + } + + return values; + } + +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..16b6e309873ff2097c6996816547cc48b703397e --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryHandler.java @@ -0,0 +1,54 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; + +import edu.kit.ipd.descartes.perfdatarepo.Impact; +import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository; +import edu.kit.ipd.descartes.perfdatarepo.Result; + +public class PerformanceDataRepositoryHandler implements IPerformanceDataRepositoryHandler { + + private static Logger logger = Logger.getLogger(PerformanceDataRepositoryHandler.class); + + private int iteration = 0; + + private PerformanceDataRepository repository = null; + private PerformanceDataRepositoryModelLoader modelLoader = null; + + public PerformanceDataRepositoryHandler() { + modelLoader = PerformanceDataRepositoryModelLoader.getInstance(); + logger.debug("PerformanceDataRepositoryHandler instantiated."); + } + + public void load(String fileUri) { + repository = modelLoader.load(URI.createFileURI(fileUri)); + } + + @Override + public Impact getLatestImpact() { + EList<Impact> impactHistory = repository.getImpactHistory(); + Impact mostRecentImpact = impactHistory.get(impactHistory.size() - 1); + + for (Impact currentImpact : impactHistory) { + Result afterResult = currentImpact.getAfter(); + if (afterResult.getTimestamp().compareTo(mostRecentImpact.getAfter().getTimestamp()) > 0 ) + mostRecentImpact = currentImpact; + } + + return mostRecentImpact; + } + + @Override + public Result getCurrentSystemState() { + return repository.getResultHistory().get(iteration++); + } + + @Override + public EObject getRepository() { + return repository; + } + +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryHandlerFactory.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryHandlerFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..d44e6f4bad91fc4baf68f9fcf202b261b1b6ef32 --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryHandlerFactory.java @@ -0,0 +1,18 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository; +import edu.kit.ipd.descartes.ql.models.repository.ObservationRepository; + +public class PerformanceDataRepositoryHandlerFactory { + + public static IPerformanceDataRepositoryHandler createHandler(String repositoryType) { + + if (repositoryType.equals(PerformanceDataRepository.class.getName())) + return new PerformanceDataRepositoryHandler(); + + if (repositoryType.equals(ObservationRepository.class.getName())) + return new ObservationRepositoryHandler(); + + return null; + } +} diff --git a/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryModelLoader.java b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryModelLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..5e2eeb6bb3388d46b8c42a529fa5e1998b541fef --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation.model.repository/src/edu/kit/ipd/descartes/adaptation/model/repository/perfdatarepo/PerformanceDataRepositoryModelLoader.java @@ -0,0 +1,51 @@ +package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; + +import edu.kit.ipd.descartes.adaptation.model.repository.AbstractEcoreModelLoader; +import edu.kit.ipd.descartes.perfdatarepo.PerfdatarepoPackage; +import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository; + +public class PerformanceDataRepositoryModelLoader extends AbstractEcoreModelLoader { + + public static final EPackage[] PERF_DATA_REPO_EPACKAGES = new EPackage[] { PerfdatarepoPackage.eINSTANCE }; + + private static PerformanceDataRepositoryModelLoader instance = null; + + public static PerformanceDataRepositoryModelLoader getInstance() { + if (instance == null) { + instance = new PerformanceDataRepositoryModelLoader(); + } + return instance; + } + + + private PerformanceDataRepositoryModelLoader() { + initializeResourceSet(new ResourceSetImpl()); + } + + @Override + public void initializeResourceSet(ResourceSet resourceSet) { + setResourceSet(resourceSet); + /* Register the default resource factory -- only needed for stand-alone! */ + getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap() + .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); + + /* Register also the packages needed for the DMM meta model */ + for (EPackage ePackage : PERF_DATA_REPO_EPACKAGES) { + getResourceSet().getResourceFactoryRegistry().getExtensionToFactoryMap().put(ePackage.getNsURI(), ePackage); + } + + } + + @Override + public PerformanceDataRepository load(URI uri) { + return (PerformanceDataRepository) super.load(uri); + } + +}