diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app.js index 111e468f9cc..3eee76e6d16 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app.js +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/adapters/yarn-app.js @@ -23,6 +23,11 @@ export default AbstractAdapter.extend({ restNameSpace: "cluster", serverName: "RM", + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + urlForQuery(/*query, modelName*/) { var url = this._buildURL(); url = url + '/apps'; @@ -38,4 +43,13 @@ export default AbstractAdapter.extend({ pathForType(/*modelName*/) { return 'apps'; // move to some common place, return path by modelname. }, + + sendKillApplication(id) { + var url = this._buildURL(); + url += '/apps/' + id + '/state'; + var data = { + "state": "KILLED" + }; + return this.ajax(url, "PUT", { data: data }); + } }); 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 b84f328a81f..4a7f1b59498 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 @@ -81,6 +81,33 @@ export default Ember.Controller.extend({ }); }, + showKillApplicationConfirm() { + this.set('actionResponse', null); + Ember.$("#killApplicationConfirmDialog").modal('show'); + }, + + killApplication() { + var self = this; + Ember.$("#killApplicationConfirmDialog").modal('hide'); + const adapter = this.store.adapterFor('yarn-app'); + self.set('isLoading', true); + adapter.sendKillApplication(this.model.app.id).then(function (json) { + self.set('actionResponse', { + msg: 'Application killed successfully. Auto refreshing in 5 seconds.', + type: 'success' + }); + Ember.run.later(self, function () { + this.set('actionResponse', null); + this.send("refresh"); + }, 5000); + }, function (err) { + let message = err.diagnostics || 'Error: Kill application failed!'; + self.set('actionResponse', { msg: message, type: 'error' }); + }).finally(function () { + self.set('isLoading', false); + }); + }, + resetActionResponse() { this.set('actionResponse', null); } @@ -125,5 +152,10 @@ export default Ember.Controller.extend({ amHostAddress = 'http://' + amHostAddress; } return amHostAddress; + }), + + isKillable: Ember.computed("model.app.state", function () { + const killableStates = ['NEW', 'NEW_SAVING', 'SUBMITTED', 'ACCEPTED', 'RUNNING']; + return killableStates.indexOf(this.get("model.app.state")) > -1; }) }); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.scss b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.scss index 5d99d8ebfd6..91c26ed7430 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.scss +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/app/styles/app.scss @@ -722,3 +722,12 @@ div.service-action-mask img { margin-top: 0; } } + +ul.nav-pills > li > a.navbar-btn { + margin: 0px; + padding: 9px 15px; +} + +ul.nav-pills > li > a:hover.navbar-btn.btn-danger { + background-color: #c73232; +} 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 ca93428a77e..0ae723babee 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 @@ -18,6 +18,15 @@ {{breadcrumb-bar breadcrumbs=breadcrumbs}} +{{#if actionResponse}} +