You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2015/10/28 14:37:41 UTC

ambari git commit: AMBARI-13602. Move bulk-operations code to the separated controller (onechiporenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk fd2ac2a7b -> 7402d19e9


AMBARI-13602. Move bulk-operations code to the separated controller (onechiporenko)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7402d19e
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7402d19e
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7402d19e

Branch: refs/heads/trunk
Commit: 7402d19e993c845e45af30a7c44fc05f6e742b32
Parents: fd2ac2a
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Wed Oct 28 15:33:37 2015 +0200
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Wed Oct 28 15:33:37 2015 +0200

----------------------------------------------------------------------
 ambari-web/app/assets/test/tests.js             |   1 +
 ambari-web/app/controllers.js                   |   1 +
 ambari-web/app/controllers/main/host.js         | 470 -------------
 .../main/host/bulk_operations_controller.js     | 695 +++++++++++++++++++
 ambari-web/app/views/main/host.js               | 200 ------
 .../views/main/host/hosts_table_menu_view.js    | 134 ++--
 .../host/bulk_operations_controller_test.js     | 155 +++++
 ambari-web/test/controllers/main/host_test.js   | 131 ----
 8 files changed, 915 insertions(+), 872 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/app/assets/test/tests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js
index f0b5dde..fc37e0d 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -76,6 +76,7 @@ var files = [
   'test/controllers/main/charts/heatmap_metrics/heatmap_metric_test',
   'test/controllers/main/alerts/manage_alert_groups_controller_test',
   'test/controllers/main/host/add_controller_test',
+  'test/controllers/main/host/bulk_operations_controller_test',
   'test/controllers/main/host/host_alerts_controller_test',
   'test/controllers/main/host/configs_service_test',
   'test/controllers/main/host/details_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/app/controllers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers.js b/ambari-web/app/controllers.js
index 55b68a4..d865950 100644
--- a/ambari-web/app/controllers.js
+++ b/ambari-web/app/controllers.js
@@ -107,6 +107,7 @@ require('controllers/main/service/widgets/create/step2_controller');
 require('controllers/main/service/widgets/create/step3_controller');
 require('controllers/main/service/widgets/edit_controller');
 require('controllers/main/host');
+require('controllers/main/host/bulk_operations_controller');
 require('controllers/main/host/details');
 require('controllers/main/host/configs_service');
 require('controllers/main/host/add_controller');

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/app/controllers/main/host.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/host.js b/ambari-web/app/controllers/main/host.js
index 9a4d600..390559b 100644
--- a/ambari-web/app/controllers/main/host.js
+++ b/ambari-web/app/controllers/main/host.js
@@ -18,8 +18,6 @@
 
 var App = require('app');
 var validator = require('utils/validator');
-var batchUtils = require('utils/batch_scheduled_requests');
-var hostsManagement = require('utils/hosts');
 
 App.MainHostController = Em.ArrayController.extend(App.TableServerMixin, {
   name: 'mainHostController',
@@ -531,474 +529,6 @@ App.MainHostController = Em.ArrayController.extend(App.TableServerMixin, {
   },
 
   /**
-   * Bulk operation wrapper
-   * @param {Object} operationData - data about bulk operation (action, hosts or hostComponents etc)
-   * @param {Array} hosts - list of affected hosts
-   */
-  bulkOperation: function (operationData, hosts) {
-    if (operationData.componentNameFormatted) {
-      if (operationData.action === 'RESTART') {
-        this.bulkOperationForHostComponentsRestart(operationData, hosts);
-      }
-      else {
-        if (operationData.action.indexOf('DECOMMISSION') != -1) {
-          this.bulkOperationForHostComponentsDecommission(operationData, hosts);
-        }
-        else {
-          this.bulkOperationForHostComponents(operationData, hosts);
-        }
-      }
-    }
-    else {
-      if (operationData.action === 'SET_RACK_INFO') {
-        this.bulkOperationForHostsSetRackInfo(operationData, hosts);
-      } else if (operationData.action === 'RESTART') {
-        this.bulkOperationForHostsRestart(operationData, hosts);
-      }
-      else {
-        if (operationData.action === 'PASSIVE_STATE') {
-          this.bulkOperationForHostsPassiveState(operationData, hosts);
-        }
-        else {
-          this.bulkOperationForHosts(operationData, hosts);
-        }
-      }
-    }
-  },
-
-  /**
-   * Bulk operation (start/stop all) for selected hosts
-   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
-   * @param {Array} hosts - list of affected hosts
-   */
-  bulkOperationForHosts: function (operationData, hosts) {
-    var self = this;
-
-    batchUtils.getComponentsFromServer({
-      hosts: hosts.mapProperty('hostName'),
-      passiveState: 'OFF',
-      displayParams: ['host_components/HostRoles/component_name']
-    }, function (data) {
-      self.bulkOperationForHostsCallback(operationData, data);
-    });
-  },
-  /**
-   * run Bulk operation (start/stop all) for selected hosts
-   * after host and components are loaded
-   * @param operationData
-   * @param data
-   */
-  bulkOperationForHostsCallback: function (operationData, data) {
-    var query = [];
-    var hostNames = [];
-    var hostsMap = {};
-
-    data.items.forEach(function (host) {
-      host.host_components.forEach(function (hostComponent) {
-        if (!App.components.get('clients').contains((hostComponent.HostRoles.component_name))) {
-          if (hostsMap[host.Hosts.host_name]) {
-            hostsMap[host.Hosts.host_name].push(hostComponent.HostRoles.component_name);
-          } else {
-            hostsMap[host.Hosts.host_name] = [hostComponent.HostRoles.component_name];
-          }
-        }
-      });
-    });
-
-    var nn_hosts = [];
-    for (var hostName in hostsMap) {
-      var subQuery = '(HostRoles/component_name.in(%@)&HostRoles/host_name=' + hostName + ')';
-      var components = hostsMap[hostName];
-
-      if (components.length) {
-        if (components.indexOf('NAMENODE') >= 0) {
-          nn_hosts.push(hostName);
-        }
-        query.push(subQuery.fmt(components.join(',')));
-      }
-      hostNames.push(hostName);
-    }
-    hostNames = hostNames.join(",");
-    if (query.length) {
-      query = query.join('|');
-      var self = this;
-      // if NameNode included, check HDFS NameNode checkpoint before stop NN
-      if (nn_hosts.length == 1 && operationData.action === 'INSTALLED' && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
-        var hostName = nn_hosts[0];
-        App.router.get('mainHostDetailsController').checkNnLastCheckpointTime(function () {
-          App.ajax.send({
-            name: 'common.host_components.update',
-            sender: self,
-            data: {
-              query: query,
-              HostRoles: {
-                state: operationData.action
-              },
-              context: operationData.message,
-              hostName: hostNames,
-              noOpsMessage: Em.I18n.t('hosts.host.maintainance.allComponents.context')
-            },
-            success: 'bulkOperationForHostComponentsSuccessCallback'
-          });
-        }, hostName);
-      } else if (nn_hosts.length == 2 && operationData.action === 'INSTALLED' && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
-        // HA enabled
-        App.router.get('mainServiceItemController').checkNnLastCheckpointTime(function () {
-          App.ajax.send({
-            name: 'common.host_components.update',
-            sender: self,
-            data: {
-              query: query,
-              HostRoles: {
-                state: operationData.action
-              },
-              context: operationData.message,
-              hostName: hostNames,
-              noOpsMessage: Em.I18n.t('hosts.host.maintainance.allComponents.context')
-            },
-            success: 'bulkOperationForHostComponentsSuccessCallback'
-          });
-        });
-      } else {
-        App.ajax.send({
-          name: 'common.host_components.update',
-          sender: self,
-          data: {
-            query: query,
-            HostRoles: {
-              state: operationData.action
-            },
-            context: operationData.message,
-            hostName: hostNames,
-            noOpsMessage: Em.I18n.t('hosts.host.maintainance.allComponents.context')
-          },
-          success: 'bulkOperationForHostComponentsSuccessCallback'
-        });
-      }
-    }
-    else {
-      App.ModalPopup.show({
-        header: Em.I18n.t('rolling.nothingToDo.header'),
-        body: Em.I18n.t('rolling.nothingToDo.body').format(Em.I18n.t('hosts.host.maintainance.allComponents.context')),
-        secondary: false
-      });
-    }
-  },
-
-  bulkOperationForHostsSetRackInfo: function (operationData, hosts) {
-    hostsManagement.setRackInfo(operationData, hosts);
-  },
-
-   /**
-   * Bulk restart for selected hosts
-   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
-   * @param {Ember.Enumerable} hosts - list of affected hosts
-   */
-  bulkOperationForHostsRestart: function (operationData, hosts) {
-    batchUtils.getComponentsFromServer({
-      passiveState: 'OFF',
-      hosts: hosts.mapProperty('hostName'),
-      displayParams: ['host_components/HostRoles/component_name']
-    }, function (data) {
-      var hostComponents = [];
-      data.items.forEach(function (host) {
-        host.host_components.forEach(function (hostComponent) {
-          hostComponents.push(Em.Object.create({
-            componentName: hostComponent.HostRoles.component_name,
-            hostName: host.Hosts.host_name
-          }));
-        })
-      });
-      // if NameNode included, check HDFS NameNode checkpoint before restart NN
-      var nn_count = hostComponents.filterProperty('componentName', 'NAMENODE').get('length');
-      if (nn_count == 1 && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
-        var hostName = hostComponents.findProperty('componentName', 'NAMENODE').get('hostName');
-        App.router.get('mainHostDetailsController').checkNnLastCheckpointTime(function () {
-          batchUtils.restartHostComponents(hostComponents, Em.I18n.t('rollingrestart.context.allOnSelectedHosts'), "HOST");
-        }, hostName);
-      } else if (nn_count == 2 && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
-        // HA enabled
-        App.router.get('mainServiceItemController').checkNnLastCheckpointTime(function () {
-          batchUtils.restartHostComponents(hostComponents, Em.I18n.t('rollingrestart.context.allOnSelectedHosts'), "HOST");
-        });
-      } else {
-        batchUtils.restartHostComponents(hostComponents, Em.I18n.t('rollingrestart.context.allOnSelectedHosts'), "HOST");
-      }
-    });
-  },
-
-  /**
-   * Bulk turn on/off passive state for selected hosts
-   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
-   * @param {Array} hosts - list of affected hosts
-   */
-  bulkOperationForHostsPassiveState: function (operationData, hosts) {
-    var self = this;
-
-    batchUtils.getComponentsFromServer({
-      hosts: hosts.mapProperty('hostName'),
-      displayParams: ['Hosts/maintenance_state']
-    }, function (data) {
-      var hostNames = [];
-
-      data.items.forEach(function (host) {
-        if (host.Hosts.maintenance_state !== operationData.state) {
-          hostNames.push(host.Hosts.host_name);
-        }
-      });
-      if (hostNames.length) {
-        App.ajax.send({
-          name: 'bulk_request.hosts.passive_state',
-          sender: self,
-          data: {
-            hostNames: hostNames.join(','),
-            passive_state: operationData.state,
-            requestInfo: operationData.message
-          },
-          success: 'updateHostPassiveState'
-        });
-      } else {
-        App.ModalPopup.show({
-          header: Em.I18n.t('rolling.nothingToDo.header'),
-          body: Em.I18n.t('hosts.bulkOperation.passiveState.nothingToDo.body'),
-          secondary: false
-        });
-      }
-    });
-  },
-
-  updateHostPassiveState: function (data, opt, params) {
-    batchUtils.infoPassiveState(params.passive_state);
-  },
-  /**
-   * Bulk operation for selected hostComponents
-   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
-   * @param {Array} hosts - list of affected hosts
-   */
-  bulkOperationForHostComponents: function (operationData, hosts) {
-    var self = this;
-
-    batchUtils.getComponentsFromServer({
-      components: [operationData.componentName],
-      hosts: hosts.mapProperty('hostName'),
-      passiveState: 'OFF'
-    }, function (data) {
-      if (data.items.length) {
-        var hostsWithComponentInProperState = data.items.mapProperty('Hosts.host_name');
-        App.ajax.send({
-          name: 'common.host_components.update',
-          sender: self,
-          data: {
-            HostRoles: {
-              state: operationData.action
-            },
-            query: 'HostRoles/component_name=' + operationData.componentName + '&HostRoles/host_name.in(' + hostsWithComponentInProperState.join(',') + ')&HostRoles/maintenance_state=OFF',
-            context: operationData.message + ' ' + operationData.componentNameFormatted,
-            level: 'SERVICE',
-            noOpsMessage: operationData.componentNameFormatted
-          },
-          success: 'bulkOperationForHostComponentsSuccessCallback'
-        });
-      }
-      else {
-        App.ModalPopup.show({
-          header: Em.I18n.t('rolling.nothingToDo.header'),
-          body: Em.I18n.t('rolling.nothingToDo.body').format(operationData.componentNameFormatted),
-          secondary: false
-        });
-      }
-    });
-  },
-
-  /**
-   * Bulk decommission/recommission for selected hostComponents
-   * @param {Object} operationData
-   * @param {Array} hosts
-   */
-  bulkOperationForHostComponentsDecommission: function (operationData, hosts) {
-    var self = this;
-
-    batchUtils.getComponentsFromServer({
-      components: [operationData.realComponentName],
-      hosts: hosts.mapProperty('hostName'),
-      passiveState: 'OFF',
-      displayParams: ['host_components/HostRoles/state']
-    }, function (data) {
-      self.bulkOperationForHostComponentsDecommissionCallBack(operationData, data)
-    });
-  },
-
-  /**
-   * run Bulk decommission/recommission for selected hostComponents
-   * after host and components are loaded
-   * @param operationData
-   * @param data
-   */
-  bulkOperationForHostComponentsDecommissionCallBack: function (operationData, data) {
-    var service = App.Service.find(operationData.serviceName);
-    var components = [];
-
-    data.items.forEach(function (host) {
-      host.host_components.forEach(function (hostComponent) {
-        components.push(Em.Object.create({
-          componentName: hostComponent.HostRoles.component_name,
-          hostName: host.Hosts.host_name,
-          workStatus: hostComponent.HostRoles.state
-        }))
-      });
-    });
-
-    if (components.length) {
-      var hostsWithComponentInProperState = components.mapProperty('hostName');
-      var turn_off = operationData.action.indexOf('OFF') !== -1;
-      var svcName = operationData.serviceName;
-      var masterName = operationData.componentName;
-      var slaveName = operationData.realComponentName;
-      var hostNames = hostsWithComponentInProperState.join(',');
-      if (turn_off) {
-        // For recommession
-        if (svcName === "YARN" || svcName === "HBASE" || svcName === "HDFS") {
-          App.router.get('mainHostDetailsController').doRecommissionAndStart(hostNames, svcName, masterName, slaveName);
-        }
-      } else {
-        hostsWithComponentInProperState = components.filterProperty('workStatus', 'STARTED').mapProperty('hostName');
-        //For decommession
-        if (svcName == "HBASE") {
-          // HBASE service, decommission RegionServer in batch requests
-          this.warnBeforeDecommission(hostNames);
-        } else {
-          var parameters = {
-            "slave_type": slaveName
-          };
-          var contextString = turn_off ? 'hosts.host.' + slaveName.toLowerCase() + '.recommission' :
-              'hosts.host.' + slaveName.toLowerCase() + '.decommission';
-          if (turn_off) {
-            parameters['included_hosts'] = hostsWithComponentInProperState.join(',')
-          }
-          else {
-            parameters['excluded_hosts'] = hostsWithComponentInProperState.join(',');
-          }
-          App.ajax.send({
-            name: 'bulk_request.decommission',
-            sender: this,
-            data: {
-              context: Em.I18n.t(contextString),
-              serviceName: service.get('serviceName'),
-              componentName: operationData.componentName,
-              parameters: parameters,
-              noOpsMessage: operationData.componentNameFormatted
-            },
-            success: 'bulkOperationForHostComponentsSuccessCallback'
-          });
-        }
-      }
-    }
-    else {
-      App.ModalPopup.show({
-        header: Em.I18n.t('rolling.nothingToDo.header'),
-        body: Em.I18n.t('rolling.nothingToDo.body').format(operationData.componentNameFormatted),
-        secondary: false
-      });
-    }
-  },
-
-
-  /**
-   * get info about regionserver passive_state
-   * @method warnBeforeDecommission
-   * @param {String} hostNames
-   * @return {$.ajax}
-   */
-  warnBeforeDecommission: function (hostNames) {
-    return App.ajax.send({
-      'name': 'host_components.hbase_regionserver.active',
-      'sender': this,
-      'data': {
-        hostNames: hostNames
-      },
-      success: 'warnBeforeDecommissionSuccess'
-    });
-  },
-
-  /**
-   * check is hbase regionserver in mm. If so - run decommission
-   * otherwise shows warning
-   * @method warnBeforeDecommission
-   * @param {Object} data
-   * @param {Object} opt
-   * @param {Object} params
-   */
-  warnBeforeDecommissionSuccess: function(data, opt, params) {
-    if (Em.get(data, 'items.length')) {
-      App.router.get('mainHostDetailsController').showHbaseActiveWarning();
-    } else {
-      App.router.get('mainHostDetailsController').checkRegionServerState(params.hostNames);
-    }
-  },
-  /**
-   * Bulk restart for selected hostComponents
-   * @param {Object} operationData
-   * @param {Array} hosts
-   */
-  bulkOperationForHostComponentsRestart: function (operationData, hosts) {
-    var service = App.Service.find(operationData.serviceName);
-
-    batchUtils.getComponentsFromServer({
-      components: [operationData.componentName],
-      hosts: hosts.mapProperty('hostName'),
-      passiveState: 'OFF',
-      displayParams: ['Hosts/maintenance_state', 'host_components/HostRoles/stale_configs', 'host_components/HostRoles/maintenance_state']
-    }, function (data) {
-      var wrappedHostComponents = [];
-
-      data.items.forEach(function (host) {
-        host.host_components.forEach(function (hostComponent) {
-          wrappedHostComponents.push(Em.Object.create({
-            componentName: hostComponent.HostRoles.component_name,
-            serviceName: operationData.serviceName,
-            hostName: host.Hosts.host_name,
-            hostPassiveState: host.Hosts.maintenance_state,
-            staleConfigs: hostComponent.HostRoles.stale_configs,
-            passiveState: hostComponent.HostRoles.maintenance_state
-          }))
-        });
-      });
-
-      if (wrappedHostComponents.length) {
-        batchUtils.showRollingRestartPopup(wrappedHostComponents.objectAt(0).get('componentName'), service.get('displayName'), service.get('passiveState') === "ON", false, wrappedHostComponents);
-      } else {
-        App.ModalPopup.show({
-          header: Em.I18n.t('rolling.nothingToDo.header'),
-          body: Em.I18n.t('rolling.nothingToDo.body').format(operationData.componentNameFormatted),
-          secondary: false
-        });
-      }
-    });
-  },
-
-  updateHostComponentsPassiveState: function (data, opt, params) {
-    batchUtils.infoPassiveState(params.passive_state);
-  },
-  /**
-   * Show BO popup after bulk request
-   */
-  bulkOperationForHostComponentsSuccessCallback: function (data, opt, params, req) {
-    if (!data && req.status == 200) {
-      App.ModalPopup.show({
-        header: Em.I18n.t('rolling.nothingToDo.header'),
-        body: Em.I18n.t('rolling.nothingToDo.body').format(params.noOpsMessage || Em.I18n.t('hosts.host.maintainance.allComponents.context')),
-        secondary: false
-      });
-    } else {
-      App.router.get('userSettingsController').dataLoading('show_bg').done(function (initValue) {
-        if (initValue) {
-          App.router.get('backgroundOperationsController').showPopup();
-        }
-      });
-    }
-  },
-
-  /**
    * associations between host property and column index
    * @type {Array}
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/app/controllers/main/host/bulk_operations_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/host/bulk_operations_controller.js b/ambari-web/app/controllers/main/host/bulk_operations_controller.js
new file mode 100644
index 0000000..ede2da4
--- /dev/null
+++ b/ambari-web/app/controllers/main/host/bulk_operations_controller.js
@@ -0,0 +1,695 @@
+/**
+ * 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');
+var batchUtils = require('utils/batch_scheduled_requests');
+var hostsManagement = require('utils/hosts');
+var O = Em.Object;
+/**
+ * @class BulkOperationsController
+ */
+App.BulkOperationsController = Em.Controller.extend({
+
+  name: 'bulkOperationsController',
+
+  /**
+   * Bulk operation wrapper
+   * @param {Object} operationData - data about bulk operation (action, hosts or hostComponents etc)
+   * @param {Array} hosts - list of affected hosts
+   */
+  bulkOperation: function (operationData, hosts) {
+    if (operationData.componentNameFormatted) {
+      if (operationData.action === 'RESTART') {
+        this.bulkOperationForHostComponentsRestart(operationData, hosts);
+      }
+      else {
+        if (operationData.action.indexOf('DECOMMISSION') != -1) {
+          this.bulkOperationForHostComponentsDecommission(operationData, hosts);
+        }
+        else {
+          this.bulkOperationForHostComponents(operationData, hosts);
+        }
+      }
+    }
+    else {
+      if (operationData.action === 'SET_RACK_INFO') {
+        this.bulkOperationForHostsSetRackInfo(operationData, hosts);
+      } else if (operationData.action === 'RESTART') {
+        this.bulkOperationForHostsRestart(operationData, hosts);
+      }
+      else {
+        if (operationData.action === 'PASSIVE_STATE') {
+          this.bulkOperationForHostsPassiveState(operationData, hosts);
+        }
+        else {
+          this.bulkOperationForHosts(operationData, hosts);
+        }
+      }
+    }
+  },
+
+  /**
+   * Bulk operation (start/stop all) for selected hosts
+   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
+   * @param {Array} hosts - list of affected hosts
+   */
+  bulkOperationForHosts: function (operationData, hosts) {
+    var self = this;
+
+    batchUtils.getComponentsFromServer({
+      hosts: hosts.mapProperty('hostName'),
+      passiveState: 'OFF',
+      displayParams: ['host_components/HostRoles/component_name']
+    }, function (data) {
+      self.bulkOperationForHostsCallback(operationData, data);
+    });
+  },
+  /**
+   * run Bulk operation (start/stop all) for selected hosts
+   * after host and components are loaded
+   * @param operationData
+   * @param data
+   */
+  bulkOperationForHostsCallback: function (operationData, data) {
+    var query = [];
+    var hostNames = [];
+    var hostsMap = {};
+
+    data.items.forEach(function (host) {
+      host.host_components.forEach(function (hostComponent) {
+        if (!App.components.get('clients').contains((hostComponent.HostRoles.component_name))) {
+          if (hostsMap[host.Hosts.host_name]) {
+            hostsMap[host.Hosts.host_name].push(hostComponent.HostRoles.component_name);
+          } else {
+            hostsMap[host.Hosts.host_name] = [hostComponent.HostRoles.component_name];
+          }
+        }
+      });
+    });
+
+    var nn_hosts = [];
+    for (var hostName in hostsMap) {
+      var subQuery = '(HostRoles/component_name.in(%@)&HostRoles/host_name=' + hostName + ')';
+      var components = hostsMap[hostName];
+
+      if (components.length) {
+        if (components.indexOf('NAMENODE') >= 0) {
+          nn_hosts.push(hostName);
+        }
+        query.push(subQuery.fmt(components.join(',')));
+      }
+      hostNames.push(hostName);
+    }
+    hostNames = hostNames.join(",");
+    if (query.length) {
+      query = query.join('|');
+      var self = this;
+      // if NameNode included, check HDFS NameNode checkpoint before stop NN
+      if (nn_hosts.length == 1 && operationData.action === 'INSTALLED' && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
+        var hostName = nn_hosts[0];
+        App.router.get('mainHostDetailsController').checkNnLastCheckpointTime(function () {
+          App.ajax.send({
+            name: 'common.host_components.update',
+            sender: self,
+            data: {
+              query: query,
+              HostRoles: {
+                state: operationData.action
+              },
+              context: operationData.message,
+              hostName: hostNames,
+              noOpsMessage: Em.I18n.t('hosts.host.maintainance.allComponents.context')
+            },
+            success: 'bulkOperationForHostComponentsSuccessCallback'
+          });
+        }, hostName);
+      } else if (nn_hosts.length == 2 && operationData.action === 'INSTALLED' && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
+        // HA enabled
+        App.router.get('mainServiceItemController').checkNnLastCheckpointTime(function () {
+          App.ajax.send({
+            name: 'common.host_components.update',
+            sender: self,
+            data: {
+              query: query,
+              HostRoles: {
+                state: operationData.action
+              },
+              context: operationData.message,
+              hostName: hostNames,
+              noOpsMessage: Em.I18n.t('hosts.host.maintainance.allComponents.context')
+            },
+            success: 'bulkOperationForHostComponentsSuccessCallback'
+          });
+        });
+      } else {
+        App.ajax.send({
+          name: 'common.host_components.update',
+          sender: self,
+          data: {
+            query: query,
+            HostRoles: {
+              state: operationData.action
+            },
+            context: operationData.message,
+            hostName: hostNames,
+            noOpsMessage: Em.I18n.t('hosts.host.maintainance.allComponents.context')
+          },
+          success: 'bulkOperationForHostComponentsSuccessCallback'
+        });
+      }
+    }
+    else {
+      App.ModalPopup.show({
+        header: Em.I18n.t('rolling.nothingToDo.header'),
+        body: Em.I18n.t('rolling.nothingToDo.body').format(Em.I18n.t('hosts.host.maintainance.allComponents.context')),
+        secondary: false
+      });
+    }
+  },
+
+  bulkOperationForHostsSetRackInfo: function (operationData, hosts) {
+    hostsManagement.setRackInfo(operationData, hosts);
+  },
+
+  /**
+   * Bulk restart for selected hosts
+   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
+   * @param {Ember.Enumerable} hosts - list of affected hosts
+   */
+  bulkOperationForHostsRestart: function (operationData, hosts) {
+    batchUtils.getComponentsFromServer({
+      passiveState: 'OFF',
+      hosts: hosts.mapProperty('hostName'),
+      displayParams: ['host_components/HostRoles/component_name']
+    }, function (data) {
+      var hostComponents = [];
+      data.items.forEach(function (host) {
+        host.host_components.forEach(function (hostComponent) {
+          hostComponents.push(O.create({
+            componentName: hostComponent.HostRoles.component_name,
+            hostName: host.Hosts.host_name
+          }));
+        })
+      });
+      // if NameNode included, check HDFS NameNode checkpoint before restart NN
+      var nn_count = hostComponents.filterProperty('componentName', 'NAMENODE').get('length');
+      if (nn_count == 1 && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
+        var hostName = hostComponents.findProperty('componentName', 'NAMENODE').get('hostName');
+        App.router.get('mainHostDetailsController').checkNnLastCheckpointTime(function () {
+          batchUtils.restartHostComponents(hostComponents, Em.I18n.t('rollingrestart.context.allOnSelectedHosts'), "HOST");
+        }, hostName);
+      } else if (nn_count == 2 && App.Service.find().filterProperty('serviceName', 'HDFS').someProperty('workStatus', App.HostComponentStatus.started)) {
+        // HA enabled
+        App.router.get('mainServiceItemController').checkNnLastCheckpointTime(function () {
+          batchUtils.restartHostComponents(hostComponents, Em.I18n.t('rollingrestart.context.allOnSelectedHosts'), "HOST");
+        });
+      } else {
+        batchUtils.restartHostComponents(hostComponents, Em.I18n.t('rollingrestart.context.allOnSelectedHosts'), "HOST");
+      }
+    });
+  },
+
+  /**
+   * Bulk turn on/off passive state for selected hosts
+   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
+   * @param {Array} hosts - list of affected hosts
+   */
+  bulkOperationForHostsPassiveState: function (operationData, hosts) {
+    var self = this;
+
+    batchUtils.getComponentsFromServer({
+      hosts: hosts.mapProperty('hostName'),
+      displayParams: ['Hosts/maintenance_state']
+    }, function (data) {
+      var hostNames = [];
+
+      data.items.forEach(function (host) {
+        if (host.Hosts.maintenance_state !== operationData.state) {
+          hostNames.push(host.Hosts.host_name);
+        }
+      });
+      if (hostNames.length) {
+        App.ajax.send({
+          name: 'bulk_request.hosts.passive_state',
+          sender: self,
+          data: {
+            hostNames: hostNames.join(','),
+            passive_state: operationData.state,
+            requestInfo: operationData.message
+          },
+          success: 'updateHostPassiveState'
+        });
+      } else {
+        App.ModalPopup.show({
+          header: Em.I18n.t('rolling.nothingToDo.header'),
+          body: Em.I18n.t('hosts.bulkOperation.passiveState.nothingToDo.body'),
+          secondary: false
+        });
+      }
+    });
+  },
+
+  updateHostPassiveState: function (data, opt, params) {
+    batchUtils.infoPassiveState(params.passive_state);
+  },
+  /**
+   * Bulk operation for selected hostComponents
+   * @param {Object} operationData - data about bulk operation (action, hostComponents etc)
+   * @param {Array} hosts - list of affected hosts
+   */
+  bulkOperationForHostComponents: function (operationData, hosts) {
+    var self = this;
+
+    batchUtils.getComponentsFromServer({
+      components: [operationData.componentName],
+      hosts: hosts.mapProperty('hostName'),
+      passiveState: 'OFF'
+    }, function (data) {
+      if (data.items.length) {
+        var hostsWithComponentInProperState = data.items.mapProperty('Hosts.host_name');
+        App.ajax.send({
+          name: 'common.host_components.update',
+          sender: self,
+          data: {
+            HostRoles: {
+              state: operationData.action
+            },
+            query: 'HostRoles/component_name=' + operationData.componentName + '&HostRoles/host_name.in(' + hostsWithComponentInProperState.join(',') + ')&HostRoles/maintenance_state=OFF',
+            context: operationData.message + ' ' + operationData.componentNameFormatted,
+            level: 'SERVICE',
+            noOpsMessage: operationData.componentNameFormatted
+          },
+          success: 'bulkOperationForHostComponentsSuccessCallback'
+        });
+      }
+      else {
+        App.ModalPopup.show({
+          header: Em.I18n.t('rolling.nothingToDo.header'),
+          body: Em.I18n.t('rolling.nothingToDo.body').format(operationData.componentNameFormatted),
+          secondary: false
+        });
+      }
+    });
+  },
+
+  /**
+   * Bulk decommission/recommission for selected hostComponents
+   * @param {Object} operationData
+   * @param {Array} hosts
+   */
+  bulkOperationForHostComponentsDecommission: function (operationData, hosts) {
+    var self = this;
+
+    batchUtils.getComponentsFromServer({
+      components: [operationData.realComponentName],
+      hosts: hosts.mapProperty('hostName'),
+      passiveState: 'OFF',
+      displayParams: ['host_components/HostRoles/state']
+    }, function (data) {
+      self.bulkOperationForHostComponentsDecommissionCallBack(operationData, data)
+    });
+  },
+
+  /**
+   * run Bulk decommission/recommission for selected hostComponents
+   * after host and components are loaded
+   * @param operationData
+   * @param data
+   */
+  bulkOperationForHostComponentsDecommissionCallBack: function (operationData, data) {
+    var service = App.Service.find(operationData.serviceName);
+    var components = [];
+
+    data.items.forEach(function (host) {
+      host.host_components.forEach(function (hostComponent) {
+        components.push(O.create({
+          componentName: hostComponent.HostRoles.component_name,
+          hostName: host.Hosts.host_name,
+          workStatus: hostComponent.HostRoles.state
+        }))
+      });
+    });
+
+    if (components.length) {
+      var hostsWithComponentInProperState = components.mapProperty('hostName');
+      var turn_off = operationData.action.indexOf('OFF') !== -1;
+      var svcName = operationData.serviceName;
+      var masterName = operationData.componentName;
+      var slaveName = operationData.realComponentName;
+      var hostNames = hostsWithComponentInProperState.join(',');
+      if (turn_off) {
+        // For recommession
+        if (svcName === "YARN" || svcName === "HBASE" || svcName === "HDFS") {
+          App.router.get('mainHostDetailsController').doRecommissionAndStart(hostNames, svcName, masterName, slaveName);
+        }
+      } else {
+        hostsWithComponentInProperState = components.filterProperty('workStatus', 'STARTED').mapProperty('hostName');
+        //For decommession
+        if (svcName == "HBASE") {
+          // HBASE service, decommission RegionServer in batch requests
+          this.warnBeforeDecommission(hostNames);
+        } else {
+          var parameters = {
+            "slave_type": slaveName
+          };
+          var contextString = turn_off ? 'hosts.host.' + slaveName.toLowerCase() + '.recommission' :
+          'hosts.host.' + slaveName.toLowerCase() + '.decommission';
+          if (turn_off) {
+            parameters['included_hosts'] = hostsWithComponentInProperState.join(',')
+          }
+          else {
+            parameters['excluded_hosts'] = hostsWithComponentInProperState.join(',');
+          }
+          App.ajax.send({
+            name: 'bulk_request.decommission',
+            sender: this,
+            data: {
+              context: Em.I18n.t(contextString),
+              serviceName: service.get('serviceName'),
+              componentName: operationData.componentName,
+              parameters: parameters,
+              noOpsMessage: operationData.componentNameFormatted
+            },
+            success: 'bulkOperationForHostComponentsSuccessCallback'
+          });
+        }
+      }
+    }
+    else {
+      App.ModalPopup.show({
+        header: Em.I18n.t('rolling.nothingToDo.header'),
+        body: Em.I18n.t('rolling.nothingToDo.body').format(operationData.componentNameFormatted),
+        secondary: false
+      });
+    }
+  },
+
+
+  /**
+   * get info about regionserver passive_state
+   * @method warnBeforeDecommission
+   * @param {String} hostNames
+   * @return {$.ajax}
+   */
+  warnBeforeDecommission: function (hostNames) {
+    return App.ajax.send({
+      'name': 'host_components.hbase_regionserver.active',
+      'sender': this,
+      'data': {
+        hostNames: hostNames
+      },
+      success: 'warnBeforeDecommissionSuccess'
+    });
+  },
+
+  /**
+   * check is hbase regionserver in mm. If so - run decommission
+   * otherwise shows warning
+   * @method warnBeforeDecommission
+   * @param {Object} data
+   * @param {Object} opt
+   * @param {Object} params
+   */
+  warnBeforeDecommissionSuccess: function(data, opt, params) {
+    if (Em.get(data, 'items.length')) {
+      App.router.get('mainHostDetailsController').showHbaseActiveWarning();
+    } else {
+      App.router.get('mainHostDetailsController').checkRegionServerState(params.hostNames);
+    }
+  },
+  /**
+   * Bulk restart for selected hostComponents
+   * @param {Object} operationData
+   * @param {Array} hosts
+   */
+  bulkOperationForHostComponentsRestart: function (operationData, hosts) {
+    var service = App.Service.find(operationData.serviceName);
+
+    batchUtils.getComponentsFromServer({
+      components: [operationData.componentName],
+      hosts: hosts.mapProperty('hostName'),
+      passiveState: 'OFF',
+      displayParams: ['Hosts/maintenance_state', 'host_components/HostRoles/stale_configs', 'host_components/HostRoles/maintenance_state']
+    }, function (data) {
+      var wrappedHostComponents = [];
+
+      data.items.forEach(function (host) {
+        host.host_components.forEach(function (hostComponent) {
+          wrappedHostComponents.push(O.create({
+            componentName: hostComponent.HostRoles.component_name,
+            serviceName: operationData.serviceName,
+            hostName: host.Hosts.host_name,
+            hostPassiveState: host.Hosts.maintenance_state,
+            staleConfigs: hostComponent.HostRoles.stale_configs,
+            passiveState: hostComponent.HostRoles.maintenance_state
+          }))
+        });
+      });
+
+      if (wrappedHostComponents.length) {
+        batchUtils.showRollingRestartPopup(wrappedHostComponents.objectAt(0).get('componentName'), service.get('displayName'), service.get('passiveState') === "ON", false, wrappedHostComponents);
+      } else {
+        App.ModalPopup.show({
+          header: Em.I18n.t('rolling.nothingToDo.header'),
+          body: Em.I18n.t('rolling.nothingToDo.body').format(operationData.componentNameFormatted),
+          secondary: false
+        });
+      }
+    });
+  },
+
+  updateHostComponentsPassiveState: function (data, opt, params) {
+    batchUtils.infoPassiveState(params.passive_state);
+  },
+  /**
+   * Show BO popup after bulk request
+   */
+  bulkOperationForHostComponentsSuccessCallback: function (data, opt, params, req) {
+    if (!data && req.status == 200) {
+      App.ModalPopup.show({
+        header: Em.I18n.t('rolling.nothingToDo.header'),
+        body: Em.I18n.t('rolling.nothingToDo.body').format(params.noOpsMessage || Em.I18n.t('hosts.host.maintainance.allComponents.context')),
+        secondary: false
+      });
+    } else {
+      App.router.get('userSettingsController').dataLoading('show_bg').done(function (initValue) {
+        if (initValue) {
+          App.router.get('backgroundOperationsController').showPopup();
+        }
+      });
+    }
+  },
+
+  /**
+   * Returns all hostNames if amount is less than {minShown} or
+   * first elements of array (number of elements - {minShown}) converted to string
+   * @param {Array} hostNames - array of all listed hostNames
+   * @param {String} divider - string to separate hostNames
+   * @param {Number} minShown - min amount of hostName to be shown
+   * @returns {String} hostNames
+   * @method showHostNames
+   */
+  showHostNames: function(hostNames, divider, minShown) {
+    if (hostNames.length > minShown) {
+      return hostNames.slice(0, minShown).join(divider) + divider + Em.I18n.t("installer.step8.other").format(hostNames.length - minShown);
+    } else {
+      return hostNames.join(divider);
+    }
+  },
+
+  /**
+   * Confirmation Popup for bulk Operations
+   */
+  bulkOperationConfirm: function(operationData, selection) {
+    var hostsNames = [],
+      queryParams = [];
+    // @todo remove using external controller
+    switch(selection) {
+      case 's':
+        hostsNames = App.router.get('mainHostController.content').filterProperty('selected').mapProperty('hostName');
+        if(hostsNames.length > 0){
+          queryParams.push({
+            key: 'Hosts/host_name',
+            value: hostsNames,
+            type: 'MULTIPLE'
+          });
+        }
+        break;
+      case 'f':
+        queryParams = App.router.get('mainHostController').getQueryParameters(true).filter(function (obj) {
+          return !(obj.key == 'page_size' || obj.key == 'from');
+        });
+        break;
+    }
+
+    if (operationData.action === 'SET_RACK_INFO') {
+      this.getHostsForBulkOperations(queryParams, operationData, null);
+      return;
+    }
+
+    var loadingPopup = App.ModalPopup.show({
+      header: Em.I18n.t('jobs.loadingTasks'),
+      primary: false,
+      secondary: false,
+      bodyClass: Em.View.extend({
+        template: Em.Handlebars.compile('<div class="spinner"></div>')
+      })
+    });
+
+    this.getHostsForBulkOperations(queryParams, operationData, loadingPopup);
+  },
+
+  getHostsForBulkOperations: function (queryParams, operationData, loadingPopup) {
+    var params = App.router.get('updateController').computeParameters(queryParams);
+
+    App.ajax.send({
+      name: 'hosts.bulk.operations',
+      sender: this,
+      data: {
+        parameters: params,
+        operationData: operationData,
+        loadingPopup: loadingPopup
+      },
+      success: 'getHostsForBulkOperationSuccessCallback'
+    });
+  },
+
+  convertHostsObjects: function (hosts) {
+    return hosts.map(function (host) {
+      return {
+        index: host.index,
+        id: host.id,
+        clusterId: host.cluster_id,
+        passiveState: host.passive_state,
+        hostName: host.host_name,
+        hostComponents: host.host_components
+      }
+    });
+  },
+
+  getHostsForBulkOperationSuccessCallback: function(json, opt, param) {
+    var self = this,
+      operationData = param.operationData,
+      hosts = this.convertHostsObjects(App.hostsMapper.map(json, true));
+    // no hosts - no actions
+    if (!hosts.length) {
+      console.log('No bulk operation if no hosts selected.');
+      return;
+    }
+    var hostNames = hosts.mapProperty('hostName');
+    var hostsToSkip = [];
+    if (operationData.action == "DECOMMISSION") {
+      var hostComponentStatusMap = {}; // "DATANODE_c6401.ambari.apache.org" => "STARTED"
+      var hostComponentIdMap = {}; // "DATANODE_c6401.ambari.apache.org" => "DATANODE"
+      if (json.items) {
+        json.items.forEach(function(host) {
+          if (host.host_components) {
+            host.host_components.forEach(function(component) {
+              hostComponentStatusMap[component.id] = component.HostRoles.state;
+              hostComponentIdMap[component.id] = component.HostRoles.component_name;
+            });
+          }
+        });
+      }
+      hostsToSkip = hosts.filter(function(host) {
+        var invalidStateComponents = host.hostComponents.filter(function(component) {
+          return hostComponentIdMap[component] == operationData.realComponentName && hostComponentStatusMap[component] == 'INSTALLED';
+        });
+        return invalidStateComponents.length > 0;
+      });
+    }
+    var hostNamesSkipped = hostsToSkip.mapProperty('hostName');
+    if (operationData.action === 'PASSIVE_STATE') {
+      hostNamesSkipped = [];
+      var outOfSyncHosts = App.StackVersion.find().findProperty('isCurrent').get('outOfSyncHosts');
+      for (var i = 0; i < outOfSyncHosts.length; i++) {
+        if (hostNames.contains(outOfSyncHosts[i])) {
+          hostNamesSkipped.push(outOfSyncHosts[i]);
+        }
+      }
+    }
+    var message;
+    if (operationData.componentNameFormatted) {
+      message = Em.I18n.t('hosts.bulkOperation.confirmation.hostComponents').format(operationData.message, operationData.componentNameFormatted, hostNames.length);
+    }
+    else {
+      message = Em.I18n.t('hosts.bulkOperation.confirmation.hosts').format(operationData.message, hostNames.length);
+    }
+
+    if (param.loadingPopup) {
+      param.loadingPopup.hide();
+    }
+
+    if (operationData.action === 'SET_RACK_INFO') {
+      self.bulkOperation(operationData, hosts);
+      return;
+    }
+
+    App.ModalPopup.show({
+      header: Em.I18n.t('hosts.bulkOperation.confirmation.header'),
+      hostNames: hostNames.join("\n"),
+      visibleHosts: self.showHostNames(hostNames, "\n", 3),
+      hostNamesSkippedVisible: self.showHostNames(hostNamesSkipped, "\n", 3),
+      hostNamesSkipped: function() {
+        return hostNamesSkipped.length ? hostNamesSkipped.join("\n") : false;
+      }.property(),
+      expanded: false,
+      didInsertElement: function() {
+        this.set('expanded', hostNames.length <= 3);
+      },
+      onPrimary: function() {
+        self.bulkOperation(operationData, hosts);
+        this._super();
+      },
+      bodyClass: Em.View.extend({
+        templateName: require('templates/main/host/bulk_operation_confirm_popup'),
+        message: message,
+        warningInfo: function() {
+          switch (operationData.action) {
+            case "DECOMMISSION":
+              return Em.I18n.t('hosts.bulkOperation.warningInfo.body');
+            case "PASSIVE_STATE":
+              return operationData.state === 'OFF' ? Em.I18n.t('hosts.passiveMode.popup.version.mismatch.multiple')
+                .format(App.StackVersion.find().findProperty('isCurrent').get('repositoryVersion.repositoryVersion')) : "";
+            default:
+              return ""
+          }
+        }.property(),
+        textareaVisible: false,
+        textTrigger: function() {
+          this.set('textareaVisible', !this.get('textareaVisible'));
+        },
+        showAll: function() {
+          this.set('parentView.visibleHosts', this.get('parentView.hostNames'));
+          this.set('parentView.hostNamesSkippedVisible', this.get('parentView.hostNamesSkipped'));
+          this.set('parentView.expanded', true);
+        },
+        putHostNamesToTextarea: function() {
+          var hostNames = this.get('parentView.hostNames');
+          if (this.get('textareaVisible')) {
+            var wrapper = $(".task-detail-log-maintext");
+            $('.task-detail-log-clipboard').html(hostNames).width(wrapper.width()).height(250);
+            Em.run.next(function() {
+              $('.task-detail-log-clipboard').select();
+            });
+          }
+        }.observes('textareaVisible')
+      })
+    });
+  }
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/app/views/main/host.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/host.js b/ambari-web/app/views/main/host.js
index f821a90..6f1f04b 100644
--- a/ambari-web/app/views/main/host.js
+++ b/ambari-web/app/views/main/host.js
@@ -315,207 +315,7 @@ App.MainHostView = App.TableView.extend(App.TableServerViewMixin, {
     this.filterSelected();
   },
 
-  /**
-   * Returs all hostNames if amount is less than {minShown} or
-   * first elements of array (number of elements - {minShown}) converted to string
-   * @param {Array} hostNames - array of all listed hostNames
-   * @param {String} divider - string to separate hostNames
-   * @param {Number} minShown - min amount of hostName to be shown
-   * @returns {String} hostNames
-   * @method showHostNames
-   */
-  showHostNames: function(hostNames, divider, minShown) {
-    if (hostNames.length > minShown) {
-      return hostNames.slice(0, minShown).join(divider) + divider + Em.I18n.t("installer.step8.other").format(hostNames.length - minShown);
-    } else {
-      return hostNames.join(divider);
-    }
-  },
-
-  /**
-   * Confirmation Popup for bulk Operations
-   */
-  bulkOperationConfirm: function(operationData, selection) {
-    var hostsNames = [],
-      queryParams = [];
-    switch(selection) {
-      case 's':
-        hostsNames = this.get('selectedHosts');
-        if(hostsNames.length > 0){
-          queryParams.push({
-            key: 'Hosts/host_name',
-            value: hostsNames,
-            type: 'MULTIPLE'
-          });
-        }
-        break;
-      case 'f':
-        queryParams = this.get('controller').getQueryParameters(true).filter(function (obj) {
-          return !(obj.key == 'page_size' || obj.key == 'from');
-        });
-        break;
-    }
-
-    if (operationData.action === 'SET_RACK_INFO') {
-      this.getHostsForBulkOperations(queryParams, operationData, null);
-      return;
-    }
-
-    var loadingPopup = App.ModalPopup.show({
-      header: Em.I18n.t('jobs.loadingTasks'),
-      primary: false,
-      secondary: false,
-      bodyClass: Ember.View.extend({
-        template: Ember.Handlebars.compile('<div class="spinner"></div>')
-      })
-    });
-
-    this.getHostsForBulkOperations(queryParams, operationData, loadingPopup);
-  },
-
-  getHostsForBulkOperations: function (queryParams, operationData, loadingPopup) {
-    var params = App.router.get('updateController').computeParameters(queryParams);
-
-    App.ajax.send({
-      name: 'hosts.bulk.operations',
-      sender: this,
-      data: {
-        parameters: params,
-        operationData: operationData,
-        loadingPopup: loadingPopup
-      },
-      success: 'getHostsForBulkOperationSuccessCallback'
-    });
-  },
-
-  convertHostsObjects: function(hosts) {
-    var newHostArr = [];
-    hosts.forEach(function (host) {
-      newHostArr.push({
-        index:host.index,
-        id:host.id,
-        clusterId: host.cluster_id,
-        passiveState: host.passive_state,
-        hostName: host.host_name,
-        hostComponents: host.host_components
-      })
-    });
-    return newHostArr;
-  },
-
-  getHostsForBulkOperationSuccessCallback: function(json, opt, param) {
-    var self = this,
-    operationData = param.operationData,
-    hosts = this.convertHostsObjects(App.hostsMapper.map(json, true));
-    // no hosts - no actions
-    if (!hosts.length) {
-      console.log('No bulk operation if no hosts selected.');
-      return;
-    }
-    var hostNames = hosts.mapProperty('hostName');
-    var hostsToSkip = [];
-    if (operationData.action == "DECOMMISSION") {
-      var hostComponentStatusMap = {}; // "DATANODE_c6401.ambari.apache.org" => "STARTED"
-      var hostComponentIdMap = {}; // "DATANODE_c6401.ambari.apache.org" => "DATANODE"
-      if (json.items) {
-        json.items.forEach(function(host) {
-          if (host.host_components) {
-            host.host_components.forEach(function(component) {
-              hostComponentStatusMap[component.id] = component.HostRoles.state;
-              hostComponentIdMap[component.id] = component.HostRoles.component_name;
-            });
-          }
-        });
-      }
-      hostsToSkip = hosts.filter(function(host) {
-        var invalidStateComponents = host.hostComponents.filter(function(component) {
-          return hostComponentIdMap[component] == operationData.realComponentName && hostComponentStatusMap[component] == 'INSTALLED';
-        });
-        return invalidStateComponents.length > 0;
-      });
-    }
-    var hostNamesSkipped = hostsToSkip.mapProperty('hostName');
-    if (operationData.action === 'PASSIVE_STATE') {
-      hostNamesSkipped = [];
-      var outOfSyncHosts = App.StackVersion.find().findProperty('isCurrent').get('outOfSyncHosts');
-      for (var i = 0; i < outOfSyncHosts.length; i++) {
-        if (hostNames.contains(outOfSyncHosts[i])) {
-          hostNamesSkipped.push(outOfSyncHosts[i]);
-        }
-      }
-    }
-    var message;
-    if (operationData.componentNameFormatted) {
-      message = Em.I18n.t('hosts.bulkOperation.confirmation.hostComponents').format(operationData.message, operationData.componentNameFormatted, hostNames.length);
-    }
-    else {
-      message = Em.I18n.t('hosts.bulkOperation.confirmation.hosts').format(operationData.message, hostNames.length);
-    }
 
-    if (param.loadingPopup) {
-      param.loadingPopup.hide();
-    }
-
-    if (operationData.action === 'SET_RACK_INFO') {
-      self.get('controller').bulkOperation(operationData, hosts);
-      return;
-    }
-
-    App.ModalPopup.show({
-      header: Em.I18n.t('hosts.bulkOperation.confirmation.header'),
-      hostNames: hostNames.join("\n"),
-      visibleHosts: self.showHostNames(hostNames, "\n", 3),
-      hostNamesSkippedVisible: self.showHostNames(hostNamesSkipped, "\n", 3),
-      hostNamesSkipped: function() {
-        if (hostNamesSkipped.length) {
-          return hostNamesSkipped.join("\n");
-        }
-        return false;
-      }.property(),
-      expanded: false,
-      didInsertElement: function() {
-        this.set('expanded', hostNames.length <= 3);
-      },
-      onPrimary: function() {
-        self.get('controller').bulkOperation(operationData, hosts);
-        this._super();
-      },
-      bodyClass: Em.View.extend({
-        templateName: require('templates/main/host/bulk_operation_confirm_popup'),
-        message: message,
-        warningInfo: function() {
-          switch (operationData.action) {
-            case "DECOMMISSION":
-              return Em.I18n.t('hosts.bulkOperation.warningInfo.body');
-            case "PASSIVE_STATE":
-              return operationData.state === 'OFF' ? Em.I18n.t('hosts.passiveMode.popup.version.mismatch.multiple')
-              .format(App.StackVersion.find().findProperty('isCurrent').get('repositoryVersion.repositoryVersion')) : "";
-            default:
-              return ""
-          }
-        }.property(),
-        textareaVisible: false,
-        textTrigger: function() {
-          this.set('textareaVisible', !this.get('textareaVisible'));
-        },
-        showAll: function() {
-          this.set('parentView.visibleHosts', this.get('parentView.hostNames'));
-          this.set('parentView.hostNamesSkippedVisible', this.get('parentView.hostNamesSkipped'));
-          this.set('parentView.expanded', true);
-        },
-        putHostNamesToTextarea: function() {
-          var hostNames = this.get('parentView.hostNames');
-          if (this.get('textareaVisible')) {
-            var wrapper = $(".task-detail-log-maintext");
-            $('.task-detail-log-clipboard').html(hostNames).width(wrapper.width()).height(250);
-            Em.run.next(function() {
-              $('.task-detail-log-clipboard').select();
-            });
-          }
-        }.observes('textareaVisible')
-      })
-    });
-  },
 
   sortView: sort.serverWrapperView,
   nameSort: sort.fieldView.extend({

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/app/views/main/host/hosts_table_menu_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/host/hosts_table_menu_view.js b/ambari-web/app/views/main/host/hosts_table_menu_view.js
index 58bcc46..e974073 100644
--- a/ambari-web/app/views/main/host/hosts_table_menu_view.js
+++ b/ambari-web/app/views/main/host/hosts_table_menu_view.js
@@ -17,11 +17,17 @@
  */
 
 var App = require('app');
+var O = Em.Object;
 
+/**
+ * @class HostTableMenuView
+ */
 App.HostTableMenuView = Em.View.extend({
 
   templateName: require('templates/main/host/bulk_operation_menu'),
 
+  controllerBinding: 'App.router.bulkOperationsController',
+
   menuItems: function () {
     return {
       s: {label: Em.I18n.t('hosts.table.menu.l1.selectedHosts')},
@@ -30,39 +36,39 @@ App.HostTableMenuView = Em.View.extend({
     };
   }.property('App.router.clusterController.isLoaded'),
 
-  components: function(){
+  components: function () {
+    var serviceNames = App.Service.find().mapProperty('serviceName');
     var menuItems = [
-    Em.Object.create({
-      serviceName: 'HDFS',
-      componentName: 'DATANODE',
-      masterComponentName: 'NAMENODE',
-      componentNameFormatted: Em.I18n.t('dashboard.services.hdfs.datanodes')
-    }),
-    Em.Object.create({
-      serviceName: 'YARN',
-      componentName: 'NODEMANAGER',
-      masterComponentName: 'RESOURCEMANAGER',
-      componentNameFormatted: Em.I18n.t('dashboard.services.yarn.nodeManagers')
-    }),
-    Em.Object.create({
-      serviceName: 'HBASE',
-      componentName: 'HBASE_REGIONSERVER',
-      masterComponentName: 'HBASE_MASTER',
-      componentNameFormatted: Em.I18n.t('dashboard.services.hbase.regionServers')
-    }),
-    Em.Object.create({
-      serviceName: 'STORM',
-      componentName: 'SUPERVISOR',
-      masterComponentName: 'SUPERVISOR',
-      componentNameFormatted: Em.I18n.t('dashboard.services.storm.supervisors')
-    })];
+      O.create({
+        serviceName: 'HDFS',
+        componentName: 'DATANODE',
+        masterComponentName: 'NAMENODE',
+        componentNameFormatted: Em.I18n.t('dashboard.services.hdfs.datanodes')
+      }),
+      O.create({
+        serviceName: 'YARN',
+        componentName: 'NODEMANAGER',
+        masterComponentName: 'RESOURCEMANAGER',
+        componentNameFormatted: Em.I18n.t('dashboard.services.yarn.nodeManagers')
+      }),
+      O.create({
+        serviceName: 'HBASE',
+        componentName: 'HBASE_REGIONSERVER',
+        masterComponentName: 'HBASE_MASTER',
+        componentNameFormatted: Em.I18n.t('dashboard.services.hbase.regionServers')
+      }),
+      O.create({
+        serviceName: 'STORM',
+        componentName: 'SUPERVISOR',
+        masterComponentName: 'SUPERVISOR',
+        componentNameFormatted: Em.I18n.t('dashboard.services.storm.supervisors')
+      })];
 
-    return menuItems.filter(function(item){
-      return App.Service.find().findProperty('serviceName',item.serviceName);
+    return menuItems.filter(function (item) {
+      return serviceNames.contains(item.serviceName);
     });
   }.property(),
 
-
   /**
    * slaveItemView build second-level menu
    * for slave component
@@ -94,9 +100,9 @@ App.HostTableMenuView = Em.View.extend({
     operationsInfo: function () {
       var content = this.get('content');
       var menuItems = Em.A([
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('common.start'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: App.HostComponentStatus.started,
             message: Em.I18n.t('common.start'),
             componentName: content.componentName,
@@ -104,9 +110,9 @@ App.HostTableMenuView = Em.View.extend({
             componentNameFormatted: content.componentNameFormatted
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('common.stop'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: App.HostComponentStatus.stopped,
             message: Em.I18n.t('common.stop'),
             componentName: content.componentName,
@@ -114,9 +120,9 @@ App.HostTableMenuView = Em.View.extend({
             componentNameFormatted: content.componentNameFormatted
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('common.restart'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'RESTART',
             message: Em.I18n.t('common.restart'),
             componentName: content.componentName,
@@ -126,10 +132,10 @@ App.HostTableMenuView = Em.View.extend({
         })
       ]);
       if (App.get('components.decommissionAllowed').contains(content.componentName)) {
-        menuItems.pushObject(Em.Object.create({
+        menuItems.pushObject(O.create({
           label: Em.I18n.t('common.decommission'),
           decommission: true,
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'DECOMMISSION',
             message: Em.I18n.t('common.decommission'),
             componentName: content.masterComponentName,
@@ -138,10 +144,10 @@ App.HostTableMenuView = Em.View.extend({
             componentNameFormatted: content.componentNameFormatted
           })
         }));
-        menuItems.pushObject(Em.Object.create({
+        menuItems.pushObject(O.create({
           label: Em.I18n.t('common.recommission'),
           decommission: true,
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'DECOMMISSION_OFF',
             message: Em.I18n.t('common.recommission'),
             componentName: content.masterComponentName,
@@ -161,13 +167,8 @@ App.HostTableMenuView = Em.View.extend({
     commonOperationView: Em.View.extend({
       tagName: 'li',
 
-      /**
-       * click function use
-       * App.MainHostView as a thirl level parent
-       * and runs it's function
-       */
       click: function () {
-        this.get('parentView.parentView.parentView').bulkOperationConfirm(this.get('content'), this.get('selection'));
+        this.get('controller').bulkOperationConfirm(this.get('content'), this.get('selection'));
       }
     }),
 
@@ -187,23 +188,18 @@ App.HostTableMenuView = Em.View.extend({
 
       tooltipMsg: function () {
         return (this.get('disabledElement') == 'disabled') ?
-           Em.I18n.t('hosts.decommission.tooltip.warning').format(this.get('content.message'),  App.format.role(this.get('content.componentName'))) : '';
-      }.property('disabledElement','content.componentName'),
+          Em.I18n.t('hosts.decommission.tooltip.warning').format(this.get('content.message'), App.format.role(this.get('content.componentName'))) : '';
+      }.property('disabledElement', 'content.componentName'),
 
       disabledElement: function () {
-        return (this.get('service.workStatus') != 'STARTED') ? 'disabled' : '';
+        return this.get('service.workStatus') == 'STARTED' ? '' : 'disabled';
       }.property('service.workStatus'),
 
-      /**
-       * click function use
-       * App.MainHostView as a thirl level parent
-       * and runs it's function
-       */
       click: function () {
         if (this.get('disabledElement') == 'disabled') {
           return;
         }
-        this.get('parentView.parentView.parentView').bulkOperationConfirm(this.get('content'), this.get('selection'));
+        this.get('controller').bulkOperationConfirm(this.get('content'), this.get('selection'));
       },
 
       didInsertElement: function () {
@@ -238,48 +234,48 @@ App.HostTableMenuView = Em.View.extend({
      */
     operationsInfo: function () {
       return [
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('hosts.host.details.startAllComponents'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'STARTED',
             actionToCheck: 'INSTALLED',
             message: Em.I18n.t('hosts.host.details.startAllComponents')
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('hosts.host.details.stopAllComponents'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'INSTALLED',
             actionToCheck: 'STARTED',
             message: Em.I18n.t('hosts.host.details.stopAllComponents')
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('hosts.table.menu.l2.restartAllComponents'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'RESTART',
             message: Em.I18n.t('hosts.table.menu.l2.restartAllComponents')
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('passiveState.turnOn'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             state: 'ON',
             action: 'PASSIVE_STATE',
             message: Em.I18n.t('passiveState.turnOnFor').format('hosts')
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('passiveState.turnOff'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             state: 'OFF',
             action: 'PASSIVE_STATE',
             message: Em.I18n.t('passiveState.turnOffFor').format('hosts')
           })
         }),
-        Em.Object.create({
+        O.create({
           label: Em.I18n.t('hosts.host.details.setRackId'),
-          operationData: Em.Object.create({
+          operationData: O.create({
             action: 'SET_RACK_INFO',
             message: Em.I18n.t('hosts.host.details.setRackId').format('hosts')
           })
@@ -294,14 +290,10 @@ App.HostTableMenuView = Em.View.extend({
     operationView: Em.View.extend({
       tagName: 'li',
 
-      /**
-       * click function use
-       * App.MainHostView as a thirl level parent
-       * and runs it's function
-       */
       click: function () {
-        this.get('parentView.parentView.parentView').bulkOperationConfirm(this.get('content'), this.get('selection'));
+        this.get('controller').bulkOperationConfirm(this.get('content'), this.get('selection'));
       }
     })
   })
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js b/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js
new file mode 100644
index 0000000..9ed0cec
--- /dev/null
+++ b/ambari-web/test/controllers/main/host/bulk_operations_controller_test.js
@@ -0,0 +1,155 @@
+/**
+ * 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');
+
+describe('BulkOperationsController', function () {
+
+  var hostController;
+
+  describe('#bulkOperation', function() {
+
+    beforeEach(function() {
+      hostController = App.BulkOperationsController.create({});
+      sinon.stub(hostController, 'bulkOperationForHostsRestart', Em.K);
+      sinon.stub(hostController, 'bulkOperationForHosts', Em.K);
+      sinon.stub(hostController, 'bulkOperationForHostComponentsRestart', Em.K);
+      sinon.stub(hostController, 'bulkOperationForHostComponentsDecommission', Em.K);
+      sinon.stub(hostController, 'bulkOperationForHostComponents', Em.K);
+      sinon.stub(hostController, 'bulkOperationForHostsPassiveState', Em.K);
+    });
+
+    afterEach(function() {
+      hostController.bulkOperationForHosts.restore();
+      hostController.bulkOperationForHostsRestart.restore();
+      hostController.bulkOperationForHostComponentsRestart.restore();
+      hostController.bulkOperationForHostComponentsDecommission.restore();
+      hostController.bulkOperationForHostComponents.restore();
+      hostController.bulkOperationForHostsPassiveState.restore();
+
+    });
+
+    it('RESTART for hosts', function() {
+      var operationData = {
+        action: 'RESTART'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostsRestart.calledOnce).to.equal(true);
+    });
+
+    it('START for hosts', function() {
+      var operationData = {
+        action: 'STARTED'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHosts.calledOnce).to.equal(true);
+    });
+
+    it('STOP for hosts', function() {
+      var operationData = {
+        action: 'INSTALLED'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHosts.calledOnce).to.equal(true);
+    });
+
+    it('PASSIVE_STATE for hosts', function() {
+      var operationData = {
+        action: 'PASSIVE_STATE'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostsPassiveState.calledOnce).to.equal(true);
+    });
+
+    it('RESTART for hostComponents', function() {
+      var operationData = {
+        action: 'RESTART',
+        componentNameFormatted: 'DataNodes'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostComponentsRestart.calledOnce).to.equal(true);
+    });
+
+    it('START for hostComponents', function() {
+      var operationData = {
+        action: 'STARTED',
+        componentNameFormatted: 'DataNodes'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostComponents.calledOnce).to.equal(true);
+    });
+
+    it('STOP for hostComponents', function() {
+      var operationData = {
+        action: 'INSTALLED',
+        componentNameFormatted: 'DataNodes'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostComponents.calledOnce).to.equal(true);
+    });
+
+    it('DECOMMISSION for hostComponents', function() {
+      var operationData = {
+        action: 'DECOMMISSION',
+        componentNameFormatted: 'DataNodes'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostComponentsDecommission.calledOnce).to.equal(true);
+    });
+
+    it('RECOMMISSION for hostComponents', function() {
+      var operationData = {
+        action: 'DECOMMISSION_OFF',
+        componentNameFormatted: 'DataNodes'
+      };
+      hostController.bulkOperation(operationData, []);
+      expect(hostController.bulkOperationForHostComponentsDecommission.calledOnce).to.equal(true);
+    });
+
+  });
+
+  describe('#warnBeforeDecommissionSuccess()', function () {
+    var mock = {
+      showHbaseActiveWarning: Em.K,
+      checkRegionServerState: Em.K
+    };
+    beforeEach(function () {
+      hostController = App.BulkOperationsController.create({});
+      sinon.stub(App.router, 'get', function () {
+        return mock;
+      });
+      sinon.spy(mock, 'showHbaseActiveWarning');
+      sinon.spy(mock, 'checkRegionServerState');
+    });
+    afterEach(function () {
+      App.router.get.restore();
+      mock.showHbaseActiveWarning.restore();
+      mock.checkRegionServerState.restore();
+    });
+
+    it('items length more than 0', function () {
+      hostController.warnBeforeDecommissionSuccess({items: [1]}, {}, {});
+      expect(mock.showHbaseActiveWarning.calledOnce).to.be.true;
+    });
+    it('items length equal 0', function () {
+      hostController.warnBeforeDecommissionSuccess({items: []}, {}, {hostNames: 'host1'});
+      expect(mock.checkRegionServerState.calledWith('host1')).to.be.true;
+    });
+  });
+
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/7402d19e/ambari-web/test/controllers/main/host_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/host_test.js b/ambari-web/test/controllers/main/host_test.js
index 54d616f..59ca14b 100644
--- a/ambari-web/test/controllers/main/host_test.js
+++ b/ambari-web/test/controllers/main/host_test.js
@@ -26,108 +26,6 @@ describe('MainHostController', function () {
 
   var hostController, db;
 
-  // @todo add unit tests after bulk ops reimplementing
-  describe('#bulkOperation', function() {
-
-    beforeEach(function() {
-      hostController = App.MainHostController.create({});
-      sinon.stub(hostController, 'bulkOperationForHostsRestart', Em.K);
-      sinon.stub(hostController, 'bulkOperationForHosts', Em.K);
-      sinon.stub(hostController, 'bulkOperationForHostComponentsRestart', Em.K);
-      sinon.stub(hostController, 'bulkOperationForHostComponentsDecommission', Em.K);
-      sinon.stub(hostController, 'bulkOperationForHostComponents', Em.K);
-      sinon.stub(hostController, 'bulkOperationForHostsPassiveState', Em.K);
-    });
-
-    afterEach(function() {
-      hostController.bulkOperationForHosts.restore();
-      hostController.bulkOperationForHostsRestart.restore();
-      hostController.bulkOperationForHostComponentsRestart.restore();
-      hostController.bulkOperationForHostComponentsDecommission.restore();
-      hostController.bulkOperationForHostComponents.restore();
-      hostController.bulkOperationForHostsPassiveState.restore();
-
-    });
-
-    it('RESTART for hosts', function() {
-      var operationData = {
-        action: 'RESTART'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostsRestart.calledOnce).to.equal(true);
-    });
-
-    it('START for hosts', function() {
-      var operationData = {
-        action: 'STARTED'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHosts.calledOnce).to.equal(true);
-    });
-
-    it('STOP for hosts', function() {
-      var operationData = {
-        action: 'INSTALLED'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHosts.calledOnce).to.equal(true);
-    });
-
-    it('PASSIVE_STATE for hosts', function() {
-      var operationData = {
-        action: 'PASSIVE_STATE'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostsPassiveState.calledOnce).to.equal(true);
-    });
-
-    it('RESTART for hostComponents', function() {
-      var operationData = {
-        action: 'RESTART',
-        componentNameFormatted: 'DataNodes'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostComponentsRestart.calledOnce).to.equal(true);
-    });
-
-    it('START for hostComponents', function() {
-      var operationData = {
-        action: 'STARTED',
-        componentNameFormatted: 'DataNodes'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostComponents.calledOnce).to.equal(true);
-    });
-
-    it('STOP for hostComponents', function() {
-      var operationData = {
-        action: 'INSTALLED',
-        componentNameFormatted: 'DataNodes'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostComponents.calledOnce).to.equal(true);
-    });
-
-    it('DECOMMISSION for hostComponents', function() {
-      var operationData = {
-        action: 'DECOMMISSION',
-        componentNameFormatted: 'DataNodes'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostComponentsDecommission.calledOnce).to.equal(true);
-    });
-
-    it('RECOMMISSION for hostComponents', function() {
-      var operationData = {
-        action: 'DECOMMISSION_OFF',
-        componentNameFormatted: 'DataNodes'
-      };
-      hostController.bulkOperation(operationData, []);
-      expect(hostController.bulkOperationForHostComponentsDecommission.calledOnce).to.equal(true);
-    });
-
-  });
-
   describe('#getRegExp()', function() {
     before(function() {
       hostController = App.MainHostController.create({});
@@ -156,35 +54,6 @@ describe('MainHostController', function () {
     });
   });
 
-  describe('#warnBeforeDecommissionSuccess()', function () {
-    var mock = {
-      showHbaseActiveWarning: Em.K,
-      checkRegionServerState: Em.K
-    };
-    beforeEach(function () {
-      hostController = App.MainHostController.create({});
-      sinon.stub(App.router, 'get', function () {
-        return mock;
-      });
-      sinon.spy(mock, 'showHbaseActiveWarning');
-      sinon.spy(mock, 'checkRegionServerState');
-    });
-    afterEach(function () {
-      App.router.get.restore();
-      mock.showHbaseActiveWarning.restore();
-      mock.checkRegionServerState.restore();
-    });
-
-    it('items length more than 0', function () {
-      hostController.warnBeforeDecommissionSuccess({items: [1]}, {}, {});
-      expect(mock.showHbaseActiveWarning.calledOnce).to.be.true;
-    });
-    it('items length equal 0', function () {
-      hostController.warnBeforeDecommissionSuccess({items: []}, {}, {hostNames: 'host1'});
-      expect(mock.checkRegionServerState.calledWith('host1')).to.be.true;
-    });
-  });
-
   describe('#getQueryParameters', function() {
     beforeEach(function() {
       hostController = App.MainHostController.create({});