diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/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/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java index 88aeefd8738..e77c152cf8c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/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/hadoop-yarn-services-api/src/main/java/org/apache/hadoop/yarn/service/webapp/ApiServer.java @@ -227,6 +227,13 @@ public Response deleteService(@Context HttpServletRequest request, UserGroupInformation ugi = getProxyUser(request); LOG.info("DELETE: deleteService for appName = {} user = {}", appName, ugi); + Service app = getServiceFromClient(ugi, appName); + if (app.getState() != ServiceState.STOPPED && + app.getState() != ServiceState.FAILED) { + LOG.info("Cannot be deleted. {} state is {}", appName, app.getState().name()); + return formatResponse(Status.BAD_REQUEST, "Running service cannot be deleted"); + } + return stopService(appName, true, ugi); } catch (AccessControlException e) { return formatResponse(Status.FORBIDDEN, e.getMessage()); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/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/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java index 89366b43889..e00bf026414 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/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/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/ServiceClientTest.java @@ -27,6 +27,7 @@ import org.apache.hadoop.yarn.service.api.records.ContainerState; 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.client.ServiceClient; import org.apache.hadoop.yarn.service.utils.ServiceApiUtil; import org.apache.hadoop.yarn.service.utils.SliderFileSystem; @@ -97,6 +98,10 @@ public ApplicationId actionCreate(Service service) throws IOException { public Service getStatus(String appName) throws FileNotFoundException { if ("jenkins".equals(appName)) { return goodServiceStatus; + } else if ("jenkins-error-cleaning-registry".equals(appName) || + "jenkins-already-stopped".equals(appName) || + "no-jenkins".equals(appName)) { + return buildStoppedService(appName); } else { throw new FileNotFoundException("Service " + appName + " not found"); } @@ -184,6 +189,7 @@ static Service buildGoodService() { Service service = new Service(); service.setName("jenkins"); service.setVersion("v1"); + service.setState(ServiceState.STABLE); Artifact artifact = new Artifact(); artifact.setType(Artifact.TypeEnum.DOCKER); artifact.setId("jenkins:latest"); @@ -223,4 +229,11 @@ public synchronized ApplicationId getAppId(String serviceName) throws IOException, YarnException { return serviceAppId.get(serviceName); } + + static Service buildStoppedService(String appName) { + Service service = new Service(); + service.setName(appName); + service.setState(ServiceState.STOPPED); + return service; + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/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/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java index 733b9bcffaf..1487423219c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/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/hadoop-yarn-services-api/src/test/java/org/apache/hadoop/yarn/service/TestApiServer.java @@ -210,7 +210,7 @@ public void testBadDeleteService3() { final Response actual = apiServer.deleteService(request, "jenkins-doesn't-exist"); assertEquals("Delete service is ", - Response.status(Status.BAD_REQUEST).build().getStatus(), + Response.status(Status.NOT_FOUND).build().getStatus(), actual.getStatus()); } @@ -224,10 +224,10 @@ public void testBadDeleteService4() { } @Test - public void testGoodDeleteService() { + public void testDeleteStartedService() { final Response actual = apiServer.deleteService(request, "jenkins"); assertEquals("Delete service is ", - Response.status(Status.OK).build().getStatus(), actual.getStatus()); + Response.status(Status.BAD_REQUEST).build().getStatus(), actual.getStatus()); } @Test