Selaa lähdekoodia

AMBARI-5048. Host Details page: When adding slaves, INIT state is shown as "Unknown" with "Start" as allowable action. (onechiporenko)

Oleg Nechiporenko 11 vuotta sitten
vanhempi
commit
af0e297eec

+ 1 - 0
ambari-web/app/assets/test/tests.js

@@ -109,4 +109,5 @@ require('test/views/main/host/details/host_component_views/decommissionable_test
 require('test/views/common/configs/services_config_test');
 require('test/views/wizard/step9_view_test');
 require('test/models/host_test');
+require('test/models/host_component_test');
 require('test/models/rack_test');

+ 17 - 0
ambari-web/app/models/host_component.js

@@ -188,6 +188,7 @@ App.HostComponentStatus = {
   upgrade_failed: "UPGRADE_FAILED",
   unknown: "UNKNOWN",
   disabled: "DISABLED",
+  init: "INIT",
 
   /**
    * Get host component status in "machine" format
@@ -242,8 +243,24 @@ App.HostComponentStatus = {
         return 'Upgrade Failed';
       case this.disabled:
         return 'Disabled';
+      case this.init:
+        return 'Install Pending...';
     }
     return 'Unknown';
+  },
+
+  /**
+   * Get list of possible <code>App.HostComponent</code> statuses
+   * @returns {String[]}
+   */
+  getStatusesList: function() {
+    var ret = [];
+    for (var st in this) {
+      if (this.hasOwnProperty(st) && Em.typeOf(this[st]) == 'string') {
+        ret.push(this[st]);
+      }
+    }
+    return ret;
   }
 };
 

+ 21 - 10
ambari-web/app/templates/main/host/details/host_component.hbs

@@ -76,11 +76,13 @@
             </li>
           {{/if}}
           {{#unless view.isStart}}
-            <li {{bindAttr class="view.isUpgradeFailed:hidden view.isInstallFailed:hidden view.isDecommissioning:hidden view.noActionAvailable"}}>
-              <a href="javascript:void(null)" data-toggle="modal" {{action "startComponent" view.content target="controller"}}>
-                {{t common.start}}
-              </a>
-            </li>
+            {{#unless view.isInit}}
+              <li {{bindAttr class="view.isUpgradeFailed:hidden view.isInstallFailed:hidden view.isDecommissioning:hidden view.noActionAvailable"}}>
+                <a href="javascript:void(null)" data-toggle="modal" {{action "startComponent" view.content target="controller"}}>
+                  {{t common.start}}
+                </a>
+              </li>
+            {{/unless}}
           {{/unless}}
           {{#if view.isUpgradeFailed}}
             <li {{bindAttr class="view.noActionAvailable"}}>
@@ -104,11 +106,13 @@
             </li>
           {{/if}}
           {{#if view.isActive}}
-            <li rel='passiveTooltip' {{bindAttr class="view.noActionAvailable" title="view.passiveImpliedTextStatus"}}>
-              <a href="javascript:void(null)" {{bindAttr class="view.isImplied:disabled"}} data-toggle="modal" {{action "turnOnOffPassiveConfirmation" view.content target="controller"}}>
-                {{t passiveState.turnOn}}
-              </a>
-            </li>
+            {{#unless view.isInit}}
+              <li rel='passiveTooltip' {{bindAttr class="view.noActionAvailable" title="view.passiveImpliedTextStatus"}}>
+                <a href="javascript:void(null)" {{bindAttr class="view.isImplied:disabled"}} data-toggle="modal" {{action "turnOnOffPassiveConfirmation" view.content target="controller"}}>
+                  {{t passiveState.turnOn}}
+                </a>
+              </li>
+            {{/unless}}
           {{else}}
             <li rel='passiveTooltip' {{bindAttr class="view.noActionAvailable" title="view.passiveImpliedTextStatus"}}>
               <a href="javascript:void(null)" {{bindAttr class="view.isImplied:disabled"}} data-toggle="modal" {{action "turnOnOffPassiveConfirmation" view.content target="controller"}}>
@@ -117,6 +121,13 @@
             </li>
           {{/if}}
         {{/unless}}
+        {{#if view.isInit}}
+          <li {{bindAttr class="view."}}>
+            <a href="javascript:void(null)" data-toggle="modal" {{action "installComponent" view.content target="controller"}}>
+              {{t common.reinstall}}
+            </a>
+          </li>
+        {{/if}}
         {{#if view.isDeletableComponent}}
             <li {{bindAttr class="view.isDeleteComponentDisabled:disabled"}}>
                 <a href="javascript:void(null)" data-toggle="modal" {{action "deleteComponent" view.content target="controller"}}>

+ 10 - 2
ambari-web/app/views/main/host/details/host_component_view.js

@@ -147,7 +147,7 @@ App.HostComponentView = Em.View.extend({
    * @type {bool}
    */
   isStart: function () {
-    return (this.get('workStatus') == App.HostComponentStatus.started || this.get('workStatus') == App.HostComponentStatus.starting);
+    return [App.HostComponentStatus.started, App.HostComponentStatus.starting].contains(this.get('workStatus'));
   }.property('workStatus'),
 
   /**
@@ -166,6 +166,14 @@ App.HostComponentView = Em.View.extend({
     return (this.get('workStatus') == App.HostComponentStatus.installing);
   }.property('workStatus'),
 
+  /**
+   * For Init state
+   * @type {bool}
+   */
+  isInit: function() {
+    return this.get('workStatus') == App.HostComponentStatus.init;
+  }.property('workStatus'),
+
   /**
    * No action available while component is starting/stopping/unknown
    * @type {String}
@@ -217,7 +225,7 @@ App.HostComponentView = Em.View.extend({
    * @type {bool}
    */
   isDeleteComponentDisabled: function () {
-    return ![App.HostComponentStatus.stopped, App.HostComponentStatus.unknown, App.HostComponentStatus.install_failed, App.HostComponentStatus.upgrade_failed].contains(this.get('workStatus'));
+    return ![App.HostComponentStatus.stopped, App.HostComponentStatus.unknown, App.HostComponentStatus.install_failed, App.HostComponentStatus.upgrade_failed, App.HostComponentStatus.init].contains(this.get('workStatus'));
   }.property('workStatus'),
 
   /**

+ 5 - 5
ambari-web/test/controllers/main/charts/heatmap_metrics/heatmap_metric_diskspaceused_test.js

@@ -22,7 +22,7 @@ require('controllers/main/charts/heatmap_metrics/heatmap_metric_diskspaceused');
 
 describe('App.MainChartHeatmapDiskSpaceUsedMetric', function () {
 
-  var tests = [
+  var tests = Em.A([
     {
       json:{
         "items" : [
@@ -40,7 +40,7 @@ describe('App.MainChartHeatmapDiskSpaceUsedMetric', function () {
         ]
       },
       m: 'One host',
-      e: {'dev01.hortonworks.com': '11.4'}
+      e: {'dev01.hortonworks.com': 11.37}
     },
     {
       json:{
@@ -70,7 +70,7 @@ describe('App.MainChartHeatmapDiskSpaceUsedMetric', function () {
         ]
       },
       m: 'Two hosts',
-      e: {'dev01.hortonworks.com': '11.4', 'dev02.hortonworks.com': '11.4'}
+      e: {'dev01.hortonworks.com': 11.37, 'dev02.hortonworks.com': 11.37}
     },
     {
       json:{
@@ -97,9 +97,9 @@ describe('App.MainChartHeatmapDiskSpaceUsedMetric', function () {
         ]
       },
       m: 'Two hosts, One without metric',
-      e: {'dev01.hortonworks.com': '11.4'}
+      e: {'dev01.hortonworks.com': 11.37}
     }
-  ];
+  ]);
 
   describe('#metricMapper()', function() {
     var mainChartHeatmapDiskSpaceUsedMetric = App.MainChartHeatmapDiskSpaceUsedMetric.create();

+ 33 - 0
ambari-web/test/models/host_component_test.js

@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+require('models/host_component');
+
+describe('App.HostComponentStatus', function() {
+
+  describe('#getStatusesList', function() {
+
+    it('allowed statuses', function() {
+      var statuses = ["STARTED","STARTING","INSTALLED","STOPPING","INSTALL_FAILED","INSTALLING","UPGRADE_FAILED","UNKNOWN","DISABLED","INIT"];
+      expect(App.HostComponentStatus.getStatusesList()).to.include.members(statuses);
+      expect(statuses).to.include.members(App.HostComponentStatus.getStatusesList());
+    });
+  });
+
+});

+ 4 - 4
ambari-web/test/views/main/dashboard/widget_test.js

@@ -33,12 +33,12 @@ describe('App.DashboardWidgetView', function() {
     var tests = [
       {
         h: ['', ''],
-        e: 'simple-text-hidden-two-line',
+        e: 'content-hidden-two-line',
         m: '2 lines'
       },
       {
         h: ['', '', ''],
-        e: 'simple-text-hidden-three-line',
+        e: 'content-hidden-three-line',
         m: '3 lines'
       },
       {
@@ -53,12 +53,12 @@ describe('App.DashboardWidgetView', function() {
       },
       {
         h: ['', '', '', '', ''],
-        e: 'simple-text-hidden-five-line',
+        e: 'content-hidden-five-line',
         m: '5 lines'
       },
       {
         h: ['', '', '', ''],
-        e: 'simple-text-hidden-four-line',
+        e: 'content-hidden-four-line',
         m: '4 lines'
       }
     ];

+ 89 - 90
ambari-web/test/views/main/host/details/host_component_view_test.js

@@ -126,15 +126,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isUpgradeFailed', function() {
 
-    var tests = Em.A([
-      {workStatus: 'UPGRADE_FAILED', e: true},
-      {workStatus: 'OTHER_STATUS', e: false}
-    ]);
-
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isUpgradeFailed')).to.equal(test.e);
+    var tests = ['UPGRADE_FAILED'];
+    var testE = true;
+    var defaultE = false;
+
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isUpgradeFailed')).to.equal(e);
       });
     });
 
@@ -142,15 +142,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isInstallFailed', function() {
 
-    var tests = Em.A([
-      {workStatus: 'INSTALL_FAILED', e: true},
-      {workStatus: 'OTHER_STATUS', e: false}
-    ]);
+    var tests = ['INSTALL_FAILED'];
+    var testE = true;
+    var defaultE = false;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isInstallFailed')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isInstallFailed')).to.equal(e);
       });
     });
 
@@ -158,16 +158,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isStart', function() {
 
-    var tests = Em.A([
-      {workStatus: 'STARTED', e: true},
-      {workStatus: 'STARTING', e: true},
-      {workStatus: 'OTHER_STATUS', e: false}
-    ]);
+    var tests = ['STARTED','STARTING'];
+    var testE = true;
+    var defaultE = false;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isStart')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isStart')).to.equal(e);
       });
     });
 
@@ -175,15 +174,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isStop', function() {
 
-    var tests = Em.A([
-      {workStatus: 'INSTALLED', e: true},
-      {workStatus: 'OTHER_STATUS', e: false}
-    ]);
+    var tests = ['INSTALLED'];
+    var testE = true;
+    var defaultE = false;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isStop')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isStop')).to.equal(e);
       });
     });
 
@@ -191,15 +190,31 @@ describe('App.HostComponentView', function() {
 
   describe('#isInstalling', function() {
 
-    var tests = Em.A([
-      {workStatus: 'INSTALLING', e: true},
-      {workStatus: 'OTHER_STATUS', e: false}
-    ]);
+    var tests = ['INSTALLING'];
+    var testE = true;
+    var defaultE = false;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isInstalling')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isInstalling')).to.equal(e);
+      });
+    });
+
+  });
+
+  describe('#isInit', function() {
+
+    var tests = ['INIT'];
+    var testE = true;
+    var defaultE = false;
+
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isInit')).to.equal(e);
       });
     });
 
@@ -207,18 +222,15 @@ describe('App.HostComponentView', function() {
 
   describe('#noActionAvailable', function() {
 
-    var tests = Em.A([
-      {workStatus: 'STARTING', e: 'hidden'},
-      {workStatus: 'STOPPING', e: 'hidden'},
-      {workStatus: 'UNKNOWN', e: 'hidden'},
-      {workStatus: 'DISABLED', e: 'hidden'},
-      {workStatus: 'OTHER_STATUS', e: ''}
-    ]);
+    var tests = ['STARTING', 'STOPPING', 'UNKNOWN', 'DISABLED'];
+    var testE = 'hidden';
+    var defaultE = '';
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('noActionAvailable')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('noActionAvailable')).to.equal(e);
       });
     });
 
@@ -286,15 +298,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isRestartComponentDisabled', function() {
 
-    var tests = Em.A([
-      {workStatus: 'STARTED', e: false},
-      {workStatus: 'OTHER_STATUS', e: true}
-    ]);
+    var tests = ['STARTED'];
+    var testE = false;
+    var defaultE = true;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isRestartComponentDisabled')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isRestartComponentDisabled')).to.equal(e);
       });
     });
 
@@ -302,18 +314,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isDeleteComponentDisabled', function() {
 
-    var tests = Em.A([
-      {workStatus: 'INSTALLED', e: false},
-      {workStatus: 'UNKNOWN', e: false},
-      {workStatus: 'INSTALL_FAILED', e: false},
-      {workStatus: 'UPGRADE_FAILED', e: false},
-      {workStatus: 'OTHER_STATUS', e: true}
-    ]);
+    var tests = ['INSTALLED', 'UNKNOWN', 'INSTALL_FAILED', 'UPGRADE_FAILED', 'INIT'];
+    var testE = false;
+    var defaultE = true;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', {workStatus: test.workStatus});
-        expect(hostComponentView.get('isDeleteComponentDisabled')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isDeleteComponentDisabled')).to.equal(e);
       });
     });
 
@@ -424,25 +433,15 @@ describe('App.HostComponentView', function() {
 
   describe('#isInProgress', function() {
 
-    var tests = Em.A([
-      {
-        workStatus: App.HostComponentStatus.stopping,
-        e: true
-      },
-      {
-        workStatus: App.HostComponentStatus.starting,
-        e: true
-      },
-      {
-        workStatus: 'other_status',
-        e: false
-      }
-    ]);
+    var tests = ['STOPPING', 'STARTING'];
+    var testE = true;
+    var defaultE = false;
 
-    tests.forEach(function(test) {
-      it(test.workStatus, function() {
-        hostComponentView.set('content', Em.Object.create({workStatus: test.workStatus}));
-        expect(hostComponentView.get('isInProgress')).to.equal(test.e);
+    App.HostComponentStatus.getStatusesList().forEach(function(status) {
+      it(status, function() {
+        hostComponentView.set('content', {workStatus: status});
+        var e = tests.contains(status) ? testE : defaultE;
+        expect(hostComponentView.get('isInProgress')).to.equal(e);
       });
     });