diff --git a/edu.kit.ipd.descartes.adaptation/default.properties b/edu.kit.ipd.descartes.adaptation/default.properties index 6d38c3ed27394d57de78a57ca936d63c4861a277..b4eeb5caa0677769a02da348d62d749c2fbe4d37 100644 --- a/edu.kit.ipd.descartes.adaptation/default.properties +++ b/edu.kit.ipd.descartes.adaptation/default.properties @@ -2,10 +2,19 @@ #adaptationProcessModel=/Users/nhuber/Documents/workspace/descartes/metamodel/edu.kit.ipd.descartes.adaptation.test/test_models/StaRepository.xmi #performanceDataRepositoryModel=/Users/nhuber/Documents/workspace/descartes/metamodel/edu.kit.ipd.descartes.adaptation.test/test_models/PerformanceDataRepositoryDummy.xmi #maxIterations=2 +## The list of triggering events can be found in AdaptationControl.java +#event= -processName=SEAMS_PushPull-v1 -adaptationProcessModel=/Users/nhuber/Documents/workspace/descartes/metamodel/edu.kit.ipd.descartes.adaptation.test/test_models/SEAMS_Case_Study/PushPullAdaptationProcess.xmi -performanceDataRepositoryModel=/Users/nhuber/Documents/workspace/descartes/metamodel/edu.kit.ipd.descartes.adaptation.test/test_models/SEAMS_Case_Study/PerformanceDataRepositoryDummy.xmi +#processName=SEAMS_PushPull-v1 +#adaptationProcessModel=/Users/nhuber/Documents/workspace/descartes/metamodel/edu.kit.ipd.descartes.adaptation.test/test_models/SEAMS_Case_Study/PushPullAdaptationProcess.xmi +#performanceDataRepositoryModel=/Users/nhuber/Documents/workspace/descartes/metamodel/edu.kit.ipd.descartes.adaptation.test/test_models/SEAMS_Case_Study/PerformanceDataRepositoryDummy.xmi +#maxIterations=2 +## The list of triggering events can be found in AdaptationControl.java +#event=SlaViolatedEvent + +processName=BlueYonderTestAdaptationProcess +adaptationProcessModel=/Users/nhuber/Documents/workspace/descartes/runtime-EclipseApplication/by_dmm-model/testprocess.adaptation +performanceDataRepositoryModel=../edu.kit.ipd.descartes.adaptation.test/test_models/SEAMS_Case_Study/PerformanceDataRepositoryDummy.xmi maxIterations=1 -# The triggering event can either be SlaViolation or scheduledMaintenance -event=SlaViolation \ No newline at end of file +## The list of triggering events can be found in AdaptationControl.java +event=BottleneckFoundEvent \ 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 949aef098b5273c52adf8841e6d8d0ffb2e41085..050652fbe2afa371d512406bf46b9eb7d20050e3 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 @@ -30,7 +30,8 @@ public class AdaptationControl { public enum EventType { SLA_VIOLATION ("SlaViolatedEvent", "12345"), - SCHEDULED_MAINTENANCE ("scheduledMaintenanceEvent", "_H_MTgIAnEeKW2vVcg5ekRw"); + SCHEDULED_MAINTENANCE ("ScheduledMaintenanceEvent", "_H_MTgIAnEeKW2vVcg5ekRw"), + BOTTLENECK_FOUND ("BottleneckFoundEvent", "_VvZEwKEoEeKDl52Xojo4CQ"); private final String name; private final String id; @@ -39,6 +40,13 @@ public class AdaptationControl { this.name = name; this.id = id; } + + public static EventType getEventType(String eventTypeName) { + if (eventTypeName.equals(SLA_VIOLATION.name)) return SLA_VIOLATION; + if (eventTypeName.equals(SCHEDULED_MAINTENANCE.name)) return SCHEDULED_MAINTENANCE; + if (eventTypeName.equals(BOTTLENECK_FOUND.name)) return BOTTLENECK_FOUND; + return null; + } } private static final String DEFAULT_PROP_FILE_PATH = "./default.properties"; @@ -73,7 +81,7 @@ public class AdaptationControl { */ public static void main(String[] args) throws IOException { BasicConfigurator.configure(); - Logger.getRootLogger().setLevel(Level.INFO); + Logger.getRootLogger().setLevel(Level.DEBUG); AdaptationControl adaptationController = new AdaptationControl(); // Initialize controller (load models, create Action handler, etc.) @@ -100,9 +108,9 @@ public class AdaptationControl { } } + // Creates an "artifical event". Will be replaced later when integrated in the system private Event createTriggeringEvent() { - // Create an "artifical event" - EventType type = eventType.equals("SlaViolation") ? EventType.SLA_VIOLATION : EventType.SCHEDULED_MAINTENANCE; + EventType type = EventType.getEventType(eventType); Event triggeringEvent = AdaptationFactory.eINSTANCE.createEvent(); triggeringEvent.setName(type.name); @@ -156,6 +164,14 @@ public class AdaptationControl { // Caluclate the new weight of the tactic wFunction = new WeightedSumCalculator(function); wFunction.updateWeight(tactic); + + //save results + try { + logger.debug("Saving tactics evaluation results..."); + adaptationProcessModelManager.saveAll(); + } catch (IOException e) { + logger.error("Error while persisting evaluation results.", e); + } } private void processResults(WeightedTactic tactic) { @@ -189,6 +205,8 @@ public class AdaptationControl { String eventName = triggeringEvent.getName(); String eventId = triggeringEvent.getId(); + + logger.debug("Caught event: " + eventName + " (ID: " + eventId + ")"); for (Strategy strategy : staRepo.getStrategies()) { if (strategy.getTriggeringEvents().getId().equals(eventId) 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 index e8ba1bb7d72b10e5ad233c713075045b00422a5f..1b0526cfe306e15c5acaa39737702590d4598857 100644 --- 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 @@ -6,6 +6,7 @@ import org.apache.log4j.Logger; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; +import edu.kit.ipd.descartes.adaptation.exceptions.InvalidAdaptationPlan; import edu.kit.ipd.descartes.adaptation.exceptions.OperationNotPerformedException; import edu.kit.ipd.descartes.adaptation.model.dmm.util.OclEvaluationHelper; import edu.kit.ipd.descartes.mm.adaptation.AbstractControlFlowElement; @@ -43,13 +44,16 @@ public class TacticExecutor { */ private void executeAdaptationPlan(AdaptationPlan plan) throws OperationNotPerformedException { - StartAction start = null; - start = findStartAction(plan); + StartAction start = findStartAction(plan); if (start == null) throw new OperationNotPerformedException("No start action for adaptation plan " + plan.getName() + " found."); logger.info("Executing the adaptation plan <<" + plan.getName() + ">>."); - executeNextStep(start.getSuccessor()); + try { + executeNextStep(start.getSuccessor()); + } catch (InvalidAdaptationPlan e) { + logger.error("Invalid adaptation plan <<" + plan.getName() + ">> when executing action with ID <<" + start.getId() + ">>.", e); + } logger.info("Adaptation plan of adaptation plan <<" + plan.getName() + ">> terminated."); } @@ -64,25 +68,20 @@ public class TacticExecutor { } private void executeNextStep(AbstractControlFlowElement step) - throws OperationNotPerformedException { + throws OperationNotPerformedException, InvalidAdaptationPlan { + + if (step == null) + throw new InvalidAdaptationPlan("Current AbstractControlFlowElement is null!"); if (step instanceof StopAction) { return; - } else - - if (step instanceof BranchAction) { + } else if (step instanceof BranchAction) { executeBranchAction(step); - } else - - if (step instanceof LoopAction) { + } else if (step instanceof LoopAction) { execLoopAction(step); - } else - - if (step instanceof ActionReference) { + } else if (step instanceof ActionReference) { executeReferredAction(step); - } - // Handle invalid actions and control flow elements - else + } else // Handle invalid actions and control flow elements throw new OperationNotPerformedException( "No valid control flow element " + step.toString()); diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/exceptions/InvalidAdaptationPlan.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/exceptions/InvalidAdaptationPlan.java new file mode 100644 index 0000000000000000000000000000000000000000..ac06c40b63d59ff5515d569f2b6026e6c93f9b7c --- /dev/null +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/exceptions/InvalidAdaptationPlan.java @@ -0,0 +1,14 @@ +package edu.kit.ipd.descartes.adaptation.exceptions; + +public class InvalidAdaptationPlan extends Exception { + + public InvalidAdaptationPlan(String message) { + super(message); + } + + /** + * + */ + private static final long serialVersionUID = 963013704332157870L; + +} 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 204158b926fd6eee5fe72ed7c07f3e0795ed9a69..9a28ccd5d3f2e36220cbf556609c4f0cea0085af 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 @@ -31,17 +31,17 @@ import edu.kit.ipd.descartes.mm.resourcelandscape.RuntimeEnvironment; public class DmmModelActionHandler implements IActionHandler { static Logger logger = Logger.getLogger(DmmModelActionHandler.class); - private AdaptationProcessModelManager dmmModelResourceLoader; + private AdaptationProcessModelManager adaptProcessModelMgr; public DmmModelActionHandler() { - dmmModelResourceLoader = AdaptationProcessModelManager.getInstance(); + adaptProcessModelMgr = AdaptationProcessModelManager.getInstance(); logger.info("DMM Models loaded."); } private void saveModels() { try { - dmmModelResourceLoader.saveAll(); + adaptProcessModelMgr.saveAll(); } catch (IOException e) { logger.error("Error while saving models", e); } @@ -191,6 +191,10 @@ public class DmmModelActionHandler implements IActionHandler { targetContainer.getContains().add(migratedEntity); parent.getContains().remove(migratedEntity); break; + case ContainerrepositoryPackage.CONTAINER_TEMPLATE: + logger.debug("Migration a container referring to container template " + adaptableEntity); + //TODO: Implement ContainerTemplate Migration + break; default: throw new IllegalArgumentException("No implemented migrate operation for " + adaptableEntity); } diff --git a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/weightingfunction/WeightedSumCalculator.java b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/weightingfunction/WeightedSumCalculator.java index 67c304e35187c43fa71a630159354eac5689f6dd..0770ba64526c1f61009e16cd03c89a2eb23253f4 100644 --- a/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/weightingfunction/WeightedSumCalculator.java +++ b/edu.kit.ipd.descartes.adaptation/src/edu/kit/ipd/descartes/adaptation/weightingfunction/WeightedSumCalculator.java @@ -40,7 +40,7 @@ public class WeightedSumCalculator implements IWeightingFunctionCalculator { afterMetricValue.getMetricType()); if (Double.isNaN(weightOfMetric)) - logger.error("No weight found for metric type: " + afterMetricValue.getMetricType().getName()); + logger.info("No weight found for metric type: " + afterMetricValue.getMetricType().getName() + ", skipping..."); else { // add it newWeight += weightOfMetric * delta;