Repository: hadoop
Updated Branches:
  refs/heads/branch-2.7 7ded648ae -> 8f1739502


YARN-3362. Add node label usage in RM CapacityScheduler web UI. Contributed by 
Eric Payne.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/8f173950
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/8f173950
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/8f173950

Branch: refs/heads/branch-2.7
Commit: 8f173950299ac3ff31ffa60ce96cdea23d0bc9e2
Parents: 7ded648
Author: Naganarasimha <naganarasimha...@apache.org>
Authored: Tue May 17 02:39:50 2016 +0800
Committer: Naganarasimha <naganarasimha...@apache.org>
Committed: Tue May 17 02:39:50 2016 +0800

----------------------------------------------------------------------
 .../scheduler/capacity/AbstractCSQueue.java     |  23 +++
 .../webapp/CapacitySchedulerPage.java           | 170 +++++++++++++++----
 .../resourcemanager/webapp/RMWebServices.java   |   6 +-
 .../webapp/dao/CapacitySchedulerInfo.java       |  40 ++++-
 .../dao/CapacitySchedulerLeafQueueInfo.java     |   8 +-
 .../webapp/dao/CapacitySchedulerQueueInfo.java  |  33 ++--
 .../capacity/TestCapacityScheduler.java         |   9 +-
 7 files changed, 233 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java
index 3679de6..fcf6c85 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java
@@ -504,4 +504,27 @@ public abstract class AbstractCSQueue implements CSQueue {
     // non-empty
     return false;
   }
+
+  /**
+   * @param nodePartition node label to check for accessibility
+   * @return true if queue can access nodes with specified label, false if not.
+   */
+  public final boolean accessibleToPartition(final String nodePartition) {
+    // if queue's label is *, it can access any node
+    if (accessibleLabels != null
+        && accessibleLabels.contains(RMNodeLabelsManager.ANY)) {
+      return true;
+    }
+    // any queue can access to a node without label
+    if (nodePartition == null
+        || nodePartition.equals(RMNodeLabelsManager.NO_LABEL)) {
+      return true;
+    }
+    // a queue can access to a node only if it contains any label of the node
+    if (accessibleLabels != null && accessibleLabels.contains(nodePartition)) {
+      return true;
+    }
+    // sorry, you cannot access
+    return false;
+  }
 }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java
index 2fcc12a..1f33ab6 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/CapacitySchedulerPage.java
@@ -21,11 +21,15 @@ package 
org.apache.hadoop.yarn.server.resourcemanager.webapp;
 import static org.apache.hadoop.yarn.util.StringHelper.join;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.hadoop.util.StringUtils;
+import org.apache.hadoop.yarn.nodelabels.NodeLabel;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import 
org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.QueueCapacities;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.UserInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.CapacitySchedulerInfo;
 import 
org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.CapacitySchedulerLeafQueueInfo;
@@ -59,46 +63,103 @@ class CapacitySchedulerPage extends RmView {
   static class CSQInfo {
     CapacitySchedulerInfo csinfo;
     CapacitySchedulerQueueInfo qinfo;
+    String label;
   }
 
   static class LeafQueueInfoBlock extends HtmlBlock {
     final CapacitySchedulerLeafQueueInfo lqinfo;
+    private String nodeLabel;
 
     @Inject LeafQueueInfoBlock(ViewContext ctx, CSQInfo info) {
       super(ctx);
       lqinfo = (CapacitySchedulerLeafQueueInfo) info.qinfo;
+      nodeLabel = info.label;
     }
 
     @Override
     protected void render(Block html) {
+      if (nodeLabel == null) {
+        renderLeafQueueInfoWithoutParition(html);
+      } else {
+        renderLeafQueueInfoWithPartition(html);
+      }
+    }
 
-      ResponseInfo ri = info("\'" + lqinfo.getQueuePath().substring(5) + "\' 
Queue Status").
-          _("Queue State:", lqinfo.getQueueState()).
-          _("Used Capacity:", percent(lqinfo.getUsedCapacity() / 100)).
-          _("Absolute Used Capacity:", 
percent(lqinfo.getAbsoluteUsedCapacity() / 100)).
-          _("Absolute Capacity:", percent(lqinfo.getAbsoluteCapacity() / 100)).
-          _("Absolute Max Capacity:", percent(lqinfo.getAbsoluteMaxCapacity() 
/ 100)).
-          _("Used Resources:", lqinfo.getResourcesUsed().toString()).
-          _("Num Schedulable Applications:", 
Integer.toString(lqinfo.getNumActiveApplications())).
-          _("Num Non-Schedulable Applications:", 
Integer.toString(lqinfo.getNumPendingApplications())).
-          _("Num Containers:", Integer.toString(lqinfo.getNumContainers())).
-          _("Max Applications:", 
Integer.toString(lqinfo.getMaxApplications())).
-          _("Max Applications Per User:", 
Integer.toString(lqinfo.getMaxApplicationsPerUser())).
-          _("Max Application Master Resources:", 
lqinfo.getAMResourceLimit().toString()).
-          _("Used Application Master Resources:", 
lqinfo.getUsedAMResource().toString()).
-          _("Max Application Master Resources Per User:", 
lqinfo.getUserAMResourceLimit().toString()).
-          _("Configured Capacity:", percent(lqinfo.getCapacity() / 100)).
-          _("Configured Max Capacity:", percent(lqinfo.getMaxCapacity() / 
100)).
-          _("Configured Minimum User Limit Percent:", 
Integer.toString(lqinfo.getUserLimit()) + "%").
-          _("Configured User Limit Factor:", lqinfo.getUserLimitFactor()).
-          _("Accessible Node Labels:", StringUtils.join(",", 
lqinfo.getNodeLabels())).
-          _("Preemption:", lqinfo.getPreemptionDisabled() ? "disabled" : 
"enabled");
+    /*
+     * @param html block to be rendered
+     */
+    private void renderLeafQueueInfoWithPartition(final Block html) {
+      nodeLabel = nodeLabel.length() == 0 ? "<DEFAULT_PARTITION>" : nodeLabel;
+      // first display the queue's label specific details :
+      ResponseInfo ri =
+          info("\'" + lqinfo.getQueuePath().substring(5)
+              + "\' Queue Status for Partition \'" + nodeLabel + "\'");
+      renderQueueCapacityInfo(ri);
+      html._(InfoBlock.class);
+      // clear the info contents so this queue's info doesn't accumulate into
+      // another queue's info
+      ri.clear();
+
+      // second display the queue specific details :
+      ri =
+          info("\'" + lqinfo.getQueuePath().substring(5) + "\' Queue Status")
+              ._("Queue State:", lqinfo.getQueueState());
+      renderCommonLeafQueueInfo(ri);
 
       html._(InfoBlock.class);
+      // clear the info contents so this queue's info doesn't accumulate into
+      // another queue's info
+      ri.clear();
+    }
 
-      // clear the info contents so this queue's info doesn't accumulate into 
another queue's info
+    /**
+     * @param html block to be rendered
+     */
+    private void renderLeafQueueInfoWithoutParition(final Block html) {
+      ResponseInfo ri =
+          info("\'" + lqinfo.getQueuePath().substring(5) + "\' Queue Status")
+              ._("Queue State:", lqinfo.getQueueState());
+      renderQueueCapacityInfo(ri);
+      renderCommonLeafQueueInfo(ri);
+      html._(InfoBlock.class);
+      // clear the info contents so this queue's info doesn't accumulate into
+      // another queue's info
       ri.clear();
     }
+
+    /**
+     * @param ri response info to be rendered
+     */
+    private void renderQueueCapacityInfo(final ResponseInfo ri) {
+      ri.
+      _("Used Capacity:", percent(lqinfo.getUsedCapacity() / 100)).
+      _("Configured Capacity:", percent(lqinfo.getCapacity() / 100)).
+      _("Configured Max Capacity:", percent(lqinfo.getMaxCapacity() / 100)).
+      _("Absolute Used Capacity:", percent(lqinfo.getAbsoluteUsedCapacity() / 
100)).
+      _("Absolute Configured Capacity:", percent(lqinfo.getAbsoluteCapacity() 
/ 100)).
+      _("Absolute Configured Max Capacity:", 
percent(lqinfo.getAbsoluteMaxCapacity() / 100)).
+      _("Used Resources:", lqinfo.getResourcesUsed().toString());
+    }
+
+    /**
+     * @param ri response info to be rendered
+     */
+    private void renderCommonLeafQueueInfo(final ResponseInfo ri) {
+      ri.
+      _("Num Schedulable Applications:", 
Integer.toString(lqinfo.getNumActiveApplications())).
+      _("Num Non-Schedulable Applications:", 
Integer.toString(lqinfo.getNumPendingApplications())).
+      _("Num Containers:", Integer.toString(lqinfo.getNumContainers())).
+      _("Max Applications:", Integer.toString(lqinfo.getMaxApplications())).
+      _("Max Applications Per User:", 
Integer.toString(lqinfo.getMaxApplicationsPerUser())).
+      _("Max Application Master Resources:", 
lqinfo.getAMResourceLimit().toString()).
+      _("Used Application Master Resources:", 
lqinfo.getUsedAMResource().toString()).
+      _("Max Application Master Resources Per User:", 
lqinfo.getUserAMResourceLimit().toString()).
+      _("Configured Minimum User Limit Percent:", 
Integer.toString(lqinfo.getUserLimit()) + "%").
+      _("Configured User Limit Factor:", StringUtils.format(
+          "%.1f", lqinfo.getUserLimitFactor())).
+      _("Accessible Node Labels:", StringUtils.join(",", 
lqinfo.getNodeLabels())).
+      _("Preemption:", lqinfo.getPreemptionDisabled() ? "disabled" : 
"enabled");
+    }
   }
 
   static class QueueUsersInfoBlock extends HtmlBlock {
@@ -166,7 +227,7 @@ class CapacitySchedulerPage extends RmView {
               span().$style(join(width(absUsedCap/absMaxCap),
                 ";font-size:1px;left:0%;", absUsedCap > absCap ? Q_OVER : 
Q_UNDER)).
                 _('.')._().
-              span(".q", info.getQueuePath().substring(5))._().
+              span(".q", "Queue: " + info.getQueuePath().substring(5))._().
             span().$class("qstats").$style(left(Q_STATS_POS)).
               _(join(percent(used), " used"))._();
 
@@ -187,10 +248,14 @@ class CapacitySchedulerPage extends RmView {
   static class QueuesBlock extends HtmlBlock {
     final CapacityScheduler cs;
     final CSQInfo csqinfo;
+    private List<NodeLabel> nodeLabelsInfo;
 
     @Inject QueuesBlock(ResourceManager rm, CSQInfo info) {
       cs = (CapacityScheduler) rm.getResourceScheduler();
       csqinfo = info;
+      RMNodeLabelsManager nodeLabelManager =
+          rm.getRMContext().getNodeLabelManager();
+      nodeLabelsInfo = nodeLabelManager.pullRMNodeLabelsInfo();
     }
 
     @Override
@@ -209,12 +274,6 @@ class CapacitySchedulerPage extends RmView {
               span().$style(Q_END)._("100% ")._().
               span(".q", "default")._()._();
       } else {
-        CSQueue root = cs.getRootQueue();
-        CapacitySchedulerInfo sinfo = new CapacitySchedulerInfo(root);
-        csqinfo.csinfo = sinfo;
-        csqinfo.qinfo = null;
-
-        float used = sinfo.getUsedCapacity() / 100;
         ul.
           li().$style("margin-bottom: 1em").
             span().$style("font-weight: bold")._("Legend:")._().
@@ -226,8 +285,22 @@ class CapacitySchedulerPage extends RmView {
               _("Used (over capacity)")._().
             span().$class("qlegend ui-corner-all ui-state-default").
               _("Max Capacity")._().
-          _().
-          li().
+          _();
+
+        float used = 0;
+        if (null == nodeLabelsInfo
+            || (nodeLabelsInfo.size() == 1 && nodeLabelsInfo.get(0)
+                .getLabelName().isEmpty())) {
+          CSQueue root = cs.getRootQueue();
+          CapacitySchedulerInfo sinfo =
+              new CapacitySchedulerInfo(root, new NodeLabel(
+                  RMNodeLabelsManager.NO_LABEL));
+          csqinfo.csinfo = sinfo;
+          csqinfo.qinfo = null;
+
+          used = sinfo.getUsedCapacity() / 100;
+          //label is not enabled in the cluster or there's only "default" 
label,
+          ul.li().
             a(_Q).$style(width(Q_MAX_WIDTH)).
               span().$style(join(width(used), ";left:0%;",
                   used > 1 ? Q_OVER : Q_UNDER))._(".")._().
@@ -235,6 +308,41 @@ class CapacitySchedulerPage extends RmView {
             span().$class("qstats").$style(left(Q_STATS_POS)).
               _(join(percent(used), " used"))._().
             _(QueueBlock.class)._();
+        } else {
+          for (NodeLabel label : nodeLabelsInfo) {
+            CSQueue root = cs.getRootQueue();
+            CapacitySchedulerInfo sinfo =
+                new CapacitySchedulerInfo(root, label);
+            csqinfo.csinfo = sinfo;
+            csqinfo.qinfo = null;
+            csqinfo.label = label.getLabelName();
+            String nodeLabel =
+                csqinfo.label.length() == 0 ? "<DEFAULT_PARTITION>"
+                    : csqinfo.label;
+            QueueCapacities queueCapacities = root.getQueueCapacities();
+            used = queueCapacities.getUsedCapacity(label.getLabelName());
+            String partitionUiTag =
+                "Partition: " + nodeLabel + " " + label.getResource();
+            ul.li().
+            a(_Q).$style(width(Q_MAX_WIDTH)).
+              span().$style(join(width(used), ";left:0%;",
+                  used > 1 ? Q_OVER : Q_UNDER))._(".")._().
+              span(".q", partitionUiTag)._().
+            span().$class("qstats").$style(left(Q_STATS_POS)).
+              _(join(percent(used), " used"))._();
+
+            //for the queue hierarchy under label
+            UL<Hamlet> underLabel = html.ul("#pq");
+            underLabel.li().
+            a(_Q).$style(width(Q_MAX_WIDTH)).
+              span().$style(join(width(used), ";left:0%;",
+                  used > 1 ? Q_OVER : Q_UNDER))._(".")._().
+              span(".q", "Queue: root")._().
+            span().$class("qstats").$style(left(Q_STATS_POS)).
+              _(join(percent(used), " used"))._().
+            _(QueueBlock.class)._()._();
+          }
+        }
       }
       ul._()._().
       script().$type("text/javascript").

http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
index 474630a..53ef988 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java
@@ -100,11 +100,13 @@ import org.apache.hadoop.yarn.exceptions.YarnException;
 import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
+import org.apache.hadoop.yarn.nodelabels.NodeLabel;
 import org.apache.hadoop.yarn.security.client.RMDelegationTokenIdentifier;
 import org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger;
 import 
org.apache.hadoop.yarn.server.resourcemanager.RMAuditLogger.AuditConstants;
 import org.apache.hadoop.yarn.server.resourcemanager.RMServerUtils;
 import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
+import 
org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
 import 
org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
 import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
@@ -226,7 +228,9 @@ public class RMWebServices {
     if (rs instanceof CapacityScheduler) {
       CapacityScheduler cs = (CapacityScheduler) rs;
       CSQueue root = cs.getRootQueue();
-      sinfo = new CapacitySchedulerInfo(root);
+      sinfo =
+          new CapacitySchedulerInfo(root, new NodeLabel(
+              RMNodeLabelsManager.NO_LABEL));
     } else if (rs instanceof FairScheduler) {
       FairScheduler fs = (FairScheduler) rs;
       sinfo = new FairSchedulerInfo(fs);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
index 8580f05..7982ec3 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerInfo.java
@@ -24,8 +24,11 @@ import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.hadoop.yarn.nodelabels.NodeLabel;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.AbstractCSQueue;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.QueueCapacities;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -47,16 +50,22 @@ public class CapacitySchedulerInfo extends SchedulerInfo {
   public CapacitySchedulerInfo() {
   } // JAXB needs this
 
-  public CapacitySchedulerInfo(CSQueue parent) {
+  /*
+   * @param parent parent queue
+   * @param nodeLabel node partition
+   */
+  public CapacitySchedulerInfo(final CSQueue parent, final NodeLabel 
nodeLabel) {
+    String label = nodeLabel.getLabelName();
+    QueueCapacities parentQueueCapacities = parent.getQueueCapacities();
     this.queueName = parent.getQueueName();
-    this.usedCapacity = parent.getUsedCapacity() * 100;
-    this.capacity = parent.getCapacity() * 100;
-    float max = parent.getMaximumCapacity();
+    this.usedCapacity = parentQueueCapacities.getUsedCapacity(label) * 100;
+    this.capacity = parentQueueCapacities.getCapacity(label) * 100;
+    float max = parentQueueCapacities.getMaximumCapacity(label);
     if (max < EPSILON || max > 1f)
       max = 1f;
     this.maxCapacity = max * 100;
 
-    queues = getQueues(parent);
+    queues = getQueues(parent, nodeLabel);
   }
 
   public float getCapacity() {
@@ -79,7 +88,12 @@ public class CapacitySchedulerInfo extends SchedulerInfo {
     return this.queues;
   }
 
-  protected CapacitySchedulerQueueInfoList getQueues(CSQueue parent) {
+  /*
+   * @param parent parent queue
+   * @param nodeLabel node partition
+   */
+  protected final CapacitySchedulerQueueInfoList getQueues(final CSQueue 
parent,
+      final NodeLabel nodeLabel) {
     CapacitySchedulerQueueInfoList queuesInfo =
         new CapacitySchedulerQueueInfoList();
 
@@ -91,6 +105,12 @@ public class CapacitySchedulerInfo extends SchedulerInfo {
     List<CSQueue> childLeafQueues = new ArrayList<>();
     List<CSQueue> childNonLeafQueues = new ArrayList<>();
     for (CSQueue queue : parent.getChildQueues()) {
+      if (!((AbstractCSQueue) queue).accessibleToPartition(nodeLabel
+              .getLabelName())) {
+        // Skip displaying the hierarchy for the queues for which the exclusive
+        // labels are not accessible
+        continue;
+      }
       if (queue instanceof LeafQueue) {
         childLeafQueues.add(queue);
       } else {
@@ -103,10 +123,12 @@ public class CapacitySchedulerInfo extends SchedulerInfo {
     for (CSQueue queue : childQueues) {
       CapacitySchedulerQueueInfo info;
       if (queue instanceof LeafQueue) {
-        info = new CapacitySchedulerLeafQueueInfo((LeafQueue) queue);
+        info =
+            new CapacitySchedulerLeafQueueInfo((LeafQueue) queue,
+                nodeLabel.getLabelName());
       } else {
-        info = new CapacitySchedulerQueueInfo(queue);
-        info.queues = getQueues(queue);
+        info = new CapacitySchedulerQueueInfo(queue, nodeLabel.getLabelName());
+        info.queues = getQueues(queue, nodeLabel);
       }
       queuesInfo.addToQueueInfoList(info);
     }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java
index 5258b3d..08552ab 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerLeafQueueInfo.java
@@ -43,8 +43,12 @@ public class CapacitySchedulerLeafQueueInfo extends 
CapacitySchedulerQueueInfo {
   CapacitySchedulerLeafQueueInfo() {
   };
 
-  CapacitySchedulerLeafQueueInfo(LeafQueue q) {
-    super(q);
+  /*
+   * @param q leaf queue
+   * @param nodeLabel node partition
+   */
+  CapacitySchedulerLeafQueueInfo(final LeafQueue q, final String nodeLabel) {
+    super(q, nodeLabel);
     numActiveApplications = q.getNumActiveApplications();
     numPendingApplications = q.getNumPendingApplications();
     numContainers = q.getNumContainers();

http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
index 40dddea..d83a240 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/CapacitySchedulerQueueInfo.java
@@ -28,8 +28,10 @@ import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.hadoop.yarn.api.records.QueueState;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceUsage;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
 import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.PlanQueue;
+import 
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.QueueCapacities;
 
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -59,28 +61,37 @@ public class CapacitySchedulerQueueInfo {
   CapacitySchedulerQueueInfo() {
   };
 
-  CapacitySchedulerQueueInfo(CSQueue q) {
+  /*
+   * @param q capacity scheduler queue
+   * @param nodeLabel node partition
+   */
+  CapacitySchedulerQueueInfo(final CSQueue q, final String nodeLabel) {
+    QueueCapacities qCapacities = q.getQueueCapacities();
+    ResourceUsage queueResourceUsage = q.getQueueResourceUsage();
+
     queuePath = q.getQueuePath();
-    capacity = q.getCapacity() * 100;
-    usedCapacity = q.getUsedCapacity() * 100;
+    capacity = qCapacities.getCapacity(nodeLabel) * 100;
+    usedCapacity = qCapacities.getUsedCapacity(nodeLabel) * 100;
 
-    maxCapacity = q.getMaximumCapacity();
+    maxCapacity = qCapacities.getMaximumCapacity(nodeLabel);
     if (maxCapacity < EPSILON || maxCapacity > 1f)
       maxCapacity = 1f;
     maxCapacity *= 100;
 
-    absoluteCapacity = cap(q.getAbsoluteCapacity(), 0f, 1f) * 100;
-    absoluteMaxCapacity = cap(q.getAbsoluteMaximumCapacity(), 0f, 1f) * 100;
-    absoluteUsedCapacity = cap(q.getAbsoluteUsedCapacity(), 0f, 1f) * 100;
+    absoluteCapacity =
+        cap(qCapacities.getAbsoluteCapacity(nodeLabel), 0f, 1f) * 100;
+    absoluteMaxCapacity =
+        cap(qCapacities.getAbsoluteMaximumCapacity(nodeLabel), 0f, 1f) * 100;
+    absoluteUsedCapacity =
+        cap(qCapacities.getAbsoluteUsedCapacity(nodeLabel), 0f, 1f) * 100;
     numApplications = q.getNumApplications();
     queueName = q.getQueueName();
     state = q.getState();
-    resourcesUsed = new ResourceInfo(q.getUsedResources());
-    if(q instanceof PlanQueue &&
-       !((PlanQueue)q).showReservationsAsQueues()) {
+    resourcesUsed = new ResourceInfo(queueResourceUsage.getUsed(nodeLabel));
+    if (q instanceof PlanQueue && !((PlanQueue) q).showReservationsAsQueues()) 
{
       hideReservationQueues = true;
     }
-    
+
     // add labels
     Set<String> labelSet = q.getAccessibleNodeLabels();
     if (labelSet != null) {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/8f173950/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
----------------------------------------------------------------------
diff --git 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
index 85a2a7b..e4920e8 100644
--- 
a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
+++ 
b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java
@@ -75,6 +75,7 @@ import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 import org.apache.hadoop.yarn.factories.RecordFactory;
 import org.apache.hadoop.yarn.factory.providers.RecordFactoryProvider;
 import org.apache.hadoop.yarn.ipc.YarnRPC;
+import org.apache.hadoop.yarn.nodelabels.NodeLabel;
 import 
org.apache.hadoop.yarn.server.api.protocolrecords.UpdateNodeResourceRequest;
 import org.apache.hadoop.yarn.server.resourcemanager.AdminService;
 import org.apache.hadoop.yarn.server.resourcemanager.Application;
@@ -1675,7 +1676,9 @@ public class TestCapacityScheduler {
     CapacityScheduler cs =
         (CapacityScheduler) resourceManager.getResourceScheduler();
     CSQueue origRootQ = cs.getRootQueue();
-    CapacitySchedulerInfo oldInfo = new CapacitySchedulerInfo(origRootQ);
+    CapacitySchedulerInfo oldInfo =
+        new CapacitySchedulerInfo(origRootQ, new NodeLabel(
+            RMNodeLabelsManager.NO_LABEL));
     int origNumAppsA = getNumAppsInQueue("a", origRootQ.getChildQueues());
     int origNumAppsRoot = origRootQ.getNumApplications();
 
@@ -1684,7 +1687,9 @@ public class TestCapacityScheduler {
     CSQueue newRootQ = cs.getRootQueue();
     int newNumAppsA = getNumAppsInQueue("a", newRootQ.getChildQueues());
     int newNumAppsRoot = newRootQ.getNumApplications();
-    CapacitySchedulerInfo newInfo = new CapacitySchedulerInfo(newRootQ);
+    CapacitySchedulerInfo newInfo =
+        new CapacitySchedulerInfo(newRootQ, new NodeLabel(
+            RMNodeLabelsManager.NO_LABEL));
     CapacitySchedulerLeafQueueInfo origOldA1 =
         (CapacitySchedulerLeafQueueInfo) getQueueInfo("a1", 
oldInfo.getQueues());
     CapacitySchedulerLeafQueueInfo origNewA1 =


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to