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/NodesPage.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java index 09b1c0f7cde..687f1f23ebd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/NodesPage.java @@ -150,7 +150,7 @@ protected void render(Block html) { continue; } } - NodeInfo info = new NodeInfo(ni, sched); + NodeInfo info = new NodeInfo(ni, sched, false); int usedMemory = (int) info.getUsedMemory(); int availableMemory = (int) info.getAvailableMemory(); nodeTableData.append("[\"") 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/RMWSConsts.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWSConsts.java index a3fd2a95d23..700d0c9e0ef 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWSConsts.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWSConsts.java @@ -223,6 +223,7 @@ public static final String DESELECTS = "deSelects"; public static final String CONTAINERS = "containers"; public static final String QUEUE_ACL_TYPE = "queue-acl-type"; + public static final String INCLUDE_CONTAINERS = "include-containers"; private RMWSConsts() { // not called 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/RMWebServiceProtocol.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServiceProtocol.java index a310853dd37..5f118254240 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServiceProtocol.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServiceProtocol.java @@ -133,10 +133,12 @@ String dumpSchedulerLogs(String time, HttpServletRequest hsr) * * @see ApplicationClientProtocol#getClusterNodes * @param states the states we want to filter. It is a QueryParam. + * @param includeContainers true if the containers info should be + * in the result, false otherwise. It is a QueryParam. * @return all nodes in the cluster. If the states param is given, returns all * nodes that are in the comma-separated list of states */ - NodesInfo getNodes(String states); + NodesInfo getNodes(String states, boolean includeContainers); /** * This method retrieves a specific node information, and it is reachable by @@ -144,9 +146,11 @@ String dumpSchedulerLogs(String time, HttpServletRequest hsr) * * @param nodeId the node we want to retrieve the information. It is a * PathParam. + * @param includeContainers true if the containers info should be + * in the result, false otherwise. It is a QueryParam. * @return the information about the node in input */ - NodeInfo getNode(String nodeId); + NodeInfo getNode(String nodeId, boolean includeContainers); /** * This method retrieves all the app reports in the cluster, and it is 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 01173768c14..7501c29d989 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 @@ -227,6 +227,7 @@ public static final String DEFAULT_START_TIME = "0"; public static final String DEFAULT_END_TIME = "-1"; public static final String DEFAULT_INCLUDE_RESOURCE = "false"; + public static final String DEFAULT_INCLUDE_CONTAINERS = "false"; @VisibleForTesting boolean isCentralizedNodeLabelConfiguration = true; @@ -417,7 +418,9 @@ public String dumpSchedulerLogs(@FormParam(RMWSConsts.TIME) String time, @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 }) @Override - public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states) { + public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states, + @QueryParam(RMWSConsts.INCLUDE_CONTAINERS) + @DefaultValue(DEFAULT_INCLUDE_CONTAINERS) boolean includeContainers) { initForReadableEndpoints(); ResourceScheduler sched = this.rm.getResourceScheduler(); @@ -440,7 +443,7 @@ public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states) { RMServerUtils.queryRMNodes(this.rm.getRMContext(), acceptedStates); NodesInfo nodesInfo = new NodesInfo(); for (RMNode rmNode : rmNodes) { - NodeInfo nodeInfo = new NodeInfo(rmNode, sched); + NodeInfo nodeInfo = new NodeInfo(rmNode, sched, includeContainers); if (EnumSet .of(NodeState.LOST, NodeState.DECOMMISSIONED, NodeState.REBOOTED) .contains(rmNode.getState())) { @@ -457,7 +460,9 @@ public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states) { @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 }) @Override - public NodeInfo getNode(@PathParam(RMWSConsts.NODEID) String nodeId) { + public NodeInfo getNode(@PathParam(RMWSConsts.NODEID) String nodeId, + @QueryParam(RMWSConsts.INCLUDE_CONTAINERS) + @DefaultValue(DEFAULT_INCLUDE_CONTAINERS) boolean includeContainers) { initForReadableEndpoints(); if (nodeId == null || nodeId.isEmpty()) { @@ -477,7 +482,7 @@ public NodeInfo getNode(@PathParam(RMWSConsts.NODEID) String nodeId) { } isInactive = true; } - NodeInfo nodeInfo = new NodeInfo(ni, sched); + NodeInfo nodeInfo = new NodeInfo(ni, sched, includeContainers); if (isInactive) { nodeInfo.setNodeHTTPAddress(RMWSConsts.EMPTY); } 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/ContainerInfo.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/ContainerInfo.java new file mode 100644 index 00000000000..13a469a5579 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ContainerInfo.java @@ -0,0 +1,91 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.yarn.server.resourcemanager.webapp.dao; + +import org.apache.hadoop.yarn.api.records.Container; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Set; + +@XmlRootElement(name = "container") +@XmlAccessorType(XmlAccessType.FIELD) +public class ContainerInfo { + + private String containerId; + private String nodeId; + private String nodeHttpAddress; + private String resource; + private int priority; + private long allocationRequestId; + private String executionType; + private int version; + private Set allocationTags; + + public ContainerInfo() { + } // JAXB needs this + + public ContainerInfo(Container container) { + this.containerId = container.getId().toString(); + this.nodeId = container.getNodeId().toString(); + this.nodeHttpAddress = container.getNodeHttpAddress(); + this.resource = container.getResource().toString(); + this.priority = container.getPriority().getPriority(); + this.executionType = container.getExecutionType().name(); + this.allocationRequestId = container.getAllocationRequestId(); + this.version = container.getVersion(); + this.allocationTags = container.getAllocationTags(); + } + + public String getContainerId() { + return containerId; + } + + public String getNodeId() { + return nodeId; + } + + public String getNodeHttpAddress() { + return nodeHttpAddress; + } + + public String getResource() { + return resource; + } + + public int getPriority() { + return priority; + } + + public long getAllocationRequestId() { + return allocationRequestId; + } + + public String getExecutionType() { + return executionType; + } + + public int getVersion() { + return version; + } + + public Set getAllocationTags() { + return allocationTags; + } +} 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/NodeInfo.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/NodeInfo.java index 46a6e60ce3b..2a647c2a10c 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/NodeInfo.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/NodeInfo.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Set; @@ -30,8 +31,10 @@ import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.records.NodeState; import org.apache.hadoop.yarn.server.api.records.OpportunisticContainersStatus; +import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNode; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerNodeReport; import com.google.common.annotations.VisibleForTesting; @@ -62,11 +65,13 @@ protected ResourceUtilizationInfo resourceUtilization; protected ResourceInfo usedResource; protected ResourceInfo availableResource; + protected ArrayList containers; public NodeInfo() { } // JAXB needs this - public NodeInfo(RMNode ni, ResourceScheduler sched) { + public NodeInfo(RMNode ni, ResourceScheduler sched, + boolean includeContainers) { NodeId id = ni.getNodeID(); SchedulerNodeReport report = sched.getNodeReport(id); this.numContainers = 0; @@ -123,6 +128,20 @@ public NodeInfo(RMNode ni, ResourceScheduler sched) { // update node and containers resource utilization this.resourceUtilization = new ResourceUtilizationInfo(ni); + + if (includeContainers) { + containers = new ArrayList<>(); + SchedulerNode schedulerNode = sched.getSchedulerNode(ni.getNodeID()); + if (schedulerNode != null) { + List rmContainers = + schedulerNode.getCopiedListOfRunningContainers(); + rmContainers.stream().forEach(rmContainer -> { + if (rmContainer != null) { + containers.add(new ContainerInfo(rmContainer.getContainer())); + } + }); + } + } } public String getRack() { @@ -232,4 +251,7 @@ public void setLastHealthUpdate(long lastHealthUpdate) { this.lastHealthUpdate = lastHealthUpdate; } + public ArrayList getContainers() { + return containers; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodes.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodes.java index 7ea7e811f35..a5287e7c0dd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodes.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodes.java @@ -46,8 +46,10 @@ import org.apache.hadoop.yarn.server.api.records.NodeHealthStatus; import org.apache.hadoop.yarn.server.api.records.NodeStatus; import org.apache.hadoop.yarn.server.api.records.OpportunisticContainersStatus; +import org.apache.hadoop.yarn.server.resourcemanager.MockNM; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeEvent; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeEventType; @@ -912,4 +914,41 @@ private void verifyNodeAllocationTag(JSONObject json, } } + @Test + public void testSingleNodeWithContainers() throws Exception { + rm.start(); + String nodeId = "127.0.0.1:1234"; + MockNM nm = rm.registerNode(nodeId, 2048); + RMApp app = rm.submitApp(1024); + nm.nodeHeartbeat(true); + rm.sendAMLaunched(app.getCurrentAppAttempt().getAppAttemptId()); + + // test get node info without containers + WebResource r = resource(); + ClientResponse response = + r.path("ws").path("v1").path("cluster").path("nodes").path(nodeId) + .accept("application/json").get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, + response.getType().toString()); + JSONObject nodesInfoJson = response.getEntity(JSONObject.class); + assertEquals(21, nodesInfoJson.getJSONObject("node").length()); + + // test get node info with containers + r = resource(); + response = + r.path("ws").path("v1").path("cluster").path("nodes").path(nodeId) + .queryParam(RMWSConsts.INCLUDE_CONTAINERS, "true") + .accept("application/json").get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, + response.getType().toString()); + nodesInfoJson = response.getEntity(JSONObject.class); + assertEquals(22, nodesInfoJson.getJSONObject("node").length()); + JSONArray containersJson = + nodesInfoJson.getJSONObject("node").getJSONArray("containers"); + assertEquals(1, containersJson.length()); + JSONObject containerJson = containersJson.getJSONObject(0); + assertEquals(8, containerJson.length()); + + rm.stop(); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java index 4110c89cbea..97386c5bac5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/DefaultRequestInterceptorREST.java @@ -135,12 +135,14 @@ public String dumpSchedulerLogs(String time, HttpServletRequest hsr) } @Override - public NodesInfo getNodes(String states) { - // states will be part of additionalParam + public NodesInfo getNodes(String states, boolean includeContainers) { + // states and includeContainers will be part of additionalParam Map additionalParam = new HashMap(); if (states != null && !states.isEmpty()) { additionalParam.put(RMWSConsts.STATES, new String[] {states}); } + additionalParam.put(RMWSConsts.INCLUDE_CONTAINERS, + new String[] { String.valueOf(includeContainers) }); return RouterWebServiceUtil.genericForward(webAppAddress, null, NodesInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES, null, @@ -148,11 +150,14 @@ public NodesInfo getNodes(String states) { } @Override - public NodeInfo getNode(String nodeId) { + public NodeInfo getNode(String nodeId, boolean includeContainers) { + Map additionalParam = new HashMap(); + additionalParam.put(RMWSConsts.INCLUDE_CONTAINERS, + new String[] { String.valueOf(includeContainers) }); return RouterWebServiceUtil.genericForward(webAppAddress, null, NodeInfo.class, HTTPMethods.GET, RMWSConsts.RM_WEB_SERVICE_PATH + RMWSConsts.NODES + "/" + nodeId, null, - null); + additionalParam); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java index 40addc970cb..3feecbbbd62 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java @@ -795,7 +795,7 @@ public String getHeader(String value) { * operation. */ @Override - public NodeInfo getNode(String nodeId) { + public NodeInfo getNode(String nodeId, boolean includeContainers) { Map subClustersActive = null; try { subClustersActive = federationFacade.getSubClusters(true); @@ -820,7 +820,7 @@ public NodeInfo call() { getOrCreateInterceptorForSubCluster( info.getSubClusterId(), info.getRMWebServiceAddress()); try { - NodeInfo nodeInfo = interceptor.getNode(nodeId); + NodeInfo nodeInfo = interceptor.getNode(nodeId, includeContainers); return nodeInfo; } catch (Exception e) { LOG.error("Subcluster {} failed to return nodeInfo.", @@ -877,7 +877,7 @@ public NodeInfo call() { * operation. */ @Override - public NodesInfo getNodes(String states) { + public NodesInfo getNodes(String states, boolean includeContainers) { NodesInfo nodes = new NodesInfo(); @@ -901,7 +901,8 @@ public NodesInfo call() { getOrCreateInterceptorForSubCluster( info.getSubClusterId(), info.getRMWebServiceAddress()); try { - NodesInfo nodesInfo = interceptor.getNodes(states); + NodesInfo nodesInfo = + interceptor.getNodes(states, includeContainers); return nodesInfo; } catch (Exception e) { LOG.error("Subcluster {} failed to return nodesInfo.", diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServices.java index 28bf859f470..35f6851e614 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/RouterWebServices.java @@ -120,6 +120,7 @@ public static final String DEFAULT_START_TIME = "0"; public static final String DEFAULT_END_TIME = "-1"; public static final String DEFAULT_INCLUDE_RESOURCE = "false"; + public static final String DEFAULT_INCLUDE_CONTAINERS = "false"; @Inject public RouterWebServices(final Router router, Configuration conf) { @@ -377,10 +378,13 @@ public String dumpSchedulerLogs(@FormParam(RMWSConsts.TIME) String time, @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 }) @Override - public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states) { + public NodesInfo getNodes( + @QueryParam(RMWSConsts.STATES) String states, + @QueryParam(RMWSConsts.INCLUDE_CONTAINERS) + @DefaultValue(DEFAULT_INCLUDE_CONTAINERS) boolean includeContainers) { init(); RequestInterceptorChainWrapper pipeline = getInterceptorChain(null); - return pipeline.getRootInterceptor().getNodes(states); + return pipeline.getRootInterceptor().getNodes(states, includeContainers); } @GET @@ -388,10 +392,12 @@ public NodesInfo getNodes(@QueryParam(RMWSConsts.STATES) String states) { @Produces({ MediaType.APPLICATION_JSON + "; " + JettyUtils.UTF_8, MediaType.APPLICATION_XML + "; " + JettyUtils.UTF_8 }) @Override - public NodeInfo getNode(@PathParam(RMWSConsts.NODEID) String nodeId) { + public NodeInfo getNode(@PathParam(RMWSConsts.NODEID) String nodeId, + @QueryParam(RMWSConsts.INCLUDE_CONTAINERS) + @DefaultValue(DEFAULT_INCLUDE_CONTAINERS) boolean includeContainers) { init(); RequestInterceptorChainWrapper pipeline = getInterceptorChain(null); - return pipeline.getRootInterceptor().getNode(nodeId); + return pipeline.getRootInterceptor().getNode(nodeId, includeContainers); } @GET diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/BaseRouterWebServicesTest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/BaseRouterWebServicesTest.java index 9480850d328..cfa33d3dad3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/BaseRouterWebServicesTest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/BaseRouterWebServicesTest.java @@ -158,12 +158,12 @@ protected String dumpSchedulerLogs(String user) protected NodesInfo getNodes(String user) throws IOException, InterruptedException { - return routerWebService.getNodes(null); + return routerWebService.getNodes(null, false); } protected NodeInfo getNode(String user) throws IOException, InterruptedException { - return routerWebService.getNode(null); + return routerWebService.getNode(null, false); } protected AppsInfo getApps(String user) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java index 63de9ac18b1..0d46f227618 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java @@ -154,7 +154,7 @@ public Response updateAppState(AppState targetState, HttpServletRequest hsr, } @Override - public NodeInfo getNode(String nodeId) { + public NodeInfo getNode(String nodeId, boolean includeContainers) { if (!isRunning) { throw new RuntimeException("RM is stopped"); } @@ -165,7 +165,7 @@ public NodeInfo getNode(String nodeId) { } @Override - public NodesInfo getNodes(String states) { + public NodesInfo getNodes(String states, boolean includeContainers) { if (!isRunning) { throw new RuntimeException("RM is stopped"); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockRESTRequestInterceptor.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockRESTRequestInterceptor.java index f914d73f3dc..0c06740d5f6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockRESTRequestInterceptor.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockRESTRequestInterceptor.java @@ -105,12 +105,12 @@ public String dumpSchedulerLogs(String time, HttpServletRequest hsr) } @Override - public NodesInfo getNodes(String states) { + public NodesInfo getNodes(String states, boolean includeContainers) { return new NodesInfo(); } @Override - public NodeInfo getNode(String nodeId) { + public NodeInfo getNode(String nodeId, boolean includeContainers) { return new NodeInfo(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/PassThroughRESTRequestInterceptor.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/PassThroughRESTRequestInterceptor.java index 7d05a5a750b..19883c89607 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/PassThroughRESTRequestInterceptor.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/PassThroughRESTRequestInterceptor.java @@ -130,13 +130,13 @@ public String dumpSchedulerLogs(String time, HttpServletRequest hsr) } @Override - public NodesInfo getNodes(String states) { - return getNextInterceptor().getNodes(states); + public NodesInfo getNodes(String states, boolean includeContainers) { + return getNextInterceptor().getNodes(states, includeContainers); } @Override - public NodeInfo getNode(String nodeId) { - return getNextInterceptor().getNode(nodeId); + public NodeInfo getNode(String nodeId, boolean includeContainers) { + return getNextInterceptor().getNode(nodeId, includeContainers); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java index dc60043eedb..e7d97ed821e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorREST.java @@ -403,7 +403,7 @@ public void testGetApplicationsReport() @Test public void testGetNode() { - NodeInfo responseGet = interceptor.getNode("testGetNode"); + NodeInfo responseGet = interceptor.getNode("testGetNode", false); Assert.assertNotNull(responseGet); Assert.assertEquals(NUM_SUBCLUSTER - 1, responseGet.getLastHealthUpdate()); @@ -416,7 +416,7 @@ public void testGetNode() { @Test public void testGetNodes() { - NodesInfo responseGet = interceptor.getNodes(null); + NodesInfo responseGet = interceptor.getNodes(null, false); Assert.assertNotNull(responseGet); Assert.assertEquals(NUM_SUBCLUSTER, responseGet.getNodes().size()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorRESTRetry.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorRESTRetry.java index e7b28b2f416..60336277b95 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorRESTRetry.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/TestFederationInterceptorRESTRetry.java @@ -330,7 +330,7 @@ public void testGetNodeOneBadSC() setupCluster(Arrays.asList(bad2)); try { - interceptor.getNode("testGetNodeOneBadSC"); + interceptor.getNode("testGetNodeOneBadSC", false); Assert.fail(); } catch (NotFoundException e) { Assert.assertTrue( @@ -348,7 +348,7 @@ public void testGetNodeTwoBadSCs() setupCluster(Arrays.asList(bad1, bad2)); try { - interceptor.getNode("testGetNodeTwoBadSCs"); + interceptor.getNode("testGetNodeTwoBadSCs", false); Assert.fail(); } catch (NotFoundException e) { Assert.assertTrue(e.getMessage() @@ -365,7 +365,7 @@ public void testGetNodeOneBadOneGood() throws YarnException, IOException, InterruptedException { setupCluster(Arrays.asList(good, bad2)); - NodeInfo response = interceptor.getNode(null); + NodeInfo response = interceptor.getNode(null, false); Assert.assertNotNull(response); // Check if the only node came from Good SubCluster Assert.assertEquals(good.getId(), @@ -382,7 +382,7 @@ public void testGetNodesOneBadSC() setupCluster(Arrays.asList(bad2)); - NodesInfo response = interceptor.getNodes(null); + NodesInfo response = interceptor.getNodes(null, false); Assert.assertNotNull(response); Assert.assertEquals(0, response.getNodes().size()); // The remove duplicate operations is tested in TestRouterWebServiceUtil @@ -397,7 +397,7 @@ public void testGetNodesTwoBadSCs() throws YarnException, IOException, InterruptedException { setupCluster(Arrays.asList(bad1, bad2)); - NodesInfo response = interceptor.getNodes(null); + NodesInfo response = interceptor.getNodes(null, false); Assert.assertNotNull(response); Assert.assertEquals(0, response.getNodes().size()); // The remove duplicate operations is tested in TestRouterWebServiceUtil @@ -412,7 +412,7 @@ public void testGetNodesOneBadOneGood() throws YarnException, IOException, InterruptedException { setupCluster(Arrays.asList(good, bad2)); - NodesInfo response = interceptor.getNodes(null); + NodesInfo response = interceptor.getNodes(null, false); Assert.assertNotNull(response); Assert.assertEquals(1, response.getNodes().size()); // Check if the only node came from Good SubCluster