AMBARI-15736. Service can't be deleted if all component are in state "install failed". (onechiporenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9c3fe327 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9c3fe327 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9c3fe327 Branch: refs/heads/trunk Commit: 9c3fe327d45a384cad8489e3bf65de8a357e0f75 Parents: 8bb0d16 Author: Oleg Nechiporenko <[email protected]> Authored: Wed Apr 6 18:11:11 2016 +0300 Committer: Oleg Nechiporenko <[email protected]> Committed: Thu Apr 7 13:51:34 2016 +0300 ---------------------------------------------------------------------- ambari-web/app/models/client_component.js | 18 ++++- ambari-web/app/models/service.js | 9 ++- .../test/controllers/wizard/step8_test.js | 3 +- ambari-web/test/models/service_test.js | 77 ++++++++++++++++++++ 4 files changed, 98 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/9c3fe327/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 492d5ef..3902227 100644 --- a/ambari-web/app/models/client_component.js +++ b/ambari-web/app/models/client_component.js @@ -34,9 +34,21 @@ App.ClientComponent = DS.Model.extend({ * * @type {boolean} */ - allStopped: function() { - return this.get('installedCount') === this.get('totalCount'); - }.property('installedCount', 'totalCount'), + 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(); http://git-wip-us.apache.org/repos/asf/ambari/blob/9c3fe327/ambari-web/app/models/service.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/models/service.js b/ambari-web/app/models/service.js index 3e25be9..2818b9f 100644 --- a/ambari-web/app/models/service.js +++ b/ambari-web/app/models/service.js @@ -47,10 +47,11 @@ App.Service = DS.Model.extend({ * @type {boolean} */ allowToDelete: function() { - return App.Service.allowUninstallStates.contains(this.get('workStatus')) - && this.get('slaveComponents').everyProperty('allStopped') - && this.get('masterComponents').everyProperty('allStopped'); - }.property('[email protected]', '[email protected]', 'workStatus'), + 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'), /** * @type {bool} http://git-wip-us.apache.org/repos/asf/ambari/blob/9c3fe327/ambari-web/test/controllers/wizard/step8_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/wizard/step8_test.js b/ambari-web/test/controllers/wizard/step8_test.js index 867d5f8..4974460 100644 --- a/ambari-web/test/controllers/wizard/step8_test.js +++ b/ambari-web/test/controllers/wizard/step8_test.js @@ -20,7 +20,7 @@ var App = require('app'); require('utils/ajax/ajax_queue'); require('controllers/main/service/info/configs'); require('controllers/wizard/step8_controller'); -var installerStep8Controller, configurationController; +var installerStep8Controller; var testHelpers = require('test/helpers'); var configs = Em.A([ @@ -64,7 +64,6 @@ describe('App.WizardStep8Controller', function () { beforeEach(function () { installerStep8Controller = getController(); - configurationController = App.MainServiceInfoConfigsController.create({}); }); App.TestAliases.testAsComputedFilterBy(getController(), 'installedServices', 'content.services', 'isInstalled', true); http://git-wip-us.apache.org/repos/asf/ambari/blob/9c3fe327/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 6caf80a..e527e1e 100644 --- a/ambari-web/test/models/service_test.js +++ b/ambari-web/test/models/service_test.js @@ -187,5 +187,82 @@ describe('App.Service', function () { }); }); + describe('#allowToDelete', function () { + + beforeEach(function () { + this.stub = sinon.stub(service, 'get'); + }); + + afterEach(function () { + this.stub.restore(); + }); + + Em.A([ + { + m: 'may be deleted (1)', + slaveComponents: [{allowToDelete: true}], + masterComponents: [{allowToDelete: true}], + workStatus: 'INIT', + e: true + }, + { + m: 'may be deleted (2)', + slaveComponents: [{allowToDelete: true}], + masterComponents: [{allowToDelete: true}], + workStatus: 'INSTALL_FAILED', + e: true + }, + { + m: 'may be deleted (3)', + slaveComponents: [{allowToDelete: true}], + masterComponents: [{allowToDelete: true}], + workStatus: 'INSTALLED', + e: true + }, + { + m: 'may be deleted (4)', + slaveComponents: [{allowToDelete: true}], + masterComponents: [{allowToDelete: true}], + workStatus: 'UNKNOWN', + e: true + }, + { + m: 'deleting is not allowed (1)', + slaveComponents: [{allowToDelete: false}], + masterComponents: [{allowToDelete: true}], + workStatus: 'UNKNOWN', + e: false + }, + { + m: 'deleting is not allowed (2)', + slaveComponents: [{allowToDelete: false}], + masterComponents: [{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}], + 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); + expect(Em.get(service, 'allowToDelete')).to.be.equal(test.e); + }); + }); + + }); });
