Skip to content
Snippets Groups Projects
Commit ba779c25 authored by Nikolaus Huber's avatar Nikolaus Huber
Browse files

switch to ObservationRepository

git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/DMM/trunk@16153 9e42b895-fcda-4063-8a3b-11be15eb1bbd
parent 53bb96d7
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/AdaptationControl.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="edu.kit.ipd.descartes.adaptation.AdaptationControl"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="default.properties"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="edu.kit.ipd.descartes.adaptation"/>
</launchConfiguration>
......@@ -12,20 +12,15 @@ Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: edu.kit.ipd.descartes.adaptation.evaluation.performance,
edu.kit.ipd.descartes.adaptation.evaluation.performance.repository,
edu.kit.ipd.descartes.adaptation.model,
edu.kit.ipd.descartes.adaptation.model.adaptation,
edu.kit.ipd.descartes.adaptation.model.adaptation.dmm,
edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.util,
edu.kit.ipd.descartes.adaptation.model.adaptation.exceptions,
edu.kit.ipd.descartes.adaptation.model.analysis,
edu.kit.ipd.descartes.adaptation.model.analysis.pcm,
edu.kit.ipd.descartes.adaptation.model.dmm,
edu.kit.ipd.descartes.ql.core.engine.query,
edu.kit.ipd.descartes.ql.lang.descartesQL,
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.emf.ecore.xmi,
org.eclipse.emf.ecore.xmi.impl
org.eclipse.emf.ecore.xmi
Export-Package: edu.kit.ipd.descartes.adaptation
#process.name=AdaptationEngine
#adaptationprocess.instance=../edu.kit.ipd.descartes.adaptation.test/test_models/StaRepository.xmi
#perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
#perfdatarepo.instance=../edu.kit.ipd.descartes.adaptation.test/test_models/PerformanceDataRepositoryDummy.xmi
#process.maxiterations=2
## The list of triggering events can be found in EventTypeEnum.java
#event.type=
#process.name=SEAMS_PushPull-v1
#adaptationprocess.instance=../Examples/SEAMS_Case_Study/pushpull.adaptation
#perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
#perfdatarepo.instance=../Examples/SEAMS_Case_Study/simucomresults.perfdatarepo
#process.maxiterations=2
## The list of triggering events can be found in EventTypeEnum.java
#event.type=SlaViolatedEvent
#process.name=SEAMS_PushPull-v2
#adaptationprocess.instance=../edu.kit.ipd.descartes.adaptation.test/SEAMSv2_Case_Study/pushPullProcess.adaptation
#perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
#perfdatarepo.instance=../edu.kit.ipd.descartes.adaptation.test/SEAMSv2_Case_Study/simucom-simulationResults.perfdatarepo
#process.maxiterations=2
## The list of triggering events can be found in EventTypeEnum.java
#event.type=SlaViolatedEvent
process.name=SEAMS_PushPull-v1
adaptationprocess.instance=../Examples/SEAMS_Case_Study/pushpull.adaptation
perfdatarepo.metamodel=edu.kit.ipd.descartes.perfdatarepo.PerformanceDataRepository
perfdatarepo.instance=../Examples/SEAMS_Case_Study/simucomresults.perfdatarepo
process.maxiterations=3
# The list of triggering events can be found in EventTypeEnum.java
event.type=SlaViolatedEvent
#ScheduledOptimizationEvent
\ No newline at end of file
......@@ -17,11 +17,11 @@ import edu.kit.ipd.descartes.adaptation.evaluation.performance.WeightingFunction
import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.IPerformanceDataRepositoryHandler;
import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.ObservationRepositoryHelper;
import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.PerfDataRepoConverter;
import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.PerformanceDataRepositoryHandler;
import edu.kit.ipd.descartes.adaptation.evaluation.performance.repository.PerformanceDataRepositoryHandlerFactory;
import edu.kit.ipd.descartes.adaptation.event.EventTypeEnum;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.BlueYonderExperimentTracker;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.DmmModelActionHandler;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.TacticExecutor;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.TacticsHistory;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.util.ObjectivesHelper;
import edu.kit.ipd.descartes.adaptation.model.analysis.IModelAnalyzer;
......@@ -131,6 +131,8 @@ public class AdaptationControl {
// Execute the strategie's tactic with the currently highest weight
WeightedTactic currentTactic = currentStrategy.getTacticWithHighestWeight();
logger.debug("=============================");
logger.debug("Starting iteration number " + (iteration + 1));
applyTactic(currentTactic);
analyzeModel();
evaluate();
......@@ -148,6 +150,10 @@ public class AdaptationControl {
iteration++;
}
if(iteration >= maxIterations){
logger.info("Adaptation process has been aborted. Maximum iterations " + iteration + " reached!");
}
printLogInformation();
......@@ -164,7 +170,7 @@ public class AdaptationControl {
Result currentSystemState = perfDataRepoHandler.getCurrentSystemState();
// TODO: Blue Yonder specific, introduce abstraction layer
WeightedTactic latestTactic = TacticsHistory.getInstance().getLatestAppliedTactic();
if (latestTactic != null && !(perfDataRepoHandler instanceof PerformanceDataRepositoryHandler)) {
if (latestTactic != null && ((ObservationRepository) perfDataRepoHandler.getRepository()).getIdentifier().contains("Blue Yonder") ) {
String expName = BlueYonderExperimentTracker.getInstance()
.getExperimentNameForDistributedDataCenter(DmlModelLoader.getDistributedDataCenter());
logger.debug("Searching for result of " + expName);
......@@ -198,6 +204,7 @@ public class AdaptationControl {
if (TacticsHistory.getInstance().wasLatestTacticSuccessful()) {
modelAnalyzer.analyze();
perfDataRepoHandler.setNewSystemState();
Impact latestImpact = modelAnalyzer.getLatestImpact();
if (latestImpact != null)
tactic.setLastImpact(latestImpact);
......
package edu.kit.ipd.descartes.adaptation;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.change.ChangeDescription;
import edu.kit.ipd.descartes.adaptation.model.adaptation.IActionHandler;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.BlueYonderExperimentTracker;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.IObserver;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.TacticsHistory;
import edu.kit.ipd.descartes.adaptation.model.adaptation.dmm.util.OclEvaluationHelper;
import edu.kit.ipd.descartes.adaptation.model.adaptation.exceptions.InvalidAdaptationPlan;
import edu.kit.ipd.descartes.adaptation.model.adaptation.exceptions.OperationNotPerformedException;
import edu.kit.ipd.descartes.adaptation.model.dmm.DmlModelLoader;
import edu.kit.ipd.descartes.mm.adaptation.AbstractControlFlowElement;
import edu.kit.ipd.descartes.mm.adaptation.Action;
import edu.kit.ipd.descartes.mm.adaptation.ActionReference;
import edu.kit.ipd.descartes.mm.adaptation.AdaptationPlan;
import edu.kit.ipd.descartes.mm.adaptation.BranchAction;
import edu.kit.ipd.descartes.mm.adaptation.LoopAction;
import edu.kit.ipd.descartes.mm.adaptation.Parameter;
import edu.kit.ipd.descartes.mm.adaptation.StartAction;
import edu.kit.ipd.descartes.mm.adaptation.StopAction;
import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
import edu.kit.ipd.descartes.mm.adaptationpoints.AdaptationPoint;
import edu.kit.ipd.descartes.mm.containerrepository.ContainerrepositoryPackage;
import edu.kit.ipd.descartes.mm.resourcelandscape.ResourcelandscapePackage;
public class TacticExecutor {
private static Logger logger = Logger.getLogger(TacticExecutor.class);
private List<IObserver> observers = new ArrayList<IObserver>();
private IActionHandler dmmModelActionHandler;
private TacticsHistory hist;
private ChangeDescription changeDescription = null;
public TacticExecutor(IActionHandler actionExecutor) {
dmmModelActionHandler = actionExecutor;
hist = TacticsHistory.getInstance();
register(BlueYonderExperimentTracker.getInstance()); // TODO implement clean observer
// pattern
}
/**
* Applies the the given tactic.
*
* @param currentTactic
* The tactic to execute
* @return
*/
public void applyTactic(WeightedTactic weightedTactic) {
try {
logger.info("Applying tactic " + weightedTactic.getUsedTactic().getName() + ", ID: "
+ weightedTactic.getUsedTactic().getId() + ".");
DmlModelLoader.startRecording();
executeAdaptationPlan(weightedTactic.getUsedTactic().getImplementedPlan());
logger.info("Tactic " + weightedTactic.getUsedTactic().getName() + " successfully applied.");
hist.add(weightedTactic, TacticsHistory.NO_RESULT, true);
// if this point is reached everything was fine, so persist them (save the models)
dmmModelActionHandler.persistActions();
changeDescription = DmlModelLoader.endRecording();
return;
} catch (OperationNotPerformedException e) {
logger.error("Tactic " + weightedTactic.getUsedTactic().getName()
+ " could not be executed. Please check adaptation plan and/or log files for errors.", e);
hist.add(weightedTactic, TacticsHistory.NO_RESULT, false);
/*
* TODO Something went wrong. 1) Detect error 2) reevaluate tactics 3) apply different
* tactic.
*/
}
}
private StartAction findStartAction(AdaptationPlan plan) {
for (AbstractControlFlowElement abstractControlFlowElement : plan.getSteps()) {
// Find start of adaptation plan
if (abstractControlFlowElement instanceof StartAction) {
return (StartAction) abstractControlFlowElement;
}
}
return null;
}
/**
* Executes the given {@link AdaptationPlan}.
*
* @param plan
* The adaptation plan to execute
* @throws IOException
* @throws OperationNotPerformedException
*/
private void executeAdaptationPlan(AdaptationPlan plan) throws OperationNotPerformedException {
StartAction start = findStartAction(plan);
if (start == null)
throw new OperationNotPerformedException("No start action for adaptation plan " + plan.getName()
+ " found.");
try {
executeNextStep(start.getSuccessor());
} catch (InvalidAdaptationPlan e) {
logger.error(
"Invalid adaptation plan <<" + plan.getName() + ">> when executing action with ID <<"
+ start.getId() + ">>.", e);
}
}
private void executeNextStep(AbstractControlFlowElement step) throws OperationNotPerformedException,
InvalidAdaptationPlan {
if (step == null)
throw new InvalidAdaptationPlan("Current AbstractControlFlowElement is null!");
if (step instanceof StopAction) {
return;
} else if (step instanceof BranchAction) {
executeBranchAction(step);
} else if (step instanceof LoopAction) {
execLoopAction(step);
} else if (step instanceof ActionReference) {
executeReferredAction(step);
} else
// Handle invalid actions and control flow elements
throw new OperationNotPerformedException("No valid control flow element " + step.toString());
// in any case (except stop action)
// continue with the next step
executeNextStep(step.getSuccessor());
}
private void executeReferredAction(AbstractControlFlowElement step) throws OperationNotPerformedException {
ActionReference ref = (ActionReference) step;
Action action = ref.getRefersTo();
logger.info("Executing action <<" + action.getName() + ">>.");
AdaptationPoint currentAdaptationPoint = action.getReferredAdaptationPoint();
dmmModelActionHandler.execute(currentAdaptationPoint, action.getAdaptationActionOperation());
}
private void executeBranchAction(AbstractControlFlowElement branchAction) throws OperationNotPerformedException {
BranchAction branch = (BranchAction) branchAction;
if (isBranchConditionTrue(branch.getContext(), branch.getCondition()))
executeAdaptationPlan(branch.getConditionTrueBranch());
else
executeAdaptationPlan(branch.getConditionFalseBranch());
}
private void execLoopAction(AbstractControlFlowElement loopAction) throws OperationNotPerformedException {
LoopAction loop = (LoopAction) loopAction;
Parameter counter = loop.getCounter();
int counterValue = Integer.parseInt(counter.getValue());
int i = 1;
while (i <= counterValue) {
logger.debug("Executing iteration " + i + " of loop action " + loop.getBody().getName());
executeAdaptationPlan(loop.getBody());
i++;
}
}
private boolean isBranchConditionTrue(EObject obj, String branchCondition) {
EClass context = null;
switch (obj.eClass().getClassifierID()) {
case ResourcelandscapePackage.RUNTIME_ENVIRONMENT:
context = ResourcelandscapePackage.Literals.RUNTIME_ENVIRONMENT;
break;
case ContainerrepositoryPackage.CONTAINER_TEMPLATE:
context = ContainerrepositoryPackage.Literals.CONTAINER_TEMPLATE;
break;
// TODO add further contexts if necessary
default:
logger.error("Could not set context for eClass " + obj.getClass());
return false;
}
boolean invariant = OclEvaluationHelper.evaluateOclConstraint(obj, branchCondition, context);
return invariant;
}
public void undoPreviousTactic() {
logger.info("Reverting model to previous state");
if (changeDescription != null)
changeDescription.apply();
}
public void register(IObserver observer) {
observers.add(observer);
}
public void remove(IObserver observer) {
observers.remove(observer);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment