Repository: incubator-brooklyn Updated Branches: refs/heads/master 11b08da35 -> 6c4da4467
Add quorum check enricher and aggregator Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9e2d187e Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9e2d187e Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9e2d187e Branch: refs/heads/master Commit: 9e2d187eb107ffea8ecf6444b7ae85fe5a0a2e27 Parents: 7c649d7 Author: Mike Zaccardo <mike.zacca...@cloudsoftcorp.com> Authored: Tue Nov 24 15:24:22 2015 -0500 Committer: Mike Zaccardo <mike.zacca...@cloudsoftcorp.com> Committed: Tue Nov 24 15:24:22 2015 -0500 ---------------------------------------------------------------------- .../brooklyn/enricher/stock/Aggregator.java | 10 ++++++ .../brooklyn/enricher/stock/Enrichers.java | 34 +++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9e2d187e/core/src/main/java/org/apache/brooklyn/enricher/stock/Aggregator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/Aggregator.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/Aggregator.java index 0e0e8cc..f9a0988 100644 --- a/core/src/main/java/org/apache/brooklyn/enricher/stock/Aggregator.java +++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/Aggregator.java @@ -35,6 +35,7 @@ import org.apache.brooklyn.core.BrooklynLogging; import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; +import org.apache.brooklyn.util.collections.QuorumCheck.QuorumChecks; import org.apache.brooklyn.util.core.flags.SetFromFlag; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.text.StringPredicates; @@ -64,6 +65,13 @@ public class Aggregator<T,U> extends AbstractAggregator<T,U> implements SensorEv public static final ConfigKey<Boolean> EXCLUDE_BLANK = ConfigKeys.newBooleanConfigKey("enricher.aggregator.excludeBlank", "Whether explicit nulls or blank strings should be excluded (default false); this only applies if no value filter set", false); + /** + * @see QuorumChecks + */ + public static final ConfigKey<String> QUORUM_CHECK_TYPE = ConfigKeys.newStringConfigKey("quorum.check.type", "The requirement to be considered quorate -- possible values: 'all', 'allAndAtLeastOne', 'atLeastOne', 'atLeastOneUnlessEmpty', 'alwaysHealthy'", "allAndAtLeastOne"); + + public static final ConfigKey<Integer> QUORUM_TOTAL_SIZE = ConfigKeys.newIntegerConfigKey("quorum.total.size", "The total size to consider when determining if quorate", 1); + protected Sensor<T> sourceSensor; protected Function<? super Collection<T>, ? extends U> transformation; @@ -103,6 +111,8 @@ public class Aggregator<T,U> extends AbstractAggregator<T,U> implements SensorEv protected Function<? super Collection<?>, ?> lookupTransformation(String t1) { if ("average".equalsIgnoreCase(t1)) return new Enrichers.ComputingAverage(null, null, targetSensor.getTypeToken()); if ("sum".equalsIgnoreCase(t1)) return new Enrichers.ComputingSum(null, null, targetSensor.getTypeToken()); + if ("isQuorate".equalsIgnoreCase(t1)) return new Enrichers.ComputingIsQuorate(targetSensor.getTypeToken(), + QuorumChecks.of(config().get(QUORUM_CHECK_TYPE)), config().get(QUORUM_TOTAL_SIZE)); if ("list".equalsIgnoreCase(t1)) return new ComputingList(); return null; } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9e2d187e/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java b/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java index 2ce2b21..3dfabcf 100644 --- a/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java +++ b/core/src/main/java/org/apache/brooklyn/enricher/stock/Enrichers.java @@ -38,6 +38,7 @@ import org.apache.brooklyn.enricher.stock.reducer.Reducer; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.collections.MutableSet; +import org.apache.brooklyn.util.collections.QuorumCheck; import org.apache.brooklyn.util.core.flags.TypeCoercions; import org.apache.brooklyn.util.text.StringPredicates; import org.apache.brooklyn.util.text.Strings; @@ -891,6 +892,38 @@ public class Enrichers { return result; } + @Beta + public static class ComputingIsQuorate<T> implements Function<Collection<Boolean>, Boolean> { + protected final TypeToken<T> typeToken; + protected final QuorumCheck quorumCheck; + protected final int totalSize; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public ComputingIsQuorate(TypeToken<T> typeToken, QuorumCheck quorumCheck, int totalSize) { + this.quorumCheck = quorumCheck; + this.totalSize = totalSize; + + if (typeToken!=null && TypeToken.of(Boolean.class).isAssignableFrom(typeToken.getType())) { + this.typeToken = typeToken; + } else if (typeToken==null || typeToken.isAssignableFrom(Boolean.class)) { + this.typeToken = (TypeToken)TypeToken.of(Boolean.class); + } else { + throw new IllegalArgumentException("Type " + typeToken + " is not valid for " + this + " -- expected " + TypeToken.of(Boolean.class)); + } + } + + @Override + public Boolean apply(Collection<Boolean> input) { + int numTrue = 0; + + for (Boolean inputVal : input) + if (Boolean.TRUE.equals(inputVal)) + numTrue++; + + return Boolean.valueOf(quorumCheck.isQuorate(numTrue, totalSize)); + } + } + private static <T> Map<T,T> newIdentityMap(Set<T> keys) { Map<T,T> result = Maps.newLinkedHashMap(); for (T key : keys) { @@ -899,5 +932,4 @@ public class Enrichers { return result; } - }