Repository: hadoop Updated Branches: refs/heads/trunk 81d9446a9 -> 315f48e79
YARN-7955. Improve result of calling stop on an already stopped service. Contributed by Gour Saha Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/315f48e7 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/315f48e7 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/315f48e7 Branch: refs/heads/trunk Commit: 315f48e791790ce56d4f9ed220180aaa00bbc5fa Parents: 81d9446 Author: Billie Rinaldi <bil...@apache.org> Authored: Wed Feb 28 15:01:56 2018 -0800 Committer: Billie Rinaldi <bil...@apache.org> Committed: Wed Feb 28 15:01:56 2018 -0800 ---------------------------------------------------------------------- .../hadoop/yarn/service/webapp/ApiServer.java | 18 ++- .../hadoop/yarn/service/ServiceClientTest.java | 2 + .../hadoop/yarn/service/TestApiServer.java | 118 ++++++++++--------- .../yarn/service/client/ServiceClient.java | 4 +- 4 files changed, 79 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/315f48e7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java ---------------------------------------------------------------------- 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 1528596..0deeae7 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 @@ -59,7 +59,7 @@ import java.util.Map; import static org.apache.hadoop.yarn.service.api.records.ServiceState.ACCEPTED; import static org.apache.hadoop.yarn.service.conf.RestApiConstants.*; -import static org.apache.hadoop.yarn.service.exceptions.LauncherExitCodes.EXIT_SUCCESS; +import static org.apache.hadoop.yarn.service.exceptions.LauncherExitCodes.*; /** * The rest API endpoints for users to manage services on YARN. @@ -240,7 +240,7 @@ public class ApiServer { private Response stopService(String appName, boolean destroy, final UserGroupInformation ugi) throws IOException, InterruptedException, YarnException, FileNotFoundException { - ugi.doAs(new PrivilegedExceptionAction<Integer>() { + int result = ugi.doAs(new PrivilegedExceptionAction<Integer>() { @Override public Integer run() throws IOException, YarnException, FileNotFoundException { @@ -249,11 +249,12 @@ public class ApiServer { sc.init(YARN_CONFIG); sc.start(); result = sc.actionStop(appName, destroy); + if (result == EXIT_SUCCESS) { + LOG.info("Successfully stopped service {}", appName); + } if (destroy) { result = sc.actionDestroy(appName); LOG.info("Successfully deleted service {}", appName); - } else { - LOG.info("Successfully stopped service {}", appName); } sc.close(); return result; @@ -264,8 +265,13 @@ public class ApiServer { serviceStatus.setDiagnostics("Successfully destroyed service " + appName); } else { - serviceStatus.setDiagnostics("Successfully stopped service " + - appName); + if (result == EXIT_COMMAND_ARGUMENT_ERROR) { + serviceStatus + .setDiagnostics("Service " + appName + " is already stopped"); + return formatResponse(Status.BAD_REQUEST, serviceStatus); + } else { + serviceStatus.setDiagnostics("Successfully stopped service " + appName); + } } return formatResponse(Status.OK, serviceStatus); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/315f48e7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java index 3e08c3a..8e5fd5c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java @@ -88,6 +88,8 @@ public class ServiceClientTest extends ServiceClient { } if (serviceName.equals("jenkins")) { return EXIT_SUCCESS; + } else if (serviceName.equals("jenkins-second-stop")) { + return EXIT_COMMAND_ARGUMENT_ERROR; } else { throw new ApplicationNotFoundException(""); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/315f48e7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java ---------------------------------------------------------------------- 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 4629d28..e473c3b 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 @@ -69,15 +69,14 @@ public class TestApiServer { this.apiServer.getClass().isAnnotationPresent(Path.class)); final Path path = this.apiServer.getClass() .getAnnotation(Path.class); - assertEquals("The path has /v1 annotation", path.value(), - "/v1"); + assertEquals("The path has /v1 annotation", "/v1", path.value()); } @Test public void testGetVersion() { final Response actual = apiServer.getVersion(); - assertEquals("Version number is", actual.getStatus(), - Response.ok().build().getStatus()); + assertEquals("Version number is", Response.ok().build().getStatus(), + actual.getStatus()); } @Test @@ -85,8 +84,9 @@ public class TestApiServer { Service service = new Service(); // Test for invalid argument final Response actual = apiServer.createService(request, service); - assertEquals("Create service is ", actual.getStatus(), - Response.status(Status.BAD_REQUEST).build().getStatus()); + assertEquals("Create service is ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); } @Test @@ -109,52 +109,55 @@ public class TestApiServer { components.add(c); service.setComponents(components); final Response actual = apiServer.createService(request, service); - assertEquals("Create service is ", actual.getStatus(), - Response.status(Status.ACCEPTED).build().getStatus()); + assertEquals("Create service is ", + Response.status(Status.ACCEPTED).build().getStatus(), + actual.getStatus()); } @Test public void testBadGetService() { final Response actual = apiServer.getService(request, "no-jenkins"); - assertEquals("Get service is ", actual.getStatus(), - Response.status(Status.NOT_FOUND).build().getStatus()); + assertEquals("Get service is ", + Response.status(Status.NOT_FOUND).build().getStatus(), + actual.getStatus()); } @Test public void testBadGetService2() { final Response actual = apiServer.getService(request, null); - assertEquals("Get service is ", actual.getStatus(), - Response.status(Status.NOT_FOUND) - .build().getStatus()); + assertEquals("Get service is ", + Response.status(Status.NOT_FOUND).build().getStatus(), + actual.getStatus()); } @Test public void testGoodGetService() { final Response actual = apiServer.getService(request, "jenkins"); - assertEquals("Get service is ", actual.getStatus(), - Response.status(Status.OK).build().getStatus()); + assertEquals("Get service is ", + Response.status(Status.OK).build().getStatus(), actual.getStatus()); } @Test public void testBadDeleteService() { final Response actual = apiServer.deleteService(request, "no-jenkins"); - assertEquals("Delete service is ", actual.getStatus(), - Response.status(Status.BAD_REQUEST).build().getStatus()); + assertEquals("Delete service is ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); } @Test public void testBadDeleteService2() { final Response actual = apiServer.deleteService(request, null); - assertEquals("Delete service is ", actual.getStatus(), - Response.status(Status.BAD_REQUEST) - .build().getStatus()); + assertEquals("Delete service is ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); } @Test public void testGoodDeleteService() { final Response actual = apiServer.deleteService(request, "jenkins"); - assertEquals("Delete service is ", actual.getStatus(), - Response.status(Status.OK).build().getStatus()); + assertEquals("Delete service is ", + Response.status(Status.OK).build().getStatus(), actual.getStatus()); } @Test @@ -179,8 +182,8 @@ public class TestApiServer { service.setComponents(components); final Response actual = apiServer.updateService(request, "jenkins", service); - assertEquals("update service is ", actual.getStatus(), - Response.status(Status.OK).build().getStatus()); + assertEquals("update service is ", + Response.status(Status.OK).build().getStatus(), actual.getStatus()); } @Test @@ -206,8 +209,9 @@ public class TestApiServer { System.out.println("before stop"); final Response actual = apiServer.updateService(request, "no-jenkins", service); - assertEquals("flex service is ", actual.getStatus(), - Response.status(Status.BAD_REQUEST).build().getStatus()); + assertEquals("flex service is ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); } @Test @@ -232,8 +236,8 @@ public class TestApiServer { service.setComponents(components); final Response actual = apiServer.updateService(request, "jenkins", service); - assertEquals("flex service is ", actual.getStatus(), - Response.status(Status.OK).build().getStatus()); + assertEquals("flex service is ", + Response.status(Status.OK).build().getStatus(), actual.getStatus()); } @Test @@ -258,9 +262,9 @@ public class TestApiServer { service.setComponents(components); final Response actual = apiServer.updateService(request, "no-jenkins", service); - assertEquals("start service is ", actual.getStatus(), - Response.status(Status.BAD_REQUEST).build() - .getStatus()); + assertEquals("start service is ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); } @Test @@ -285,8 +289,8 @@ public class TestApiServer { service.setComponents(components); final Response actual = apiServer.updateService(request, "jenkins", service); - assertEquals("start service is ", actual.getStatus(), - Response.status(Status.OK).build().getStatus()); + assertEquals("start service is ", + Response.status(Status.OK).build().getStatus(), actual.getStatus()); } @Test @@ -312,35 +316,39 @@ public class TestApiServer { System.out.println("before stop"); final Response actual = apiServer.updateService(request, "no-jenkins", service); - assertEquals("stop service is ", actual.getStatus(), - Response.status(Status.BAD_REQUEST).build().getStatus()); + assertEquals("stop service is ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); } @Test public void testGoodStopServices() { Service service = new Service(); - service.setState(ServiceState.STARTED); + service.setState(ServiceState.STOPPED); service.setName("jenkins"); - Artifact artifact = new Artifact(); - artifact.setType(TypeEnum.DOCKER); - artifact.setId("jenkins:latest"); - Resource resource = new Resource(); - resource.setCpus(1); - resource.setMemory("2048"); - List<Component> components = new ArrayList<Component>(); - Component c = new Component(); - c.setName("jenkins"); - c.setNumberOfContainers(-1L); - c.setArtifact(artifact); - c.setLaunchCommand(""); - c.setResource(resource); - components.add(c); - service.setComponents(components); System.out.println("before stop"); final Response actual = apiServer.updateService(request, "jenkins", service); - assertEquals("stop service is ", actual.getStatus(), - Response.status(Status.OK).build().getStatus()); + assertEquals("stop service is ", + Response.status(Status.OK).build().getStatus(), actual.getStatus()); + } + + @Test + public void testBadSecondStopServices() throws Exception { + Service service = new Service(); + service.setState(ServiceState.STOPPED); + service.setName("jenkins-second-stop"); + // simulates stop on an already stopped service + System.out.println("before second stop"); + final Response actual = apiServer.updateService(request, + "jenkins-second-stop", service); + assertEquals("stop service should have thrown 400 Bad Request: ", + Response.status(Status.BAD_REQUEST).build().getStatus(), + actual.getStatus()); + ServiceStatus serviceStatus = (ServiceStatus) actual.getEntity(); + assertEquals("Stop service should have failed with service already stopped", + "Service jenkins-second-stop is already stopped", + serviceStatus.getDiagnostics()); } @Test @@ -366,9 +374,9 @@ public class TestApiServer { System.out.println("before stop"); final Response actual = apiServer.updateService(request, "no-jenkins", service); - assertEquals("update service is ", actual.getStatus(), + assertEquals("update service is ", Response.status(Status.BAD_REQUEST) - .build().getStatus()); + .build().getStatus(), actual.getStatus()); } @Test http://git-wip-us.apache.org/repos/asf/hadoop/blob/315f48e7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java index 612b8b4..f5e21ab 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java @@ -363,7 +363,7 @@ public class ServiceClient extends AppAdminClient implements SliderExitCodes, if (terminatedStates.contains(report.getYarnApplicationState())) { LOG.info("Service {} is already in a terminated state {}", serviceName, report.getYarnApplicationState()); - return EXIT_SUCCESS; + return EXIT_COMMAND_ARGUMENT_ERROR; } if (preRunningStates.contains(report.getYarnApplicationState())) { String msg = serviceName + " is at " + report.getYarnApplicationState() @@ -779,7 +779,7 @@ public class ServiceClient extends AppAdminClient implements SliderExitCodes, Service service = ServiceApiUtil.loadService(fs, serviceName); ServiceApiUtil.validateAndResolveService(service, fs, getConfig()); // see if it is actually running and bail out; - verifyNoLiveAppInRM(serviceName, "thaw"); + verifyNoLiveAppInRM(serviceName, "start"); ApplicationId appId = submitApp(service); service.setId(appId.toString()); // write app definition on to hdfs --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org