You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by sm...@apache.org on 2014/08/13 20:19:45 UTC

[1/9] git commit: SLIDER-202: add codahale metrics

Repository: incubator-slider
Updated Branches:
  refs/heads/feature/SLIDER-285_Restart_AM 70519f785 -> eadb3c731


SLIDER-202: add codahale metrics


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/8d4217e7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/8d4217e7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/8d4217e7

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 8d4217e7988e561d6e9432f86a76c86adcfaee87
Parents: d38b31a
Author: Steve Loughran <st...@apache.org>
Authored: Tue Aug 12 20:43:00 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Tue Aug 12 20:43:00 2014 +0100

----------------------------------------------------------------------
 pom.xml             |  8 ++++++++
 slider-core/pom.xml | 46 +++++-----------------------------------------
 2 files changed, 13 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8d4217e7/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 253d40f..ed823c4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -143,11 +143,14 @@
 
     <jackson.version>1.9.13</jackson.version>
     <jcommander.version>1.30</jcommander.version>
+
     <jersey.version>1.9</jersey.version>
     <servlet-api.version>2.5</servlet-api.version>
     <jsr311-api.version>1.1.1</jsr311-api.version>
+
     <junit.version>4.11</junit.version>
     <log4j.version>1.2.17</log4j.version>
+    <metrics.version>3.0.1</metrics.version>
     <mockito.version>1.8.5</mockito.version>
 
     <!-- ProtocolBuffer version, used to verify the protoc version and -->
@@ -1174,6 +1177,11 @@
         <version>${jersey.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>com.codahale.metrics</groupId>
+        <artifactId>metrics-core</artifactId>
+        <version>${metrics.version}</version>
+      </dependency>
 
       <!-- ======================================================== -->
       <!-- Mocking -->

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8d4217e7/slider-core/pom.xml
----------------------------------------------------------------------
diff --git a/slider-core/pom.xml b/slider-core/pom.xml
index a44e3bc..d403034 100644
--- a/slider-core/pom.xml
+++ b/slider-core/pom.xml
@@ -309,48 +309,7 @@
       <artifactId>hadoop-minicluster</artifactId>
       <scope>test</scope>
     </dependency>
-<!--
-
-    <dependency>
-      <groupId>org.apache.hbase</groupId>
-      <artifactId>hbase-client</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.hbase</groupId>
-      <artifactId>hbase-server</artifactId>
-      <scope>test</scope>
-    </dependency>
-
--->
-
-<!--
-
-    <dependency>
-      <groupId>org.apache.accumulo</groupId>
-      <artifactId>accumulo-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.accumulo</groupId>
-      <artifactId>accumulo-minicluster</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.accumulo</groupId>
-      <artifactId>accumulo-start</artifactId>
-      <scope>test</scope>
-    </dependency>
 
-    <dependency>
-      <groupId>org.apache.accumulo</groupId>
-      <artifactId>accumulo-trace</artifactId>
-      <scope>test</scope>
-    </dependency>
--->
 
     <dependency>
       <groupId>junit</groupId>
@@ -398,6 +357,11 @@
       <artifactId>commons-logging</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>com.codahale.metrics</groupId>
+      <artifactId>metrics-core</artifactId>
+    </dependency>
+    
     <!-- ======================================================== -->
     <!-- service registry -->
     <!-- ======================================================== -->


[2/9] git commit: SLIDER-202 initial chaos monkey

Posted by sm...@apache.org.
SLIDER-202 initial chaos monkey


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/c951e251
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/c951e251
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/c951e251

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: c951e2519e3d4327bce04bc2ee826d3140f8c0ed
Parents: 8d4217e
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 10:18:01 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 10:18:01 2014 +0100

----------------------------------------------------------------------
 .../server/appmaster/SliderAppMaster.java       |  6 ++
 .../server/appmaster/monkey/ChaosEntry.java     | 35 ++++++++++++
 .../appmaster/monkey/ChaosMonkeyService.java    | 60 ++++++++++++++++++++
 .../server/appmaster/monkey/ChaosTarget.java    | 24 ++++++++
 4 files changed, 125 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 9a2851a..1135a58 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -18,6 +18,7 @@
 
 package org.apache.slider.server.appmaster;
 
+import com.codahale.metrics.MetricRegistry;
 import com.google.protobuf.BlockingService;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
@@ -196,6 +197,11 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
   public static final int NUM_RPC_HANDLERS = 5;
   public static final int SCHEDULED_EXECUTOR_POOL_SIZE = 1;
 
+  /**
+   * Singleton of metrics registry
+   */
+  public static final MetricRegistry metrics = new MetricRegistry();
+  
   /** YARN RPC to communicate with the Resource Manager or Node Manager */
   private YarnRPC yarnRPC;
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
new file mode 100644
index 0000000..779cca1
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.monkey;
+
+/**
+ * Entry in the chaos list
+ */
+public class ChaosEntry {
+  
+  public final String name;
+  public final ChaosTarget target;
+  public final long probability;
+
+  public ChaosEntry(String name, ChaosTarget target, long probability) {
+    this.name = name;
+    this.target = target;
+    this.probability = probability;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
new file mode 100644
index 0000000..7c5638c
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.monkey;
+
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.service.AbstractService;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChaosMonkeyService extends AbstractService {
+  protected static final Logger log =
+      LoggerFactory.getLogger(ChaosMonkeyService.class);
+  private final MetricRegistry metrics;
+  private final QueueAccess queues;
+
+  private static final List<ChaosEntry> chaosEntries =
+      new ArrayList<ChaosEntry>();
+      
+  public ChaosMonkeyService(MetricRegistry metrics, QueueAccess queues) {
+    super("ChaosMonkeyService");
+    this.metrics = metrics;
+    this.queues = queues;
+  }
+
+  
+  @Override
+  protected void serviceStart() throws Exception {
+    super.serviceStart();
+    
+  }
+  
+  
+  public synchronized void addTarget(ChaosTarget target,  long probability) {
+    Preconditions.checkArgument(target != null, "null target");
+    Preconditions.checkArgument(probability > 0, "negative probability");
+    Preconditions.checkArgument(probability > 10000, "probability over 100%");
+  }
+  
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/c951e251/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java
new file mode 100644
index 0000000..1c3a9ac
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosTarget.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.monkey;
+
+public interface ChaosTarget {
+
+  public void chaosAction();
+}


[3/9] git commit: SLIDER-202 Monkey implemented but not conditional/integrated

Posted by sm...@apache.org.
SLIDER-202 Monkey implemented but not conditional/integrated


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/b111268a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/b111268a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/b111268a

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: b111268af07a75797c9f56b3ab96c0dd052a62a8
Parents: c951e25
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 12:00:27 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 12:00:27 2014 +0100

----------------------------------------------------------------------
 .../server/appmaster/SliderAppMaster.java       | 52 +++++++++++----
 .../server/appmaster/actions/ActionHalt.java    |  4 +-
 .../appmaster/actions/ActionKillContainer.java  | 51 +++++++++++++++
 .../server/appmaster/monkey/ChaosEntry.java     | 53 ++++++++++++++-
 .../server/appmaster/monkey/ChaosKillAM.java    | 48 ++++++++++++++
 .../appmaster/monkey/ChaosKillContainer.java    | 68 ++++++++++++++++++++
 .../appmaster/monkey/ChaosMonkeyService.java    | 41 ++++++++----
 .../appmaster/monkey/MonkeyPlayAction.java      | 48 ++++++++++++++
 .../slider/server/appmaster/state/AppState.java | 14 +++-
 .../standalone/TestStandaloneAgentAM.groovy     |  2 +-
 10 files changed, 346 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 1135a58..ee0e59e 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -97,6 +97,7 @@ import org.apache.slider.providers.ProviderService;
 import org.apache.slider.providers.SliderProviderFactory;
 import org.apache.slider.providers.slideram.SliderAMClientProvider;
 import org.apache.slider.providers.slideram.SliderAMProviderService;
+import org.apache.slider.server.appmaster.actions.ActionKillContainer;
 import org.apache.slider.server.appmaster.actions.QueueExecutor;
 import org.apache.slider.server.appmaster.actions.ActionHalt;
 import org.apache.slider.server.appmaster.actions.QueueService;
@@ -104,6 +105,9 @@ import org.apache.slider.server.appmaster.actions.ActionStopSlider;
 import org.apache.slider.server.appmaster.actions.AsyncAction;
 import org.apache.slider.server.appmaster.actions.RenewingAction;
 import org.apache.slider.server.appmaster.actions.ResetFailureWindow;
+import org.apache.slider.server.appmaster.monkey.ChaosKillAM;
+import org.apache.slider.server.appmaster.monkey.ChaosKillContainer;
+import org.apache.slider.server.appmaster.monkey.ChaosMonkeyService;
 import org.apache.slider.server.appmaster.operations.AsyncRMOperationHandler;
 import org.apache.slider.server.appmaster.operations.ProviderNotifyingOperationHandler;
 import org.apache.slider.server.appmaster.rpc.RpcBinder;
@@ -112,7 +116,6 @@ import org.apache.slider.server.appmaster.rpc.SliderClusterProtocolPBImpl;
 import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
 import org.apache.slider.server.appmaster.state.AppState;
 import org.apache.slider.server.appmaster.state.ContainerAssignment;
-import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation;
 import org.apache.slider.server.appmaster.state.ProviderAppState;
 import org.apache.slider.server.appmaster.operations.RMOperationHandler;
 import org.apache.slider.server.appmaster.state.RoleInstance;
@@ -147,7 +150,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
@@ -301,6 +303,11 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
   private ContainerId appMasterContainerID;
 
   /**
+   * Monkey Service -may be null
+   */
+  private ChaosMonkeyService monkey;
+  
+  /**
    * ProviderService of this cluster
    */
   @SuppressWarnings("FieldAccessedSynchronizedAndUnsynchronized")
@@ -780,6 +787,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     // starts the node review process
     launchProviderService(instanceDefinition, confDir);
 
+    // chaos monkey
+    maybeStartMonkey();
 
     try {
       //now block waiting to be told to exit the process
@@ -1103,7 +1112,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     }
     
     //for all the operations, exec them
-    rmOperationHandler.execute(operations);
+    executeRMOperations(operations);
     log.info("Diagnostics: " + getContainerDiagnosticInfo());
   }
 
@@ -1221,7 +1230,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
       // tell the provider
       providerRMOperationHandler.execute(allOperations);
       //now apply the operations
-      rmOperationHandler.execute(allOperations);
+      executeRMOperations(allOperations);
       return !allOperations.isEmpty();
     } catch (TriggerClusterTeardownException e) {
 
@@ -1237,7 +1246,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
    */
   private void releaseAllContainers() {
     //now apply the operations
-    rmOperationHandler.execute(appState.releaseAllContainers());
+    executeRMOperations(appState.releaseAllContainers());
   }
 
   /**
@@ -1441,19 +1450,17 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     //throws NoSuchNodeException if it is missing
     RoleInstance instance =
       appState.getLiveInstanceByContainerID(containerID);
-    List<AbstractRMOperation> opsList =
-      new LinkedList<>();
-    ContainerReleaseOperation release =
-      new ContainerReleaseOperation(instance.getId());
-    opsList.add(release);
-    //now apply the operations
-    rmOperationHandler.execute(opsList);
+    queue(new ActionKillContainer(instance.getId(), 0, TimeUnit.MILLISECONDS));
     Messages.KillContainerResponseProto.Builder builder =
       Messages.KillContainerResponseProto.newBuilder();
     builder.setSuccess(true);
     return builder.build();
   }
 
+  public void executeRMOperations(List<AbstractRMOperation> operations) {
+    rmOperationHandler.execute(operations);
+  }
+
   @Override
   public Messages.AMSuicideResponseProto amSuicide(
       Messages.AMSuicideRequestProto request)
@@ -1462,7 +1469,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     String text = request.getText();
     int delay = request.getDelay();
     log.info("AM Suicide with signal {}, message {} delay = {}", signal, text, delay);
-    ActionHalt action = new ActionHalt(signal, text, delay);
+    ActionHalt action = new ActionHalt(signal, text, delay,
+        TimeUnit.MILLISECONDS);
     schedule(action);
     return Messages.AMSuicideResponseProto.getDefaultInstance();
   }
@@ -1537,7 +1545,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
         containerId);
     RoleInstance activeContainer = appState.getActiveContainer(containerId);
     if (activeContainer != null) {
-      rmOperationHandler.execute(appState.releaseContainer(containerId));
+      executeRMOperations(appState.releaseContainer(containerId));
       // ask for more containers if needed
       log.info("Container released; triggering review");
       reviewRequestAndReleaseNodes();
@@ -1725,6 +1733,22 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     signalAMComplete(exitCode, exception.toString());
   }
   
+  public boolean maybeStartMonkey() {
+    monkey = new ChaosMonkeyService(metrics, actionQueues);
+    int amKillProbability = 100;
+    int containerKillProbability = 200;
+    monkey.addTarget("AM killer", 
+        new ChaosKillAM(this, actionQueues, -1),
+        amKillProbability);
+    monkey.addTarget("Container killer", 
+        new ChaosKillContainer(this, actionQueues),
+        amKillProbability);
+    initAndAddService(monkey);
+    // and schedule it
+    schedule(monkey.getChaosAction(60, TimeUnit.SECONDS));
+    return true;
+  }
+  
   /**
    * This is the main entry point for the service launcher.
    * @param args command line arguments.

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
index b46a791..c21e249 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionHalt.java
@@ -22,6 +22,8 @@ import org.apache.hadoop.util.ExitUtil;
 import org.apache.slider.server.appmaster.SliderAppMaster;
 import org.apache.slider.server.appmaster.state.AppState;
 
+import java.util.concurrent.TimeUnit;
+
 /**
  * Exit a JVM halt.
  * @see ExitUtil#halt(int, String) 
@@ -34,7 +36,7 @@ public class ActionHalt extends AsyncAction {
   public ActionHalt(
       int status,
       String text,
-      long delay) {
+      long delay, TimeUnit timeUnit) {
     super("Halt", delay, ActionAttributes.HALTS_CLUSTER);
     this.status = status;
     this.text = text;

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
new file mode 100644
index 0000000..7668bd5
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.actions;
+
+import org.apache.hadoop.yarn.api.records.ContainerId;
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
+import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation;
+import org.apache.slider.server.appmaster.state.AppState;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class ActionKillContainer extends AsyncAction {
+
+  private final ContainerId containerId;
+  
+  public ActionKillContainer(ContainerId containerId, long delay,
+      TimeUnit timeUnit) {
+    super("kill container", delay, timeUnit);
+    this.containerId = containerId;
+  }
+
+  @Override
+  public void execute(SliderAppMaster appMaster,
+      QueueAccess queueService,
+      AppState appState) throws Exception {
+    List<AbstractRMOperation> opsList = new LinkedList<>();
+    ContainerReleaseOperation release = new ContainerReleaseOperation(containerId);
+    opsList.add(release);
+    //now apply the operations
+    appMaster.executeRMOperations(opsList);
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
index 779cca1..13bda57 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
@@ -18,18 +18,67 @@
 
 package org.apache.slider.server.appmaster.monkey;
 
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.MetricRegistry;
+import com.google.common.base.Preconditions;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * Entry in the chaos list
  */
 public class ChaosEntry {
-  
+
+  protected static final Logger log =
+      LoggerFactory.getLogger(ChaosEntry.class);
   public final String name;
   public final ChaosTarget target;
   public final long probability;
 
-  public ChaosEntry(String name, ChaosTarget target, long probability) {
+  private final MetricRegistry metrics;
+  private final Counter invocationCounter;
+
+
+  /**
+   * Constructor -includes validaton of all arguments
+   * @param name
+   * @param target
+   * @param probability
+   */
+  public ChaosEntry(String name, ChaosTarget target, long probability,
+      MetricRegistry metrics) {
+    Preconditions.checkArgument(!StringUtils.isEmpty(name), "missing name");
+    Preconditions.checkArgument(target != null, "null target");
+    Preconditions.checkArgument(probability > 0, "negative probability");
+    Preconditions.checkArgument(probability < 10000, "probability over 100%");
     this.name = name;
     this.target = target;
     this.probability = probability;
+    this.metrics = metrics;
+    invocationCounter =
+        metrics.counter(MetricRegistry.name(ChaosEntry.class, name));
+  }
+
+  /**
+   * Trigger the chaos action
+   */
+  public void invokeChaos() {
+    log.info("Invoking {}", name);
+    invocationCounter.inc();
+    target.chaosAction();
+  }
+
+  /**
+   * Invoke Chaos if the trigger value is in range of the probability
+   * @param trigger trigger value, 0-10K
+   * @return true if the chaos method was invoked
+   */
+  public boolean maybeInvokeChaos(long trigger) {
+    if (probability < 0) {
+      invokeChaos();
+      return true;
+    }
+    return false;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
new file mode 100644
index 0000000..c464ac3
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.monkey;
+
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.actions.ActionHalt;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+
+import java.util.concurrent.TimeUnit;
+
+public class ChaosKillAM implements ChaosTarget {
+
+  private final SliderAppMaster appMaster;
+  private final QueueAccess queues;
+  private final int exitCode;
+
+  public ChaosKillAM(SliderAppMaster appMaster,
+      QueueAccess queues, int exitCode) {
+    this.appMaster = appMaster;
+    this.queues = queues;
+    this.exitCode = exitCode;
+  }
+
+  /**
+   * Trigger a delayed halt
+   */
+  @Override
+  public void chaosAction() {
+    queues.schedule(new ActionHalt(exitCode, "Chaos invoked halt", 1000,
+        TimeUnit.MILLISECONDS));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
new file mode 100644
index 0000000..0ffcc8a
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.monkey;
+
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.actions.ActionKillContainer;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.state.RoleInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Kill a container
+ */
+public class ChaosKillContainer implements ChaosTarget {
+  protected static final Logger log =
+      LoggerFactory.getLogger(ChaosKillContainer.class);
+  private final SliderAppMaster appMaster;
+  private final QueueAccess queues;
+  private final Random random = new Random();
+
+  public ChaosKillContainer(SliderAppMaster appMaster,
+      QueueAccess queues) {
+    this.appMaster = appMaster;
+    this.queues = queues;
+  }
+
+  /**
+   * Trigger a container kill halt
+   */
+  
+  @Override
+  public void chaosAction() {
+    List<RoleInstance> liveContainers =
+        appMaster.getAppState().cloneLiveContainerInfoList();
+    int size = liveContainers.size();
+    if (size == 0) {
+      log.info("No containers to kill");
+      return;
+    }
+    int target = random.nextInt(size);
+    RoleInstance roleInstance = liveContainers.get(target);
+    log.info("Killing {}", roleInstance);
+
+    queues.schedule(new ActionKillContainer(roleInstance.getId(),
+        100, TimeUnit.MILLISECONDS));
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
index 7c5638c..c525d02 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
@@ -19,15 +19,20 @@
 package org.apache.slider.server.appmaster.monkey;
 
 import com.codahale.metrics.MetricRegistry;
-import com.google.common.base.Preconditions;
 import org.apache.hadoop.service.AbstractService;
+import org.apache.slider.server.appmaster.actions.AsyncAction;
 import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.actions.RenewingAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
+/**
+ * A chaos monkey service which will invoke ChaosTarget events 
+ */
 public class ChaosMonkeyService extends AbstractService {
   protected static final Logger log =
       LoggerFactory.getLogger(ChaosMonkeyService.class);
@@ -36,25 +41,33 @@ public class ChaosMonkeyService extends AbstractService {
 
   private static final List<ChaosEntry> chaosEntries =
       new ArrayList<ChaosEntry>();
-      
+
   public ChaosMonkeyService(MetricRegistry metrics, QueueAccess queues) {
     super("ChaosMonkeyService");
     this.metrics = metrics;
     this.queues = queues;
   }
 
-  
-  @Override
-  protected void serviceStart() throws Exception {
-    super.serviceStart();
-    
+
+  public synchronized void addTarget(String name,
+      ChaosTarget target,
+      long probability) {
+
+    chaosEntries.add(new ChaosEntry(name, target, probability, metrics));
+  }
+
+  public void play() {
+
   }
-  
-  
-  public synchronized void addTarget(ChaosTarget target,  long probability) {
-    Preconditions.checkArgument(target != null, "null target");
-    Preconditions.checkArgument(probability > 0, "negative probability");
-    Preconditions.checkArgument(probability > 10000, "probability over 100%");
+
+  public RenewingAction<MonkeyPlayAction> getChaosAction(long time, TimeUnit timeUnit) {
+    RenewingAction<MonkeyPlayAction> action = new RenewingAction<>(
+        new MonkeyPlayAction(this, 0, TimeUnit.MILLISECONDS),
+        time,
+        time,
+        timeUnit,
+        0
+    );
+    return action;
   }
-  
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java
new file mode 100644
index 0000000..20e4466
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/MonkeyPlayAction.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.monkey;
+
+import org.apache.slider.server.appmaster.SliderAppMaster;
+import org.apache.slider.server.appmaster.actions.AsyncAction;
+import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.state.AppState;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Queueable action which calls {@link ChaosMonkeyService#play()} when
+ * executed.
+ */
+public class MonkeyPlayAction extends AsyncAction {
+
+  private final ChaosMonkeyService monkey;
+
+  public MonkeyPlayAction(ChaosMonkeyService monkey, long delay,
+      TimeUnit timeUnit) {
+    super("chaos monkey", delay, timeUnit);
+    this.monkey = monkey;
+  }
+
+  @Override
+  public void execute(SliderAppMaster appMaster,
+      QueueAccess queueService,
+      AppState appState) throws Exception {
+    monkey.play();
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
index 48f97bb..d616678 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
@@ -101,7 +101,7 @@ public class AppState {
    * Flag set to indicate the application is live -this only happens
    * after the buildInstance operation
    */
-  boolean applicationLive = false;
+  private boolean applicationLive = false;
 
   /**
    * The definition of the instance. Flexing updates the resources section
@@ -811,6 +811,10 @@ public class AppState {
     return activeContainers.remove(id);
   }
 
+  /**
+   * Clone the live container list. This is synchronized.
+   * @return a snapshot of the live node list
+   */
   public synchronized List<RoleInstance> cloneLiveContainerInfoList() {
     List<RoleInstance> allRoleInstances;
     Collection<RoleInstance> values = getLiveNodes().values();
@@ -818,8 +822,12 @@ public class AppState {
     return allRoleInstances;
   }
 
-
-
+  /**
+   * Lookup live instance by string value of container ID
+   * @param containerId container ID
+   * @return the role instance for that container
+   * @throws NoSuchNodeException if it does not exist
+   */
   public synchronized RoleInstance getLiveInstanceByContainerID(String containerId)
     throws NoSuchNodeException {
     Collection<RoleInstance> nodes = getLiveNodes().values();

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/b111268a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
index 8498ee2..73e9b07 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAgentAM.groovy
@@ -37,10 +37,10 @@ import org.junit.Test
 @CompileStatic
 @Slf4j
 class TestStandaloneAgentAM  extends AgentMiniClusterTestBase {
+  
   @Test
   public void testStandaloneAgentAM() throws Throwable {
 
-
     describe "create a masterless AM then get the service and look it up via the AM"
 
     //launch fake master


[8/9] git commit: Merge branch 'feature/SLIDER-202_chaos_monkey' into develop

Posted by sm...@apache.org.
Merge branch 'feature/SLIDER-202_chaos_monkey' into develop


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/9b20e47b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/9b20e47b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/9b20e47b

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 9b20e47b50d6e3f51467c0517f3b0d21242f1f17
Parents: d38b31a 53028ea
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 18:10:32 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 18:10:32 2014 +0100

----------------------------------------------------------------------
 pom.xml                                         |   8 +
 slider-core/pom.xml                             |  46 +-----
 .../api/ClusterDescriptionOperations.java       |  12 +-
 .../org/apache/slider/api/InternalKeys.java     | 137 ++++++++++++++++
 .../java/org/apache/slider/api/OptionKeys.java  |  69 +-------
 .../org/apache/slider/api/ResourceKeys.java     |  26 +--
 .../org/apache/slider/client/SliderClient.java  |   7 +-
 .../apache/slider/common/tools/SliderUtils.java |   8 +-
 .../slider/core/build/InstanceBuilder.java      |   3 +-
 .../apache/slider/core/conf/MapOperations.java  |  54 ++++++-
 .../apache/slider/providers/ProviderUtils.java  |   9 +-
 .../providers/agent/AgentClientProvider.java    |   8 +-
 .../providers/agent/AgentProviderService.java   |   7 +-
 .../slideram/SliderAMClientProvider.java        |   4 +-
 .../server/appmaster/SliderAppMaster.java       | 157 ++++++++++++------
 .../server/appmaster/actions/ActionHalt.java    |   4 +-
 .../appmaster/actions/ActionKillContainer.java  |  67 ++++++++
 .../server/appmaster/actions/QueueService.java  |   8 +-
 .../server/appmaster/monkey/ChaosEntry.java     |  86 ++++++++++
 .../server/appmaster/monkey/ChaosKillAM.java    |  48 ++++++
 .../appmaster/monkey/ChaosKillContainer.java    |  75 +++++++++
 .../appmaster/monkey/ChaosMonkeyService.java    |  86 ++++++++++
 .../server/appmaster/monkey/ChaosTarget.java    |  24 +++
 .../appmaster/monkey/MonkeyPlayAction.java      |  48 ++++++
 .../slider/server/appmaster/state/AppState.java |  14 +-
 .../TestStandaloneAMMonkeyRestart.groovy        |  94 +++++++++++
 .../standalone/TestStandaloneAgentAM.groovy     |   2 +-
 .../TestMockAppStateContainerFailure.groovy     |   2 +-
 .../TestMockAppStateDynamicRoles.groovy         |   2 +-
 .../TestMockAppStateFlexDynamicRoles.groovy     |   2 +-
 .../appstate/TestMockAppStateFlexing.groovy     |   2 +-
 .../TestMockAppStateRMOperations.groovy         |   2 +-
 .../TestMockAppStateRebuildOnAMRestart.groovy   |   2 +-
 .../TestMockAppStateRolePlacement.groovy        |   2 +-
 .../appstate/TestMockAppStateRoleRelease.groovy |   2 +-
 .../TestMockContainerResourceAllocations.groovy |   2 +-
 .../model/mock/BaseMockAppStateTest.groovy      |   8 +-
 .../model/mock/MockRMOperationHandler.groovy    |   7 +-
 .../model/monkey/TestMockMonkey.groovy          | 160 +++++++++++++++++++
 .../apache/slider/test/SliderTestBase.groovy    |   7 +-
 .../agent/TestAgentProviderService.java         |   9 +-
 .../accumulo/AccumuloClientProvider.java        |   3 +-
 .../accumulo/AccumuloProviderService.java       |   9 +-
 .../providers/hbase/HBaseClientProvider.java    |   3 +-
 .../providers/hbase/HBaseProviderService.java   |   4 +-
 .../TestRegionServerFailureThreshold.groovy     |   5 +-
 ...reezeReconfigureThawLiveRegionService.groovy |   4 +-
 47 files changed, 1097 insertions(+), 251 deletions(-)
----------------------------------------------------------------------



[9/9] git commit: Merge branch 'develop' into feature/SLIDER-285_Restart_AM

Posted by sm...@apache.org.
Merge branch 'develop' into feature/SLIDER-285_Restart_AM


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/eadb3c73
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/eadb3c73
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/eadb3c73

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: eadb3c731f84b9c807844ebbb66f64db33a7b5bc
Parents: 70519f7 9b20e47
Author: Sumit Mohanty <sm...@hortonworks.com>
Authored: Wed Aug 13 11:19:17 2014 -0700
Committer: Sumit Mohanty <sm...@hortonworks.com>
Committed: Wed Aug 13 11:19:17 2014 -0700

----------------------------------------------------------------------
 pom.xml                                         |   8 +
 slider-core/pom.xml                             |  46 +-----
 .../api/ClusterDescriptionOperations.java       |  12 +-
 .../org/apache/slider/api/InternalKeys.java     | 137 ++++++++++++++++
 .../java/org/apache/slider/api/OptionKeys.java  |  69 +-------
 .../org/apache/slider/api/ResourceKeys.java     |  26 +--
 .../org/apache/slider/client/SliderClient.java  |   7 +-
 .../apache/slider/common/tools/SliderUtils.java |   8 +-
 .../slider/core/build/InstanceBuilder.java      |   3 +-
 .../apache/slider/core/conf/MapOperations.java  |  54 ++++++-
 .../apache/slider/providers/ProviderUtils.java  |   9 +-
 .../providers/agent/AgentClientProvider.java    |   8 +-
 .../providers/agent/AgentProviderService.java   |   7 +-
 .../slideram/SliderAMClientProvider.java        |   4 +-
 .../server/appmaster/SliderAppMaster.java       | 157 ++++++++++++------
 .../server/appmaster/actions/ActionHalt.java    |   4 +-
 .../appmaster/actions/ActionKillContainer.java  |  67 ++++++++
 .../server/appmaster/actions/QueueService.java  |   8 +-
 .../server/appmaster/monkey/ChaosEntry.java     |  86 ++++++++++
 .../server/appmaster/monkey/ChaosKillAM.java    |  48 ++++++
 .../appmaster/monkey/ChaosKillContainer.java    |  75 +++++++++
 .../appmaster/monkey/ChaosMonkeyService.java    |  86 ++++++++++
 .../server/appmaster/monkey/ChaosTarget.java    |  24 +++
 .../appmaster/monkey/MonkeyPlayAction.java      |  48 ++++++
 .../slider/server/appmaster/state/AppState.java |  14 +-
 .../TestStandaloneAMMonkeyRestart.groovy        |  94 +++++++++++
 .../standalone/TestStandaloneAgentAM.groovy     |   2 +-
 .../TestMockAppStateContainerFailure.groovy     |   2 +-
 .../TestMockAppStateDynamicRoles.groovy         |   2 +-
 .../TestMockAppStateFlexDynamicRoles.groovy     |   2 +-
 .../appstate/TestMockAppStateFlexing.groovy     |   2 +-
 .../TestMockAppStateRMOperations.groovy         |   2 +-
 .../TestMockAppStateRebuildOnAMRestart.groovy   |   2 +-
 .../TestMockAppStateRolePlacement.groovy        |   2 +-
 .../appstate/TestMockAppStateRoleRelease.groovy |   2 +-
 .../TestMockContainerResourceAllocations.groovy |   2 +-
 .../model/mock/BaseMockAppStateTest.groovy      |   8 +-
 .../model/mock/MockRMOperationHandler.groovy    |   7 +-
 .../model/monkey/TestMockMonkey.groovy          | 160 +++++++++++++++++++
 .../apache/slider/test/SliderTestBase.groovy    |   7 +-
 .../agent/TestAgentProviderService.java         |   9 +-
 .../accumulo/AccumuloClientProvider.java        |   3 +-
 .../accumulo/AccumuloProviderService.java       |   9 +-
 .../providers/hbase/HBaseClientProvider.java    |   3 +-
 .../providers/hbase/HBaseProviderService.java   |   4 +-
 .../TestRegionServerFailureThreshold.groovy     |   5 +-
 ...reezeReconfigureThawLiveRegionService.groovy |   4 +-
 47 files changed, 1097 insertions(+), 251 deletions(-)
----------------------------------------------------------------------



[5/9] git commit: SLIDER-202: tweak mock tests to automatically get name from test method unless overridden.

Posted by sm...@apache.org.
SLIDER-202: tweak mock tests to automatically get name from test method unless overridden.


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/8ed52a90
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/8ed52a90
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/8ed52a90

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 8ed52a90ef413931bf48e23a6d4565694a95bdb2
Parents: 1f6490d
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 15:04:36 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 15:04:36 2014 +0100

----------------------------------------------------------------------
 .../model/appstate/TestMockAppStateContainerFailure.groovy   | 2 +-
 .../model/appstate/TestMockAppStateDynamicRoles.groovy       | 2 +-
 .../model/appstate/TestMockAppStateFlexDynamicRoles.groovy   | 2 +-
 .../appmaster/model/appstate/TestMockAppStateFlexing.groovy  | 2 +-
 .../model/appstate/TestMockAppStateRMOperations.groovy       | 2 +-
 .../model/appstate/TestMockAppStateRebuildOnAMRestart.groovy | 2 +-
 .../model/appstate/TestMockAppStateRolePlacement.groovy      | 2 +-
 .../model/appstate/TestMockAppStateRoleRelease.groovy        | 2 +-
 .../appstate/TestMockContainerResourceAllocations.groovy     | 2 +-
 .../server/appmaster/model/mock/BaseMockAppStateTest.groovy  | 8 +++++++-
 10 files changed, 16 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
index c0f41f4..068b876 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateContainerFailure.groovy
@@ -43,7 +43,7 @@ class TestMockAppStateContainerFailure extends BaseMockAppStateTest
 
   @Override
   String getTestName() {
-    return "TestAppStateContainerFailure"
+    return "TestMockAppStateContainerFailure"
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
index 1b01f76..136e1ea 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateDynamicRoles.groovy
@@ -42,7 +42,7 @@ class TestMockAppStateDynamicRoles extends BaseMockAppStateTest
 
   @Override
   String getTestName() {
-    return "TestAppStateDynamicRoles"
+    return "TestMockAppStateDynamicRoles"
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
index aa330f8..5c9dce9 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexDynamicRoles.groovy
@@ -44,7 +44,7 @@ class TestMockAppStateFlexDynamicRoles extends BaseMockAppStateTest
 
   @Override
   String getTestName() {
-    return "TestAppStateDynamicRoles"
+    return "TestMockAppStateFlexDynamicRoles"
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
index 80937dc..a7bf068 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateFlexing.groovy
@@ -33,7 +33,7 @@ class TestMockAppStateFlexing extends BaseMockAppStateTest implements MockRoles
 
   @Override
   String getTestName() {
-    return "TestMockFlexing"
+    return "TestMockAppStateFlexing"
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
index 6a5df5c..f8e852e 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRMOperations.groovy
@@ -40,7 +40,7 @@ class TestMockAppStateRMOperations extends BaseMockAppStateTest implements MockR
 
   @Override
   String getTestName() {
-    return "TestMockRMOperations"
+    return "TestMockAppStateRMOperations"
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
index c142c77..c2783f3 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRebuildOnAMRestart.groovy
@@ -40,7 +40,7 @@ class TestMockAppStateRebuildOnAMRestart extends BaseMockAppStateTest
 
   @Override
   String getTestName() {
-    return "TestAppStateRebuildOnAMRestart"
+    return "TestMockAppStateRebuildOnAMRestart"
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
index e7ddf79..17ebc31 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRolePlacement.groovy
@@ -43,7 +43,7 @@ class TestMockAppStateRolePlacement extends BaseMockAppStateTest
 
   @Override
   String getTestName() {
-    return "TestAppStateRolePlacement"
+    return "TestMockAppStateRolePlacement"
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
index de4d493..addfaa5 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateRoleRelease.groovy
@@ -38,7 +38,7 @@ class TestMockAppStateRoleRelease extends BaseMockAppStateTest
 
   @Override
   String getTestName() {
-    return "TestAppStateRolePlacement"
+    return "TestMockAppStateRoleRelease"
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
index 0bf9a90..73d40ee 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockContainerResourceAllocations.groovy
@@ -39,7 +39,7 @@ class TestMockContainerResourceAllocations extends BaseMockAppStateTest {
 
   @Override
   String getTestName() {
-    "TestContainerResourceAllocations"
+    "TestMockContainerResourceAllocations"
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/8ed52a90/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
index 289b7c5..f96a238 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/BaseMockAppStateTest.groovy
@@ -101,7 +101,13 @@ abstract class BaseMockAppStateTest extends SliderTestBase implements MockRoles
     factory.newInstanceDefinition(0, 0, 0)
   }
 
-  abstract String getTestName();
+  /**
+   * Get the test name ... defaults to method name
+   * @return
+   */
+  String getTestName() {
+    methodName.methodName;
+  }
 
   public RoleStatus getRole0Status() {
     return appState.lookupRoleStatus(ROLE0)


[7/9] git commit: SLIDER-202: Chaos Monkey adds a (slow) minicluster test.

Posted by sm...@apache.org.
SLIDER-202: Chaos Monkey adds a (slow) minicluster test.


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/53028eaa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/53028eaa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/53028eaa

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 53028eaae347899cef9e695e9ee8b41594c6377b
Parents: 52bd11b
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 17:30:49 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 17:30:49 2014 +0100

----------------------------------------------------------------------
 .../org/apache/slider/api/InternalKeys.java     | 49 +++++++---
 .../apache/slider/common/tools/SliderUtils.java |  2 +-
 .../server/appmaster/SliderAppMaster.java       | 39 ++++----
 .../TestStandaloneAMMonkeyRestart.groovy        | 94 ++++++++++++++++++++
 .../TestRegionServerFailureThreshold.groovy     |  5 +-
 5 files changed, 154 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
index 4045c0e..ad384e2 100644
--- a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
@@ -84,31 +84,54 @@ public interface InternalKeys {
    * Flag to indicate whether or not the chaos monkey is enabled:
    * {@value}
    */
-  String INTERNAL_CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled";
-  boolean DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED = false;
+  String CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled";
+  boolean DEFAULT_CHAOS_MONKEY_ENABLED = false;
 
 
   /**
    * Rate
    */
 
-  String INTERNAL_CHAOS_MONKEY_RATE = "internal.chaos.monkey.rate";
-
-  int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS = 0;
-  int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS = 1;
-  int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES = 0;
+  String CHAOS_MONKEY_INTERVAL = "internal.chaos.monkey.interval";
+  String CHAOS_MONKEY_INTERVAL_DAYS = CHAOS_MONKEY_INTERVAL + ".days";
+  String CHAOS_MONKEY_INTERVAL_HOURS = CHAOS_MONKEY_INTERVAL + ".hours";
+  String CHAOS_MONKEY_INTERVAL_MINUTES = CHAOS_MONKEY_INTERVAL + ".minutes";
+  String CHAOS_MONKEY_INTERVAL_SECONDS = CHAOS_MONKEY_INTERVAL + ".seconds";
   
-  String INTERNAL_CHAOS_MONKEY_PROBABILITY =
+  int DEFAULT_CHAOS_MONKEY_INTERVAL_DAYS = 0;
+  int DEFAULT_CHAOS_MONKEY_INTERVAL_HOURS = 0;
+  int DEFAULT_CHAOS_MONKEY_INTERVAL_MINUTES = 0;
+
+  /**
+   * Prefix for all chaos monkey probabilities
+   */
+  String CHAOS_MONKEY_PROBABILITY =
       "internal.chaos.monkey.probability";
   /**
    * Probabilies are out of 10000 ; 100==1%
    */
 
-  String INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = INTERNAL_CHAOS_MONKEY_PROBABILITY +".amfailure";
-  int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 10;
-  String INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE =
-      INTERNAL_CHAOS_MONKEY_PROBABILITY + ".containerfailure";
-  int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 100;
+  /**
+   * Probability of a monkey check killing the AM:  {@value}
+   */
+  String CHAOS_MONKEY_PROBABILITY_AM_FAILURE = CHAOS_MONKEY_PROBABILITY +".amfailure";
+
+  /**
+   * Default probability of a monkey check killing the AM:  {@value}
+   */
+  int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 0;
+
+  /**
+   * Probability of a monkey check killing a container:  {@value}
+   */
+
+  String CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE =
+      CHAOS_MONKEY_PROBABILITY + ".containerfailure";
+
+  /**
+   * Default probability of a monkey check killing the a container:  {@value}
+   */
+  int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 0;
 
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
index d7f159c..7a80f24 100644
--- a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
@@ -1476,7 +1476,7 @@ public final class SliderUtils {
           }
           is = new ByteArrayInputStream(content);
         } else {
-          log.info("Size unknown. Reading {}", zipEntry.getName());
+          log.debug("Size unknown. Reading {}", zipEntry.getName());
           ByteArrayOutputStream baos = new ByteArrayOutputStream();
           while (true) {
             int byteRead = zis.read();

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index 1642cc5..7825e24 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -779,17 +779,16 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     // now do the registration
     registerServiceInstance(clustername, appid);
 
-    sliderAMProvider.start();
+    // chaos monkey
+    maybeStartMonkey();
 
+    // Start the Slider AM provider
+    sliderAMProvider.start();
 
-    
-    // launch the provider; this is expected to trigger a callback that
+    // launch the real provider; this is expected to trigger a callback that
     // starts the node review process
     launchProviderService(instanceDefinition, confDir);
 
-    // chaos monkey
-    maybeStartMonkey();
-
     try {
       //now block waiting to be told to exit the process
       waitForAMCompletionSignal();
@@ -1459,7 +1458,6 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     rmOperationHandler.execute(operations);
   }
 
-
   /**
    * Get the RM operations handler for direct scheduling of work.
    */
@@ -1739,42 +1737,45 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     }
     signalAMComplete(exitCode, exception.toString());
   }
-  
-  public boolean maybeStartMonkey() {
+
+  /**
+   * Start the chaos monkey
+   * @return true if it started
+   */
+  private boolean maybeStartMonkey() {
     MapOperations internals = getGlobalInternalOptions();
 
     Boolean enabled =
-        internals.getOptionBool(InternalKeys.INTERNAL_CHAOS_MONKEY_ENABLED,
-            InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED);
+        internals.getOptionBool(InternalKeys.CHAOS_MONKEY_ENABLED,
+            InternalKeys.DEFAULT_CHAOS_MONKEY_ENABLED);
     if (!enabled) {
       log.info("Chaos monkey disabled");
     }
     
     long monkeyInterval = internals.getTimeRange(
-        InternalKeys.INTERNAL_CHAOS_MONKEY_RATE,
-        InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS,
-        InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS,
-        InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES,
+        InternalKeys.CHAOS_MONKEY_INTERVAL,
+        InternalKeys.DEFAULT_CHAOS_MONKEY_INTERVAL_DAYS,
+        InternalKeys.DEFAULT_CHAOS_MONKEY_INTERVAL_HOURS,
+        InternalKeys.DEFAULT_CHAOS_MONKEY_INTERVAL_MINUTES,
         0);
     log.info("Adding Chaos Monkey scheduled every {} seconds ({} hours)",
         monkeyInterval, monkeyInterval/(60*60));
     monkey = new ChaosMonkeyService(metrics, actionQueues);
     int amKillProbability = internals.getOptionInt(
-        InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE,
+        InternalKeys.CHAOS_MONKEY_PROBABILITY_AM_FAILURE,
         InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE);
     if (amKillProbability > 0) {
-      log.info("Adding AM killer with probability %f", amKillProbability/100.0);
       monkey.addTarget("AM killer",
           new ChaosKillAM(actionQueues, -1), amKillProbability
       );
     }
     int containerKillProbability = internals.getOptionInt(
-        InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE,
+        InternalKeys.CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE,
         InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE);
     if (containerKillProbability > 0) {
       monkey.addTarget("Container killer",
           new ChaosKillContainer(appState, actionQueues, rmOperationHandler),
-          amKillProbability
+          containerKillProbability
       );
     }
     initAndAddService(monkey);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy
new file mode 100644
index 0000000..162bab0
--- /dev/null
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneAMMonkeyRestart.groovy
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.slider.agent.standalone
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.hadoop.SleepJob
+import org.apache.hadoop.yarn.api.records.ApplicationReport
+import org.apache.hadoop.yarn.api.records.FinalApplicationStatus
+import org.apache.hadoop.yarn.api.records.YarnApplicationState
+import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.agent.AgentMiniClusterTestBase
+import org.apache.slider.api.InternalKeys
+import org.apache.slider.api.ResourceKeys
+import org.apache.slider.client.SliderClient
+import org.apache.slider.common.SliderXmlConfKeys
+import org.apache.slider.common.params.ActionAMSuicideArgs
+import org.apache.slider.common.params.Arguments
+import org.apache.slider.core.exceptions.ErrorStrings
+import org.apache.slider.core.main.ServiceLauncher
+import org.junit.Test
+
+/**
+ * kill a masterless AM and verify it shuts down. This test
+ * also sets the retry count to 1 to stop recreation attempts
+ */
+@CompileStatic
+@Slf4j
+
+class TestStandaloneAMMonkeyRestart extends AgentMiniClusterTestBase {
+
+
+  @Test
+  public void testStandaloneAMMonkeyRestart() throws Throwable {
+    describe "Run a Standalone AM with the Chaos monkey set to kill it"
+    // patch the configuration for AM restart
+    int threshold = 2;
+    YarnConfiguration conf = getRestartableConfiguration(threshold)
+
+    String clustername = createMiniCluster("", conf, 1, true)
+    ServiceLauncher<SliderClient> launcher =
+        createStandaloneAMWithArgs(clustername,
+            [
+                Arguments.ARG_OPTION, InternalKeys.CHAOS_MONKEY_ENABLED, "true",
+                Arguments.ARG_OPTION, InternalKeys.CHAOS_MONKEY_INTERVAL_SECONDS, "8",
+                Arguments.ARG_OPTION, InternalKeys.CHAOS_MONKEY_PROBABILITY_AM_FAILURE, "75000",
+            ],
+            true,
+            false)
+    SliderClient sliderClient = launcher.service
+    addToTeardown(sliderClient);
+
+    ApplicationReport report
+    report = waitForClusterLive(sliderClient, 30000)
+    describe "Waiting for the cluster to fail"
+    sleep(40000)
+    // end of process
+    report = sliderClient.applicationReport
+    log.info(report.diagnostics)
+    assert report.currentApplicationAttemptId.attemptId == threshold
+    assert YarnApplicationState.FAILED == report.yarnApplicationState  
+    assert FinalApplicationStatus.FAILED == report.finalApplicationStatus
+  }
+
+  /**
+   * Get a restartable configuration
+   * @param restarts
+   * @return
+   */
+  public YarnConfiguration getRestartableConfiguration(int restarts) {
+    def conf = new YarnConfiguration(configuration)
+    conf.setInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS, restarts)
+    conf.setInt(SliderXmlConfKeys.KEY_AM_RESTART_LIMIT, restarts)
+    conf
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/53028eaa/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
index 1322fd3..b3aaa48 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
+++ b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/failures/TestRegionServerFailureThreshold.groovy
@@ -149,8 +149,9 @@ class TestRegionServerFailureThreshold extends HBaseMiniClusterTestBase {
         }
       }
     } catch (BadClusterStateException e) {
-      assert e.toString().contains(ErrorStrings.E_APPLICATION_NOT_RUNNING)
-      assert e.exitCode == SliderExitCodes.EXIT_BAD_STATE
+      assertExceptionDetails(e,
+          SliderExitCodes.EXIT_BAD_STATE, 
+          ErrorStrings.E_APPLICATION_NOT_RUNNING)
     }
     ApplicationReport report = client.applicationReport
     log.info(report.diagnostics)


[4/9] git commit: SLIDER-314 factor out internal keys into class InternalKeys

Posted by sm...@apache.org.
SLIDER-314 factor out internal keys into class InternalKeys


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/1f6490d5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/1f6490d5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/1f6490d5

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 1f6490d5f6ec8d73f5cdb6f04600aa180be25b81
Parents: b111268
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 15:03:34 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 15:03:34 2014 +0100

----------------------------------------------------------------------
 .../api/ClusterDescriptionOperations.java       |  12 +-
 .../org/apache/slider/api/InternalKeys.java     | 114 +++++++++++++++++++
 .../java/org/apache/slider/api/OptionKeys.java  |  69 +----------
 .../org/apache/slider/client/SliderClient.java  |   7 +-
 .../slider/core/build/InstanceBuilder.java      |   3 +-
 .../apache/slider/providers/ProviderUtils.java  |   9 +-
 .../slideram/SliderAMClientProvider.java        |   4 +-
 .../server/appmaster/SliderAppMaster.java       |  22 ++--
 .../agent/TestAgentProviderService.java         |   9 +-
 .../accumulo/AccumuloClientProvider.java        |   3 +-
 .../accumulo/AccumuloProviderService.java       |   9 +-
 .../providers/hbase/HBaseClientProvider.java    |   3 +-
 .../providers/hbase/HBaseProviderService.java   |   4 +-
 ...reezeReconfigureThawLiveRegionService.groovy |   4 +-
 14 files changed, 166 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java b/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
index 7e73a92..21ece2b 100644
--- a/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
+++ b/slider-core/src/main/java/org/apache/slider/api/ClusterDescriptionOperations.java
@@ -64,15 +64,15 @@ public class ClusterDescriptionOperations {
     MapOperations appOptions =
       aggregateConf.getAppConfOperations().getGlobalOptions();
 
-    cd.type = internalOptions.getOption(OptionKeys.INTERNAL_PROVIDER_NAME,
+    cd.type = internalOptions.getOption(InternalKeys.INTERNAL_PROVIDER_NAME,
                                 SliderProviderFactory.DEFAULT_CLUSTER_TYPE);
 
-    cd.dataPath = internalOptions.get(OptionKeys.INTERNAL_DATA_DIR_PATH);
+    cd.dataPath = internalOptions.get(InternalKeys.INTERNAL_DATA_DIR_PATH);
     cd.name = internalOptions.get(OptionKeys.APPLICATION_NAME);
-    cd.originConfigurationPath = internalOptions.get(OptionKeys.INTERNAL_SNAPSHOT_CONF_PATH);
-    cd.generatedConfigurationPath = internalOptions.get(OptionKeys.INTERNAL_GENERATED_CONF_PATH);
-    cd.setImagePath(internalOptions.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH));
-    cd.setApplicationHome(internalOptions.get(OptionKeys.INTERNAL_APPLICATION_HOME));
+    cd.originConfigurationPath = internalOptions.get(InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH);
+    cd.generatedConfigurationPath = internalOptions.get(InternalKeys.INTERNAL_GENERATED_CONF_PATH);
+    cd.setImagePath(internalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH));
+    cd.setApplicationHome(internalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME));
     cd.setZkPath(appOptions.get(ZOOKEEPER_PATH));
     cd.setZkHosts(appOptions.get(ZOOKEEPER_QUORUM));
     

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
new file mode 100644
index 0000000..4045c0e
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/api/InternalKeys.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.api;
+
+/**
+ * Keys for internal use, go into `internal.json` and not intended for normal
+ * use except when tuning Slider AM operations
+ */
+public interface InternalKeys {
+
+
+  /**
+   * Home dir of the app: {@value}
+   * If set, implies there is a home dir to use
+   */
+  String INTERNAL_APPLICATION_HOME = "internal.application.home";
+  /**
+   * Path to an image file containing the app: {@value}
+   */
+  String INTERNAL_APPLICATION_IMAGE_PATH = "internal.application.image.path";
+  /**
+   * Time in milliseconds to wait after forking any in-AM 
+   * process before attempting to start up the containers: {@value}
+   * 
+   * A shorter value brings the cluster up faster, but means that if the
+   * in AM process fails (due to a bad configuration), then time
+   * is wasted starting containers on a cluster that isn't going to come
+   * up
+   */
+  String INTERNAL_CONTAINER_STARTUP_DELAY = "internal.container.startup.delay";
+  /**
+   * internal temp directory: {@value}
+   */
+  String INTERNAL_AM_TMP_DIR = "internal.tmp.dir";
+  /**
+   * where a snapshot of the original conf dir is: {@value}
+   */
+  String INTERNAL_SNAPSHOT_CONF_PATH = "internal.snapshot.conf.path";
+  /**
+   * where a snapshot of the original conf dir is: {@value}
+   */
+  String INTERNAL_GENERATED_CONF_PATH = "internal.generated.conf.path";
+  /**
+   * where a snapshot of the original conf dir is: {@value}
+   */
+  String INTERNAL_PROVIDER_NAME = "internal.provider.name";
+  /**
+   * where a snapshot of the original conf dir is: {@value}
+   */
+  String INTERNAL_DATA_DIR_PATH = "internal.data.dir.path";
+  /**
+   * Time in milliseconds to wait after forking any in-AM 
+   * process before attempting to start up the containers: {@value}
+   *
+   * A shorter value brings the cluster up faster, but means that if the
+   * in AM process fails (due to a bad configuration), then time
+   * is wasted starting containers on a cluster that isn't going to come
+   * up
+   */
+  int DEFAULT_INTERNAL_CONTAINER_STARTUP_DELAY = 5000;
+  /**
+   * Version of the app: {@value}
+   */
+  String KEYTAB_LOCATION = "internal.keytab.location";
+
+
+  /**
+   * Flag to indicate whether or not the chaos monkey is enabled:
+   * {@value}
+   */
+  String INTERNAL_CHAOS_MONKEY_ENABLED = "internal.chaos.monkey.enabled";
+  boolean DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED = false;
+
+
+  /**
+   * Rate
+   */
+
+  String INTERNAL_CHAOS_MONKEY_RATE = "internal.chaos.monkey.rate";
+
+  int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS = 0;
+  int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS = 1;
+  int DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES = 0;
+  
+  String INTERNAL_CHAOS_MONKEY_PROBABILITY =
+      "internal.chaos.monkey.probability";
+  /**
+   * Probabilies are out of 10000 ; 100==1%
+   */
+
+  String INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = INTERNAL_CHAOS_MONKEY_PROBABILITY +".amfailure";
+  int DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE = 10;
+  String INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE =
+      INTERNAL_CHAOS_MONKEY_PROBABILITY + ".containerfailure";
+  int DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE = 100;
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java b/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
index 006e280..320cc4f 100644
--- a/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/OptionKeys.java
@@ -22,18 +22,7 @@ package org.apache.slider.api;
  *  Keys for entries in the <code>options</code> section
  *  of a cluster description.
  */
-public interface OptionKeys {
-
-  /**
-   * Home dir of the app: {@value}
-   * If set, implies there is a home dir to use
-   */
-  String INTERNAL_APPLICATION_HOME = "internal.application.home";
-  
-  /**
-   * Path to an image file containing the app: {@value}
-   */
-  String INTERNAL_APPLICATION_IMAGE_PATH = "internal.application.image.path";
+public interface OptionKeys extends InternalKeys {
 
   /**
    * Time in milliseconds to wait after forking any in-AM 
@@ -44,72 +33,18 @@ public interface OptionKeys {
    * is wasted starting containers on a cluster that isn't going to come
    * up
    */
-  String INTERNAL_CONTAINER_STARTUP_DELAY = "internal.container.startup.delay";
-  
-  /**
-   * Time in milliseconds to wait after forking any in-AM 
-   * process before attempting to start up the containers: {@value}
-   * 
-   * A shorter value brings the cluster up faster, but means that if the
-   * in AM process fails (due to a bad configuration), then time
-   * is wasted starting containers on a cluster that isn't going to come
-   * up
-   */
   String APPLICATION_TYPE = "application.type";
   
-  /**
-   * Time in milliseconds to wait after forking any in-AM 
-   * process before attempting to start up the containers: {@value}
-   * 
-   * A shorter value brings the cluster up faster, but means that if the
-   * in AM process fails (due to a bad configuration), then time
-   * is wasted starting containers on a cluster that isn't going to come
-   * up
-   */
-  String APPLICATION_NAME = "application.name";
-
-  /**
-   * delay for container startup:{@value}
-   */
-  int DEFAULT_CONTAINER_STARTUP_DELAY = 5000;
 
-  /**
-   * Version of the app: {@value}
-   */
-  String KEYTAB_LOCATION = "internal.keytab.location";
+  String APPLICATION_NAME = "application.name";
 
   /**
    * Prefix for site.xml options: {@value}
    */
   String SITE_XML_PREFIX = "site.";
 
-  /**
-   * internal temp directory: {@value}
-   */
-  String INTERNAL_AM_TMP_DIR = "internal.tmp.dir";
 
   /**
-   * where a snapshot of the original conf dir is: {@value}
-   */
-  String INTERNAL_SNAPSHOT_CONF_PATH = "internal.snapshot.conf.path";
-  
-  /**
-   * where a snapshot of the original conf dir is: {@value}
-   */
-  String INTERNAL_GENERATED_CONF_PATH = "internal.generated.conf.path";
-    
-  /**
-   * where a snapshot of the original conf dir is: {@value}
-   */
-  String INTERNAL_PROVIDER_NAME = "internal.provider.name";
-  
-    
-  /**
-   * where a snapshot of the original conf dir is: {@value}
-   */
-  String INTERNAL_DATA_DIR_PATH = "internal.data.dir.path";
-  
-  /**
    * Zookeeper quorum host list: {@value}
    */
   String ZOOKEEPER_QUORUM = "zookeeper.quorum";

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index 03f78be..1337570 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -35,6 +35,7 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.OptionKeys;
 import org.apache.slider.api.ResourceKeys;
 import org.apache.slider.api.SliderClusterProtocol;
@@ -793,16 +794,16 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
       instanceDefinition.getAppConfOperations();
     Path generatedConfDirPath =
       createPathThatMustExist(internalOptions.getMandatoryOption(
-        OptionKeys.INTERNAL_GENERATED_CONF_PATH));
+        InternalKeys.INTERNAL_GENERATED_CONF_PATH));
     Path snapshotConfPath =
       createPathThatMustExist(internalOptions.getMandatoryOption(
-        OptionKeys.INTERNAL_SNAPSHOT_CONF_PATH));
+        InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH));
 
 
     // cluster Provider
     AbstractClientProvider provider = createClientProvider(
       internalOptions.getMandatoryOption(
-        OptionKeys.INTERNAL_PROVIDER_NAME));
+        InternalKeys.INTERNAL_PROVIDER_NAME));
     // make sure the conf dir is valid;
     
     // now build up the image path

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java b/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
index 0a33c36..937b777 100644
--- a/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
+++ b/slider-core/src/main/java/org/apache/slider/core/build/InstanceBuilder.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.permission.FsPermission;
 import org.apache.hadoop.hdfs.DFSConfigKeys;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.OptionKeys;
 import org.apache.slider.api.StatusKeys;
 import org.apache.slider.common.SliderXmlConfKeys;
@@ -139,7 +140,7 @@ public class InstanceBuilder {
                     instancePaths.dataPath.toUri());
 
 
-    internalOps.set(OptionKeys.INTERNAL_PROVIDER_NAME, provider);
+    internalOps.set(InternalKeys.INTERNAL_PROVIDER_NAME, provider);
     internalOps.set(OptionKeys.APPLICATION_NAME, clustername);
 
   }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java b/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
index cb7d27a..db9f494 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/ProviderUtils.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.yarn.api.ApplicationConstants;
 import org.apache.hadoop.yarn.api.records.LocalResource;
 import org.apache.slider.api.ClusterDescription;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.OptionKeys;
 import org.apache.slider.api.ResourceKeys;
 import org.apache.slider.api.RoleKeys;
@@ -282,9 +283,9 @@ public class ProviderUtils implements RoleKeys {
     MapOperations globalOptions =
       instanceDefinition.getInternalOperations().getGlobalOptions();
     String applicationHome =
-      globalOptions.get(OptionKeys.INTERNAL_APPLICATION_HOME);
+      globalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME);
     String imagePath =
-      globalOptions.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+      globalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
     return buildPathToHomeDir(imagePath, applicationHome, bindir, script);
   }
 
@@ -350,8 +351,8 @@ public class ProviderUtils implements RoleKeys {
                                 String script) throws FileNotFoundException {
     
     String homedir = buildPathToHomeDir(
-      internal.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH),
-      internal.get(OptionKeys.INTERNAL_APPLICATION_HOME),
+      internal.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH),
+      internal.get(InternalKeys.INTERNAL_APPLICATION_HOME),
       bindir,
       script);
     return buildScriptPath(bindir, script, homedir);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
index 6aeb801..c3870b8 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/slideram/SliderAMClientProvider.java
@@ -28,7 +28,7 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.yarn.api.records.LocalResource;
 import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.ResourceKeys;
 import org.apache.slider.api.RoleKeys;
 import org.apache.slider.common.SliderKeys;
@@ -123,7 +123,7 @@ public class SliderAMClientProvider extends AbstractClientProvider implements
       dataPath = instanceDefinition.getInternalOperations()
                                    .getGlobalOptions()
                                    .getMandatoryOption(
-                                     OptionKeys.INTERNAL_DATA_DIR_PATH);
+                                     InternalKeys.INTERNAL_DATA_DIR_PATH);
 
     Path path = new Path(dataPath);
     sliderFileSystem.verifyDirectoryWriteAccess(path);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index ee0e59e..e6c7aba 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -56,7 +56,7 @@ import org.apache.hadoop.yarn.security.client.ClientToAMTokenSecretManager;
 import org.apache.hadoop.yarn.util.ConverterUtils;
 import org.apache.hadoop.yarn.webapp.WebApps;
 import org.apache.slider.api.ClusterDescription;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.ResourceKeys;
 import org.apache.slider.api.RoleKeys;
 import org.apache.slider.api.SliderClusterProtocol;
@@ -529,10 +529,9 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     serviceConf.set(SliderAmIpFilter.WS_CONTEXT_ROOT, WS_CONTEXT_ROOT + "|" + WS_AGENT_CONTEXT_ROOT);
     
     //get our provider
-    MapOperations globalInternalOptions =
-      instanceDefinition.getInternalOperations().getGlobalOptions();
+    MapOperations globalInternalOptions = getGlobalInternalOptions();
     String providerType = globalInternalOptions.getMandatoryOption(
-      OptionKeys.INTERNAL_PROVIDER_NAME);
+      InternalKeys.INTERNAL_PROVIDER_NAME);
     log.info("Cluster provider type is {}", providerType);
     SliderProviderFactory factory =
       SliderProviderFactory.createSliderProviderFactory(
@@ -751,7 +750,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     }
     String rolesTmpSubdir = appMasterContainerID.toString() + "/roles";
 
-    String amTmpDir = globalInternalOptions.getMandatoryOption(OptionKeys.INTERNAL_AM_TMP_DIR);
+    String amTmpDir = globalInternalOptions.getMandatoryOption(InternalKeys.INTERNAL_AM_TMP_DIR);
 
     Path tmpDirPath = new Path(amTmpDir);
     Path launcherTmpDirPath = new Path(tmpDirPath, rolesTmpSubdir);
@@ -927,9 +926,18 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
    * @return the generated configuration dir
    */
   public String getGeneratedConfDir() {
+    return getGlobalInternalOptions().get(
+        InternalKeys.INTERNAL_GENERATED_CONF_PATH);
+  }
+
+  /**
+   * Get the global internal options for the AM
+   * @return a map to access the internals
+   */
+  public MapOperations getGlobalInternalOptions() {
     return getInstanceDefinition()
       .getInternalOperations().
-      getGlobalOptions().get(OptionKeys.INTERNAL_GENERATED_CONF_PATH);
+      getGlobalOptions();
   }
 
   /**
@@ -1179,7 +1187,7 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
 
   /**
    * Schedule the failure window
-   * @param resources 
+   * @param resources the resource tree
    * @throws BadConfigException if the window is out of range
    */
   private void scheduleFailureWindowResets(ConfTree resources) throws

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
index a9b9e99..22de0d2 100644
--- a/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
+++ b/slider-core/src/test/java/org/apache/slider/providers/agent/TestAgentProviderService.java
@@ -27,13 +27,10 @@ import org.apache.hadoop.yarn.api.records.ContainerId;
 import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
 import org.apache.hadoop.yarn.api.records.LocalResource;
 import org.apache.hadoop.yarn.api.records.LocalResourceType;
-import org.apache.hadoop.yarn.api.records.NodeId;
-import org.apache.hadoop.yarn.api.records.Priority;
-import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.hadoop.yarn.api.records.Token;
 import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.api.ClusterDescriptionKeys;
 import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.OptionKeys;
 import org.apache.slider.common.SliderXmlConfKeys;
 import org.apache.slider.common.tools.SliderFileSystem;
@@ -218,7 +215,7 @@ public class TestAgentProviderService {
   public void testRegistration() throws IOException {
 
     ConfTree tree = new ConfTree();
-    tree.global.put(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
+    tree.global.put(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
 
     AgentProviderService aps = new AgentProviderService();
     ContainerLaunchContext ctx = createNiceMock(ContainerLaunchContext.class);
@@ -585,7 +582,7 @@ public class TestAgentProviderService {
     InputStream metainfo_1 = new ByteArrayInputStream(metainfo_1_str.getBytes());
     Metainfo metainfo = new MetainfoParser().parse(metainfo_1);
     ConfTree tree = new ConfTree();
-    tree.global.put(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
+    tree.global.put(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
 
     AgentProviderService aps = new AgentProviderService();
     ContainerLaunchContext ctx = createNiceMock(ContainerLaunchContext.class);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
index db99360..7f99573 100644
--- a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
+++ b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloClientProvider.java
@@ -23,6 +23,7 @@ import org.apache.hadoop.fs.CommonConfigurationKeys;
 import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.yarn.api.records.LocalResource;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.common.SliderXmlConfKeys;
 import org.apache.slider.api.OptionKeys;
@@ -135,7 +136,7 @@ public class AccumuloClientProvider extends AbstractClientProvider implements
 
     propagateClientFSBinding(sitexml);
     setDatabasePath(sitexml,
-                    globalInstanceOptions.getMandatoryOption(OptionKeys.INTERNAL_DATA_DIR_PATH));
+                    globalInstanceOptions.getMandatoryOption(InternalKeys.INTERNAL_DATA_DIR_PATH));
 
 
     String quorum =

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
----------------------------------------------------------------------
diff --git a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
index c511efb..7dedd2c 100644
--- a/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
+++ b/slider-providers/accumulo/slider-accumulo-provider/src/main/java/org/apache/slider/providers/accumulo/AccumuloProviderService.java
@@ -26,6 +26,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.service.Service;
 import org.apache.hadoop.yarn.api.ApplicationConstants;
 import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.api.OptionKeys;
@@ -161,7 +162,7 @@ public class AccumuloProviderService extends AbstractProviderService implements
     //Add binaries
     //now add the image if it was set
     String imageURI = instanceDefinition.getInternalOperations()
-                                        .get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+                                        .get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
     fileSystem.maybeAddImagePath(launcher.getLocalResources(), imageURI);
 
     CommandLineBuilder commandLine = new CommandLineBuilder();
@@ -333,8 +334,8 @@ public class AccumuloProviderService extends AbstractProviderService implements
     //callback to AM to trigger cluster review is set up to happen after
     //the init/verify action has succeeded
     int delay = internalOperations.getGlobalOptions().getOptionInt(
-        OptionKeys.INTERNAL_CONTAINER_STARTUP_DELAY,
-        OptionKeys.DEFAULT_CONTAINER_STARTUP_DELAY);
+        InternalKeys.INTERNAL_CONTAINER_STARTUP_DELAY,
+        InternalKeys.DEFAULT_INTERNAL_CONTAINER_STARTUP_DELAY);
     ProviderCompletedCallable completedCallable =
         new ProviderCompletedCallable(execInProgress, null);
     Service notifier = new WorkflowCallbackService<>(
@@ -364,7 +365,7 @@ public class AccumuloProviderService extends AbstractProviderService implements
     String dataDir = cd.getInternalOperations()
                                .getGlobalOptions()
                                .getMandatoryOption(
-                                 OptionKeys.INTERNAL_DATA_DIR_PATH);
+                                 InternalKeys.INTERNAL_DATA_DIR_PATH);
     Path accumuloInited = new Path(dataDir, INSTANCE_ID);
     FileSystem fs2 = FileSystem.get(accumuloInited.toUri(), getConf());
     return fs2.exists(accumuloInited);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
index cd104a2..76bf73a 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
+++ b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseClientProvider.java
@@ -21,6 +21,7 @@ package org.apache.slider.providers.hbase;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.yarn.api.records.LocalResource;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.common.SliderXmlConfKeys;
 import org.apache.slider.api.OptionKeys;
@@ -122,7 +123,7 @@ public class HBaseClientProvider extends AbstractClientProvider implements
 
     sitexml.put(KEY_HBASE_ROOTDIR,
         globalInstanceOptions.getMandatoryOption(
-            OptionKeys.INTERNAL_DATA_DIR_PATH)
+            InternalKeys.INTERNAL_DATA_DIR_PATH)
     );
     providerUtils.propagateOption(globalAppOptions, OptionKeys.ZOOKEEPER_PATH,
                                   sitexml, KEY_ZNODE_PARENT);

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
index f72967f..feffb08 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
+++ b/slider-providers/hbase/slider-hbase-provider/src/main/java/org/apache/slider/providers/hbase/HBaseProviderService.java
@@ -22,9 +22,9 @@ package org.apache.slider.providers.hbase;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.api.ClusterDescription;
-import org.apache.slider.api.OptionKeys;
 import org.apache.slider.api.RoleKeys;
 import org.apache.slider.api.StatusKeys;
 import org.apache.slider.core.conf.AggregateConf;
@@ -152,7 +152,7 @@ public class HBaseProviderService extends AbstractProviderService implements
     //Add binaries
     //now add the image if it was set
     String imageURI = instanceDefinition.getInternalOperations()
-                  .get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+                  .get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
     coreFS.maybeAddImagePath(launcher.getLocalResources(), imageURI);
 
     CommandLineBuilder cli = new CommandLineBuilder();

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/1f6490d5/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
----------------------------------------------------------------------
diff --git a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
index d50517c..f6748e0 100644
--- a/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
+++ b/slider-providers/hbase/slider-hbase-provider/src/test/groovy/org/apache/slider/providers/hbase/minicluster/freezethaw/TestFreezeReconfigureThawLiveRegionService.groovy
@@ -25,9 +25,9 @@ import org.apache.hadoop.fs.FileSystem as HadoopFS
 import org.apache.hadoop.fs.Path
 import org.apache.hadoop.hbase.ClusterStatus
 import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.api.InternalKeys
 import org.apache.slider.core.main.ServiceLauncher
 import org.apache.slider.api.ClusterDescription
-import org.apache.slider.api.OptionKeys
 import org.apache.slider.core.build.InstanceIO
 import org.apache.slider.providers.hbase.HBaseKeys
 import org.apache.slider.common.tools.ConfigHelper
@@ -93,7 +93,7 @@ class TestFreezeReconfigureThawLiveRegionService
         clusterDir)
 
     def snapshotPath = instanceDefinition.internalOperations.get(
-        OptionKeys.INTERNAL_SNAPSHOT_CONF_PATH)
+        InternalKeys.INTERNAL_SNAPSHOT_CONF_PATH)
     assert snapshotPath != null
 
     Path confdir = new Path(snapshotPath);


[6/9] git commit: SLIDER-202 monkey has mock tests and is set to run in AM if enabled

Posted by sm...@apache.org.
SLIDER-202 monkey has mock tests and is set to run in AM if enabled


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/52bd11b5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/52bd11b5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/52bd11b5

Branch: refs/heads/feature/SLIDER-285_Restart_AM
Commit: 52bd11b5d4d3a17f231e5343c0bfa6c39492fbb3
Parents: 8ed52a9
Author: Steve Loughran <st...@apache.org>
Authored: Wed Aug 13 15:06:11 2014 +0100
Committer: Steve Loughran <st...@apache.org>
Committed: Wed Aug 13 15:06:11 2014 +0100

----------------------------------------------------------------------
 .../org/apache/slider/api/ResourceKeys.java     |  26 +--
 .../apache/slider/common/tools/SliderUtils.java |   6 +-
 .../apache/slider/core/conf/MapOperations.java  |  54 ++++++-
 .../providers/agent/AgentClientProvider.java    |   8 +-
 .../providers/agent/AgentProviderService.java   |   7 +-
 .../server/appmaster/SliderAppMaster.java       |  88 ++++++----
 .../appmaster/actions/ActionKillContainer.java  |  24 ++-
 .../server/appmaster/actions/QueueService.java  |   8 +-
 .../server/appmaster/monkey/ChaosEntry.java     |  12 +-
 .../server/appmaster/monkey/ChaosKillAM.java    |  12 +-
 .../appmaster/monkey/ChaosKillContainer.java    |  25 +--
 .../appmaster/monkey/ChaosMonkeyService.java    |  23 ++-
 .../model/mock/MockRMOperationHandler.groovy    |   7 +-
 .../model/monkey/TestMockMonkey.groovy          | 160 +++++++++++++++++++
 .../apache/slider/test/SliderTestBase.groovy    |   7 +-
 15 files changed, 360 insertions(+), 107 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
index c2b78cc..3d54140 100644
--- a/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
+++ b/slider-core/src/main/java/org/apache/slider/api/ResourceKeys.java
@@ -112,34 +112,14 @@ public interface ResourceKeys {
       "yarn.container.failure.threshold";
 
   /**
-   * Minutes range of the container failure reset window.
-   * This is combined with the hour and day values to
-   * produce the full window.
+   * prefix for the time of the container failure reset window.
    * {@value}
    */
-  String CONTAINER_FAILURE_WINDOW_MINUTES =
-      "yarn.container.failure.window.minutes";
 
-  
-  
-  /**
-   * Hours range of the container failure reset window
-   * This is combined with the minute and day values to
-   * produce the full window.
-   * {@value}
-   */
-  String CONTAINER_FAILURE_WINDOW_HOURS =
-      "yarn.container.failure.window.hours";
+  String CONTAINER_FAILURE_WINDOW =
+      "yarn.container.failure.window";
 
 
-  /**
-   * Hours range of the container failure reset window
-   * This is combined with the hour and minute values to
-   * produce the full window.
-   * {@value}
-   */
-  String CONTAINER_FAILURE_WINDOW_DAYS =
-      "yarn.container.failure.window.days";
 
   int DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS = 0;
   int DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS = 6;

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
index edbf2b2..d7f159c 100644
--- a/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
+++ b/slider-core/src/main/java/org/apache/slider/common/tools/SliderUtils.java
@@ -43,7 +43,7 @@ import org.apache.hadoop.yarn.api.records.Container;
 import org.apache.hadoop.yarn.api.records.LocalResource;
 import org.apache.hadoop.yarn.api.records.YarnApplicationState;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.RoleKeys;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.common.SliderXmlConfKeys;
@@ -1303,8 +1303,8 @@ public final class SliderUtils {
       SliderException, IOException {
     Path imagePath;
     String imagePathOption =
-        internalOptions.get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
-    String appHomeOption = internalOptions.get(OptionKeys.INTERNAL_APPLICATION_HOME);
+        internalOptions.get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+    String appHomeOption = internalOptions.get(InternalKeys.INTERNAL_APPLICATION_HOME);
     if (!isUnset(imagePathOption)) {
       imagePath = fs.createPathThatMustExist(imagePathOption);
     } else {

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java b/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
index bb57b94..98a51bc 100644
--- a/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
+++ b/slider-core/src/main/java/org/apache/slider/core/conf/MapOperations.java
@@ -18,6 +18,7 @@
 
 package org.apache.slider.core.conf;
 
+import com.google.common.base.Preconditions;
 import org.apache.slider.common.tools.SliderUtils;
 import org.apache.slider.core.exceptions.BadConfigException;
 import org.slf4j.Logger;
@@ -61,12 +62,11 @@ public class MapOperations implements Map<String, String> {
     this.name = name;
   }
 
-
   /**
-   * Get a cluster option or value
+   * Get an option value
    *
-   * @param key
-   * @param defVal
+   * @param key key
+   * @param defVal default value
    * @return option in map or the default
    */
   public String getOption(String key, String defVal) {
@@ -74,14 +74,27 @@ public class MapOperations implements Map<String, String> {
     return val != null ? val : defVal;
   }
 
+  /**
+   * Get a boolean option
+   *
+   * @param key option key
+   * @param defVal default value
+   * @return option true if the option equals "true", or the default value
+   * if the option was not defined at all.
+   */
+  public Boolean getOptionBool(String key, boolean defVal) {
+    String val = getOption(key, Boolean.toString(defVal));
+    return Boolean.valueOf(val);
+  }
 
   /**
    * Get a cluster option or value
    *
-   * @param key
+   * @param key option key
    * @return the value
    * @throws BadConfigException if the option is missing
    */
+
   public String getMandatoryOption(String key) throws BadConfigException {
     String val = options.get(key);
     if (val == null) {
@@ -247,4 +260,35 @@ public class MapOperations implements Map<String, String> {
     }
     return builder.toString();
   }
+
+  /**
+   * Get the time range of a set of keys
+   * @param basekey
+   * @param defDays
+   * @param defHours
+   * @param defMins
+   * @param defSecs
+   * @return
+   */
+  public long getTimeRange(String basekey,
+      int defDays,
+      int defHours,
+      int defMins,
+      int defSecs) {
+    Preconditions.checkArgument(basekey != null);
+    int days = getOptionInt(basekey + ".days", defDays);
+    int hours = getOptionInt(basekey + ".hours", defHours);
+
+    int minutes = getOptionInt(basekey + ".minutes", defMins);
+    int seconds = getOptionInt(basekey + ".seconds", defSecs);
+    // range check
+    Preconditions.checkState(days >= 0 && hours >= 0 && minutes >= 0
+                             && seconds >= 0,
+        "Time range for %s has negative time component %s:%s:%s:%s",
+        basekey, days, hours, minutes, seconds);
+
+    // calculate total time, schedule the reset if expected
+    long totalMinutes = days * 24 * 60 + hours * 24 + minutes;
+    return totalMinutes * 60 + seconds;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
index 2ce16c7..72b0a42 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentClientProvider.java
@@ -21,7 +21,7 @@ package org.apache.slider.providers.agent;
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
-import org.apache.slider.api.OptionKeys;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.ResourceKeys;
 import org.apache.slider.common.SliderKeys;
 import org.apache.slider.common.tools.SliderFileSystem;
@@ -109,7 +109,7 @@ public class AgentClientProvider extends AbstractClientProvider
         getGlobalOptions().get(AgentKeys.PACKAGE_PATH);
     if (SliderUtils.isUnset(appHome)) {
       String agentImage = instanceDefinition.getInternalOperations().
-          get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+          get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
       sliderFileSystem.verifyFileExists(new Path(agentImage));
     }
   }
@@ -174,12 +174,12 @@ public class AgentClientProvider extends AbstractClientProvider
     String appHome = instanceDefinition.getAppConfOperations().
         getGlobalOptions().get(AgentKeys.PACKAGE_PATH);
     String agentImage = instanceDefinition.getInternalOperations().
-        get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+        get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
 
     if (SliderUtils.isUnset(appHome) && SliderUtils.isUnset(agentImage)) {
       throw new BadConfigException("Either agent package path " +
                                    AgentKeys.PACKAGE_PATH + " or image root " +
-                                   OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH
+                                   InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH
                                    + " must be provided.");
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
index 59a6e29..0c57b79 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
@@ -32,6 +32,7 @@ import org.apache.hadoop.yarn.api.records.Priority;
 import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.api.ClusterDescriptionKeys;
 import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.InternalKeys;
 import org.apache.slider.api.OptionKeys;
 import org.apache.slider.api.StatusKeys;
 import org.apache.slider.common.SliderKeys;
@@ -62,8 +63,6 @@ import org.apache.slider.providers.agent.application.metadata.Metainfo;
 import org.apache.slider.providers.agent.application.metadata.OSPackage;
 import org.apache.slider.providers.agent.application.metadata.OSSpecific;
 import org.apache.slider.server.appmaster.actions.ProviderReportedContainerLoss;
-import org.apache.slider.server.appmaster.state.ContainerPriority;
-import org.apache.slider.server.appmaster.state.RoleStatus;
 import org.apache.slider.server.appmaster.state.StateAccessForProviders;
 import org.apache.slider.server.appmaster.web.rest.agent.AgentCommandType;
 import org.apache.slider.server.appmaster.web.rest.agent.AgentRestOperations;
@@ -265,7 +264,7 @@ public class AgentProviderService extends AbstractProviderService implements
     log.info("PYTHONPATH set to {}", pythonPath);
 
     String agentImage = instanceDefinition.getInternalOperations().
-        get(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH);
+        get(InternalKeys.INTERNAL_APPLICATION_IMAGE_PATH);
     if (agentImage != null) {
       LocalResource agentImageRes = fileSystem.createAmResource(new Path(agentImage), LocalResourceType.ARCHIVE);
       launcher.addLocalResource(AgentKeys.AGENT_INSTALL_DIR, agentImageRes);
@@ -1169,7 +1168,7 @@ public class AgentProviderService extends AbstractProviderService implements
     tokens.put("${DEFAULT_DATA_DIR}", getAmState()
         .getInternalsSnapshot()
         .getGlobalOptions()
-        .getMandatoryOption(OptionKeys.INTERNAL_DATA_DIR_PATH));
+        .getMandatoryOption(InternalKeys.INTERNAL_DATA_DIR_PATH));
     return tokens;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
index e6c7aba..1642cc5 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/SliderAppMaster.java
@@ -19,6 +19,7 @@
 package org.apache.slider.server.appmaster;
 
 import com.codahale.metrics.MetricRegistry;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.protobuf.BlockingService;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
@@ -1195,31 +1196,19 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     ResetFailureWindow reset = new ResetFailureWindow();
     ConfTreeOperations ops = new ConfTreeOperations(resources);
     MapOperations globals = ops.getGlobalOptions();
-    int days = globals.getOptionInt(ResourceKeys.CONTAINER_FAILURE_WINDOW_DAYS,
-        ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS);
-    int hours = globals.getOptionInt(
-        ResourceKeys.CONTAINER_FAILURE_WINDOW_HOURS,
-        ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS);
-    int minutes = globals.getOptionInt(
-        ResourceKeys.CONTAINER_FAILURE_WINDOW_MINUTES,
-        ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_MINUTES);
-    // range check
-    if (days < 0 || hours < 0 || minutes < 0) {
-      throw new BadConfigException("Failure window contains negative values:"
-         + "days=%d hours=%d, minutes=%d",
-          days, hours, minutes);
-    }
-    // calculate total time, schedule the reset if expected
-    int totalMinutes = days * 24 * 60 + hours * 24 + minutes;
-    if (totalMinutes > 0) {
+    long seconds = globals.getTimeRange(ResourceKeys.CONTAINER_FAILURE_WINDOW,
+        ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_DAYS,
+        ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_HOURS,
+        ResourceKeys.DEFAULT_CONTAINER_FAILURE_WINDOW_MINUTES, 0);
+    if (seconds > 0) {
       log.info(
-          "Scheduling the failure window reset interval  to every {} minutes",
-          totalMinutes);
+          "Scheduling the failure window reset interval to every {} seconds",
+          seconds);
       RenewingAction<ResetFailureWindow> renew = new RenewingAction<>(
-          reset, totalMinutes, totalMinutes, TimeUnit.MINUTES, 0);
+          reset, seconds, seconds, TimeUnit.SECONDS, 0);
       actionQueues.renewing("failures", renew);
     } else {
-      log.warn("Failure window reset interval is not set");
+      log.info("Failure window reset interval is not set");
     }
   }
   
@@ -1458,7 +1447,8 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     //throws NoSuchNodeException if it is missing
     RoleInstance instance =
       appState.getLiveInstanceByContainerID(containerID);
-    queue(new ActionKillContainer(instance.getId(), 0, TimeUnit.MILLISECONDS));
+    queue(new ActionKillContainer(instance.getId(), 0, TimeUnit.MILLISECONDS,
+        rmOperationHandler));
     Messages.KillContainerResponseProto.Builder builder =
       Messages.KillContainerResponseProto.newBuilder();
     builder.setSuccess(true);
@@ -1469,6 +1459,15 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
     rmOperationHandler.execute(operations);
   }
 
+
+  /**
+   * Get the RM operations handler for direct scheduling of work.
+   */
+  @VisibleForTesting
+  public RMOperationHandler getRmOperationHandler() {
+    return rmOperationHandler;
+  }
+
   @Override
   public Messages.AMSuicideResponseProto amSuicide(
       Messages.AMSuicideRequestProto request)
@@ -1742,18 +1741,45 @@ public class SliderAppMaster extends AbstractSliderLaunchedService
   }
   
   public boolean maybeStartMonkey() {
+    MapOperations internals = getGlobalInternalOptions();
+
+    Boolean enabled =
+        internals.getOptionBool(InternalKeys.INTERNAL_CHAOS_MONKEY_ENABLED,
+            InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_ENABLED);
+    if (!enabled) {
+      log.info("Chaos monkey disabled");
+    }
+    
+    long monkeyInterval = internals.getTimeRange(
+        InternalKeys.INTERNAL_CHAOS_MONKEY_RATE,
+        InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_DAYS,
+        InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_HOURS,
+        InternalKeys.DEFAULT_INTERNAL_CHAOS_MONKEY_RATE_MINUTES,
+        0);
+    log.info("Adding Chaos Monkey scheduled every {} seconds ({} hours)",
+        monkeyInterval, monkeyInterval/(60*60));
     monkey = new ChaosMonkeyService(metrics, actionQueues);
-    int amKillProbability = 100;
-    int containerKillProbability = 200;
-    monkey.addTarget("AM killer", 
-        new ChaosKillAM(this, actionQueues, -1),
-        amKillProbability);
-    monkey.addTarget("Container killer", 
-        new ChaosKillContainer(this, actionQueues),
-        amKillProbability);
+    int amKillProbability = internals.getOptionInt(
+        InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_AM_FAILURE,
+        InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_AM_FAILURE);
+    if (amKillProbability > 0) {
+      log.info("Adding AM killer with probability %f", amKillProbability/100.0);
+      monkey.addTarget("AM killer",
+          new ChaosKillAM(actionQueues, -1), amKillProbability
+      );
+    }
+    int containerKillProbability = internals.getOptionInt(
+        InternalKeys.INTERNAL_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE,
+        InternalKeys.DEFAULT_CHAOS_MONKEY_PROBABILITY_CONTAINER_FAILURE);
+    if (containerKillProbability > 0) {
+      monkey.addTarget("Container killer",
+          new ChaosKillContainer(appState, actionQueues, rmOperationHandler),
+          amKillProbability
+      );
+    }
     initAndAddService(monkey);
     // and schedule it
-    schedule(monkey.getChaosAction(60, TimeUnit.SECONDS));
+    schedule(monkey.getChaosAction(monkeyInterval, TimeUnit.SECONDS));
     return true;
   }
   

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
index 7668bd5..95edca4 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/ActionKillContainer.java
@@ -18,10 +18,12 @@
 
 package org.apache.slider.server.appmaster.actions;
 
+import com.google.common.base.Preconditions;
 import org.apache.hadoop.yarn.api.records.ContainerId;
 import org.apache.slider.server.appmaster.SliderAppMaster;
 import org.apache.slider.server.appmaster.operations.AbstractRMOperation;
 import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation;
+import org.apache.slider.server.appmaster.operations.RMOperationHandler;
 import org.apache.slider.server.appmaster.state.AppState;
 
 import java.util.LinkedList;
@@ -31,13 +33,27 @@ import java.util.concurrent.TimeUnit;
 public class ActionKillContainer extends AsyncAction {
 
   private final ContainerId containerId;
-  
-  public ActionKillContainer(ContainerId containerId, long delay,
-      TimeUnit timeUnit) {
+  private final RMOperationHandler operationHandler;
+  public ActionKillContainer(
+      ContainerId containerId,
+      long delay,
+      TimeUnit timeUnit,
+      RMOperationHandler operationHandler) {
     super("kill container", delay, timeUnit);
+    this.operationHandler = operationHandler;
+    Preconditions.checkArgument(containerId != null);
+    
     this.containerId = containerId;
   }
 
+  /**
+   * Get the container ID to kill
+   * @return
+   */
+  public ContainerId getContainerId() {
+    return containerId;
+  }
+
   @Override
   public void execute(SliderAppMaster appMaster,
       QueueAccess queueService,
@@ -46,6 +62,6 @@ public class ActionKillContainer extends AsyncAction {
     ContainerReleaseOperation release = new ContainerReleaseOperation(containerId);
     opsList.add(release);
     //now apply the operations
-    appMaster.executeRMOperations(opsList);
+    operationHandler.execute(opsList);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
index 1154a44..ac59096 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/actions/QueueService.java
@@ -55,18 +55,14 @@ implements Runnable, QueueAccess {
 
   /**
    * Immediate actions.
-   * Package scoped for testing.
    */
-  @VisibleForTesting
-  final BlockingDeque<AsyncAction> actionQueue =
+  public final BlockingDeque<AsyncAction> actionQueue =
       new LinkedBlockingDeque<>();
 
   /**
    * Actions to be scheduled in the future
-   * Package scoped for testing.
    */
-  @VisibleForTesting
-  final DelayQueue<AsyncAction> scheduledActions = new DelayQueue<>();
+  public final DelayQueue<AsyncAction> scheduledActions = new DelayQueue<>();
 
   /**
    * Map of renewing actions by name ... this is to allow them to 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
index 13bda57..5905d2f 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosEntry.java
@@ -41,7 +41,7 @@ public class ChaosEntry {
 
 
   /**
-   * Constructor -includes validaton of all arguments
+   * Constructor -includes validation of all arguments
    * @param name
    * @param target
    * @param probability
@@ -51,7 +51,8 @@ public class ChaosEntry {
     Preconditions.checkArgument(!StringUtils.isEmpty(name), "missing name");
     Preconditions.checkArgument(target != null, "null target");
     Preconditions.checkArgument(probability > 0, "negative probability");
-    Preconditions.checkArgument(probability < 10000, "probability over 100%");
+    Preconditions.checkArgument(probability <= ChaosMonkeyService.PERCENT_100,
+        "probability over 100%");
     this.name = name;
     this.target = target;
     this.probability = probability;
@@ -71,11 +72,12 @@ public class ChaosEntry {
 
   /**
    * Invoke Chaos if the trigger value is in range of the probability
-   * @param trigger trigger value, 0-10K
+   * @param value trigger value, 0-10K
    * @return true if the chaos method was invoked
    */
-  public boolean maybeInvokeChaos(long trigger) {
-    if (probability < 0) {
+  public boolean maybeInvokeChaos(long value) {
+    log.debug("Probability {} trigger={}", probability, value);
+    if (value < probability) {
       invokeChaos();
       return true;
     }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
index c464ac3..3c1a914 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillAM.java
@@ -18,21 +18,21 @@
 
 package org.apache.slider.server.appmaster.monkey;
 
-import org.apache.slider.server.appmaster.SliderAppMaster;
 import org.apache.slider.server.appmaster.actions.ActionHalt;
 import org.apache.slider.server.appmaster.actions.QueueAccess;
 
 import java.util.concurrent.TimeUnit;
 
+/**
+ * Kill the AM
+ */
 public class ChaosKillAM implements ChaosTarget {
 
-  private final SliderAppMaster appMaster;
+  public static final int DELAY = 1000;
   private final QueueAccess queues;
   private final int exitCode;
 
-  public ChaosKillAM(SliderAppMaster appMaster,
-      QueueAccess queues, int exitCode) {
-    this.appMaster = appMaster;
+  public ChaosKillAM(QueueAccess queues, int exitCode) {
     this.queues = queues;
     this.exitCode = exitCode;
   }
@@ -42,7 +42,7 @@ public class ChaosKillAM implements ChaosTarget {
    */
   @Override
   public void chaosAction() {
-    queues.schedule(new ActionHalt(exitCode, "Chaos invoked halt", 1000,
+    queues.schedule(new ActionHalt(exitCode, "Chaos invoked halt", DELAY,
         TimeUnit.MILLISECONDS));
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
index 0ffcc8a..daf2590 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosKillContainer.java
@@ -18,9 +18,11 @@
 
 package org.apache.slider.server.appmaster.monkey;
 
-import org.apache.slider.server.appmaster.SliderAppMaster;
+import com.google.common.base.Preconditions;
 import org.apache.slider.server.appmaster.actions.ActionKillContainer;
 import org.apache.slider.server.appmaster.actions.QueueAccess;
+import org.apache.slider.server.appmaster.operations.RMOperationHandler;
+import org.apache.slider.server.appmaster.state.AppState;
 import org.apache.slider.server.appmaster.state.RoleInstance;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,24 +37,29 @@ import java.util.concurrent.TimeUnit;
 public class ChaosKillContainer implements ChaosTarget {
   protected static final Logger log =
       LoggerFactory.getLogger(ChaosKillContainer.class);
-  private final SliderAppMaster appMaster;
+  public static final int DELAY = 100;
+  private final AppState appState;
   private final QueueAccess queues;
   private final Random random = new Random();
+  private final RMOperationHandler operationHandler;
 
-  public ChaosKillContainer(SliderAppMaster appMaster,
-      QueueAccess queues) {
-    this.appMaster = appMaster;
+  public ChaosKillContainer(AppState appState,
+      QueueAccess queues,
+      RMOperationHandler operationHandler) {
+    Preconditions.checkNotNull(appState);
+    Preconditions.checkNotNull(queues);
+    this.appState = appState;
     this.queues = queues;
+    this.operationHandler = operationHandler;
   }
 
   /**
-   * Trigger a container kill halt
+   * Trigger a container kill 
    */
-  
   @Override
   public void chaosAction() {
     List<RoleInstance> liveContainers =
-        appMaster.getAppState().cloneLiveContainerInfoList();
+        appState.cloneLiveContainerInfoList();
     int size = liveContainers.size();
     if (size == 0) {
       log.info("No containers to kill");
@@ -63,6 +70,6 @@ public class ChaosKillContainer implements ChaosTarget {
     log.info("Killing {}", roleInstance);
 
     queues.schedule(new ActionKillContainer(roleInstance.getId(),
-        100, TimeUnit.MILLISECONDS));
+        DELAY, TimeUnit.MILLISECONDS, operationHandler));
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
index c525d02..cd4b46b 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/monkey/ChaosMonkeyService.java
@@ -20,7 +20,6 @@ package org.apache.slider.server.appmaster.monkey;
 
 import com.codahale.metrics.MetricRegistry;
 import org.apache.hadoop.service.AbstractService;
-import org.apache.slider.server.appmaster.actions.AsyncAction;
 import org.apache.slider.server.appmaster.actions.QueueAccess;
 import org.apache.slider.server.appmaster.actions.RenewingAction;
 import org.slf4j.Logger;
@@ -28,6 +27,7 @@ import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -36,8 +36,16 @@ import java.util.concurrent.TimeUnit;
 public class ChaosMonkeyService extends AbstractService {
   protected static final Logger log =
       LoggerFactory.getLogger(ChaosMonkeyService.class);
+  public static final int PERCENT_1 = 100;
+  public static final double PERCENT_1D = 100.0;
+  
+  /**
+   * the percentage value as multiplied up
+   */
+  public static final int PERCENT_100 = 100 * PERCENT_1;
   private final MetricRegistry metrics;
   private final QueueAccess queues;
+  private final Random random = new Random();
 
   private static final List<ChaosEntry> chaosEntries =
       new ArrayList<ChaosEntry>();
@@ -50,14 +58,19 @@ public class ChaosMonkeyService extends AbstractService {
 
 
   public synchronized void addTarget(String name,
-      ChaosTarget target,
-      long probability) {
-
+      ChaosTarget target, long probability) {
+    log.info("Adding {} with probability {}", name, probability / PERCENT_1);
     chaosEntries.add(new ChaosEntry(name, target, probability, metrics));
   }
 
+  /**
+   * Iterate through all the entries and invoke chaos on those wanted
+   */
   public void play() {
-
+    for (ChaosEntry chaosEntry : chaosEntries) {
+      long p = random.nextInt(PERCENT_100);
+      chaosEntry.maybeInvokeChaos(p);
+    }
   }
 
   public RenewingAction<MonkeyPlayAction> getChaosAction(long time, TimeUnit timeUnit) {

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
index 8ccd463..0fdba6b 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/mock/MockRMOperationHandler.groovy
@@ -29,17 +29,20 @@ import org.apache.slider.server.appmaster.operations.RMOperationHandler
 @Slf4j
 class MockRMOperationHandler extends RMOperationHandler {
   public List<AbstractRMOperation> operations = [];
-  
+  int requests, releases;
+
   @Override
   public void releaseAssignedContainer(ContainerId containerId) {
     operations.add(new ContainerReleaseOperation(containerId))
     log.info("Releasing container ID " + containerId.getId())
+    releases++;
   }
 
   @Override
   public void addContainerRequest(AMRMClient.ContainerRequest req) {
     operations.add(new ContainerRequestOperation(req))
     log.info("Requesting container role #" + req.priority);
+    requests++;
   }
 
   /**
@@ -47,5 +50,7 @@ class MockRMOperationHandler extends RMOperationHandler {
    */
   public void clear() {
     operations.clear()
+    releases = 0;
+    requests = 0;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy
new file mode 100644
index 0000000..c789011
--- /dev/null
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/monkey/TestMockMonkey.groovy
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.server.appmaster.model.monkey
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.server.appmaster.actions.ActionHalt
+import org.apache.slider.server.appmaster.actions.ActionKillContainer
+import org.apache.slider.server.appmaster.actions.QueueService
+import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest
+import org.apache.slider.server.appmaster.model.mock.MockRMOperationHandler
+import org.apache.slider.server.appmaster.monkey.ChaosKillAM
+import org.apache.slider.server.appmaster.monkey.ChaosKillContainer
+import org.apache.slider.server.appmaster.monkey.ChaosMonkeyService
+import org.apache.slider.server.appmaster.monkey.ChaosTarget
+import org.apache.slider.server.appmaster.operations.ContainerReleaseOperation
+import org.apache.slider.server.appmaster.state.RoleInstance
+import org.junit.Before
+import org.junit.Test
+
+@CompileStatic
+@Slf4j
+class TestMockMonkey extends BaseMockAppStateTest {
+
+  /**
+   * This queue service is NOT started; tests need to poll the queue
+   * rather than expect them to execute
+   */
+  QueueService queues = new QueueService();
+  ChaosMonkeyService monkey = new ChaosMonkeyService(metricRegistry,
+  queues)
+
+  @Before
+  public void init() {
+    def configuration = new YarnConfiguration()
+    queues.init(configuration)
+    monkey.init(configuration)
+  }
+  
+  @Test
+  public void testMonkeyStart() throws Throwable {
+    monkey.start()
+    monkey.stop()
+  }
+
+
+  @Test
+  public void testMonkeyPlay() throws Throwable {
+    ChaosCounter counter = new ChaosCounter()
+    monkey.addTarget("target", counter, ChaosMonkeyService.PERCENT_100)
+    
+    monkey.play()
+    assert counter.count == 1
+  }
+
+  @Test
+  public void testMonkeyPlaySometimes() throws Throwable {
+    ChaosCounter counter = new ChaosCounter()
+    ChaosCounter counter2 = new ChaosCounter()
+    monkey.addTarget("target1", counter, ChaosMonkeyService.PERCENT_1 * 50)
+    monkey.addTarget("target2", counter2, ChaosMonkeyService.PERCENT_1 * 25)
+
+    for (int i = 0; i < 100; i++) {
+      monkey.play()
+    }
+    log.info("Counter1 = ${counter.count} counter2 = ${counter2.count}")
+    /*
+     * Relying on probability here to give approximate answers 
+     */
+    assert counter.count > 25 
+    assert counter.count < 75 
+    assert counter2.count < counter.count 
+  }
+
+  @Test
+  public void testAMKiller() throws Throwable {
+
+    def chaos = new ChaosKillAM(queues, -1)
+    chaos.chaosAction();
+    assert queues.scheduledActions.size() == 1
+    def action = queues.scheduledActions.take()
+    assert action instanceof ActionHalt
+  }
+  
+  
+  @Test
+  public void testContainerKillerEmptyApp() throws Throwable {
+
+    
+    def chaos = new ChaosKillContainer(appState,
+        queues,
+        new MockRMOperationHandler())
+    chaos.chaosAction();
+    assert queues.scheduledActions.size() == 0
+  }
+  
+   
+  
+  @Test
+  public void testContainerKiller() throws Throwable {
+    MockRMOperationHandler ops = new MockRMOperationHandler();
+    role0Status.desired = 1
+    List<RoleInstance> instances = createAndStartNodes()
+    assert instances.size() == 1
+    def instance = instances[0]
+    
+    def chaos = new ChaosKillContainer(appState, queues, ops)
+    chaos.chaosAction();
+    assert queues.scheduledActions.size() == 1
+    def action = queues.scheduledActions.take()
+    ActionKillContainer killer = (ActionKillContainer) action
+    assert killer.containerId == instance.containerId;
+    killer.execute(null, queues, appState)
+    assert ops.releases == 1;
+
+    ContainerReleaseOperation operation = (ContainerReleaseOperation) ops.operations[0]
+    assert operation.containerId == instance.containerId
+  }
+  
+  
+
+  /**
+   * Chaos target that just implement a counter
+   */
+  private static class ChaosCounter implements ChaosTarget {
+    int count;
+    
+    @Override
+    void chaosAction() {
+      count++;
+    }
+
+
+    @Override
+    public String toString() {
+      final StringBuilder sb = new StringBuilder(
+          "ChaosCounter{");
+      sb.append("count=").append(count);
+      sb.append('}');
+      return sb.toString();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/52bd11b5/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy b/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
index d7b328f..28b484f 100644
--- a/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/test/SliderTestBase.groovy
@@ -18,6 +18,7 @@
 
 package org.apache.slider.test
 
+import com.codahale.metrics.MetricRegistry
 import groovy.transform.CompileStatic
 import org.apache.hadoop.fs.FileUtil
 import org.apache.slider.common.SliderXMLConfKeysForTesting
@@ -38,7 +39,11 @@ import java.nio.file.Files
 @CompileStatic
 public abstract class SliderTestBase extends SliderTestUtils {
 
-
+  /**
+   * Singleton metric registry
+   */
+  public static final MetricRegistry metricRegistry = new MetricRegistry()
+  
   @Rule
   public TestName methodName = new TestName();