AMBARI-17841. UI does not allow to delete service is some host components are in INSTALLED_FAILED state. (jaimin)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1e05dc2d Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1e05dc2d Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1e05dc2d Branch: refs/heads/branch-embedded-views Commit: 1e05dc2d092e0759fce60d9ad5eaaae04dc6988a Parents: 18ba883 Author: Jaimin Jetly <[email protected]> Authored: Thu Jul 21 13:45:42 2016 -0700 Committer: Jaimin Jetly <[email protected]> Committed: Thu Jul 21 13:47:15 2016 -0700 ---------------------------------------------------------------------- ambari-web/app/models/client_component.js | 21 ----------------- ambari-web/app/models/host_component.js | 21 ++++++++++++++++- ambari-web/app/models/service.js | 12 +++++----- ambari-web/test/models/service_test.js | 31 +++++++------------------- 4 files changed, 34 insertions(+), 51 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/1e05dc2d/ambari-web/app/models/client_component.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/client_component.js b/ambari-web/app/models/client_component.js index 3902227..7dde68a 100644 --- a/ambari-web/app/models/client_component.js +++ b/ambari-web/app/models/client_component.js @@ -29,27 +29,6 @@ App.ClientComponent = DS.Model.extend({ stackInfo: DS.belongsTo('App.StackServiceComponent'), hostNames: DS.attr('array'), - /** - * Defines if all components are in 'INSTALLED' state - * - * @type {boolean} - */ - allStopped: Em.computed.equalProperties('installedCount', 'totalCount'), - - /** - * No stated and no installed component - * - * @type {boolean} - */ - noOneInstalled: Em.computed.and('!installedCount', '!startedCount'), - - /** - * Determines if component may be deleted - * - * @type {boolean} - */ - allowToDelete: Em.computed.or('allStopped', 'noOneInstalled'), - summaryLabelClassName:function(){ return 'label_for_'+this.get('componentName').toLowerCase(); }.property('componentName'), http://git-wip-us.apache.org/repos/asf/ambari/blob/1e05dc2d/ambari-web/app/models/host_component.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/host_component.js b/ambari-web/app/models/host_component.js index 91642c9..d8962ef 100644 --- a/ambari-web/app/models/host_component.js +++ b/ambari-web/app/models/host_component.js @@ -158,7 +158,16 @@ App.HostComponent = DS.Model.extend({ componentTextStatus: function () { return App.HostComponentStatus.getTextStatus(this.get("workStatus")); - }.property('workStatus', 'isDecommissioning') + }.property('workStatus', 'isDecommissioning'), + + /** + * Check if hostComponent is in a valid state in which it can be deleted + * @type {boolean} + */ + allowToDelete: function() { + var workStatus = this.get('workStatus'); + return App.HostComponent.allowDeleteStates.contains(workStatus); + }.property('workStatus') }); App.HostComponent.FIXTURES = []; @@ -269,6 +278,16 @@ App.HostComponentStatus = { } }; +/** + * @type {String[]} + */ +App.HostComponent.allowDeleteStates = [ + App.HostComponentStatus.init, + App.HostComponentStatus.install_failed, + App.HostComponentStatus.stopped, + App.HostComponentStatus.unknown +]; + App.HostComponentActionMap = { getMap: function(ctx) { var NN = ctx.get('controller.content.hostComponents').findProperty('componentName', 'NAMENODE'); http://git-wip-us.apache.org/repos/asf/ambari/blob/1e05dc2d/ambari-web/app/models/service.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/service.js b/ambari-web/app/models/service.js index c648e93..775b084 100644 --- a/ambari-web/app/models/service.js +++ b/ambari-web/app/models/service.js @@ -41,17 +41,17 @@ App.Service = DS.Model.extend({ masterComponents: DS.hasMany('App.MasterComponent'), /** - * Check master/slave component state of service + * Check each host component state of service * and general services state to define if it can be removed * * @type {boolean} */ allowToDelete: function() { var workStatus = this.get('workStatus'); - return App.Service.allowUninstallStates.contains(workStatus) - && this.get('slaveComponents').everyProperty('allowToDelete') - && this.get('masterComponents').everyProperty('allowToDelete'); - }.property('[email protected]', '[email protected]', 'workStatus'), + var isDeleteAllowedAtServiceLevel = App.Service.allowDeleteStates.contains(workStatus); + var isDeleteAllowedAtComponentLevel = this.get('hostComponents').everyProperty('allowToDelete', true); + return isDeleteAllowedAtServiceLevel && isDeleteAllowedAtComponentLevel; + }.property('[email protected]', 'workStatus'), /** * @type {bool} @@ -205,7 +205,7 @@ App.Service.inProgressStates = [ /** * @type {String[]} */ -App.Service.allowUninstallStates = [ +App.Service.allowDeleteStates = [ App.Service.statesMap.init, App.Service.statesMap.install_failed, App.Service.statesMap.stopped, http://git-wip-us.apache.org/repos/asf/ambari/blob/1e05dc2d/ambari-web/test/models/service_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/models/service_test.js b/ambari-web/test/models/service_test.js index e527e1e..456bf51 100644 --- a/ambari-web/test/models/service_test.js +++ b/ambari-web/test/models/service_test.js @@ -200,65 +200,50 @@ describe('App.Service', function () { Em.A([ { m: 'may be deleted (1)', - slaveComponents: [{allowToDelete: true}], - masterComponents: [{allowToDelete: true}], + hostComponents: [Em.Object.create({allowToDelete: true})], workStatus: 'INIT', e: true }, { m: 'may be deleted (2)', - slaveComponents: [{allowToDelete: true}], - masterComponents: [{allowToDelete: true}], + hostComponents: [Em.Object.create({allowToDelete: true})], workStatus: 'INSTALL_FAILED', e: true }, { m: 'may be deleted (3)', - slaveComponents: [{allowToDelete: true}], - masterComponents: [{allowToDelete: true}], + hostComponents: [Em.Object.create({allowToDelete: true})], workStatus: 'INSTALLED', e: true }, { m: 'may be deleted (4)', - slaveComponents: [{allowToDelete: true}], - masterComponents: [{allowToDelete: true}], + hostComponents: [Em.Object.create({allowToDelete: true})], workStatus: 'UNKNOWN', e: true }, { m: 'deleting is not allowed (1)', - slaveComponents: [{allowToDelete: false}], - masterComponents: [{allowToDelete: true}], + hostComponents: [Em.Object.create({allowToDelete: false})], workStatus: 'UNKNOWN', e: false }, { m: 'deleting is not allowed (2)', - slaveComponents: [{allowToDelete: false}], - masterComponents: [{allowToDelete: false}], + hostComponents: [Em.Object.create({allowToDelete: false})], workStatus: 'UNKNOWN', e: false }, { m: 'deleting is not allowed (3)', - slaveComponents: [{allowToDelete: true}], - masterComponents: [{allowToDelete: false}], - workStatus: 'UNKNOWN', - e: false - }, - { - m: 'deleting is not allowed (4)', - slaveComponents: [{allowToDelete: true}], - masterComponents: [{allowToDelete: true}], + hostComponents: [Em.Object.create({allowToDelete: true})], workStatus: 'STARTED', e: false } ]).forEach(function (test) { it(test.m, function () { this.stub.withArgs('workStatus').returns(test.workStatus); - this.stub.withArgs('slaveComponents').returns(test.slaveComponents); - this.stub.withArgs('masterComponents').returns(test.masterComponents); + this.stub.withArgs('hostComponents').returns(test.hostComponents); expect(Em.get(service, 'allowToDelete')).to.be.equal(test.e); }); });
