Repository: hadoop Updated Branches: refs/heads/trunk fcbe15234 -> ef2dd7b78
YARN-5650. Render Application Timeout value in web UI. Contributed by Akhil PB. Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/ef2dd7b7 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/ef2dd7b7 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/ef2dd7b7 Branch: refs/heads/trunk Commit: ef2dd7b78c5bf15bd85a9c793e57855255148b7f Parents: fcbe152 Author: Sunil G <sun...@apache.org> Authored: Mon Dec 19 11:44:03 2016 +0530 Committer: Sunil G <sun...@apache.org> Committed: Mon Dec 19 11:44:03 2016 +0530 ---------------------------------------------------------------------- .../hadoop/yarn/server/webapp/AppBlock.java | 9 +++ .../resourcemanager/webapp/dao/AppInfo.java | 8 ++- .../webapp/app/components/app-timeout-bar.js | 60 ++++++++++++++++++++ .../src/main/webapp/app/models/yarn-app.js | 2 + .../src/main/webapp/app/serializers/yarn-app.js | 21 +++++-- .../templates/components/app-timeout-bar.hbs | 34 +++++++++++ .../src/main/webapp/app/templates/yarn-app.hbs | 10 +++- .../src/main/webapp/app/utils/converter.js | 3 + .../components/app-timeout-bar-test.js | 34 +++++++++++ 9 files changed, 172 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java index 69beef2..349a98c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java @@ -40,6 +40,7 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetContainerReportRequest; import org.apache.hadoop.yarn.api.records.ApplicationAttemptReport; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationReport; +import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType; import org.apache.hadoop.yarn.api.records.ContainerReport; import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.LogAggregationStatus; @@ -207,6 +208,14 @@ public class AppBlock extends HtmlBlock { overviewTable._("Log Aggregation Status:", root_url("logaggregationstatus", app.getAppId()), status.name()); } + long timeout = appReport.getApplicationTimeouts() + .get(ApplicationTimeoutType.LIFETIME).getRemainingTime(); + if (timeout < 0) { + overviewTable._("Application Timeout (Remaining Time):", "Unlimited"); + } else { + overviewTable._("Application Timeout (Remaining Time):", + String.format("%d seconds", timeout)); + } } overviewTable._("Diagnostics:", app.getDiagnosticsInfo() == null ? "" : app.getDiagnosticsInfo()); http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java index 2d364f4..4e85b67 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java @@ -259,8 +259,12 @@ public class AppInfo { timeout.setTimeoutType(entry.getKey()); long timeoutInMillis = entry.getValue().longValue(); timeout.setExpiryTime(Times.formatISO8601(timeoutInMillis)); - timeout.setRemainingTime(Math - .max((timeoutInMillis - System.currentTimeMillis()) / 1000, 0)); + if (app.isAppInCompletedStates()) { + timeout.setRemainingTime(0); + } else { + timeout.setRemainingTime(Math + .max((timeoutInMillis - System.currentTimeMillis()) / 1000, 0)); + } timeouts.add(timeout); } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-timeout-bar.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-timeout-bar.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-timeout-bar.js new file mode 100644 index 0000000..0eac827 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/components/app-timeout-bar.js @@ -0,0 +1,60 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; +import Converter from 'yarn-ui/utils/converter'; + +export default Ember.Component.extend({ + app: null, + + appTimeoutValue: function() { + var timeoutValueInSecs = this.get("app.remainingTimeoutInSeconds"); + if (timeoutValueInSecs > -1) { + return Converter.msToElapsedTime(timeoutValueInSecs * 1000); + } else { + return timeoutValueInSecs; + } + }.property("app.remainingTimeoutInSeconds"), + + isAppTimedOut: function() { + if (this.get("app.remainingTimeoutInSeconds") > 0) { + return false; + } else { + return true; + } + }.property("app.remainingTimeoutInSeconds"), + + appTimeoutBarStyle: function() { + var remainingInSecs = this.get("app.remainingTimeoutInSeconds"), + expiryTimestamp = Converter.dateToTimeStamp(this.get("app.applicationExpiryTime")), + expiryInSecs = expiryTimestamp / 1000, + startTimestamp = Converter.dateToTimeStamp(this.get("app.startTime")), + startInSecs = startTimestamp / 1000, + totalRunInSecs = 0, + appRunDurationInSecs = 0, + width = 0; + + if (remainingInSecs > 0) { + totalRunInSecs = expiryInSecs - startInSecs; + appRunDurationInSecs = totalRunInSecs - remainingInSecs; + width = appRunDurationInSecs / totalRunInSecs * 100; + } + + return "width: " + width + "%"; + }.property("app.remainingTimeoutInSeconds", "app.applicationExpiryTime", "app.startTime") +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app.js index 8b5474f..4138a87 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-app.js @@ -50,6 +50,8 @@ export default DS.Model.extend({ clusterUsagePercentage: DS.attr('number'), queueUsagePercentage: DS.attr('number'), currentAppAttemptId: DS.attr('string'), + remainingTimeoutInSeconds: DS.attr('number'), + applicationExpiryTime: DS.attr('string'), isFailed: function() { return this.get('finalStatus') == "FAILED" http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js index 427c3d8..fdba04a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-app.js @@ -23,9 +23,18 @@ export default DS.JSONAPISerializer.extend({ internalNormalizeSingleResponse(store, primaryModelClass, payload, id, requestType) { if (payload.app) { - payload = payload.app; + payload = payload.app; } - + + var timeoutInSecs = -1; + var appExpiryTime = Converter.timeStampToDate(payload.finishedTime); + if (payload.timeouts && payload.timeouts.timeout && payload.timeouts.timeout[0]) { + timeoutInSecs = payload.timeouts.timeout[0].remainingTimeInSeconds; + if (timeoutInSecs > -1) { + appExpiryTime = Converter.isoDateToDate(payload.timeouts.timeout[0].expiryTime); + } + } + var fixedPayload = { id: id, type: primaryModelClass.modelName, // yarn-app @@ -58,7 +67,9 @@ export default DS.JSONAPISerializer.extend({ numAMContainerPreempted: payload.numAMContainerPreempted, clusterUsagePercentage: payload.clusterUsagePercentage, queueUsagePercentage: payload.queueUsagePercentage, - currentAppAttemptId: payload.currentAppAttemptId + currentAppAttemptId: payload.currentAppAttemptId, + remainingTimeoutInSeconds: timeoutInSecs, + applicationExpiryTime: appExpiryTime } }; @@ -67,7 +78,7 @@ export default DS.JSONAPISerializer.extend({ normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) { - var p = this.internalNormalizeSingleResponse(store, + var p = this.internalNormalizeSingleResponse(store, primaryModelClass, payload, id, requestType); return { data: p }; }, @@ -90,4 +101,4 @@ export default DS.JSONAPISerializer.extend({ return normalizedArrayResponse; } -}); \ No newline at end of file +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-timeout-bar.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-timeout-bar.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-timeout-bar.hbs new file mode 100644 index 0000000..acbe0b2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/components/app-timeout-bar.hbs @@ -0,0 +1,34 @@ +{{! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +}} + +<div class="app-timeout-wrapper"> + {{#unless isAppTimedOut}} + <div class="panel panel-default"> + <div class="panel-body"> + <label>Application will be timed out after <span class="text-danger">{{appTimeoutValue}}</span></label> + <div class="progress"> + <div class="progress-bar progress-bar-danger progress-bar-striped active" style="{{appTimeoutBarStyle}}"></div> + </div> + <div> + <label class="pull-left">{{app.startTime}}</label> + <label class="pull-right">{{app.applicationExpiryTime}}</label> + </div> + </div> + </div> + {{/unless}} +</div> http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs index acf00d1..578cc95 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/templates/yarn-app.hbs @@ -46,6 +46,12 @@ <div class="col-md-10 container-fluid"> <div class="row"> + <div class="col-md-12"> + {{app-timeout-bar app=model.app}} + </div> + </div> + + <div class="row"> <div class="col-md-12 container-fluid"> <div class="panel panel-default"> <div class="panel-heading">Basic Info</div> @@ -116,10 +122,10 @@ </div> {{else}} <div class="panel panel-default"> - <div class="panel-body"> + <div class="panel-heading"> Diagnostics </div> - <div class="panel-footer">{{model.app.diagnostics}}</div> + <div class="panel-body">{{model.app.diagnostics}}</div> </div> {{/if}} </div> http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js index 6fd9d30..fb6b61c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/utils/converter.js @@ -91,6 +91,9 @@ export default { return ts; } }, + isoDateToDate: function(isoDate) { + return moment(isoDate).format("YYYY/MM/DD HH:mm:ss"); + }, splitForContainerLogs: function(id) { if (id) { var splits = id.split(Constants.PARAM_SEPARATOR); http://git-wip-us.apache.org/repos/asf/hadoop/blob/ef2dd7b7/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/app-timeout-bar-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/app-timeout-bar-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/app-timeout-bar-test.js new file mode 100644 index 0000000..fb2a73a --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/tests/integration/components/app-timeout-bar-test.js @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('app-timeout-bar', 'Integration | Component | app timeout bar', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{app-timeout-bar}}`); + + assert.equal(this.$().text().trim(), ''); +}); --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org