/// <exception cref="System.IO.IOException"/> private void InitializeNodeLabels() { RMContext rmContext = distShellTest.yarnCluster.GetResourceManager(0).GetRMContext (); // Setup node labels RMNodeLabelsManager labelsMgr = rmContext.GetNodeLabelManager(); ICollection <string> labels = new HashSet <string>(); labels.AddItem("x"); labelsMgr.AddToCluserNodeLabels(labels); // Setup queue access to node labels distShellTest.conf.Set("yarn.scheduler.capacity.root.accessible-node-labels", "x" ); distShellTest.conf.Set("yarn.scheduler.capacity.root.accessible-node-labels.x.capacity" , "100"); distShellTest.conf.Set("yarn.scheduler.capacity.root.default.accessible-node-labels" , "x"); distShellTest.conf.Set("yarn.scheduler.capacity.root.default.accessible-node-labels.x.capacity" , "100"); rmContext.GetScheduler().Reinitialize(distShellTest.conf, rmContext); // Fetch node-ids from yarn cluster NodeId[] nodeIds = new NodeId[NumNms]; for (int i = 0; i < NumNms; i++) { NodeManager mgr = distShellTest.yarnCluster.GetNodeManager(i); nodeIds[i] = mgr.GetNMContext().GetNodeId(); } // Set label x to NM[1] labelsMgr.AddLabelsToNode(ImmutableMap.Of(nodeIds[1], labels)); }
private static RMContext GetMockRMContext() { RMContext rmContext = Org.Mockito.Mockito.Mock <RMContext>(); RMNodeLabelsManager nlm = new NullRMNodeLabelsManager(); nlm.Init(new Configuration(false)); Org.Mockito.Mockito.When(rmContext.GetNodeLabelManager()).ThenReturn(nlm); return(rmContext); }
/// <exception cref="Org.Apache.Hadoop.Yarn.Exceptions.YarnException"/> /// <exception cref="System.IO.IOException"/> public virtual AddToClusterNodeLabelsResponse AddToClusterNodeLabels(AddToClusterNodeLabelsRequest request) { string argName = "addToClusterNodeLabels"; string msg = "add labels."; UserGroupInformation user = CheckAcls(argName); CheckRMStatus(user.GetShortUserName(), argName, msg); AddToClusterNodeLabelsResponse response = recordFactory.NewRecordInstance <AddToClusterNodeLabelsResponse >(); try { rmContext.GetNodeLabelManager().AddToCluserNodeLabels(request.GetNodeLabels()); RMAuditLogger.LogSuccess(user.GetShortUserName(), argName, "AdminService"); return(response); } catch (IOException ioe) { throw LogAndWrapException(ioe, user.GetShortUserName(), argName, msg); } }
/// <summary> /// Check queue label expression, check if node label in queue's /// node-label-expression existed in clusterNodeLabels if rmContext != null /// </summary> public static bool CheckQueueLabelExpression(ICollection <string> queueLabels, string labelExpression, RMContext rmContext) { // if label expression is empty, we can allocate container on any node if (labelExpression == null) { return(true); } foreach (string str in labelExpression.Split("&&")) { str = str.Trim(); if (!str.Trim().IsEmpty()) { // check queue label if (queueLabels == null) { return(false); } else { if (!queueLabels.Contains(str) && !queueLabels.Contains(RMNodeLabelsManager.Any)) { return(false); } } // check node label manager contains this label if (null != rmContext) { RMNodeLabelsManager nlm = rmContext.GetNodeLabelManager(); if (nlm != null && !nlm.ContainsNodeLabel(str)) { return(false); } } } } return(true); }
/// <exception cref="System.IO.IOException"/> public virtual void TestValidateResourceRequestWithErrorLabelsPermission() { // mock queue and scheduler YarnScheduler scheduler = Org.Mockito.Mockito.Mock <YarnScheduler>(); ICollection <string> queueAccessibleNodeLabels = Sets.NewHashSet(); QueueInfo queueInfo = Org.Mockito.Mockito.Mock <QueueInfo>(); Org.Mockito.Mockito.When(queueInfo.GetQueueName()).ThenReturn("queue"); Org.Mockito.Mockito.When(queueInfo.GetAccessibleNodeLabels()).ThenReturn(queueAccessibleNodeLabels ); Org.Mockito.Mockito.When(scheduler.GetQueueInfo(Matchers.Any <string>(), Matchers.AnyBoolean (), Matchers.AnyBoolean())).ThenReturn(queueInfo); Org.Apache.Hadoop.Yarn.Api.Records.Resource maxResource = Resources.CreateResource (YarnConfiguration.DefaultRmSchedulerMaximumAllocationMb, YarnConfiguration.DefaultRmSchedulerMaximumAllocationVcores ); // queue has labels, success cases try { // set queue accessible node labesl to [x, y] queueAccessibleNodeLabels.Clear(); Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y")); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression("y"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression(string.Empty); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression(" "); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); } catch (InvalidResourceRequestException e) { Sharpen.Runtime.PrintStackTrace(e); NUnit.Framework.Assert.Fail("Should be valid when request labels is a subset of queue labels" ); } finally { rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y" )); } // same as above, but cluster node labels don't contains label being // requested. should fail try { // set queue accessible node labesl to [x, y] queueAccessibleNodeLabels.Clear(); Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } // queue has labels, failed cases (when ask a label not included by queue) try { // set queue accessible node labesl to [x, y] queueAccessibleNodeLabels.Clear(); Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y")); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("z"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } finally { rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x", "y" )); } // we don't allow specify more than two node labels in a single expression // now try { // set queue accessible node labesl to [x, y] queueAccessibleNodeLabels.Clear(); Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y")); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("x && y"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } 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(); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression(string.Empty); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression(" "); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); } catch (InvalidResourceRequestException e) { Sharpen.Runtime.PrintStackTrace(e); NUnit.Framework.Assert.Fail("Should be valid when request labels is empty"); } // queue doesn't have label, failed (when request any label) try { // set queue accessible node labels to empty queueAccessibleNodeLabels.Clear(); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } finally { rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x")); } // queue is "*", always succeeded try { // set queue accessible node labels to empty queueAccessibleNodeLabels.Clear(); queueAccessibleNodeLabels.AddItem(RMNodeLabelsManager.Any); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y", "z" )); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression("y"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); resReq.SetNodeLabelExpression("z"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); } catch (InvalidResourceRequestException e) { Sharpen.Runtime.PrintStackTrace(e); NUnit.Framework.Assert.Fail("Should be valid when queue can access any labels"); } finally { 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.AddItem(RMNodeLabelsManager.Any); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), ResourceRequest.Any, resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } // we don't allow resource name other than ANY and specify label try { // set queue accessible node labesl to [x, y] queueAccessibleNodeLabels.Clear(); Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList("x", "y")); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x", "y")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), "rack", resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } 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 { // set queue accessible node labesl to * queueAccessibleNodeLabels.Clear(); Sharpen.Collections.AddAll(queueAccessibleNodeLabels, Arrays.AsList(CommonNodeLabelsManager .Any)); rmContext.GetNodeLabelManager().AddToCluserNodeLabels(ImmutableSet.Of("x")); Org.Apache.Hadoop.Yarn.Api.Records.Resource resource = Resources.CreateResource(0 , YarnConfiguration.DefaultRmSchedulerMinimumAllocationVcores); ResourceRequest resReq = BuilderUtils.NewResourceRequest(Org.Mockito.Mockito.Mock <Priority>(), "rack", resource, 1); resReq.SetNodeLabelExpression("x"); SchedulerUtils.NormalizeAndvalidateRequest(resReq, maxResource, "queue", scheduler , rmContext); NUnit.Framework.Assert.Fail("Should fail"); } catch (InvalidResourceRequestException) { } finally { rmContext.GetNodeLabelManager().RemoveFromClusterNodeLabels(Arrays.AsList("x")); } }