|
@@ -106,6 +106,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 {
|
|
|
|
|
@@ -271,7 +272,7 @@ public class TestSchedulerUtils {
|
|
|
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");
|
|
@@ -280,6 +281,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);
|
|
@@ -298,20 +301,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");
|
|
@@ -332,8 +335,8 @@ 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) {
|
|
@@ -354,8 +357,8 @@ public class TestSchedulerUtils {
|
|
|
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 {
|
|
@@ -379,8 +382,8 @@ public class TestSchedulerUtils {
|
|
|
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 {
|
|
@@ -399,16 +402,16 @@ 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);
|
|
|
|
|
|
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");
|
|
@@ -428,8 +431,8 @@ 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 (InvalidLabelResourceRequestException e) {
|
|
|
invalidlabelexception = true;
|
|
@@ -456,16 +459,16 @@ 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("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");
|
|
@@ -486,8 +489,8 @@ 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) {
|
|
|
}
|
|
@@ -507,8 +510,8 @@ public class TestSchedulerUtils {
|
|
|
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 {
|
|
@@ -532,8 +535,8 @@ public class TestSchedulerUtils {
|
|
|
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 {
|
|
@@ -545,8 +548,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 , "
|
|
@@ -560,8 +563,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) {
|
|
@@ -571,14 +574,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 =
|
|
@@ -587,8 +597,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");
|
|
|
}
|
|
@@ -601,8 +611,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");
|
|
|
}
|
|
@@ -616,8 +626,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");
|
|
|
}
|
|
@@ -631,8 +641,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");
|
|
|
}
|
|
@@ -645,8 +655,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) {
|
|
|
assertEquals(LESS_THAN_ZERO, e.getInvalidResourceType());
|
|
@@ -660,8 +670,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) {
|
|
|
assertEquals(LESS_THAN_ZERO, e.getInvalidResourceType());
|
|
@@ -676,8 +686,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) {
|
|
|
assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType());
|
|
@@ -691,8 +701,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 vcores should not be accepted");
|
|
|
} catch (InvalidResourceRequestException e) {
|
|
|
assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType());
|
|
@@ -805,7 +815,7 @@ public class TestSchedulerUtils {
|
|
|
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");
|
|
@@ -818,6 +828,8 @@ public class TestSchedulerUtils {
|
|
|
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]
|
|
@@ -831,13 +843,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();
|
|
@@ -1033,6 +1045,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;
|