浏览代码

YARN-9052. Replace all MockRM submit method definitions with a builder. Contributed by Szilard Nemeth.

Sunil G 5 年之前
父节点
当前提交
682e6fdeda
共有 88 个文件被更改,包括 4846 次插入1277 次删除
  1. 25 24
      hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/rm/TestRMContainerAllocator.java
  2. 4 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClientOnRMRestart.java
  3. 26 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java
  4. 29 12
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterServiceTestBase.java
  5. 11 439
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java
  6. 375 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRMAppSubmissionData.java
  7. 182 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRMAppSubmitter.java
  8. 8 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java
  9. 7 7
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationCleanup.java
  10. 5 5
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java
  11. 6 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterServiceCapacity.java
  12. 9 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterServiceFair.java
  13. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterServiceInterceptor.java
  14. 12 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestCapacitySchedulerMetrics.java
  15. 16 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java
  16. 16 5
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestContainerResourceUsage.java
  17. 3 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestDecommissioningNodesWatcher.java
  18. 21 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestKillApplicationWithRMHA.java
  19. 8 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestLeaderElectorService.java
  20. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestMoveApplication.java
  21. 33 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestNodeBlacklistingOnAMFailures.java
  22. 66 11
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestOpportunisticContainerAllocatorAMService.java
  23. 15 15
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRM.java
  24. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java
  25. 16 5
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHAForAsyncScheduler.java
  26. 2 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHATimelineCollectors.java
  27. 248 62
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMRestart.java
  28. 14 6
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java
  29. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestSignalContainer.java
  30. 98 33
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestSubmitApplicationWithRMHA.java
  31. 125 33
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestWorkPreservingRMRestart.java
  32. 14 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestWorkPreservingUnmanagedAM.java
  33. 2 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ahs/TestRMApplicationHistoryWriter.java
  34. 4 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCNodeUpdates.java
  35. 2 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCResponseId.java
  36. 90 20
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRestart.java
  37. 3 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/resource/TestResourceProfiles.java
  38. 32 6
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestApplicationLifetimeMonitor.java
  39. 4 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestNodesListManager.java
  40. 4 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/TestRMContainerImpl.java
  41. 73 15
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAbstractYarnScheduler.java
  42. 9 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerOvercommit.java
  43. 9 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java
  44. 16 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulingWithAllocationRequestId.java
  45. 66 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationLimits.java
  46. 212 24
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationLimitsByPartition.java
  47. 111 36
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationPriority.java
  48. 9 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCSAllocateCustomResource.java
  49. 288 40
      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
  50. 137 20
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAsyncScheduling.java
  51. 20 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java
  52. 29 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java
  53. 20 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerDynamicBehavior.java
  54. 110 12
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerLazyPreemption.java
  55. 48 6
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerMultiNodes.java
  56. 74 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNodeLabelUpdate.java
  57. 38 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerSchedulingRequestUpdate.java
  58. 182 20
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerSurgicalPreemption.java
  59. 9 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerWithMultiResourceTypes.java
  60. 48 20
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerWorkflowPriorityMapping.java
  61. 236 31
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java
  62. 92 10
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerResizing.java
  63. 38 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestIncreaseAllocationExpirer.java
  64. 405 45
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestNodeLabelContainerAllocation.java
  65. 11 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueState.java
  66. 100 17
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestSchedulingRequestContainerAllocation.java
  67. 11 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestSchedulingRequestContainerAllocationAsync.java
  68. 29 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestWorkPreservingRMRestartForNodeLabel.java
  69. 92 10
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/TestPlacementProcessor.java
  70. 10 2
      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
  71. 11 1
      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
  72. 6 5
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/TestFifoScheduler.java
  73. 38 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/TestFairOrderingPolicy.java
  74. 4 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestAMRMTokens.java
  75. 3 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestClientToAMTokens.java
  76. 97 19
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestDelegationTokenRenewer.java
  77. 36 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/volume/csi/TestVolumeProcessor.java
  78. 12 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServiceAppsNodelabel.java
  79. 30 8
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppAttempts.java
  80. 14 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppCustomResourceTypes.java
  81. 165 73
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesApps.java
  82. 14 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsCustomResourceTypes.java
  83. 62 10
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsModification.java
  84. 38 4
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java
  85. 4 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesContainers.java
  86. 10 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesForCSWithPartitions.java
  87. 180 22
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivities.java
  88. 51 7
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled.java

+ 25 - 24
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapreduce/v2/app/rm/TestRMContainerAllocator.java

@@ -130,6 +130,7 @@ import org.apache.hadoop.yarn.server.api.protocolrecords.NodeHeartbeatResponse;
 import org.apache.hadoop.yarn.server.api.records.NodeAction;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore;
@@ -189,7 +190,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -277,7 +278,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -358,7 +359,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -422,7 +423,7 @@ public class TestRMContainerAllocator {
     conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART, 0.0f);
     final MyResourceManager rm = new MyResourceManager(conf);
     rm.start();
-    final RMApp app = rm.submitApp(1024);
+    final RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     final String host = "host1";
@@ -478,7 +479,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -530,7 +531,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -594,7 +595,7 @@ public class TestRMContainerAllocator {
     rm.getMyFifoScheduler().forceResourceLimit(Resource.newInstance(8192, 8));
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -648,7 +649,7 @@ public class TestRMContainerAllocator {
     conf.setFloat(MRJobConfig.COMPLETED_MAPS_FOR_REDUCE_SLOWSTART, 0.0f);
     final MyResourceManager2 rm = new MyResourceManager2(conf);
     rm.start();
-    final RMApp app = rm.submitApp(2048);
+    final RMApp app = MockRMAppSubmitter.submitWithMemory(2048, rm);
     rm.drainEvents();
     final String host = "host1";
     final MockNM nm = rm.registerNode(String.format("%s:1234", host), 4096);
@@ -879,7 +880,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -1011,7 +1012,7 @@ public class TestRMContainerAllocator {
         .getDispatcher();
 
     // Submit the application
-    RMApp rmApp = rm.submitApp(1024);
+    RMApp rmApp = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 21504);
@@ -1163,7 +1164,7 @@ public class TestRMContainerAllocator {
         .getDispatcher();
 
     // Submit the application
-    RMApp rmApp = rm.submitApp(1024);
+    RMApp rmApp = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 11264);
@@ -1256,7 +1257,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
     amNodeManager.nodeHeartbeat(true);
@@ -1351,7 +1352,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -1460,7 +1461,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM[] nodeManagers = new MockNM[10];
@@ -1649,7 +1650,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -2322,7 +2323,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     // Make a node to register so as to launch the AM.
@@ -2496,7 +2497,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp rmApp = rm.submitApp(1024);
+    RMApp rmApp = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 11264);
@@ -2564,7 +2565,7 @@ public class TestRMContainerAllocator {
     rm1.start();
 
     // Submit the application
-    RMApp app = rm1.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     rm1.drainEvents();
 
     MockNM nm1 = new MockNM("h1:1234", 15120, rm1.getResourceTrackerService());
@@ -2817,7 +2818,7 @@ public class TestRMContainerAllocator {
     MyResourceManager rm1 = new MyResourceManager(conf);
     rm1.start();
 
-    RMApp app = rm1.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     rm1.drainEvents();
 
     MockNM nm1 = new MockNM("h1:1234", 15120, rm1.getResourceTrackerService());
@@ -2869,7 +2870,7 @@ public class TestRMContainerAllocator {
         rm.getRMContext().getAMRMTokenSecretManager();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -3141,7 +3142,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 2048);
@@ -3175,7 +3176,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 1260);
@@ -3346,7 +3347,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 1260);
@@ -3480,7 +3481,7 @@ public class TestRMContainerAllocator {
     rm.start();
 
     // Submit the application
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     rm.drainEvents();
 
     MockNM amNodeManager = rm.registerNode("amNM:1234", 1260);

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestAMRMClientOnRMRestart.java

@@ -58,6 +58,7 @@ import org.apache.hadoop.yarn.server.api.records.NodeAction;
 import org.apache.hadoop.yarn.server.resourcemanager.ApplicationMasterService;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.RMStateStore;
@@ -127,7 +128,7 @@ public class TestAMRMClientOnRMRestart {
     rm1.start();
 
     // Submit the application
-    RMApp app = rm1.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     rm1.drainEvents();
 
     MockNM nm1 = new MockNM("h1:1234", 15120, rm1.getResourceTrackerService());
@@ -356,7 +357,7 @@ public class TestAMRMClientOnRMRestart {
     rm1.start();
 
     // Submit the application
-    RMApp app = rm1.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     rm1.drainEvents();
 
     MockNM nm1 = new MockNM("h1:1234", 15120, rm1.getResourceTrackerService());
@@ -433,7 +434,7 @@ public class TestAMRMClientOnRMRestart {
     rm1.start();
     Long startTime = System.currentTimeMillis();
     // Submit the application
-    RMApp app = rm1.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     rm1.drainEvents();
 
     MockNM nm1 = new MockNM("h1:1234", 15120, rm1.getResourceTrackerService());

+ 26 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java

@@ -68,6 +68,8 @@ import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.server.MiniYARNCluster;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ParameterizedSchedulerTestBase;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -368,7 +370,7 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase {
   public void testKillApplication() throws Exception {
     MockRM rm = new MockRM();
     rm.start();
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     @SuppressWarnings("resource")
     final YarnClient client = new MockYarnClient();
@@ -385,11 +387,19 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase {
     GenericTestUtils.setRootLogLevel(Level.DEBUG);
     MockRM rm = new MockRM();
     rm.start();
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     RMApp app1 =
-        rm.submitApp(200, "name", "user",
-                new HashMap<>(), false, "default", -1,
-          null, "MAPREDUCE");
+        MockRMAppSubmitter.submit(rm,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+                .withAppName("name")
+                .withUser("user")
+                .withAcls(new HashMap<>())
+                .withUnmanagedAM(false)
+                .withQueue("default")
+                .withMaxAppAttempts(-1)
+                .withCredentials(null)
+                .withAppType("MAPREDUCE")
+                .build());
     Assert.assertEquals("YARN", app.getApplicationType());
     Assert.assertEquals("MAPREDUCE", app1.getApplicationType());
     rm.stop();
@@ -401,9 +411,17 @@ public class TestYarnClient extends ParameterizedSchedulerTestBase {
     MockRM rm = new MockRM();
     rm.start();
     RMApp app1 =
-        rm.submitApp(200, "name", "user",
-                new HashMap<>(), false, "default", -1,
-          null, "MAPREDUCE-LENGTH-IS-20");
+        MockRMAppSubmitter.submit(rm,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+                .withAppName("name")
+                .withUser("user")
+                .withAcls(new HashMap<>())
+                .withUnmanagedAM(false)
+                .withQueue("default")
+                .withMaxAppAttempts(-1)
+                .withCredentials(null)
+                .withAppType("MAPREDUCE-LENGTH-IS-20")
+                .build());
     Assert.assertEquals("MAPREDUCE-LENGTH-IS-", app1.getApplicationType());
     rm.stop();
   }

+ 29 - 12
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ApplicationMasterServiceTestBase.java

@@ -135,7 +135,7 @@ public abstract class ApplicationMasterServiceTestBase {
     MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -176,7 +176,7 @@ public abstract class ApplicationMasterServiceTestBase {
       MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
       // Submit an application
-      RMApp app1 = rm.submitApp(2048);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
       // kick off the scheduling
       nm1.nodeHeartbeat(true);
@@ -210,7 +210,7 @@ public abstract class ApplicationMasterServiceTestBase {
       MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
       // Submit an application
-      RMApp app1 = rm.submitApp(1024);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
       // kick the scheduling
       nm1.nodeHeartbeat(true);
@@ -231,7 +231,7 @@ public abstract class ApplicationMasterServiceTestBase {
 
       Assert.assertTrue(alloc1Response.getAllocatedContainers().size() > 0);
 
-      RMApp app2 = rm.submitApp(1024);
+      RMApp app2 = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
       nm1.nodeHeartbeat(true);
       RMAppAttempt attempt2 = app2.getCurrentAppAttempt();
@@ -265,7 +265,7 @@ public abstract class ApplicationMasterServiceTestBase {
     MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -330,7 +330,7 @@ public abstract class ApplicationMasterServiceTestBase {
       // Register node1
       MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
       // Submit an application
-      RMApp app1 = rm.submitApp(2048);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
       MockAM am1 = MockRM.launchAM(app1, rm, nm1);
       FinishApplicationMasterRequest req =
           FinishApplicationMasterRequest.newInstance(
@@ -374,7 +374,8 @@ public abstract class ApplicationMasterServiceTestBase {
       // Register node1
       MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
       // Submit an application
-      RMApp app1 = rm.submitApp(2048);
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(2048, rm).build());
       MockAM am1 = MockRM.launchAM(app1, rm, nm1);
       am1.registerAppAttempt();
       FinishApplicationMasterRequest req = FinishApplicationMasterRequest
@@ -449,7 +450,7 @@ public abstract class ApplicationMasterServiceTestBase {
       MockRM rm = new MockRM(entry.getKey());
       rm.start();
       MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
-      RMApp app1 = rm.submitApp(2048);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
       //Wait to make sure the attempt has the right state
       //TODO explore a better way than sleeping for a while (YARN-4929)
       Thread.sleep(1000);
@@ -473,7 +474,7 @@ public abstract class ApplicationMasterServiceTestBase {
     MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -504,7 +505,7 @@ public abstract class ApplicationMasterServiceTestBase {
     // Register node1
     MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -554,7 +555,15 @@ public abstract class ApplicationMasterServiceTestBase {
         .createResource(DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
             DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES, null));
 
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, getDefaultQueueName());
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue(getDefaultQueueName())
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // Now request resource, memory > allowed
@@ -611,7 +620,15 @@ public abstract class ApplicationMasterServiceTestBase {
             DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES,
             ImmutableMap.of(CUSTOM_RES, 4)));
 
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, getDefaultQueueName());
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue(getDefaultQueueName())
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     Assert.assertEquals(Resource.newInstance(GB, 1),

+ 11 - 439
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRM.java

@@ -18,24 +18,10 @@
 
 package org.apache.hadoop.yarn.server.resourcemanager;
 
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.security.PrivilegedExceptionAction;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.io.DataOutputBuffer;
-import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
-import org.apache.hadoop.security.Credentials;
-import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.security.token.Token;
+import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.hadoop.yarn.api.ApplicationClientProtocol;
 import org.apache.hadoop.yarn.api.protocolrecords.FailApplicationAttemptRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.FailApplicationAttemptResponse;
@@ -48,25 +34,16 @@ import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.KillApplicationResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.ReservationUpdateRequest;
 import org.apache.hadoop.yarn.api.protocolrecords.SignalContainerRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
-import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse;
-import org.apache.hadoop.yarn.api.records.ApplicationAccessType;
 import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
 import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.ApplicationReport;
-import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
-import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType;
 import org.apache.hadoop.yarn.api.records.ContainerId;
-import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
 import org.apache.hadoop.yarn.api.records.ContainerState;
 import org.apache.hadoop.yarn.api.records.ContainerStatus;
 import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
-import org.apache.hadoop.yarn.api.records.LogAggregationContext;
 import org.apache.hadoop.yarn.api.records.NodeId;
 import org.apache.hadoop.yarn.api.records.NodeState;
-import org.apache.hadoop.yarn.api.records.Priority;
 import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.hadoop.yarn.api.records.ResourceRequest;
 import org.apache.hadoop.yarn.api.records.SignalContainerCommand;
 import org.apache.hadoop.yarn.api.resource.PlacementConstraint;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
@@ -112,10 +89,18 @@ import org.apache.hadoop.yarn.server.resourcemanager.security.RMContainerTokenSe
 import org.apache.hadoop.yarn.util.Records;
 import org.apache.hadoop.yarn.util.YarnVersionInfo;
 import org.apache.hadoop.yarn.util.resource.ResourceUtils;
-import org.slf4j.event.Level;
+import org.junit.Assert;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.junit.Assert;
+import org.slf4j.event.Level;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 @SuppressWarnings("unchecked")
@@ -514,408 +499,6 @@ public class MockRM extends ResourceManager {
         .newRecord(GetNewApplicationRequest.class));
   }
 
-  public RMApp submitApp(int masterMemory) throws Exception {
-    return submitApp(masterMemory, false);
-  }
-
-  public RMApp submitApp(int masterMemory, String queue) throws Exception {
-    return submitApp(masterMemory, "",
-        UserGroupInformation.getCurrentUser().getShortUserName(), null, false,
-        queue, super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS),
-        null);
-  }
-
-  public RMApp submitApp(int masterMemory, Set<String> appTags)
-      throws Exception {
-    return submitApp(masterMemory, null, false, null, Priority.newInstance(0),
-        appTags);
-  }
-
-  public RMApp submitApp(int masterMemory, String queue,
-      boolean isAppIdProvided, ApplicationId appId, Priority priority,
-      Set<String> appTags) throws Exception {
-    Resource resource = Resource.newInstance(masterMemory, 0);
-    ResourceRequest amResourceRequest = ResourceRequest.newInstance(
-        Priority.newInstance(0), ResourceRequest.ANY, resource, 1);
-    return submitApp(Collections.singletonList(amResourceRequest), "",
-        UserGroupInformation.getCurrentUser().getShortUserName(), null, false,
-        queue, super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true,
-        false, isAppIdProvided, appId, 0, null, true, priority, null,
-        null, null, appTags);
-  }
-
-  public RMApp submitApp(int masterMemory, Priority priority) throws Exception {
-    Resource resource = Resource.newInstance(masterMemory, 0);
-    return submitApp(resource, "", UserGroupInformation.getCurrentUser()
-        .getShortUserName(), null, false, null,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true,
-        false, false, null, 0, null, true, priority);
-  }
-
-  public RMApp submitApp(int masterMemory, Priority priority,
-      Credentials cred, ByteBuffer tokensConf) throws Exception {
-    Resource resource = Resource.newInstance(masterMemory, 0);
-    return submitApp(resource, "", UserGroupInformation.getCurrentUser()
-        .getShortUserName(), null, false, null,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), cred, null, true,
-        false, false, null, 0, null, true, priority, null, null,
-        tokensConf);
-  }
-
-  public RMApp submitApp(int masterMemory, boolean unmanaged)
-      throws Exception {
-    return submitApp(masterMemory, "", UserGroupInformation.getCurrentUser()
-        .getShortUserName(), unmanaged);
-  }
-
-  // client
-  public RMApp submitApp(int masterMemory, String name, String user) throws Exception {
-    return submitApp(masterMemory, name, user, false);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      boolean unmanaged)
-      throws Exception {
-    return submitApp(masterMemory, name, user, null, unmanaged, null,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls) throws Exception {
-    return submitApp(masterMemory, name, user, acls, false, null,
-      super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null);
-  }  
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, String queue) throws Exception {
-    return submitApp(masterMemory, name, user, acls, false, queue,
-      super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, String queue, String amLabel)
-      throws Exception {
-    Resource resource = Records.newRecord(Resource.class);
-    resource.setMemorySize(masterMemory);
-    Priority priority = Priority.newInstance(0);
-    return submitApp(resource, name, user, acls, false, queue,
-      super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-      YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true, false,
-        false, null, 0, null, true, priority, amLabel, null, null);
-  }
-
-  public RMApp submitApp(Resource resource, String name, String user,
-      Map<ApplicationAccessType, String> acls, String queue) throws Exception {
-    return submitApp(resource, name, user, acls, false, queue,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-          YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-          true, false, false, null, 0, null, true, null);
-  }
-
-  public RMApp submitApp(Resource resource, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unManaged, String queue)
-      throws Exception {
-    return submitApp(resource, name, user, acls, unManaged, queue,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true,
-        false, false, null, 0, null, true, null);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, String queue, 
-      boolean waitForAccepted) throws Exception {
-    return submitApp(masterMemory, name, user, acls, false, queue,
-      super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-        waitForAccepted);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts) throws Exception {
-    return submitApp(masterMemory, name, user, acls, unmanaged, queue,
-      maxAppAttempts, ts, null);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts, String appType) throws Exception {
-    return submitApp(masterMemory, name, user, acls, unmanaged, queue,
-      maxAppAttempts, ts, appType, true);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted)
-      throws Exception {
-    return submitApp(masterMemory, name, user, acls, unmanaged, queue,
-      maxAppAttempts, ts, appType, waitForAccepted, false);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers) throws Exception {
-    Resource resource = Records.newRecord(Resource.class);
-    resource.setMemorySize(masterMemory);
-    return submitApp(resource, name, user, acls, unmanaged, queue,
-        maxAppAttempts, ts, appType, waitForAccepted, keepContainers,
-        false, null, 0, null, true, Priority.newInstance(0));
-  }
-
-  public RMApp submitApp(int masterMemory, long attemptFailuresValidityInterval,
-      boolean keepContainers) throws Exception {
-    Resource resource = Records.newRecord(Resource.class);
-    resource.setMemorySize(masterMemory);
-    Priority priority = Priority.newInstance(0);
-    return submitApp(resource, "", UserGroupInformation.getCurrentUser()
-      .getShortUserName(), null, false, null,
-      super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-      YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true, keepContainers,
-      false, null, attemptFailuresValidityInterval, null, true, priority);
-  }
-
-  public RMApp submitApp(int masterMemory, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers, boolean isAppIdProvided,
-      ApplicationId applicationId) throws Exception {
-    Resource resource = Records.newRecord(Resource.class);
-    resource.setMemorySize(masterMemory);
-    Priority priority = Priority.newInstance(0);
-    return submitApp(resource, name, user, acls, unmanaged, queue,
-      maxAppAttempts, ts, appType, waitForAccepted, keepContainers,
-      isAppIdProvided, applicationId, 0, null, true, priority);
-  }
-
-  public RMApp submitApp(int masterMemory,
-      LogAggregationContext logAggregationContext) throws Exception {
-    Resource resource = Records.newRecord(Resource.class);
-    resource.setMemorySize(masterMemory);
-    Priority priority = Priority.newInstance(0);
-    return submitApp(resource, "", UserGroupInformation.getCurrentUser()
-      .getShortUserName(), null, false, null,
-      super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-      YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true, false,
-      false, null, 0, logAggregationContext, true, priority);
-   }
-
-  public RMApp submitApp(Resource capability, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers, boolean isAppIdProvided,
-      ApplicationId applicationId, long attemptFailuresValidityInterval,
-      LogAggregationContext logAggregationContext,
-      boolean cancelTokensWhenComplete, Priority priority) throws Exception {
-    return submitApp(capability, name, user, acls, unmanaged, queue,
-      maxAppAttempts, ts, appType, waitForAccepted, keepContainers,
-      isAppIdProvided, applicationId, attemptFailuresValidityInterval,
-        logAggregationContext, cancelTokensWhenComplete, priority, "", null,
-        null);
-  }
-
-  public RMApp submitApp(Credentials cred, ByteBuffer tokensConf)
-      throws Exception {
-    return submitApp(Resource.newInstance(200, 1), "app1", "user", null, false,
-        null, super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), cred, null, true,
-        false, false, null, 0, null, true, Priority.newInstance(0), null, null,
-        tokensConf);
-  }
-
-  public RMApp submitApp(List<ResourceRequest> amResourceRequests)
-      throws Exception {
-    return submitApp(amResourceRequests, "app1",
-        "user", null, false, null,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true,
-        false, false, null, 0, null, true,
-        amResourceRequests.get(0).getPriority(),
-        amResourceRequests.get(0).getNodeLabelExpression(), null, null);
-  }
-
-  public RMApp submitApp(List<ResourceRequest> amResourceRequests,
-      String appNodeLabel) throws Exception {
-    return submitApp(amResourceRequests, "app1", "user", null, false, null,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true,
-        false, false, null, 0, null, true,
-        amResourceRequests.get(0).getPriority(),
-        amResourceRequests.get(0).getNodeLabelExpression(), null, null, null,
-        appNodeLabel);
-  }
-
-  public RMApp submitApp(Resource capability, String name, String user,
-      Map<ApplicationAccessType, String> acls, boolean unmanaged, String queue,
-      int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers, boolean isAppIdProvided,
-      ApplicationId applicationId, long attemptFailuresValidityInterval,
-      LogAggregationContext logAggregationContext,
-      boolean cancelTokensWhenComplete, Priority priority, String amLabel,
-      Map<ApplicationTimeoutType, Long> applicationTimeouts,
-      ByteBuffer tokensConf)
-      throws Exception {
-    priority = (priority == null) ? Priority.newInstance(0) : priority;
-    ResourceRequest amResourceRequest = ResourceRequest.newInstance(
-        priority, ResourceRequest.ANY, capability, 1);
-    if (amLabel != null && !amLabel.isEmpty()) {
-      amResourceRequest.setNodeLabelExpression(amLabel.trim());
-    }
-    return submitApp(Collections.singletonList(amResourceRequest), name, user,
-        acls, unmanaged, queue, maxAppAttempts, ts, appType, waitForAccepted,
-        keepContainers, isAppIdProvided, applicationId,
-        attemptFailuresValidityInterval, logAggregationContext,
-        cancelTokensWhenComplete, priority, amLabel, applicationTimeouts,
-        tokensConf);
-  }
-
-  public RMApp submitApp(List<ResourceRequest> amResourceRequests, String name,
-      String user, Map<ApplicationAccessType, String> acls, boolean unmanaged,
-      String queue, int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers, boolean isAppIdProvided,
-      ApplicationId applicationId, long attemptFailuresValidityInterval,
-      LogAggregationContext logAggregationContext,
-      boolean cancelTokensWhenComplete, Priority priority, String amLabel,
-      Map<ApplicationTimeoutType, Long> applicationTimeouts,
-      ByteBuffer tokensConf) throws Exception {
-    return submitApp(amResourceRequests, name, user, acls, unmanaged, queue,
-        maxAppAttempts, ts, appType, waitForAccepted, keepContainers,
-        isAppIdProvided, applicationId, attemptFailuresValidityInterval,
-        logAggregationContext, cancelTokensWhenComplete, priority, amLabel,
-        applicationTimeouts, tokensConf, null);
-  }
-
-  public RMApp submitApp(List<ResourceRequest> amResourceRequests, String name,
-      String user, Map<ApplicationAccessType, String> acls, boolean unmanaged,
-      String queue, int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers, boolean isAppIdProvided,
-      ApplicationId applicationId, long attemptFailuresValidityInterval,
-      LogAggregationContext logAggregationContext,
-      boolean cancelTokensWhenComplete, Priority priority, String amLabel,
-      Map<ApplicationTimeoutType, Long> applicationTimeouts,
-      ByteBuffer tokensConf, Set<String> applicationTags) throws Exception {
-    return submitApp(amResourceRequests, name, user, acls, unmanaged, queue,
-        maxAppAttempts, ts, appType, waitForAccepted, keepContainers,
-        isAppIdProvided, applicationId, attemptFailuresValidityInterval,
-        logAggregationContext, cancelTokensWhenComplete, priority, amLabel,
-        applicationTimeouts, tokensConf, applicationTags, null);
-  }
-
-  public RMApp submitApp(List<ResourceRequest> amResourceRequests, String name,
-      String user, Map<ApplicationAccessType, String> acls, boolean unmanaged,
-      String queue, int maxAppAttempts, Credentials ts, String appType,
-      boolean waitForAccepted, boolean keepContainers, boolean isAppIdProvided,
-      ApplicationId applicationId, long attemptFailuresValidityInterval,
-      LogAggregationContext logAggregationContext,
-      boolean cancelTokensWhenComplete, Priority priority, String amLabel,
-      Map<ApplicationTimeoutType, Long> applicationTimeouts,
-      ByteBuffer tokensConf, Set<String> applicationTags, String appNodeLabel)
-      throws Exception {
-    ApplicationId appId = isAppIdProvided ? applicationId : null;
-    ApplicationClientProtocol client = getClientRMService();
-    if (! isAppIdProvided) {
-      GetNewApplicationResponse resp = client.getNewApplication(Records
-          .newRecord(GetNewApplicationRequest.class));
-      appId = resp.getApplicationId();
-    }
-    SubmitApplicationRequest req = Records
-        .newRecord(SubmitApplicationRequest.class);
-    ApplicationSubmissionContext sub = Records
-        .newRecord(ApplicationSubmissionContext.class);
-    sub.setKeepContainersAcrossApplicationAttempts(keepContainers);
-    sub.setApplicationId(appId);
-    sub.setApplicationName(name);
-    sub.setMaxAppAttempts(maxAppAttempts);
-    if (applicationTags != null) {
-      sub.setApplicationTags(applicationTags);
-    }
-    if (applicationTimeouts != null && applicationTimeouts.size() > 0) {
-      sub.setApplicationTimeouts(applicationTimeouts);
-    }
-    if (unmanaged) {
-      sub.setUnmanagedAM(true);
-    }
-    if (queue != null) {
-      sub.setQueue(queue);
-    }
-    if (priority != null) {
-      sub.setPriority(priority);
-    }
-    if (appNodeLabel != null) {
-      sub.setNodeLabelExpression(appNodeLabel);
-    }
-    sub.setApplicationType(appType);
-    ContainerLaunchContext clc = Records
-        .newRecord(ContainerLaunchContext.class);
-    clc.setApplicationACLs(acls);
-    if (ts != null && UserGroupInformation.isSecurityEnabled()) {
-      DataOutputBuffer dob = new DataOutputBuffer();
-      ts.writeTokenStorageToStream(dob);
-      ByteBuffer securityTokens = ByteBuffer.wrap(dob.getData(), 0, dob.getLength());
-      clc.setTokens(securityTokens);
-      clc.setTokensConf(tokensConf);
-    }
-    sub.setAMContainerSpec(clc);
-    sub.setAttemptFailuresValidityInterval(attemptFailuresValidityInterval);
-    if (logAggregationContext != null) {
-      sub.setLogAggregationContext(logAggregationContext);
-    }
-    sub.setCancelTokensWhenComplete(cancelTokensWhenComplete);
-    if (amLabel != null && !amLabel.isEmpty()) {
-      for (ResourceRequest amResourceRequest : amResourceRequests) {
-        amResourceRequest.setNodeLabelExpression(amLabel.trim());
-      }
-    }
-    sub.setAMContainerResourceRequests(amResourceRequests);
-    req.setApplicationSubmissionContext(sub);
-    UserGroupInformation fakeUser =
-      UserGroupInformation.createUserForTesting(user, new String[] {"someGroup"});
-    PrivilegedExceptionAction<SubmitApplicationResponse> action =
-      new PrivilegedExceptionAction<SubmitApplicationResponse>() {
-      ApplicationClientProtocol client;
-      SubmitApplicationRequest req;
-      @Override
-      public SubmitApplicationResponse run() throws IOException, YarnException {
-        try {
-          return client.submitApplication(req);
-        } catch (YarnException | IOException e) {
-          e.printStackTrace();
-          throw  e;
-        }
-      }
-      PrivilegedExceptionAction<SubmitApplicationResponse> setClientReq(
-        ApplicationClientProtocol client, SubmitApplicationRequest req) {
-        this.client = client;
-        this.req = req;
-        return this;
-      }
-    }.setClientReq(client, req);
-    fakeUser.doAs(action);
-    // make sure app is immediately available after submit
-    if (waitForAccepted) {
-      waitForState(appId, RMAppState.ACCEPTED);
-    }
-    RMApp rmApp = getRMContext().getRMApps().get(appId);
-
-    // unmanaged AM won't go to RMAppAttemptState.SCHEDULED.
-    if (waitForAccepted && !unmanaged) {
-      waitForState(rmApp.getCurrentAppAttempt().getAppAttemptId(),
-          RMAppAttemptState.SCHEDULED);
-    }
-
-    ((AbstractYarnScheduler)getResourceScheduler()).update();
-
-    return rmApp;
-  }
-
   public MockNM unRegisterNode(MockNM nm) throws Exception {
     nm.unRegisterNode();
     drainEventsImplicitly();
@@ -1424,17 +1007,6 @@ public class MockRM extends ResourceManager {
     disableDrainEventsImplicitly = false;
   }
 
-  public RMApp submitApp(int masterMemory, Priority priority,
-      Map<ApplicationTimeoutType, Long> applicationTimeouts) throws Exception {
-    Resource resource = Resource.newInstance(masterMemory, 0);
-    return submitApp(
-        resource, "", UserGroupInformation.getCurrentUser().getShortUserName(),
-        null, false, null,
-        super.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, true,
-        false, false, null, 0, null, true, priority, null, applicationTimeouts,
-        null);
-  }
 
   @Override
   protected void serviceInit(Configuration conf) throws Exception {

+ 375 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRMAppSubmissionData.java

@@ -0,0 +1,375 @@
+/*
+ * 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;
+
+import org.apache.hadoop.security.Credentials;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.yarn.api.records.ApplicationAccessType;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType;
+import org.apache.hadoop.yarn.api.records.LogAggregationContext;
+import org.apache.hadoop.yarn.api.records.Priority;
+import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.api.records.ResourceRequest;
+import org.apache.hadoop.yarn.conf.YarnConfiguration;
+import org.apache.hadoop.yarn.util.Records;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * This class holds all data fields to submit an RM Application.
+ * Use the {@link Builder} class to compile necessary data for app submission.
+ */
+public final class MockRMAppSubmissionData {
+  private final List<ResourceRequest> amResourceRequests;
+  private final String name;
+  private final String user;
+  private final Map<ApplicationAccessType, String> acls;
+  private final boolean unmanaged;
+  private final String queue;
+  private final int maxAppAttempts;
+  private final String appType;
+  private final boolean waitForAccepted;
+  private final boolean keepContainers;
+  private final boolean isAppIdProvided;
+  private final ApplicationId applicationId;
+  private final long attemptFailuresValidityInterval;
+  private final LogAggregationContext logAggregationContext;
+  private final boolean cancelTokensWhenComplete;
+  private final Priority priority;
+  private final String amLabel;
+  private final Map<ApplicationTimeoutType, Long> applicationTimeouts;
+  private final ByteBuffer tokensConf;
+  private final Set<String> applicationTags;
+  private final String appNodeLabel;
+  private final Credentials credentials;
+  private final Resource resource;
+
+  public List<ResourceRequest> getAmResourceRequests() {
+    return amResourceRequests;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public String getUser() {
+    return user;
+  }
+
+  public Map<ApplicationAccessType, String> getAcls() {
+    return acls;
+  }
+
+  public boolean isUnmanaged() {
+    return unmanaged;
+  }
+
+  public String getQueue() {
+    return queue;
+  }
+
+  public int getMaxAppAttempts() {
+    return maxAppAttempts;
+  }
+
+  public String getAppType() {
+    return appType;
+  }
+
+  public boolean isWaitForAccepted() {
+    return waitForAccepted;
+  }
+
+  public boolean isKeepContainers() {
+    return keepContainers;
+  }
+
+  public boolean isAppIdProvided() {
+    return isAppIdProvided;
+  }
+
+  public ApplicationId getApplicationId() {
+    return applicationId;
+  }
+
+  public long getAttemptFailuresValidityInterval() {
+    return attemptFailuresValidityInterval;
+  }
+
+  public LogAggregationContext getLogAggregationContext() {
+    return logAggregationContext;
+  }
+
+  public boolean isCancelTokensWhenComplete() {
+    return cancelTokensWhenComplete;
+  }
+
+  public Priority getPriority() {
+    return priority;
+  }
+
+  public String getAmLabel() {
+    return amLabel;
+  }
+
+  public Map<ApplicationTimeoutType, Long> getApplicationTimeouts() {
+    return applicationTimeouts;
+  }
+
+  public ByteBuffer getTokensConf() {
+    return tokensConf;
+  }
+
+  public Set<String> getApplicationTags() {
+    return applicationTags;
+  }
+
+  public String getAppNodeLabel() {
+    return appNodeLabel;
+  }
+
+  public Credentials getCredentials() {
+    return credentials;
+  }
+
+  public Resource getResource() {
+    return resource;
+  }
+
+  private MockRMAppSubmissionData(Builder builder) {
+    this.amLabel = builder.amLabel;
+    this.tokensConf = builder.tokensConf;
+    this.maxAppAttempts = builder.maxAppAttempts;
+    this.logAggregationContext = builder.logAggregationContext;
+    this.queue = builder.queue;
+    this.amResourceRequests = builder.amResourceRequests;
+    this.user = builder.user;
+    this.priority = builder.priority;
+    this.waitForAccepted = builder.waitForAccepted;
+    this.keepContainers = builder.keepContainers;
+    this.name = builder.name;
+    this.applicationId = builder.applicationId;
+    this.attemptFailuresValidityInterval =
+        builder.attemptFailuresValidityInterval;
+    this.acls = builder.acls;
+    this.appType = builder.appType;
+    this.appNodeLabel = builder.appNodeLabel;
+    this.isAppIdProvided = builder.isAppIdProvided;
+    this.unmanaged = builder.unmanaged;
+    this.applicationTags = builder.applicationTags;
+    this.cancelTokensWhenComplete = builder.cancelTokensWhenComplete;
+    this.applicationTimeouts = builder.applicationTimeouts;
+    this.credentials = builder.credentials;
+    this.resource = builder.resource;
+  }
+
+  /**
+   * Tests should use this class to prepare all data required to submit an app.
+   */
+  public static final class Builder {
+    private List<ResourceRequest> amResourceRequests;
+    private String name;
+    private String user;
+    private Map<ApplicationAccessType, String> acls;
+    private boolean unmanaged;
+    private String queue;
+    private int maxAppAttempts;
+    private String appType;
+    private boolean waitForAccepted;
+    private boolean keepContainers;
+    private boolean isAppIdProvided;
+    private ApplicationId applicationId;
+    private long attemptFailuresValidityInterval;
+    private LogAggregationContext logAggregationContext;
+    private boolean cancelTokensWhenComplete;
+    private Priority priority;
+    private String amLabel;
+    private Map<ApplicationTimeoutType, Long> applicationTimeouts;
+    private ByteBuffer tokensConf;
+    private Set<String> applicationTags;
+    private String appNodeLabel;
+    private Credentials credentials;
+    private Resource resource;
+
+    private Builder() {
+    }
+
+    public static Builder create() {
+      return new Builder();
+    }
+
+    public static Builder createWithMemory(long memory, MockRM mockRM)
+        throws IOException {
+      Resource resource = Records.newRecord(Resource.class);
+      resource.setMemorySize(memory);
+      return createWithResource(resource, mockRM);
+    }
+
+    public static Builder createWithResource(Resource resource, MockRM mockRM)
+        throws IOException {
+      int maxAppAttempts =
+          mockRM.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+              YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS);
+      return MockRMAppSubmissionData.Builder.create()
+          .withResource(resource)
+          .withAppName("")
+          .withUser(UserGroupInformation
+              .getCurrentUser().getShortUserName())
+          .withAcls(null)
+          .withUnmanagedAM(false)
+          .withQueue(null)
+          .withMaxAppAttempts(maxAppAttempts)
+          .withCredentials(null)
+          .withAppType(null)
+          .withWaitForAppAcceptedState(true)
+          .withKeepContainers(false)
+          .withApplicationId(null)
+          .withAttemptFailuresValidityInterval(0L)
+          .withLogAggregationContext(null)
+          .withCancelTokensWhenComplete(true)
+          .withAppPriority(Priority.newInstance(0))
+          .withAmLabel("")
+          .withApplicationTimeouts(null)
+          .withTokensConf(null);
+    }
+
+    public Builder withAmResourceRequests(
+        List<ResourceRequest> amResourceRequests) {
+      this.amResourceRequests = amResourceRequests;
+      return this;
+    }
+
+    public Builder withAppName(String name) {
+      this.name = name;
+      return this;
+    }
+
+    public Builder withUser(String user) {
+      this.user = user;
+      return this;
+    }
+
+    public Builder withAcls(Map<ApplicationAccessType, String> acls) {
+      this.acls = acls;
+      return this;
+    }
+
+    public Builder withUnmanagedAM(boolean unmanaged) {
+      this.unmanaged = unmanaged;
+      return this;
+    }
+
+    public Builder withQueue(String queue) {
+      this.queue = queue;
+      return this;
+    }
+
+    public Builder withMaxAppAttempts(int maxAppAttempts) {
+      this.maxAppAttempts = maxAppAttempts;
+      return this;
+    }
+
+    public Builder withAppType(String appType) {
+      this.appType = appType;
+      return this;
+    }
+
+    public Builder withWaitForAppAcceptedState(boolean waitForAccepted) {
+      this.waitForAccepted = waitForAccepted;
+      return this;
+    }
+
+    public Builder withKeepContainers(boolean keepContainers) {
+      this.keepContainers = keepContainers;
+      return this;
+    }
+
+    public Builder withApplicationId(ApplicationId applicationId) {
+      this.applicationId = applicationId;
+      this.isAppIdProvided = applicationId != null;
+      return this;
+    }
+
+    public Builder withAttemptFailuresValidityInterval(
+        long attemptFailuresValidityInterval) {
+      this.attemptFailuresValidityInterval = attemptFailuresValidityInterval;
+      return this;
+    }
+
+    public Builder withLogAggregationContext(
+        LogAggregationContext logAggregationContext) {
+      this.logAggregationContext = logAggregationContext;
+      return this;
+    }
+
+    public Builder withCancelTokensWhenComplete(
+        boolean cancelTokensWhenComplete) {
+      this.cancelTokensWhenComplete = cancelTokensWhenComplete;
+      return this;
+    }
+
+    public Builder withAppPriority(Priority priority) {
+      this.priority = priority;
+      return this;
+    }
+
+    public Builder withAmLabel(String amLabel) {
+      this.amLabel = amLabel;
+      return this;
+    }
+
+    public Builder withApplicationTimeouts(
+        Map<ApplicationTimeoutType, Long> applicationTimeouts) {
+      this.applicationTimeouts = applicationTimeouts;
+      return this;
+    }
+
+    public Builder withTokensConf(ByteBuffer tokensConf) {
+      this.tokensConf = tokensConf;
+      return this;
+    }
+
+    public Builder withApplicationTags(Set<String> applicationTags) {
+      this.applicationTags = applicationTags;
+      return this;
+    }
+
+    public Builder withAppNodeLabel(String appNodeLabel) {
+      this.appNodeLabel = appNodeLabel;
+      return this;
+    }
+
+    public Builder withCredentials(Credentials cred) {
+      this.credentials = cred;
+      return this;
+    }
+
+    public Builder withResource(Resource resource) {
+      this.resource = resource;
+      return this;
+    }
+
+    public MockRMAppSubmissionData build() {
+      return new MockRMAppSubmissionData(this);
+    }
+  }
+}

+ 182 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/MockRMAppSubmitter.java

@@ -0,0 +1,182 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.security.PrivilegedExceptionAction;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.hadoop.io.DataOutputBuffer;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.yarn.api.ApplicationClientProtocol;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationResponse;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationRequest;
+import org.apache.hadoop.yarn.api.protocolrecords.SubmitApplicationResponse;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
+import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
+import org.apache.hadoop.yarn.api.records.Priority;
+import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.api.records.ResourceRequest;
+import org.apache.hadoop.yarn.exceptions.YarnException;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.AbstractYarnScheduler;
+import org.apache.hadoop.yarn.util.Records;
+
+/**
+ * This class can submit an application to {@link MockRM}.
+ */
+public class MockRMAppSubmitter {
+
+  public static RMApp submitWithMemory(long memory, MockRM mockRM)
+      throws Exception {
+    Resource resource = Records.newRecord(Resource.class);
+    resource.setMemorySize(memory);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithResource(resource, mockRM).build();
+    return MockRMAppSubmitter.submit(mockRM, data);
+  }
+
+  public static RMApp submit(MockRM mockRM, MockRMAppSubmissionData data)
+      throws Exception {
+    ApplicationId appId =
+        data.isAppIdProvided() ? data.getApplicationId() : null;
+    ApplicationClientProtocol client = mockRM.getClientRMService();
+    if (!data.isAppIdProvided()) {
+      GetNewApplicationResponse resp = client.getNewApplication(Records
+          .newRecord(GetNewApplicationRequest.class));
+      appId = resp.getApplicationId();
+    }
+    SubmitApplicationRequest req = Records
+        .newRecord(SubmitApplicationRequest.class);
+    ApplicationSubmissionContext sub = Records
+        .newRecord(ApplicationSubmissionContext.class);
+    sub.setKeepContainersAcrossApplicationAttempts(data.isKeepContainers());
+    sub.setApplicationId(appId);
+    sub.setApplicationName(data.getName());
+    sub.setMaxAppAttempts(data.getMaxAppAttempts());
+    if (data.getApplicationTags() != null) {
+      sub.setApplicationTags(data.getApplicationTags());
+    }
+    if (data.getApplicationTimeouts() != null
+        && data.getApplicationTimeouts().size() > 0) {
+      sub.setApplicationTimeouts(data.getApplicationTimeouts());
+    }
+    if (data.isUnmanaged()) {
+      sub.setUnmanagedAM(true);
+    }
+    if (data.getQueue() != null) {
+      sub.setQueue(data.getQueue());
+    }
+    if (data.getPriority() != null) {
+      sub.setPriority(data.getPriority());
+    }
+    if (data.getAppNodeLabel() != null) {
+      sub.setNodeLabelExpression(data.getAppNodeLabel());
+    }
+    sub.setApplicationType(data.getAppType());
+    ContainerLaunchContext clc = Records
+        .newRecord(ContainerLaunchContext.class);
+    clc.setApplicationACLs(data.getAcls());
+    if (data.getCredentials() != null
+        && UserGroupInformation.isSecurityEnabled()) {
+      DataOutputBuffer dob = new DataOutputBuffer();
+      data.getCredentials().writeTokenStorageToStream(dob);
+      ByteBuffer securityTokens =
+          ByteBuffer.wrap(dob.getData(), 0, dob.getLength());
+      clc.setTokens(securityTokens);
+      clc.setTokensConf(data.getTokensConf());
+    }
+    sub.setAMContainerSpec(clc);
+    sub.setAttemptFailuresValidityInterval(
+        data.getAttemptFailuresValidityInterval());
+    if (data.getLogAggregationContext() != null) {
+      sub.setLogAggregationContext(data.getLogAggregationContext());
+    }
+    sub.setCancelTokensWhenComplete(data.isCancelTokensWhenComplete());
+
+    Priority priority = data.getPriority();
+    if (priority == null) {
+      priority = Priority.newInstance(0);
+    }
+
+    List<ResourceRequest> amResourceRequests = data.getAmResourceRequests();
+    if (amResourceRequests == null || amResourceRequests.isEmpty()) {
+      ResourceRequest amResReq = ResourceRequest.newInstance(
+          priority, ResourceRequest.ANY, data.getResource(), 1);
+      amResourceRequests = Collections.singletonList(amResReq);
+    }
+
+    if (data.getAmLabel() != null && !data.getAmLabel().isEmpty()) {
+      for (ResourceRequest amResourceRequest : amResourceRequests) {
+        amResourceRequest.setNodeLabelExpression(data.getAmLabel().trim());
+      }
+    }
+    sub.setAMContainerResourceRequests(amResourceRequests);
+
+    req.setApplicationSubmissionContext(sub);
+    UserGroupInformation fakeUser = UserGroupInformation
+        .createUserForTesting(data.getUser(), new String[] { "someGroup" });
+    PrivilegedExceptionAction<SubmitApplicationResponse> action =
+        new SubmitApplicationResponsePrivilegedExceptionAction()
+            .setClientReq(client, req);
+    fakeUser.doAs(action);
+    // make sure app is immediately available after submit
+    if (data.isWaitForAccepted()) {
+      mockRM.waitForState(appId, RMAppState.ACCEPTED);
+    }
+    RMApp rmApp = mockRM.getRMContext().getRMApps().get(appId);
+
+    // unmanaged AM won't go to RMAppAttemptState.SCHEDULED.
+    if (data.isWaitForAccepted() && !data.isUnmanaged()) {
+      mockRM.waitForState(rmApp.getCurrentAppAttempt().getAppAttemptId(),
+          RMAppAttemptState.SCHEDULED);
+    }
+
+    ((AbstractYarnScheduler)mockRM.getResourceScheduler()).update();
+
+    return rmApp;
+  }
+
+  private static class SubmitApplicationResponsePrivilegedExceptionAction
+      implements PrivilegedExceptionAction<SubmitApplicationResponse> {
+    ApplicationClientProtocol client;
+    SubmitApplicationRequest req;
+
+    @Override
+    public SubmitApplicationResponse run() throws IOException, YarnException {
+      try {
+        return client.submitApplication(req);
+      } catch (YarnException | IOException e) {
+        e.printStackTrace();
+        throw  e;
+      }
+    }
+
+    PrivilegedExceptionAction<SubmitApplicationResponse> setClientReq(
+        ApplicationClientProtocol client, SubmitApplicationRequest req) {
+      this.client = client;
+      this.req = req;
+      return this;
+    }
+  }
+}

+ 8 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAMAuthorization.java

@@ -270,7 +270,13 @@ public class TestAMAuthorization {
     Map<ApplicationAccessType, String> acls =
         new HashMap<ApplicationAccessType, String>(2);
     acls.put(ApplicationAccessType.VIEW_APP, "*");
-    RMApp app = rm.submitApp(1024, "appname", "appuser", acls);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("appname")
+            .withUser("appuser")
+            .withAcls(acls)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
 
     nm1.nodeHeartbeat(true);
 
@@ -328,7 +334,7 @@ public class TestAMAuthorization {
 
     MockNM nm1 = rm.registerNode("localhost:1234", 5120);
 
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
     nm1.nodeHeartbeat(true);
 

+ 7 - 7
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationCleanup.java

@@ -81,7 +81,7 @@ public class TestApplicationCleanup {
 
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 5000);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     //kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -159,7 +159,7 @@ public class TestApplicationCleanup {
 
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 5000);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     //kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -296,7 +296,7 @@ public class TestApplicationCleanup {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
     nm1.nodeHeartbeat(am0.getApplicationAttemptId(), 1, ContainerState.COMPLETE);
     rm1.waitForState(app0.getApplicationId(), RMAppState.FAILED);
@@ -333,7 +333,7 @@ public class TestApplicationCleanup {
     nm2.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // alloc another container on nm2
@@ -387,7 +387,7 @@ public class TestApplicationCleanup {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
     nm1.nodeHeartbeat(am0.getApplicationAttemptId(), 1, ContainerState.RUNNING);
     rm1.waitForState(app0.getApplicationId(), RMAppState.RUNNING);
@@ -423,7 +423,7 @@ public class TestApplicationCleanup {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
     nm1.nodeHeartbeat(am0.getApplicationAttemptId(), 1, ContainerState.COMPLETE);
     rm1.waitForState(app0.getApplicationId(), RMAppState.FAILED);
@@ -463,7 +463,7 @@ public class TestApplicationCleanup {
         new MockNM("127.0.0.1:1234", nmMemory, rm1.getResourceTrackerService());
     nm1.registerNode();
 
-    RMApp app0 = rm1.submitApp(amMemory);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(amMemory, rm1);
     MockAM am0 = MockRM.launchAndRegisterAM(app0, rm1, nm1);
 
     // 2. AM sends ResourceRequest for 1 container with memory 2048MB.

+ 5 - 5
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterLauncher.java

@@ -230,7 +230,7 @@ public class TestApplicationMasterLauncher {
     rm.start();
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 5120);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -289,7 +289,7 @@ public class TestApplicationMasterLauncher {
     MockRM rm = new MockRM();
     rm.start();
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 5120);
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     // kick the scheduling
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt = app.getCurrentAppAttempt();
@@ -365,7 +365,7 @@ public class TestApplicationMasterLauncher {
     rm.start();
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 5120);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -385,7 +385,7 @@ public class TestApplicationMasterLauncher {
     MockRM rm = new MockRM();
     rm.start();
     MockNM nm1 = rm.registerNode("h1:1234", 5000);
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     // kick the scheduling
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt = app.getCurrentAppAttempt();
@@ -458,7 +458,7 @@ public class TestApplicationMasterLauncher {
     MockRM rm = new MockRM(conf);
     rm.start();
     MockNM nm1 = rm.registerNode("h1:1234", 5000);
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     /// kick the scheduling
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt = app.getCurrentAppAttempt();

+ 6 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterServiceCapacity.java

@@ -105,7 +105,7 @@ public class TestApplicationMasterServiceCapacity extends
       MockNM nm1 = rm.registerNode(DEFAULT_HOST + ":" + DEFAULT_PORT, 6 * GB);
 
       // Submit an application
-      RMApp app1 = rm.submitApp(1024);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
       // kick the scheduling
       nm1.nodeHeartbeat(true);
@@ -177,7 +177,11 @@ public class TestApplicationMasterServiceCapacity extends
 
     // Submit an application
     Priority appPriority1 = Priority.newInstance(5);
-    RMApp app1 = rm.submitApp(2048, appPriority1);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(2048, rm)
+        .withAppPriority(appPriority1)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();

+ 9 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterServiceFair.java

@@ -97,7 +97,15 @@ public class TestApplicationMasterServiceFair extends
             ImmutableMap.<String, String> builder()
                 .put(CUSTOM_RES, "5G").build()));
 
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, DEFAULT_QUEUE);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue(DEFAULT_QUEUE)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // Now request res_1, 500M < 5G so it should be allowed

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestApplicationMasterServiceInterceptor.java

@@ -171,7 +171,7 @@ public class TestApplicationMasterServiceInterceptor {
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);

+ 12 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestCapacitySchedulerMetrics.java

@@ -78,8 +78,18 @@ public class TestCapacitySchedulerMetrics {
     Assert.assertEquals(0, csMetrics.getNumOfAllocates());
     Assert.assertEquals(0, csMetrics.getNumOfCommitSuccess());
 
-    RMApp rmApp = rm.submitApp(1024, "app", "user", null, false,
-        "default", 1, null, null, false);
+    RMApp rmApp = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(null)
+            .withAppType(null)
+            .withWaitForAppAcceptedState(false)
+            .build());
     MockAM am = MockRM.launchAMWhenAsyncSchedulingEnabled(rmApp, rm);
     am.registerAppAttempt();
     am.allocate("*", 1024, 1, new ArrayList<>());

+ 16 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClientRMService.java

@@ -605,8 +605,12 @@ public class TestClientRMService {
     GetApplicationsRequest getRequest = GetApplicationsRequest.newInstance(
         EnumSet.of(YarnApplicationState.KILLED));
 
-    RMApp app1 = rm.submitApp(1024);
-    RMApp app2 = rm.submitApp(1024, true);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withUnmanagedAM(true)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
 
     assertEquals("Incorrect number of apps in the RM", 0,
         rmService.getApplications(getRequest).getApplicationList().size());
@@ -2437,7 +2441,11 @@ public class TestClientRMService {
     MockRM rm = new MockRM(conf);
     rm.init(conf);
     rm.start();
-    RMApp app1 = rm.submitApp(1024, Priority.newInstance(appPriority));
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1024, rm)
+        .withAppPriority(Priority.newInstance(appPriority))
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     ClientRMService rmService = rm.getClientRMService();
     testApplicationPriorityUpdation(rmService, app1, appPriority, appPriority);
     rm.killApp(app1.getApplicationId());
@@ -2460,7 +2468,11 @@ public class TestClientRMService {
     rm.start();
     rm.registerNode("host1:1234", 1024);
     // Start app1 with appPriority 5
-    RMApp app1 = rm.submitApp(1024, Priority.newInstance(appPriority));
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1024, rm)
+        .withAppPriority(Priority.newInstance(appPriority))
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     Assert.assertEquals("Incorrect priority has been set to application",
         appPriority, app1.getApplicationPriority().getPriority());

+ 16 - 5
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestContainerResourceUsage.java

@@ -78,7 +78,7 @@ public class TestContainerResourceUsage {
         new MockNM("127.0.0.1:1234", 15120, rm.getResourceTrackerService());
     nm.registerNode();
 
-    RMApp app0 = rm.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm);
 
     RMAppMetrics rmAppMetrics = app0.getRMAppMetrics();
     Assert.assertTrue(
@@ -147,7 +147,7 @@ public class TestContainerResourceUsage {
         new MockNM("127.0.0.1:1234", 65536, rm0.getResourceTrackerService());
     nm.registerNode();
 
-    RMApp app0 = rm0.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm0);
 
     rm0.waitForState(app0.getApplicationId(), RMAppState.ACCEPTED);
     RMAppAttempt attempt0 = app0.getCurrentAppAttempt();
@@ -262,10 +262,21 @@ public class TestContainerResourceUsage {
     MockRM rm = new MockRM(conf);
     rm.start();
 
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+        .withAppName("name")
+        .withUser("user")
+        .withAcls(new HashMap<ApplicationAccessType, String>())
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(-1)
+        .withCredentials(null)
+        .withAppType("MAPREDUCE")
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(keepRunningContainers)
+        .build();
     RMApp app =
-        rm.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null, "MAPREDUCE", false, keepRunningContainers);
+        MockRMAppSubmitter.submit(rm, data);
     MockNM nm = 
         new MockNM("127.0.0.1:1234", 10240, rm.getResourceTrackerService());
     nm.registerNode();

+ 3 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestDecommissioningNodesWatcher.java

@@ -65,7 +65,7 @@ public class TestDecommissioningNodesWatcher {
 
     rm.waitForState(id1, NodeState.RUNNING);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
 
     NodeStatus nodeStatus = createNodeStatus(id1, app, 3);
@@ -125,7 +125,8 @@ public class TestDecommissioningNodesWatcher {
 
     rm.waitForState(id1, NodeState.RUNNING);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(2000, rm).build());
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
 
     NodeStatus nodeStatus = createNodeStatus(id1, app, 3);

+ 21 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestKillApplicationWithRMHA.java

@@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.hadoop.conf.Configuration;
@@ -62,12 +63,24 @@ public class TestKillApplicationWithRMHA extends RMHATestBase{
     nm1.registerNode();
 
     // Submit the application
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("")
+        .withUser(UserGroupInformation
+            .getCurrentUser().getShortUserName())
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue(null)
+        .withMaxAppAttempts(configuration.getInt(
+            YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(false)
+        .build();
     RMApp app0 =
-        rm1.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false);
+        MockRMAppSubmitter.submit(rm1, data);
 
     // failover and kill application
     // When FailOver happens, the state of this application is NEW,
@@ -93,7 +106,7 @@ public class TestKillApplicationWithRMHA extends RMHATestBase{
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // failover and kill application
@@ -116,7 +129,7 @@ public class TestKillApplicationWithRMHA extends RMHATestBase{
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // kill the app.
@@ -147,7 +160,7 @@ public class TestKillApplicationWithRMHA extends RMHATestBase{
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // ensure that the app is in running state

+ 8 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestLeaderElectorService.java

@@ -126,7 +126,14 @@ public class TestLeaderElectorService {
     rm2 = startRM("rm2", HAServiceState.STANDBY);
 
     // submit an app which will trigger state-store failure.
-    rm1.submitApp(200, "app1", "user1", null, "default", false);
+    MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("app1")
+        .withUser("user1")
+        .withAcls(null)
+        .withQueue("default")
+        .withWaitForAppAcceptedState(false)
+        .build());
     waitFor(rm1, HAServiceState.STANDBY);
 
     // rm2 should become active;

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestMoveApplication.java

@@ -124,7 +124,7 @@ public class TestMoveApplication {
       void testMoveSuccessful() throws Exception {
     MockRM rm1 = new MockRM(conf);
     rm1.start();
-    RMApp app = rm1.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     ClientRMService clientRMService = rm1.getClientRMService();
     // FIFO scheduler does not support moves
     clientRMService

+ 33 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestNodeBlacklistingOnAMFailures.java

@@ -58,6 +58,35 @@ import org.junit.Test;
  */
 public class TestNodeBlacklistingOnAMFailures {
 
+  private RMApp submitAppWithAMResourceRequests(MockRM rm,
+      List<ResourceRequest> amResourceRequests) throws Exception {
+    int maxAttempts =
+        rm.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder.create()
+        .withAmResourceRequests(amResourceRequests)
+        .withAppName("app1")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue(null)
+        .withMaxAppAttempts(maxAttempts)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(false)
+        .withApplicationId(null)
+        .withAttemptFailuresValidityInterval(0)
+        .withLogAggregationContext(null)
+        .withCancelTokensWhenComplete(true)
+        .withAppPriority(amResourceRequests.get(0).getPriority())
+        .withAmLabel(amResourceRequests.get(0).getNodeLabelExpression())
+        .withApplicationTimeouts(null)
+        .withTokensConf(null)
+        .build();
+    return MockRMAppSubmitter.submit(rm, data);
+  }
+
   @Before
   public void setup() {
     QueueMetrics.clearQueueMetrics();
@@ -87,7 +116,7 @@ public class TestNodeBlacklistingOnAMFailures {
         new MockNM("127.0.0.2:2345", 8000, rm.getResourceTrackerService());
     nm2.registerNode();
 
-    RMApp app = rm.submitApp(200);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm);
 
     MockAM am1 = MockRM.launchAndRegisterAM(app, rm, nm1);
     ContainerId amContainerId =
@@ -215,7 +244,7 @@ public class TestNodeBlacklistingOnAMFailures {
     reqs.add(anyReq);
     reqs.add(rackReq);
     reqs.add(nodeReq);
-    RMApp app = rm.submitApp(reqs);
+    RMApp app = submitAppWithAMResourceRequests(rm, reqs);
 
     MockAM am1 = MockRM.launchAndRegisterAM(app, rm, nm2);
     ContainerId amContainerId =
@@ -302,7 +331,7 @@ public class TestNodeBlacklistingOnAMFailures {
     reqs.add(anyReq);
     reqs.add(rackReq);
     reqs.add(nodeReq);
-    RMApp app = rm.submitApp(reqs);
+    RMApp app = submitAppWithAMResourceRequests(rm, reqs);
 
     MockAM am1 = MockRM.launchAndRegisterAM(app, rm, nm2);
     ContainerId amContainerId =
@@ -363,7 +392,7 @@ public class TestNodeBlacklistingOnAMFailures {
         new MockNM("127.0.0.1:1234", 8000, rm.getResourceTrackerService());
     node.registerNode();
 
-    RMApp app = rm.submitApp(200);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm);
     ApplicationId appId = app.getApplicationId();
 
     int numAppAttempts = 1;

+ 66 - 11
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestOpportunisticContainerAllocatorAMService.java

@@ -191,8 +191,15 @@ public class TestOpportunisticContainerAllocatorAMService {
     OpportunisticContainerAllocatorAMService amservice =
         (OpportunisticContainerAllocatorAMService) rm
             .getApplicationMasterService();
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
-
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
     ResourceScheduler scheduler = rm.getResourceScheduler();
 
@@ -343,8 +350,15 @@ public class TestOpportunisticContainerAllocatorAMService {
     OpportunisticContainerAllocatorAMService amservice =
         (OpportunisticContainerAllocatorAMService) rm
             .getApplicationMasterService();
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
-
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
     ResourceScheduler scheduler = rm.getResourceScheduler();
 
@@ -453,8 +467,15 @@ public class TestOpportunisticContainerAllocatorAMService {
     OpportunisticContainerAllocatorAMService amservice =
         (OpportunisticContainerAllocatorAMService) rm
             .getApplicationMasterService();
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
-
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
     ResourceScheduler scheduler = rm.getResourceScheduler();
 
@@ -550,7 +571,15 @@ public class TestOpportunisticContainerAllocatorAMService {
     OpportunisticContainerAllocatorAMService amservice =
         (OpportunisticContainerAllocatorAMService) rm
             .getApplicationMasterService();
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
     ResourceScheduler scheduler = rm.getResourceScheduler();
     RMNode rmNode1 = rm.getRMContext().getRMNodes().get(nm1.getNodeId());
@@ -717,7 +746,13 @@ public class TestOpportunisticContainerAllocatorAMService {
     OpportunisticContainerAllocatorAMService amservice =
         (OpportunisticContainerAllocatorAMService) rm
             .getApplicationMasterService();
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    RMApp app1 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     ApplicationAttemptId attemptId =
         app1.getCurrentAppAttempt().getAppAttemptId();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
@@ -787,7 +822,13 @@ public class TestOpportunisticContainerAllocatorAMService {
     MockNM nm = new MockNM("h:1234", 4096, rm.getResourceTrackerService());
     nm.registerNode();
 
-    RMApp app = rm.submitApp(1 * GB, "app", "user", null, "default");
+    RMApp app = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     ApplicationAttemptId attemptId0 =
         app.getCurrentAppAttempt().getAppAttemptId();
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm);
@@ -824,7 +865,15 @@ public class TestOpportunisticContainerAllocatorAMService {
     OpportunisticContainerAllocatorAMService amservice =
         (OpportunisticContainerAllocatorAMService) rm
             .getApplicationMasterService();
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId attemptId =
         app1.getCurrentAppAttempt().getAppAttemptId();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
@@ -877,7 +926,13 @@ public class TestOpportunisticContainerAllocatorAMService {
     nm.registerNode();
     nm.nodeHeartbeat(oppContainersStatus, true);
 
-    RMApp app = rm.submitApp(1 * GB, "app", "user", null, "default");
+    RMApp app = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     ApplicationAttemptId attemptId =
         app.getCurrentAppAttempt().getAppAttemptId();
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm);

+ 15 - 15
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRM.java

@@ -123,8 +123,8 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     MockRM rm = new MockRM(conf);
     rm.start();
     MockNM nm1 = rm.registerNode("h1:1234", 5120);
-    
-    RMApp app = rm.submitApp(2000);
+
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     //kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -146,8 +146,8 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     rm.start();
     MockNM nm1 = rm.registerNode("h1:1234", 5120);
     MockNM nm2 = rm.registerNode("h2:5678", 10240);
-    
-    RMApp app = rm.submitApp(2000);
+
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     //kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -203,7 +203,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     MockRM rm = new MockRM(conf);
     rm.start();
     MockNM nm1 = rm.registerNode("h1:1234", 5120);
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     RMAppAttempt attempt = app.getCurrentAppAttempt();
 
     // Call getNewContainerId to increase container Id so that the AM container
@@ -259,7 +259,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
           rm.getRMContext().getNMTokenSecretManager();
       
       // submitting new application
-      RMApp app = rm.submitApp(1000);
+      RMApp app = MockRMAppSubmitter.submitWithMemory(1000, rm);
       
       // start scheduling.
       nm1.nodeHeartbeat(true);
@@ -440,10 +440,10 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     rm1.start();
 
     // app that gets launched
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     // app that does not get launched
-    RMApp app2 = rm1.submitApp(200);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     // app1 and app2 should be scheduled, but because no resource is available,
     // they are not activated.
@@ -484,7 +484,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     rm1.start();
 
     // a succeeded app
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 15120, rm1.getResourceTrackerService());
     nm1.registerNode();
@@ -492,14 +492,14 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     MockRM.finishAMAndVerifyAppState(app1, rm1, nm1, am1);
 
     // a failed app
-    RMApp app2 = rm1.submitApp(200);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
     nm1.nodeHeartbeat(am2.getApplicationAttemptId(), 1, ContainerState.COMPLETE);
     rm1.waitForState(am2.getApplicationAttemptId(), RMAppAttemptState.FAILED);
     rm1.waitForState(app2.getApplicationId(), RMAppState.FAILED);
 
     // a killed app
-    RMApp app3 = rm1.submitApp(200);
+    RMApp app3 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm1);
     rm1.killApp(app3.getApplicationId());
     rm1.waitForState(app3.getApplicationId(), RMAppState.KILLED);
@@ -538,7 +538,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // a failed app
-    RMApp app2 = rm1.submitApp(200);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
     nm1
       .nodeHeartbeat(am2.getApplicationAttemptId(), 1, ContainerState.COMPLETE);
@@ -605,7 +605,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // a failed app
-    RMApp application = rm.submitApp(200);
+    RMApp application = MockRMAppSubmitter.submitWithMemory(200, rm);
     MockAM am = MockRM.launchAM(application, rm, nm1);
     rm.waitForState(am.getApplicationAttemptId(), RMAppAttemptState.LAUNCHED);
     nm1.nodeHeartbeat(am.getApplicationAttemptId(), 1, ContainerState.RUNNING);
@@ -683,7 +683,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     rm1.killApp(app1.getApplicationId());
@@ -737,7 +737,7 @@ public class TestRM extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     rm1.killApp(app1.getApplicationId());

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java

@@ -142,7 +142,7 @@ public class TestRMHA {
     try {
       rm.getNewAppId();
       nm = rm.registerNode("127.0.0.1:1", 2048);
-      app = rm.submitApp(1024);
+      app = MockRMAppSubmitter.submitWithMemory(1024, rm);
       attempt = app.getCurrentAppAttempt();
       rm.waitForState(attempt.getAppAttemptId(), RMAppAttemptState.SCHEDULED);
     } catch (Exception e) {

+ 16 - 5
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHAForAsyncScheduler.java

@@ -136,11 +136,22 @@ public class TestRMHAForAsyncScheduler extends RMHATestBase {
   }
 
   private RMApp submitAppAndCheckLaunched(MockRM rm) throws Exception {
-    RMApp app = rm.submitApp(200, "",
-        UserGroupInformation.getCurrentUser().getShortUserName(), null, false,
-        "default", configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null, false,
-        false);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+        .withAppName("")
+        .withUser(UserGroupInformation.getCurrentUser().getShortUserName())
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+            .withMaxAppAttempts(
+                configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(false)
+        .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     rm.waitForState(app.getApplicationId(), RMAppState.ACCEPTED);
     RMAppAttempt attempt = app.getCurrentAppAttempt();
     rm.sendAMLaunched(attempt.getAppAttemptId());

+ 2 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHATimelineCollectors.java

@@ -60,14 +60,14 @@ public class TestRMHATimelineCollectors extends RMHATestBase {
         = new MockNM("127.0.0.1:1234", 15120, rm2.getResourceTrackerService());
     MockNM nm2
         = new MockNM("127.0.0.1:5678", 15121, rm2.getResourceTrackerService());
-    RMApp app1 = rm1.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     String collectorAddr1 = "1.2.3.4:5";
     AppCollectorData data1 = AppCollectorData.newInstance(
         app1.getApplicationId(), collectorAddr1);
     nm1.addRegisteringCollector(app1.getApplicationId(), data1);
 
     String collectorAddr2 = "5.4.3.2:1";
-    RMApp app2 = rm1.submitApp(1024);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     AppCollectorData data2 = AppCollectorData.newInstance(
         app2.getApplicationId(), collectorAddr2, rm1.getStartTime(), 1);
     nm1.addRegisteringCollector(app2.getApplicationId(), data2);

+ 248 - 62
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMRestart.java

@@ -194,6 +194,37 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     return rm;
   }
 
+  private RMApp submitApp(MockRM rm, List<ResourceRequest> amResourceRequests,
+      String appNodeLabel) throws Exception {
+    int maxAttempts =
+        rm.getConfig().getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder.create()
+        .withAmResourceRequests(amResourceRequests)
+        .withAppName("app1")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue(null)
+        .withMaxAppAttempts(maxAttempts)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(false)
+        .withApplicationId(null)
+        .withAttemptFailuresValidityInterval(0)
+        .withLogAggregationContext(null)
+        .withCancelTokensWhenComplete(true)
+        .withAppPriority(amResourceRequests.get(0).getPriority())
+        .withAmLabel(amResourceRequests.get(0).getNodeLabelExpression())
+        .withApplicationTimeouts(null)
+        .withTokensConf(null)
+        .withApplicationTags(null)
+        .withAppNodeLabel(appNodeLabel)
+        .build();
+    return MockRMAppSubmitter.submit(rm, data);
+  }
+
   @Test (timeout=180000)
   public void testRMRestart() throws Exception {
     conf.setInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
@@ -217,7 +248,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm2.registerNode(); // nm2 will not heartbeat with RM1
     
     // create app that will finish and the final state should be saved.
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     RMAppAttempt attempt0 = app0.getCurrentAppAttempt();
     // spot check that app is saved
     Assert.assertEquals(1, rmAppState.size());
@@ -227,7 +258,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     finishApplicationMaster(app0, rm1, nm1, am0);
 
     // create app that gets launched and does allocate before RM restart
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     // assert app1 info is saved
     ApplicationStateData appState = rmAppState.get(app1.getApplicationId());
     Assert.assertNotNull(appState);
@@ -268,7 +299,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     }
     
     // create app that does not get launched by RM before RM restart
-    RMApp app2 = rm1.submitApp(200);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     // assert app2 info is saved
     appState = rmAppState.get(app2.getApplicationId());
@@ -279,9 +310,18 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
         .getApplicationId());
     
     // create unmanaged app
-    RMApp appUnmanaged = rm1.submitApp(200, "someApp", "someUser", null, true,
-        null, conf.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-          YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null);
+    RMApp appUnmanaged = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("someApp")
+            .withUser("someUser")
+            .withAcls(null)
+            .withUnmanagedAM(true)
+            .withQueue(null)
+            .withMaxAppAttempts(
+                conf.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+            .withCredentials(null)
+            .build());
     ApplicationAttemptId unmanagedAttemptId = 
                         appUnmanaged.getCurrentAppAttempt().getAppAttemptId();
     // assert appUnmanaged info is saved
@@ -483,7 +523,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
             Resource.newInstance(200, 1), 1, true, amLabel.getName());
     ArrayList resReqs = new ArrayList<>();
     resReqs.add(amResourceRequest);
-    RMApp app0 = rm1.submitApp(resReqs, appLabel.getName());
+    RMApp app0 = submitApp(rm1, resReqs, appLabel.getName());
     rm1.killApp(app0.getApplicationId());
     rm1.waitForState(app0.getApplicationId(), RMAppState.KILLED);
     // start new RM
@@ -509,7 +549,14 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     rm1.start();
     // create app and launch the AM
     RMApp app0 =
-        rm1.submitApp(null, "name", "user", new HashMap<>(), true, "default");
+        MockRMAppSubmitter.submit(rm1,
+            MockRMAppSubmissionData.Builder.createWithResource(null, rm1)
+                .withAppName("name")
+                .withUser("user")
+                .withAcls(new HashMap<>())
+                .withUnmanagedAM(true)
+                .withQueue("default")
+                .build());
     rm1.killApp(app0.getApplicationId());
     rm1.waitForState(app0.getApplicationId(), RMAppState.KILLED);
     // start new RM
@@ -540,10 +587,21 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create app and launch the AM
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("name")
+        .withUser("user")
+        .withAcls(new HashMap<ApplicationAccessType, String>())
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(-1)
+        .withCredentials(null)
+        .withAppType("MAPREDUCE")
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
     RMApp app0 =
-        rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null, "MAPREDUCE", true, true);
+        MockRMAppSubmitter.submit(rm1, data);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // fail the AM by sending CONTAINER_FINISHED event without registering.
@@ -598,7 +656,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // submitting app
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     rm1.waitForState(app1.getApplicationId(), RMAppState.ACCEPTED);
     MockAM am1 = launchAM(app1, rm1, nm1);
     nm1.nodeHeartbeat(am1.getApplicationAttemptId(), 1, ContainerState.COMPLETE);
@@ -706,7 +764,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     // It will be saved only when we launch AM.
 
     // submitting app but not starting AM for it.
-    RMApp app2 = rm3.submitApp(200);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(200, rm3);
     rm3.waitForState(app2.getApplicationId(), RMAppState.ACCEPTED);
     Assert.assertEquals(1, app2.getAppAttempts().size());
     Assert.assertEquals(0,
@@ -773,7 +831,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     MockRM rm1 = createMockRM(conf, memStore);
     rm1.start();
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 15120);
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = MockRM.launchAndRegisterAM(app0, rm1, nm1);
     FinishApplicationMasterRequest req =
         FinishApplicationMasterRequest.newInstance(
@@ -814,7 +872,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // fail the AM by sending CONTAINER_FINISHED event without registering.
@@ -862,7 +920,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // kill the app.
@@ -918,9 +976,18 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     rm1.start();
     // create app
     RMApp app0 =
-        rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null, "MAPREDUCE", false);
+        MockRMAppSubmitter.submit(rm1,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+                .withAppName("name")
+                .withUser("user")
+                .withAcls(new HashMap<ApplicationAccessType, String>())
+                .withUnmanagedAM(false)
+                .withQueue("default")
+                .withMaxAppAttempts(-1)
+                .withCredentials(null)
+                .withAppType("MAPREDUCE")
+                .withWaitForAppAcceptedState(false)
+                .build());
     // kill the app.
     rm1.killApp(app0.getApplicationId());
     rm1.waitForState(app0.getApplicationId(), RMAppState.KILLED);
@@ -952,7 +1019,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create an app and finish the app.
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     // unregister am
@@ -1003,14 +1070,32 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
         (MockMemoryRMStateStore) rm1.getRMStateStore();
 
     // a succeeded app.
-    RMApp app0 = rm1.submitApp(200, "name", "user", null,
-      false, "default", 1, null, "myType");
+    RMApp app0 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(null)
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(null)
+            .withAppType("myType")
+            .build());
     MockAM am0 = launchAM(app0, rm1, nm1);
     finishApplicationMaster(app0, rm1, nm1, am0);
 
     // a failed app.
-    RMApp app1 = rm1.submitApp(200, "name", "user", null,
-      false, "default", 1, null, "myType");
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(null)
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(null)
+            .withAppType("myType")
+            .build());
     MockAM am1 = launchAM(app1, rm1, nm1);
     // fail the AM by sending CONTAINER_FINISHED event without registering.
     nm1.nodeHeartbeat(am1.getApplicationAttemptId(), 1, ContainerState.COMPLETE);
@@ -1018,8 +1103,17 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     rm1.waitForState(app1.getApplicationId(), RMAppState.FAILED);
 
     // a killed app.
-    RMApp app2 = rm1.submitApp(200, "name", "user", null,
-      false, "default", 1, null, "myType");
+    RMApp app2 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(null)
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(null)
+            .withAppType("myType")
+            .build());
     MockAM am2 = launchAM(app2, rm1, nm1);
     rm1.killApp(app2.getApplicationId());
     rm1.waitForState(app2.getApplicationId(), RMAppState.KILLED);
@@ -1162,13 +1256,27 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // submit an app with maxAppAttempts equals to 1
-    RMApp app1 = rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", 1,
-          null);
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(null)
+            .build());
     // submit an app with maxAppAttempts equals to -1
-    RMApp app2 = rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null);
+    RMApp app2 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(-1)
+            .withCredentials(null)
+            .build());
 
     // assert app1 info is saved
     ApplicationStateData appState = rmAppState.get(app1.getApplicationId());
@@ -1232,9 +1340,16 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
       nm1.registerNode();
 
       // submit an app.
-      RMApp app = rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null);
+      RMApp app = MockRMAppSubmitter.submit(rm1,
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+              .withAppName("name")
+              .withUser("user")
+              .withAcls(new HashMap<ApplicationAccessType, String>())
+              .withUnmanagedAM(false)
+              .withQueue("default")
+              .withMaxAppAttempts(-1)
+              .withCredentials(null)
+              .build());
       // Check if app info has been saved.
       ApplicationStateData appState = rmAppState.get(app.getApplicationId());
       Assert.assertNotNull(appState);
@@ -1321,8 +1436,16 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     tokenSet.add(token2);
 
     // submit an app with customized credential
-    RMApp app = rm1.submitApp(200, "name", "user",
-        new HashMap<ApplicationAccessType, String>(), false, "default", 1, ts);
+    RMApp app = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(ts)
+            .build());
 
     // assert app info is saved
     ApplicationStateData appState = rmAppState.get(app.getApplicationId());
@@ -1389,9 +1512,16 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // submit an app
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
     RMApp app1 =
-        rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), "default");
+        MockRMAppSubmitter.submit(rm1, data);
 
     // assert app info is saved
     ApplicationStateData appState = rmAppState.get(app1.getApplicationId());
@@ -1492,8 +1622,16 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     tokenIdentSet.add(dtId1);
 
     // submit an app with customized credential
-    RMApp app = rm1.submitApp(200, "name", "user",
-        new HashMap<ApplicationAccessType, String>(), false, "default", 1, ts);
+    RMApp app = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(ts)
+            .build());
 
     // assert app info is saved
     ApplicationStateData appState = rmAppState.get(app.getApplicationId());
@@ -1624,8 +1762,16 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     // submit an app with the old delegation token got from previous RM.
     Credentials ts = new Credentials();
     ts.addToken(token1.getService(), token1);
-    RMApp app = rm2.submitApp(200, "name", "user",
-        new HashMap<ApplicationAccessType, String>(), false, "default", 1, ts);
+    RMApp app = MockRMAppSubmitter.submit(rm2,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm2)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(ts)
+            .build());
     rm2.waitForState(app.getApplicationId(), RMAppState.ACCEPTED);
   }
 
@@ -1665,9 +1811,18 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     final int NUM_APPS = 5;
 
     for (int i = 0; i < NUM_APPS; i++) {
-      RMApp app = rm1.submitApp(200, "name", "user",
-            new HashMap<ApplicationAccessType, String>(), false,
-            "default", -1, null, "MAPREDUCE", false);
+      RMApp app = MockRMAppSubmitter.submit(rm1,
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+              .withAppName("name")
+              .withUser("user")
+              .withAcls(new HashMap<ApplicationAccessType, String>())
+              .withUnmanagedAM(false)
+              .withQueue("default")
+              .withMaxAppAttempts(-1)
+              .withCredentials(null)
+              .withAppType("MAPREDUCE")
+              .withWaitForAppAcceptedState(false)
+              .build());
       appList.add(app);
       rm1.waitForState(app.getApplicationId(), RMAppState.NEW_SAVING);
     }
@@ -1710,7 +1865,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create an app and finish the app.
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
     finishApplicationMaster(app0, rm1, nm1, am0);
 
@@ -1728,7 +1883,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     rm2.waitForState(app0.getApplicationId(), RMAppState.FINISHED);
 
     // create one more app and finish the app.
-    RMApp app1 = rm2.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm2);
     MockAM am1 = launchAM(app1, rm2, nm1);
     finishApplicationMaster(app1, rm2, nm1, am1);
     rm2.drainEvents();
@@ -1778,8 +1933,17 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     RMApp app1 =
-        rm1.submitApp(200, "name", "user", null, false, "default", 1, null,
-          "myType");
+        MockRMAppSubmitter.submit(rm1,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+                .withAppName("name")
+                .withUser("user")
+                .withAcls(null)
+                .withUnmanagedAM(false)
+                .withQueue("default")
+                .withMaxAppAttempts(1)
+                .withCredentials(null)
+                .withAppType("myType")
+                .build());
     MockAM am1 = launchAM(app1, rm1, nm1);
 
     KillApplicationResponse response;
@@ -1828,9 +1992,18 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
         (MockMemoryRMStateStore) rm1.getRMStateStore();
     RMApp app1 = null;
     try {
-       app1 = rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null, "MAPREDUCE", false);
+      app1 = MockRMAppSubmitter.submit(rm1,
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+              .withAppName("name")
+              .withUser("user")
+              .withAcls(new HashMap<ApplicationAccessType, String>())
+              .withUnmanagedAM(false)
+              .withQueue("default")
+              .withMaxAppAttempts(-1)
+              .withCredentials(null)
+              .withAppType("MAPREDUCE")
+              .withWaitForAppAcceptedState(false)
+              .build());
       Assert.fail();
     } catch (Exception e) {
 
@@ -1915,7 +2088,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     assertQueueMetrics(qm1, 0, 0, 0, 0);
 
     // create app that gets launched and does allocate before RM restart
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     // Need to wait first for AppAttempt to be started (RMAppState.ACCEPTED)
     // and then for it to reach RMAppAttemptState.SCHEDULED
     // inorder to ensure appsPending metric is incremented
@@ -2110,7 +2283,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     final MockNM nm1 =
         new MockNM("127.0.0.1:1234", 15120, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     final MockAM am0 = MockRM.launchAndRegisterAM(app0, rm1, nm1);
 
     MockRM rm2 = new TestSecurityMockRM(conf, rm1.getRMStateStore()) {
@@ -2367,7 +2540,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = launchAM(app0, rm1, nm1);
 
     ApplicationId applicationId = app0.getApplicationId();
@@ -2496,7 +2669,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
     int CONTAINER_MEMORY = 1024;
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(CONTAINER_MEMORY);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MEMORY, rm1);
     MockAM am0 = MockRM.launchAM(app0, rm1, nm1);
     nm1.nodeHeartbeat(am0.getApplicationAttemptId(), 1,
         ContainerState.COMPLETE);
@@ -2550,7 +2723,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // create an app and finish the app.
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     MockAM am0 = launchAndFailAM(app0, rm1, nm1);
     MockAM am1 = launchAndFailAM(app0, rm1, nm1);
@@ -2642,7 +2815,15 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm1 = rm1.registerNode("h1:1234", 8000); // label = x
 
     // submit an application with specifying am node label expression as "x"
-    RMApp app1 = rm1.submitApp(200, "someApp", "someUser", null, "a1", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("someApp")
+            .withUser("someUser")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     // check am container allocated with correct node label expression
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     ContainerId  amContainerId1 =
@@ -2708,8 +2889,13 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
 
     // Submit an application
     Priority appPriority1 = Priority.newInstance(5);
-    RMApp app1 = rm.submitApp(2048, appPriority1,
-        getCreds(), getTokensConf());
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2048, rm)
+            .withAppPriority(appPriority1)
+            .withCredentials(getCreds())
+            .withTokensConf(getTokensConf())
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -2781,7 +2967,7 @@ public class TestRMRestart extends ParameterizedSchedulerTestBase {
     // Register node1
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * 1024);
 
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
 
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();

+ 14 - 6
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestResourceTrackerService.java

@@ -424,7 +424,7 @@ public class TestResourceTrackerService extends NodeLabelTestBase {
     rm.waitForState(id3, NodeState.RUNNING);
 
     // Create an app and launch two containers on host1.
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
     ApplicationAttemptId aaid = app.getCurrentAppAttempt().getAppAttemptId();
     nm1.nodeHeartbeat(aaid, 2, ContainerState.RUNNING);
@@ -1622,13 +1622,13 @@ public class TestResourceTrackerService extends NodeLabelTestBase {
     RMNodeImpl node2 =
         (RMNodeImpl) rm.getRMContext().getRMNodes().get(nm2.getNodeId());
 
-    RMAppImpl app1 = (RMAppImpl) rm.submitApp(1024);
+    RMAppImpl app1 = (RMAppImpl) MockRMAppSubmitter.submitWithMemory(1024, rm);
     String collectorAddr1 = "1.2.3.4:5";
     app1.setCollectorData(AppCollectorData.newInstance(
         app1.getApplicationId(), collectorAddr1));
 
     String collectorAddr2 = "5.4.3.2:1";
-    RMAppImpl app2 = (RMAppImpl) rm.submitApp(1024);
+    RMAppImpl app2 = (RMAppImpl) MockRMAppSubmitter.submitWithMemory(1024, rm);
     app2.setCollectorData(AppCollectorData.newInstance(
         app2.getApplicationId(), collectorAddr2));
 
@@ -1752,7 +1752,11 @@ public class TestResourceTrackerService extends NodeLabelTestBase {
         spy(rm.getRMContext().getDispatcher().getEventHandler());
 
     // Case 1: Unmanaged AM
-    RMApp app = rm.submitApp(1024, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withUnmanagedAM(true)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
 
     // Case 1.1: AppAttemptId is null
     NMContainerStatus report =
@@ -1776,7 +1780,7 @@ public class TestResourceTrackerService extends NodeLabelTestBase {
     verify(handler, never()).handle((Event)any());
 
     // Case 2: Managed AM
-    app = rm.submitApp(1024);
+    app = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
     // Case 2.1: AppAttemptId is null
     report = NMContainerStatus.newInstance(
@@ -2680,7 +2684,11 @@ public class TestResourceTrackerService extends NodeLabelTestBase {
     };
 
     rm.start();
-    RMApp app = rm.submitApp(1024, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withUnmanagedAM(true)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId = app.getCurrentAppAttempt()
         .getAppAttemptId();
 

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestSignalContainer.java

@@ -57,7 +57,7 @@ public class TestSignalContainer {
 
     MockNM nm1 = rm.registerNode("h1:1234", 5000);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     //kick the scheduling
     nm1.nodeHeartbeat(true);

+ 98 - 33
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestSubmitApplicationWithRMHA.java

@@ -53,11 +53,17 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
     // submit the application with previous assigned applicationId
     // to current active rm: rm2
     RMApp app1 =
-        rm2.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false, true, appId);
+        MockRMAppSubmitter.submit(rm2,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm2)
+                .withAppName("")
+                .withUser(UserGroupInformation
+                    .getCurrentUser().getShortUserName())
+                .withAcls(null)
+                .withUnmanagedAM(false)
+                .withQueue(null)
+                .withWaitForAppAcceptedState(false)
+                .withApplicationId(appId)
+                .build());
 
     // verify application submission
     verifySubmitApp(rm2, app1, appId);
@@ -106,7 +112,7 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
 
     // Submit Application
     // After submission, the applicationState will be saved in RMStateStore.
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     // Do the failover
     explicitFailover();
@@ -137,12 +143,24 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
     // Submit Application
     // After submission, the applicationState will
     // not be saved in RMStateStore
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("")
+        .withUser(UserGroupInformation
+            .getCurrentUser().getShortUserName())
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue(null)
+        .withMaxAppAttempts(configuration.getInt(
+            YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(false)
+        .build();
     RMApp app0 =
-        rm1.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false);
+        MockRMAppSubmitter.submit(rm1, data);
 
     // Do the failover
     explicitFailover();
@@ -163,11 +181,23 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
     // Application with previous applicationId
     // when catches the ApplicationNotFoundException
     RMApp app1 =
-        rm2.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false, true, app0.getApplicationId());
+        MockRMAppSubmitter.submit(rm2,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm2)
+                .withAppName("")
+                .withUser(UserGroupInformation
+                    .getCurrentUser().getShortUserName())
+                .withAcls(null)
+                .withUnmanagedAM(false)
+                .withQueue(null)
+                .withMaxAppAttempts(configuration.getInt(
+                    YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+                    YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+                .withCredentials(null)
+                .withAppType(null)
+                .withWaitForAppAcceptedState(false)
+                .withKeepContainers(false)
+                .withApplicationId(app0.getApplicationId())
+                .build());
 
     verifySubmitApp(rm2, app1, app0.getApplicationId());
   }
@@ -183,7 +213,7 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
 
     // Submit Application
     // After submission, the applicationState will be saved in RMStateStore.
-    RMApp app = rm1.submitApp(200);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     ApplicationReport appReport1 =
         rm1.getApplicationReport(app.getApplicationId());
@@ -235,7 +265,7 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
 
     // Submit Application
     // After submission, the applicationState will be saved in RMStateStore.
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
 
     // Do the failover
     explicitFailover();
@@ -251,11 +281,22 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
     // check whether this application has been exist. If yes, just simply
     // return submitApplicationResponse.
     RMApp app1 =
-        rm2.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false, true, app0.getApplicationId());
+        MockRMAppSubmitter.submit(rm2,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm2)
+                .withAppName("")
+                .withUser(UserGroupInformation
+                    .getCurrentUser().getShortUserName())
+                .withAcls(null)
+                .withUnmanagedAM(false)
+                .withQueue(null)
+                .withMaxAppAttempts(configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+                    YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+                .withCredentials(null)
+                .withAppType(null)
+                .withWaitForAppAcceptedState(false)
+                .withKeepContainers(false)
+                .withApplicationId(app0.getApplicationId())
+                .build());
 
     Assert.assertEquals(app1.getApplicationId(), app0.getApplicationId());
   }
@@ -273,12 +314,24 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
     // Submit Application
     // After submission, the applicationState will
     // not be saved in RMStateStore
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("")
+        .withUser(UserGroupInformation
+            .getCurrentUser().getShortUserName())
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue(null)
+        .withMaxAppAttempts(configuration.getInt(
+            YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+            YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(false)
+        .build();
     RMApp app0 =
-        rm1.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false);
+        MockRMAppSubmitter.submit(rm1, data);
 
     // Do the failover
     explicitFailover();
@@ -294,11 +347,23 @@ public class TestSubmitApplicationWithRMHA extends RMHATestBase{
     // submitApplication() when failover happens during the submission process
     // because the submitApplication api is marked as idempotent
     RMApp app1 =
-        rm2.submitApp(200, "", UserGroupInformation
-            .getCurrentUser().getShortUserName(), null, false, null,
-            configuration.getInt(YarnConfiguration.RM_AM_MAX_ATTEMPTS,
-                YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS), null, null,
-            false, false, true, app0.getApplicationId());
+        MockRMAppSubmitter.submit(rm2,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm2)
+                .withAppName("")
+                .withUser(UserGroupInformation
+                    .getCurrentUser().getShortUserName())
+                .withAcls(null)
+                .withUnmanagedAM(false)
+                .withQueue(null)
+                .withMaxAppAttempts(configuration.getInt(
+                    YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+                    YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS))
+                .withCredentials(null)
+                .withAppType(null)
+                .withWaitForAppAcceptedState(false)
+                .withKeepContainers(false)
+                .withApplicationId(app0.getApplicationId())
+                .build());
 
     verifySubmitApp(rm2, app1, app0.getApplicationId());
     Assert.assertTrue(rm2.getRMContext().getRMApps()

+ 125 - 33
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestWorkPreservingRMRestart.java

@@ -170,7 +170,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     Resource amResources = app1.getAMResourceRequests().get(0).getCapability();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
@@ -335,9 +335,15 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     // dynamic queue.
     rm1.getRMContext().getReservationSystem()
         .synchronizePlan(ReservationSystemTestUtil.reservationQ, true);
-    RMApp app1 = rm1.submitApp(200, "dynamicQApp",
-        UserGroupInformation.getCurrentUser().getShortUserName(), null,
-        ReservationSystemTestUtil.getReservationQueueName());
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("dynamicQApp")
+            .withUser(UserGroupInformation.getCurrentUser().getShortUserName())
+            .withAcls(null)
+            .withQueue(ReservationSystemTestUtil.getReservationQueueName())
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     Resource amResources = app1.getAMResourceRequests().get(0).getCapability();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
@@ -618,7 +624,13 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    final RMApp app1 = rm1.submitApp(1024, "app1", USER_1, null);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app1")
+            .withUser(USER_1)
+            .withAcls(null)
+            .build();
+    final RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1,rm1, nm1);
     MockRM.finishAMAndVerifyAppState(app1, rm1, nm1, am1);
 
@@ -671,12 +683,36 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
         new MockNM("127.1.1.1:4321", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
     nm2.registerNode();
-    RMApp app1_1 = rm1.submitApp(1024, "app1_1", USER_1, null, A);
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app1_1")
+            .withUser(USER_1)
+            .withAcls(null)
+            .withQueue(A)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1_1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1_1 = MockRM.launchAndRegisterAM(app1_1, rm1, nm1);
-    RMApp app1_2 = rm1.submitApp(1024, "app1_2", USER_1, null, A);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app1_2")
+            .withUser(USER_1)
+            .withAcls(null)
+            .withQueue(A)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1_2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1_2 = MockRM.launchAndRegisterAM(app1_2, rm1, nm2);
 
-    RMApp app2 = rm1.submitApp(1024, "app2", USER_2, null, B);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app2")
+            .withUser(USER_2)
+            .withAcls(null)
+            .withQueue(B)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // clear queue metrics
@@ -842,7 +878,15 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm.registerNode();
 
     // Submit an app to QueueB.
-    RMApp app = rm1.submitApp(1024, "app", USER_2, null, B);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app")
+            .withUser(USER_2)
+            .withAcls(null)
+            .withQueue(B)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm1, data);
     MockRM.launchAndRegisterAM(app, rm1, nm);
     assertEquals(rm1.getApplicationReport(app.getApplicationId()).
         getYarnApplicationState(), YarnApplicationState.RUNNING);
@@ -890,20 +934,50 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
         new MockNM("127.1.1.1:4321", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
     nm2.registerNode();
-    RMApp app1_1 = rm1.submitApp(1024, "app1_1", USER_1, null, A);
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app1_1")
+            .withUser(USER_1)
+            .withAcls(null)
+            .withQueue(A)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1_1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1_1 = MockRM.launchAndRegisterAM(app1_1, rm1, nm1);
-    RMApp app1_2 = rm1.submitApp(1024, "app1_2", USER_1, null, A);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app1_2")
+            .withUser(USER_1)
+            .withAcls(null)
+            .withQueue(A)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1_2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1_2 = MockRM.launchAndRegisterAM(app1_2, rm1, nm2);
 
-    RMApp app2 = rm1.submitApp(1024, "app2", USER_2, null, B);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app2")
+            .withUser(USER_2)
+            .withAcls(null)
+            .withQueue(B)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
     assertEquals(rm1.getApplicationReport(app2.getApplicationId()).
         getYarnApplicationState(), YarnApplicationState.RUNNING);
 
     //Submit an app with a non existant queue to make sure it does not
     //cause a fatal failure in the non-recovery case
-    RMApp appNA = rm1.submitApp(1024, "app1_2", USER_1, null,
-       QUEUE_DOESNT_EXIST, false);
+    RMApp appNA = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app1_2")
+            .withUser(USER_1)
+            .withAcls(null)
+            .withQueue(QUEUE_DOESNT_EXIST)
+            .withWaitForAppAcceptedState(false)
+            .build());
 
     // clear queue metrics
     rm1.clearQueueMetrics(app1_1);
@@ -941,7 +1015,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     rm2 = new MockRM(conf, rm1.getRMStateStore());
@@ -994,7 +1068,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     MockRM.finishAMAndVerifyAppState(app1, rm1, nm1, am1);
 
@@ -1034,7 +1108,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = MockRM.launchAM(app0, rm1, nm1);
     // Issuing registerAppAttempt() before and after RM restart to confirm
     // registerApplicationMaster() is idempotent.
@@ -1061,7 +1135,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1_1 = rm1.submitApp(1024);
+    RMApp app1_1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     MockAM am1_1 = MockRM.launchAndRegisterAM(app1_1, rm1, nm1);
     
     RMAppAttempt attempt0 = app1_1.getCurrentAppAttempt();
@@ -1097,7 +1171,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = MockRM.launchAndRegisterAM(app0, rm1, nm1);
 
     rm2 = new MockRM(conf, rm1.getRMStateStore());
@@ -1126,7 +1200,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm1.registerNode();
     rm1.start();
 
-    RMApp app1 = rm1.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     final MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // Re-start RM
@@ -1222,7 +1296,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // Restart RM
@@ -1280,7 +1354,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(200);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am0 = MockRM.launchAM(app0, rm1, nm1);
 
     am0.registerAppAttempt();
@@ -1311,7 +1385,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     MockRM rm2 = new TestSecurityMockRM(conf, rm1.getRMStateStore()) {
@@ -1356,7 +1430,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // Change the config so that validateAndCreateResourceRequest throws
@@ -1381,10 +1455,12 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     // submit app with keepContainersAcrossApplicationAttempts true
     Resource resource = Records.newRecord(Resource.class);
     resource.setMemorySize(200);
-    RMApp app0 = rm1.submitApp(resource, "", UserGroupInformation
-        .getCurrentUser().getShortUserName(), null, false, null,
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true,
-        false, null, 0, null, true, null);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithResource(resource, rm1)
+        .withKeepContainers(true)
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .build();
+    RMApp app0 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am0 = MockRM.launchAndRegisterAM(app0, rm1, nm1);
 
     am0.allocate("127.0.0.1", 1000, 2, new ArrayList<ContainerId>());
@@ -1448,7 +1524,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 = new MockNM("127.0.0.1:1234", 15120, rm1.getResourceTrackerService());
     nm1.registerNode();
 
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     MockRM.finishAMAndVerifyAppState(app1, rm1, nm1, am1);
 
@@ -1484,7 +1560,11 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm1.registerNode();
 
     // create app and launch the UAM
-    RMApp app0 = rm1.submitApp(200, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withUnmanagedAM(true)
+            .build();
+    RMApp app0 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am0 = MockRM.launchUAM(app0, rm1, nm1);
     am0.registerAppAttempt();
 
@@ -1574,7 +1654,11 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     nm1.registerNode();
 
     // create app and launch the UAM
-    RMApp app0 = rm1.submitApp(200, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withUnmanagedAM(true)
+            .build();
+    RMApp app0 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am0 = MockRM.launchUAM(app0, rm1, nm1);
     am0.registerAppAttempt();
     rm1.killApp(app0.getApplicationId());
@@ -1650,7 +1734,15 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
         rm1.getResourceTrackerService());
     nm1.registerNode();
     // 2. submit app to queue which is auto-created.
-    RMApp app1 = rm1.submitApp(200, "autoCreatedQApp", user, null, queueName);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("autoCreatedQApp")
+            .withUser(user)
+            .withAcls(null)
+            .withQueue(queueName)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     Resource amResources = app1.getAMResourceRequests().get(0).getCapability();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
@@ -1755,7 +1847,7 @@ public class TestWorkPreservingRMRestart extends ParameterizedSchedulerTestBase
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8192, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app = rm1.submitApp(200);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app, rm1, nm1);
     MockRM.finishAMAndVerifyAppState(app, rm1, nm1, am1);
 

+ 14 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestWorkPreservingUnmanagedAM.java

@@ -76,10 +76,20 @@ public class TestWorkPreservingUnmanagedAM
     boolean unamanged = true;
     int maxAttempts = 1;
     boolean waitForAccepted = true;
-    RMApp app = rm.submitApp(200, "",
-        UserGroupInformation.getCurrentUser().getShortUserName(), null,
-        unamanged, null, maxAttempts, null, null, waitForAccepted,
-        keepContainers);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+        .withAppName("")
+        .withUser(UserGroupInformation.getCurrentUser().getShortUserName())
+        .withAcls(null)
+        .withUnmanagedAM(unamanged)
+        .withQueue(null)
+        .withMaxAppAttempts(maxAttempts)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(waitForAccepted)
+        .withKeepContainers(keepContainers)
+        .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
 
     MockAM am = MockRM.launchUAM(app, rm, nm);
 

+ 2 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/ahs/TestRMApplicationHistoryWriter.java

@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.junit.Assert;
 
 import org.apache.hadoop.conf.Configuration;
@@ -444,7 +445,7 @@ public class TestRMApplicationHistoryWriter {
     rm.start();
     MockNM nm = rm.registerNode("127.0.0.1:1234", 1024 * 10100);
 
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
     //Wait to make sure the attempt has the right state
     //TODO explore a better way than sleeping for a while (YARN-4929)
     Thread.sleep(1000);

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCNodeUpdates.java

@@ -21,6 +21,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.applicationsmanager;
 import java.security.PrivilegedExceptionAction;
 import java.util.List;
 
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.junit.Assert;
 
 import org.apache.hadoop.conf.Configuration;
@@ -112,7 +113,7 @@ public class TestAMRMRPCNodeUpdates {
     MockNM nm2 = rm.registerNode("127.0.0.2:1234", 10000);
     rm.drainEvents();
 
-    RMApp app1 = rm.submitApp(2000);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     // Trigger the scheduling so the AM gets 'launched' on nm1
     nm1.nodeHeartbeat(true);
@@ -148,7 +149,7 @@ public class TestAMRMRPCNodeUpdates {
     MockNM nm4 = rm.registerNode("127.0.0.4:1234", 10000);
     rm.drainEvents();
 
-    RMApp app1 = rm.submitApp(2000);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     // Trigger the scheduling so the AM gets 'launched' on nm1
     nm1.nodeHeartbeat(true);
@@ -208,7 +209,7 @@ public class TestAMRMRPCNodeUpdates {
     Assert.assertEquals(NodeUpdateType.NODE_UNUSABLE, nr.getNodeUpdateType());
         
     // registering another AM gives it the complete failed list
-    RMApp app2 = rm.submitApp(2000);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(2000, rm);
     // Trigger nm2 heartbeat so that AM gets launched on it
     nm2.nodeHeartbeat(true);
     RMAppAttempt attempt2 = app2.getCurrentAppAttempt();

+ 2 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRMRPCResponseId.java

@@ -30,6 +30,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.ApplicationMasterService;
 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.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
 import org.junit.After;
@@ -77,7 +78,7 @@ public class TestAMRMRPCResponseId {
 
     MockNM nm1 = rm.registerNode("h1:1234", 5000);
 
-    RMApp app = rm.submitApp(2000);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2000, rm);
 
     // Trigger the scheduling so the AM gets 'launched'
     nm1.nodeHeartbeat(true);

+ 90 - 20
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/TestAMRestart.java

@@ -27,6 +27,7 @@ import java.util.Map;
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.Lists;
+import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse;
 import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterResponse;
@@ -46,6 +47,8 @@ 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.MockMemoryRMStateStore;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ParameterizedSchedulerTestBase;
 import org.apache.hadoop.yarn.server.resourcemanager.TestRMRestart;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
@@ -84,10 +87,21 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
 
     MockRM rm1 = new MockRM(getConf());
     rm1.start();
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("name")
+        .withUser("user")
+        .withAcls(new HashMap<ApplicationAccessType, String>())
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(-1)
+        .withCredentials(null)
+        .withAppType("MAPREDUCE")
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(true)
+        .build();
     RMApp app1 =
-        rm1.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null, "MAPREDUCE", false, true);
+        MockRMAppSubmitter.submit(rm1, data);
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 10240, rm1.getResourceTrackerService());
     nm1.registerNode();
@@ -287,10 +301,21 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
 
     MockRM rm1 = new MockRM(getConf());
     rm1.start();
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("myname")
+        .withUser("myuser")
+        .withAcls(new HashMap<ApplicationAccessType, String>())
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(-1)
+        .withCredentials(null)
+        .withAppType("MAPREDUCE")
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(true)
+        .build();
     RMApp app1 =
-        rm1.submitApp(200, "myname", "myuser",
-          new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-          null, "MAPREDUCE", false, true);
+        MockRMAppSubmitter.submit(rm1, data);
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8000, rm1.getResourceTrackerService());
     nm1.registerNode();
@@ -400,7 +425,7 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8000, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     AbstractYarnScheduler scheduler =
@@ -525,7 +550,7 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8000, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     AbstractYarnScheduler scheduler =
@@ -566,7 +591,7 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8000, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     AbstractYarnScheduler scheduler =
@@ -657,7 +682,7 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8000, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     // AM should be restarted even though max-am-attempt is 1.
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -735,7 +760,13 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     // set window size to a larger number : 60s
     // we will verify the app should be failed if
     // two continuous attempts failed in 60s.
-    RMApp app = rm1.submitApp(200, 60000, false);
+    RMApp app = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("")
+            .withUser(UserGroupInformation.getCurrentUser().getShortUserName())
+            .withKeepContainers(false)
+            .withAttemptFailuresValidityInterval((long) 60000)
+            .build());
     
     MockAM am = MockRM.launchAM(app, rm1, nm1);
     // Fail current attempt normally
@@ -756,7 +787,13 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
 
     ControlledClock clock = new ControlledClock();
     // set window size to 10s
-    RMAppImpl app1 = (RMAppImpl)rm1.submitApp(200, 10000, false);
+    RMAppImpl app1 = (RMAppImpl) MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("")
+            .withUser(UserGroupInformation.getCurrentUser().getShortUserName())
+            .withKeepContainers(false)
+            .withAttemptFailuresValidityInterval((long) 10000)
+            .build());
     app1.setSystemClock(clock);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     // Fail attempt1 normally
@@ -867,10 +904,21 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
 
     MockRM rm1 = new MockRM(getConf());
     rm1.start();
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("name")
+        .withUser("user")
+        .withAcls(new HashMap<ApplicationAccessType, String>())
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(-1)
+        .withCredentials(null)
+        .withAppType("MAPREDUCE")
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(true)
+        .build();
     RMApp app1 =
-        rm1.submitApp(200, "name", "user",
-            new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-            null, "MAPREDUCE", false, true);
+        MockRMAppSubmitter.submit(rm1, data);
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 10240, rm1.getResourceTrackerService());
     nm1.registerNode();
@@ -972,7 +1020,13 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     nm1.registerNode();
 
     // set window size to 10s and enable keepContainers
-    RMAppImpl app1 = (RMAppImpl)rm1.submitApp(200, 10000, true);
+    RMAppImpl app1 = (RMAppImpl) MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("")
+            .withUser(UserGroupInformation.getCurrentUser().getShortUserName())
+            .withKeepContainers(true)
+            .withAttemptFailuresValidityInterval((long) 10000)
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     int NUM_CONTAINERS = 2;
     allocateContainers(nm1, am1, NUM_CONTAINERS);
@@ -1070,9 +1124,20 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm2 = new MockNM(nm2Address, 4089, rm1.getResourceTrackerService());
     nm2.registerNode();
 
-    RMApp app1 = rm1.submitApp(200, "name", "user",
-        new HashMap<>(), false, "default", -1,
-        null, "MAPREDUCE", false, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+        .withAppName("name")
+        .withUser("user")
+        .withAcls(new HashMap<>())
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(-1)
+        .withCredentials(null)
+        .withAppType("MAPREDUCE")
+        .withWaitForAppAcceptedState(false)
+        .withKeepContainers(true)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
 
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     allocateContainers(nm1, am1, 1);
@@ -1205,7 +1270,12 @@ public class TestAMRestart extends ParameterizedSchedulerTestBase {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8000, rm1.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app1 = rm1.submitApp(200, 0, true);
+
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAttemptFailuresValidityInterval(0)
+            .withKeepContainers(true)
+            .build());
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     allocateContainers(nm1, am1, 1);

+ 3 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/resource/TestResourceProfiles.java

@@ -26,6 +26,7 @@ import org.apache.hadoop.yarn.exceptions.YarnException;
 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.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
 import org.junit.Assert;
@@ -162,7 +163,7 @@ public class TestResourceProfiles {
     MockRM rm = new MockRM(conf);
     rm.start();
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * 1024);
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
     MockAM am1 = rm.sendAMLaunched(attempt1.getAppAttemptId());
@@ -175,7 +176,7 @@ public class TestResourceProfiles {
     rm = new MockRM(conf);
     rm.start();
     nm1 = rm.registerNode("127.0.0.1:1234", 6 * 1024);
-    app1 = rm.submitApp(2048);
+    app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
     nm1.nodeHeartbeat(true);
     attempt1 = app1.getCurrentAppAttempt();
     am1 = rm.sendAMLaunched(attempt1.getAppAttemptId());

+ 32 - 6
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestApplicationLifetimeMonitor.java

@@ -49,6 +49,8 @@ import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.TestRMRestart;
 import org.apache.hadoop.yarn.server.resourcemanager.TestWorkPreservingRMRestart;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
@@ -125,18 +127,34 @@ public class TestApplicationLifetimeMonitor {
       Map<ApplicationTimeoutType, Long> timeouts =
           new HashMap<ApplicationTimeoutType, Long>();
       timeouts.put(ApplicationTimeoutType.LIFETIME, 10L);
-      RMApp app1 = rm.submitApp(1024, appPriority, timeouts);
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppPriority(appPriority)
+              .withApplicationTimeouts(timeouts)
+              .build());
 
       // 20L seconds
       timeouts.put(ApplicationTimeoutType.LIFETIME, 20L);
-      RMApp app2 = rm.submitApp(1024, appPriority, timeouts);
+      RMApp app2 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppPriority(appPriority)
+              .withApplicationTimeouts(timeouts)
+              .build());
 
       // user not set lifetime, so queue max lifetime will be considered.
-      RMApp app3 = rm.submitApp(1024, appPriority, Collections.emptyMap());
+      RMApp app3 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppPriority(appPriority)
+              .withApplicationTimeouts(Collections.emptyMap())
+              .build());
 
       // asc lifetime exceeds queue max lifetime
       timeouts.put(ApplicationTimeoutType.LIFETIME, 40L);
-      RMApp app4 = rm.submitApp(1024, appPriority, timeouts);
+      RMApp app4 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppPriority(appPriority)
+              .withApplicationTimeouts(timeouts)
+              .build());
 
       nm1.nodeHeartbeat(true);
       // Send launch Event
@@ -235,7 +253,11 @@ public class TestApplicationLifetimeMonitor {
     Map<ApplicationTimeoutType, Long> timeouts =
         new HashMap<ApplicationTimeoutType, Long>();
     timeouts.put(ApplicationTimeoutType.LIFETIME, appLifetime);
-    RMApp app1 = rm1.submitApp(200, Priority.newInstance(0), timeouts);
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppPriority(Priority.newInstance(0))
+            .withApplicationTimeouts(timeouts)
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // Re-start RM
@@ -319,7 +341,11 @@ public class TestApplicationLifetimeMonitor {
       Map<ApplicationTimeoutType, Long> timeouts =
           new HashMap<ApplicationTimeoutType, Long>();
       timeouts.put(ApplicationTimeoutType.LIFETIME, appLifetime);
-      RMApp app1 = rm1.submitApp(200, Priority.newInstance(0), timeouts);
+      RMApp app1 = MockRMAppSubmitter.submit(rm1,
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+              .withAppPriority(Priority.newInstance(0))
+              .withApplicationTimeouts(timeouts)
+              .build());
 
       Map<ApplicationTimeoutType, String> updateTimeout =
           new HashMap<ApplicationTimeoutType, String>();

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/TestNodesListManager.java

@@ -38,6 +38,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.NodesListManager;
 import org.apache.hadoop.yarn.server.resourcemanager.NodesListManagerEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.NodesListManagerEventType;
@@ -72,12 +73,12 @@ public class TestNodesListManager {
     RMNode rmnode = MockNodes.newNodeInfo(1, clusterResource);
 
     // Create killing APP
-    RMApp killrmApp = rm.submitApp(200);
+    RMApp killrmApp = MockRMAppSubmitter.submitWithMemory(200, rm);
     rm.killApp(killrmApp.getApplicationId());
     rm.waitForState(killrmApp.getApplicationId(), RMAppState.KILLED);
 
     // Create finish APP
-    RMApp finshrmApp = rm.submitApp(2000);
+    RMApp finshrmApp = MockRMAppSubmitter.submitWithMemory(2000, rm);
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt = finshrmApp.getCurrentAppAttempt();
     MockAM am = rm.sendAMLaunched(attempt.getAppAttemptId());
@@ -87,7 +88,7 @@ public class TestNodesListManager {
     rm.waitForState(am.getApplicationAttemptId(), RMAppAttemptState.FINISHED);
 
     // Create submitted App
-    RMApp subrmApp = rm.submitApp(200);
+    RMApp subrmApp = MockRMAppSubmitter.submitWithMemory(200, rm);
 
     // Fire Event for NODE_USABLE
     nodesListManager.handle(new NodesListManagerEvent(

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/TestRMContainerImpl.java

@@ -53,6 +53,7 @@ import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
 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.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.ahs.RMApplicationHistoryWriter;
 import org.apache.hadoop.yarn.server.resourcemanager.metrics.SystemMetricsPublisher;
@@ -284,7 +285,7 @@ public class TestRMContainerImpl {
     MockRM rm1 = new MockRM(conf);
     rm1.start();
     MockNM nm1 = rm1.registerNode("unknownhost:1234", 8000);
-    RMApp app1 = rm1.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     ResourceScheduler scheduler = rm1.getResourceScheduler();
 
@@ -324,7 +325,7 @@ public class TestRMContainerImpl {
 
     rm1.start();
     MockNM nm1 = rm1.registerNode("unknownhost:1234", 8000);
-    RMApp app1 = rm1.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     nm1.nodeHeartbeat(am1.getApplicationAttemptId(), 1, ContainerState.RUNNING);
 
@@ -364,7 +365,7 @@ public class TestRMContainerImpl {
 
     rm1.start();
     MockNM nm1 = rm1.registerNode("unknownhost:1234", 8000);
-    RMApp app1 = rm1.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     nm1.nodeHeartbeat(am1.getApplicationAttemptId(), 1, ContainerState.RUNNING);
 

+ 73 - 15
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestAbstractYarnScheduler.java

@@ -53,6 +53,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.NMLivelinessMonitor;
 import org.apache.hadoop.yarn.server.resourcemanager.NodesListManager;
 import org.apache.hadoop.yarn.server.resourcemanager.ParameterizedSchedulerTestBase;
@@ -402,7 +404,7 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase {
           new SchedulerApplication<FiCaSchedulerApp>(null, mockAPp.getUser());
 
       // Second app with one app attempt
-      RMApp app = rm1.submitApp(200);
+      RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm1);
       MockAM am1 = MockRM.launchAndRegisterAM(app, rm1, nm1);
       final ContainerId runningContainer =
           ContainerId.newContainerId(am1.getApplicationAttemptId(), 2);
@@ -439,9 +441,21 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase {
       MockNM nm1 = new MockNM("127.0.0.1:1234",
           10240, rm1.getResourceTrackerService());
       nm1.registerNode();
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+          .withAppName("name")
+          .withUser("user")
+          .withAcls(new HashMap<>())
+          .withUnmanagedAM(false)
+          .withQueue("default")
+          .withMaxAppAttempts(-1)
+          .withCredentials(null)
+          .withAppType("Test")
+          .withWaitForAppAcceptedState(false)
+          .withKeepContainers(true)
+          .build();
       RMApp app1 =
-          rm1.submitApp(200, "name", "user", new HashMap<>(), false, "default",
-              -1, null, "Test", false, true);
+          MockRMAppSubmitter.submit(rm1, data);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
       // allocate 1 container with tag1
@@ -530,10 +544,21 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase {
     MockRM rm1 = new MockRM(conf);
     try {
       rm1.start();
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+          .withAppName("name")
+          .withUser("user")
+          .withAcls(new HashMap<ApplicationAccessType, String>())
+          .withUnmanagedAM(false)
+          .withQueue("default")
+          .withMaxAppAttempts(-1)
+          .withCredentials(null)
+          .withAppType("Test")
+          .withWaitForAppAcceptedState(false)
+          .withKeepContainers(true)
+          .build();
       RMApp app1 =
-          rm1.submitApp(200, "name", "user",
-              new HashMap<ApplicationAccessType, String>(), false, "default",
-              -1, null, "Test", false, true);
+          MockRMAppSubmitter.submit(rm1, data);
       MockNM nm1 =
           new MockNM("127.0.0.1:1234", 10240, rm1.getResourceTrackerService());
       nm1.registerNode();
@@ -642,10 +667,21 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase {
     MockRM rm1 = new MockRM(conf);
     try {
       rm1.start();
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+          .withAppName("name")
+          .withUser("user")
+          .withAcls(new HashMap<ApplicationAccessType, String>())
+          .withUnmanagedAM(false)
+          .withQueue("default")
+          .withMaxAppAttempts(-1)
+          .withCredentials(null)
+          .withAppType("Test")
+          .withWaitForAppAcceptedState(false)
+          .withKeepContainers(true)
+          .build();
       RMApp app1 =
-          rm1.submitApp(200, "name", "user",
-              new HashMap<ApplicationAccessType, String>(), false, "default",
-              -1, null, "Test", false, true);
+          MockRMAppSubmitter.submit(rm1, data);
       MockNM nm1 =
           new MockNM("127.0.0.1:1234", 10240, rm1.getResourceTrackerService());
       nm1.registerNode();
@@ -730,10 +766,21 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase {
     MockRM rm = new MockRM(conf);
     try {
       rm.start();
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+          .withAppName("name")
+          .withUser("user")
+          .withAcls(new HashMap<ApplicationAccessType, String>())
+          .withUnmanagedAM(false)
+          .withQueue("default")
+          .withMaxAppAttempts(-1)
+          .withCredentials(null)
+          .withAppType("Test")
+          .withWaitForAppAcceptedState(false)
+          .withKeepContainers(true)
+          .build();
       RMApp rmApp =
-          rm.submitApp(200, "name", "user",
-            new HashMap<ApplicationAccessType, String>(), false, "default", -1,
-            null, "Test", false, true);
+          MockRMAppSubmitter.submit(rm, data);
       MockNM node =
           new MockNM("127.0.0.1:1234", 10240, rm.getResourceTrackerService());
       node.registerNode();
@@ -988,10 +1035,21 @@ public class TestAbstractYarnScheduler extends ParameterizedSchedulerTestBase {
     MockRM rm1 = new MockRM(conf);
     try {
       rm1.start();
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+          .withAppName("name")
+          .withUser("user")
+          .withAcls(new HashMap<ApplicationAccessType, String>())
+          .withUnmanagedAM(false)
+          .withQueue("default")
+          .withMaxAppAttempts(-1)
+          .withCredentials(null)
+          .withAppType("Test")
+          .withWaitForAppAcceptedState(false)
+          .withKeepContainers(true)
+          .build();
       RMApp app1 =
-          rm1.submitApp(200, "name", "user",
-              new HashMap<ApplicationAccessType, String>(), false, "default",
-              -1, null, "Test", false, true);
+          MockRMAppSubmitter.submit(rm1, data);
       MockNM nm1 =
           new MockNM("127.0.0.1:1234", 10240, rm1.getResourceTrackerService());
       nm1.registerNode();

+ 9 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerOvercommit.java

@@ -56,6 +56,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.AdminService;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.TestResourceTrackerService.NullNodeAttributeStore;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
@@ -127,7 +129,8 @@ public abstract class TestSchedulerOvercommit {
     nmId = nm.getNodeId();
 
     // Start an AM with 2GB
-    RMApp app = rm.submitApp(2 * GB);
+    RMApp app = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm).build());
     nm.nodeHeartbeat(true);
     attempt = app.getCurrentAppAttempt();
     am = rm.sendAMLaunched(attempt.getAppAttemptId());
@@ -367,7 +370,11 @@ public abstract class TestSchedulerOvercommit {
     waitMemory(scheduler, nmId, 4 * GB, 4 * GB, 200, 5 * 1000);
 
     // Start an AM with 2GB
-    RMApp app2 = rm.submitApp(2 * GB, "app2", "user2");
+    RMApp app2 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm)
+            .withAppName("app2")
+            .withUser("user2")
+            .build());
     nm.nodeHeartbeat(true);
     RMAppAttempt attempt2 = app2.getCurrentAppAttempt();
     MockAM am2 = rm.sendAMLaunched(attempt2.getAppAttemptId());

+ 9 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulerUtils.java

@@ -77,6 +77,8 @@ import org.apache.hadoop.yarn.ipc.YarnRPC;
 import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager;
 import org.apache.hadoop.yarn.resourcetypes.ResourceTypesTestHelper;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.TestAMAuthorization.MockRMWithAMS;
 import org.apache.hadoop.yarn.server.resourcemanager.TestAMAuthorization.MyContainerManager;
@@ -690,7 +692,13 @@ public class TestSchedulerUtils {
     Map<ApplicationAccessType, String> acls =
             new HashMap<ApplicationAccessType, String>(2);
     acls.put(ApplicationAccessType.VIEW_APP, "*");
-    RMApp app = rm.submitApp(1024, "appname", "appuser", acls);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("appname")
+            .withUser("appuser")
+            .withAcls(acls)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
 
     nm1.nodeHeartbeat(true);
 

+ 16 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestSchedulingWithAllocationRequestId.java

@@ -28,6 +28,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ParameterizedSchedulerTestBase;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
@@ -72,7 +74,7 @@ public class TestSchedulingWithAllocationRequestId
 
       MockNM nm1 = rm.registerNode("127.0.0.1:1234", 4 * GB);
       MockNM nm2 = rm.registerNode("127.0.0.2:5678", 4 * GB);
-      RMApp app1 = rm.submitApp(2048);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
       // kick the scheduling
       nm1.nodeHeartbeat(true);
       RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -114,7 +116,7 @@ public class TestSchedulingWithAllocationRequestId
 
       MockNM nm1 = rm.registerNode("127.0.0.1:1234", 4 * GB);
       MockNM nm2 = rm.registerNode("127.0.0.2:5678", 4 * GB);
-      RMApp app1 = rm.submitApp(2048);
+      RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
       // kick the scheduling
       nm1.nodeHeartbeat(true);
       RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -175,7 +177,12 @@ public class TestSchedulingWithAllocationRequestId
       nm2.registerNode();
 
       // submit 1st app
-      RMApp app1 = rm.submitApp(1 * GB, "user_0", "a1");
+      MockRMAppSubmissionData data1 =
+          MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+              .withAppName("user_0")
+              .withUser("a1")
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       // Submit app1 RR with allocationReqId = 5
@@ -190,7 +197,12 @@ public class TestSchedulingWithAllocationRequestId
       checkAllocatedContainer(allocated.get(0), 1 * GB, nm1.getNodeId(), 5L);
 
       // Submit another application
-      RMApp app2 = rm.submitApp(1 * GB, "user_1", "a2");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+              .withAppName("user_1")
+              .withUser("a2")
+              .build();
+      RMApp app2 = MockRMAppSubmitter.submit(rm, data);
       MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
       // Submit app2 RR with allocationReqId = 5

+ 66 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationLimits.java

@@ -54,6 +54,8 @@ import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
@@ -824,20 +826,41 @@ public class TestApplicationLimits {
 
     // Submit application to queue c where the default partition capacity is
     // zero
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, "c", false);
+    RMApp app1 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app1.getApplicationId(), RMAppState.ACCEPTED);
     assertEquals(RMAppState.ACCEPTED, app1.getState());
     rm.killApp(app1.getApplicationId());
 
-    RMApp app2 = rm.submitApp(GB, "app", "user", null, "a1", false);
+    RMApp app2 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app2.getApplicationId(), RMAppState.ACCEPTED);
     assertEquals(RMAppState.ACCEPTED, app2.getState());
 
     // Check second application is rejected and based on queue level max
     // application app is rejected
-    RMApp app3 = rm.submitApp(GB, "app", "user", null, "a1", false);
+    RMApp app3 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app3.getApplicationId(), RMAppState.FAILED);
     assertEquals(RMAppState.FAILED, app3.getState());
@@ -848,15 +871,36 @@ public class TestApplicationLimits {
         app3.getDiagnostics().toString());
 
     // based on Global limit of queue usert application is rejected
-    RMApp app11 = rm.submitApp(GB, "app", "user", null, "d", false);
+    RMApp app11 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("d")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app11.getApplicationId(), RMAppState.ACCEPTED);
     assertEquals(RMAppState.ACCEPTED, app11.getState());
-    RMApp app12 = rm.submitApp(GB, "app", "user", null, "d", false);
+    RMApp app12 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("d")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app12.getApplicationId(), RMAppState.ACCEPTED);
     assertEquals(RMAppState.ACCEPTED, app12.getState());
-    RMApp app13 = rm.submitApp(GB, "app", "user", null, "d", false);
+    RMApp app13 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("d")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app13.getApplicationId(), RMAppState.FAILED);
     assertEquals(RMAppState.FAILED, app13.getState());
@@ -867,10 +911,24 @@ public class TestApplicationLimits {
         app13.getDiagnostics().toString());
 
     // based on system max limit application is rejected
-    RMApp app14 = rm.submitApp(GB, "app", "user2", null, "a2", false);
+    RMApp app14 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user2")
+            .withAcls(null)
+            .withQueue("a2")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app14.getApplicationId(), RMAppState.ACCEPTED);
-    RMApp app15 = rm.submitApp(GB, "app", "user2", null, "a2", false);
+    RMApp app15 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user2")
+            .withAcls(null)
+            .withQueue("a2")
+            .withWaitForAppAcceptedState(false)
+            .build());
     rm.drainEvents();
     rm.waitForState(app15.getApplicationId(), RMAppState.FAILED);
     assertEquals(RMAppState.FAILED, app15.getState());

+ 212 - 24
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationLimitsByPartition.java

@@ -47,6 +47,8 @@ import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
@@ -155,14 +157,38 @@ public class TestApplicationLimitsByPartition {
     MockNM nm3 = rm1.registerNode("h3:1234", 10 * GB); // label = <empty>
 
     // Submit app1 with 1Gb AM resource to Queue A1 for label X
-    RMApp app1 = rm1.submitApp(GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data5 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data5);
 
     // Submit app2 with 1Gb AM resource to Queue A1 for label X
-    RMApp app2 = rm1.submitApp(GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data4 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data4);
 
     // Submit 3rd app to Queue A1 for label X, and this will be pending as
     // AM limit is already crossed for label X. (2GB)
-    RMApp pendingApp = rm1.submitApp(GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp pendingApp = MockRMAppSubmitter.submit(rm1, data3);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
     LeafQueue leafQueue = (LeafQueue) cs.getQueue("a1");
@@ -185,16 +211,40 @@ public class TestApplicationLimitsByPartition {
 
     // Now verify the same test case in Queue C1 where label is not configured.
     // Submit an app to Queue C1 with empty label
-    RMApp app3 = rm1.submitApp(GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data2);
     MockRM.launchAndRegisterAM(app3, rm1, nm3);
 
     // Submit next app to Queue C1 with empty label
-    RMApp app4 = rm1.submitApp(GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm1, data1);
     MockRM.launchAndRegisterAM(app4, rm1, nm3);
 
     // Submit 3rd app to Queue C1. This will be pending as Queue's am-limit
     // is reached.
-    pendingApp = rm1.submitApp(GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    pendingApp = MockRMAppSubmitter.submit(rm1, data);
 
     leafQueue = (LeafQueue) cs.getQueue("c1");
     Assert.assertNotNull(leafQueue);
@@ -262,14 +312,30 @@ public class TestApplicationLimitsByPartition {
     MockNM nm3 = rm1.registerNode("h3:1234", 10 * GB); // label = <empty>
 
     // Submit app1 (2 GB) to Queue A1 and label X
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data3);
     // This app must be activated eventhough the am-resource per-partition
     // limit is only for 1.5GB.
     MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // Submit 2nd app to label "X" with one GB and it must be pending since
     // am-resource per-partition limit is crossed (1.5 GB was the limit).
-    rm1.submitApp(GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    MockRMAppSubmitter.submit(rm1, data2);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
     LeafQueue leafQueue = (LeafQueue) cs.getQueue("a1");
@@ -283,14 +349,30 @@ public class TestApplicationLimitsByPartition {
     // to see queue level am-resource-limit is still working as expected.
 
     // Submit an app to Queue C1 with empty label (2 GB)
-    RMApp app3 = rm1.submitApp(2 * GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data1);
     // This app must be activated even though the am-resource per-queue
     // limit is only for 1.5GB
     MockRM.launchAndRegisterAM(app3, rm1, nm3);
 
     // Submit 2nd app to C1 (Default label, hence am-limit per-queue will be
     // considered).
-    rm1.submitApp(GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    MockRMAppSubmitter.submit(rm1, data);
 
     leafQueue = (LeafQueue) cs.getQueue("c1");
     Assert.assertNotNull(leafQueue);
@@ -337,11 +419,27 @@ public class TestApplicationLimitsByPartition {
     rm1.registerNode("h3:1234", 10 * GB); // label = <empty>
 
     // Submit app1 (2 GB) to Queue A1 and label X
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
 
     // Submit 2nd app to label "X" with one GB. Since queue am-limit is 2GB,
     // 2nd app will be pending and first one will get activated.
-    RMApp pendingApp = rm1.submitApp(GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp pendingApp = MockRMAppSubmitter.submit(rm1, data);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
     LeafQueue leafQueue = (LeafQueue) cs.getQueue("a1");
@@ -405,14 +503,30 @@ public class TestApplicationLimitsByPartition {
     rm1.registerNode("h3:1234", 10 * GB); // label = <empty>
 
     // Submit app1 with 1Gb AM resource to Queue A1 for label X for user0
-    RMApp app1 = rm1.submitApp(GB, "app", user_0, null, "a1", "x");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser(user_0)
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data3);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // Place few allocate requests to make it an active application
     am1.allocate("*", 1 * GB, 15, new ArrayList<ContainerId>(), "");
 
     // Now submit 2nd app to Queue A1 for label X for user1
-    RMApp app2 = rm1.submitApp(GB, "app", user_1, null, "a1", "x");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser(user_1)
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data2);
     MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
@@ -426,7 +540,15 @@ public class TestApplicationLimitsByPartition {
 
     // Submit 3rd app to Queue A1 for label X for user1. Now user1 will have
     // 2 applications (2 GB resource) and user0 will have one app (1GB).
-    RMApp app3 = rm1.submitApp(GB, "app", user_1, null, "a1", "x");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser(user_1)
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app3, rm1, nm1);
 
     // Place few allocate requests to make it an active application. This is
@@ -438,7 +560,15 @@ public class TestApplicationLimitsByPartition {
     // 4Gb -> 40% of label "X" in queue A1
     // Since we have 2 users, 50% of 4Gb will be max for each user. Here user1
     // has already crossed this 2GB limit, hence this app will be pending.
-    RMApp pendingApp = rm1.submitApp(GB, "app", user_1, null, "a1", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser(user_1)
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp pendingApp = MockRMAppSubmitter.submit(rm1, data);
 
     // Verify active applications count per user and also in queue level.
     Assert.assertEquals(3, leafQueue.getNumActiveApplications());
@@ -518,15 +648,39 @@ public class TestApplicationLimitsByPartition {
     MockNM nm5 = rm1.registerNode("h5:1234", 10 * GB); // label = <empty>
 
     // Submit app1 with 2Gb AM resource to Queue A1 for label Y
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "a1", "y");
+    MockRMAppSubmissionData data4 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("y")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data4);
     MockRM.launchAndRegisterAM(app1, rm1, nm2);
 
     // Submit app2 with 1Gb AM resource to Queue A1 for label Y
-    RMApp app2 = rm1.submitApp(GB, "app", "user", null, "a1", "y");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("y")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data3);
     MockRM.launchAndRegisterAM(app2, rm1, nm3);
 
     // Submit another app with 1Gb AM resource to Queue A1 for label Y
-    rm1.submitApp(GB, "app", "user", null, "a1", "y");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("y")
+            .build();
+    MockRMAppSubmitter.submit(rm1, data2);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
     LeafQueue leafQueue = (LeafQueue) cs.getQueue("a1");
@@ -546,11 +700,27 @@ public class TestApplicationLimitsByPartition {
     Assert.assertEquals(1, leafQueue.getNumPendingApplications());
 
     // Submit app3 with 1Gb AM resource to Queue B1 (no_label)
-    RMApp app3 = rm1.submitApp(GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data1);
     MockRM.launchAndRegisterAM(app3, rm1, nm5);
 
     // Submit another app with 1Gb AM resource to Queue B1 (no_label)
-    rm1.submitApp(GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    MockRMAppSubmitter.submit(rm1, data);
 
     leafQueue = (LeafQueue) cs.getQueue("b1");
     Assert.assertNotNull(leafQueue);
@@ -810,12 +980,30 @@ public class TestApplicationLimitsByPartition {
 
     Resource amResource = Resource.newInstance(GB, 1);
 
-    rm.submitApp(amResource, "app-1", userName, null, queueName);
-    rm.submitApp(amResource, "app-2", userName, null, queueName);
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithResource(amResource, rm)
+            .withAppName("app-1")
+            .withUser(userName)
+            .withAcls(null)
+            .withQueue(queueName)
+            .build());
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithResource(amResource, rm)
+            .withAppName("app-2")
+            .withUser(userName)
+            .withAcls(null)
+            .withQueue(queueName)
+            .build());
 
     // app-3 should not be activated as amLimit will be reached
     // for memory
-    rm.submitApp(amResource, "app-3", userName, null, queueName);
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithResource(amResource, rm)
+            .withAppName("app-3")
+            .withUser(userName)
+            .withAcls(null)
+            .withQueue(queueName)
+            .build());
 
     Assert.assertEquals("PendingApplications should be 1", 1,
         queueA.getNumPendingApplications());

+ 111 - 36
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationPriority.java

@@ -40,6 +40,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppImpl;
@@ -160,7 +162,11 @@ public class TestApplicationPriority {
 
     Priority appPriority1 = Priority.newInstance(5);
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 16 * GB);
-    RMApp app1 = rm.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data1 = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm)
+        .withAppPriority(appPriority1)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
 
     // kick the scheduler, 1 GB given to AM1, remaining 15GB on nm1
     MockAM am1 = MockRM.launchAM(app1, rm, nm1);
@@ -177,11 +183,16 @@ public class TestApplicationPriority {
     SchedulerNodeReport report_nm1 = rm.getResourceScheduler().getNodeReport(
         nm1.getNodeId());
     Assert.assertEquals(15 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(1 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(1 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // Submit the second app App2 with priority 8 (Higher than App1)
     Priority appPriority2 = Priority.newInstance(8);
-    RMApp app2 = rm.submitApp(1 * GB, appPriority2);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm)
+        .withAppPriority(appPriority2)
+        .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
 
     // kick the scheduler, 1 GB which was free is given to AM of App2
     MockAM am2 = MockRM.launchAM(app2, rm, nm1);
@@ -190,7 +201,8 @@ public class TestApplicationPriority {
     // check node report, 16 GB used and 0 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(16 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(0 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(0 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // get scheduler
     CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
@@ -205,13 +217,15 @@ public class TestApplicationPriority {
       if (++counter > 2) {
         break;
       }
-      cs.markContainerForKillable(schedulerAppAttempt.getRMContainer(c.getId()));
+      cs.markContainerForKillable(
+          schedulerAppAttempt.getRMContainer(c.getId()));
     }
 
     // check node report, 12 GB used and 4 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(12 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(4 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(4 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // send updated request for App1
     am1.allocate("127.0.0.1", 2 * GB, 10, new ArrayList<ContainerId>());
@@ -227,7 +241,8 @@ public class TestApplicationPriority {
     // check node report, 16 GB used and 0 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(16 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(0 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(0 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     rm.stop();
   }
@@ -245,7 +260,11 @@ public class TestApplicationPriority {
 
     Priority appPriority1 = Priority.newInstance(5);
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 8 * GB);
-    RMApp app1 = rm.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data3 = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm)
+        .withAppPriority(appPriority1)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data3);
 
     // kick the scheduler, 1 GB given to AM1, remaining 7GB on nm1
     MockAM am1 = MockRM.launchAM(app1, rm, nm1);
@@ -262,19 +281,28 @@ public class TestApplicationPriority {
     SchedulerNodeReport report_nm1 = rm.getResourceScheduler().getNodeReport(
         nm1.getNodeId());
     Assert.assertEquals(8 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(0 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(0 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // Submit the second app App2 with priority 7
     Priority appPriority2 = Priority.newInstance(7);
-    RMApp app2 = rm.submitApp(1 * GB, appPriority2);
+    MockRMAppSubmissionData data2 = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm).withAppPriority(appPriority2).build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data2);
 
     // Submit the third app App3 with priority 8
     Priority appPriority3 = Priority.newInstance(8);
-    RMApp app3 = rm.submitApp(1 * GB, appPriority3);
+    MockRMAppSubmissionData data1 = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm).withAppPriority(appPriority3).build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm, data1);
 
     // Submit the second app App4 with priority 6
     Priority appPriority4 = Priority.newInstance(6);
-    RMApp app4 = rm.submitApp(1 * GB, appPriority4);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm)
+        .withAppPriority(appPriority4)
+        .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm, data);
 
     // Only one app can run as AM resource limit restricts it. Kill app1,
     // If app3 (highest priority among rest) gets active, it indicates that
@@ -289,7 +317,8 @@ public class TestApplicationPriority {
     // check node report, 1 GB used and 7 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(1 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(7 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(7 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     rm.stop();
   }
@@ -308,7 +337,9 @@ public class TestApplicationPriority {
 
     Priority appPriority1 = Priority.newInstance(15);
     rm.registerNode("127.0.0.1:1234", 8 * GB);
-    RMApp app1 = rm.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm).withAppPriority(appPriority1).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // Application submission should be successful and verify priority
     Assert.assertEquals(app1.getApplicationSubmissionContext().getPriority(),
@@ -329,7 +360,9 @@ public class TestApplicationPriority {
 
     Priority appPriority1 = Priority.newInstance(5);
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 16 * GB);
-    RMApp app1 = rm.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm).withAppPriority(appPriority1).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // kick the scheduler, 1 GB given to AM1, remaining 15GB on nm1
     MockAM am1 = MockRM.launchAM(app1, rm, nm1);
@@ -366,7 +399,11 @@ public class TestApplicationPriority {
 
     Priority appPriority1 = Priority.newInstance(5);
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 16 * GB);
-    RMApp app1 = rm.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm)
+        .withAppPriority(appPriority1)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // kick the scheduler, 1 GB given to AM1, remaining 15GB on nm1
     MockAM am1 = MockRM.launchAM(app1, rm, nm1);
@@ -414,7 +451,9 @@ public class TestApplicationPriority {
     nm1.registerNode();
 
     Priority appPriority1 = Priority.newInstance(5);
-    RMApp app1 = rm1.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm1).withAppPriority(appPriority1).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
 
     // kick the scheduler, 1 GB given to AM1, remaining 15GB on nm1
     MockAM am1 = MockRM.launchAM(app1, rm1, nm1);
@@ -469,7 +508,9 @@ public class TestApplicationPriority {
 
     Priority appPriority1 = Priority.newInstance(5);
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 16 * GB);
-    RMApp app1 = rm.submitApp(1 * GB, appPriority1);
+    MockRMAppSubmissionData data1 = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm).withAppPriority(appPriority1).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
 
     // kick the scheduler, 1 GB given to AM1, remaining 15GB on nm1
     MockAM am1 = MockRM.launchAM(app1, rm, nm1);
@@ -481,17 +522,23 @@ public class TestApplicationPriority {
         NUM_CONTAINERS, 2 * GB, nm1);
 
     Assert.assertEquals(7, allocated1.size());
-    Assert.assertEquals(2 * GB, allocated1.get(0).getResource().getMemorySize());
+    Assert.assertEquals(2 * GB,
+        allocated1.get(0).getResource().getMemorySize());
 
     // check node report, 15 GB used (1 AM and 7 containers) and 1 GB available
-    SchedulerNodeReport report_nm1 = rm.getResourceScheduler().getNodeReport(
-        nm1.getNodeId());
+    SchedulerNodeReport report_nm1 =
+        rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(15 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(1 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(1 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // Submit the second app App2 with priority 8 (Higher than App1)
     Priority appPriority2 = Priority.newInstance(8);
-    RMApp app2 = rm.submitApp(1 * GB, appPriority2);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(1 * GB, rm)
+        .withAppPriority(appPriority2)
+        .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
 
     // kick the scheduler, 1 GB which was free is given to AM of App2
     MockAM am2 = MockRM.launchAM(app2, rm, nm1);
@@ -500,7 +547,8 @@ public class TestApplicationPriority {
     // check node report, 16 GB used and 0 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(16 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(0 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(0 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // get scheduler
     CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
@@ -516,14 +564,16 @@ public class TestApplicationPriority {
       if (++counter > 2) {
         break;
       }
-      cs.markContainerForKillable(schedulerAppAttemptApp1.getRMContainer(c.getId()));
+      cs.markContainerForKillable(
+          schedulerAppAttemptApp1.getRMContainer(c.getId()));
       iterator.remove();
     }
 
     // check node report, 12 GB used and 4 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(12 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(4 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(4 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // add request for containers App1
     am1.allocate("127.0.0.1", 2 * GB, 10, new ArrayList<ContainerId>());
@@ -536,7 +586,8 @@ public class TestApplicationPriority {
     // check node report, 16 GB used and 0 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(16 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(0 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(0 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // kill 1 more
     counter = 0;
@@ -546,14 +597,16 @@ public class TestApplicationPriority {
       if (++counter > 1) {
         break;
       }
-      cs.markContainerForKillable(schedulerAppAttemptApp1.getRMContainer(c.getId()));
+      cs.markContainerForKillable(
+          schedulerAppAttemptApp1.getRMContainer(c.getId()));
       iterator.remove();
     }
 
     // check node report, 14 GB used and 2 GB available
     report_nm1 = rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(14 * GB, report_nm1.getUsedResource().getMemorySize());
-    Assert.assertEquals(2 * GB, report_nm1.getAvailableResource().getMemorySize());
+    Assert.assertEquals(2 * GB,
+        report_nm1.getAvailableResource().getMemorySize());
 
     // Change the priority of App1 to 3 (lowest)
     Priority appPriority3 = Priority.newInstance(3);
@@ -619,13 +672,19 @@ public class TestApplicationPriority {
 
     // App-1 with priority 5 submitted and running
     Priority appPriority1 = Priority.newInstance(5);
-    RMApp app1 = rm1.submitApp(memory, appPriority1);
+    MockRMAppSubmissionData data2 = MockRMAppSubmissionData.Builder
+        .createWithMemory(memory, rm1).withAppPriority(appPriority1).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAM(app1, rm1, nm1);
     am1.registerAppAttempt();
 
     // App-2 with priority 6 submitted and running
     Priority appPriority2 = Priority.newInstance(6);
-    RMApp app2 = rm1.submitApp(memory, appPriority2);
+    MockRMAppSubmissionData data1 = MockRMAppSubmissionData.Builder
+        .createWithMemory(memory, rm1)
+        .withAppPriority(appPriority2)
+        .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAM(app2, rm1, nm1);
     am2.registerAppAttempt();
 
@@ -636,7 +695,11 @@ public class TestApplicationPriority {
     // App-3 with priority 7 submitted and scheduled. But not activated since
     // AMResourceLimit threshold
     Priority appPriority3 = Priority.newInstance(7);
-    RMApp app3 = rm1.submitApp(memory, appPriority3);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(memory, rm1)
+        .withAppPriority(appPriority3)
+        .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
 
     rm1.drainEvents();
     Assert.assertEquals(2, defaultQueue.getNumActiveApplications());
@@ -739,7 +802,10 @@ public class TestApplicationPriority {
     CSQueue defaultQueue = (LeafQueue) cs.getQueue("default");
 
     // Update priority and kill application with no resource
-    RMApp app1 = rm.submitApp(1024, Priority.newInstance(appPriority));
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppPriority(Priority.newInstance(appPriority)).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data3);
     Collection<FiCaSchedulerApp> appsPending =
         ((LeafQueue) defaultQueue).getPendingApplications();
     Collection<FiCaSchedulerApp> activeApps =
@@ -756,11 +822,20 @@ public class TestApplicationPriority {
     MockNM nm1 =
         new MockNM("127.0.0.1:1234", 8096, rm.getResourceTrackerService());
     nm1.registerNode();
-    RMApp app2 = rm.submitApp(1024, Priority.newInstance(appPriority));
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppPriority(Priority.newInstance(appPriority)).build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data2);
     Assert.assertEquals("Pending apps should be 0", 0, appsPending.size());
     Assert.assertEquals("Active apps should be 1", 1, activeApps.size());
-    RMApp app3 = rm.submitApp(1024, Priority.newInstance(appPriority));
-    RMApp app4 = rm.submitApp(1024, Priority.newInstance(appPriority));
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppPriority(Priority.newInstance(appPriority)).build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm, data1);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppPriority(Priority.newInstance(appPriority)).build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm, data);
     Assert.assertEquals("Pending apps should be 2", 2, appsPending.size());
     Assert.assertEquals("Active apps should be 1", 1, activeApps.size());
     // kill app3, pending apps should reduce to 1

+ 9 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCSAllocateCustomResource.java

@@ -26,6 +26,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
@@ -122,7 +124,13 @@ public class TestCSAllocateCustomResource {
     // submit app
     Resource amResource = Resources.createResource(1 * g, 1);
     amResource.setResourceValue(customResourceType, 1);
-    RMApp app1 = rm.submitApp(amResource, "app", "user", null, "a");
+    RMApp app1 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithResource(amResource, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // am request containers

+ 288 - 40
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

@@ -109,6 +109,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.NodeManager;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
@@ -1334,7 +1336,7 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
 
     MockNM nm = rm.registerNode("127.0.0.1:1234", 4 * GB);
     NodeId nmId = nm.getNodeId();
-    RMApp app = rm.submitApp(2048);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(2048, rm);
     // kick the scheduling, 2 GB given to AM1, remaining 2GB on nm
     nm.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app.getCurrentAppAttempt();
@@ -1578,7 +1580,13 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     Map<ApplicationAccessType, String> acls =
         new HashMap<ApplicationAccessType, String>(2);
     acls.put(ApplicationAccessType.VIEW_APP, "*");
-    RMApp app = rm.submitApp(1024, "appname", "appuser", acls);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("appname")
+            .withUser("appuser")
+            .withAcls(acls)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
 
     nm1.nodeHeartbeat(true);
 
@@ -1724,7 +1732,7 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     nm1.registerNode();
 
     // create app and launch the AM
-    RMApp app0 = rm1.submitApp(CONTAINER_MEMORY);
+    RMApp app0 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MEMORY, rm1);
     MockAM am0 = MockRM.launchAM(app0, rm1, nm1);
     am0.registerAppAttempt();
 
@@ -1790,7 +1798,7 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     MockRM rm1 = new MockRM(conf);
     rm1.start();
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 8000);
-    RMApp app1 = rm1.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
 
@@ -1870,7 +1878,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     QueueMetrics metrics = scheduler.getRootQueueMetrics();
     Assert.assertEquals(0, metrics.getAppsPending());
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -1942,8 +1958,20 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     Assert.assertEquals(0, metrics.getAppsPending());
 
     // submit two apps in a1
-    RMApp app1 = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
-    RMApp app2 = rm.submitApp(GB, "test-move-2", "user_0", null, "a1");
+    RMApp app1 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .build());
+    RMApp app2 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-2")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .build());
 
     appsInA1 = scheduler.getAppsInQueue("a1");
     appsInB1 = scheduler.getAppsInQueue("b1");
@@ -1952,7 +1980,13 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     assertEquals(2, metrics.getAppsPending());
 
     // submit one app in b1
-    RMApp app3 = rm.submitApp(GB, "test-move-2", "user_0", null, "b1");
+    RMApp app3 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-2")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("b1")
+            .build());
 
     appsInA1 = scheduler.getAppsInQueue("a1");
     appsInB1 = scheduler.getAppsInQueue("b1");
@@ -1996,7 +2030,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
         (AbstractYarnScheduler) rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -2512,7 +2554,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
         (AbstractYarnScheduler) rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -2574,7 +2624,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     YarnScheduler scheduler = rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -2632,7 +2690,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     YarnScheduler scheduler = rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -2890,7 +2956,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
         (AbstractYarnScheduler) rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -2935,7 +3009,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     YarnScheduler scheduler = rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
@@ -2996,7 +3078,7 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     MockNM nm2 = rm.registerNode("127.0.0.1:1235", 10 * GB, 4);
     rm.registerNode("127.0.0.1:1236", 10 * GB, 4);
 
-    RMApp app1 = rm.submitApp(1024);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(1024, rm);
     // kick the scheduling
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -3568,7 +3650,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId attemptId =
         app1.getCurrentAppAttempt().getAppAttemptId();
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
@@ -3719,7 +3809,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
         new MockNM("127.0.0.1:1234", 100 * GB, rm1.getResourceTrackerService());
     nm1.registerNode();
 
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     waitContainerAllocated(am1, 1 * GB, 1, 2, rm1, nm1);
@@ -3729,7 +3827,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     Assert.assertEquals(69 * GB,
         am1.doHeartbeat().getAvailableResources().getMemorySize());
 
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "b2");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // Allocate 5 containers, each one is 8 GB in am2 (40 GB in total)
@@ -3747,7 +3853,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
 
     // Now we submit app3 to a1 (in higher level hierarchy), to see if headroom
     // of app1 (in queue b1) updated correctly
-    RMApp app3 = rm1.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm1);
 
     // Allocate 3 containers, each one is 8 GB in am3 (24 GB in total)
@@ -3800,12 +3914,28 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     nm1.registerNode();
 
     // Launch app1 in a1, resource usage is 1GB (am) + 4GB * 2 = 9GB 
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     waitContainerAllocated(am1, 4 * GB, 2, 2, rm1, nm1);
 
     // Try to launch app2 in a2, asked 2GB, should success 
-    RMApp app2 = rm1.submitApp(2 * GB, "app", "user", null, "a2");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
     try {
       // Try to allocate a container, a's usage=11G/max=12
@@ -3848,11 +3978,27 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     nm2.registerNode();
 
     // Launch app1 in queue=a1
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
 
     // Launch app2 in queue=b1  
-    RMApp app2 = rm.submitApp(8 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(8 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
     // am1 asks for 8 * 1GB container for no label
@@ -3968,7 +4114,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
         amMemory < minAllocMb);
     Resource minAllocResource = Resource.newInstance(minAllocMb, 1);
     String queueName = "a1";
-    RMApp rmApp = rm.submitApp(amMemory, "app-1", "user_0", null, queueName);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(amMemory, rm)
+            .withAppName("app-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue(queueName)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp rmApp = MockRMAppSubmitter.submit(rm, data);
 
     assertEquals("RMApp does not containes minimum allocation",
         minAllocResource, rmApp.getAMResourceRequests().get(0).getCapability());
@@ -4237,7 +4391,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     nm1.registerNode();
 
     // Launch app1 in queue=a1
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // Allocate two more containers
@@ -4344,9 +4506,23 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
         }
       }, 100, 60 * 1000);
 
-    rm.submitApp(amResource1, "app-1", userName, null, queueName);
-
-    rm.submitApp(amResource2, "app-2", userName, null, queueName);
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithResource(amResource1, rm)
+        .withResource(amResource1)
+        .withAppName("app-1")
+        .withUser(userName)
+        .withAcls(null)
+        .withQueue(queueName)
+        .build());
+
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithResource(amResource2, rm)
+        .withResource(amResource2)
+        .withAppName("app-2")
+        .withUser(userName)
+        .withAcls(null)
+        .withQueue(queueName)
+        .build());
 
     // When AM limit is exceeded, 1 applications will be activated.Rest all
     // applications will be in pending
@@ -4532,7 +4708,7 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
 
     MockRM rm = new MockRM(conf);
     rm.start();
-    RMApp app = rm.submitApp(100);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(100, rm);
     rm.drainEvents();
 
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 10240, 10);
@@ -4814,7 +4990,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     nm1.registerNode();
 
     // Launch app1 in queue=a1
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // Got one offswitch request and offswitch allocation
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
@@ -5148,7 +5332,15 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     CapacityScheduler cs = ((CapacityScheduler) rm.getResourceScheduler());
     cs.start();
 
-    RMApp app = rm.submitApp(GB, "appname", "a1", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("appname")
+            .withUser("a1")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     List<ApplicationAttemptId> appsInA1 = cs.getAppsInQueue("a1");
     assertEquals(1, appsInA1.size());
   }
@@ -5265,7 +5457,12 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     final MockNM nm = rm.registerNode("h1:1234", 200 * GB);
 
     // submit app
-    final RMApp app = rm.submitApp(200, "app", "user");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+            .withAppName("app")
+            .withUser("user")
+            .build();
+    final RMApp app = MockRMAppSubmitter.submit(rm, data);
     MockRM.launchAndRegisterAM(app, rm, nm);
 
     // spy capacity scheduler to handle CapacityScheduler#apply
@@ -5329,7 +5526,12 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
 
     // submit app and request resource
     // container2 is larger than nm1 total resource, will trigger locality skip
-    final RMApp app = rm.submitApp(1 * GB, "app", "user");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .build();
+    final RMApp app = MockRMAppSubmitter.submit(rm, data);
     final MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
     am.addRequests(new String[] {"*"}, 5 * GB, 1, 1, 2);
     am.schedule();
@@ -5391,19 +5593,51 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
     MockNM nm1 = rm.registerNode("h1:1234", 16 * GB);
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "u1", null, "a1");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("u1")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data3);
     MockAM am1 = MockRM.launchAndRegisterAM(app, rm, nm1);
 
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();
 
-    RMApp app2 = rm.submitApp(1 * GB, "app", "u2", null, "a1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("u2")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data2);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
 
-    RMApp app3 = rm.submitApp(1 * GB, "app", "u3", null, "a1");
-
-    RMApp app4 = rm.submitApp(1 * GB, "app", "u4", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("u3")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm, data1);
+
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("u4")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm, data);
 
     // Each application asks 50 * 1GB containers
     am1.allocate("*", 1 * GB, 50, null);
@@ -5571,11 +5805,25 @@ public class TestCapacityScheduler extends CapacitySchedulerTestBase {
      * app2: (1 AM,1 reserved container)
      */
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app_1", "user_1", null, "a");
+    MockRMAppSubmissionData submissionData =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app_1")
+            .withUser("user_1")
+            .withAcls(null)
+            .withQueue("a")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, submissionData);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(1 * GB, "app_2", "user_1", null, "a");
+    submissionData =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app_2")
+            .withUser("user_1")
+            .withAcls(null)
+            .withQueue("a")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, submissionData);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     am1.allocate("*", 4 * GB, 1, new ArrayList<ContainerId>());

+ 137 - 20
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAsyncScheduling.java

@@ -33,11 +33,12 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 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.rmapp.attempt.RMAppAttemptState;
 import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer;
 import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerEvent;
@@ -146,8 +147,18 @@ public class TestCapacitySchedulerAsyncScheduling {
     int totalAsked = 3 * GB; // 3 AMs
 
     for (int i = 0; i < 3; i++) {
-      RMApp rmApp = rm.submitApp(1024, "app", "user", null, false,
-          Character.toString((char) (i % 34 + 97)), 1, null, null, false);
+      RMApp rmApp = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app")
+              .withUser("user")
+              .withAcls(null)
+              .withUnmanagedAM(false)
+              .withQueue(Character.toString((char) (i % 34 + 97)))
+              .withMaxAppAttempts(1)
+              .withCredentials(null)
+              .withAppType(null)
+              .withWaitForAppAcceptedState(false)
+              .build());
       MockAM am = MockRM.launchAMWhenAsyncSchedulingEnabled(rmApp, rm);
       am.registerAppAttempt();
       ams.add(am);
@@ -220,8 +231,20 @@ public class TestCapacitySchedulerAsyncScheduling {
     SchedulerNode sn2 = scheduler.getSchedulerNode(nm2.getNodeId());
 
     // launch app
-    RMApp app = rm.submitApp(200, "app", "user", null, false, "default",
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+        .withAppName("app")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
     FiCaSchedulerApp schedulerApp =
         scheduler.getApplicationAttempt(am.getApplicationAttemptId());
@@ -313,10 +336,26 @@ public class TestCapacitySchedulerAsyncScheduling {
         ((CapacityScheduler) scheduler).getSchedulerNode(nm2.getNodeId());
 
     // submit app1, am1 is running on nm1
-    RMApp app = rm.submitApp(200, "app", "user", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data1);
     final MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
     // submit app2, am2 is running on nm1
-    RMApp app2 = rm.submitApp(200, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     final MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
 
     // allocate and launch 2 containers for app1
@@ -450,8 +489,20 @@ public class TestCapacitySchedulerAsyncScheduling {
     SchedulerNode sn1 = scheduler.getSchedulerNode(nm1.getNodeId());
 
     // launch app
-    RMApp app = rm.submitApp(200, "app", "user", null, false, "default",
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+        .withAppName("app")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
     FiCaSchedulerApp schedulerApp =
         scheduler.getApplicationAttempt(am.getApplicationAttemptId());
@@ -532,8 +583,18 @@ public class TestCapacitySchedulerAsyncScheduling {
     keepNMHeartbeat(nms, heartbeatInterval);
 
     for (int i = 0; i < 3; i++) {
-      RMApp rmApp = rm.submitApp(1024, "app", "user", null, false,
-          Character.toString((char) (i % 34 + 97)), 1, null, null, false);
+      RMApp rmApp = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app")
+              .withUser("user")
+              .withAcls(null)
+              .withUnmanagedAM(false)
+              .withQueue(Character.toString((char) (i % 34 + 97)))
+              .withMaxAppAttempts(1)
+              .withCredentials(null)
+              .withAppType(null)
+              .withWaitForAppAcceptedState(false)
+              .build());
       MockAM am = MockRM.launchAMWhenAsyncSchedulingEnabled(rmApp, rm);
       am.registerAppAttempt();
       ams.add(am);
@@ -632,8 +693,20 @@ public class TestCapacitySchedulerAsyncScheduling {
     SchedulerNode sn1 = cs.getSchedulerNode(nm1.getNodeId());
 
     // launch app
-    RMApp app = rm.submitApp(1 * GB, "app", "user", null, false, "default",
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+        .withAppName("app")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm1);
     FiCaSchedulerApp schedulerApp =
         cs.getApplicationAttempt(am.getApplicationAttemptId());
@@ -720,7 +793,15 @@ public class TestCapacitySchedulerAsyncScheduling {
     SchedulerNode sn3 = cs.getSchedulerNode(nm3.getNodeId());
 
     // launch another app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(4 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(4 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     Resource allocateResource = Resources.createResource(5 * GB);
     am1.allocate("*", (int) allocateResource.getMemorySize(), 3, 0,
@@ -771,13 +852,37 @@ public class TestCapacitySchedulerAsyncScheduling {
     SchedulerNode sn1 = cs.getSchedulerNode(nm1.getNodeId());
 
     // launch app1-am on nm1
-    RMApp app1 = rm.submitApp(1 * GB, "app1", "user", null, false, "default",
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+        .withAppName("app1")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // launch app2-am on nm2
-    RMApp app2 = rm.submitApp(1 * GB, "app2", "user", null, false, "default",
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+        .withAppName("app2")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
     // app2 asks 1 * 8G container
@@ -865,8 +970,20 @@ public class TestCapacitySchedulerAsyncScheduling {
     SchedulerNode sn2 = cs.getSchedulerNode(nm2.getNodeId());
 
     // launch app1-am on nm1
-    RMApp app1 = rm.submitApp(1 * GB, "app1", "user", null, false, "default",
-        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS, null, null, true, true);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+        .withAppName("app1")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue("default")
+        .withMaxAppAttempts(YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS)
+        .withCredentials(null)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(true)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // app2 asks 1 * 1G container

+ 20 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java

@@ -24,7 +24,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.CommonConfigurationKeys;
-import org.apache.hadoop.security.GroupMappingServiceProvider;
 import org.apache.hadoop.security.ShellBasedUnixGroupsMapping;
 import org.apache.hadoop.security.TestGroupsCaching;
 import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
@@ -39,6 +38,8 @@ import org.apache.hadoop.yarn.event.EventHandler;
 import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels
     .NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
@@ -64,8 +65,6 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event
     .AppAttemptAddedSchedulerEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event
     .SchedulerEvent;
-import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair
-    .SimpleGroupsMapping;
 import org.apache.hadoop.yarn.server.utils.BuilderUtils;
 import org.apache.hadoop.yarn.util.Records;
 import org.apache.hadoop.yarn.util.YarnVersionInfo;
@@ -469,8 +468,15 @@ public class TestCapacitySchedulerAutoCreatedQueueBase {
     CapacityScheduler capacityScheduler =
         (CapacityScheduler) rm.getResourceScheduler();
     // submit an app
-    RMApp rmApp = rm.submitApp(GB, "test-auto-queue-activation", user, null,
-        leafQueueName);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-auto-queue-activation")
+            .withUser(user)
+            .withAcls(null)
+            .withQueue(leafQueueName)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp rmApp = MockRMAppSubmitter.submit(rm, data);
 
     // check preconditions
     List<ApplicationAttemptId> appsInParentQueue =
@@ -564,9 +570,15 @@ public class TestCapacitySchedulerAutoCreatedQueueBase {
 
   protected RMApp submitApp(String user, String queue, String nodeLabel)
       throws Exception {
-    RMApp app = mockRM.submitApp(GB,
-        "test-auto-queue-creation" + RandomUtils.nextInt(0, 100), user, null,
-        queue, nodeLabel);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, mockRM)
+            .withAppName("test-auto-queue-creation" + RandomUtils.nextInt(0, 100))
+            .withUser(user)
+            .withAcls(null)
+            .withQueue(queue)
+            .withAmLabel(nodeLabel)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(mockRM, data);
     Assert.assertEquals(app.getAmNodeLabelExpression(), nodeLabel);
     // check preconditions
     List<ApplicationAttemptId> appsInC = cs.getAppsInQueue(PARENT_QUEUE);

+ 29 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java

@@ -31,6 +31,8 @@ import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
 import org.apache.hadoop.yarn.server.resourcemanager.placement
@@ -70,7 +72,6 @@ import org.junit.Assert;
 import org.junit.Test;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -171,11 +172,25 @@ public class TestCapacitySchedulerAutoQueueCreation
 
       // submit an app
 
-      RMApp app1 = mockRM.submitApp(GB, "test-auto-queue-creation-1", USER0,
-          null, USER0);
-
-      RMApp app2 = mockRM.submitApp(GB, "test-auto-queue-creation-2", USER1,
-          null, USER1);
+      MockRMAppSubmissionData data1 =
+          MockRMAppSubmissionData.Builder.createWithMemory(GB, mockRM)
+              .withAppName("test-auto-queue-creation-1")
+              .withUser(USER0)
+              .withAcls(null)
+              .withQueue(USER0)
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(mockRM, data1);
+
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(GB, mockRM)
+              .withAppName("test-auto-queue-creation-2")
+              .withUser(USER1)
+              .withAcls(null)
+              .withQueue(USER1)
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app2 = MockRMAppSubmitter.submit(mockRM, data);
       // check preconditions
       List<ApplicationAttemptId> appsInC = cs.getAppsInQueue(PARENT_QUEUE);
       assertEquals(2, appsInC.size());
@@ -350,8 +365,14 @@ public class TestCapacitySchedulerAutoQueueCreation
 
     // submit an app under a different queue name which does not exist
     // and queue mapping does not exist for this user
-    RMApp app = mockRM.submitApp(GB, "app", INVALID_USER, null, INVALID_USER,
-        false);
+    RMApp app = MockRMAppSubmitter.submit(mockRM,
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, mockRM)
+            .withAppName("app")
+            .withUser(INVALID_USER)
+            .withAcls(null)
+            .withQueue(INVALID_USER)
+            .withWaitForAppAcceptedState(false)
+            .build());
     mockRM.drainEvents();
     mockRM.waitForState(app.getApplicationId(), RMAppState.FAILED);
     assertEquals(RMAppState.FAILED, app.getState());

+ 20 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerDynamicBehavior.java

@@ -29,6 +29,8 @@ import org.slf4j.LoggerFactory;
 import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.reservation.ReservationConstants;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
@@ -168,7 +170,15 @@ public class TestCapacitySchedulerDynamicBehavior {
     a1.setEntitlement(new QueueEntitlement(A1_CAPACITY / 100, 1f));
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     // check preconditions
     List<ApplicationAttemptId> appsInA1 = cs.getAppsInQueue("a1");
     assertEquals(1, appsInA1.size());
@@ -203,7 +213,15 @@ public class TestCapacitySchedulerDynamicBehavior {
     CapacityScheduler scheduler = (CapacityScheduler) rm.getResourceScheduler();
 
     // submit an app
-    RMApp app = rm.submitApp(GB, "test-move-1", "user_0", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("test-move-1")
+            .withUser("user_0")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     ApplicationAttemptId appAttemptId =
         rm.getApplicationReport(app.getApplicationId())
             .getCurrentApplicationAttemptId();

+ 110 - 12
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerLazyPreemption.java

@@ -25,6 +25,8 @@ import org.apache.hadoop.yarn.api.records.ResourceRequest;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.monitor.SchedulingMonitor;
 import org.apache.hadoop.yarn.server.resourcemanager.monitor.SchedulingMonitorManager;
 import org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy;
@@ -93,7 +95,15 @@ public class TestCapacitySchedulerLazyPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 7, new ArrayList<ContainerId>());
@@ -110,7 +120,15 @@ public class TestCapacitySchedulerLazyPreemption
     Assert.assertEquals(7, schedulerApp1.getLiveContainers().size());
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // NM1/NM2 has available resource = 0G
@@ -184,7 +202,15 @@ public class TestCapacitySchedulerLazyPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 6, new ArrayList<ContainerId>());
@@ -201,7 +227,15 @@ public class TestCapacitySchedulerLazyPreemption
     Assert.assertEquals(7, schedulerApp1.getLiveContainers().size());
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // NM1/NM2 has available resource = 0G
@@ -277,7 +311,15 @@ public class TestCapacitySchedulerLazyPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 6, new ArrayList<ContainerId>());
@@ -296,7 +338,15 @@ public class TestCapacitySchedulerLazyPreemption
     Assert.assertEquals(7, schedulerApp1.getLiveContainers().size());
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // NM1/NM2 has available resource = 0G
@@ -381,7 +431,15 @@ public class TestCapacitySchedulerLazyPreemption
     RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 6, new ArrayList<ContainerId>());
@@ -397,7 +455,15 @@ public class TestCapacitySchedulerLazyPreemption
     Assert.assertEquals(7, schedulerApp1.getLiveContainers().size());
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // NM1 has available resource = 0G
@@ -484,7 +550,15 @@ public class TestCapacitySchedulerLazyPreemption
     RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 6, new ArrayList<ContainerId>());
@@ -500,7 +574,15 @@ public class TestCapacitySchedulerLazyPreemption
     Assert.assertEquals(7, schedulerApp1.getLiveContainers().size());
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // NM1 has available resource = 0G
@@ -575,7 +657,15 @@ public class TestCapacitySchedulerLazyPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 6, new ArrayList<ContainerId>());
@@ -592,7 +682,15 @@ public class TestCapacitySchedulerLazyPreemption
     Assert.assertEquals(7, schedulerApp1.getLiveContainers().size());
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // NM1/NM2 has available resource = 0G

+ 48 - 6
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerMultiNodes.java

@@ -33,6 +33,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode;
@@ -120,7 +122,15 @@ public class TestCapacitySchedulerMultiNodes extends CapacitySchedulerTestBase {
         .getNodesPerPartition("");
     Assert.assertEquals(4, nodes.size());
 
-    RMApp app1 = rm.submitApp(2048, "app-1", "user1", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2048, rm)
+            .withAppName("app-1")
+            .withUser("user1")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
     SchedulerNodeReport reportNm1 =
         rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
@@ -134,7 +144,15 @@ public class TestCapacitySchedulerMultiNodes extends CapacitySchedulerTestBase {
     // Hence forcefully recompute nodes.
     sorter.reSortClusterNodes();
 
-    RMApp app2 = rm.submitApp(1024, "app-2", "user2", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("app-2")
+            .withUser("user2")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
     SchedulerNodeReport reportNm2 =
         rm.getResourceScheduler().getNodeReport(nm2.getNodeId());
@@ -184,11 +202,23 @@ public class TestCapacitySchedulerMultiNodes extends CapacitySchedulerTestBase {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(5 * GB, "app", "user", null, "default");
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(5 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue, AM container should be launched in nm2
-    RMApp app2 = rm1.submitApp(5 * GB, "app", "user", null, "default");
+    RMApp app2 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(5 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
@@ -263,11 +293,23 @@ public class TestCapacitySchedulerMultiNodes extends CapacitySchedulerTestBase {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(5 * GB, "app", "user", null, "default");
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(5 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue, AM container should be launched in nm2
-    RMApp app2 = rm1.submitApp(5 * GB, "app", "user", null, "default");
+    RMApp app2 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(5 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();

+ 74 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNodeLabelUpdate.java

@@ -38,6 +38,8 @@ import org.apache.hadoop.yarn.exceptions.YarnException;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -220,7 +222,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
     ContainerId containerId;
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm3);
     ApplicationResourceUsageReport appResourceUsageReport =
         rm.getResourceScheduler().getAppResourceUsageReport(
@@ -285,7 +295,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm3);
 
     // request a container.
@@ -446,7 +464,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
     MockNM nm4 = rm.registerNode("h4:1234", 4096 * 2);
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm3);
     am1.allocate("*", GB, 1, new ArrayList<ContainerId>(), "x");
     ContainerId container1 =
@@ -524,7 +550,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
     MockNM nm2 = rm.registerNode("h2:1234", 80000);
 
     // app1
-    RMApp app1 = rm.submitApp(GB, "app", "u1", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("u1")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
 
     // c2 on n1, c3 on n2
@@ -540,7 +574,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
         RMContainerState.ALLOCATED));
     
     // app2
-    RMApp app2 = rm.submitApp(GB, "app", "u2", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("u2")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
     // c2/c3 on n1
@@ -664,7 +706,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm.submitApp(GB, "app", "user", null, "a", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // request a container.
@@ -760,7 +810,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
     rm.registerNode("h9:1234", 2048);
 
     // Submit app with AM container launched on default partition i.e. h1.
-    RMApp app = rm.submitApp(GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     MockRM.launchAndRegisterAM(app, rm, nm1);
     RMAppAttempt appAttempt = app.getCurrentAppAttempt();
     // Add default node blacklist from default
@@ -776,7 +834,15 @@ public class TestCapacitySchedulerNodeLabelUpdate {
     Assert.assertEquals(2, blacklistUpdates.getBlacklistRemovals().size());
 
     // Submission in label x
-    RMApp applabel = rm.submitApp(GB, "app", "user", null, "a", "x");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withAmLabel("x")
+            .build();
+    RMApp applabel = MockRMAppSubmitter.submit(rm, data1);
     MockRM.launchAndRegisterAM(applabel, rm, nm2);
     RMAppAttempt appAttemptlabelx = applabel.getCurrentAppAttempt();
     appAttemptlabelx.getAMBlacklistManager().addNode("h2");

+ 38 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerSchedulingRequestUpdate.java

@@ -30,6 +30,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -75,11 +77,27 @@ public class TestCapacitySchedulerSchedulingRequestUpdate
     nm2.registerNode();
 
     // Launch app1 in queue=a1
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
 
     // Launch app2 in queue=b1
-    RMApp app2 = rm.submitApp(8 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(8 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
     // am1 asks for 8 * 1GB container for no label
     am1.allocateIntraAppAntiAffinity(
@@ -193,11 +211,27 @@ public class TestCapacitySchedulerSchedulingRequestUpdate
     nm2.registerNode();
 
     // Launch app1 in queue=a1
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
 
     // Launch app2 in queue=b1
-    RMApp app2 = rm.submitApp(8 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(8 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
     // am1 asks for 8 * 1GB container for "x"
     am1.allocateIntraAppAntiAffinity("x",

+ 182 - 20
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerSurgicalPreemption.java

@@ -30,6 +30,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.monitor.SchedulingMonitor;
 import org.apache.hadoop.yarn.server.resourcemanager.monitor.SchedulingMonitorManager;
 import org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy;
@@ -121,7 +123,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", user1, null, queue1);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser(user1)
+            .withAcls(null)
+            .withQueue(queue1)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 32, new ArrayList<ContainerId>());
@@ -144,7 +154,15 @@ public class TestCapacitySchedulerSurgicalPreemption
 
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(1 * GB, "app", user2, null, queue2);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser(user2)
+            .withAcls(null)
+            .withQueue(queue2)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // NM1/NM2 has available resource = 2G/4G
@@ -229,7 +247,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 38, new ArrayList<ContainerId>());
@@ -252,7 +278,15 @@ public class TestCapacitySchedulerSurgicalPreemption
 
 
     // Submit app2 to queue-c and asks for a 4G container for AM
-    RMApp app2 = rm1.submitApp(4 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(4 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
 
@@ -333,7 +367,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 6, new ArrayList<>());
@@ -356,7 +398,15 @@ public class TestCapacitySchedulerSurgicalPreemption
         am1.getApplicationAttemptId(), 3);
 
     // Submit app2 to queue-c and asks for a 1G container for AM
-    RMApp app2 = rm1.submitApp(18 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(18 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
 
@@ -442,7 +492,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     RMNode rmNode3 = rm1.getRMContext().getRMNodes().get(nm3.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 2 * GB, 2, new ArrayList<>());
@@ -464,7 +522,15 @@ public class TestCapacitySchedulerSurgicalPreemption
         am1.getApplicationAttemptId(), 2);
 
     // Submit app2 to queue-c and asks for a 2G container for AM, on n3
-    RMApp app2 = rm1.submitApp(2 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm3);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
@@ -567,7 +633,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     }
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, mockNMs[0]);
 
     am1.allocate("*", 1 * GB, 8, new ArrayList<>());
@@ -588,7 +662,15 @@ public class TestCapacitySchedulerSurgicalPreemption
 
     // Submit app2 to queue-c and asks for a 10G container for AM
     // Launch AM in NM9
-    RMApp app2 = rm1.submitApp(10 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(10 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, mockNMs[9]);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
@@ -711,7 +793,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     }
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", users[2], null, queues[2]);
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser(users[2])
+            .withAcls(null)
+            .withQueue(queues[2])
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, mockNMs[4]);
 
     am1.allocate("*", 1 * GB, 4, new ArrayList<>());
@@ -731,7 +821,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     }
 
     // Submit app2 to queue-a and asks for a 0.5G container for AM (on n0)
-    RMApp app2 = rm1.submitApp(512, "app", users[0], null, queues[0]);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(512, rm1)
+            .withAppName("app")
+            .withUser(users[0])
+            .withAcls(null)
+            .withQueue(queues[0])
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, mockNMs[0]);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
@@ -753,7 +851,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     }
 
     // Submit app3 to queue-b and asks for a 0.5G container for AM (on n2)
-    RMApp app3 = rm1.submitApp(512, "app", users[1], null, queues[1]);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(512, rm1)
+            .withAppName("app")
+            .withUser(users[1])
+            .withAcls(null)
+            .withQueue(queues[1])
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, mockNMs[2]);
     FiCaSchedulerApp schedulerApp3 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app3.getApplicationId(), 1));
@@ -943,7 +1049,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     }
 
     // launch an app to queue B, AM container launched in nm4
-    RMApp app1 = rm1.submitApp(4096, "app", "user", null, "B");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(4096, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("B")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, mockNMs[4]);
 
     am1.allocate("*", 4096, NUM_NM-1, new ArrayList<>());
@@ -963,7 +1077,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     }
 
     // Submit app2 to queue A and asks for a 750MB container for AM (on n0)
-    RMApp app2 = rm1.submitApp(1024, "app", "user", null, "A");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("A")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, mockNMs[0]);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
@@ -980,7 +1102,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     rm1.killApp(app1.getApplicationId());
 
     // Submit app3 to queue B and asks for a 5000MB container for AM (on n2)
-    RMApp app3 = rm1.submitApp(1024, "app", "user", null, "B");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("B")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, mockNMs[2]);
     FiCaSchedulerApp schedulerApp3 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app3.getApplicationId(), 1));
@@ -1056,7 +1186,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(3 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(3 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms.get(0));
 
     am1.allocate("*", 21 * GB, 4, new ArrayList<ContainerId>());
@@ -1074,7 +1212,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     Assert.assertEquals(5, schedulerApp1.getLiveContainers().size());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(3 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(3 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nms.get(2));
 
     am2.allocate("*", 21 * GB, 4, new ArrayList<ContainerId>());
@@ -1162,7 +1308,15 @@ public class TestCapacitySchedulerSurgicalPreemption
     RMNode rmNode2 = rm1.getRMContext().getRMNodes().get(nm2.getNodeId());
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 38, new ArrayList<ContainerId>());
@@ -1185,7 +1339,15 @@ public class TestCapacitySchedulerSurgicalPreemption
 
 
     // Submit app2 to queue-c and asks for a 4G container for AM
-    RMApp app2 = rm1.submitApp(4 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(4 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     FiCaSchedulerApp schedulerApp2 = cs.getApplicationAttempt(
         ApplicationAttemptId.newInstance(app2.getApplicationId(), 1));
 

+ 9 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerWithMultiResourceTypes.java

@@ -29,6 +29,8 @@ import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.resource.TestResourceProfiles;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerState;
@@ -285,7 +287,13 @@ public class TestCapacitySchedulerWithMultiResourceTypes {
     rm.registerNode("127.0.0.1:1235",
         TestUtils.createResource(10 * GB, 4, nameToValues));
 
-    RMApp app1 = rm.submitApp(1024, "app-1", "user1", null, "a");
+    RMApp app1 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("app-1")
+            .withUser("user1")
+            .withAcls(null)
+            .withQueue("a")
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     SchedulerNodeReport report_nm1 =

+ 48 - 20
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerWorkflowPriorityMapping.java

@@ -28,6 +28,8 @@ import org.apache.hadoop.yarn.api.records.ApplicationId;
 import org.apache.hadoop.yarn.api.records.Priority;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.WorkflowPriorityMappingsManager.WorkflowPriorityMapping;
@@ -97,10 +99,15 @@ public class TestCapacitySchedulerWorkflowPriorityMapping
         .getWorkflowPriorityMappings());
 
     // Maps to rule corresponding to parent queue "a" for workflow3.
-    mockRM.submitApp(1, "a2", true, ApplicationId.newInstance(0,1),
-        Priority.newInstance(0), ImmutableSet.of(
-            YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
-            + "workflow3"));
+    MockRMAppSubmitter.submit(mockRM,
+        MockRMAppSubmissionData.Builder.createWithMemory(1, mockRM)
+            .withQueue("a2")
+            .withApplicationId(ApplicationId.newInstance(0, 1))
+            .withAppPriority(Priority.newInstance(0))
+            .withApplicationTags(ImmutableSet.of(
+                YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
+                    + "workflow3"))
+            .build());
     RMApp app =
         mockRM.getRMContext().getRMApps().get(ApplicationId.newInstance(0,1));
     assertEquals(4, app.getApplicationSubmissionContext().getPriority()
@@ -108,30 +115,45 @@ public class TestCapacitySchedulerWorkflowPriorityMapping
 
     // Does not match any rule as rule for queue + workflow does not exist.
     // Priority passed in the app is taken up.
-    mockRM.submitApp(1, "a1", true, ApplicationId.newInstance(0,2),
-        Priority.newInstance(6), ImmutableSet.of(
-            YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
-            + "workflow1"));
+    MockRMAppSubmitter.submit(mockRM,
+        MockRMAppSubmissionData.Builder.createWithMemory(1, mockRM)
+            .withQueue("a1")
+            .withApplicationId(ApplicationId.newInstance(0, 2))
+            .withAppPriority(Priority.newInstance(6))
+            .withApplicationTags(ImmutableSet.of(
+                YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
+                    + "workflow1"))
+            .build());
     app =
         mockRM.getRMContext().getRMApps().get(ApplicationId.newInstance(0,2));
     assertEquals(6, app.getApplicationSubmissionContext().getPriority()
         .getPriority());
 
     // Maps to rule corresponding to parent queue "a1" for workflow2.
-    mockRM.submitApp(1, "a1", true, ApplicationId.newInstance(0,3),
-        Priority.newInstance(0), ImmutableSet.of(
-            YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
-            + "workflow2"));
+    MockRMAppSubmitter.submit(mockRM,
+        MockRMAppSubmissionData.Builder.createWithMemory(1, mockRM)
+            .withQueue("a1")
+            .withApplicationId(ApplicationId.newInstance(0, 3))
+            .withAppPriority(Priority.newInstance(0))
+            .withApplicationTags(ImmutableSet.of(
+                YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
+                    + "workflow2"))
+            .build());
     app =
         mockRM.getRMContext().getRMApps().get(ApplicationId.newInstance(0,3));
     assertEquals(3, app.getApplicationSubmissionContext().getPriority()
         .getPriority());
 
     // Maps to rule corresponding to parent queue "b" for workflow1.
-    mockRM.submitApp(1, "b3", true, ApplicationId.newInstance(0,4),
-        Priority.newInstance(0), ImmutableSet.of(
-            YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
-            + "workflow1"));
+    MockRMAppSubmitter.submit(mockRM,
+        MockRMAppSubmissionData.Builder.createWithMemory(1, mockRM)
+            .withQueue("b3")
+            .withApplicationId(ApplicationId.newInstance(0, 4))
+            .withAppPriority(Priority.newInstance(0))
+            .withApplicationTags(ImmutableSet.of(
+                YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
+                    + "workflow1"))
+            .build());
     app = mockRM.getRMContext().getRMApps().get(ApplicationId.newInstance(0,4));
     assertEquals(2, app.getApplicationSubmissionContext().getPriority()
         .getPriority());
@@ -140,10 +162,16 @@ public class TestCapacitySchedulerWorkflowPriorityMapping
     conf.setBoolean(CapacitySchedulerConfiguration
         .ENABLE_WORKFLOW_PRIORITY_MAPPINGS_OVERRIDE, false);
     cs.reinitialize(conf, mockRM.getRMContext());
-    mockRM.submitApp(1, "a2", true, ApplicationId.newInstance(0,5),
-        Priority.newInstance(0), ImmutableSet.of(
-            YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
-            + "workflow3"));
+
+    MockRMAppSubmitter.submit(mockRM,
+        MockRMAppSubmissionData.Builder.createWithMemory(1, mockRM)
+            .withQueue("a2")
+            .withApplicationId(ApplicationId.newInstance(0, 5))
+            .withAppPriority(Priority.newInstance(0))
+            .withApplicationTags(ImmutableSet.of(
+                YarnConfiguration.DEFAULT_YARN_WORKFLOW_ID_TAG_PREFIX
+                    + "workflow3"))
+            .build());
     app = mockRM.getRMContext().getRMApps().get(ApplicationId.newInstance(0,5));
     assertEquals(0, app.getApplicationSubmissionContext().getPriority()
         .getPriority());

+ 236 - 31
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerAllocation.java

@@ -44,6 +44,8 @@ import org.apache.hadoop.yarn.server.api.ContainerType;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
 import org.apache.hadoop.yarn.server.resourcemanager.RMSecretManagerService;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
@@ -115,7 +117,7 @@ public class TestContainerAllocation {
     }
     Assert.assertEquals(2, rm.getRMContext().getRMNodes().size());
     // Submit an application
-    RMApp app1 = rm.submitApp(128);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(128, rm);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -167,7 +169,7 @@ public class TestContainerAllocation {
     MockRM rm1 = new MockRM(conf);
     rm1.start();
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 8000);
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     // request a container.
     am1.allocate("127.0.0.1", 1024, 1, new ArrayList<ContainerId>());
@@ -196,7 +198,7 @@ public class TestContainerAllocation {
     MockRM rm1 = new MockRM(conf);
     rm1.start();
     MockNM nm1 = rm1.registerNode("unknownhost:1234", 8000);
-    RMApp app1 = rm1.submitApp(200);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // request a container.
@@ -264,7 +266,10 @@ public class TestContainerAllocation {
   private LogAggregationContext getLogAggregationContextFromContainerToken(
       MockRM rm1, MockNM nm1, LogAggregationContext logAggregationContext)
       throws Exception {
-    RMApp app2 = rm1.submitApp(200, logAggregationContext);
+    RMApp app2 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withLogAggregationContext(logAggregationContext)
+            .build());
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
     nm1.nodeHeartbeat(true);
     // request a container.
@@ -332,7 +337,7 @@ public class TestContainerAllocation {
     RMApp app1;
     try {
       SecurityUtilTestHelper.setTokenServiceUseIp(true);
-      app1 = rm1.submitApp(200);
+      app1 = MockRMAppSubmitter.submitWithMemory(200, rm1);
       RMAppAttempt attempt = app1.getCurrentAppAttempt();
       nm1.nodeHeartbeat(true);
 
@@ -370,11 +375,27 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     
     // launch another app to queue, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
   
     am1.allocate("*", 4 * GB, 1, new ArrayList<ContainerId>());
@@ -453,11 +474,27 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     am1.allocate("*", 4 * GB, 1, new ArrayList<ContainerId>());
@@ -549,11 +586,27 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     am1.allocate("*", 4 * GB, 1, new ArrayList<ContainerId>());
@@ -621,7 +674,15 @@ public class TestContainerAllocation {
     MockNM nm1 = rm1.registerNode("h1:1234", 80 * GB);
 
     // launch an app to queue, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     am1.allocate("*", 1 * GB, 5, new ArrayList<ContainerId>());
@@ -670,12 +731,28 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 90 * GB);
 
     // launch an app to queue A, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch 2nd app to queue B, AM container should be launched in nm1
     // Now usage of nm1 is 3G (2G + 1G)
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     am1.allocate("*", 4 * GB, 2, null);
@@ -722,11 +799,27 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue default, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "u1", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("u1")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch 2nd app to queue default, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(4 * GB, "app", "u2", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(4 * GB, rm1)
+            .withAppName("app")
+            .withUser("u2")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // am1 asks 1 * 3G container
@@ -813,15 +906,39 @@ public class TestContainerAllocation {
     MockNM nm1 = rm1.registerNode("h1:1234", 100 * GB);
 
     // launch an app to queue A, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch an app to queue B, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(2 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // launch an app to queue C, AM container should be launched in nm1
-    RMApp app3 = rm1.submitApp(2 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm1);
 
     // Each application asks 10 * 5GB containers
@@ -918,11 +1035,27 @@ public class TestContainerAllocation {
     MockNM nm1 = rm1.registerNode("h1:1234", 1000 * GB);
 
     // launch app from 1st user to queue C, AM container should be launched in nm1
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user1", null, "c");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user1")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch app from 2nd user to queue C, AM container should be launched in nm1
-    RMApp app2 = rm1.submitApp(2 * GB, "app", "user2", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user2")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // Each application asks 1000 * 5GB containers
@@ -965,15 +1098,47 @@ public class TestContainerAllocation {
     rm1.start();
     MockNM nm1 = rm1.registerNode("h1:1234", 8 * GB);
 
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "u1", null, "default");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("u1")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data3);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "u2", null, "default");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("u2")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
-    RMApp app3 = rm1.submitApp(1 * GB, "app", "u3", null, "default");
-
-    RMApp app4 = rm1.submitApp(1 * GB, "app", "u4", null, "default");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("u3")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data1);
+
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("u4")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm1, data);
 
     // Each application asks 50 * 1GB containers
     am1.allocate("*", 1 * GB, 50, null);
@@ -1031,11 +1196,27 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // launch an app to queue "a", AM container should be launched on nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue "b", AM container should be launched on nm1
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     am1.allocate("*", 7 * GB, 2, new ArrayList<ContainerId>());
@@ -1112,11 +1293,27 @@ public class TestContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 10 * GB);
 
     // launch an app to queue "c1", AM container should be launched on nm1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // launch another app to queue "b", AM container should be launched on nm1
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     am1.allocate("*", 2 * GB, 1, new ArrayList<ContainerId>());
@@ -1156,7 +1353,15 @@ public class TestContainerAllocation {
     // submit an app beyond queue max leads to failure.
     boolean submitFailed = false;
     MockNM nm1 = rm1.registerNode("h1:1234", 2 * GB, 1);
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     try {
       am1.allocate("*", 5 * GB, 1, null);

+ 92 - 10
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestContainerResizing.java

@@ -42,6 +42,8 @@ import org.apache.hadoop.yarn.event.DrainDispatcher;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -125,7 +127,15 @@ public class TestContainerResizing {
     MockNM nm1 = rm1.registerNode("h1:1234", 20 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     ContainerId containerId1 =
@@ -183,7 +193,15 @@ public class TestContainerResizing {
     MockNM nm1 = rm1.registerNode("h1:1234", 20 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(3 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(3 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
         rm1, app1.getApplicationId());
@@ -248,7 +266,15 @@ public class TestContainerResizing {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -349,7 +375,15 @@ public class TestContainerResizing {
     MockNM nm1 = rm1.registerNode("h1:1234", 8 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -424,7 +458,15 @@ public class TestContainerResizing {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -538,7 +580,15 @@ public class TestContainerResizing {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(2 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -655,7 +705,15 @@ public class TestContainerResizing {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -759,7 +817,15 @@ public class TestContainerResizing {
     MockNM nm2 = rm1.registerNode("h2:1234", 8 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -883,7 +949,15 @@ public class TestContainerResizing {
     MockNM nm1 = rm1.registerNode("h1:1234", 10 * GB);
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     FiCaSchedulerApp app = TestUtils.getFiCaSchedulerApp(
@@ -964,7 +1038,15 @@ public class TestContainerResizing {
     // register a node
     MockNM nm = rm.registerNode("h1:1234", 20 * GB);
     // submit an application -> app1
-    RMApp app1 = rm.submitApp(3 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(3 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
     // making sure resource is allocated
     checkUsedResource(rm, "default", 3 * GB, null);

+ 38 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestIncreaseAllocationExpirer.java

@@ -33,6 +33,8 @@ import org.apache.hadoop.yarn.event.DrainDispatcher;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -82,7 +84,15 @@ public class TestIncreaseAllocationExpirer {
     rm1.start();
     // Submit an application
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 20 * GB);
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     // Report AM container status RUNNING to remove it from expirer
     nm1.nodeHeartbeat(
@@ -166,7 +176,15 @@ public class TestIncreaseAllocationExpirer {
     };
     rm1.start();
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 20 * GB);
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     nm1.nodeHeartbeat(
         app1.getCurrentAppAttempt()
@@ -242,7 +260,15 @@ public class TestIncreaseAllocationExpirer {
     rm1.start();
     // Submit an application
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 20 * GB);
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     nm1.nodeHeartbeat(
         app1.getCurrentAppAttempt()
@@ -359,7 +385,15 @@ public class TestIncreaseAllocationExpirer {
     rm1.start();
     // Submit an application
     MockNM nm1 = rm1.registerNode("127.0.0.1:1234", 20 * GB);
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     nm1.nodeHeartbeat(
         app1.getCurrentAppAttempt()

+ 405 - 45
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestNodeLabelContainerAllocation.java

@@ -37,6 +37,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
@@ -178,7 +180,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(200, "app", "user", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     
     // A has only 10% of x, so it can only allocate one container in label=empty
@@ -268,7 +278,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(1024, "app", "user", null, "a1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // request a container (label = y). can be allocated on nm2 
@@ -282,7 +300,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue b1 (label = y), and check all container will
     // be allocated in h5
-    RMApp app2 = rm1.submitApp(1024, "app", "user", null, "b1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm5);
 
     // request a container for AM, will succeed
@@ -296,7 +322,15 @@ public class TestNodeLabelContainerAllocation {
         RMContainerState.ALLOCATED));
     
     // launch an app to queue b2
-    RMApp app3 = rm1.submitApp(1024, "app", "user", null, "b2");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm5);
 
     // request a container. try to allocate on nm1 (label = x) and nm3 (label =
@@ -347,7 +381,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(200, "app", "user", null, "a1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm3);
 
     // request a container.
@@ -363,7 +405,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue b1 (label = y), and check all container will
     // be allocated in h2
-    RMApp app2 = rm1.submitApp(200, "app", "user", null, "b1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm3);
 
     // request a container.
@@ -378,7 +428,15 @@ public class TestNodeLabelContainerAllocation {
     
     // launch an app to queue c1 (label = ""), and check all container will
     // be allocated in h3
-    RMApp app3 = rm1.submitApp(200, "app", "user", null, "c1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm3);
 
     // request a container.
@@ -423,7 +481,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(200, "app", "user", null, "a1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // request a container.
@@ -439,7 +505,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue b1 (label = y), and check all container will
     // be allocated in h2
-    RMApp app2 = rm1.submitApp(200, "app", "user", null, "b1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // request a container.
@@ -454,7 +528,15 @@ public class TestNodeLabelContainerAllocation {
     
     // launch an app to queue c1 (label = ""), and check all container will
     // be allocated in h3
-    RMApp app3 = rm1.submitApp(200, "app", "user", null, "c1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm3);
 
     // request a container.
@@ -503,7 +585,15 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // request a container.
@@ -569,10 +659,26 @@ public class TestNodeLabelContainerAllocation {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(1 * GB, "app1", "user", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app1")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
-    RMApp app2 = rm1.submitApp(1 * GB, "app2", "user", null, "a1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app2")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // request a container.
@@ -654,7 +760,15 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 40 * GB); // label = y
     // launch an app to queue b1 (label = y), AM container should be launched in
     // nm2
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
     // Creating request set when request before ANY is not having label and any
     // is having label
@@ -752,11 +866,27 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 100 * GB); // label = <empty>
 
     // launch an app to queue b1 (label = y), AM container should be launched in nm2
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
     
     // launch another app to queue b1 (label = y), AM container should be launched in nm2
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // request container and nm1 do heartbeat (nm2 has label=y), note that app1
@@ -830,7 +960,15 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 100 * GB); // label = <empty>
 
     // launch an app to queue b1 (label = y), AM container should be launched in nm3
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
     
     // request containers from am2, priority=1 asks for "" and priority=2 asks
@@ -881,7 +1019,15 @@ public class TestNodeLabelContainerAllocation {
     ContainerId nextContainerId;
 
     // launch an app to queue b1 (label = y), AM container should be launched in nm3
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
     
     // request containers from am2, priority=1 asks for "" * 6 (id from 4 to 9),
@@ -999,27 +1145,75 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 100 * GB); // label = <empty>
 
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data5 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data5);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
     
     // app2 -> a2
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "a2");
+    MockRMAppSubmissionData data4 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data4);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
     
     // app3 -> b1
-    RMApp app3 = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data3);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm1);
     
     // app4 -> b2
-    RMApp app4 = rm1.submitApp(1 * GB, "app", "user", null, "b2");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am4 = MockRM.launchAndRegisterAM(app4, rm1, nm2);
     
     // app5 -> c1
-    RMApp app5 = rm1.submitApp(1 * GB, "app", "user", null, "c1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app5 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am5 = MockRM.launchAndRegisterAM(app5, rm1, nm1);
     
     // app6 -> b2
-    RMApp app6 = rm1.submitApp(1 * GB, "app", "user", null, "c2");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app6 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am6 = MockRM.launchAndRegisterAM(app6, rm1, nm2);
     
     // Each application request 5 * 1GB container
@@ -1108,7 +1302,15 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 10 * GB); // label = <empty>
 
     // app1 -> b
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
     
     // Each application request 50 * 1GB container
@@ -1172,7 +1374,15 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm1 = rm1.registerNode(nodeIdStr, 8 * GB); // label = x
 
     // launch an app to queue b1 (label = y), AM container should be launched in nm3
-    RMApp app = rm1.submitApp(1 * GB, "app", "user", null, "b1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm1, data);
    
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
     RMNode rmNode1 = rm1.getRMContext().getRMNodes().get(nm1.getNodeId());
@@ -1259,7 +1469,15 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm1.registerNode("h2:1234", 10 * GB); // label = <empty>
 
     // app1 -> a
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
 
     // app1 asks for 10 partition= containers
@@ -1447,7 +1665,15 @@ public class TestNodeLabelContainerAllocation {
     checkQueueUsedCapacity("root", cs, "", 0f, 0f);
 
     // app1 -> a1
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
 
     // app1 asks for 1 partition= containers
@@ -1498,7 +1724,15 @@ public class TestNodeLabelContainerAllocation {
     // submit an app to a2, uses 1 NON_PARTITIONED container and 1 PARTITIONED
     // container
     // app2 -> a2
-    RMApp app2 = rm.submitApp(1 * GB, "app", "user", null, "a2");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a2")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
     // app1 asks for 1 partition= containers
@@ -1655,19 +1889,51 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm2 = rm.registerNode("h2:1234", 10 * GB); // label = <empty>
     
     // app1 -> a
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data3);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2);
     
     // app2 -> b
-    RMApp app2 = rm.submitApp(1 * GB, "app", "user", null, "b");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data2);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
     
     // app3 -> c
-    RMApp app3 = rm.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm, nm2);
     
     // app4 -> d
-    RMApp app4 = rm.submitApp(1 * GB, "app", "user", null, "d");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("d")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm, data);
     MockAM am4 = MockRM.launchAndRegisterAM(app4, rm, nm2);
 
     // Test case 1
@@ -1817,11 +2083,27 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm1 = rm.registerNode("h1:1234", 10 * GB); // label = x
 
     // app1 -> a
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a", "x");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
     // app2 -> b
-    RMApp app2 = rm.submitApp(1 * GB, "app", "user", null, "b", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b")
+            .withAmLabel("x")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
 
     // Both a/b has used_capacity(x) = 0, when doing exclusive allocation, a
@@ -1909,7 +2191,15 @@ public class TestNodeLabelContainerAllocation {
     nm1.registerNode();
 
     // Launch app1 in a1, resource usage is 1GB (am) + 4GB * 2 = 9GB
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
     am1.allocate("*", 4 * GB, 2, new ArrayList<ContainerId>(), "x");
     doNMHeartbeat(rm, nm1.getNodeId(), 10);
@@ -1917,7 +2207,15 @@ public class TestNodeLabelContainerAllocation {
         cs.getApplicationAttempt(am1.getApplicationAttemptId()));
 
     // Try to launch app2 in a2, asked 2GB, should success
-    RMApp app2 = rm.submitApp(2 * GB, "app", "user", null, "a2", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a2")
+            .withAmLabel("x")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
 
     // am2 asks more resources, cannot success because current used = 9G (app1)
@@ -1998,7 +2296,15 @@ public class TestNodeLabelContainerAllocation {
     assertEquals(0 * GB, leafQueueB.getMetrics().getAllocatedMB());
 
     // app1 -> a
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // app1 asks for 5 partition=x containers
@@ -2103,7 +2409,15 @@ public class TestNodeLabelContainerAllocation {
     MockNM nm1 = rm1.registerNode("h1:1234", 10 * GB); // label = x
     MockNM nm2 = rm1.registerNode("h2:1234", 10 * GB); // label = <no_label>
     // app1 -> a
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm2);
 
     // app1 asks for 3 partition= containers
@@ -2212,7 +2526,14 @@ public class TestNodeLabelContainerAllocation {
     assertEquals(0 * GB, leafQueueA.getMetrics().getAllocatedMB());
 
     // app1 -> a
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a", "x");
+    RMApp app1 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withAmLabel("x")
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // app1 asks for 5 partition=x containers
@@ -2245,7 +2566,14 @@ public class TestNodeLabelContainerAllocation {
     assertEquals(0 * GB, leafQueueA.getMetrics().getAllocatedMB());
 
     // app2 -> a
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "a", "");
+    RMApp app2 = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withAmLabel("")
+            .build());
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // app2 asks for 5 partition= containers
@@ -2370,7 +2698,15 @@ public class TestNodeLabelContainerAllocation {
     rm1.start();
     MockNM nm1 = rm1.registerNode("h1:1234", 20 * GB); // label = x
     // app1 -> a1
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data3);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // app1 asks for 6 partition=x containers
@@ -2390,7 +2726,15 @@ public class TestNodeLabelContainerAllocation {
 
     // Try to launch app2 in a2, asked 2GB, should success
     // app2 -> a2
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "a2", "x");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a2")
+            .withAmLabel("x")
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm1);
 
     // app2 asks for 4 partition=x containers
@@ -2414,7 +2758,15 @@ public class TestNodeLabelContainerAllocation {
 
     // Try to launch app3 in a2, asked 6GB, should fail
     // app3 -> a2
-    RMApp app3 = rm1.submitApp(1 * GB, "app", "user", null, "a2", "x");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a2")
+            .withAmLabel("x")
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm1);
 
     am3.allocate("*", 1 * GB, 6, new ArrayList<ContainerId>(), "x");
@@ -2434,7 +2786,15 @@ public class TestNodeLabelContainerAllocation {
     rm1.waitForAppRemovedFromScheduler(app1.getApplicationId());
 
     // app4 -> a1, try to allocate more than 6GB resource, should fail
-    RMApp app4 = rm1.submitApp(1 * GB, "app", "user", null, "a1", "x");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withAmLabel("x")
+            .build();
+    RMApp app4 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am4 = MockRM.launchAndRegisterAM(app4, rm1, nm1);
 
     // app3 asks for 7 partition=x containers

+ 11 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueState.java

@@ -33,6 +33,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -226,7 +228,15 @@ public class TestQueueState {
     MockNM nm = rm.registerNode("h1:1234", 204800);
 
     // submit an app, AM is running on nm1
-    RMApp app = rm.submitApp(1024, "appname", "appuser", null, Q2);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+            .withAppName("appname")
+            .withUser("appuser")
+            .withAcls(null)
+            .withQueue(Q2)
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm, data);
     MockRM.launchAM(app, rm, nm);
     rm.waitForState(app.getApplicationId(), RMAppState.ACCEPTED);
     // update queue state to STOPPED

+ 100 - 17
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestSchedulingRequestContainerAllocation.java

@@ -24,8 +24,11 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
 import org.apache.hadoop.yarn.api.records.ExecutionType;
 import org.apache.hadoop.yarn.api.records.ExecutionTypeRequest;
+import org.apache.hadoop.yarn.api.records.ResourceRequest;
 import org.apache.hadoop.yarn.api.records.SchedulingRequest;
 import org.apache.hadoop.yarn.api.resource.PlacementConstraint;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.constraint.TargetApplicationsNamespace;
 import org.apache.hadoop.yarn.api.records.Priority;
 import org.apache.hadoop.yarn.api.records.Resource;
@@ -56,6 +59,7 @@ import org.junit.runners.Parameterized.Parameters;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -106,6 +110,22 @@ public class TestSchedulingRequestContainerAllocation {
     mgr.init(conf);
   }
 
+  private RMApp submitApp(MockRM rm, int memory, Set<String> appTags)
+      throws Exception {
+    Resource resource = Resource.newInstance(memory, 0);
+    ResourceRequest amResourceRequest = ResourceRequest.newInstance(
+        Priority.newInstance(0), ResourceRequest.ANY, resource, 1);
+    List<ResourceRequest> amResourceRequests =
+        Collections.singletonList(amResourceRequest);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithResource(resource, rm)
+            .withAmLabel(null)
+            .withAmResourceRequests(amResourceRequests)
+            .withApplicationTags(appTags)
+            .build();
+    return MockRMAppSubmitter.submit(rm, data);
+  }
+
   @Test(timeout = 30000L)
   public void testIntraAppAntiAffinity() throws Exception {
     Configuration csConf = TestUtils.getConfigurationWithMultipleQueues(conf);
@@ -130,7 +150,15 @@ public class TestSchedulingRequestContainerAllocation {
     }
 
     // app1 -> c
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     // app1 asks for 10 anti-affinity containers for the same app. It should
@@ -196,7 +224,15 @@ public class TestSchedulingRequestContainerAllocation {
     }
 
     // app1 -> c
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     // app1 asks for 2 anti-affinity containers for the same app.
@@ -266,7 +302,15 @@ public class TestSchedulingRequestContainerAllocation {
     }
 
     // app1 -> c
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     // app1 asks for 3 anti-affinity containers for the same app. It should
@@ -287,7 +331,15 @@ public class TestSchedulingRequestContainerAllocation {
         + rmNodes[2].getAllocationTagsWithCount().get("mapper"));
 
     // app2 -> c
-    RMApp app2 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nms[0]);
 
     // App2 asks for 3 containers that anti-affinity with any mapper,
@@ -322,7 +374,15 @@ public class TestSchedulingRequestContainerAllocation {
         }));
 
     // app3 -> c
-    RMApp app3 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nms[0]);
 
     // App3 asks for 3 containers that anti-affinity with any mapper.
@@ -368,7 +428,15 @@ public class TestSchedulingRequestContainerAllocation {
     }
 
     // app1 -> c
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     // app1 asks for 2 anti-affinity containers for the same app.
@@ -410,7 +478,15 @@ public class TestSchedulingRequestContainerAllocation {
     }
 
     // app1 -> c
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler();
@@ -470,7 +546,14 @@ public class TestSchedulingRequestContainerAllocation {
       rmNodes[i] = rm1.getRMContext().getRMNodes().get(nms[i].getNodeId());
     }
 
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData submissionData =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+        .withAppName("app")
+        .withUser("user")
+        .withAcls(null)
+        .withQueue("c")
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, submissionData);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     // Constraint with Invalid Allocation Tag Namespace
@@ -581,7 +664,7 @@ public class TestSchedulingRequestContainerAllocation {
       MockNM nm4 = rm.registerNode("192.168.0.4:1234", 100*GB, 100);
       MockNM nm5 = rm.registerNode("192.168.0.5:1234", 100*GB, 100);
 
-      RMApp app1 = rm.submitApp(1*GB, ImmutableSet.of("hbase"));
+      RMApp app1 = submitApp(rm, 1*GB, ImmutableSet.of("hbase"));
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       // App1 (hbase)
@@ -620,7 +703,7 @@ public class TestSchedulingRequestContainerAllocation {
       // App2 (web-server)
       // Web server instance has 2 instance and non of them can be co-allocated
       // with hbase-master.
-      RMApp app2 = rm.submitApp(1*GB, ImmutableSet.of("web-server"));
+      RMApp app2 = submitApp(rm, 1*GB, ImmutableSet.of("web-server"));
       MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
       // App2 (web-server)
@@ -657,7 +740,7 @@ public class TestSchedulingRequestContainerAllocation {
       // App3 has multiple instances that must be co-allocated
       // with app2 server instance, and each node cannot have more than
       // 3 instances.
-      RMApp app3 = rm.submitApp(1*GB, ImmutableSet.of("ws-servants"));
+      RMApp app3 = submitApp(rm, 1*GB, ImmutableSet.of("ws-servants"));
       MockAM am3 = MockRM.launchAndRegisterAM(app3, rm, nm3);
 
 
@@ -709,7 +792,7 @@ public class TestSchedulingRequestContainerAllocation {
       MockNM nm4 = rm.registerNode("192.168.0.4:1234", 10*GB, 10);
       MockNM nm5 = rm.registerNode("192.168.0.5:1234", 10*GB, 10);
 
-      RMApp app1 = rm.submitApp(1*GB, ImmutableSet.of("server1"));
+      RMApp app1 = submitApp(rm, 1*GB, ImmutableSet.of("server1"));
       // Allocate AM container on nm1
       doNodeHeartbeat(nm1);
       RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -736,7 +819,7 @@ public class TestSchedulingRequestContainerAllocation {
 
       // App1 uses ports: 6000
       String[] server2Ports = new String[] {"port_6000"};
-      RMApp app2 = rm.submitApp(1*GB, ImmutableSet.of("server2"));
+      RMApp app2 = submitApp(rm, 1*GB, ImmutableSet.of("server2"));
       // Allocate AM container on nm1
       doNodeHeartbeat(nm2);
       RMAppAttempt app2attempt1 = app2.getCurrentAppAttempt();
@@ -792,7 +875,7 @@ public class TestSchedulingRequestContainerAllocation {
         // App1 ~ app5 tag "former5"
         // App6 ~ app10 tag "latter5"
         String applicationTag = i<5 ? "former5" : "latter5";
-        RMApp app = rm.submitApp(1*GB, ImmutableSet.of(applicationTag));
+        RMApp app = submitApp(rm, 1*GB, ImmutableSet.of(applicationTag));
         // Allocate AM container on nm1
         doNodeHeartbeat(nm1, nm2, nm3, nm4, nm5);
         RMAppAttempt attempt = app.getCurrentAppAttempt();
@@ -819,7 +902,7 @@ public class TestSchedulingRequestContainerAllocation {
 
       // *** app-id
       // Submit another app, use app-id constraint against app5
-      RMApp app1 = rm.submitApp(1*GB, ImmutableSet.of("xyz"));
+      RMApp app1 = submitApp(rm, 1*GB, ImmutableSet.of("xyz"));
       // Allocate AM container on nm1
       doNodeHeartbeat(nm1);
       RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -849,7 +932,7 @@ public class TestSchedulingRequestContainerAllocation {
       }
 
       // *** app-tag
-      RMApp app2 = rm.submitApp(1*GB);
+      RMApp app2 = MockRMAppSubmitter.submitWithMemory(1 * GB, rm);
       // Allocate AM container on nm1
       doNodeHeartbeat(nm2);
       RMAppAttempt app2attempt1 = app2.getCurrentAppAttempt();
@@ -874,7 +957,7 @@ public class TestSchedulingRequestContainerAllocation {
       }
 
       // *** not-self
-      RMApp app3 = rm.submitApp(1*GB);
+      RMApp app3 = MockRMAppSubmitter.submitWithMemory(1 * GB, rm);
       // Allocate AM container on nm1
       doNodeHeartbeat(nm3);
       RMAppAttempt app3attempt1 = app3.getCurrentAppAttempt();

+ 11 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestSchedulingRequestContainerAllocationAsync.java

@@ -28,6 +28,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -111,7 +113,15 @@ public class TestSchedulingRequestContainerAllocationAsync {
     }
 
     // app1 -> c
-    RMApp app1 = rm1.submitApp(1 * GB, "app", "user", null, "c");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nms[0]);
 
     // app1 asks for 1000 anti-affinity containers for the same app. It should

+ 29 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestWorkPreservingRMRestartForNodeLabel.java

@@ -33,6 +33,8 @@ import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.TestRMRestart;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
@@ -154,7 +156,15 @@ public class TestWorkPreservingRMRestartForNodeLabel {
 
     // launch an app to queue a1 (label = x), and check all container will
     // be allocated in h1
-    RMApp app1 = rm1.submitApp(200, "app", "user", null, "a1");
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm1, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm1, nm1);
 
     // request a container.
@@ -170,7 +180,15 @@ public class TestWorkPreservingRMRestartForNodeLabel {
 
     // launch an app to queue b1 (label = y), and check all container will
     // be allocated in h2
-    RMApp app2 = rm1.submitApp(200, "app", "user", null, "b1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("b1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm1, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm1, nm2);
 
     // request a container.
@@ -185,7 +203,15 @@ public class TestWorkPreservingRMRestartForNodeLabel {
     
     // launch an app to queue c1 (label = ""), and check all container will
     // be allocated in h3
-    RMApp app3 = rm1.submitApp(200, "app", "user", null, "c1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("c1")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm1, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm1, nm3);
 
     // request a container.

+ 92 - 10
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/TestPlacementProcessor.java

@@ -38,6 +38,8 @@ import org.apache.hadoop.yarn.event.DrainDispatcher;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
@@ -127,7 +129,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' are restricted to 1 per NODE
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
         Collections.singletonMap(Collections.singleton("foo"),
@@ -176,7 +186,15 @@ public class TestPlacementProcessor {
     nm4.registerNode();
     nm5.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' are restricted to 1 per NODE
     Map<Set<String>, PlacementConstraint> pcMap = new HashMap<>();
     pcMap.put(Collections.singleton("foo"),
@@ -227,7 +245,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' should not exceed 4 per NODE
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
         Collections.singletonMap(Collections.singleton("foo"),
@@ -280,7 +306,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' should be placed where
     // containers with allocationTag 'bar' are already running
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
@@ -328,7 +362,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     Map<Set<String>, PlacementConstraint> constraintMap = new HashMap<>();
     // Containers with allocationTag 'bar' should not exceed 1 per NODE
     constraintMap.put(Collections.singleton("bar"),
@@ -399,7 +441,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "a");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("a")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' are restricted to 1 per NODE
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
         Collections.singletonMap(
@@ -470,7 +520,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' are restricted to 1 per NODE
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
         Collections.singletonMap(
@@ -556,7 +614,15 @@ public class TestPlacementProcessor {
     nm4.registerNode();
     // Do not register nm5 yet..
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' are restricted to 1 per NODE
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
         Collections.singletonMap(
@@ -628,7 +694,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     // Containers with allocationTag 'foo' are restricted to 1 per NODE
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm2,
         Collections.singletonMap(
@@ -703,7 +777,15 @@ public class TestPlacementProcessor {
     nm3.registerNode();
     nm4.registerNode();
 
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // Register app1 with following constraints
     // 1) foo anti-affinity with foo on node

+ 10 - 2
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

@@ -33,6 +33,8 @@ 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 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;
@@ -97,7 +99,11 @@ public class TestApplicationMasterServiceWithFS {
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(2 * GB, "queueA");
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(2 * GB, rm)
+        .withQueue("queueA")
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -139,7 +145,9 @@ public class TestApplicationMasterServiceWithFS {
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(2 * GB, queueName);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithMemory(2 * GB, rm).withQueue(queueName).build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);

+ 11 - 1
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

@@ -55,6 +55,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.NodeManager;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
@@ -5217,7 +5219,15 @@ public class TestFairScheduler extends FairSchedulerTestBase {
     rm2.getAdminService().transitionToActive(requestInfo);
 
     // 4. submit a app to the new added queue "test_queue"
-    RMApp app = rm2.submitApp(200, "test_app", "user", null, "test_queue");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm2)
+            .withAppName("test_app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("test_queue")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app = MockRMAppSubmitter.submit(rm2, data);
     RMAppAttempt attempt0 = app.getCurrentAppAttempt();
     nm.nodeHeartbeat(true);
     MockAM am0 = rm2.sendAMLaunched(attempt0.getAppAttemptId());

+ 6 - 5
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/TestFifoScheduler.java

@@ -69,6 +69,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockAM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNodes;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.NodeManager;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContextImpl;
@@ -662,7 +663,7 @@ public class TestFifoScheduler {
     rm.start();
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
 
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
     // kick the scheduling, 2 GB given to AM1, remaining 4GB on nm1
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -693,7 +694,7 @@ public class TestFifoScheduler {
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
     MockNM nm2 = rm.registerNode("127.0.0.2:5678", 4 * GB);
 
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
     // kick the scheduling, 2 GB given to AM1, remaining 4GB on nm1
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();
@@ -703,7 +704,7 @@ public class TestFifoScheduler {
         rm.getResourceScheduler().getNodeReport(nm1.getNodeId());
     Assert.assertEquals(2 * GB, report_nm1.getUsedResource().getMemorySize());
 
-    RMApp app2 = rm.submitApp(2048);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(2048, rm);
     // kick the scheduling, 2GB given to AM, remaining 2 GB on nm2
     nm2.nodeHeartbeat(true);
     RMAppAttempt attempt2 = app2.getCurrentAppAttempt();
@@ -813,7 +814,7 @@ public class TestFifoScheduler {
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 6 * GB);
 
     // Submit an application
-    RMApp app1 = rm.submitApp(testAlloc);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(testAlloc, rm);
 
     // kick the scheduling
     nm1.nodeHeartbeat(true);
@@ -1108,7 +1109,7 @@ public class TestFifoScheduler {
 
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 4 * GB);
 
-    RMApp app1 = rm.submitApp(2048);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(2048, rm);
     // kick the scheduling, 2 GB given to AM1, remaining 2GB on nm1
     nm1.nodeHeartbeat(true);
     RMAppAttempt attempt1 = app1.getCurrentAppAttempt();

+ 38 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/policy/TestFairOrderingPolicy.java

@@ -23,6 +23,8 @@ import java.util.*;
 import org.apache.hadoop.yarn.api.records.NodeId;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeUpdateSchedulerEvent;
@@ -178,10 +180,42 @@ public class TestFairOrderingPolicy {
     rm.registerNode("h1:1234", 10 * GB);
 
     // Submit 4 apps
-    rm.submitApp(1 * GB, "app", "user", null, "default");
-    rm.submitApp(1 * GB, "app", "user", null, "default");
-    rm.submitApp(1 * GB, "app", "user", null, "default");
-    rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data3 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    MockRMAppSubmitter.submit(rm, data3);
+    MockRMAppSubmissionData data2 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    MockRMAppSubmitter.submit(rm, data2);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    MockRMAppSubmitter.submit(rm, data1);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    MockRMAppSubmitter.submit(rm, data);
 
     Assert.assertEquals(1, lq.getNumActiveApplications());
     Assert.assertEquals(3, lq.getNumPendingApplications());

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestAMRMTokens.java

@@ -56,6 +56,7 @@ import org.apache.hadoop.yarn.security.AMRMTokenIdentifier;
 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.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.RMSecretManagerService;
 import org.apache.hadoop.yarn.server.resourcemanager.TestAMAuthorization.MockRMWithAMS;
@@ -129,7 +130,7 @@ public class TestAMRMTokens {
     try {
       MockNM nm1 = rm.registerNode("localhost:1234", 5120);
 
-      RMApp app = rm.submitApp(1024);
+      RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
       nm1.nodeHeartbeat(true);
 
@@ -250,7 +251,7 @@ public class TestAMRMTokens {
     try {
       MockNM nm1 = rm.registerNode("localhost:1234", 5120);
 
-      RMApp app = rm.submitApp(1024);
+      RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
       nm1.nodeHeartbeat(true);
 
@@ -380,7 +381,7 @@ public class TestAMRMTokens {
     };
     rm.start();
     MockNM nm = rm.registerNode("127.0.0.1:1234", 8000);
-    RMApp app = rm.submitApp(200);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm);
     MockAM am = MockRM.launchAndRegisterAM(app, rm, nm);
     AMRMTokenSecretManager spySecretMgr = spySecretMgrRef.get();
     // Do allocate. Should not update AMRMToken

+ 3 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestClientToAMTokens.java

@@ -58,6 +58,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
 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.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRMWithCustomAMLauncher;
 import org.apache.hadoop.yarn.server.resourcemanager.ParameterizedSchedulerTestBase;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -216,7 +217,7 @@ public class TestClientToAMTokens extends ParameterizedSchedulerTestBase {
     rm.start();
 
     // Submit an app
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
     // Set up a node.
     MockNM nm1 = rm.registerNode("localhost:1234", 3072);
@@ -446,7 +447,7 @@ public class TestClientToAMTokens extends ParameterizedSchedulerTestBase {
     rm.start();
 
     // Submit an app
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(1024, rm);
 
     // Set up a node.
     MockNM nm1 = rm.registerNode("localhost:1234", 3072);

+ 97 - 19
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/security/TestDelegationTokenRenewer.java

@@ -88,6 +88,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.ClientRMService;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
 import org.apache.hadoop.yarn.server.resourcemanager.TestRMRestart.TestSecurityMockRM;
 import org.apache.hadoop.yarn.server.resourcemanager.recovery.MemoryRMStateStore;
@@ -356,6 +358,35 @@ public class TestDelegationTokenRenewer {
     token1.setService(new Text("localhost:0"));
     return token1;
   }
+
+  private RMApp submitApp(MockRM rm, Credentials cred, ByteBuffer tokensConf)
+      throws Exception {
+    int maxAttempts = rm.getConfig().getInt(
+        YarnConfiguration.RM_AM_MAX_ATTEMPTS,
+        YarnConfiguration.DEFAULT_RM_AM_MAX_ATTEMPTS);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder.create()
+        .withResource(Resource.newInstance(200, 1))
+        .withAppName("app1")
+        .withUser("user")
+        .withAcls(null)
+        .withUnmanagedAM(false)
+        .withQueue(null)
+        .withMaxAppAttempts(maxAttempts)
+        .withCredentials(cred)
+        .withAppType(null)
+        .withWaitForAppAcceptedState(true)
+        .withKeepContainers(false)
+        .withApplicationId(null)
+        .withAttemptFailuresValidityInterval(0)
+        .withLogAggregationContext(null)
+        .withCancelTokensWhenComplete(true)
+        .withAppPriority(Priority.newInstance(0))
+        .withAmLabel(null)
+        .withApplicationTimeouts(null)
+        .withTokensConf(tokensConf)
+        .build();
+    return MockRMAppSubmitter.submit(rm, data);
+  }
   
   
   /**
@@ -948,9 +979,16 @@ public class TestDelegationTokenRenewer {
     credentials.addToken(userText1, token1);
 
     RMApp app =
-        rm.submitApp(200, "name", "user",
-          new HashMap<ApplicationAccessType, String>(), false, "default", 1,
-          credentials);
+        MockRMAppSubmitter.submit(rm,
+            MockRMAppSubmissionData.Builder.createWithMemory(200, rm)
+                .withAppName("name")
+                .withUser("user")
+                .withAcls(new HashMap<ApplicationAccessType, String>())
+                .withUnmanagedAM(false)
+                .withQueue("default")
+                .withMaxAppAttempts(1)
+                .withCredentials(credentials)
+                .build());
 
     // wait for the initial expiring hdfs token to be removed from allTokens
     GenericTestUtils.waitFor(new Supplier<Boolean>() {
@@ -1029,9 +1067,16 @@ public class TestDelegationTokenRenewer {
     MockRM rm1 = new TestSecurityMockRM(yarnConf);
     MemoryRMStateStore memStore = (MemoryRMStateStore) rm1.getRMStateStore();
     rm1.start();
-    RMApp app = rm1.submitApp(200, "name", "user",
-        new HashMap<ApplicationAccessType, String>(), false, "default", 1,
-        credentials);
+    RMApp app = MockRMAppSubmitter.submit(rm1,
+        MockRMAppSubmissionData.Builder.createWithMemory(200, rm1)
+            .withAppName("name")
+            .withUser("user")
+            .withAcls(new HashMap<ApplicationAccessType, String>())
+            .withUnmanagedAM(false)
+            .withQueue("default")
+            .withMaxAppAttempts(1)
+            .withCredentials(credentials)
+            .build());
 
     // create token2
     Text userText2 = new Text("user1");
@@ -1127,7 +1172,7 @@ public class TestDelegationTokenRenewer {
     rm.start();
 
     // submit an app without delegationToken
-    RMApp app = rm.submitApp(200);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(200, rm);
 
     // wait for the new retrieved hdfs token.
     GenericTestUtils.waitFor(new Supplier<Boolean>() {
@@ -1184,8 +1229,15 @@ public class TestDelegationTokenRenewer {
     // submit app1 with a token, set cancelTokenWhenComplete to false;
     Resource resource = Records.newRecord(Resource.class);
     resource.setMemorySize(200);
-    RMApp app1 = rm.submitApp(resource, "name", "user", null, false, null, 2,
-        credentials, null, true, false, false, null, 0, null, false, null);
+    MockRMAppSubmissionData data1 = MockRMAppSubmissionData.Builder
+        .createWithResource(resource, rm)
+        .withAppName("name")
+        .withUser("user")
+        .withMaxAppAttempts(2)
+        .withCredentials(credentials)
+        .withCancelTokensWhenComplete(false)
+        .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
     rm.waitForState(app1.getApplicationId(), RMAppState.RUNNING);
     DelegationTokenRenewer renewer =
@@ -1194,8 +1246,15 @@ public class TestDelegationTokenRenewer {
     Assert.assertNotNull(dttr);
 
     // submit app2 with the same token, set cancelTokenWhenComplete to true;
-    RMApp app2 = rm.submitApp(resource, "name", "user", null, false, null, 2,
-        credentials, null, true, false, false, null, 0, null, true, null);
+    MockRMAppSubmissionData data = MockRMAppSubmissionData.Builder
+        .createWithResource(resource, rm)
+        .withAppName("name")
+        .withUser("user")
+        .withMaxAppAttempts(2)
+        .withCredentials(credentials)
+        .withCancelTokensWhenComplete(true)
+        .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
     rm.waitForState(app2.getApplicationId(), RMAppState.RUNNING);
     finishAMAndWaitForComplete(app2, rm, nm1, am2, dttr);
@@ -1250,17 +1309,29 @@ public class TestDelegationTokenRenewer {
 
     Resource resource = Records.newRecord(Resource.class);
     resource.setMemorySize(200);
+    MockRMAppSubmissionData data2 = MockRMAppSubmissionData.Builder
+        .createWithResource(resource, rm).withAppName("name")
+        .withUser("user")
+        .withMaxAppAttempts(2)
+        .withCredentials(credentials)
+        .build();
     RMApp app1 =
-        rm.submitApp(resource, "name", "user", null, false, null, 2, credentials,
-          null, true, false, false, null, 0, null, true, null);
+        MockRMAppSubmitter.submit(rm, data2);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
     rm.waitForState(app1.getApplicationId(), RMAppState.RUNNING);
 
     DelegationTokenToRenew dttr = renewer.getAllTokens().get(token1);
     Assert.assertNotNull(dttr);
     Assert.assertTrue(dttr.referringAppIds.contains(app1.getApplicationId()));
-    RMApp app2 = rm.submitApp(resource, "name", "user", null, false, null, 2,
-        credentials, null, true, false, false, null, 0, null, true, null);
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithResource(resource, rm)
+        .withResource(resource)
+        .withAppName("name")
+        .withUser("user")
+        .withMaxAppAttempts(2)
+        .withCredentials(credentials)
+        .build();
+    RMApp app2 = MockRMAppSubmitter.submit(rm, data1);
     MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
     rm.waitForState(app2.getApplicationId(), RMAppState.RUNNING);
     Assert.assertTrue(renewer.getAllTokens().containsKey(token1));
@@ -1276,8 +1347,15 @@ public class TestDelegationTokenRenewer {
     Assert.assertFalse(dttr.isTimerCancelled());
     Assert.assertFalse(Renewer.cancelled);
 
-    RMApp app3 = rm.submitApp(resource, "name", "user", null, false, null, 2,
-        credentials, null, true, false, false, null, 0, null, true, null);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithResource(resource, rm)
+        .withResource(resource)
+        .withAppName("name")
+        .withUser("user")
+        .withMaxAppAttempts(2)
+        .withCredentials(credentials)
+        .build();
+    RMApp app3 = MockRMAppSubmitter.submit(rm, data);
     MockAM am3 = MockRM.launchAndRegisterAM(app3, rm, nm1);
     rm.waitForState(app3.getApplicationId(), RMAppState.RUNNING);
     Assert.assertTrue(renewer.getAllTokens().containsKey(token1));
@@ -1370,7 +1448,7 @@ public class TestDelegationTokenRenewer {
     final int confSize = appConf.size();
 
     // submit app
-    RMApp app = rm.submitApp(credentials, tokenConf);
+    RMApp app = submitApp(rm, credentials, tokenConf);
 
     GenericTestUtils.waitFor(new Supplier<Boolean>() {
       public Boolean get() {
@@ -1425,7 +1503,7 @@ public class TestDelegationTokenRenewer {
     ByteBuffer tokenConf = ByteBuffer.wrap(dob.getData(), 0, dob.getLength());
 
     try {
-      rm.submitApp(credentials, tokenConf);
+      submitApp(rm, credentials, tokenConf);
       Assert.fail();
     } catch (Exception e) {
       e.printStackTrace();

+ 36 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/volume/csi/TestVolumeProcessor.java

@@ -36,6 +36,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.NullRMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -146,7 +148,15 @@ public class TestVolumeProcessor {
 
   @Test (timeout = 10000L)
   public void testVolumeProvisioning() throws Exception {
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, mockNMS[0]);
     Resource resource = Resource.newInstance(1024, 1);
     ResourceInformation volumeResource = ResourceInformation
@@ -199,7 +209,15 @@ public class TestVolumeProcessor {
 
   @Test (timeout = 30000L)
   public void testInvalidRequest() throws Exception {
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, mockNMS[0]);
     Resource resource = Resource.newInstance(1024, 1);
     ResourceInformation volumeResource = ResourceInformation
@@ -233,7 +251,15 @@ public class TestVolumeProcessor {
 
   @Test (timeout = 30000L)
   public void testProvisioningFailures() throws Exception {
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, mockNMS[0]);
 
     CsiAdaptorProtocol mockedClient = Mockito
@@ -276,7 +302,13 @@ public class TestVolumeProcessor {
 
   @Test (timeout = 10000L)
   public void testVolumeResourceAllocate() throws Exception {
-    RMApp app1 = rm.submitApp(1 * GB, "app", "user", null, "default");
+    RMApp app1 = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1 * GB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .build());
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, mockNMS[0]);
     Resource resource = Resource.newInstance(1024, 1);
     ResourceInformation volumeResource = ResourceInformation

+ 12 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServiceAppsNodelabel.java

@@ -35,6 +35,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -145,7 +147,7 @@ public class TestRMWebServiceAppsNodelabel extends JerseyTestBase {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
     amNodeManager.nodeHeartbeat(true);
-    RMApp killedApp = rm.submitApp(AM_CONTAINER_MB);
+    RMApp killedApp = MockRMAppSubmitter.submitWithMemory(AM_CONTAINER_MB, rm);
     rm.killApp(killedApp.getApplicationId());
     WebResource r = resource();
     ClientResponse response =
@@ -173,7 +175,15 @@ public class TestRMWebServiceAppsNodelabel extends JerseyTestBase {
     nodeLabelManager.addLabelsToNode(
         ImmutableMap.of(NodeId.newInstance("h2", 1235), toSet("X")));
 
-    RMApp app1 = rm.submitApp(AM_CONTAINER_MB, "app", "user", null, "default");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(AM_CONTAINER_MB, rm)
+            .withAppName("app")
+            .withUser("user")
+            .withAcls(null)
+            .withQueue("default")
+            .withUnmanagedAM(false)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
     nm1.nodeHeartbeat(true);
 

+ 30 - 8
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppAttempts.java

@@ -30,6 +30,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
@@ -110,7 +112,12 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testAppAttempts() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     testAppAttemptsHelper(app1.getApplicationId().toString(), app1,
             MediaType.APPLICATION_JSON);
@@ -121,7 +128,12 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testMultipleAppAttempts() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 8192);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
     int maxAppAttempts = rm.getConfig().getInt(
             YarnConfiguration.RM_AM_MAX_ATTEMPTS,
@@ -153,7 +165,7 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testAppAttemptsSlash() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testAppAttemptsHelper(app1.getApplicationId().toString() + "/", app1,
             MediaType.APPLICATION_JSON);
@@ -164,7 +176,7 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testAppAttemptsDefault() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testAppAttemptsHelper(app1.getApplicationId().toString() + "/", app1, "");
     rm.stop();
@@ -174,7 +186,7 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testInvalidAppIdGetAttempts() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app = rm.submitApp(CONTAINER_MB);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -215,7 +227,7 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testInvalidAppAttemptId() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app = rm.submitApp(CONTAINER_MB);
+    RMApp app = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -256,7 +268,12 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
   public void testNonexistAppAttempts() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -322,7 +339,12 @@ public class TestRMWebServicesAppAttempts extends JerseyTestBase {
     rm.start();
     String user = "user1";
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", user);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser(user)
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")

+ 14 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppCustomResourceTypes.java

@@ -27,6 +27,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
@@ -114,7 +116,12 @@ public class TestRMWebServicesAppCustomResourceTypes extends JerseyTestBase {
   public void testRunningAppXml() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
     am1.allocate("*", 2048, 1, new ArrayList<>());
     amNodeManager.nodeHeartbeat(true);
@@ -142,7 +149,12 @@ public class TestRMWebServicesAppCustomResourceTypes extends JerseyTestBase {
   public void testRunningAppJson() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
     am1.allocate("*", 2048, 1, new ArrayList<>());
     amNodeManager.nodeHeartbeat(true);

+ 165 - 73
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesApps.java

@@ -39,6 +39,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
@@ -131,7 +133,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testApps() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testAppsHelper("apps", app1, MediaType.APPLICATION_JSON);
     rm.stop();
@@ -141,7 +143,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsSlash() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testAppsHelper("apps/", app1, MediaType.APPLICATION_JSON);
     rm.stop();
@@ -151,7 +153,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsDefault() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testAppsHelper("apps/", app1, "");
     rm.stop();
@@ -161,7 +163,12 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsXML() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
@@ -187,7 +194,12 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testRunningApp() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
     am1.allocate("*", 4096, 1, new ArrayList<>());
     amNodeManager.nodeHeartbeat(true);
@@ -218,8 +230,18 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsXMLMulti() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
-    rm.submitApp(2048, "testwordcount2", "user1");
+    MockRMAppSubmissionData data1 =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    MockRMAppSubmitter.submit(rm, data1);
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(2048, rm)
+            .withAppName("testwordcount2")
+            .withUser("user1")
+            .build();
+    MockRMAppSubmitter.submit(rm, data);
 
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
@@ -269,7 +291,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryState() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -293,8 +315,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStates() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    RMApp killedApp = rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    RMApp killedApp = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     rm.killApp(killedApp.getApplicationId());
 
     amNodeManager.nodeHeartbeat(true);
@@ -344,8 +366,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStatesComma() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    RMApp killedApp = rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    RMApp killedApp = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     rm.killApp(killedApp.getApplicationId());
 
     amNodeManager.nodeHeartbeat(true);
@@ -395,7 +417,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStatesNone() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -416,7 +438,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStateNone() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -437,7 +459,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStatesInvalid() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -475,7 +497,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStateInvalid() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -513,7 +535,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryFinalStatus() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -538,7 +560,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryFinalStatusNone() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -558,7 +580,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryFinalStatusInvalid() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -597,8 +619,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryUser() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
 
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
@@ -626,8 +648,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryQueue() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
 
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
@@ -650,8 +672,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryQueueAndStateTwoFinishedApps() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
-    RMApp app2 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    RMApp app2 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
 
     finishApp(amNodeManager, app1);
@@ -686,8 +708,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryQueueAndStateOneFinishedApp() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp finishedApp = rm.submitApp(CONTAINER_MB);
-    RMApp runningApp = rm.submitApp(CONTAINER_MB);
+    RMApp finishedApp = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    RMApp runningApp = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
 
     finishApp(amNodeManager, finishedApp);
@@ -722,8 +744,8 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryQueueOneFinishedApp() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp finishedApp = rm.submitApp(CONTAINER_MB);
-    RMApp runningApp = rm.submitApp(CONTAINER_MB);
+    RMApp finishedApp = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    RMApp runningApp = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
 
     finishApp(amNodeManager, finishedApp);
@@ -757,9 +779,9 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryLimit() throws JSONException, Exception {
     rm.start();
     rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
         .path("apps").queryParam("limit", "2")
@@ -781,9 +803,9 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     long start = System.currentTimeMillis();
     Thread.sleep(1);
     rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
         .path("apps").queryParam("startedTimeBegin", String.valueOf(start))
@@ -803,11 +825,11 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryStartBeginSome() throws JSONException, Exception {
     rm.start();
     rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     long start = System.currentTimeMillis();
     Thread.sleep(1);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
         .path("apps").queryParam("startedTimeBegin", String.valueOf(start))
@@ -829,9 +851,9 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     rm.registerNode("127.0.0.1:1234", 2048);
     long end = System.currentTimeMillis();
     Thread.sleep(1);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
         .path("apps").queryParam("startedTimeEnd", String.valueOf(end))
@@ -851,11 +873,11 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     rm.registerNode("127.0.0.1:1234", 2048);
     long start = System.currentTimeMillis();
     Thread.sleep(1);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     long end = System.currentTimeMillis();
     Thread.sleep(1);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
         .path("apps").queryParam("startedTimeBegin", String.valueOf(start))
@@ -878,11 +900,11 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
     long start = System.currentTimeMillis();
     Thread.sleep(1);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     finishApp(amNodeManager, app1);
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
 
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
@@ -913,13 +935,13 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testAppsQueryFinishEnd() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     // finish App
     finishApp(amNodeManager, app1);
 
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     long end = System.currentTimeMillis();
 
     WebResource r = resource();
@@ -943,13 +965,13 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
     long start = System.currentTimeMillis();
     Thread.sleep(1);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     // finish App
     finishApp(amNodeManager, app1);
 
-    rm.submitApp(CONTAINER_MB);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     long end = System.currentTimeMillis();
 
     WebResource r = resource();
@@ -973,15 +995,35 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
     Thread.sleep(1);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     // finish App
     finishApp(amNodeManager, app1);
 
-    rm.submitApp(CONTAINER_MB, "", UserGroupInformation.getCurrentUser()
-        .getShortUserName(), null, false, null, 2, null, "MAPREDUCE");
-    rm.submitApp(CONTAINER_MB, "", UserGroupInformation.getCurrentUser()
-        .getShortUserName(), null, false, null, 2, null, "NON-YARN");
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("")
+            .withUser(UserGroupInformation.getCurrentUser()
+        .getShortUserName())
+            .withAcls(null)
+            .withUnmanagedAM(false)
+            .withQueue(null)
+            .withMaxAppAttempts(2)
+            .withCredentials(null)
+            .withAppType("MAPREDUCE")
+            .build());
+    MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("")
+            .withUser(UserGroupInformation.getCurrentUser()
+        .getShortUserName())
+            .withAcls(null)
+            .withUnmanagedAM(false)
+            .withQueue(null)
+            .withMaxAppAttempts(2)
+            .withCredentials(null)
+            .withAppType("NON-YARN")
+            .build());
 
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")
@@ -1164,7 +1206,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
     try {
       rm.start();
       MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-      rm.submitApp(CONTAINER_MB);
+      MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
       amNodeManager.nodeHeartbeat(true);
       WebResource r = resource();
       ClientResponse response = r.path("ws").path("v1").path("cluster")
@@ -1197,7 +1239,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
       throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -1303,15 +1345,45 @@ public class TestRMWebServicesApps extends JerseyTestBase {
       rm.start();
       MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 4096);
       Thread.sleep(1);
-      RMApp app1 = rm.submitApp(CONTAINER_MB, "", UserGroupInformation.getCurrentUser()
-          .getShortUserName(), null, false, null, 2, null, "MAPREDUCE");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+              .withAppName("")
+              .withUser(UserGroupInformation.getCurrentUser()
+                  .getShortUserName())
+              .withAcls(null)
+              .withUnmanagedAM(false)
+              .withQueue(null)
+              .withMaxAppAttempts(2)
+              .withCredentials(null)
+              .withAppType("MAPREDUCE")
+              .build());
       amNodeManager.nodeHeartbeat(true);
       finishApp(amNodeManager, app1);
 
-      rm.submitApp(CONTAINER_MB, "", UserGroupInformation.getCurrentUser()
-          .getShortUserName(), null, false, null, 2, null, "MAPREDUCE");
-      rm.submitApp(CONTAINER_MB, "", UserGroupInformation.getCurrentUser()
-          .getShortUserName(), null, false, null, 2, null, "OTHER");
+      MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+              .withAppName("")
+              .withUser(UserGroupInformation.getCurrentUser()
+            .getShortUserName())
+              .withAcls(null)
+              .withUnmanagedAM(false)
+              .withQueue(null)
+              .withMaxAppAttempts(2)
+              .withCredentials(null)
+              .withAppType("MAPREDUCE")
+              .build());
+      MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+              .withAppName("")
+              .withUser(UserGroupInformation.getCurrentUser()
+            .getShortUserName())
+              .withAcls(null)
+              .withUnmanagedAM(false)
+              .withQueue(null)
+              .withMaxAppAttempts(2)
+              .withCredentials(null)
+              .withAppType("OTHER")
+              .build());
 
       // zero type, zero state
       WebResource r = resource();
@@ -1464,7 +1536,12 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testSingleApp() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     testSingleAppsHelper(app1.getApplicationId().toString(), app1,
         MediaType.APPLICATION_JSON);
@@ -1475,7 +1552,12 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testUnmarshalAppInfo() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
 
     WebResource r = resource();
@@ -1499,7 +1581,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testSingleAppsSlash() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testSingleAppsHelper(app1.getApplicationId().toString() + "/", app1,
         MediaType.APPLICATION_JSON);
@@ -1510,7 +1592,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testSingleAppsDefault() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB);
+    RMApp app1 = MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     testSingleAppsHelper(app1.getApplicationId().toString() + "/", app1, "");
     rm.stop();
@@ -1520,7 +1602,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testInvalidApp() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB);
+    MockRMAppSubmitter.submitWithMemory(CONTAINER_MB, rm);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -1559,7 +1641,12 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testNonexistApp() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
 
@@ -1610,7 +1697,12 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void testSingleAppsXML() throws JSONException, Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     amNodeManager.nodeHeartbeat(true);
     WebResource r = resource();
     ClientResponse response = r.path("ws").path("v1").path("cluster")

+ 14 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsCustomResourceTypes.java

@@ -29,6 +29,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
@@ -116,7 +118,12 @@ public class TestRMWebServicesAppsCustomResourceTypes extends JerseyTestBase {
   public void testRunningAppsXml() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
     am1.allocate("*", 2048, 1, new ArrayList<>());
     amNodeManager.nodeHeartbeat(true);
@@ -147,7 +154,12 @@ public class TestRMWebServicesAppsCustomResourceTypes extends JerseyTestBase {
   public void testRunningAppsJson() throws Exception {
     rm.start();
     MockNM amNodeManager = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app1 = rm.submitApp(CONTAINER_MB, "testwordcount", "user1");
+    MockRMAppSubmissionData data =
+        MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+            .withAppName("testwordcount")
+            .withUser("user1")
+            .build();
+    RMApp app1 = MockRMAppSubmitter.submit(rm, data);
     MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, amNodeManager);
     am1.allocate("*", 2048, 1, new ArrayList<>());
     amNodeManager.nodeHeartbeat(true);

+ 62 - 10
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesAppsModification.java

@@ -74,6 +74,8 @@ import org.apache.hadoop.yarn.api.records.YarnApplicationState;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState;
@@ -339,7 +341,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
     String[] mediaTypes =
         { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML };
     for (String mediaType : mediaTypes) {
-      RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+              .withAppName("")
+              .withUser(webserviceUserName)
+              .build();
+      RMApp app = MockRMAppSubmitter.submit(rm, data);
       amNodeManager.nodeHeartbeat(true);
       ClientResponse response =
           this
@@ -366,7 +373,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
     String diagnostic = "message1";
     for (String mediaType : mediaTypes) {
       for (MediaType contentType : contentTypes) {
-        RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+        MockRMAppSubmissionData data =
+            MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                .withAppName("")
+                .withUser(webserviceUserName)
+                .build();
+        RMApp app = MockRMAppSubmitter.submit(rm, data);
         amNodeManager.nodeHeartbeat(true);
 
         AppState targetState =
@@ -457,7 +469,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
     for (String mediaType : mediaTypes) {
       for (MediaType contentType : contentTypes) {
         for (String targetStateString : targetStates) {
-          RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+          MockRMAppSubmissionData data =
+              MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                  .withAppName("")
+                  .withUser(webserviceUserName)
+                  .build();
+          RMApp app = MockRMAppSubmitter.submit(rm, data);
           amNodeManager.nodeHeartbeat(true);
           ClientResponse response;
           AppState targetState = new AppState(targetStateString);
@@ -564,7 +581,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
     String[] mediaTypes =
         { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML };
     for (String mediaType : mediaTypes) {
-      RMApp app = rm.submitApp(CONTAINER_MB, "test", "someuser");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+              .withAppName("test")
+              .withUser("someuser")
+              .build();
+      RMApp app = MockRMAppSubmitter.submit(rm, data);
       amNodeManager.nodeHeartbeat(true);
       ClientResponse response =
           this
@@ -1036,7 +1058,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
     String[] contentTypes =
         { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML };
     for (String contentType : contentTypes) {
-      RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+              .withAppName("")
+              .withUser(webserviceUserName)
+              .build();
+      RMApp app = MockRMAppSubmitter.submit(rm, data);
       amNodeManager.nodeHeartbeat(true);
       ClientResponse response =
           this
@@ -1090,7 +1117,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
         { MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE };
     for (String mediaType : mediaTypes) {
       for (MediaType contentType : contentTypes) {
-        RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+        MockRMAppSubmissionData data1 =
+            MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                .withAppName("")
+                .withUser(webserviceUserName)
+                .build();
+        RMApp app = MockRMAppSubmitter.submit(rm, data1);
         amNodeManager.nodeHeartbeat(true);
         int modifiedPriority = 8;
         AppPriority priority = new AppPriority(modifiedPriority);
@@ -1130,7 +1162,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
         }
 
         // check unauthorized
-        app = rm.submitApp(CONTAINER_MB, "", "someuser");
+        MockRMAppSubmissionData data =
+            MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                .withAppName("")
+                .withUser("someuser")
+                .build();
+        app = MockRMAppSubmitter.submit(rm, data);
         amNodeManager.nodeHeartbeat(true);
         response = this
             .constructWebResource("apps", app.getApplicationId().toString(),
@@ -1171,7 +1208,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
         { MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_XML_TYPE };
     for (String mediaType : mediaTypes) {
       for (MediaType contentType : contentTypes) {
-        RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+        MockRMAppSubmissionData data1 =
+            MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                .withAppName("")
+                .withUser(webserviceUserName)
+                .build();
+        RMApp app = MockRMAppSubmitter.submit(rm, data1);
         amNodeManager.nodeHeartbeat(true);
         AppQueue targetQueue = new AppQueue("test");
         Object entity;
@@ -1204,7 +1246,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
         Assert.assertEquals(expectedQueue, app.getQueue());
 
         // check unauthorized
-        app = rm.submitApp(CONTAINER_MB, "", "someuser");
+        MockRMAppSubmissionData data =
+            MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                .withAppName("")
+                .withUser("someuser")
+                .build();
+        app = MockRMAppSubmitter.submit(rm, data);
         amNodeManager.nodeHeartbeat(true);
         response =
             this
@@ -1312,7 +1359,12 @@ public class TestRMWebServicesAppsModification extends JerseyTestBase {
     for (String mediaType : mediaTypes) {
       for (MediaType contentType : contentTypes) {
         // application submitted without timeout
-        RMApp app = rm.submitApp(CONTAINER_MB, "", webserviceUserName);
+        MockRMAppSubmissionData data =
+            MockRMAppSubmissionData.Builder.createWithMemory(CONTAINER_MB, rm)
+                .withAppName("")
+                .withUser(webserviceUserName)
+                .build();
+        RMApp app = MockRMAppSubmitter.submit(rm, data);
 
         ClientResponse response =
             this.constructWebResource("apps", app.getApplicationId().toString(),

+ 38 - 4
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java

@@ -33,6 +33,8 @@ import org.apache.hadoop.http.JettyUtils;
 import org.apache.hadoop.yarn.api.records.Resource;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
@@ -530,8 +532,24 @@ public class TestRMWebServicesCapacitySched extends JerseyTestBase {
     //Start RM so that it accepts app submissions
     rm.start();
     try {
-      rm.submitApp(10, "app1", "user1", null, "b1");
-      rm.submitApp(20, "app2", "user2", null, "b1");
+      MockRMAppSubmissionData data1 =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      MockRMAppSubmitter.submit(rm, data1);
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(20, rm)
+              .withAppName("app2")
+              .withUser("user2")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      MockRMAppSubmitter.submit(rm, data);
 
       //Get the XML from ws/v1/cluster/scheduler
       WebResource r = resource();
@@ -611,8 +629,24 @@ public class TestRMWebServicesCapacitySched extends JerseyTestBase {
     //Start RM so that it accepts app submissions
     rm.start();
     try {
-      rm.submitApp(10, "app1", "user1", null, "b1");
-      rm.submitApp(20, "app2", "user2", null, "b1");
+      MockRMAppSubmissionData data1 =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      MockRMAppSubmitter.submit(rm, data1);
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(20, rm)
+              .withAppName("app2")
+              .withUser("user2")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      MockRMAppSubmitter.submit(rm, data);
 
       //Get JSON
       WebResource r = resource();

+ 4 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesContainers.java

@@ -31,6 +31,8 @@ import org.apache.hadoop.yarn.api.records.SignalContainerCommand;
 import org.apache.hadoop.yarn.conf.YarnConfiguration;
 import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
 import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptState;
@@ -107,7 +109,8 @@ public class TestRMWebServicesContainers extends JerseyTestBase {
   public void testSignalContainer() throws Exception {
     rm.start();
     MockNM nm = rm.registerNode("127.0.0.1:1234", 2048);
-    RMApp app = rm.submitApp(1024);
+    RMApp app = MockRMAppSubmitter.submit(rm,
+        MockRMAppSubmissionData.Builder.createWithMemory(1024, rm).build());
     nm.nodeHeartbeat(true);
     MockRM
         .waitForState(app.getCurrentAppAttempt(), RMAppAttemptState.ALLOCATED);

+ 10 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesForCSWithPartitions.java

@@ -50,6 +50,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
@@ -277,7 +279,14 @@ public class TestRMWebServicesForCSWithPartitions extends JerseyTestBase {
     nm2.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, QUEUE_B, LABEL_LX);
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue(QUEUE_B)
+              .withAmLabel(LABEL_LX)
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
       am1.allocate(Arrays.asList(
           ResourceRequest.newBuilder().priority(Priority.UNDEFINED)

+ 180 - 22
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivities.java

@@ -38,6 +38,8 @@ import org.apache.hadoop.yarn.api.resource.PlacementConstraints;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
@@ -104,7 +106,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
       am1.allocate(Arrays.asList(ResourceRequest
           .newInstance(Priority.UNDEFINED, "127.0.0.1",
@@ -160,7 +170,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
       am1.allocate(Arrays.asList(ResourceRequest
           .newInstance(Priority.UNDEFINED, "127.0.0.1",
@@ -248,7 +266,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
       am1.allocate(Arrays.asList(ResourceRequest
           .newInstance(Priority.UNDEFINED, "127.0.0.1",
@@ -300,10 +326,26 @@ public class TestRMWebServicesSchedulerActivities
     nm2.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data1 =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
-      RMApp app2 = rm.submitApp(10, "app2", "user1", null, "b2");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app2")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b2")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app2 = MockRMAppSubmitter.submit(rm, data);
       MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
       am1.allocate(Arrays.asList(ResourceRequest
@@ -420,7 +462,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
       //Get JSON
       WebResource r = resource();
@@ -470,7 +520,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
       //Get JSON
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -524,7 +582,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
       am1.allocate(Arrays.asList(ResourceRequest
           .newInstance(Priority.UNDEFINED, "127.0.0.1",
@@ -570,7 +636,15 @@ public class TestRMWebServicesSchedulerActivities
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
       am1.allocate(Arrays.asList(ResourceRequest
           .newInstance(Priority.UNDEFINED, "127.0.0.1",
@@ -604,7 +678,15 @@ public class TestRMWebServicesSchedulerActivities
     rm.start();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data);
 
       //Get JSON
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -635,10 +717,26 @@ public class TestRMWebServicesSchedulerActivities
     nm2.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
+      MockRMAppSubmissionData data1 =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app1 = MockRMAppSubmitter.submit(rm, data1);
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
-      RMApp app2 = rm.submitApp(10, "app2", "user1", null, "b2");
+      MockRMAppSubmissionData data =
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app2")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b2")
+              .withUnmanagedAM(false)
+              .build();
+      RMApp app2 = MockRMAppSubmitter.submit(rm, data);
       MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm2);
 
       am1.allocate(Arrays.asList(ResourceRequest
@@ -693,7 +791,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm2 = rm.registerNode("127.0.0.2:1234", 8 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource();
@@ -750,7 +854,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 4 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       // init scheduling request
@@ -813,7 +923,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm2 = rm.registerNode("127.0.0.2:1234", 8 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -859,7 +975,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm2 = rm.registerNode("127.0.0.2:1234", 8 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -911,7 +1033,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 8 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -1042,7 +1170,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 4 * 1024);
     MockNM nm2 = rm.registerNode("127.0.0.2:1234", 8 * 1024);
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -1110,7 +1244,13 @@ public class TestRMWebServicesSchedulerActivities
     CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
     MockNM nm1 = rm.registerNode("127.0.0.1:1234", 8 * 1024);
     try {
-      RMApp app1 = rm.submitApp(512, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(512, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
       // am1 asks for 10 * 512MB container
       am1.allocate("*", 512, 10, new ArrayList<>());
@@ -1212,7 +1352,13 @@ public class TestRMWebServicesSchedulerActivities
     MockNM nm3 = rm.registerNode("127.0.0.3:1234", 4 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(5120, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(5120, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
           .path(ActivitiesTestUtils.format(RMWSConsts.SCHEDULER_APP_ACTIVITIES,
@@ -1278,7 +1424,13 @@ public class TestRMWebServicesSchedulerActivities
     nm2.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b1")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       am1.allocate(Arrays.asList(
@@ -1363,7 +1515,13 @@ public class TestRMWebServicesSchedulerActivities
     nm2.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(10, "app1", "user1", null, "a1a");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(10, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("a1a")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       am1.allocate(Arrays.asList(

+ 51 - 7
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled.java

@@ -31,6 +31,8 @@ import org.apache.hadoop.yarn.conf.YarnConfiguration;
 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.MockRMAppSubmissionData;
+import org.apache.hadoop.yarn.server.resourcemanager.MockRMAppSubmitter;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
@@ -164,7 +166,13 @@ public class TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled
     nm.registerNode();
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm);
       am1.allocate(Arrays.asList(ResourceRequest
           .newInstance(Priority.UNDEFINED, "127.0.0.1",
@@ -256,7 +264,13 @@ public class TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled
     MockNM nm2 = rm.registerNode("127.0.0.2:1234", 2 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(1024, "app1", "user1", null, "b");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       am1.allocate(Arrays.asList(ResourceRequest
@@ -318,10 +332,22 @@ public class TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled
     MockNM nm4 = rm.registerNode("127.0.0.4:1234", 2 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(3072, "app1", "user1", null, "b");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(3072, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
-      RMApp app2 = rm.submitApp(1024, "app2", "user1", null, "b");
+      RMApp app2 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(1024, rm)
+              .withAppName("app2")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am2 = MockRM.launchAndRegisterAM(app2, rm, nm1);
 
       WebResource r = resource();
@@ -392,7 +418,13 @@ public class TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled
     MockNM nm4 = rm.registerNode("127.0.0.4:1234", 2 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(3072, "app1", "user1", null, "b");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(3072, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -465,7 +497,13 @@ public class TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled
     MockNM nm4 = rm.registerNode("127.0.0.4:1234", 2 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(3072, "app1", "user1", null, "b");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(3072, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
@@ -545,7 +583,13 @@ public class TestRMWebServicesSchedulerActivitiesWithMultiNodesEnabled
     MockNM nm4 = rm.registerNode("127.0.0.4:1234", 2 * 1024);
 
     try {
-      RMApp app1 = rm.submitApp(3072, "app1", "user1", null, "b");
+      RMApp app1 = MockRMAppSubmitter.submit(rm,
+          MockRMAppSubmissionData.Builder.createWithMemory(3072, rm)
+              .withAppName("app1")
+              .withUser("user1")
+              .withAcls(null)
+              .withQueue("b")
+              .build());
       MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
 
       WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)