Browse Source

AMBARI-17841. UI does not allow to delete service is some host components are in INSTALLED_FAILED state. (jaimin)

Jaimin Jetly 9 years ago
parent
commit
b9e68a9c3b

+ 0 - 21
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'),

+ 20 - 1
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');

+ 6 - 6
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('slaveComponents.@each.allowToDelete', 'masterComponents.@each.allowToDelete', 'workStatus'),
+    var isDeleteAllowedAtServiceLevel = App.Service.allowDeleteStates.contains(workStatus);
+    var isDeleteAllowedAtComponentLevel = this.get('hostComponents').everyProperty('allowToDelete', true);
+    return isDeleteAllowedAtServiceLevel && isDeleteAllowedAtComponentLevel;
+  }.property('hostComponents.@each.allowToDelete', '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,

+ 8 - 23
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);
       });
     });