diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-service.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-service.js new file mode 100644 index 00000000000..22128104749 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-service.js @@ -0,0 +1,32 @@ +/** + * 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 RESTAbstractAdapter from './restabstract'; + +export default RESTAbstractAdapter.extend({ + address: "rmWebAddress", + restNameSpace: "dashService", + serverName: "DASH", + + urlForQueryRecord(query/*, modelName*/) { + var url = this.buildURL(); + url += '/' + query.serviceName; + delete query.serviceName; + return url; + } +}); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/app-table-columns.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/app-table-columns.js index 552a157dd1f..c2cb0bd075e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/app-table-columns.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/app-table-columns.js @@ -85,7 +85,7 @@ export default Ember.Controller.extend({ contentPath: 'startTime', facetType: null, getCellContent: function(row) { - return Converter.timeStampToDate(row.get('startTime')); + return row.get('formattedStartTime'); } }, { id: 'elTime', @@ -100,7 +100,10 @@ export default Ember.Controller.extend({ headerTitle: 'Finished Time', contentPath: 'validatedFinishedTs', facetType: null, - observePath: true + observePath: true, + getCellContent: function(row) { + return row.get('formattedFinishedTime'); + } }, { id: 'priority', headerTitle: 'Priority', @@ -174,14 +177,17 @@ export default Ember.Controller.extend({ contentPath: 'startTime', facetType: null, getCellContent: function(row) { - return Converter.timeStampToDate(row.get('startTime')); + return row.get('formattedStartTime'); } }, { id: 'finishTime', headerTitle: 'Finished Time', contentPath: 'validatedFinishedTs', facetType: null, - observePath: true + observePath: true, + getCellContent: function(row) { + return row.get('formattedFinishedTime'); + } }); return ColumnDef.make(colums); }.property(), diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app.js index 799c8d20183..8b48347e68d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/controllers/yarn-app.js @@ -160,11 +160,29 @@ export default Ember.Controller.extend({ return amHostAddress; }), - isKillable: Ember.computed("model.app.state", function () { + isAppKillable: Ember.computed("model.app.state", function () { if (this.get("model.app.applicationType") === 'yarn-service') { return false; } const killableStates = ['NEW', 'NEW_SAVING', 'SUBMITTED', 'ACCEPTED', 'RUNNING']; return killableStates.indexOf(this.get("model.app.state")) > -1; + }), + + isServiceDeployedOrRunning: Ember.computed('model.serviceInfo', function() { + const serviceInfo = this.get('model.serviceInfo'); + const stoppedStates = ['STOPPED', 'SUCCEEDED', 'FAILED']; + if (serviceInfo) { + return stoppedStates.indexOf(serviceInfo.get('state')) === -1; + } + return false; + }), + + isServiceStoppped: Ember.computed('model.serviceInfo', function() { + const serviceInfo = this.get('model.serviceInfo'); + const stoppedStates = ['STOPPED', 'SUCCEEDED']; + if (serviceInfo) { + return stoppedStates.indexOf(serviceInfo.get('state')) > -1; + } + return false; }) }); 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 8f4a8993b78..f0d6a72d9d8 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 @@ -24,10 +24,10 @@ export default DS.Model.extend({ user: DS.attr("string"), queue: DS.attr("string"), state: DS.attr("string"), - startTime: DS.attr("string"), + startTime: DS.attr("number"), elapsedTime: DS.attr("string"), finalStatus: DS.attr("string"), - finishedTime: DS.attr("finishedTime"), + finishedTime: DS.attr("number"), progress: DS.attr("number"), diagnostics: DS.attr("string"), amHostHttpAddress: DS.attr("string"), @@ -71,6 +71,17 @@ export default DS.Model.extend({ return this.get("finishedTime") >= this.get("startTime"); }.property("hasFinishedTime"), + formattedStartTime: function() { + return Converter.timeStampToDate(this.get('startTime')); + }.property('startTime'), + + formattedFinishedTime: function() { + if (this.get("finishedTime") < this.get("startTime")) { + return "N/A"; + } + return Converter.timeStampToDate(this.get("finishedTime")); + }.property('finishedTime'), + formattedElapsedTime: function() { return Converter.msToElapsedTimeUnit(this.get("elapsedTime")); }.property("elapsedTime"), diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-service.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-service.js new file mode 100644 index 00000000000..f7d114eb885 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/models/yarn-service.js @@ -0,0 +1,30 @@ +/** + * 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 DS from 'ember-data'; + +export default DS.Model.extend({ + appId: DS.attr('string'), + name: DS.attr('string'), + state: DS.attr('string'), + version: DS.attr('string'), + lifetime: DS.attr('string'), + components: DS.attr(), + configuration: DS.attr(), + quicklinks: DS.attr() +}); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js index 8cd44bd59b3..21f5c951f99 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/routes/yarn-app.js @@ -37,6 +37,18 @@ export default AbstractRoute.extend(AppAttemptMixin, { return []; }, function () { return []; + }), + + serviceInfo: new Ember.RSVP.Promise(resolve => { + if (service) { + this.store.queryRecord('yarn-service', {serviceName: service}).then(function(info) { + resolve(info); + }, function() { + resolve(null); + }); + } else { + resolve(null); + } }) }); }, 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 f4de7257c00..b3d9f192c70 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 @@ -42,9 +42,9 @@ export default DS.JSONAPISerializer.extend({ user: payload.user, queue: payload.queue, state: payload.state, - startTime: payload.startedTime, // will be formatted in em-table + startTime: payload.startedTime, // will be formatted in yarn-app model elapsedTime: payload.elapsedTime, - finishedTime: Converter.timeStampToDate(payload.finishedTime), + finishedTime: payload.finishedTime, // will be formatted in yarn-app model finalStatus: payload.finalStatus, progress: payload.progress, applicationType: payload.applicationType, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-service.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-service.js new file mode 100644 index 00000000000..a96b28ba86b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/serializers/yarn-service.js @@ -0,0 +1,44 @@ +/** + * 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 DS from 'ember-data'; + +export default DS.JSONAPISerializer.extend({ + internalNormalizeSingleResponse(store, primaryModelClass, payload) { + const fixedPayload = { + id: 'yarn_service_' + (payload.id || Date.now()), + type: primaryModelClass.modelName, + attributes: { + appId: payload.id, + name: payload.name, + state: payload.state, + version: payload.version, + lifetime: payload.lifetime, + components: payload.components, + configuration: payload.configuration, + quicklinks: payload.quicklinks + } + }; + return fixedPayload; + }, + + normalizeSingleResponse(store, primaryModelClass, payload/*, id, requestType*/) { + const pl = this.internalNormalizeSingleResponse(store, primaryModelClass, payload); + return {data: pl}; + } +}); \ No newline at end of file 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 13d14e892aa..6e9bc088627 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 @@ -60,14 +60,14 @@ {{model.app.user}} {{#if model.app.hasFinishedTime}} -
+
- Finished at {{model.app.validatedFinishedTs}} + Finished at {{model.app.formattedFinishedTime}}
{{else}}
- Started at {{model.app.startTime}} + Started at {{model.app.formattedStartTime}}
{{/if}}
@@ -75,21 +75,33 @@