/**
* This file is part of CloudML [ http://cloudml.org ]
*
* Copyright (C) 2012 - SINTEF ICT
* Contact: Franck Chauvel <franck.chauvel@sintef.no>
*
* Module: root
*
* CloudML is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* CloudML is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with CloudML. If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.cloudml.indicators;
import eu.diversify.trio.Trio;
import eu.diversify.trio.analysis.Analysis;
import org.cloudml.core.Deployment;
import eu.diversify.trio.core.System;
import eu.diversify.trio.data.DataSet;
import eu.diversify.trio.simulation.RandomFailureSequence;
import eu.diversify.trio.simulation.Scenario;
/**
* Compute the robustness of a given deployment model.
*
* We generate here a TRIO topology, on which the robustness calculation is
* based.
*/
public class Robustness {
private final Analysis results;
/**
* Build a robustness analysis accounting only for the dependency explicitly
* set up in the given model. Failures simulated during the analysis, will
* only propagate along these dependencies.
*
* @param deployment the deployment to analyse
* @param toObserve the subset of CloudML components whose failure are
* observed
* @param toControl the subset of CloudML components where failures are
* injected
* @return the robustness analysis
*/
public static Robustness of(Deployment deployment, Selection toObserve, Selection toControl) {
return new Robustness(deployment, toObserve, toControl, new OnlyExplicitDependencies());
}
/**
* Build a robustness analysis accounting for self-repair. Failure will not
* propagate along dependencies, if an existing alternative exist in the
* model.
*
* @param deployment the deployment to analyse
* @param toObserve the subset of CloudML components whose failure are
* observed
* @param toControl the subset of CloudML components where failures are
* injected
* @return the robustness analysis
*/
public static Robustness ofSelfRepairing(Deployment deployment, Selection toObserve, Selection toControl) {
return new Robustness(deployment, toObserve, toControl, new AllPossibleDependencies());
}
/**
* Create a new Robustness analysis of a given CloudML model
*
* @param deployment the deployment model to analyse
* @param dependencyStrategy the strategy to calculate the dependencies of
* components
* @param toObserve the subset of CloudML components whose failure are
* observed
* @param toControl the subset of CloudML components where failures are
* injected
*/
private Robustness(Deployment deployment, Selection toObserve, Selection toControl, DependencyExtractor dependencyStrategy) {
requireValid(deployment);
requireValid(toObserve, toControl);
final System trioSystem = new TrioExporter(dependencyStrategy).asTrioSystem(deployment);
final Trio trio = new Trio();
final Scenario scenario = new RandomFailureSequence(trioSystem, toObserve.asTrioFilter(), toControl.asTrioFilter());
final DataSet data = trio.run(scenario, DEFAULT_RUNCOUNT);
results = trio.analyse(data);
assert results != null: "robustness analysis did not produce any results!";
}
private void requireValid(Selection toObserve, Selection toControl) throws IllegalArgumentException {
if (toObserve == null || toControl == null) {
throw new IllegalArgumentException("'null' is not a valid selection");
}
}
private void requireValid(Deployment deployment) throws IllegalArgumentException {
if (deployment == null) {
throw new IllegalArgumentException("Unable to evaluate the robustness of 'null'");
}
}
private static final int DEFAULT_RUNCOUNT = 10000;
public double value() {
return results.metric(NORMALIZED_ROBUSTNESS).distribution().mean();
}
private static final String NORMALIZED_ROBUSTNESS = "norm. robustness";
}