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?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]