Repository: hadoop
Updated Branches:
  refs/heads/branch-3.1 665036c5f -> ce4a0898d


http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java
index 15cfdb0..ec452d7 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java
@@ -99,6 +99,7 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import org.junit.rules.ExpectedException;
+import org.mockito.Mockito;
 
 public class TestSchedulerUtils {
 
@@ -165,12 +166,12 @@ public class TestSchedulerUtils {
   @Test (timeout = 30000)
   public void testNormalizeRequest() {
     ResourceCalculator resourceCalculator = new DefaultResourceCalculator();
-    
+
     final int minMemory = 1024;
     final int maxMemory = 8192;
     Resource minResource = Resources.createResource(minMemory, 0);
     Resource maxResource = Resources.createResource(maxMemory, 0);
-    
+
     ResourceRequest ask = new ResourceRequestPBImpl();
 
     // case negative memory
@@ -230,11 +231,11 @@ public class TestSchedulerUtils {
   @Test (timeout = 30000)
   public void testNormalizeRequestWithDominantResourceCalculator() {
     ResourceCalculator resourceCalculator = new DominantResourceCalculator();
-    
+
     Resource minResource = Resources.createResource(1024, 1);
     Resource maxResource = Resources.createResource(10240, 10);
     Resource clusterResource = Resources.createResource(10 * 1024, 10);
-    
+
     ResourceRequest ask = new ResourceRequestPBImpl();
 
     // case negative memory/vcores
@@ -259,12 +260,12 @@ public class TestSchedulerUtils {
     assertEquals(1, ask.getCapability().getVirtualCores());
     assertEquals(2048, ask.getCapability().getMemorySize());
   }
-  
+
   @Test(timeout = 30000)
   public void testValidateResourceRequestWithErrorLabelsPermission()
       throws IOException {
     // mock queue and scheduler
-    YarnScheduler scheduler = mock(YarnScheduler.class);
+    ResourceScheduler scheduler = mock(ResourceScheduler.class);
     Set<String> queueAccessibleNodeLabels = Sets.newHashSet();
     QueueInfo queueInfo = mock(QueueInfo.class);
     when(queueInfo.getQueueName()).thenReturn("queue");
@@ -273,6 +274,8 @@ public class TestSchedulerUtils {
     when(scheduler.getQueueInfo(any(String.class), anyBoolean(), anyBoolean()))
         .thenReturn(queueInfo);
 
+    when(rmContext.getScheduler()).thenReturn(scheduler);
+
     Resource maxResource = Resources.createResource(
         YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
         YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES);
@@ -291,20 +294,20 @@ public class TestSchedulerUtils {
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
 
       resReq.setNodeLabelExpression("y");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       resReq.setNodeLabelExpression("");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       resReq.setNodeLabelExpression(" ");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       e.printStackTrace();
       fail("Should be valid when request labels is a subset of queue labels");
@@ -312,7 +315,7 @@ public class TestSchedulerUtils {
       rmContext.getNodeLabelManager().removeFromClusterNodeLabels(
           Arrays.asList("x", "y"));
     }
-    
+
     // same as above, but cluster node labels don't contains label being
     // requested. should fail
     try {
@@ -325,13 +328,13 @@ public class TestSchedulerUtils {
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
     }
-    
+
     // queue has labels, failed cases (when ask a label not included by queue)
     try {
       // set queue accessible node labesl to [x, y]
@@ -340,22 +343,22 @@ public class TestSchedulerUtils {
       rmContext.getNodeLabelManager().addToCluserNodeLabels(
           ImmutableSet.of(NodeLabel.newInstance("x"),
               NodeLabel.newInstance("y")));
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("z");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
     } finally {
       rmContext.getNodeLabelManager().removeFromClusterNodeLabels(
           Arrays.asList("x", "y"));
     }
-    
+
     // we don't allow specify more than two node labels in a single expression
     // now
     try {
@@ -365,43 +368,43 @@ public class TestSchedulerUtils {
       rmContext.getNodeLabelManager().addToCluserNodeLabels(
           ImmutableSet.of(NodeLabel.newInstance("x"),
               NodeLabel.newInstance("y")));
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("x && y");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
     } finally {
       rmContext.getNodeLabelManager().removeFromClusterNodeLabels(
           Arrays.asList("x", "y"));
     }
-    
+
     // queue doesn't have label, succeed (when request no label)
     queueAccessibleNodeLabels.clear();
     try {
       // set queue accessible node labels to empty
       queueAccessibleNodeLabels.clear();
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       resReq.setNodeLabelExpression("");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       resReq.setNodeLabelExpression("  ");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       e.printStackTrace();
       fail("Should be valid when request labels is empty");
@@ -411,18 +414,18 @@ public class TestSchedulerUtils {
     try {
       // set queue accessible node labels to empty
       queueAccessibleNodeLabels.clear();
-      
+
       rmContext.getNodeLabelManager().addToCluserNodeLabels(
           ImmutableSet.of(NodeLabel.newInstance("x")));
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidLabelResourceRequestException e) {
       invalidlabelexception=true;
@@ -438,27 +441,27 @@ public class TestSchedulerUtils {
       // set queue accessible node labels to empty
       queueAccessibleNodeLabels.clear();
       queueAccessibleNodeLabels.add(RMNodeLabelsManager.ANY);
-      
+
       rmContext.getNodeLabelManager().addToCluserNodeLabels(
           ImmutableSet.of(NodeLabel.newInstance("x"),
               NodeLabel.newInstance("y"), NodeLabel.newInstance("z")));
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       resReq.setNodeLabelExpression("y");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
-      
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
+
       resReq.setNodeLabelExpression("z");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       e.printStackTrace();
       fail("Should be valid when queue can access any labels");
@@ -466,25 +469,25 @@ public class TestSchedulerUtils {
       rmContext.getNodeLabelManager().removeFromClusterNodeLabels(
           Arrays.asList("x", "y", "z"));
     }
-    
+
     // same as above, but cluster node labels don't contains label, should fail
     try {
       // set queue accessible node labels to empty
       queueAccessibleNodeLabels.clear();
       queueAccessibleNodeLabels.add(RMNodeLabelsManager.ANY);
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
     }
-    
+
     // we don't allow resource name other than ANY and specify label
     try {
       // set queue accessible node labesl to [x, y]
@@ -493,22 +496,22 @@ public class TestSchedulerUtils {
       rmContext.getNodeLabelManager().addToCluserNodeLabels(
           ImmutableSet.of(NodeLabel.newInstance("x"),
               NodeLabel.newInstance("y")));
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), "rack", resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
     } finally {
       rmContext.getNodeLabelManager().removeFromClusterNodeLabels(
           Arrays.asList("x", "y"));
     }
-    
+
     // we don't allow resource name other than ANY and specify label even if
     // queue has accessible label = *
     try {
@@ -518,15 +521,15 @@ public class TestSchedulerUtils {
           .asList(CommonNodeLabelsManager.ANY));
       rmContext.getNodeLabelManager().addToCluserNodeLabels(
           ImmutableSet.of(NodeLabel.newInstance("x")));
-      
+
       Resource resource = Resources.createResource(
           0,
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), "rack", resource, 1);
       resReq.setNodeLabelExpression("x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
     } finally {
@@ -538,8 +541,8 @@ public class TestSchedulerUtils {
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq1 = BuilderUtils
           .newResourceRequest(mock(Priority.class), "*", resource, 1, "x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq1, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq1, "queue",
+          scheduler, rmContext, maxResource);
       fail("Should fail");
     } catch (InvalidResourceRequestException e) {
       assertEquals("Invalid label resource request, cluster do not contain , "
@@ -553,8 +556,8 @@ public class TestSchedulerUtils {
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq1 = BuilderUtils
           .newResourceRequest(mock(Priority.class), "*", resource, 1, "x");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq1, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq1, "queue",
+          scheduler, rmContext, maxResource);
       Assert.assertEquals(RMNodeLabelsManager.NO_LABEL,
           resReq1.getNodeLabelExpression());
     } catch (InvalidResourceRequestException e) {
@@ -564,14 +567,21 @@ public class TestSchedulerUtils {
   }
 
   @Test (timeout = 30000)
-  public void testValidateResourceRequest() {
-    YarnScheduler mockScheduler = mock(YarnScheduler.class);
+  public void testValidateResourceRequest() throws IOException {
+    ResourceScheduler mockScheduler = mock(ResourceScheduler.class);
+
+    QueueInfo queueInfo = mock(QueueInfo.class);
+    when(queueInfo.getQueueName()).thenReturn("queue");
 
     Resource maxResource =
         Resources.createResource(
             YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
             YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES);
 
+    when(rmContext.getScheduler()).thenReturn(mockScheduler);
+    when(mockScheduler.getQueueInfo(Mockito.anyString(), Mockito.anyBoolean(),
+        Mockito.anyBoolean())).thenReturn(queueInfo);
+
     // zero memory
     try {
       Resource resource =
@@ -580,8 +590,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       fail("Zero memory should be accepted");
     }
@@ -594,8 +604,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       fail("Zero vcores should be accepted");
     }
@@ -609,8 +619,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       fail("Max memory should be accepted");
     }
@@ -624,8 +634,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
     } catch (InvalidResourceRequestException e) {
       fail("Max vcores should not be accepted");
     }
@@ -638,8 +648,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
       fail("Negative memory should not be accepted");
     } catch (InvalidResourceRequestException e) {
       // expected
@@ -653,8 +663,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
       fail("Negative vcores should not be accepted");
     } catch (InvalidResourceRequestException e) {
       // expected
@@ -669,8 +679,8 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
       fail("More than max memory should not be accepted");
     } catch (InvalidResourceRequestException e) {
       // expected
@@ -684,14 +694,14 @@ public class TestSchedulerUtils {
       ResourceRequest resReq =
           BuilderUtils.newResourceRequest(mock(Priority.class),
               ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, null,
-          mockScheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, null,
+          mockScheduler, rmContext, maxResource);
       fail("More than max vcores should not be accepted");
     } catch (InvalidResourceRequestException e) {
       // expected
     }
   }
-  
+
   @Test
   public void testValidateResourceBlacklistRequest() throws Exception {
 
@@ -753,7 +763,7 @@ public class TestSchedulerUtils {
     }
 
     rm.stop();
-    
+
     Assert.assertTrue(
         "Didn't not catch InvalidResourceBlacklistRequestException", error);
   }
@@ -793,12 +803,12 @@ public class TestSchedulerUtils {
           ApplicationId.newInstance(System.currentTimeMillis(), 1), 1), 1), 
"x");
     Assert.assertEquals(ContainerExitStatus.PREEMPTED, cd.getExitStatus());
   }
-  
+
   @Test (timeout = 30000)
   public void testNormalizeNodeLabelExpression()
       throws IOException {
     // mock queue and scheduler
-    YarnScheduler scheduler = mock(YarnScheduler.class);
+    ResourceScheduler scheduler = mock(ResourceScheduler.class);
     Set<String> queueAccessibleNodeLabels = Sets.newHashSet();
     QueueInfo queueInfo = mock(QueueInfo.class);
     when(queueInfo.getQueueName()).thenReturn("queue");
@@ -806,11 +816,13 @@ public class TestSchedulerUtils {
     when(queueInfo.getDefaultNodeLabelExpression()).thenReturn(" x ");
     when(scheduler.getQueueInfo(any(String.class), anyBoolean(), anyBoolean()))
         .thenReturn(queueInfo);
-    
+
     Resource maxResource = Resources.createResource(
         YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
         YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES);
 
+    when(rmContext.getScheduler()).thenReturn(scheduler);
+
     // queue has labels, success cases
     try {
       // set queue accessible node labels to [x, y]
@@ -824,13 +836,13 @@ public class TestSchedulerUtils {
           YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
       ResourceRequest resReq = BuilderUtils.newResourceRequest(
           mock(Priority.class), ResourceRequest.ANY, resource, 1);
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       Assert.assertEquals("x", resReq.getNodeLabelExpression());
-      
+
       resReq.setNodeLabelExpression(" y ");
-      SchedulerUtils.normalizeAndvalidateRequest(resReq, maxResource, "queue",
-          scheduler, rmContext);
+      normalizeAndvalidateRequest(resReq, "queue",
+          scheduler, rmContext, maxResource);
       Assert.assertEquals("y", resReq.getNodeLabelExpression());
     } catch (InvalidResourceRequestException e) {
       e.printStackTrace();
@@ -1007,7 +1019,7 @@ public class TestSchedulerUtils {
     Assert.assertNull(applications.get(appId));
     return app;
   }
-  
+
   private static RMContext getMockRMContext() {
     RMContext rmContext = mock(RMContext.class);
     RMNodeLabelsManager nlm = new NullRMNodeLabelsManager();
@@ -1019,6 +1031,14 @@ public class TestSchedulerUtils {
     return rmContext;
   }
 
+  private static void normalizeAndvalidateRequest(ResourceRequest resReq,
+      String queueName, YarnScheduler scheduler, RMContext rmContext,
+      Resource maxAllocation)
+      throws InvalidResourceRequestException {
+    SchedulerUtils.normalizeAndValidateRequest(resReq, maxAllocation, 
queueName,
+        scheduler, rmContext, null);
+  }
+
   private static class InvalidResourceRequestExceptionMessageGenerator {
 
     private StringBuilder sb;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
index 8d948b5..60d7b16 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
@@ -18,6 +18,8 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity;
 
+import static 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.MAXIMUM_ALLOCATION_MB;
+import static 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.MAXIMUM_ALLOCATION_VCORES;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -838,6 +840,41 @@ public class TestCapacityScheduler extends 
CapacitySchedulerTestBase {
     
assertEquals(CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE,conf.getNonLabeledQueueMaximumCapacity(A),delta);
   }
 
+  @Test
+  public void testQueueMaximumAllocations() {
+    CapacityScheduler scheduler = new CapacityScheduler();
+    scheduler.setConf(new YarnConfiguration());
+    scheduler.setRMContext(resourceManager.getRMContext());
+    CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration();
+
+    setupQueueConfiguration(conf);
+    conf.set(CapacitySchedulerConfiguration.getQueuePrefix(A1)
+        + MAXIMUM_ALLOCATION_MB, "1024");
+    conf.set(CapacitySchedulerConfiguration.getQueuePrefix(A1)
+        + MAXIMUM_ALLOCATION_VCORES, "1");
+
+    scheduler.init(conf);
+    scheduler.start();
+
+    Resource maxAllocationForQueue =
+        scheduler.getMaximumResourceCapability("a1");
+    Resource maxAllocation1 = scheduler.getMaximumResourceCapability("");
+    Resource maxAllocation2 = scheduler.getMaximumResourceCapability(null);
+    Resource maxAllocation3 = scheduler.getMaximumResourceCapability();
+
+    Assert.assertEquals(maxAllocation1, maxAllocation2);
+    Assert.assertEquals(maxAllocation1, maxAllocation3);
+    Assert.assertEquals(
+        YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
+        maxAllocation1.getMemorySize());
+    Assert.assertEquals(
+        YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES,
+        maxAllocation1.getVirtualCores());
+
+    Assert.assertEquals(1024, maxAllocationForQueue.getMemorySize());
+    Assert.assertEquals(1, maxAllocationForQueue.getVirtualCores());
+  }
+
 
   @Test
   public void testRefreshQueues() throws Exception {
@@ -4012,7 +4049,7 @@ public class TestCapacityScheduler extends 
CapacitySchedulerTestBase {
   private void setMaxAllocMb(CapacitySchedulerConfiguration conf,
       String queueName, int maxAllocMb) {
     String propName = CapacitySchedulerConfiguration.getQueuePrefix(queueName)
-        + CapacitySchedulerConfiguration.MAXIMUM_ALLOCATION_MB;
+        + MAXIMUM_ALLOCATION_MB;
     conf.setInt(propName, maxAllocMb);
   }
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerTestBase.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerTestBase.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerTestBase.java
index b998564..15ab89b 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerTestBase.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairSchedulerTestBase.java
@@ -75,6 +75,7 @@ public class FairSchedulerTestBase {
   public static final float TEST_RESERVATION_THRESHOLD = 0.09f;
   private static final int SLEEP_DURATION = 10;
   private static final int SLEEP_RETRIES = 1000;
+  protected static final int RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE = 10240;
   final static ContainerUpdates NULL_UPDATE_REQUESTS =
       new ContainerUpdates();
 
@@ -91,7 +92,8 @@ public class FairSchedulerTestBase {
     conf.setInt(YarnConfiguration.RM_SCHEDULER_MINIMUM_ALLOCATION_MB, 0);
     
conf.setInt(FairSchedulerConfiguration.RM_SCHEDULER_INCREMENT_ALLOCATION_MB,
         1024);
-    conf.setInt(YarnConfiguration.RM_SCHEDULER_MAXIMUM_ALLOCATION_MB, 10240);
+    conf.setInt(YarnConfiguration.RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
+        RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE);
     conf.setBoolean(FairSchedulerConfiguration.ASSIGN_MULTIPLE, false);
     conf.setLong(FairSchedulerConfiguration.UPDATE_INTERVAL_MS, 10);
     conf.setFloat(FairSchedulerConfiguration.PREEMPTION_THRESHOLD, 0f);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java
index 4a7461d..50d7e18 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestAllocationFileLoaderService.java
@@ -24,6 +24,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.fs.UnsupportedFileSystemException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.hadoop.yarn.api.records.QueueACL;
+import org.apache.hadoop.yarn.api.records.Resource;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import 
org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationSchedulerConfiguration;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.QueuePlacementRule.NestedUserQueue;
@@ -31,7 +32,9 @@ import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.allocationfi
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.DominantResourceFairnessPolicy;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.policies.FairSharePolicy;
 import org.apache.hadoop.yarn.util.ControlledClock;
+import org.apache.hadoop.yarn.util.resource.ResourceUtils;
 import org.apache.hadoop.yarn.util.resource.Resources;
+import org.apache.hadoop.yarn.util.resource.TestResourceUtils;
 import org.junit.Test;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -42,6 +45,7 @@ import java.io.PrintWriter;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
 import java.util.List;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -201,7 +205,7 @@ public class TestAllocationFileLoaderService {
 
   @Test
   public void testAllocationFileParsing() throws Exception {
-    Configuration conf = new Configuration();
+    Configuration conf = new YarnConfiguration();
     conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE);
     AllocationFileLoaderService allocLoader = new 
AllocationFileLoaderService();
 
@@ -244,6 +248,7 @@ public class TestAllocationFileLoaderService {
               .fairSharePreemptionTimeout(120)
               .minSharePreemptionTimeout(50)
               .fairSharePreemptionThreshold(0.6)
+              .maxContainerAllocation("512mb,16vcores")
             // Create hierarchical queues G,H, with different min/fair
             // share preemption timeouts and preemption thresholds.
             // Also add a child default to make sure it doesn't impact queue H.
@@ -251,6 +256,7 @@ public class TestAllocationFileLoaderService {
                 .fairSharePreemptionTimeout(180)
                 .minSharePreemptionTimeout(40)
                 .fairSharePreemptionThreshold(0.7)
+                .maxContainerAllocation("1024mb,8vcores")
               .buildSubQueue()
             .buildQueue()
             // Set default limit of apps per queue to 15
@@ -376,6 +382,28 @@ public class TestAllocationFileLoaderService {
     assertEquals("alice,bob admins", queueConf.getQueueAcl("root.queueC",
         QueueACL.SUBMIT_APPLICATIONS).getAclString());
 
+    Resource expectedResourceWithCustomType = Resources.createResource(512, 
16);
+
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation(
+            "root." + YarnConfiguration.DEFAULT_QUEUE_NAME));
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation("root.queueA"));
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation("root.queueB"));
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation("root.queueC"));
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation("root.queueD"));
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation("root.queueE"));
+    assertEquals(Resources.unbounded(),
+        queueConf.getQueueMaxContainerAllocation("root.queueF"));
+    assertEquals(expectedResourceWithCustomType,
+        queueConf.getQueueMaxContainerAllocation("root.queueG"));
+    assertEquals(Resources.createResource(1024, 8),
+        queueConf.getQueueMaxContainerAllocation("root.queueG.queueH"));
+
     assertEquals(120000, queueConf.getMinSharePreemptionTimeout("root"));
     assertEquals(-1, queueConf.getMinSharePreemptionTimeout("root." +
         YarnConfiguration.DEFAULT_QUEUE_NAME));

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestApplicationMasterServiceWithFS.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestApplicationMasterServiceWithFS.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestApplicationMasterServiceWithFS.java
new file mode 100644
index 0000000..ac8b5ad
--- /dev/null
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestApplicationMasterServiceWithFS.java
@@ -0,0 +1,170 @@
+/**
+ * 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.hadoop.yarn.server.resourcemanager.scheduler.fair;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.test.GenericTestUtils;
+import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse;
+import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.apache.hadoop.yarn.exceptions.InvalidResourceRequestException;
+import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import 
org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test Application master service using Fair scheduler.
+ */
+public class TestApplicationMasterServiceWithFS {
+
+  private static final Log LOG =
+      LogFactory.getLog(TestApplicationMasterServiceWithFS.class);
+
+  private static final int GB = 1024;
+  private static final int MEMORY_ALLOCATION = 3 * GB;
+  private static final String TEST_FOLDER = "test-queues";
+  private AllocateResponse allocateResponse;
+  private static YarnConfiguration configuration;
+
+  @BeforeClass
+  public static void setup() throws IOException {
+    String allocFile =
+        GenericTestUtils.getTestDir(TEST_FOLDER).getAbsolutePath();
+
+    configuration = new YarnConfiguration();
+    configuration.setClass(YarnConfiguration.RM_SCHEDULER, FairScheduler.class,
+        ResourceScheduler.class);
+    configuration.set(FairSchedulerConfiguration.ALLOCATION_FILE, allocFile);
+
+    PrintWriter out = new PrintWriter(new FileWriter(allocFile));
+    out.println("<?xml version=\"1.0\"?>");
+    out.println("<allocations>");
+    out.println("  <queue name=\"queueA\">");
+    out.println(
+        "   <maxContainerAllocation>2048 mb 1 
vcores</maxContainerAllocation>");
+    out.println("  </queue>");
+    out.println("  <queue name=\"queueB\">");
+    out.println(
+        "   <maxContainerAllocation>3072 mb 1 
vcores</maxContainerAllocation>");
+    out.println("  </queue>");
+    out.println("  <queue name=\"queueC\">");
+    out.println("  </queue>");
+    out.println("</allocations>");
+    out.close();
+  }
+
+  @AfterClass
+  public static void teardown(){
+    File allocFile = GenericTestUtils.getTestDir(TEST_FOLDER);
+    allocFile.delete();
+  }
+
+  @Test(timeout = 3000000)
+  public void testQueueLevelContainerAllocationFail() throws Exception {
+    MockRM rm = new MockRM(configuration);
+    rm.start();
+
+    // Register node1
+    MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
+
+    // Submit an application
+    RMApp app1 = rm.submitApp(2 * GB, "queueA");
+
+    // kick the scheduling
+    nm1.nodeHeartbeat(true);
+    RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
+    MockAM am1 = rm.sendAMLaunched(attempt1.getAppAttemptId());
+    am1.registerAppAttempt();
+
+    am1.addRequests(new String[] { "127.0.0.1" }, MEMORY_ALLOCATION, 1, 1);
+    try {
+      allocateResponse = am1.schedule(); // send the request
+      Assert.fail();
+    } catch (Exception e) {
+      Assert.assertTrue(e instanceof InvalidResourceRequestException);
+    } finally {
+      rm.stop();
+    }
+  }
+
+  @Test(timeout = 3000000)
+  public void testQueueLevelContainerAllocationSuccess() throws Exception {
+    testFairSchedulerContainerAllocationSuccess("queueB");
+  }
+
+  @Test(timeout = 3000000)
+  public void testSchedulerLevelContainerAllocationSuccess() throws Exception {
+    testFairSchedulerContainerAllocationSuccess("queueC");
+  }
+
+  private void testFairSchedulerContainerAllocationSuccess(String queueName)
+      throws Exception {
+    MockRM rm = new MockRM(configuration);
+    rm.start();
+
+    // Register node1
+    MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
+
+    // Submit an application
+    RMApp app1 = rm.submitApp(2 * GB, queueName);
+
+    // kick the scheduling
+    nm1.nodeHeartbeat(true);
+    RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
+    MockAM am1 = rm.sendAMLaunched(attempt1.getAppAttemptId());
+    am1.registerAppAttempt();
+
+    am1.addRequests(new String[] { "127.0.0.1" }, MEMORY_ALLOCATION, 1, 1);
+
+    allocateResponse = am1.schedule(); // send the request
+    ((FairScheduler) rm.getResourceScheduler()).update();
+
+    // kick the scheduler
+    nm1.nodeHeartbeat(true);
+    GenericTestUtils.waitFor(() -> {
+      LOG.info("Waiting for containers to be created for app 1");
+      try {
+        allocateResponse = am1.schedule();
+      } catch (Exception e) {
+        Assert.fail("Allocation should be successful");
+      }
+      return allocateResponse.getAllocatedContainers().size() > 0;
+    }, 1000, 10000);
+
+    Container allocatedContainer =
+        allocateResponse.getAllocatedContainers().get(0);
+    Assert.assertEquals(MEMORY_ALLOCATION,
+        allocatedContainer.getResource().getMemorySize());
+    Assert.assertEquals(1, allocatedContainer.getResource().getVirtualCores());
+    rm.stop();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
index 3a8e929..acca65c 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFairScheduler.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair;
 
+import static 
org.apache.hadoop.yarn.conf.YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -193,8 +194,6 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
     }
   }
 
-  // TESTS
-
   @SuppressWarnings("deprecation")
   @Test(timeout=2000)
   public void testLoadConfigurationOnInitialize() throws IOException {
@@ -333,6 +332,111 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
     }
   }
 
+  @Test
+  public void testQueueMaximumCapacityAllocations() throws IOException {
+    conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE);
+
+    int tooHighQueueAllocation = RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE +1;
+
+    PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE));
+    out.println("<?xml version=\"1.0\"?>");
+    out.println("<allocations>");
+    out.println("  <queue name=\"queueA\">");
+    out.println(
+        "   <maxContainerAllocation>512 mb 1 vcores</maxContainerAllocation>");
+    out.println("  </queue>");
+    out.println("  <queue name=\"queueB\">");
+    out.println("  </queue>");
+    out.println("  <queue name=\"queueC\">");
+    out.println(
+        "   <maxContainerAllocation>2048 mb 3 
vcores</maxContainerAllocation>");
+    out.println("    <queue name=\"queueD\">");
+    out.println("    </queue>");
+    out.println("  </queue>");
+    out.println("  <queue name=\"queueE\">");
+    out.println("    <maxContainerAllocation>" + tooHighQueueAllocation
+        + " mb 1 vcores</maxContainerAllocation>");
+    out.println("  </queue>");
+    out.println("</allocations>");
+    out.close();
+
+    scheduler.init(conf);
+
+    Assert.assertEquals(1, 
scheduler.getMaximumResourceCapability("root.queueA")
+        .getVirtualCores());
+    Assert.assertEquals(512,
+        scheduler.getMaximumResourceCapability("root.queueA").getMemorySize());
+
+    Assert.assertEquals(DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES,
+        scheduler.getMaximumResourceCapability("root.queueB")
+            .getVirtualCores());
+    Assert.assertEquals(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE,
+        scheduler.getMaximumResourceCapability("root.queueB").getMemorySize());
+
+    Assert.assertEquals(3, 
scheduler.getMaximumResourceCapability("root.queueC")
+        .getVirtualCores());
+    Assert.assertEquals(2048,
+        scheduler.getMaximumResourceCapability("root.queueC").getMemorySize());
+
+    Assert.assertEquals(3, scheduler
+        .getMaximumResourceCapability("root.queueC.queueD").getVirtualCores());
+    Assert.assertEquals(2048, scheduler
+        .getMaximumResourceCapability("root.queueC.queueD").getMemorySize());
+
+    Assert.assertEquals(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, scheduler
+        .getMaximumResourceCapability("root.queueE").getMemorySize());
+  }
+
+  @Test
+  public void testNormalizationUsingQueueMaximumAllocation()
+      throws IOException {
+
+    int queueMaxAllocation = 4096;
+    conf.set(FairSchedulerConfiguration.ALLOCATION_FILE, ALLOC_FILE);
+
+    PrintWriter out = new PrintWriter(new FileWriter(ALLOC_FILE));
+    out.println("<?xml version=\"1.0\"?>");
+    out.println("<allocations>");
+    out.println(" <queue name=\"queueA\">");
+    out.println("  <maxContainerAllocation>" + queueMaxAllocation
+        + " mb 1 vcores" + "</maxContainerAllocation>");
+    out.println(" </queue>");
+    out.println(" <queue name=\"queueB\">");
+    out.println(" </queue>");
+    out.println("</allocations>");
+    out.close();
+
+    scheduler.init(conf);
+    scheduler.start();
+    scheduler.reinitialize(conf, resourceManager.getRMContext());
+
+    allocateAppAttempt("root.queueA", 1, queueMaxAllocation + 1024);
+    allocateAppAttempt("root.queueB", 2,
+        RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE + 1024);
+
+    scheduler.update();
+    FSQueue queueToCheckA = 
scheduler.getQueueManager().getQueue("root.queueA");
+    FSQueue queueToCheckB = 
scheduler.getQueueManager().getQueue("root.queueB");
+
+    assertEquals(queueMaxAllocation, 
queueToCheckA.getDemand().getMemorySize());
+    assertEquals(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE,
+        queueToCheckB.getDemand().getMemorySize());
+  }
+
+  private void allocateAppAttempt(String queueName, int id, int memorySize) {
+    ApplicationAttemptId id11 = createAppAttemptId(id, id);
+    createMockRMApp(id11);
+    scheduler.addApplication(id11.getApplicationId(), queueName, "user1",
+        false);
+    scheduler.addApplicationAttempt(id11, false, false);
+    List<ResourceRequest> ask1 = new ArrayList<ResourceRequest>();
+    ResourceRequest request1 =
+        createResourceRequest(memorySize, ResourceRequest.ANY, 1, 1, true);
+    ask1.add(request1);
+    scheduler.allocate(id11, ask1, null, new ArrayList<ContainerId>(), null,
+        null, NULL_UPDATE_REQUESTS);
+  }
+
   /**
    * Test fair shares when max resources are set but are too high to impact
    * the shares.
@@ -1311,8 +1415,9 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
     // New node satisfies resource request
     scheduler.update();
     scheduler.handle(new NodeUpdateSchedulerEvent(node4));
-    assertEquals(10240, scheduler.getQueueManager().getQueue("queue1").
-            getResourceUsage().getMemorySize());
+    assertEquals(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE,
+        scheduler.getQueueManager().getQueue("queue1").getResourceUsage()
+            .getMemorySize());
 
     scheduler.handle(new NodeUpdateSchedulerEvent(node1));
     scheduler.handle(new NodeUpdateSchedulerEvent(node2));
@@ -4094,12 +4199,12 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
     scheduler.start();
     scheduler.reinitialize(conf, resourceManager.getRMContext());
 
-    RMNode node1 =
-        MockNodes.newNodeInfo(1, Resources.createResource(10240, 10),
-            1, "127.0.0.1");
-    RMNode node2 =
-        MockNodes.newNodeInfo(1, Resources.createResource(10240, 10),
-            2, "127.0.0.2");
+    RMNode node1 = MockNodes.newNodeInfo(1,
+        Resources.createResource(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, 10),
+        1, "127.0.0.1");
+    RMNode node2 = MockNodes.newNodeInfo(1,
+        Resources.createResource(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, 10),
+        2, "127.0.0.2");
     RMNode node3 =
         MockNodes.newNodeInfo(1, Resources.createResource(5120, 5),
             3, "127.0.0.3");
@@ -4117,10 +4222,12 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
         true);
     Resource amResource1 = Resource.newInstance(1024, 1);
     Resource amResource2 = Resource.newInstance(1024, 1);
-    Resource amResource3 = Resource.newInstance(10240, 1);
+    Resource amResource3 =
+        Resource.newInstance(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, 1);
     Resource amResource4 = Resource.newInstance(5120, 1);
     Resource amResource5 = Resource.newInstance(1024, 1);
-    Resource amResource6 = Resource.newInstance(10240, 1);
+    Resource amResource6 =
+        Resource.newInstance(RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, 1);
     Resource amResource7 = Resource.newInstance(1024, 1);
     Resource amResource8 = Resource.newInstance(1024, 1);
     int amPriority = RMAppAttemptImpl.AM_CONTAINER_PRIORITY.getPriority();
@@ -4154,7 +4261,8 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
 
     ApplicationAttemptId attId3 = createAppAttemptId(3, 1);
     createApplicationWithAMResource(attId3, "queue1", "user1", amResource3);
-    createSchedulingRequestExistingApplication(10240, 1, amPriority, attId3);
+    createSchedulingRequestExistingApplication(
+        RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, 1, amPriority, attId3);
     FSAppAttempt app3 = scheduler.getSchedulerApp(attId3);
     scheduler.update();
     // app3 reserves a container on node1 because node1's available resource
@@ -4228,7 +4336,8 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
 
     ApplicationAttemptId attId6 = createAppAttemptId(6, 1);
     createApplicationWithAMResource(attId6, "queue1", "user1", amResource6);
-    createSchedulingRequestExistingApplication(10240, 1, amPriority, attId6);
+    createSchedulingRequestExistingApplication(
+        RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE, 1, amPriority, attId6);
     FSAppAttempt app6 = scheduler.getSchedulerApp(attId6);
     scheduler.update();
     // app6 can't reserve a container on node1 because
@@ -4317,7 +4426,8 @@ public class TestFairScheduler extends 
FairSchedulerTestBase {
     // app6 turns the reservation into an allocation on node2.
     scheduler.handle(updateE2);
     assertEquals("Application6's AM requests 10240 MB memory",
-        10240, app6.getAMResource().getMemorySize());
+        RM_SCHEDULER_MAXIMUM_ALLOCATION_MB_VALUE,
+        app6.getAMResource().getMemorySize());
     assertEquals("Application6's AM should be running",
         1, app6.getLiveContainers().size());
     assertEquals("Queue1's AM resource usage should be 11264 MB memory",

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueue.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueue.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueue.java
index f1afe69..db81613 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueue.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueue.java
@@ -60,9 +60,11 @@ class AllocationFileQueue {
         () -> AllocationFileWriter
             .createNumberSupplier(properties.getFairSharePreemptionTimeout()));
     AllocationFileWriter.addIfPresent(pw, "fairSharePreemptionThreshold",
+        () -> AllocationFileWriter.createNumberSupplier(
+            properties.getFairSharePreemptionThreshold()));
+    AllocationFileWriter.addIfPresent(pw, "maxContainerAllocation",
         () -> AllocationFileWriter
-            .createNumberSupplier(
-                    properties.getFairSharePreemptionThreshold()));
+            .createNumberSupplier(properties.getMaxContainerAllocation()));
     printEndTag(pw);
     pw.close();
     return sw.toString();

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueBuilder.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueBuilder.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueBuilder.java
index a2faf1d..176024e 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueBuilder.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueBuilder.java
@@ -94,6 +94,12 @@ public abstract class AllocationFileQueueBuilder {
     return this;
   }
 
+  public AllocationFileQueueBuilder maxContainerAllocation(
+      String maxContainerAllocation) {
+    this.queuePropertiesBuilder.maxContainerAllocation(maxContainerAllocation);
+    return this;
+  }
+
   public AllocationFileQueueBuilder subQueue(String queueName) {
     if (this instanceof AllocationFileSimpleQueueBuilder) {
       return new AllocationFileSubQueueBuilder(

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueProperties.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueProperties.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueProperties.java
index 2c01144..0a0f330 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueProperties.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/allocationfile/AllocationFileQueueProperties.java
@@ -33,6 +33,7 @@ public class AllocationFileQueueProperties {
   private final String maxChildResources;
   private final Integer fairSharePreemptionTimeout;
   private final Double fairSharePreemptionThreshold;
+  private final String maxContainerAllocation;
 
   AllocationFileQueueProperties(Builder builder) {
     this.queueName = builder.queueName;
@@ -48,6 +49,7 @@ public class AllocationFileQueueProperties {
     this.maxChildResources = builder.maxChildResources;
     this.fairSharePreemptionTimeout = builder.fairSharePreemptionTimeout;
     this.fairSharePreemptionThreshold = builder.fairSharePreemptionThreshold;
+    this.maxContainerAllocation = builder.maxContainerAllocation;
   }
 
   public String getQueueName() {
@@ -102,6 +104,10 @@ public class AllocationFileQueueProperties {
     return fairSharePreemptionThreshold;
   }
 
+  public String getMaxContainerAllocation() {
+    return maxContainerAllocation;
+  }
+
   /**
    * Builder class for {@link AllocationFileQueueProperties}.
    */
@@ -119,6 +125,7 @@ public class AllocationFileQueueProperties {
     private String maxChildResources;
     private Integer fairSharePreemptionTimeout;
     private Double fairSharePreemptionThreshold;
+    private String maxContainerAllocation;
 
     Builder() {
     }
@@ -167,6 +174,11 @@ public class AllocationFileQueueProperties {
       return this;
     }
 
+    public Builder maxContainerAllocation(String maxContainerAllocation) {
+      this.maxContainerAllocation = maxContainerAllocation;
+      return this;
+    }
+
     public Builder minSharePreemptionTimeout(
         Integer minSharePreemptionTimeout) {
       this.minSharePreemptionTimeout = minSharePreemptionTimeout;

http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce4a0898/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/FairScheduler.md
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/FairScheduler.md
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/FairScheduler.md
index e253d0d..48251fb 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/FairScheduler.md
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/FairScheduler.md
@@ -92,6 +92,8 @@ The allocation file must be in XML format. The format 
contains five types of ele
 
     * **maxChildResources**: maximum resources an ad hoc child queue is 
allocated, expressed either in absolute values (X mb, Y vcores) or as a 
percentage of the cluster resources (X% memory, Y% cpu). An ad hoc child queue 
will not be assigned a container that would put its aggregate usage over this 
limit.
 
+    * **maxContainerAllocation**: maximum resources a queue can allocate for a 
single container, expressed in the form of "X mb, Y vcores" or "vcores=X, 
memory-mb=Y". The latter form is required when specifying resources other than 
memory and CPU. If the property is not set it's value is inherited from a 
parent queue. It's default value is **yarn.scheduler.maximum-allocation-mb**. 
Cannot be higher than **maxResources**. This property is invalid for root queue.
+
     * **maxRunningApps**: limit the number of apps from the queue to run at 
once
 
     * **maxAMShare**: limit the fraction of the queue's fair share that can be 
used to run application masters. This property can only be used for leaf 
queues. For example, if set to 1.0f, then AMs in the leaf queue can take up to 
100% of both the memory and CPU fair share. The value of -1.0f will disable 
this feature and the amShare will not be checked. The default value is 0.5f.


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to