|
@@ -22,6 +22,8 @@ import com.sun.jersey.api.client.ClientResponse;
|
|
import com.sun.jersey.api.client.WebResource;
|
|
import com.sun.jersey.api.client.WebResource;
|
|
import com.sun.jersey.core.util.MultivaluedMapImpl;
|
|
import com.sun.jersey.core.util.MultivaluedMapImpl;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
|
|
import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
|
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivityDiagnosticConstant;
|
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivityState;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.apache.hadoop.http.JettyUtils;
|
|
import org.apache.hadoop.http.JettyUtils;
|
|
@@ -54,17 +56,37 @@ import java.util.function.Predicate;
|
|
|
|
|
|
import static org.apache.hadoop.yarn.api.resource.PlacementConstraints.NODE;
|
|
import static org.apache.hadoop.yarn.api.resource.PlacementConstraints.NODE;
|
|
import static org.apache.hadoop.yarn.api.resource.PlacementConstraints.PlacementTargets.allocationTag;
|
|
import static org.apache.hadoop.yarn.api.resource.PlacementConstraints.PlacementTargets.allocationTag;
|
|
-import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.INSUFFICIENT_RESOURCE_DIAGNOSTIC_PREFIX;
|
|
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_ALLOCATIONS;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_ALLOCATION_REQUEST_ID;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_ALLOCATION_STATE;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_DIAGNOSTIC;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_FINAL_ALLOCATION_STATE;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_NODE_ID;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_NODE_IDS;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_ACT_REQUEST_PRIORITY;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_APP_ACT_CHILDREN;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_APP_ACT_ROOT;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_SCHEDULER_ACT_CHILDREN;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_SCHEDULER_ACT_NAME;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_SCHEDULER_ACT_ALLOCATIONS_ROOT;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.FN_SCHEDULER_ACT_ROOT;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.TOTAL_RESOURCE_INSUFFICIENT_DIAGNOSTIC_PREFIX;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.UNMATCHED_PARTITION_OR_PC_DIAGNOSTIC_PREFIX;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.UNMATCHED_PARTITION_OR_PC_DIAGNOSTIC_PREFIX;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.getFirstSubNodeFromJson;
|
|
|
|
+import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.getSubNodesFromJson;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyNumberOfAllocationAttempts;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyNumberOfAllocationAttempts;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyNumberOfAllocations;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyNumberOfAllocations;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyNumberOfNodes;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyNumberOfNodes;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyQueueOrder;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyQueueOrder;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyStateOfAllocations;
|
|
import static org.apache.hadoop.yarn.server.resourcemanager.webapp.ActivitiesTestUtils.verifyStateOfAllocations;
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
+import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertNotNull;
|
|
import static org.junit.Assert.assertNotNull;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.junit.Assert.assertTrue;
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Tests for scheduler/app activities.
|
|
|
|
+ */
|
|
public class TestRMWebServicesSchedulerActivities
|
|
public class TestRMWebServicesSchedulerActivities
|
|
extends TestRMWebServicesCapacitySched {
|
|
extends TestRMWebServicesCapacitySched {
|
|
|
|
|
|
@@ -117,9 +139,12 @@ public class TestRMWebServicesSchedulerActivities
|
|
// Collection logic of scheduler activities changed after YARN-9313,
|
|
// Collection logic of scheduler activities changed after YARN-9313,
|
|
// only one allocation should be recorded for all scenarios.
|
|
// only one allocation should be recorded for all scenarios.
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- verifyStateOfAllocations(json.getJSONObject("allocations"),
|
|
|
|
- "finalAllocationState", "ALLOCATED");
|
|
|
|
- verifyQueueOrder(json.getJSONObject("allocations"), "root-a-b-b2-b3-b1");
|
|
|
|
|
|
+ JSONObject allocation = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ verifyStateOfAllocations(allocation,
|
|
|
|
+ FN_ACT_FINAL_ALLOCATION_STATE, "ALLOCATED");
|
|
|
|
+ verifyQueueOrder(allocation,
|
|
|
|
+ "root-a-b-b2-b3-b1");
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
@@ -167,7 +192,14 @@ public class TestRMWebServicesSchedulerActivities
|
|
response.getType().toString());
|
|
response.getType().toString());
|
|
json = response.getEntity(JSONObject.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
|
|
|
|
- verifyNumberOfAllocations(json, 0);
|
|
|
|
|
|
+ // verify scheduler activities
|
|
|
|
+ verifyNumberOfAllocations(json, 1);
|
|
|
|
+ JSONObject rootObj = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS)
|
|
|
|
+ .getJSONObject(FN_SCHEDULER_ACT_ALLOCATIONS_ROOT);
|
|
|
|
+ assertTrue(rootObj.optString(FN_ACT_DIAGNOSTIC).startsWith(
|
|
|
|
+ ActivityDiagnosticConstant.
|
|
|
|
+ INIT_CHECK_SINGLE_NODE_RESOURCE_INSUFFICIENT));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
@@ -301,10 +333,12 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
|
|
|
|
- verifyQueueOrder(json.getJSONObject("allocations"), "root-a-b-b3-b1");
|
|
|
|
-
|
|
|
|
- JSONObject allocations = json.getJSONObject("allocations");
|
|
|
|
- verifyStateOfAllocations(allocations, "finalAllocationState", "RESERVED");
|
|
|
|
|
|
+ JSONObject allocations = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ verifyQueueOrder(allocations,
|
|
|
|
+ "root-a-b-b3-b1");
|
|
|
|
+ verifyStateOfAllocations(allocations, FN_ACT_FINAL_ALLOCATION_STATE,
|
|
|
|
+ "RESERVED");
|
|
|
|
|
|
// Do a node heartbeat again without releasing container from app2
|
|
// Do a node heartbeat again without releasing container from app2
|
|
r = resource();
|
|
r = resource();
|
|
@@ -329,10 +363,11 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
|
|
|
|
- verifyQueueOrder(json.getJSONObject("allocations"), "b1");
|
|
|
|
-
|
|
|
|
- allocations = json.getJSONObject("allocations");
|
|
|
|
- verifyStateOfAllocations(allocations, "finalAllocationState", "SKIPPED");
|
|
|
|
|
|
+ JSONObject allocation = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ verifyQueueOrder(allocation, "b1");
|
|
|
|
+ verifyStateOfAllocations(allocation, FN_ACT_FINAL_ALLOCATION_STATE,
|
|
|
|
+ "RESERVED");
|
|
|
|
|
|
// Finish application 2
|
|
// Finish application 2
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
@@ -365,10 +400,10 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
|
|
|
|
- verifyQueueOrder(json.getJSONObject("allocations"), "b1");
|
|
|
|
-
|
|
|
|
- allocations = json.getJSONObject("allocations");
|
|
|
|
- verifyStateOfAllocations(allocations, "finalAllocationState",
|
|
|
|
|
|
+ allocations = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ verifyQueueOrder(allocations, "b1");
|
|
|
|
+ verifyStateOfAllocations(allocations, FN_ACT_FINAL_ALLOCATION_STATE,
|
|
"ALLOCATED_FROM_RESERVED");
|
|
"ALLOCATED_FROM_RESERVED");
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
@@ -411,14 +446,15 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
|
|
|
|
- JSONObject allocations = json.getJSONObject("allocations");
|
|
|
|
- verifyStateOfAllocations(allocations, "finalAllocationState",
|
|
|
|
|
|
+ JSONObject allocation = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ verifyStateOfAllocations(allocation, FN_ACT_FINAL_ALLOCATION_STATE,
|
|
"ALLOCATED");
|
|
"ALLOCATED");
|
|
|
|
|
|
// Increase number of nodes to 6 since request node has been added
|
|
// Increase number of nodes to 6 since request node has been added
|
|
- verifyNumberOfNodes(allocations, 6);
|
|
|
|
|
|
+ verifyNumberOfNodes(allocation, 6);
|
|
|
|
|
|
- verifyQueueOrder(json.getJSONObject("allocations"), "root-b-b1");
|
|
|
|
|
|
+ verifyQueueOrder(allocation, "root-b-b1");
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
@@ -451,22 +487,27 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
//Check app activities
|
|
//Check app activities
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocations = json.getJSONObject("allocations");
|
|
|
|
- verifyStateOfAllocations(allocations, "allocationState", "ALLOCATED");
|
|
|
|
|
|
+ JSONObject allocation = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_APP_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ verifyStateOfAllocations(allocation, FN_ACT_ALLOCATION_STATE,
|
|
|
|
+ "ALLOCATED");
|
|
//Check request allocation
|
|
//Check request allocation
|
|
JSONObject requestAllocationObj =
|
|
JSONObject requestAllocationObj =
|
|
- allocations.getJSONObject("requestAllocation");
|
|
|
|
- verifyStateOfAllocations(requestAllocationObj, "allocationState",
|
|
|
|
|
|
+ getFirstSubNodeFromJson(allocation, FN_APP_ACT_CHILDREN);
|
|
|
|
+ verifyStateOfAllocations(requestAllocationObj, FN_ACT_ALLOCATION_STATE,
|
|
"ALLOCATED");
|
|
"ALLOCATED");
|
|
- assertEquals("0", requestAllocationObj.optString("requestPriority"));
|
|
|
|
- assertEquals("-1", requestAllocationObj.optString("allocationRequestId"));
|
|
|
|
|
|
+ assertEquals(0,
|
|
|
|
+ requestAllocationObj.optInt(FN_ACT_REQUEST_PRIORITY));
|
|
|
|
+ assertEquals(-1,
|
|
|
|
+ requestAllocationObj.optLong(FN_ACT_ALLOCATION_REQUEST_ID));
|
|
//Check allocation attempts
|
|
//Check allocation attempts
|
|
verifyNumberOfAllocationAttempts(requestAllocationObj, 1);
|
|
verifyNumberOfAllocationAttempts(requestAllocationObj, 1);
|
|
- JSONObject allocationAttemptObj =
|
|
|
|
- requestAllocationObj.getJSONObject("allocationAttempt");
|
|
|
|
- verifyStateOfAllocations(allocationAttemptObj, "allocationState",
|
|
|
|
- "ALLOCATED");
|
|
|
|
- assertNotNull(allocationAttemptObj.get("nodeId"));
|
|
|
|
|
|
+ List<JSONObject> allocationAttempts =
|
|
|
|
+ getSubNodesFromJson(requestAllocationObj, FN_APP_ACT_CHILDREN);
|
|
|
|
+ assertEquals(1, allocationAttempts.size());
|
|
|
|
+ verifyStateOfAllocations(allocationAttempts.get(0),
|
|
|
|
+ FN_ACT_ALLOCATION_STATE, "ALLOCATED");
|
|
|
|
+ assertNotNull(allocationAttempts.get(0).get(FN_ACT_NODE_ID));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
@@ -508,10 +549,11 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
verifyNumberOfAllocations(json, 10);
|
|
verifyNumberOfAllocations(json, 10);
|
|
|
|
|
|
- JSONArray allocations = json.getJSONArray("allocations");
|
|
|
|
- for (int i = 0; i < allocations.length(); i++) {
|
|
|
|
- verifyStateOfAllocations(allocations.getJSONObject(i),
|
|
|
|
- "allocationState", "ALLOCATED");
|
|
|
|
|
|
+ List<JSONObject> allocations =
|
|
|
|
+ getSubNodesFromJson(json, FN_APP_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ for (int i = 0; i < allocations.size(); i++) {
|
|
|
|
+ verifyStateOfAllocations(allocations.get(i),
|
|
|
|
+ FN_ACT_ALLOCATION_STATE, "ALLOCATED");
|
|
}
|
|
}
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
@@ -643,8 +685,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
}
|
|
}
|
|
|
|
|
|
@Test (timeout=30000)
|
|
@Test (timeout=30000)
|
|
- public void testInsufficientResourceDiagnostic()
|
|
|
|
- throws Exception {
|
|
|
|
|
|
+ public void testInsufficientResourceDiagnostic() throws Exception {
|
|
rm.start();
|
|
rm.start();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
|
|
|
|
@@ -664,7 +705,8 @@ public class TestRMWebServicesSchedulerActivities
|
|
response.getType().toString());
|
|
response.getType().toString());
|
|
JSONObject json = response.getEntity(JSONObject.class);
|
|
JSONObject json = response.getEntity(JSONObject.class);
|
|
assertEquals("waiting for next allocation",
|
|
assertEquals("waiting for next allocation",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ getFirstSubNodeFromJson(json, FN_SCHEDULER_ACT_ROOT)
|
|
|
|
+ .optString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
am1.allocate(Arrays.asList(ResourceRequest
|
|
am1.allocate(Arrays.asList(ResourceRequest
|
|
.newInstance(Priority.UNDEFINED, "*",
|
|
.newInstance(Priority.UNDEFINED, "*",
|
|
@@ -682,24 +724,26 @@ public class TestRMWebServicesSchedulerActivities
|
|
json = response.getEntity(JSONObject.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
|
|
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocationObj = json.getJSONObject("allocations");
|
|
|
|
|
|
+ JSONObject allocationObj = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
// check diagnostics
|
|
// check diagnostics
|
|
Predicate<JSONObject> findReqPred =
|
|
Predicate<JSONObject> findReqPred =
|
|
- (obj) -> obj.optString("name").equals("request_-1_-1");
|
|
|
|
|
|
+ (obj) -> obj.optString(FN_SCHEDULER_ACT_NAME).equals("request_-1_-1");
|
|
List<JSONObject> app2ReqObjs =
|
|
List<JSONObject> app2ReqObjs =
|
|
ActivitiesTestUtils.findInAllocations(allocationObj, findReqPred);
|
|
ActivitiesTestUtils.findInAllocations(allocationObj, findReqPred);
|
|
assertEquals(1, app2ReqObjs.size());
|
|
assertEquals(1, app2ReqObjs.size());
|
|
- JSONObject reqChild = app2ReqObjs.get(0).getJSONObject("children");
|
|
|
|
- assertTrue(reqChild.getString("diagnostic")
|
|
|
|
- .contains(INSUFFICIENT_RESOURCE_DIAGNOSTIC_PREFIX));
|
|
|
|
|
|
+ List<JSONObject> reqAllocations =
|
|
|
|
+ getSubNodesFromJson(app2ReqObjs.get(0), FN_SCHEDULER_ACT_CHILDREN);
|
|
|
|
+ assertEquals(1, reqAllocations.size());
|
|
|
|
+ assertTrue(reqAllocations.get(0).getString(FN_ACT_DIAGNOSTIC)
|
|
|
|
+ .contains(TOTAL_RESOURCE_INSUFFICIENT_DIAGNOSTIC_PREFIX));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@Test (timeout=30000)
|
|
@Test (timeout=30000)
|
|
- public void testPlacementConstraintDiagnostic()
|
|
|
|
- throws Exception {
|
|
|
|
|
|
+ public void testPlacementConstraintDiagnostic() throws Exception {
|
|
rm.start();
|
|
rm.start();
|
|
CapacityScheduler cs = (CapacityScheduler)rm.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler)rm.getResourceScheduler();
|
|
|
|
|
|
@@ -728,7 +772,8 @@ public class TestRMWebServicesSchedulerActivities
|
|
response.getType().toString());
|
|
response.getType().toString());
|
|
JSONObject json = response.getEntity(JSONObject.class);
|
|
JSONObject json = response.getEntity(JSONObject.class);
|
|
assertEquals("waiting for next allocation",
|
|
assertEquals("waiting for next allocation",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ getFirstSubNodeFromJson(json, FN_SCHEDULER_ACT_ROOT)
|
|
|
|
+ .optString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// trigger scheduling
|
|
// trigger scheduling
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
@@ -742,15 +787,17 @@ public class TestRMWebServicesSchedulerActivities
|
|
json = response.getEntity(JSONObject.class);
|
|
json = response.getEntity(JSONObject.class);
|
|
|
|
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocationObj = json.getJSONObject("allocations");
|
|
|
|
|
|
+ JSONObject allocationObj = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
// check diagnostics
|
|
// check diagnostics
|
|
Predicate<JSONObject> findReqPred =
|
|
Predicate<JSONObject> findReqPred =
|
|
- (obj) -> obj.optString("name").equals("request_1_1");
|
|
|
|
|
|
+ (obj) -> obj.optString(FN_SCHEDULER_ACT_NAME).equals("request_1_1");
|
|
List<JSONObject> reqObjs =
|
|
List<JSONObject> reqObjs =
|
|
ActivitiesTestUtils.findInAllocations(allocationObj, findReqPred);
|
|
ActivitiesTestUtils.findInAllocations(allocationObj, findReqPred);
|
|
assertEquals(1, reqObjs.size());
|
|
assertEquals(1, reqObjs.size());
|
|
- JSONObject reqChild = reqObjs.get(0).getJSONObject("children");
|
|
|
|
- assertTrue(reqChild.getString("diagnostic")
|
|
|
|
|
|
+ JSONObject reqChild =
|
|
|
|
+ getFirstSubNodeFromJson(reqObjs.get(0), FN_SCHEDULER_ACT_CHILDREN);
|
|
|
|
+ assertTrue(reqChild.getString(FN_ACT_DIAGNOSTIC)
|
|
.contains(UNMATCHED_PARTITION_OR_PC_DIAGNOSTIC_PREFIX));
|
|
.contains(UNMATCHED_PARTITION_OR_PC_DIAGNOSTIC_PREFIX));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
@@ -758,8 +805,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
}
|
|
}
|
|
|
|
|
|
@Test (timeout=30000)
|
|
@Test (timeout=30000)
|
|
- public void testAppInsufficientResourceDiagnostic()
|
|
|
|
- throws Exception {
|
|
|
|
|
|
+ public void testAppInsufficientResourceDiagnostic() throws Exception {
|
|
rm.start();
|
|
rm.start();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
|
|
|
|
@@ -776,7 +822,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("waiting for display",
|
|
assertEquals("waiting for display",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// am1 asks for 1 * 5GB container
|
|
// am1 asks for 1 * 5GB container
|
|
am1.allocate(Arrays.asList(ResourceRequest
|
|
am1.allocate(Arrays.asList(ResourceRequest
|
|
@@ -788,24 +834,24 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocationObj = json.getJSONObject("allocations");
|
|
|
|
|
|
+ JSONObject allocationObj = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_APP_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
JSONObject requestAllocationObj =
|
|
JSONObject requestAllocationObj =
|
|
- allocationObj.getJSONObject("requestAllocation");
|
|
|
|
|
|
+ getFirstSubNodeFromJson(allocationObj, FN_APP_ACT_CHILDREN);
|
|
verifyNumberOfAllocationAttempts(requestAllocationObj, 1);
|
|
verifyNumberOfAllocationAttempts(requestAllocationObj, 1);
|
|
- JSONObject allocationAttemptObj =
|
|
|
|
- requestAllocationObj.getJSONObject("allocationAttempt");
|
|
|
|
- verifyStateOfAllocations(allocationAttemptObj, "allocationState",
|
|
|
|
|
|
+ JSONObject allocationAttemptObj = getFirstSubNodeFromJson(
|
|
|
|
+ requestAllocationObj, FN_APP_ACT_CHILDREN);
|
|
|
|
+ verifyStateOfAllocations(allocationAttemptObj, FN_ACT_ALLOCATION_STATE,
|
|
"SKIPPED");
|
|
"SKIPPED");
|
|
- assertTrue(allocationAttemptObj.optString("diagnostic")
|
|
|
|
- .contains(INSUFFICIENT_RESOURCE_DIAGNOSTIC_PREFIX));
|
|
|
|
|
|
+ assertTrue(allocationAttemptObj.optString(FN_ACT_DIAGNOSTIC)
|
|
|
|
+ .contains(TOTAL_RESOURCE_INSUFFICIENT_DIAGNOSTIC_PREFIX));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- @Test (timeout=30000)
|
|
|
|
- public void testAppPlacementConstraintDiagnostic()
|
|
|
|
- throws Exception {
|
|
|
|
|
|
+ @Test(timeout=30000)
|
|
|
|
+ public void testAppPlacementConstraintDiagnostic() throws Exception {
|
|
rm.start();
|
|
rm.start();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
|
|
|
|
@@ -822,7 +868,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("waiting for display",
|
|
assertEquals("waiting for display",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// am1 asks for 1 * 5GB container with PC expression: in,node,foo
|
|
// am1 asks for 1 * 5GB container with PC expression: in,node,foo
|
|
PlacementConstraint pcExpression = PlacementConstraints
|
|
PlacementConstraint pcExpression = PlacementConstraints
|
|
@@ -840,15 +886,16 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocationObj = json.getJSONObject("allocations");
|
|
|
|
|
|
+ JSONObject allocationObj = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_APP_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
JSONObject requestAllocationObj =
|
|
JSONObject requestAllocationObj =
|
|
- allocationObj.getJSONObject("requestAllocation");
|
|
|
|
|
|
+ getFirstSubNodeFromJson(allocationObj, FN_APP_ACT_CHILDREN);
|
|
verifyNumberOfAllocationAttempts(requestAllocationObj, 1);
|
|
verifyNumberOfAllocationAttempts(requestAllocationObj, 1);
|
|
- JSONObject allocationAttemptObj =
|
|
|
|
- requestAllocationObj.getJSONObject("allocationAttempt");
|
|
|
|
- verifyStateOfAllocations(allocationAttemptObj, "allocationState",
|
|
|
|
|
|
+ JSONObject allocationAttemptObj = getFirstSubNodeFromJson(
|
|
|
|
+ requestAllocationObj, FN_APP_ACT_CHILDREN);
|
|
|
|
+ verifyStateOfAllocations(allocationAttemptObj, FN_ACT_ALLOCATION_STATE,
|
|
"SKIPPED");
|
|
"SKIPPED");
|
|
- assertTrue(allocationAttemptObj.optString("diagnostic")
|
|
|
|
|
|
+ assertTrue(allocationAttemptObj.optString(FN_ACT_DIAGNOSTIC)
|
|
.contains(UNMATCHED_PARTITION_OR_PC_DIAGNOSTIC_PREFIX));
|
|
.contains(UNMATCHED_PARTITION_OR_PC_DIAGNOSTIC_PREFIX));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
@@ -873,7 +920,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("waiting for display",
|
|
assertEquals("waiting for display",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// am1 asks for 1 * 1GB container with requestPriority=-1
|
|
// am1 asks for 1 * 1GB container with requestPriority=-1
|
|
// and allocationRequestId=1
|
|
// and allocationRequestId=1
|
|
@@ -919,23 +966,22 @@ public class TestRMWebServicesSchedulerActivities
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
rm.getRMContext().getRMNodes().get(nm1.getNodeId())));
|
|
rm.getRMContext().getRMNodes().get(nm1.getNodeId())));
|
|
|
|
|
|
- // query app activities with requestPriorities={0,1}
|
|
|
|
|
|
+ // query app activities with requestPriorities={0,-1}
|
|
MultivaluedMapImpl filterParams1 = new MultivaluedMapImpl(params);
|
|
MultivaluedMapImpl filterParams1 = new MultivaluedMapImpl(params);
|
|
- filterParams1.add(RMWSConsts.REQUEST_PRIORITIES, "-1");
|
|
|
|
- filterParams1.add(RMWSConsts.REQUEST_PRIORITIES, "0");
|
|
|
|
|
|
+ filterParams1.add(RMWSConsts.REQUEST_PRIORITIES, "0,-1");
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams1);
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams1);
|
|
verifyNumberOfAllocations(json, 4);
|
|
verifyNumberOfAllocations(json, 4);
|
|
|
|
|
|
- // query app activities with requestPriorities=0
|
|
|
|
|
|
+ // query app activities with requestPriorities=-1
|
|
MultivaluedMapImpl filterParams2 = new MultivaluedMapImpl(params);
|
|
MultivaluedMapImpl filterParams2 = new MultivaluedMapImpl(params);
|
|
filterParams2.add(RMWSConsts.REQUEST_PRIORITIES, "-1");
|
|
filterParams2.add(RMWSConsts.REQUEST_PRIORITIES, "-1");
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams2);
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams2);
|
|
verifyNumberOfAllocations(json, 2);
|
|
verifyNumberOfAllocations(json, 2);
|
|
- JSONArray allocations = json.getJSONArray("allocations");
|
|
|
|
|
|
+ JSONArray allocations =
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getJSONArray(FN_ACT_ALLOCATIONS);
|
|
for (int i=0; i<allocations.length(); i++) {
|
|
for (int i=0; i<allocations.length(); i++) {
|
|
- assertEquals("-1",
|
|
|
|
- allocations.getJSONObject(i).getJSONObject("requestAllocation")
|
|
|
|
- .optString("requestPriority"));
|
|
|
|
|
|
+ assertEquals("-1", getFirstSubNodeFromJson(allocations.getJSONObject(i),
|
|
|
|
+ FN_APP_ACT_CHILDREN).optString(FN_ACT_REQUEST_PRIORITY));
|
|
}
|
|
}
|
|
|
|
|
|
// query app activities with allocationRequestId=1
|
|
// query app activities with allocationRequestId=1
|
|
@@ -943,11 +989,11 @@ public class TestRMWebServicesSchedulerActivities
|
|
filterParams3.add(RMWSConsts.ALLOCATION_REQUEST_IDS, "1");
|
|
filterParams3.add(RMWSConsts.ALLOCATION_REQUEST_IDS, "1");
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams3);
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams3);
|
|
verifyNumberOfAllocations(json, 2);
|
|
verifyNumberOfAllocations(json, 2);
|
|
- allocations = json.getJSONArray("allocations");
|
|
|
|
|
|
+ allocations =
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getJSONArray(FN_ACT_ALLOCATIONS);
|
|
for (int i = 0; i < allocations.length(); i++) {
|
|
for (int i = 0; i < allocations.length(); i++) {
|
|
- assertEquals("1",
|
|
|
|
- allocations.getJSONObject(i).getJSONObject("requestAllocation")
|
|
|
|
- .optString("allocationRequestId"));
|
|
|
|
|
|
+ assertEquals("1", getFirstSubNodeFromJson(allocations.getJSONObject(i),
|
|
|
|
+ FN_APP_ACT_CHILDREN).optString(FN_ACT_ALLOCATION_REQUEST_ID));
|
|
}
|
|
}
|
|
|
|
|
|
// query app activities with requestPriorities=0 and allocationRequestId=1
|
|
// query app activities with requestPriorities=0 and allocationRequestId=1
|
|
@@ -956,11 +1002,34 @@ public class TestRMWebServicesSchedulerActivities
|
|
filterParams4.add(RMWSConsts.ALLOCATION_REQUEST_IDS, "1");
|
|
filterParams4.add(RMWSConsts.ALLOCATION_REQUEST_IDS, "1");
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams4);
|
|
json = ActivitiesTestUtils.requestWebResource(r, filterParams4);
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocation = json.getJSONObject("allocations");
|
|
|
|
- assertEquals("0", allocation.getJSONObject("requestAllocation")
|
|
|
|
- .optString("requestPriority"));
|
|
|
|
- assertEquals("1", allocation.getJSONObject("requestAllocation")
|
|
|
|
- .optString("allocationRequestId"));
|
|
|
|
|
|
+ JSONObject allocation = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_APP_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
|
|
+ JSONObject request =
|
|
|
|
+ getFirstSubNodeFromJson(allocation, FN_APP_ACT_CHILDREN);
|
|
|
|
+ assertEquals("0", request.optString(FN_ACT_REQUEST_PRIORITY));
|
|
|
|
+ assertEquals("1", request.optString(FN_ACT_ALLOCATION_REQUEST_ID));
|
|
|
|
+
|
|
|
|
+ // query app activities with requestPriorities=-1
|
|
|
|
+ // and allocationRequestId={1,2}
|
|
|
|
+ MultivaluedMapImpl filterParams5 = new MultivaluedMapImpl(params);
|
|
|
|
+ filterParams5.add(RMWSConsts.REQUEST_PRIORITIES, "-1");
|
|
|
|
+ filterParams5.add(RMWSConsts.ALLOCATION_REQUEST_IDS, "1,2");
|
|
|
|
+ json = ActivitiesTestUtils.requestWebResource(r, filterParams5);
|
|
|
|
+ verifyNumberOfAllocations(json, 2);
|
|
|
|
+ allocations =
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getJSONArray(FN_ACT_ALLOCATIONS);
|
|
|
|
+ for (int i = 0; i < allocations.length(); i++) {
|
|
|
|
+ assertEquals("-1", getFirstSubNodeFromJson(allocations.getJSONObject(i),
|
|
|
|
+ FN_APP_ACT_CHILDREN).optString(FN_ACT_REQUEST_PRIORITY));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // query app activities with requestPriorities=-1
|
|
|
|
+ // and allocationRequestId={-1,1}
|
|
|
|
+ MultivaluedMapImpl filterParams6 = new MultivaluedMapImpl(params);
|
|
|
|
+ filterParams6.add(RMWSConsts.REQUEST_PRIORITIES, "-1");
|
|
|
|
+ filterParams6.add(RMWSConsts.ALLOCATION_REQUEST_IDS, "-1,1");
|
|
|
|
+ json = ActivitiesTestUtils.requestWebResource(r, filterParams6);
|
|
|
|
+ verifyNumberOfAllocations(json, 1);
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
@@ -982,7 +1051,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("waiting for display",
|
|
assertEquals("waiting for display",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// am1 asks for 1 * 5GB container
|
|
// am1 asks for 1 * 5GB container
|
|
am1.allocate("*", 5120, 1, new ArrayList<>());
|
|
am1.allocate("*", 5120, 1, new ArrayList<>());
|
|
@@ -1016,19 +1085,20 @@ public class TestRMWebServicesSchedulerActivities
|
|
// query all app activities with invalid limit
|
|
// query all app activities with invalid limit
|
|
params.putSingle(RMWSConsts.LIMIT, "STRING");
|
|
params.putSingle(RMWSConsts.LIMIT, "STRING");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
- assertEquals("limit must be integer!", json.getString("diagnostic"));
|
|
|
|
|
|
+ assertEquals("limit must be integer!",
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// query all app activities with limit = 0
|
|
// query all app activities with limit = 0
|
|
params.putSingle(RMWSConsts.LIMIT, "0");
|
|
params.putSingle(RMWSConsts.LIMIT, "0");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("limit must be greater than 0!",
|
|
assertEquals("limit must be greater than 0!",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// query all app activities with limit < 0
|
|
// query all app activities with limit < 0
|
|
params.putSingle(RMWSConsts.LIMIT, "-3");
|
|
params.putSingle(RMWSConsts.LIMIT, "-3");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("limit must be greater than 0!",
|
|
assertEquals("limit must be greater than 0!",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
@@ -1052,17 +1122,18 @@ public class TestRMWebServicesSchedulerActivities
|
|
params.add("maxTime", 1); //only last for 1 second
|
|
params.add("maxTime", 1); //only last for 1 second
|
|
|
|
|
|
// testing invalid action
|
|
// testing invalid action
|
|
- params.add(RMWSConsts.ACTIONS, "get");
|
|
|
|
- params.add(RMWSConsts.ACTIONS, "invalid-action");
|
|
|
|
|
|
+ params.add(RMWSConsts.ACTIONS, "get,invalid-action");
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
- assertTrue(json.getString("diagnostic").startsWith("Got invalid action"));
|
|
|
|
|
|
+ assertTrue(json.getJSONObject(FN_APP_ACT_ROOT)
|
|
|
|
+ .getString(FN_ACT_DIAGNOSTIC).startsWith("Got invalid action"));
|
|
|
|
|
|
/*
|
|
/*
|
|
* testing get action
|
|
* testing get action
|
|
*/
|
|
*/
|
|
params.putSingle(RMWSConsts.ACTIONS, "get");
|
|
params.putSingle(RMWSConsts.ACTIONS, "get");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
- assertEquals("waiting for display", json.getString("diagnostic"));
|
|
|
|
|
|
+ assertEquals("waiting for display",
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// trigger scheduling
|
|
// trigger scheduling
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
@@ -1071,7 +1142,8 @@ public class TestRMWebServicesSchedulerActivities
|
|
// app activities won't be recorded
|
|
// app activities won't be recorded
|
|
params.putSingle(RMWSConsts.ACTIONS, "get");
|
|
params.putSingle(RMWSConsts.ACTIONS, "get");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
- assertEquals("waiting for display", json.getString("diagnostic"));
|
|
|
|
|
|
+ assertEquals("waiting for display",
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// trigger scheduling
|
|
// trigger scheduling
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
@@ -1082,8 +1154,8 @@ public class TestRMWebServicesSchedulerActivities
|
|
*/
|
|
*/
|
|
params.putSingle(RMWSConsts.ACTIONS, "refresh");
|
|
params.putSingle(RMWSConsts.ACTIONS, "refresh");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
- assertEquals("Successfully notified actions: refresh",
|
|
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ assertEquals("Successfully received action: refresh",
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
// trigger scheduling
|
|
// trigger scheduling
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
cs.handle(new NodeUpdateSchedulerEvent(
|
|
@@ -1104,8 +1176,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
* testing update and get actions
|
|
* testing update and get actions
|
|
*/
|
|
*/
|
|
params.remove(RMWSConsts.ACTIONS);
|
|
params.remove(RMWSConsts.ACTIONS);
|
|
- params.add(RMWSConsts.ACTIONS, "refresh");
|
|
|
|
- params.add(RMWSConsts.ACTIONS, "get");
|
|
|
|
|
|
+ params.add(RMWSConsts.ACTIONS, "refresh,get");
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
|
|
|
|
@@ -1149,7 +1220,7 @@ public class TestRMWebServicesSchedulerActivities
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
MultivaluedMapImpl params = new MultivaluedMapImpl();
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
JSONObject json = ActivitiesTestUtils.requestWebResource(r, params);
|
|
assertEquals("waiting for display",
|
|
assertEquals("waiting for display",
|
|
- json.getString("diagnostic"));
|
|
|
|
|
|
+ json.getJSONObject(FN_APP_ACT_ROOT).getString(FN_ACT_DIAGNOSTIC));
|
|
|
|
|
|
MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
|
|
MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
|
|
// am1 asks for 1 * 5GB container
|
|
// am1 asks for 1 * 5GB container
|
|
@@ -1170,23 +1241,191 @@ public class TestRMWebServicesSchedulerActivities
|
|
|
|
|
|
// verify that response contains an allocation summary for all nodes
|
|
// verify that response contains an allocation summary for all nodes
|
|
verifyNumberOfAllocations(json, 1);
|
|
verifyNumberOfAllocations(json, 1);
|
|
- JSONObject allocation = json.getJSONObject("allocations");
|
|
|
|
|
|
+ JSONObject allocation = getFirstSubNodeFromJson(json,
|
|
|
|
+ FN_APP_ACT_ROOT, FN_ACT_ALLOCATIONS);
|
|
JSONObject reqestAllocation =
|
|
JSONObject reqestAllocation =
|
|
- allocation.getJSONObject("requestAllocation");
|
|
|
|
- JSONArray attempts = reqestAllocation.getJSONArray("allocationAttempt");
|
|
|
|
|
|
+ getFirstSubNodeFromJson(allocation, FN_APP_ACT_CHILDREN);
|
|
|
|
+ JSONArray attempts = reqestAllocation.getJSONArray(FN_APP_ACT_CHILDREN);
|
|
assertEquals(2, attempts.length());
|
|
assertEquals(2, attempts.length());
|
|
for (int i = 0; i < attempts.length(); i++) {
|
|
for (int i = 0; i < attempts.length(); i++) {
|
|
JSONObject attempt = attempts.getJSONObject(i);
|
|
JSONObject attempt = attempts.getJSONObject(i);
|
|
- if (attempt.getString("allocationState").equals("SKIPPED")) {
|
|
|
|
- JSONArray nodeIds = attempt.optJSONArray("nodeIds");
|
|
|
|
- assertEquals(2, nodeIds.length());
|
|
|
|
- } else if (attempt.getString("allocationState").equals("RESERVED")) {
|
|
|
|
|
|
+ if (attempt.getString(FN_ACT_ALLOCATION_STATE)
|
|
|
|
+ .equals(ActivityState.SKIPPED.name())) {
|
|
|
|
+ assertEquals(2, attempt.getJSONArray(FN_ACT_NODE_IDS).length());
|
|
|
|
+ } else if (attempt.getString(FN_ACT_ALLOCATION_STATE)
|
|
|
|
+ .equals(ActivityState.RESERVED.name())) {
|
|
|
|
+ assertEquals(1, attempt.getJSONArray(FN_ACT_NODE_IDS).length());
|
|
assertEquals(nm1.getNodeId().toString(),
|
|
assertEquals(nm1.getNodeId().toString(),
|
|
- attempt.getString("nodeIds"));
|
|
|
|
|
|
+ attempt.getJSONArray(FN_ACT_NODE_IDS).getString(0));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} finally {
|
|
} finally {
|
|
rm.stop();
|
|
rm.stop();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testNodeSkippedBecauseOfRelaxLocality() throws Exception {
|
|
|
|
+ //Start RM so that it accepts app submissions
|
|
|
|
+ rm.start();
|
|
|
|
+
|
|
|
|
+ MockNM nm1 = new MockNM("127.0.0.1:1234", 4 * 1024,
|
|
|
|
+ rm.getResourceTrackerService());
|
|
|
|
+ MockNM nm2 = new MockNM("127.0.0.2:1234", 4 * 1024,
|
|
|
|
+ rm.getResourceTrackerService());
|
|
|
|
+
|
|
|
|
+ nm1.registerNode();
|
|
|
|
+ nm2.registerNode();
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ RMApp app1 = rm.submitApp(10, "app1", "user1", null, "b1");
|
|
|
|
+ MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
|
|
|
|
+
|
|
|
|
+ am1.allocate(Arrays.asList(
|
|
|
|
+ ResourceRequest.newBuilder().priority(Priority.UNDEFINED)
|
|
|
|
+ .resourceName("127.0.0.2")
|
|
|
|
+ .capability(Resources.createResource(1024)).numContainers(1)
|
|
|
|
+ .build(),
|
|
|
|
+ ResourceRequest.newBuilder().priority(Priority.UNDEFINED)
|
|
|
|
+ .resourceName("/default-rack")
|
|
|
|
+ .capability(Resources.createResource(1024)).numContainers(1)
|
|
|
|
+ .relaxLocality(false)
|
|
|
|
+ .build(),
|
|
|
|
+ ResourceRequest.newBuilder().priority(Priority.UNDEFINED)
|
|
|
|
+ .resourceName("*")
|
|
|
|
+ .capability(Resources.createResource(1024)).numContainers(1)
|
|
|
|
+ .relaxLocality(false)
|
|
|
|
+ .build()), null);
|
|
|
|
+
|
|
|
|
+ WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
|
|
|
|
+ .path(ActivitiesTestUtils.format(RMWSConsts.SCHEDULER_APP_ACTIVITIES,
|
|
|
|
+ app1.getApplicationId().toString()));
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(r, null);
|
|
|
|
+ WebResource sr = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
|
|
|
|
+ .path(RMWSConsts.SCHEDULER_ACTIVITIES);
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(sr, null);
|
|
|
|
+
|
|
|
|
+ nm1.nodeHeartbeat(true);
|
|
|
|
+ Thread.sleep(1000);
|
|
|
|
+
|
|
|
|
+ JSONObject appActivitiesJson =
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(r, null);
|
|
|
|
+ JSONObject schedulerActivitiesJson =
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(sr, null);
|
|
|
|
+
|
|
|
|
+ // verify app activities
|
|
|
|
+ verifyNumberOfAllocations(appActivitiesJson, 1);
|
|
|
|
+ List<JSONObject> allocationAttempts = ActivitiesTestUtils
|
|
|
|
+ .getSubNodesFromJson(appActivitiesJson, FN_APP_ACT_ROOT,
|
|
|
|
+ FN_ACT_ALLOCATIONS, FN_APP_ACT_CHILDREN, FN_APP_ACT_CHILDREN);
|
|
|
|
+ assertEquals(1, allocationAttempts.size());
|
|
|
|
+ assertEquals(
|
|
|
|
+ ActivityDiagnosticConstant.NODE_SKIPPED_BECAUSE_OF_RELAX_LOCALITY,
|
|
|
|
+ allocationAttempts.get(0).optString(FN_ACT_DIAGNOSTIC));
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * verify scheduler activities
|
|
|
|
+ */
|
|
|
|
+ verifyNumberOfAllocations(schedulerActivitiesJson, 1);
|
|
|
|
+ // verify request activity
|
|
|
|
+ Predicate<JSONObject> findA1AQueuePred =
|
|
|
|
+ (obj) -> obj.optString(FN_SCHEDULER_ACT_NAME).equals("request_-1_-1");
|
|
|
|
+ List<JSONObject> reqObjs = ActivitiesTestUtils.findInAllocations(
|
|
|
|
+ getFirstSubNodeFromJson(schedulerActivitiesJson,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS),
|
|
|
|
+ findA1AQueuePred);
|
|
|
|
+ assertEquals(1, reqObjs.size());
|
|
|
|
+ assertEquals(ActivityState.SKIPPED.name(),
|
|
|
|
+ reqObjs.get(0).optString(FN_ACT_ALLOCATION_STATE));
|
|
|
|
+ // verify node activity
|
|
|
|
+ JSONObject nodeObj =
|
|
|
|
+ getFirstSubNodeFromJson(reqObjs.get(0), FN_SCHEDULER_ACT_CHILDREN);
|
|
|
|
+ assertEquals(nm1.getNodeId().toString(),
|
|
|
|
+ nodeObj.optString(FN_ACT_NODE_ID));
|
|
|
|
+ assertEquals(
|
|
|
|
+ ActivityDiagnosticConstant.NODE_SKIPPED_BECAUSE_OF_RELAX_LOCALITY,
|
|
|
|
+ nodeObj.optString(FN_ACT_DIAGNOSTIC));
|
|
|
|
+ } finally {
|
|
|
|
+ rm.stop();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void testQueueSkippedBecauseOfHeadroom() throws Exception {
|
|
|
|
+ //Start RM so that it accepts app submissions
|
|
|
|
+ rm.start();
|
|
|
|
+
|
|
|
|
+ MockNM nm1 = new MockNM("127.0.0.1:1234", 4 * 1024,
|
|
|
|
+ rm.getResourceTrackerService());
|
|
|
|
+ MockNM nm2 = new MockNM("127.0.0.2:1234", 4 * 1024,
|
|
|
|
+ rm.getResourceTrackerService());
|
|
|
|
+ nm1.registerNode();
|
|
|
|
+ nm2.registerNode();
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ RMApp app1 = rm.submitApp(10, "app1", "user1", null, "a1a");
|
|
|
|
+ MockAM am1 = MockRM.launchAndRegisterAM(app1, rm, nm1);
|
|
|
|
+
|
|
|
|
+ am1.allocate(Arrays.asList(
|
|
|
|
+ ResourceRequest.newBuilder().priority(Priority.UNDEFINED)
|
|
|
|
+ .resourceName("*").capability(Resources.createResource(3072))
|
|
|
|
+ .numContainers(1).relaxLocality(false).build()), null);
|
|
|
|
+
|
|
|
|
+ WebResource r = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
|
|
|
|
+ .path(ActivitiesTestUtils.format(RMWSConsts.SCHEDULER_APP_ACTIVITIES,
|
|
|
|
+ app1.getApplicationId().toString()));
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(r, null);
|
|
|
|
+ WebResource sr = resource().path(RMWSConsts.RM_WEB_SERVICE_PATH)
|
|
|
|
+ .path(RMWSConsts.SCHEDULER_ACTIVITIES);
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(sr, null);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ nm1.nodeHeartbeat(true);
|
|
|
|
+ Thread.sleep(1000);
|
|
|
|
+
|
|
|
|
+ JSONObject appActivitiesJson =
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(r, null);
|
|
|
|
+ JSONObject schedulerActivitiesJson =
|
|
|
|
+ ActivitiesTestUtils.requestWebResource(sr, null);
|
|
|
|
+
|
|
|
|
+ // verify app activities: diagnostic should be attached at request level
|
|
|
|
+ // and there should be no allocation attempts at node level
|
|
|
|
+ verifyNumberOfAllocations(appActivitiesJson, 1);
|
|
|
|
+ List<JSONObject> requestAllocations = ActivitiesTestUtils
|
|
|
|
+ .getSubNodesFromJson(appActivitiesJson, FN_APP_ACT_ROOT,
|
|
|
|
+ FN_ACT_ALLOCATIONS, FN_APP_ACT_CHILDREN);
|
|
|
|
+ assertEquals(1, requestAllocations.size());
|
|
|
|
+ assertEquals(ActivityDiagnosticConstant.QUEUE_DO_NOT_HAVE_ENOUGH_HEADROOM,
|
|
|
|
+ requestAllocations.get(0).optString(FN_ACT_DIAGNOSTIC));
|
|
|
|
+ assertFalse(requestAllocations.get(0).has(FN_APP_ACT_CHILDREN));
|
|
|
|
+
|
|
|
|
+ // verify scheduler activities: diagnostic should be attached at request
|
|
|
|
+ // level and queue level
|
|
|
|
+ verifyNumberOfAllocations(schedulerActivitiesJson, 1);
|
|
|
|
+ // verify at queue level
|
|
|
|
+ Predicate<JSONObject> findA1AQueuePred =
|
|
|
|
+ (obj) -> obj.optString(FN_SCHEDULER_ACT_NAME).equals("a1a");
|
|
|
|
+ List<JSONObject> a1aQueueObj = ActivitiesTestUtils.findInAllocations(
|
|
|
|
+ getFirstSubNodeFromJson(schedulerActivitiesJson,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS), findA1AQueuePred);
|
|
|
|
+ assertEquals(1, a1aQueueObj.size());
|
|
|
|
+ assertEquals(ActivityState.REJECTED.name(),
|
|
|
|
+ a1aQueueObj.get(0).optString(FN_ACT_ALLOCATION_STATE));
|
|
|
|
+ assertTrue(a1aQueueObj.get(0).optString(FN_ACT_DIAGNOSTIC).startsWith(
|
|
|
|
+ ActivityDiagnosticConstant.QUEUE_DO_NOT_HAVE_ENOUGH_HEADROOM));
|
|
|
|
+ // verify at request level
|
|
|
|
+ Predicate<JSONObject> findReqPred =
|
|
|
|
+ (obj) -> obj.optString(FN_SCHEDULER_ACT_NAME).equals("request_-1_-1");
|
|
|
|
+ List<JSONObject> reqObj = ActivitiesTestUtils.findInAllocations(
|
|
|
|
+ getFirstSubNodeFromJson(schedulerActivitiesJson,
|
|
|
|
+ FN_SCHEDULER_ACT_ROOT, FN_ACT_ALLOCATIONS), findReqPred);
|
|
|
|
+ assertEquals(1, reqObj.size());
|
|
|
|
+ assertEquals(ActivityState.REJECTED.name(),
|
|
|
|
+ reqObj.get(0).optString(FN_ACT_ALLOCATION_STATE));
|
|
|
|
+ assertTrue(reqObj.get(0).optString(FN_ACT_DIAGNOSTIC).startsWith(
|
|
|
|
+ ActivityDiagnosticConstant.QUEUE_DO_NOT_HAVE_ENOUGH_HEADROOM));
|
|
|
|
+ } finally {
|
|
|
|
+ rm.stop();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|