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