Skip to content

Commit fddc3d5

Browse files
committed
YARN-10039. Allow disabling app submission from REST endpoints
1 parent fdd96e4 commit fddc3d5

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4219,6 +4219,10 @@ public static boolean areNodeLabelsEnabled(
42194219
"yarn.webapp.filter-invalid-xml-chars";
42204220
public static final boolean DEFAULT_FILTER_INVALID_XML_CHARS = false;
42214221

4222+
public static final String ENABLE_REST_APP_SUBMISSIONS =
4223+
"yarn.webapp.enable-rest-app-submissions";
4224+
public static final boolean DEFAULT_ENABLE_REST_APP_SUBMISSIONS = true;
4225+
42224226
// RM and NM CSRF props
42234227
public static final String REST_CSRF = "webapp.rest-csrf.";
42244228
public static final String RM_CSRF_PREFIX = RM_PREFIX + REST_CSRF;

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4487,4 +4487,10 @@
44874487
<name>yarn.workflow-id.tag-prefix</name>
44884488
<value>workflowid:</value>
44894489
</property>
4490+
4491+
<property>
4492+
<description>Whether or not to allow application submissions via REST. Default is true.</description>
4493+
<name>yarn.webapp.enable-rest-app-submissions</name>
4494+
<value>true</value>
4495+
</property>
44904496
</configuration>

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ public class RMWebServices extends WebServices implements RMWebServiceProtocol {
244244
boolean isCentralizedNodeLabelConfiguration = true;
245245
private boolean filterAppsByUser = false;
246246
private boolean filterInvalidXMLChars = false;
247+
private boolean enableRestAppSubmissions = true;
247248

248249
public final static String DELEGATION_TOKEN_HEADER =
249250
"Hadoop-YARN-RM-Delegation-Token";
@@ -262,6 +263,9 @@ public RMWebServices(final ResourceManager rm, Configuration conf) {
262263
this.filterInvalidXMLChars = conf.getBoolean(
263264
YarnConfiguration.FILTER_INVALID_XML_CHARS,
264265
YarnConfiguration.DEFAULT_FILTER_INVALID_XML_CHARS);
266+
this.enableRestAppSubmissions = conf.getBoolean(
267+
YarnConfiguration.ENABLE_REST_APP_SUBMISSIONS,
268+
YarnConfiguration.DEFAULT_ENABLE_REST_APP_SUBMISSIONS);
265269
}
266270

267271
RMWebServices(ResourceManager rm, Configuration conf,
@@ -1716,6 +1720,10 @@ private boolean isStaticUser(UserGroupInformation callerUGI) {
17161720
@Override
17171721
public Response createNewApplication(@Context HttpServletRequest hsr)
17181722
throws AuthorizationException, IOException, InterruptedException {
1723+
if (!enableRestAppSubmissions) {
1724+
String msg = "App submission via REST is disabled.";
1725+
return Response.status(Status.FORBIDDEN).entity(msg).build();
1726+
}
17191727
UserGroupInformation callerUGI = getCallerUserGroupInformation(hsr, true);
17201728
initForWritableEndpoints(callerUGI, false);
17211729

@@ -1736,6 +1744,10 @@ public Response createNewApplication(@Context HttpServletRequest hsr)
17361744
public Response submitApplication(ApplicationSubmissionContextInfo newApp,
17371745
@Context HttpServletRequest hsr)
17381746
throws AuthorizationException, IOException, InterruptedException {
1747+
if (!enableRestAppSubmissions) {
1748+
String msg = "App submission via REST is disabled.";
1749+
return Response.status(Status.FORBIDDEN).entity(msg).build();
1750+
}
17391751

17401752
UserGroupInformation callerUGI = getCallerUserGroupInformation(hsr, true);
17411753
initForWritableEndpoints(callerUGI, false);

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import javax.servlet.http.HttpServletResponse;
4444
import javax.ws.rs.core.HttpHeaders;
4545
import javax.ws.rs.core.MediaType;
46+
import javax.ws.rs.core.Response;
4647
import javax.xml.parsers.DocumentBuilder;
4748
import javax.xml.parsers.DocumentBuilderFactory;
4849

@@ -76,6 +77,7 @@
7677
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
7778
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler;
7879
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler;
80+
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ApplicationSubmissionContextInfo;
7981
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppsInfo;
8082
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ClusterUserInfo;
8183
import org.apache.hadoop.yarn.server.security.ApplicationACLsManager;
@@ -952,6 +954,24 @@ public void testInvalidXMLChars() throws Exception {
952954
"java.lang.Exception: \uFFFD", appsInfo.getApps().get(0).getNote());
953955
}
954956

957+
@Test
958+
public void testDisableRestAppSubmission() throws Exception {
959+
Configuration conf = new YarnConfiguration();
960+
conf.setBoolean(YarnConfiguration.ENABLE_REST_APP_SUBMISSIONS, false);
961+
RMWebServices webSvc = new RMWebServices(mock(ResourceManager.class), conf,
962+
mock(HttpServletResponse.class));
963+
HttpServletRequest request = mock(HttpServletRequest.class);
964+
965+
Response response = webSvc.createNewApplication(request);
966+
assertEquals(Status.FORBIDDEN.getStatusCode(), response.getStatus());
967+
assertEquals("App submission via REST is disabled.", response.getEntity());
968+
969+
response = webSvc.submitApplication(
970+
mock(ApplicationSubmissionContextInfo.class), request);
971+
assertEquals(Status.FORBIDDEN.getStatusCode(), response.getStatus());
972+
assertEquals("App submission via REST is disabled.", response.getEntity());
973+
}
974+
955975
public void verifyClusterUserInfo(ClusterUserInfo userInfo,
956976
String rmLoginUser, String requestedUser) {
957977
assertEquals("rmLoginUser doesn't match: ",

0 commit comments

Comments
 (0)