diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java index 7ec3e79..cf35256 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/AdminService.java @@ -108,6 +108,7 @@ // Address to use for binding. May be a wildcard address. private InetSocketAddress masterServiceBindAddress; private AccessControlList adminAcl; + boolean distributedNodeLabelConfiguration = false; private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); @@ -140,6 +141,9 @@ public void serviceInit(Configuration conf) throws Exception { YarnConfiguration.YARN_ADMIN_ACL, YarnConfiguration.DEFAULT_YARN_ADMIN_ACL)); rmId = conf.get(YarnConfiguration.RM_HA_ID); + + setDistributedNodeLabelConfiguration(conf); + super.serviceInit(conf); } @@ -154,6 +158,10 @@ protected void serviceStop() throws Exception { stopServer(); super.serviceStop(); } + + protected void setDistributedNodeLabelConfiguration(Configuration conf) { + // TODO, need change this to do actual read from conf after YARN-2495 committed + } protected void startServer() throws Exception { Configuration conf = getConfig(); @@ -696,15 +704,17 @@ public RemoveFromClusterNodeLabelsResponse removeFromClusterNodeLabels( @Override public ReplaceLabelsOnNodeResponse replaceLabelsOnNode( ReplaceLabelsOnNodeRequest request) throws YarnException, IOException { - String argName = "replaceLabelsOnNode"; - UserGroupInformation user = checkAcls(argName); + String methodName = "replaceLabelsOnNode"; + UserGroupInformation user = checkAcls(methodName); if (!isRMActive()) { - RMAuditLogger.logFailure(user.getShortUserName(), argName, + RMAuditLogger.logFailure(user.getShortUserName(), methodName, adminAcl.toString(), "AdminService", "ResourceManager is not active. Can not set node to labels."); throwStandbyException(); } + + checkAndThrowIfDistributedNodeLabelConfEnabled(methodName); ReplaceLabelsOnNodeResponse response = recordFactory.newRecordInstance(ReplaceLabelsOnNodeResponse.class); @@ -712,11 +722,11 @@ public ReplaceLabelsOnNodeResponse replaceLabelsOnNode( rmContext.getNodeLabelManager().replaceLabelsOnNode( request.getNodeToLabels()); RMAuditLogger - .logSuccess(user.getShortUserName(), argName, "AdminService"); + .logSuccess(user.getShortUserName(), methodName, "AdminService"); return response; } catch (IOException ioe) { LOG.info("Exception set node to labels. ", ioe); - RMAuditLogger.logFailure(user.getShortUserName(), argName, + RMAuditLogger.logFailure(user.getShortUserName(), methodName, adminAcl.toString(), "AdminService", "Exception set node to labels."); throw RPCUtil.getRemoteException(ioe); @@ -736,4 +746,15 @@ public GetClusterNodeLabelsResponse getClusterNodeLabels(GetClusterNodeLabelsReq return GetClusterNodeLabelsResponsePBImpl.newInstance(rmContext.getNodeLabelManager() .getClusterNodeLabels()); } + + private void checkAndThrowIfDistributedNodeLabelConfEnabled(String method) + throws IOException { + if (distributedNodeLabelConfiguration) { + String msg = + String.format("Error when invoke method=%s because of " + + "distributed node label configuration enabled.", method); + LOG.error(msg); + throw new IOException(msg); + } + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMAdminService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMAdminService.java index 1bd3dbf..436e762 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMAdminService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMAdminService.java @@ -43,6 +43,7 @@ import org.apache.hadoop.security.authorize.AccessControlList; import org.apache.hadoop.security.authorize.ProxyUsers; import org.apache.hadoop.security.authorize.ServiceAuthorizationManager; +import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.conf.HAUtil; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnException; @@ -52,6 +53,8 @@ import org.apache.hadoop.yarn.server.api.protocolrecords.RefreshServiceAclsRequest; import org.apache.hadoop.yarn.server.api.protocolrecords.RefreshSuperUserGroupsConfigurationRequest; import org.apache.hadoop.yarn.server.api.protocolrecords.RefreshUserToGroupsMappingsRequest; +import org.apache.hadoop.yarn.server.api.protocolrecords.ReplaceLabelsOnNodeRequest; +import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration; import org.junit.After; @@ -59,6 +62,9 @@ import org.junit.Before; import org.junit.Test; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + public class TestRMAdminService { @@ -750,6 +756,44 @@ public void testRMInitialsWithFileSystemBasedConfigurationProvider() } } } + + @Test + public void testModifyLabelsOnNodesWithDistributedConfigurationDisabled() + throws IOException, YarnException { + // create RM and set it's ACTIVE + MockRM rm = new MockRM(); + ((RMContextImpl) rm.getRMContext()).setHAServiceState(HAServiceState.ACTIVE); + RMNodeLabelsManager labelMgr = rm.rmContext.getNodeLabelManager(); + + // by default, distributed configuration for node label is disabled, this + // should pass + labelMgr.addToCluserNodeLabels(ImmutableSet.of("x", "y")); + rm.adminService.replaceLabelsOnNode(ReplaceLabelsOnNodeRequest + .newInstance(ImmutableMap.of(NodeId.newInstance("host", 0), + (Set) ImmutableSet.of("x")))); + rm.close(); + } + + @Test(expected = IOException.class) + public void testModifyLabelsOnNodesWithDistributedConfigurationEnabled() + throws IOException, YarnException { + // create RM and set it's ACTIVE, and set distributed node label + // configuration to true + MockRM rm = new MockRM(); + rm.adminService.distributedNodeLabelConfiguration = true; + + ((RMContextImpl) rm.getRMContext()) + .setHAServiceState(HAServiceState.ACTIVE); + RMNodeLabelsManager labelMgr = rm.rmContext.getNodeLabelManager(); + + // by default, distributed configuration for node label is disabled, this + // should pass + labelMgr.addToCluserNodeLabels(ImmutableSet.of("x", "y")); + rm.adminService.replaceLabelsOnNode(ReplaceLabelsOnNodeRequest + .newInstance(ImmutableMap.of(NodeId.newInstance("host", 0), + (Set) ImmutableSet.of("x")))); + rm.close(); + } private String writeConfigurationXML(Configuration conf, String confXMLName) throws IOException {