diff --git a/hadoop-mapreduce-project/CHANGES.txt b/hadoop-mapreduce-project/CHANGES.txt index 37a6e3b17e..e44a9c1669 100644 --- a/hadoop-mapreduce-project/CHANGES.txt +++ b/hadoop-mapreduce-project/CHANGES.txt @@ -433,6 +433,9 @@ Release 0.23.3 - UNRELEASED MAPREDUCE-4212. TestJobClientGetJob sometimes fails (Daryn Sharp via tgraves) + MAPREDUCE-4211. Error conditions (missing appid, appid not found) are + masked in the RM app page (Jonathan Eagles via bobby) + Release 0.23.2 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppBlock.java b/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppBlock.java index cb9541fd7c..9927b3221e 100644 --- a/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppBlock.java +++ b/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/AppBlock.java @@ -18,21 +18,85 @@ package org.apache.hadoop.yarn.server.resourcemanager.webapp; -import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; -import org.apache.hadoop.yarn.webapp.view.HtmlBlock; -import org.apache.hadoop.yarn.webapp.view.InfoBlock; +import static org.apache.hadoop.yarn.util.StringHelper.join; +import static org.apache.hadoop.yarn.webapp.YarnWebParams.APPLICATION_ID; import com.google.inject.Inject; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.util.StringUtils; +import org.apache.hadoop.yarn.api.records.ApplicationAccessType; +import org.apache.hadoop.yarn.api.records.ApplicationId; +import org.apache.hadoop.yarn.server.resourcemanager.RMContext; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppInfo; +import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; +import org.apache.hadoop.yarn.server.security.ApplicationACLsManager; +import org.apache.hadoop.yarn.util.Apps; +import org.apache.hadoop.yarn.util.Times; +import org.apache.hadoop.yarn.webapp.view.HtmlBlock; +import org.apache.hadoop.yarn.webapp.view.InfoBlock; +import org.apache.hadoop.yarn.webapp.ResponseInfo; + public class AppBlock extends HtmlBlock { + private ApplicationACLsManager aclsManager; + @Inject - AppBlock(ResourceManager rm, ViewContext ctx) { + AppBlock(ResourceManager rm, ViewContext ctx, ApplicationACLsManager aclsManager) { super(ctx); + this.aclsManager = aclsManager; } @Override protected void render(Block html) { + String aid = $(APPLICATION_ID); + if (aid.isEmpty()) { + puts("Bad request: requires application ID"); + return; + } + ApplicationId appID = Apps.toAppID(aid); + RMContext context = getInstance(RMContext.class); + RMApp rmApp = context.getRMApps().get(appID); + if (rmApp == null) { + puts("Application not found: "+ aid); + return; + } + AppInfo app = new AppInfo(rmApp, true); + + // Check for the authorization. + String remoteUser = request().getRemoteUser(); + UserGroupInformation callerUGI = null; + if (remoteUser != null) { + callerUGI = UserGroupInformation.createRemoteUser(remoteUser); + } + if (callerUGI != null + && !this.aclsManager.checkAccess(callerUGI, + ApplicationAccessType.VIEW_APP, app.getUser(), appID)) { + puts("You (User " + remoteUser + + ") are not authorized to view the logs for application " + appID); + return; + } + + setTitle(join("Application ", aid)); + + ResponseInfo info = info("Application Overview"). + _("User:", app.getUser()). + _("Name:", app.getName()). + _("State:", app.getState()). + _("FinalStatus:", app.getFinalStatus()). + _("Started:", Times.format(app.getStartTime())). + _("Elapsed:", StringUtils.formatTime( + Times.elapsed(app.getStartTime(), app.getFinishTime()))). + _("Tracking URL:", !app.isTrackingUrlReady() ? + "#" : app.getTrackingUrlPretty(), app.getTrackingUI()). + _("Diagnostics:", app.getNote()); + if (app.amContainerLogsExist()) { + info._("AM container logs:", app.getAMContainerLogs(), app.getAMContainerLogs()); + } else { + info._("AM container logs:", ""); + } + html._(InfoBlock.class); } } diff --git a/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java b/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java index 74c10264ac..957fe676d3 100644 --- a/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java +++ b/hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RmController.java @@ -20,27 +20,12 @@ import static org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebApp.QUEUE_NAME; import static org.apache.hadoop.yarn.util.StringHelper.join; -import static org.apache.hadoop.yarn.webapp.YarnWebParams.APPLICATION_ID; - -import javax.servlet.http.HttpServletResponse; - -import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hadoop.util.StringUtils; -import org.apache.hadoop.yarn.api.records.ApplicationAccessType; -import org.apache.hadoop.yarn.api.records.ApplicationId; -import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; -import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; -import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppInfo; -import org.apache.hadoop.yarn.server.security.ApplicationACLsManager; -import org.apache.hadoop.yarn.util.Apps; import org.apache.hadoop.yarn.util.StringHelper; -import org.apache.hadoop.yarn.util.Times; import org.apache.hadoop.yarn.webapp.Controller; -import org.apache.hadoop.yarn.webapp.ResponseInfo; import org.apache.hadoop.yarn.webapp.YarnWebParams; import com.google.inject.Inject; @@ -49,12 +34,9 @@ // on Mac OS HFS as its case-insensitive! public class RmController extends Controller { - private ApplicationACLsManager aclsManager; - @Inject - RmController(RequestContext ctx, ApplicationACLsManager aclsManager) { + RmController(RequestContext ctx) { super(ctx); - this.aclsManager = aclsManager; } @Override public void index() { @@ -67,57 +49,6 @@ public void about() { } public void app() { - String aid = $(APPLICATION_ID); - if (aid.isEmpty()) { - setStatus(HttpServletResponse.SC_BAD_REQUEST); - setTitle("Bad request: requires application ID"); - return; - } - ApplicationId appID = Apps.toAppID(aid); - RMContext context = getInstance(RMContext.class); - RMApp rmApp = context.getRMApps().get(appID); - if (rmApp == null) { - // TODO: handle redirect to jobhistory server - setStatus(HttpServletResponse.SC_NOT_FOUND); - setTitle("Application not found: "+ aid); - return; - } - AppInfo app = new AppInfo(rmApp, true); - - // Check for the authorization. - String remoteUser = request().getRemoteUser(); - UserGroupInformation callerUGI = null; - if (remoteUser != null) { - callerUGI = UserGroupInformation.createRemoteUser(remoteUser); - } - if (callerUGI != null - && !this.aclsManager.checkAccess(callerUGI, - ApplicationAccessType.VIEW_APP, app.getUser(), appID)) { - setStatus(HttpServletResponse.SC_UNAUTHORIZED); - setTitle("Unauthorized request for viewing application " + appID); - renderText("You (User " + remoteUser - + ") are not authorized to view the logs for application " + appID); - return; - } - - setTitle(join("Application ", aid)); - - ResponseInfo info = info("Application Overview"). - _("User:", app.getUser()). - _("Name:", app.getName()). - _("State:", app.getState()). - _("FinalStatus:", app.getFinalStatus()). - _("Started:", Times.format(app.getStartTime())). - _("Elapsed:", StringUtils.formatTime( - Times.elapsed(app.getStartTime(), app.getFinishTime()))). - _("Tracking URL:", !app.isTrackingUrlReady() ? - "#" : app.getTrackingUrlPretty(), app.getTrackingUI()). - _("Diagnostics:", app.getNote()); - if (app.amContainerLogsExist()) { - info._("AM container logs:", app.getAMContainerLogs(), app.getAMContainerLogs()); - } else { - info._("AM container logs:", ""); - } render(AppPage.class); }