Repository: incubator-brooklyn Updated Branches: refs/heads/master cc30e6f36 -> bc54d1d18
BROOKLYN-193 Add configuration for skipping invalid config values during rebind Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/680ee07b Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/680ee07b Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/680ee07b Branch: refs/heads/master Commit: 680ee07b38da835a3cb3a2c2efc5e0ff3076169b Parents: 2b23266 Author: Valentin Aitken <[email protected]> Authored: Fri Nov 13 23:58:27 2015 +0200 Committer: Valentin Aitken <[email protected]> Committed: Fri Nov 13 23:58:27 2015 +0200 ---------------------------------------------------------------------- .../api/mgmt/rebind/RebindExceptionHandler.java | 4 +++ .../mgmt/rebind/BasicEntityRebindSupport.java | 9 ++++--- .../mgmt/rebind/RebindExceptionHandlerImpl.java | 27 ++++++++++++++++++++ .../core/mgmt/rebind/RebindManagerImpl.java | 8 ++++++ docs/guide/ops/persistence/index.md | 2 ++ 5 files changed, 46 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/680ee07b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindExceptionHandler.java ---------------------------------------------------------------------- diff --git a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindExceptionHandler.java b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindExceptionHandler.java index 9660930..574a680 100644 --- a/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindExceptionHandler.java +++ b/api/src/main/java/org/apache/brooklyn/api/mgmt/rebind/RebindExceptionHandler.java @@ -24,6 +24,7 @@ import org.apache.brooklyn.api.catalog.CatalogItem; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.api.location.Location; +import org.apache.brooklyn.api.mgmt.rebind.mementos.EntityMemento; import org.apache.brooklyn.api.objs.BrooklynObject; import org.apache.brooklyn.api.objs.BrooklynObjectType; import org.apache.brooklyn.api.policy.Policy; @@ -31,6 +32,7 @@ import org.apache.brooklyn.api.sensor.Enricher; import org.apache.brooklyn.api.sensor.Feed; import com.google.common.annotations.Beta; +import org.apache.brooklyn.config.ConfigKey; /** * Handler called on all exceptions to do with rebind. @@ -91,6 +93,8 @@ public interface RebindExceptionHandler { void onRebindFailed(BrooklynObjectType type, BrooklynObject instance, Exception e); + void onAddConfigFailed(EntityMemento type, ConfigKey<?> value, Exception e); + void onAddPolicyFailed(EntityLocal entity, Policy policy, Exception e); void onAddEnricherFailed(EntityLocal entity, Enricher enricher, Exception e); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/680ee07b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java index abfc85d..a233067 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/BasicEntityRebindSupport.java @@ -42,7 +42,6 @@ import org.apache.brooklyn.util.exceptions.Exceptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; public class BasicEntityRebindSupport extends AbstractBrooklynObjectRebindSupport<EntityMemento> { @@ -101,15 +100,17 @@ public class BasicEntityRebindSupport extends AbstractBrooklynObjectRebindSuppor @SuppressWarnings("unchecked") @Override protected void addConfig(RebindContext rebindContext, EntityMemento memento) { + ConfigKey<?> key = null; for (Map.Entry<ConfigKey<?>, Object> entry : memento.getConfig().entrySet()) { try { - ConfigKey<?> key = entry.getKey(); + key = entry.getKey(); Object value = entry.getValue(); @SuppressWarnings("unused") // just to ensure we can load the declared type? or maybe not needed + // In what cases key.getType() will be null? Class<?> type = (key.getType() != null) ? key.getType() : rebindContext.loadClass(key.getTypeName()); entity.config().set((ConfigKey<Object>)key, value); - } catch (ClassNotFoundException e) { - throw Throwables.propagate(e); + } catch (ClassNotFoundException|IllegalArgumentException e) { + rebindContext.getExceptionHandler().onAddConfigFailed(memento, key, e); } } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/680ee07b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindExceptionHandlerImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindExceptionHandlerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindExceptionHandlerImpl.java index 7b4cd00..994a3a7 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindExceptionHandlerImpl.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindExceptionHandlerImpl.java @@ -24,6 +24,8 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import org.apache.brooklyn.api.mgmt.rebind.mementos.EntityMemento; +import org.apache.brooklyn.config.ConfigKey; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.brooklyn.api.catalog.CatalogItem; @@ -55,6 +57,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler { protected final RebindManager.RebindFailureMode danglingRefFailureMode; protected final RebindManager.RebindFailureMode rebindFailureMode; + protected final RebindManager.RebindFailureMode addConfigFailureMode; protected final RebindFailureMode addPolicyFailureMode; protected final RebindFailureMode loadPolicyFailureMode; protected final QuorumCheck danglingRefsQuorumRequiredHealthy; @@ -85,6 +88,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler { public static class Builder { private RebindManager.RebindFailureMode danglingRefFailureMode = RebindManager.RebindFailureMode.CONTINUE; private RebindManager.RebindFailureMode rebindFailureMode = RebindManager.RebindFailureMode.FAIL_AT_END; + private RebindManager.RebindFailureMode addConfigFailureMode = RebindManager.RebindFailureMode.FAIL_AT_END; private RebindManager.RebindFailureMode addPolicyFailureMode = RebindManager.RebindFailureMode.CONTINUE; private RebindManager.RebindFailureMode deserializePolicyFailureMode = RebindManager.RebindFailureMode.CONTINUE; private QuorumCheck danglingRefsQuorumRequiredHealthy = RebindManagerImpl.DANGLING_REFERENCES_MIN_REQUIRED_HEALTHY.getDefaultValue(); @@ -105,6 +109,10 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler { deserializePolicyFailureMode = val; return this; } + public Builder addConfigFailureMode(RebindManager.RebindFailureMode val) { + this.addConfigFailureMode = val; + return this; + } public Builder danglingRefQuorumRequiredHealthy(QuorumCheck val) { danglingRefsQuorumRequiredHealthy = val; return this; @@ -117,6 +125,7 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler { public RebindExceptionHandlerImpl(Builder builder) { this.danglingRefFailureMode = checkNotNull(builder.danglingRefFailureMode, "danglingRefFailureMode"); this.rebindFailureMode = checkNotNull(builder.rebindFailureMode, "rebindFailureMode"); + this.addConfigFailureMode = checkNotNull(builder.addConfigFailureMode, "addConfigFailureMode"); this.addPolicyFailureMode = checkNotNull(builder.addPolicyFailureMode, "addPolicyFailureMode"); this.loadPolicyFailureMode = checkNotNull(builder.deserializePolicyFailureMode, "deserializePolicyFailureMode"); this.danglingRefsQuorumRequiredHealthy = checkNotNull(builder.danglingRefsQuorumRequiredHealthy, "danglingRefsQuorumRequiredHealthy"); @@ -298,6 +307,24 @@ public class RebindExceptionHandlerImpl implements RebindExceptionHandler { } } + public void onAddConfigFailed(EntityMemento entityMemento, ConfigKey<?> key, Exception e) { + Exceptions.propagateIfFatal(e); + + String errmsg = "Failed to rebind " + key + " with value " + entityMemento.getConfig().get(key) + " for entity " + entityMemento; + switch (addConfigFailureMode) { + case FAIL_FAST: + throw new IllegalStateException(errmsg, e); + case FAIL_AT_END: + exceptions.add(new IllegalStateException(errmsg, e)); + break; + case CONTINUE: + warn(errmsg + "; continuing", e); + break; + default: + throw new IllegalStateException("Unexpected state '"+addPolicyFailureMode+"' for addPolicyFailureMode"); + } + } + @Override public void onAddPolicyFailed(EntityLocal entity, Policy policy, Exception e) { Exceptions.propagateIfFatal(e); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/680ee07b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java index dccd91a..5525981 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/RebindManagerImpl.java @@ -92,6 +92,9 @@ public class RebindManagerImpl implements RebindManager { public static final ConfigKey<RebindFailureMode> REBIND_FAILURE_MODE = ConfigKeys.newConfigKey(RebindFailureMode.class, "rebind.failureMode.rebind", "Action to take if a failure occurs during rebind", RebindFailureMode.FAIL_AT_END); + public static final ConfigKey<RebindFailureMode> ADD_CONFIG_FAILURE_MODE = + ConfigKeys.newConfigKey(RebindFailureMode.class, "rebind.failureMode.addConfig", + "Action to take if a failure occurs when setting a config value. It could happen coercion of the value type to fail.", RebindFailureMode.FAIL_AT_END); public static final ConfigKey<RebindFailureMode> ADD_POLICY_FAILURE_MODE = ConfigKeys.newConfigKey(RebindFailureMode.class, "rebind.failureMode.addPolicy", "Action to take if a failure occurs when adding a policy or enricher", RebindFailureMode.CONTINUE); @@ -131,6 +134,7 @@ public class RebindManagerImpl implements RebindManager { private RebindFailureMode danglingRefFailureMode; private RebindFailureMode rebindFailureMode; + private RebindFailureMode addConfigFailureMode; private RebindFailureMode addPolicyFailureMode; private RebindFailureMode loadPolicyFailureMode; private QuorumCheck danglingRefsQuorumRequiredHealthy; @@ -177,6 +181,7 @@ public class RebindManagerImpl implements RebindManager { danglingRefFailureMode = managementContext.getConfig().getConfig(DANGLING_REFERENCE_FAILURE_MODE); rebindFailureMode = managementContext.getConfig().getConfig(REBIND_FAILURE_MODE); + addConfigFailureMode = managementContext.getConfig().getConfig(ADD_CONFIG_FAILURE_MODE); addPolicyFailureMode = managementContext.getConfig().getConfig(ADD_POLICY_FAILURE_MODE); loadPolicyFailureMode = managementContext.getConfig().getConfig(LOAD_POLICY_FAILURE_MODE); @@ -384,6 +389,7 @@ public class RebindManagerImpl implements RebindManager { .danglingRefFailureMode(danglingRefFailureMode) .danglingRefQuorumRequiredHealthy(danglingRefsQuorumRequiredHealthy) .rebindFailureMode(rebindFailureMode) + .addConfigFailureMode(addConfigFailureMode) .addPolicyFailureMode(addPolicyFailureMode) .loadPolicyFailureMode(loadPolicyFailureMode) .build(); @@ -479,6 +485,7 @@ public class RebindManagerImpl implements RebindManager { .danglingRefFailureMode(danglingRefFailureMode) .danglingRefQuorumRequiredHealthy(danglingRefsQuorumRequiredHealthy) .rebindFailureMode(rebindFailureMode) + .addConfigFailureMode(addConfigFailureMode) .addPolicyFailureMode(addPolicyFailureMode) .loadPolicyFailureMode(loadPolicyFailureMode) .build(); @@ -509,6 +516,7 @@ public class RebindManagerImpl implements RebindManager { RebindExceptionHandler exceptionHandler = RebindExceptionHandlerImpl.builder() .danglingRefFailureMode(danglingRefFailureMode) .rebindFailureMode(rebindFailureMode) + .addConfigFailureMode(addConfigFailureMode) .addPolicyFailureMode(addPolicyFailureMode) .loadPolicyFailureMode(loadPolicyFailureMode) .build(); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/680ee07b/docs/guide/ops/persistence/index.md ---------------------------------------------------------------------- diff --git a/docs/guide/ops/persistence/index.md b/docs/guide/ops/persistence/index.md index a74f301..4788db9 100644 --- a/docs/guide/ops/persistence/index.md +++ b/docs/guide/ops/persistence/index.md @@ -191,6 +191,7 @@ rebind.failureMode.danglingRef=continue rebind.failureMode.loadPolicy=continue rebind.failureMode.addPolicy=continue rebind.failureMode.rebind=fail_at_end +rebind.failureMode.addConfig=fail_at_end {% endhighlight %} For each of these configuration options, the possible values are: @@ -212,6 +213,7 @@ The meaning of the configuration options is: * `rebind.failureMode.addPolicy`: if there is an error re-adding the policy or enricher to its associated entity... whether to continue (discarding the policy or enricher) or fail. +* `rebind.failureMode.addConfig`: if there is invalid config value, or some other error occurs when adding a config. * `rebind.failureMode.rebind`: any errors on rebind not covered by the more specific error cases described above.
