From 881d246f232d4202604936068516d7744a3103ed Mon Sep 17 00:00:00 2001 From: Nikolaus Huber <nikolaus.huber@uni-wuerzburg.de> Date: Fri, 7 Jun 2013 16:02:34 +0000 Subject: [PATCH] git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/code/DMM/trunk@11992 9e42b895-fcda-4063-8a3b-11be15eb1bbd --- .../adaptation/AdaptationControl.java | 32 ++++++---- .../model/dmm/DmmModelActionHandler.java | 15 +++-- .../model/dmm/util/DmmModelChanger.java | 16 +++++ .../ObservationRepositoryHandler.java | 20 ------ .../ObservationRepositoryHelper.java | 62 +++++++++++++++++++ .../perfdatarepo/PerfDataRepoConverter.java | 2 + .../perfdatarepo/PerfDataRepoHelper.java | 45 -------------- .../PerformanceDataRepositoryHandler.java | 17 ++++- 8 files changed, 124 insertions(+), 85 deletions(-) create mode 100644 edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java delete mode 100644 edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java index 52fc8cfe..5d954789 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java @@ -19,6 +19,8 @@ import edu.kit.ipd.descartes.adaptation.model.dmm.AdaptationProcessModelLoader; import edu.kit.ipd.descartes.adaptation.model.dmm.DmmModelActionHandler; import edu.kit.ipd.descartes.adaptation.model.dmm.util.ObjectivesHelper; import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.IPerformanceDataRepositoryHandler; +import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.ObservationRepositoryHelper; +import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter; import edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerformanceDataRepositoryHandlerFactory; import edu.kit.ipd.descartes.mm.adaptation.AdaptationProcess; import edu.kit.ipd.descartes.mm.adaptation.Event; @@ -63,7 +65,7 @@ public class AdaptationControl { } public void init(String propertiesFile) { - + if (propertiesFile == null || propertiesFile.equals("")) { logger.warn("No properties file given. Using default properties..."); propertiesFile = DEFAULT_PROP_FILE_PATH; @@ -71,12 +73,12 @@ public class AdaptationControl { try { // load properties file loadProperties(propertiesFile); - + // load required models adaptationProcess = adaptationProcessModelLoader.load(URI.createFileURI(adaptationProcessXmiFilePath)); perfdatarepo = PerformanceDataRepositoryHandlerFactory.createHandler(pdrMetamodelType); perfdatarepo.load(performanceDataRepoXmiFilePath); - + // set handlers executor = new TacticExecutor(new DmmModelActionHandler()); modelAnalyzer = new PcmModelAnalyzer(); @@ -120,7 +122,6 @@ public class AdaptationControl { analyzeModel(); processResults(currentTactic); evaluate(currentTactic); - // save results try { @@ -162,7 +163,7 @@ public class AdaptationControl { executor.applyTactic(weightedTactic); } - /** + /** * Choose a suitable model analyzer and analyze the reconfigured model. */ public void analyzeModel() { @@ -170,32 +171,37 @@ public class AdaptationControl { } /** - * Process the results of the applied weighted tactic. For example, - * store the results in a performance data repository. + * Process the results of the applied weighted tactic. For example, store the results in a + * performance data repository. * * @param tactic */ public void processResults(WeightedTactic tactic) { - - Impact latestImpact = perfdatarepo.getImpactAt(iteration); + + // Impact latestImpact = perfdatarepo.getImpactAt(iteration); + String expName = ObservationRepositoryHelper.deriveExperimentName(tactic); + Impact latestImpact = PerfDataRepoConverter.convertObservableImpact(ObservationRepositoryHelper + .searchImpactOfTactic(expName, performanceDataRepoXmiFilePath)); // Connect parsed results to the executed tactic if (latestImpact != null) tactic.setLastImpact(latestImpact); } - /** - * Evaluates the impact of the tactic and assigns weights according to the specified weighting function. + /** + * Evaluates the impact of the tactic and assigns weights according to the specified weighting + * function. * * @param tactic */ public void evaluate(WeightedTactic tactic) { - // Check if tactic has made anything stupid, i.e., violates the objectives. If yes, undo and/or assign bad weight. + // Check if tactic has made anything stupid, i.e., violates the objectives. If yes, undo + // and/or assign bad weight. if (evaluator.degradationDetected(tactic)) { logger.warn("Degradation detected for tactic " + tactic.getName()); // undo tactic // assign negative weight } - + // If everything is fine, assign new weight. evaluator.evaluate(tactic); } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java index 03f67e36..ba2b589b 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/DmmModelActionHandler.java @@ -274,12 +274,17 @@ public class DmmModelActionHandler implements IActionHandler { */ // this is just a helper function private RuntimeEnvironment scaleOutContainerTemplate(ContainerTemplate template) { - Container referringContainer = template.getReferringContainers().get(0); - - if (referringContainer != null && referringContainer instanceof RuntimeEnvironment) { - return DmmModelChanger.createNewRuntimeEnvironmentInstance((RuntimeEnvironment) referringContainer); + if (template.getReferringContainers().size() == 0) { + logger.debug("No referring containers found for template " + template.getName() + ", creating new instance from template."); + return DmmModelChanger.createNewRuntimeEnvironmentInstanceFromTemplate(template); } else { - logger.error("Cannot scale " + referringContainer); + Container referringContainer = template.getReferringContainers().get(0); + + if (referringContainer != null && referringContainer instanceof RuntimeEnvironment) { + return DmmModelChanger.createNewRuntimeEnvironmentInstance((RuntimeEnvironment) referringContainer); + } else { + logger.error("Cannot scale " + referringContainer); + } } return null; } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java index f3cde05b..fa1b1b47 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/dmm/util/DmmModelChanger.java @@ -22,10 +22,14 @@ import edu.kit.ipd.descartes.mm.resourceconfiguration.ConfigurationSpecification import edu.kit.ipd.descartes.mm.resourceconfiguration.NumberOfParallelProcessingUnits; import edu.kit.ipd.descartes.mm.resourceconfiguration.ResourceconfigurationPackage; import edu.kit.ipd.descartes.mm.resourcelandscape.Container; +import edu.kit.ipd.descartes.mm.resourcelandscape.ResourcelandscapeFactory; import edu.kit.ipd.descartes.mm.resourcelandscape.RuntimeEnvironment; +import edu.kit.ipd.descartes.mm.runtimeenvironmentclasses.RuntimeEnvironmentClasses; public class DmmModelChanger { + private static final int FIRST = 0; + /** * Denotes a Container as a copy of another by * adding this mark to its name. @@ -285,4 +289,16 @@ public class DmmModelChanger { int index = randomGenerator.nextInt(containers.size()); return containers.get(index); } + + public static RuntimeEnvironment createNewRuntimeEnvironmentInstanceFromTemplate(ContainerTemplate template) { + RuntimeEnvironment newRe = ResourcelandscapeFactory.eINSTANCE.createRuntimeEnvironment(); + newRe.setId(EcoreUtil.generateUUID()); + newRe.setName("RuntimeEnvironmentInstanceOfTemplate_" + template.getName()); + newRe.setTemplate(template); + newRe.setOfClass(RuntimeEnvironmentClasses.MIDDLEWARE); + newRe.setContainedIn(template.getRunningOn().get(FIRST)); + + template.getReferringContainers().add(newRe); + return newRe; + } } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java index e6886937..7fcf38eb 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHandler.java @@ -3,15 +3,12 @@ package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertObservableImpact; import static edu.kit.ipd.descartes.adaptation.model.perfdatarepo.PerfDataRepoConverter.convertResult; -import java.util.List; - import org.apache.log4j.Logger; import org.eclipse.emf.common.util.URI; import edu.kit.ipd.descartes.adaptation.model.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; public class ObservationRepositoryHandler implements IPerformanceDataRepositoryHandler { @@ -48,21 +45,4 @@ public class ObservationRepositoryHandler implements IPerformanceDataRepositoryH public Result getCurrentSystemState() { return convertResult(repository.getObservations().get(iteration)); } - - /** - * Searches the observation repository for an observation that contains the given - * name. - * - * @param name - * @return first result that contains the given string, null otherwise. - */ - public Result getResultOfName(String name) { - List<Observation> results = repository.getObservations(); - for (Observation o : results) { - if(o.getIdentifier().contains(name)) - return convertResult(o); - } - return null; - } - } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java new file mode 100644 index 00000000..409d1156 --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/ObservationRepositoryHelper.java @@ -0,0 +1,62 @@ +package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; + +import java.util.List; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.util.EcoreUtil; + +import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic; +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, String modelUri) { + ObservationRepositoryModelLoader loader = ObservationRepositoryModelLoader.getInstance(); + ObservationRepository repo = (ObservationRepository) loader.load(URI.createFileURI(modelUri)); + + // Get correct result + Observation o = getResultEndingWith(name, repo); + + // Derive impact from result + ObservableImpact i = deriveImpact(o, repo); + return i; + } + + + public static String deriveExperimentName(WeightedTactic tactic) { + return tactic.getName(); + } + + + private static ObservableImpact deriveImpact(Observation o, ObservationRepository repo) { + 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) { + 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/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java index 4905024b..a348d5d7 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoConverter.java @@ -21,6 +21,8 @@ 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() + ")"); diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java deleted file mode 100644 index a4234e8e..00000000 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerfDataRepoHelper.java +++ /dev/null @@ -1,45 +0,0 @@ -package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; - -import org.eclipse.emf.common.util.EList; - -import edu.kit.ipd.descartes.perfdatarepo.Impact; -import edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository; -import edu.kit.ipd.descartes.perfdatarepo.Result; - -public class PerfDataRepoHelper { - - /** - * Queries for the latest impact. The latest impact is determined by the - * {@link Result} with the most recent timestamp. Currently it is the last one in - * the list. - */ - public static Impact getLatestImpact(PerformanceDataRepository perfDataRepo) { - - EList<Impact> impactHistory = perfDataRepo.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; - } - - - /** - * Returns the {@link Impact} at position {@code position} in the - * impact list of the given {@link PerformanceDataRepository} - * - * @param perfDataRepo {@link PerformanceDataRepository} containing all impacts - * @param position The position of the impact to return - * @return - */ - public static Impact getImpactAt(PerformanceDataRepository perfDataRepo, int position) { - EList<Impact> impactHistory = perfDataRepo.getImpactHistory(); - if (position > impactHistory.size() - 1) - return null; - return impactHistory.get(position); - } -} diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java index 5aea8ed9..f8cc3057 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/model/perfdatarepo/PerformanceDataRepositoryHandler.java @@ -1,6 +1,7 @@ package edu.kit.ipd.descartes.adaptation.model.perfdatarepo; import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import edu.kit.ipd.descartes.perfdatarepo.Impact; @@ -27,13 +28,25 @@ public class PerformanceDataRepositoryHandler implements IPerformanceDataReposit @Override public Impact getLatestImpact() { - return PerfDataRepoHelper.getLatestImpact(repository); + 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 Impact getImpactAt(int position) { iteration++; //TODO This is a hack, see getCurrentSystemState() - return PerfDataRepoHelper.getImpactAt(repository, position); + EList<Impact> impactHistory = repository.getImpactHistory(); + if (position > impactHistory.size() - 1) + return null; + return impactHistory.get(position); } @Override -- GitLab