diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java index 16f85131042..1b48528af9b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java @@ -279,12 +279,18 @@ public Response updateComponent(@Context HttpServletRequest request, @PathParam(COMPONENT_NAME) String componentName, Component component) { try { + if (component != null && component.getName() != null + && !component.getName().equals(componentName)) { + String msg = "Component name in the request object (" + + component.getName() + ") does not match that in the URI path (" + + componentName + ")"; + throw new YarnException(msg); + } UserGroupInformation ugi = getProxyUser(request); if (component.getNumberOfContainers() < 0) { - String message = - "Service = " + appName + ", Component = " + component.getName() - + ": Invalid number of containers specified " + component - .getNumberOfContainers(); + String message = "Service = " + appName + ", Component = " + + componentName + ": Invalid number of containers specified " + + component.getNumberOfContainers(); throw new YarnException(message); } Map original = ugi @@ -295,7 +301,7 @@ public Response updateComponent(@Context HttpServletRequest request, sc.init(YARN_CONFIG); sc.start(); Map original = sc.flexByRestService(appName, - Collections.singletonMap(component.getName(), + Collections.singletonMap(componentName, component.getNumberOfContainers())); sc.close(); return original; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java index 52057dbcff0..14c48768424 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java @@ -17,6 +17,16 @@ package org.apache.hadoop.yarn.service; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Path; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.service.api.records.Artifact; import org.apache.hadoop.yarn.service.api.records.Artifact.TypeEnum; @@ -24,23 +34,13 @@ import org.apache.hadoop.yarn.service.api.records.Resource; import org.apache.hadoop.yarn.service.api.records.Service; import org.apache.hadoop.yarn.service.api.records.ServiceState; +import org.apache.hadoop.yarn.service.api.records.ServiceStatus; import org.apache.hadoop.yarn.service.client.ServiceClient; import org.apache.hadoop.yarn.service.webapp.ApiServer; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.*; - /** * Test case for ApiServer REST API. * @@ -370,4 +370,23 @@ public void testUpdateService() { Response.status(Status.BAD_REQUEST) .build().getStatus()); } + + @Test + public void testUpdateComponent() { + Component comp = new Component(); + comp.setName("jenkins-slave"); + comp.setNumberOfContainers(1L); + final Response actual = apiServer.updateComponent(request, "jenkins", + "jenkins-master", comp); + ServiceStatus serviceStatus = (ServiceStatus) actual.getEntity(); + assertEquals("Update component should have failed with 400 bad request", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); + assertEquals( + "Update component should have failed with component name mismatch " + + "error", + "Component name in the request object (jenkins-slave) does not match " + + "that in the URI path (jenkins-master)", + serviceStatus.getDiagnostics()); + } }