Allow configuration manager to accept non-prod jobs with SLAPolicy (#87)

* Allow non-production tasks to be accepted when they have SLAPolicy attached to them and the -sla_aware_kill_non_prod is set to true.
diff --git a/src/main/java/org/apache/aurora/scheduler/app/AppModule.java b/src/main/java/org/apache/aurora/scheduler/app/AppModule.java
index edc13d4..184ff49 100644
--- a/src/main/java/org/apache/aurora/scheduler/app/AppModule.java
+++ b/src/main/java/org/apache/aurora/scheduler/app/AppModule.java
@@ -150,7 +150,8 @@
             opts.app.allowContainerVolumes,
             opts.sla.minRequiredInstances,
             opts.sla.maxSlaDuration.as(Time.SECONDS),
-            opts.app.allowedJobEnvironments),
+            opts.app.allowedJobEnvironments,
+            opts.sla.slaAwareKillNonProd),
         opts.main.driverImpl,
         opts);
   }
diff --git a/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java b/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java
index e0f8702..4b2941d 100644
--- a/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java
+++ b/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java
@@ -103,6 +103,7 @@
     private final Pattern allowedJobEnvironments;
     private final int minRequiredInstances;
     private final long maxSlaDurationSecs;
+    private final boolean slaAwareKillNonProd;
 
     public ConfigurationManagerSettings(
         ImmutableSet<Container._Fields> allowedContainerTypes,
@@ -114,7 +115,8 @@
         boolean allowContainerVolumes,
         int minRequiredInstances,
         long maxSlaDurationSecs,
-        String allowedJobEnvironment) {
+        String allowedJobEnvironment,
+        boolean slaAwareKillNonProd) {
 
       this.allowedContainerTypes = requireNonNull(allowedContainerTypes);
       this.allowDockerParameters = allowDockerParameters;
@@ -126,6 +128,7 @@
       this.allowedJobEnvironments = Pattern.compile(requireNonNull(allowedJobEnvironment));
       this.minRequiredInstances = minRequiredInstances;
       this.maxSlaDurationSecs = maxSlaDurationSecs;
+      this.slaAwareKillNonProd = slaAwareKillNonProd;
     }
   }
 
@@ -231,8 +234,8 @@
       int instanceCount) throws TaskDescriptionException {
 
     if (config.isSetSlaPolicy()) {
-      if (tierManager.getTier(ITaskConfig.build(config)).isRevocable()
-          || tierManager.getTier(ITaskConfig.build(config)).isPreemptible()) {
+      if (!(settings.slaAwareKillNonProd
+          || tierManager.getTier(ITaskConfig.build(config)).isProduction())) {
         throw new TaskDescriptionException(String.format(
             "Tier '%s' does not support SlaPolicy.",
             config.getTier()));
diff --git a/src/test/java/org/apache/aurora/scheduler/base/TaskTestUtil.java b/src/test/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
index 39d5c10..c992205 100644
--- a/src/test/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
+++ b/src/test/java/org/apache/aurora/scheduler/base/TaskTestUtil.java
@@ -93,7 +93,8 @@
           true,
           2,
           1800L,
-          ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS);
+          ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS,
+          false);
   public static final ExecutorID EXECUTOR_ID = ExecutorID.newBuilder()
       .setValue("PLACEHOLDER")
       .build();
diff --git a/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java b/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java
index a99fa7a..8709137 100644
--- a/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java
@@ -135,7 +135,8 @@
           false,
           MIN_REQUIRED_INSTANCES,
           MAX_SLA_DURATION_SECS,
-          ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS),
+          ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS,
+          false),
       TaskTestUtil.TIER_MANAGER,
       TaskTestUtil.THRIFT_BACKFILL,
       TestExecutorSettings.THERMOS_EXECUTOR);
@@ -150,7 +151,8 @@
           true,
           MIN_REQUIRED_INSTANCES,
           MAX_SLA_DURATION_SECS,
-          ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS),
+          ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS,
+          false),
       TaskTestUtil.TIER_MANAGER,
       TaskTestUtil.THRIFT_BACKFILL,
       TestExecutorSettings.THERMOS_EXECUTOR);
@@ -306,7 +308,8 @@
             false,
             MIN_REQUIRED_INSTANCES,
             MAX_SLA_DURATION_SECS,
-            ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS),
+            ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS,
+            false),
         TaskTestUtil.TIER_MANAGER,
         TaskTestUtil.THRIFT_BACKFILL,
         TestExecutorSettings.THERMOS_EXECUTOR).validateAndPopulate(ITaskConfig.build(builder), 100);
@@ -332,7 +335,8 @@
                     false,
                     MIN_REQUIRED_INSTANCES,
                     MAX_SLA_DURATION_SECS,
-                    ".+"),
+                    ".+",
+                    false),
             TaskTestUtil.TIER_MANAGER,
             TaskTestUtil.THRIFT_BACKFILL,
             TestExecutorSettings.THERMOS_EXECUTOR)
@@ -379,7 +383,8 @@
           true,
           MIN_REQUIRED_INSTANCES,
           MAX_SLA_DURATION_SECS,
-          "b.r"),
+          "b.r",
+          false),
       TaskTestUtil.TIER_MANAGER,
       TaskTestUtil.THRIFT_BACKFILL,
       TestExecutorSettings.THERMOS_EXECUTOR)
@@ -387,6 +392,36 @@
   }
 
   @Test
+  public void testSlaPolicyNonProdTiersEnabled() throws Exception {
+    ITaskConfig config = ITaskConfig.build(
+        CONFIG_WITH_CONTAINER
+            .newBuilder()
+            .setTier(TaskTestUtil.DEV_TIER_NAME)
+            .setSlaPolicy(SlaPolicy.countSlaPolicy(
+                new CountSlaPolicy()
+                    .setCount(MIN_REQUIRED_INSTANCES - 1))));
+
+    new ConfigurationManager(
+        new ConfigurationManagerSettings(
+            ALL_CONTAINER_TYPES,
+            true,
+            ImmutableList.of(new DockerParameter("foo", "bar")),
+            false,
+            true,
+            true,
+            true,
+            MIN_REQUIRED_INSTANCES,
+            MAX_SLA_DURATION_SECS,
+            ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS,
+            true),
+        TaskTestUtil.TIER_MANAGER,
+        TaskTestUtil.THRIFT_BACKFILL,
+        TestExecutorSettings.THERMOS_EXECUTOR).validateAndPopulate(
+        config,
+        MIN_REQUIRED_INSTANCES);
+  }
+
+  @Test
   public void testCountSlaPolicyUnsupportedTier() throws Exception {
     ITaskConfig config = ITaskConfig.build(
         CONFIG_WITH_CONTAINER
diff --git a/src/test/java/org/apache/aurora/scheduler/thrift/ThriftIT.java b/src/test/java/org/apache/aurora/scheduler/thrift/ThriftIT.java
index f0199a4..aa11041 100644
--- a/src/test/java/org/apache/aurora/scheduler/thrift/ThriftIT.java
+++ b/src/test/java/org/apache/aurora/scheduler/thrift/ThriftIT.java
@@ -192,7 +192,8 @@
         false,
         20,
         1800,
-        ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS);
+        ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS,
+        false);
 
     createThrift(configurationManagerSettings);