|
@@ -21,7 +21,6 @@ package org.apache.hadoop.yarn.server.router.webapp;
|
|
|
import java.io.IOException;
|
|
|
import java.net.ConnectException;
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.HashSet;
|
|
|
import java.util.Set;
|
|
|
import java.util.Map;
|
|
|
import java.util.HashMap;
|
|
@@ -54,6 +53,8 @@ import org.apache.hadoop.yarn.api.records.YarnApplicationState;
|
|
|
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptReport;
|
|
|
import org.apache.hadoop.yarn.api.records.YarnApplicationAttemptState;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType;
|
|
|
+import org.apache.hadoop.yarn.api.records.ApplicationTimeout;
|
|
|
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
|
|
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
|
|
import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId;
|
|
@@ -73,6 +74,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ResourceOptionIn
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeToLabelsInfo;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelInfo;
|
|
|
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppAttemptsInfo;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppTimeoutInfo;
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppTimeoutsInfo;
|
|
|
import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo;
|
|
|
import org.apache.hadoop.yarn.server.webapp.dao.ContainerInfo;
|
|
|
import org.apache.hadoop.yarn.server.webapp.dao.ContainersInfo;
|
|
@@ -93,7 +96,7 @@ public class MockDefaultRequestInterceptorREST
|
|
|
// This property allows us to write tests for specific scenario as YARN RM
|
|
|
// down e.g. network issue, failover.
|
|
|
private boolean isRunning = true;
|
|
|
- private HashSet<ApplicationId> applicationMap = new HashSet<>();
|
|
|
+ private Map<ApplicationId, ApplicationReport> applicationMap = new HashMap<>();
|
|
|
public static final String APP_STATE_RUNNING = "RUNNING";
|
|
|
|
|
|
private void validateRunning() throws ConnectException {
|
|
@@ -123,7 +126,22 @@ public class MockDefaultRequestInterceptorREST
|
|
|
|
|
|
ApplicationId appId = ApplicationId.fromString(newApp.getApplicationId());
|
|
|
LOG.info("Application submitted: " + appId);
|
|
|
- applicationMap.add(appId);
|
|
|
+
|
|
|
+ // Initialize appReport
|
|
|
+ ApplicationReport appReport = ApplicationReport.newInstance(
|
|
|
+ appId, ApplicationAttemptId.newInstance(appId, 1), null, newApp.getQueue(), null, null, 0,
|
|
|
+ null, YarnApplicationState.ACCEPTED, "", null, 0, 0, null, null, null, 0, null, null, null,
|
|
|
+ false, Priority.newInstance(newApp.getPriority()), null, null);
|
|
|
+
|
|
|
+ // Initialize appTimeoutsMap
|
|
|
+ HashMap<ApplicationTimeoutType, ApplicationTimeout> appTimeoutsMap = new HashMap<>();
|
|
|
+ ApplicationTimeoutType timeoutType = ApplicationTimeoutType.LIFETIME;
|
|
|
+ ApplicationTimeout appTimeOut =
|
|
|
+ ApplicationTimeout.newInstance(ApplicationTimeoutType.LIFETIME, "UNLIMITED", 10);
|
|
|
+ appTimeoutsMap.put(timeoutType, appTimeOut);
|
|
|
+ appReport.setApplicationTimeouts(appTimeoutsMap);
|
|
|
+
|
|
|
+ applicationMap.put(appId, appReport);
|
|
|
return Response.status(Status.ACCEPTED).header(HttpHeaders.LOCATION, "")
|
|
|
.entity(getSubClusterId()).build();
|
|
|
}
|
|
@@ -136,7 +154,7 @@ public class MockDefaultRequestInterceptorREST
|
|
|
}
|
|
|
|
|
|
ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
- if (!applicationMap.contains(applicationId)) {
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
}
|
|
|
|
|
@@ -171,7 +189,7 @@ public class MockDefaultRequestInterceptorREST
|
|
|
validateRunning();
|
|
|
|
|
|
ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
- if (!applicationMap.remove(applicationId)) {
|
|
|
+ if (applicationMap.remove(applicationId) == null) {
|
|
|
throw new ApplicationNotFoundException(
|
|
|
"Trying to kill an absent application: " + appId);
|
|
|
}
|
|
@@ -244,7 +262,7 @@ public class MockDefaultRequestInterceptorREST
|
|
|
}
|
|
|
|
|
|
ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
- if (!applicationMap.contains(applicationId)) {
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
}
|
|
|
|
|
@@ -428,7 +446,7 @@ public class MockDefaultRequestInterceptorREST
|
|
|
}
|
|
|
|
|
|
ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
- if (!applicationMap.contains(applicationId)) {
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
}
|
|
|
|
|
@@ -454,7 +472,7 @@ public class MockDefaultRequestInterceptorREST
|
|
|
}
|
|
|
|
|
|
ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
- if (!applicationMap.contains(applicationId)) {
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
}
|
|
|
|
|
@@ -463,4 +481,102 @@ public class MockDefaultRequestInterceptorREST
|
|
|
infos.add(TestRouterWebServiceUtil.generateAppAttemptInfo(1));
|
|
|
return infos;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AppTimeoutInfo getAppTimeout(HttpServletRequest hsr,
|
|
|
+ String appId, String type) throws AuthorizationException {
|
|
|
+
|
|
|
+ if (!isRunning) {
|
|
|
+ throw new RuntimeException("RM is stopped");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
+ throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationReport appReport = applicationMap.get(applicationId);
|
|
|
+ Map<ApplicationTimeoutType, ApplicationTimeout> timeouts = appReport.getApplicationTimeouts();
|
|
|
+ ApplicationTimeoutType paramType = ApplicationTimeoutType.valueOf(type);
|
|
|
+
|
|
|
+ if (paramType == null) {
|
|
|
+ throw new NotFoundException("application timeout type not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!timeouts.containsKey(paramType)) {
|
|
|
+ throw new NotFoundException("timeout with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationTimeout applicationTimeout = timeouts.get(paramType);
|
|
|
+
|
|
|
+ AppTimeoutInfo timeoutInfo = new AppTimeoutInfo();
|
|
|
+ timeoutInfo.setExpiryTime(applicationTimeout.getExpiryTime());
|
|
|
+ timeoutInfo.setTimeoutType(applicationTimeout.getTimeoutType());
|
|
|
+ timeoutInfo.setRemainingTime(applicationTimeout.getRemainingTime());
|
|
|
+
|
|
|
+ return timeoutInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AppTimeoutsInfo getAppTimeouts(HttpServletRequest hsr, String appId)
|
|
|
+ throws AuthorizationException {
|
|
|
+
|
|
|
+ if (!isRunning) {
|
|
|
+ throw new RuntimeException("RM is stopped");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
+
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
+ throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationReport appReport = applicationMap.get(applicationId);
|
|
|
+ Map<ApplicationTimeoutType, ApplicationTimeout> timeouts = appReport.getApplicationTimeouts();
|
|
|
+
|
|
|
+ AppTimeoutsInfo timeoutsInfo = new AppTimeoutsInfo();
|
|
|
+
|
|
|
+ for (ApplicationTimeout timeout : timeouts.values()) {
|
|
|
+ AppTimeoutInfo timeoutInfo = new AppTimeoutInfo();
|
|
|
+ timeoutInfo.setExpiryTime(timeout.getExpiryTime());
|
|
|
+ timeoutInfo.setTimeoutType(timeout.getTimeoutType());
|
|
|
+ timeoutInfo.setRemainingTime(timeout.getRemainingTime());
|
|
|
+ timeoutsInfo.add(timeoutInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return timeoutsInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response updateApplicationTimeout(AppTimeoutInfo appTimeout, HttpServletRequest hsr,
|
|
|
+ String appId) throws AuthorizationException,
|
|
|
+ YarnException, InterruptedException, IOException {
|
|
|
+
|
|
|
+ if (!isRunning) {
|
|
|
+ throw new RuntimeException("RM is stopped");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationId applicationId = ApplicationId.fromString(appId);
|
|
|
+
|
|
|
+ if (!applicationMap.containsKey(applicationId)) {
|
|
|
+ throw new NotFoundException("app with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationReport appReport = applicationMap.get(applicationId);
|
|
|
+ Map<ApplicationTimeoutType, ApplicationTimeout> timeouts = appReport.getApplicationTimeouts();
|
|
|
+
|
|
|
+ ApplicationTimeoutType paramTimeoutType = appTimeout.getTimeoutType();
|
|
|
+ if (!timeouts.containsKey(paramTimeoutType)) {
|
|
|
+ throw new NotFoundException("TimeOutType with id: " + appId + " not found");
|
|
|
+ }
|
|
|
+
|
|
|
+ ApplicationTimeout applicationTimeout = timeouts.get(paramTimeoutType);
|
|
|
+ applicationTimeout.setTimeoutType(appTimeout.getTimeoutType());
|
|
|
+ applicationTimeout.setExpiryTime(appTimeout.getExpireTime());
|
|
|
+ applicationTimeout.setRemainingTime(appTimeout.getRemainingTimeInSec());
|
|
|
+
|
|
|
+ AppTimeoutInfo result = new AppTimeoutInfo(applicationTimeout);
|
|
|
+
|
|
|
+ return Response.status(Status.OK).entity(result).build();
|
|
|
+ }
|
|
|
}
|