diff --git a/edu.kit.ipd.descartes.adaptation/AdaptationControl.launch b/edu.kit.ipd.descartes.adaptation/AdaptationControl.launch deleted file mode 100644 index d16e1300cca8d65978d5ace96567a725f075f067..0000000000000000000000000000000000000000 --- a/edu.kit.ipd.descartes.adaptation/AdaptationControl.launch +++ /dev/null @@ -1,15 +0,0 @@ -<?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> diff --git a/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF b/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF index 95612fd718346190adf1faac4135f51ceae0b59e..df74038b203fc1f5360c065603e9a170d8672998 100644 --- a/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF +++ b/edu.kit.ipd.descartes.adaptation/META-INF/MANIFEST.MF @@ -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 diff --git a/edu.kit.ipd.descartes.adaptation/default.properties b/edu.kit.ipd.descartes.adaptation/default.properties deleted file mode 100644 index 02ae99cadda5584212d250f248142948bf1ad05e..0000000000000000000000000000000000000000 --- a/edu.kit.ipd.descartes.adaptation/default.properties +++ /dev/null @@ -1,32 +0,0 @@ -#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 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 06e5275b4d149b0e89b009ef46cba59a910941e7..22545bbe91443844ae5886a8b2f850c6b07e63ae 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 @@ -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); diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java deleted file mode 100644 index 1d9451c463442c45620fa701791b2114d6b9b100..0000000000000000000000000000000000000000 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/TacticExecutor.java +++ /dev/null @@ -1,204 +0,0 @@ -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); - } - -}