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);
       });
     });

Reply via email to