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

git-svn-id: https://se1.informatik.uni-wuerzburg.de/usvn/svn/code/code/DMM/trunk@13147 9e42b895-fcda-4063-8a3b-11be15eb1bbd
parent 604fabda
No related branches found
No related tags found
No related merge requests found
Showing
with 12 additions and 588 deletions
<?xml version="1.0" encoding="ASCII"?>
<mreg:ModelRegistrySettings xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:mreg="http://www.eclipse.org/ocl/1.0/ModelRegistry"/>
......@@ -10,11 +10,16 @@ Require-Bundle: edu.kit.ipd.descartes.mm.resourcelandscape;bundle-version="1.0.0
org.eclipse.core.runtime;bundle-version="3.8.0"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: edu.kit.ipd.descartes.adaptation.evaluation.performance,
Import-Package: edu.kit.ipd.descartes.adaptation.analysis,
edu.kit.ipd.descartes.adaptation.analysis.pcm,
edu.kit.ipd.descartes.adaptation.evaluation.performance,
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.repository,
edu.kit.ipd.descartes.adaptation.model.repository.dmm,
edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo,
edu.kit.ipd.descartes.ql.core.engine.query,
edu.kit.ipd.descartes.ql.lang.descartesQL,
edu.kit.ipd.descartes.ql.models.mapping.domain,
......@@ -23,5 +28,4 @@ Import-Package: edu.kit.ipd.descartes.adaptation.evaluation.performance,
org.apache.log4j;version="1.2.15",
org.eclipse.emf.ecore.xmi,
org.eclipse.emf.ecore.xmi.impl
Export-Package: edu.kit.ipd.descartes.adaptation,
edu.kit.ipd.descartes.adaptation.exceptions
Export-Package: edu.kit.ipd.descartes.adaptation
......@@ -10,12 +10,13 @@ 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.repository.dmm.AdaptationProcessModelLoader;
import edu.kit.ipd.descartes.adaptation.util.BlueYonderExperimentTracker;
import edu.kit.ipd.descartes.adaptation.util.IObserver;
import edu.kit.ipd.descartes.mm.adaptation.AbstractControlFlowElement;
import edu.kit.ipd.descartes.mm.adaptation.Action;
import edu.kit.ipd.descartes.mm.adaptation.ActionReference;
......
package edu.kit.ipd.descartes.adaptation;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.List;
import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
public class TacticsHistory {
public static final String NO_RESULT = "NoResult";
private List<WeightedTactic> wTactic;
private List<String> result;
private List<Boolean> tacticWasSuccessful;
private static TacticsHistory instance = null;
private TacticsHistory() {
wTactic = new LinkedList<WeightedTactic>();
result = new LinkedList<String>();
tacticWasSuccessful = new LinkedList<Boolean>();
}
public static TacticsHistory getInstance() {
if (instance == null)
instance = new TacticsHistory();
return instance;
}
public void add(WeightedTactic weightedTactic, String resultId,
boolean tacticWasSuccesful) {
wTactic.add(weightedTactic);
result.add(resultId);
this.tacticWasSuccessful.add(tacticWasSuccesful);
}
public WeightedTactic getLatestAppliedTactic() {
if (wTactic.size() <= 0)
return null;
else
return wTactic.get(wTactic.size() - 1);
}
public String getLatestResultId() {
return result.get(result.size() - 1);
}
public boolean wasLatestTacticSuccessful() {
return tacticWasSuccessful.get(tacticWasSuccessful.size() - 1);
}
public int size() {
if (wTactic.size() == result.size() && result.size() == tacticWasSuccessful.size())
return wTactic.size();
return -1;
}
public void printToSysOut() {
print(System.out);
}
private void print(PrintStream stream) {
PrintWriter out = new PrintWriter(stream);
out.println(" A P P L I E D T A C T I C S ");
for (int i = 0; i < wTactic.size(); i++) {
out.print(String
.format("Applied tactic %1$3d: %2$30s. Result ID: %3$20s. Successful: %4$5s.%n",
i + 1, wTactic.get(i).getUsedTactic().getName(),
result.get(i), tacticWasSuccessful.get(i)));
}
out.flush();
}
}
package edu.kit.ipd.descartes.adaptation.model.repository.perfdatarepo;
import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
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 Impact getLatestImpact(WeightedTactic tactic);
public Result getCurrentSystemState();
}
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 edu.kit.ipd.descartes.adaptation.TacticsHistory;
import edu.kit.ipd.descartes.adaptation.model.repository.AbstractEcoreModelLoader;
import edu.kit.ipd.descartes.adaptation.model.repository.dmm.AdaptationProcessModelLoader;
import edu.kit.ipd.descartes.adaptation.util.BlueYonderExperimentTracker;
import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
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 {
private BlueYonderExperimentTracker tracker = BlueYonderExperimentTracker.getInstance();
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() {
WeightedTactic latestTactic = TacticsHistory.getInstance().getLatestAppliedTactic();
Observation o = null;
if (latestTactic == null) {
o = repository.getLatestObservation();
} else {
// TODO: Blue Yonder specific, introduce abstraction layer
String expName = tracker.getExperimentNameForDistributedDataCenter(AdaptationProcessModelLoader.getDistributedDataCenter());
logger.debug("Searching for result of " + expName);
o = ObservationRepositoryHelper.getResultEndingWith(expName, repository);
}
return PerfDataRepoConverter.convertResult(o);
}
@Override
public Impact getLatestImpact(WeightedTactic tactic) {
String expName = tracker.getExperimentNameForDistributedDataCenter(AdaptationProcessModelLoader.getDistributedDataCenter());
logger.debug("Searching for impact of " + expName);
Impact latestImpact = PerfDataRepoConverter.convertObservableImpact(ObservationRepositoryHelper
.searchImpactOfTactic(expName, repository));
return latestImpact;
}
}
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;
}
}
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);
}
}
}
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;
}
}
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 edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
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 Impact getLatestImpact(WeightedTactic tactic) {
// TODO Auto-generated method stub
return null;
}
@Override
public Result getCurrentSystemState() {
return repository.getResultHistory().get(iteration++);
}
}
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;
}
}
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);
}
}
package edu.kit.ipd.descartes.adaptation.util;
import edu.kit.ipd.descartes.adaptation.TacticExecutor;
import edu.kit.ipd.descartes.mm.adaptation.WeightedTactic;
import edu.kit.ipd.descartes.mm.resourcelandscape.ComputingInfrastructure;
import edu.kit.ipd.descartes.mm.resourcelandscape.DistributedDataCenter;
public class BlueYonderExperimentTracker implements IObserver {
private static final String RESULT_NAME_TEMPLATE = "Xreq-par-$1Yps-desc4-gw-desc3-db-desc2-predict-Z ps=$2-req=5-size=50000";
// private static final String RESULT_NAME_TEMPLATE = "Xreq-par-$1$3Yps-desc4-gw-desc3-db-desc2-predict-Z ps=$2-req=40-size=500000";
// private static final String RESULT_NAME_TEMPLATE = "Xreq-par-$1$3Yps-desc4-gw-desc3-db-desc2-predict-Z ps=$2-req=30-size=500000";
private static BlueYonderExperimentTracker instance = null;
private int psOnDescOne = 0;
private int psOnDescFour = 1;
private int psOnDescOneBackup;
private int psOnDescFourBackup;
public void setSubject(TacticExecutor te) {
te.register(this);
}
public String getCurrentExperimentName() {
String result = RESULT_NAME_TEMPLATE;
if (psOnDescOne > 0)
result = RESULT_NAME_TEMPLATE.replace("$1", psOnDescOne + "ps-desc1-");
else
result = RESULT_NAME_TEMPLATE.replace("$1", "");
result = result.replace("$2", Integer.toString(psOnDescFour));
return result;
}
public void track(WeightedTactic tactic) {
String execTacticName = tactic.getName();
backupValues();
if (execTacticName.contains("Consolidate")) {
int loopCount = 1;
try {
loopCount = Integer.parseInt(tactic.getUsedTactic().getInputParams().get(0).getValue());
} catch (Exception e) {
}
if (execTacticName.contains("Low")) {
psOnDescFour = psOnDescFour - loopCount;
psOnDescOne = psOnDescOne + loopCount;
} else if (execTacticName.contains("High")) {
psOnDescOne = psOnDescOne - loopCount;
psOnDescFour = psOnDescFour + loopCount;
}
} else if (execTacticName.contains("Low")) {
psOnDescOne++;
if (execTacticName.contains("Migrate")) {
assert psOnDescFour > 0;
psOnDescFour--;
}
} else if (execTacticName.contains("High")) {
psOnDescFour++;
if (execTacticName.contains("Migrate")) {
assert psOnDescOne > 0;
psOnDescOne--;
}
}
}
private void backupValues() {
psOnDescOneBackup = psOnDescOne;
psOnDescFourBackup = psOnDescFour;
}
@Override
public void undo() {
resetValues();
}
private void resetValues() {
psOnDescOne = psOnDescOneBackup;
psOnDescFour = psOnDescFourBackup;
}
public static BlueYonderExperimentTracker getInstance() {
if (instance == null)
instance = new BlueYonderExperimentTracker();
return instance;
}
public String getExperimentNameForDistributedDataCenter(DistributedDataCenter distributedDataCenter) {
int[] psInstances = new int[4]; // 4 because currently we have 4 machines in the BY scenario
for (int i = 0; i < psInstances.length; i++)
{
try {
// Count number of instances on the desc1 - desc4 machines
psInstances[i] = ((ComputingInfrastructure) distributedDataCenter.getConsistsOf().get(0).getContains().get(i)).getContains().size();
} catch (Exception e) {
// If machine does not exist, there are also no instances on it
psInstances[i] = 0;
}
}
String result = RESULT_NAME_TEMPLATE;
if (psInstances[0] > 0)
result = result.replace("$1", psInstances[0] + "ps-desc1-");
else
result = result.replace("$1", "");
if (psInstances[1] > 1) // subtract 1 instance because GW/DB is also running here
result = result.replace("$3", (psInstances[1] - 1) + "ps-desc2-");
else
result = result.replace("$3", "");
result = result.replace("$2", Integer.toString(psInstances[3]));
return result;
}
}
package edu.kit.ipd.descartes.adaptation.util;
public interface IObserver {
public void undo();
}
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