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") +}); 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" 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 +}); 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. +}} + +