diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-attempt-table.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-attempt-table.js index 88282750e23..861bdc1baba 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-attempt-table.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-attempt-table.js @@ -19,4 +19,10 @@ import Ember from 'ember'; export default Ember.Component.extend({ + + isApplicationRunning: Ember.computed('appInfo', function() { + const state = this.get('appInfo.state'); + return state === "RUNNING"; + }) + }); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/container-table.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/container-table.js index 4b741b88627..ac9a67fde9e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/container-table.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/container-table.js @@ -19,4 +19,10 @@ import Ember from 'ember'; export default Ember.Component.extend({ + + isApplicationRunning: Ember.computed('appInfo', function() { + const state = this.get('appInfo.state'); + return state === "RUNNING"; + }) + }); \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/timeline-view.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/timeline-view.js index f09f42eb12b..cccc5c9dc2f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/timeline-view.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/timeline-view.js @@ -396,8 +396,9 @@ export default Ember.Component.extend({ cellComponentName: 'em-table-html-cell', getCellContent: function(row) { var logUrl = self.checkHttpProtocol(row.get('logsLink')); + var link = row.get('masterNodeLogURL'); if (logUrl) { - return `Link`; + return `Link`; } else { return 'N/A'; } @@ -471,8 +472,9 @@ export default Ember.Component.extend({ cellComponentName: 'em-table-html-cell', getCellContent: function(row) { var url = self.checkHttpProtocol(row.get('logUrl')); + var link = row.get('masterNodeLogURL'); if (url) { - return `${url}`; + return `Link`; } else { return 'N/A'; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js index 5a6e25ec539..d878b07160e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app/logs.js @@ -20,8 +20,10 @@ import Ember from 'ember'; import Constants from 'yarn-ui/constants'; export default Ember.Controller.extend({ - queryParams: ["service"], + queryParams: ["service", "attempt", "containerid"], service: undefined, + attempt: undefined, + containerid: undefined, selectedAttemptId: "", attemptContainerList: null, @@ -40,7 +42,7 @@ export default Ember.Controller.extend({ }, actions: { - showContainersForAttemptId(attemptId) { + showContainersForAttemptId(attemptId, containerId = "") { this.set("selectedAttemptId", ""); if (attemptId) { this.set("_isLoadingTopPanel", true); @@ -75,6 +77,9 @@ export default Ember.Controller.extend({ } this.set("attemptContainerList", containers); this.initializeSelect(".js-fetch-logs-containers"); + if (containerId) { + this.send("showLogFilesForContainerId", containerId); + } }) .finally(() => { this.set("_isLoadingTopPanel", false); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/helpers/log-files-comma.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/helpers/log-files-comma.js index 026cd7f9916..963fc1418c1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/helpers/log-files-comma.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/helpers/log-files-comma.js @@ -47,7 +47,7 @@ export default Ember.Helper.helper(function(params,hash) { nodeAddr + '/' + containerId + '/' + logFileName + '">' + logFileName + ''; if (i !== logFilesLen - 1) { - html = html + ","; + html = html + ", "; } } html = html + ''; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js index f4836954b21..215583af79b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app-attempt.js @@ -142,8 +142,22 @@ export default DS.Model.extend({ }.property(), masterNodeURL: function() { - var addr = encodeURIComponent(this.get("nodeHttpAddress")); + const addr = encodeURIComponent(this.get("nodeHttpAddress")); return `#/yarn-node/${this.get("nodeId")}/${addr}/info/`; }.property("nodeId", "nodeHttpAddress"), + masterNodeLogURL: function() { + const nodeId = this.get("nodeId"); + const nodeAddr = encodeURIComponent(this.get("nodeHttpAddress")); + const containerId = this.get("appMasterContainerId"); + return `#/yarn-node-container/${nodeId}/${nodeAddr}/${containerId}`; + }.property("nodeId", "nodeHttpAddress", "appMasterContainerId"), + + appAttemptContainerLogsURL: function() { + const attemptId = this.get("id"); + const containerId = this.get("appMasterContainerId"); + const appId = Converter.attemptIdToAppId(attemptId); + return `#/yarn-app/${appId}/logs?attempt=${attemptId}&containerid=${containerId}`; + }.property("id", "appMasterContainerId") + }); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js index 7482a2fe998..11574c8f99d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-container.js @@ -63,7 +63,21 @@ export default DS.Model.extend({ }.property(), masterNodeURL: function() { - var addr = encodeURIComponent(this.get("nodeHttpAddress")); + const addr = encodeURIComponent(this.get("nodeHttpAddress")); return `#/yarn-node/${this.get("nodeId")}/${addr}/info/`; }.property("nodeId", "nodeHttpAddress"), + + masterNodeLogURL: function() { + const nodeId = this.get("nodeId"); + const nodeAddr = encodeURIComponent(this.get("nodeHttpAddress")); + const containerId = this.get("id"); + return `#/yarn-node-container/${nodeId}/${nodeAddr}/${containerId}`; + }.property("nodeId", "nodeHttpAddress", "id"), + + appAttemptContainerLogsURL: function() { + const containerId = this.get("id"); + const attemptId = Converter.containerIdToAttemptId(containerId); + const appId = Converter.attemptIdToAppId(attemptId); + return `#/yarn-app/${appId}/logs?attempt=${attemptId}&containerid=${containerId}`; + }.property("id") }); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js index 9384418d992..c734fb5fabe 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-timeline-container.js @@ -67,4 +67,11 @@ export default DS.Model.extend({ var addr = encodeURIComponent(this.get("nodeHttpAddress")); return `#/yarn-node/${this.get("nodeId")}/${addr}/info/`; }.property("nodeId", "nodeHttpAddress"), + + appAttemptContainerLogsURL: function() { + const containerId = this.get("id"); + const attemptId = Converter.containerIdToAttemptId(containerId); + const appId = Converter.attemptIdToAppId(attemptId); + return `#/yarn-app/${appId}/logs?attempt=${attemptId}&containerid=${containerId}`; + }.property("id") }); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js index 829cfe9c44a..46df370f475 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app-attempt.js @@ -19,10 +19,13 @@ import Ember from 'ember'; import AbstractRoute from './abstract'; import AppAttemptMixin from 'yarn-ui/mixins/app-attempt'; +import Converter from 'yarn-ui/utils/converter'; export default AbstractRoute.extend(AppAttemptMixin, { model(param) { + const appId = Converter.attemptIdToAppId(param.app_attempt_id); return Ember.RSVP.hash({ + appInfo: this.fetchAppInfoFromRMorATS(appId, this.store), attempt: this.fetchAttemptInfoFromRMorATS(param.app_attempt_id, this.store), rmContainers: this.store.query('yarn-container', { app_attempt_id: param.app_attempt_id diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/attempts.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/attempts.js index 451ecc29e18..079b9dfb218 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/attempts.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/attempts.js @@ -24,11 +24,13 @@ export default AbstractRoute.extend(AppAttemptMixin, { model(param, transition) { const {app_id} = this.paramsFor('yarn-app'); const {service} = param; + const appModel = this.modelFor('yarn-app'); transition.send('updateBreadcrumbs', app_id, service, [{text: 'Attempts'}]); return Ember.RSVP.hash({ appId: app_id, serviceName: service, + appInfo: appModel.app, attempts: this.fetchAttemptListFromRMorATS(app_id, this.store).catch(function() { return Ember.A(); }) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/logs.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/logs.js index 99e4cff093b..b73bc80f175 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/logs.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app/logs.js @@ -37,8 +37,14 @@ export default AbstractRoute.extend(AppAttemptMixin, { activate() { const controller = this.controllerFor("yarn-app.logs"); + const { attempt, containerid } = this.paramsFor('yarn-app.logs'); controller.resetAfterRefresh(); controller.initializeSelect(); + if (attempt) { + controller.send("showContainersForAttemptId", attempt, containerid); + } else { + controller.set("selectedAttemptId", ""); + } }, unloadAll() { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-node-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-node-container.js index 388918ed529..0060e2bbb52 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-node-container.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-node-container.js @@ -22,12 +22,14 @@ import AbstractRoute from './abstract'; export default AbstractRoute.extend({ model(param) { + let nodeAddress = decodeURIComponent(param.node_addr); + nodeAddress = nodeAddress.replace(/(^\w+:|^)\/\//, ''); // Get a specific container running on a specific node. return Ember.RSVP.hash({ nodeContainer: this.store.queryRecord('yarn-node-container', - { nodeHttpAddr: param.node_addr, containerId: param.container_id }), - nmGpuInfo: this.store.findRecord('yarn-nm-gpu', param.node_addr, {reload:true}), - nodeInfo: { id: param.node_id, addr: param.node_addr, containerId: param.container_id } + { nodeHttpAddr: nodeAddress, containerId: param.container_id }), + nmGpuInfo: this.store.findRecord('yarn-nm-gpu', nodeAddress, {reload:true}), + nodeInfo: { id: param.node_id, addr: nodeAddress, containerId: param.container_id } }); }, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-attempt-table.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-attempt-table.hbs index dc0397a6c0c..516073d47ad 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-attempt-table.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-attempt-table.hbs @@ -56,10 +56,15 @@ {{attempt.nodeHttpAddress}} {{/if}} - {{#if attempt.logsLink}} + {{#if isApplicationRunning}} Log - Link + Link + + {{else}} + + Log + Link {{/if}} {{#if attempt.diagnosticsInfo}} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/container-table.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/container-table.hbs index 139b7eb9bec..fc6468a97be 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/container-table.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/container-table.hbs @@ -54,10 +54,15 @@ {{container.nodeHttpAddress}} {{/if}} - {{#if container.logUrl}} + {{#if isApplicationRunning}} Log - Link + Link + + {{else}} + + Log + Link {{/if}} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/timeline-view.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/timeline-view.hbs index 7e7f783dc4e..9dcccd29398 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/timeline-view.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/timeline-view.hbs @@ -50,9 +50,9 @@ {{/if}} {{#if attemptModel}} - {{app-attempt-table attempt=selected}} + {{app-attempt-table attempt=selected appInfo=appInfo}} {{else}} - {{container-table container=selected}} + {{container-table container=selected appInfo=appInfo}} {{/if}} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs index 7d9aec1f0fc..fb6ec6c0b34 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app-attempt.hbs @@ -58,6 +58,7 @@ attemptModel=false changeViewType="changeViewType" viewType=viewType + appInfo=model.appInfo }} {{else}}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app/attempts.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app/attempts.hbs index 62105d32341..641d5dcbf96 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app/attempts.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app/attempts.hbs @@ -28,6 +28,7 @@ serviceName=model.serviceName changeViewType="changeViewType" viewType=viewType + appInfo=model.appInfo }} {{else}}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-node/info.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-node/info.hbs index a2c708e2ea7..59cbbf0abd2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-node/info.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-node/info.hbs @@ -129,9 +129,7 @@
-
  • - Resources - yarn.io/gpu -
  • + Resources - yarn.io/gpu
    {{donut-chart data=model.rmNode.getGpuDataForDonutChart