[
https://issues.apache.org/jira/browse/YARN-11222?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17690083#comment-17690083
]
ASF GitHub Bot commented on YARN-11222:
---------------------------------------
goiri commented on code in PR #5328:
URL: https://github.com/apache/hadoop/pull/5328#discussion_r1109192158
##########
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java:
##########
@@ -1580,16 +1582,115 @@ public NodeLabelsInfo
getClusterNodeLabels(HttpServletRequest hsr)
throw new RuntimeException("getClusterNodeLabels Failed.");
}
+ /**
+ * This method adds specific node labels for specific nodes, and it is
+ * reachable by using {@link RMWSConsts#ADD_NODE_LABELS}.
+ *
+ * @see ResourceManagerAdministrationProtocol#addToClusterNodeLabels
+ * @param newNodeLabels the node labels to add. It is a content param.
+ * @param hsr the servlet request
+ * @return Response containing the status code
+ * @throws Exception in case of bad request
+ */
@Override
public Response addToClusterNodeLabels(NodeLabelsInfo newNodeLabels,
HttpServletRequest hsr) throws Exception {
- throw new NotImplementedException("Code is not implemented");
+
+ if (newNodeLabels == null) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the newNodeLabels
is null.");
+ }
+
+ List<NodeLabelInfo> nodeLabelInfos = newNodeLabels.getNodeLabelsInfo();
+ if (CollectionUtils.isEmpty(nodeLabelInfos)) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the nodeLabelsInfo
is null or empty.");
+ }
+
+ try {
+ long startTime = clock.getTime();
+ Map<SubClusterId, SubClusterInfo> subClustersActive =
getActiveSubclusters();
+ final HttpServletRequest hsrCopy = clone(hsr);
+ Class[] argsClasses = new Class[]{NodeLabelsInfo.class,
HttpServletRequest.class};
+ Object[] args = new Object[]{newNodeLabels, hsrCopy};
+ ClientMethod remoteMethod = new ClientMethod("addToClusterNodeLabels",
argsClasses, args);
+ Map<SubClusterInfo, Response> responseInfoMap =
+ invokeConcurrent(subClustersActive.values(), remoteMethod,
Response.class);
+ StringBuffer buffer = new StringBuffer();
+ responseInfoMap.forEach((subClusterInfo, response) -> {
+ SubClusterId subClusterId = subClusterInfo.getSubClusterId();
+ if (response != null) {
+ buffer.append("SubCluster=" + subClusterId.getId() + ",SUCCESS#");
+ } else {
+ buffer.append("SubCluster=" + subClusterId.getId() + ",FAILED#");
+ }
+ });
+ long stopTime = clock.getTime();
+ routerMetrics.succeededAddToClusterNodeLabelsRetrieved((stopTime -
startTime));
+ return Response.status(Status.OK).entity(buffer.toString()).build();
+ } catch (NotFoundException e) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ RouterServerUtil.logAndThrowIOException("get all active sub cluster(s)
error.", e);
+ } catch (YarnException e) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ RouterServerUtil.logAndThrowIOException("addToClusterNodeLabels with
yarn error.", e);
+ }
+
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new RuntimeException("addToClusterNodeLabels Failed.");
}
+ /**
+ * This method removes all the node labels for specific nodes, and it is
+ * reachable by using {@link RMWSConsts#REMOVE_NODE_LABELS}.
+ *
+ * @see ResourceManagerAdministrationProtocol#removeFromClusterNodeLabels
+ * @param oldNodeLabels the node labels to remove. It is a QueryParam.
+ * @param hsr the servlet request
+ * @return Response containing the status code
+ * @throws Exception in case of bad request
+ */
@Override
public Response removeFromClusterNodeLabels(Set<String> oldNodeLabels,
HttpServletRequest hsr) throws Exception {
- throw new NotImplementedException("Code is not implemented");
+
+ if (CollectionUtils.isEmpty(oldNodeLabels)) {
+ routerMetrics.incrRemoveFromClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the oldNodeLabels
is null or empty.");
+ }
+
+ try {
+ long startTime = clock.getTime();
+ Map<SubClusterId, SubClusterInfo> subClustersActive =
getActiveSubclusters();
+ final HttpServletRequest hsrCopy = clone(hsr);
+ Class[] argsClasses = new Class[]{Set.class, HttpServletRequest.class};
+ Object[] args = new Object[]{oldNodeLabels, hsrCopy};
+ ClientMethod remoteMethod =
+ new ClientMethod("removeFromClusterNodeLabels", argsClasses, args);
+ Map<SubClusterInfo, Response> responseInfoMap =
+ invokeConcurrent(subClustersActive.values(), remoteMethod,
Response.class);
+ StringBuffer buffer = new StringBuffer();
+ responseInfoMap.forEach((subClusterInfo, response) -> {
+ SubClusterId subClusterId = subClusterInfo.getSubClusterId();
+ if (response != null) {
Review Comment:
The code is the same except for the last append.
Let's just do that in the if.
##########
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java:
##########
@@ -1580,16 +1582,115 @@ public NodeLabelsInfo
getClusterNodeLabels(HttpServletRequest hsr)
throw new RuntimeException("getClusterNodeLabels Failed.");
}
+ /**
+ * This method adds specific node labels for specific nodes, and it is
+ * reachable by using {@link RMWSConsts#ADD_NODE_LABELS}.
+ *
+ * @see ResourceManagerAdministrationProtocol#addToClusterNodeLabels
+ * @param newNodeLabels the node labels to add. It is a content param.
+ * @param hsr the servlet request
+ * @return Response containing the status code
+ * @throws Exception in case of bad request
+ */
@Override
public Response addToClusterNodeLabels(NodeLabelsInfo newNodeLabels,
HttpServletRequest hsr) throws Exception {
- throw new NotImplementedException("Code is not implemented");
+
+ if (newNodeLabels == null) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the newNodeLabels
is null.");
+ }
+
+ List<NodeLabelInfo> nodeLabelInfos = newNodeLabels.getNodeLabelsInfo();
+ if (CollectionUtils.isEmpty(nodeLabelInfos)) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the nodeLabelsInfo
is null or empty.");
+ }
+
+ try {
+ long startTime = clock.getTime();
+ Map<SubClusterId, SubClusterInfo> subClustersActive =
getActiveSubclusters();
+ final HttpServletRequest hsrCopy = clone(hsr);
+ Class[] argsClasses = new Class[]{NodeLabelsInfo.class,
HttpServletRequest.class};
+ Object[] args = new Object[]{newNodeLabels, hsrCopy};
+ ClientMethod remoteMethod = new ClientMethod("addToClusterNodeLabels",
argsClasses, args);
+ Map<SubClusterInfo, Response> responseInfoMap =
+ invokeConcurrent(subClustersActive.values(), remoteMethod,
Response.class);
+ StringBuffer buffer = new StringBuffer();
+ responseInfoMap.forEach((subClusterInfo, response) -> {
+ SubClusterId subClusterId = subClusterInfo.getSubClusterId();
+ if (response != null) {
+ buffer.append("SubCluster=" + subClusterId.getId() + ",SUCCESS#");
+ } else {
+ buffer.append("SubCluster=" + subClusterId.getId() + ",FAILED#");
Review Comment:
append instead of + and just do the last part in the if
##########
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/test/java/org/apache/hadoop/yarn/server/router/webapp/MockDefaultRequestInterceptorREST.java:
##########
@@ -1307,4 +1307,44 @@ public SchedulerTypeInfo getSchedulerInfo() {
throw new RuntimeException(e);
}
}
+
+ @Override
+ public Response addToClusterNodeLabels(NodeLabelsInfo newNodeLabels,
HttpServletRequest hsr)
+ throws Exception {
+ List<NodeLabelInfo> nodeLabelInfoList = newNodeLabels.getNodeLabelsInfo();
+ NodeLabelInfo nodeLabelInfo = nodeLabelInfoList.get(0);
+ String nodeLabelName = nodeLabelInfo.getName();
+
+ // If nodeLabelName is ALL, we let all subclusters pass
+ if (StringUtils.equals("ALL", nodeLabelName)) {
+ return Response.status(Status.OK).build();
+ } else if (StringUtils.equals("A0", nodeLabelName)) {
+ SubClusterId subClusterId = getSubClusterId();
+ String id = subClusterId.getId();
+ if (StringUtils.contains("A0", id)) {
+ return Response.status(Status.OK).build();
+ } else {
+ return null;
Review Comment:
Is null an OK response?
##########
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-router/src/main/java/org/apache/hadoop/yarn/server/router/webapp/FederationInterceptorREST.java:
##########
@@ -1580,16 +1582,115 @@ public NodeLabelsInfo
getClusterNodeLabels(HttpServletRequest hsr)
throw new RuntimeException("getClusterNodeLabels Failed.");
}
+ /**
+ * This method adds specific node labels for specific nodes, and it is
+ * reachable by using {@link RMWSConsts#ADD_NODE_LABELS}.
+ *
+ * @see ResourceManagerAdministrationProtocol#addToClusterNodeLabels
+ * @param newNodeLabels the node labels to add. It is a content param.
+ * @param hsr the servlet request
+ * @return Response containing the status code
+ * @throws Exception in case of bad request
+ */
@Override
public Response addToClusterNodeLabels(NodeLabelsInfo newNodeLabels,
HttpServletRequest hsr) throws Exception {
- throw new NotImplementedException("Code is not implemented");
+
+ if (newNodeLabels == null) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the newNodeLabels
is null.");
+ }
+
+ List<NodeLabelInfo> nodeLabelInfos = newNodeLabels.getNodeLabelsInfo();
+ if (CollectionUtils.isEmpty(nodeLabelInfos)) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the nodeLabelsInfo
is null or empty.");
+ }
+
+ try {
+ long startTime = clock.getTime();
+ Map<SubClusterId, SubClusterInfo> subClustersActive =
getActiveSubclusters();
+ final HttpServletRequest hsrCopy = clone(hsr);
+ Class[] argsClasses = new Class[]{NodeLabelsInfo.class,
HttpServletRequest.class};
+ Object[] args = new Object[]{newNodeLabels, hsrCopy};
+ ClientMethod remoteMethod = new ClientMethod("addToClusterNodeLabels",
argsClasses, args);
+ Map<SubClusterInfo, Response> responseInfoMap =
+ invokeConcurrent(subClustersActive.values(), remoteMethod,
Response.class);
+ StringBuffer buffer = new StringBuffer();
+ responseInfoMap.forEach((subClusterInfo, response) -> {
+ SubClusterId subClusterId = subClusterInfo.getSubClusterId();
+ if (response != null) {
+ buffer.append("SubCluster=" + subClusterId.getId() + ",SUCCESS#");
+ } else {
+ buffer.append("SubCluster=" + subClusterId.getId() + ",FAILED#");
+ }
+ });
+ long stopTime = clock.getTime();
+ routerMetrics.succeededAddToClusterNodeLabelsRetrieved((stopTime -
startTime));
+ return Response.status(Status.OK).entity(buffer.toString()).build();
+ } catch (NotFoundException e) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ RouterServerUtil.logAndThrowIOException("get all active sub cluster(s)
error.", e);
+ } catch (YarnException e) {
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ RouterServerUtil.logAndThrowIOException("addToClusterNodeLabels with
yarn error.", e);
+ }
+
+ routerMetrics.incrAddToClusterNodeLabelsFailedRetrieved();
+ throw new RuntimeException("addToClusterNodeLabels Failed.");
}
+ /**
+ * This method removes all the node labels for specific nodes, and it is
+ * reachable by using {@link RMWSConsts#REMOVE_NODE_LABELS}.
+ *
+ * @see ResourceManagerAdministrationProtocol#removeFromClusterNodeLabels
+ * @param oldNodeLabels the node labels to remove. It is a QueryParam.
+ * @param hsr the servlet request
+ * @return Response containing the status code
+ * @throws Exception in case of bad request
+ */
@Override
public Response removeFromClusterNodeLabels(Set<String> oldNodeLabels,
HttpServletRequest hsr) throws Exception {
- throw new NotImplementedException("Code is not implemented");
+
+ if (CollectionUtils.isEmpty(oldNodeLabels)) {
+ routerMetrics.incrRemoveFromClusterNodeLabelsFailedRetrieved();
+ throw new IllegalArgumentException("Parameter error, the oldNodeLabels
is null or empty.");
+ }
+
+ try {
+ long startTime = clock.getTime();
+ Map<SubClusterId, SubClusterInfo> subClustersActive =
getActiveSubclusters();
+ final HttpServletRequest hsrCopy = clone(hsr);
+ Class[] argsClasses = new Class[]{Set.class, HttpServletRequest.class};
+ Object[] args = new Object[]{oldNodeLabels, hsrCopy};
+ ClientMethod remoteMethod =
+ new ClientMethod("removeFromClusterNodeLabels", argsClasses, args);
+ Map<SubClusterInfo, Response> responseInfoMap =
+ invokeConcurrent(subClustersActive.values(), remoteMethod,
Response.class);
+ StringBuffer buffer = new StringBuffer();
+ responseInfoMap.forEach((subClusterInfo, response) -> {
+ SubClusterId subClusterId = subClusterInfo.getSubClusterId();
+ if (response != null) {
+
buffer.append("SubCluster=").append(subClusterId.getId()).append(",SUCCESS#");
+ } else {
+
buffer.append("SubCluster=").append(subClusterId.getId()).append(",FAILED#");
Review Comment:
Who dictates this format of , and #? Ins't there something to export in that
format already?
> [Federation] Add addToClusterNodeLabels, removeFromClusterNodeLabels REST
> APIs for Router
> -----------------------------------------------------------------------------------------
>
> Key: YARN-11222
> URL: https://issues.apache.org/jira/browse/YARN-11222
> Project: Hadoop YARN
> Issue Type: Sub-task
> Components: federation
> Affects Versions: 3.4.0, 3.3.4
> Reporter: Shilun Fan
> Assignee: Shilun Fan
> Priority: Major
> Labels: pull-request-available
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]